At the A1 level, you are just starting to learn Hindi. The word 'शीर्षक' (shīrṣak) might seem a bit long, but it is very useful. It simply means 'title' or 'heading'. Think about the name of your favorite book or a movie you like to watch. That name is its 'शीर्षक'. For example, if you have a Hindi textbook, the big words on the cover are the 'शीर्षक'. When your teacher writes the name of a new lesson on the blackboard, that is the 'शीर्षक'. It is a masculine word, so we say 'अच्छा शीर्षक' (good title). You don't need to worry about complex grammar yet. Just remember that when you want to ask 'What is the name of this story?', you can say 'इस कहानी का शीर्षक क्या है?' (Is kahani ka shirshak kya hai?). It is much better than just saying 'नाम' (name) when talking about books. Practice looking at books and saying the word 'शीर्षक' out loud. It helps to connect the word with the physical top of a page. Remember, 'शीर्ष' means head, and the 'शीर्षक' sits at the head of the page!
At the A2 level, you can start using 'शीर्षक' more actively in your sentences. You already know it means 'title' or 'heading'. Now, you should focus on using it with the correct grammar. Since 'शीर्षक' is a masculine singular noun, you must use the postposition 'का' (ka) when saying 'title of...'. For example, 'किताब का शीर्षक' (title of the book) or 'फिल्म का शीर्षक' (title of the film). You can also use adjectives with it, like 'नया शीर्षक' (new title) or 'लंबा शीर्षक' (long title). You will see this word often in your reading exercises. A common instruction is 'इस गद्यांश का उचित शीर्षक दें' (Give a proper title to this passage). This means you need to read the text and think of a good heading for it. You can also use it in simple conversations. If your friend is reading a book, you can ask, 'तुम्हारी किताब का शीर्षक क्या है?' (What is the title of your book?). Try not to confuse it with 'विषय' (subject). The subject is what the book is about, but the 'शीर्षक' is its exact name.
At the B1 level, your understanding of 'शीर्षक' expands to include different types of media and slightly more complex sentence structures. You are not just talking about books anymore; you are discussing articles, essays, and news reports. You should be comfortable using related terms like 'उपशीर्षक' (subheading). When writing an essay in Hindi, you should organize it using a main 'शीर्षक' and several 'उपशीर्षक'. You will also encounter this word in news contexts, although 'सुर्खियां' is used for headlines. A news anchor might say, 'आइए देखते हैं आज के मुख्य शीर्षक' (Let's look at today's main headings). You can express opinions about titles now. For example, 'मुझे लगता है कि इस लेख का शीर्षक भ्रामक है' (I think the title of this article is misleading). You should also understand that 'शीर्षक' is strictly for inanimate works. Never use it for a person's professional title (like Doctor or Professor); for that, use 'उपाधि'. Your ability to distinguish between 'नाम', 'शीर्षक', and 'उपाधि' shows your growing proficiency in Hindi.
At the B2 level, 'शीर्षक' becomes a tool for more abstract and professional communication. You are expected to use it seamlessly in academic discussions, literary analysis, and formal presentations. When analyzing a poem or a novel, you might discuss the significance of the 'शीर्षक' and how it reflects the underlying themes of the work. For example: 'लेखक ने यह शीर्षक क्यों चुना? यह कहानी के मुख्य विषय को कैसे दर्शाता है?' (Why did the author choose this title? How does it reflect the main theme of the story?). In a professional environment, you will use it when drafting reports or creating presentation slides. You might say, 'हमें इस रिपोर्ट के लिए एक अधिक प्रभावशाली शीर्षक की आवश्यकता है' (We need a more impactful title for this report). You should also be familiar with idiomatic or metaphorical uses, where the 'शीर्षक' represents the entire identity of a movement or a campaign. Your vocabulary should include collocations like 'शीर्षक देना' (to give a title), 'शीर्षक के अंतर्गत' (under the heading of), and 'आकर्षक शीर्षक' (catchy title).
At the C1 level, your use of 'शीर्षक' is sophisticated and nuanced. You understand its etymological roots (from Sanskrit 'शीर्ष' meaning head) and can appreciate its use in high-register Hindi literature and journalism. You can engage in complex debates about media ethics, discussing concepts like 'क्लिकबेट' (clickbait) and 'सनसनीखेज शीर्षक' (sensationalist headings). You might write a critique saying, 'वर्तमान पत्रकारिता में, समाचार की गुणवत्ता अक्सर आकर्षक शीर्षकों के पीछे छिप जाती है' (In contemporary journalism, the quality of news is often hidden behind catchy titles). You are comfortable navigating legal and bureaucratic documents where 'शीर्षक' and 'उपशीर्षक' define the strict hierarchy of clauses and sub-clauses. You can also play with the word in creative writing, perhaps using a paradoxical 'शीर्षक' to subvert reader expectations. Your mastery is shown not just in knowing the word, but in knowing exactly when to use it over synonyms like 'नाम', 'हेडिंग', or 'सुर्खी' to achieve the precise tone required for your audience.
At the C2 level, you possess a native-like command over the word 'शीर्षक' and its entire semantic field. You can analyze classical Hindi and Sanskritized texts where the concept of the 'शीर्षक' carries philosophical weight, representing the 'head' or the ultimate essence of a treatise. You understand the historical evolution of how texts were named in Indian literary traditions versus modern Western-influenced titling conventions. In academic writing, you can effortlessly construct complex, multi-layered sentences: 'यद्यपि प्रस्तुत शोध-प्रबंध का शीर्षक प्रथम दृष्टया सामान्य प्रतीत होता है, तथापि इसके अंतर्गत निहित उपशीर्षक एक अत्यंत जटिल विमर्श को जन्म देते हैं' (Although the title of the presented dissertation appears ordinary at first glance, the subheadings contained within it give rise to a highly complex discourse). You can critique the translation of titles from other languages into Hindi, evaluating whether the translated 'शीर्षक' captures the cultural nuance of the original. Your use of the word is flawless in terms of gender agreement, register, and stylistic appropriateness across all possible contexts.

शीर्षक in 30 Seconds

  • Meaning: Title or Heading of a work.
  • Gender: Masculine Noun (अच्छा शीर्षक).
  • Usage: Books, movies, articles, essays.
  • Do Not Use For: People's names or professional titles.

The Hindi word शीर्षक (shīrṣak) primarily translates to 'title' or 'heading' in English. It is a masculine noun used extensively in both formal and informal contexts to refer to the name given to a piece of writing, an artwork, a movie, a news article, or any structured composition. Understanding this word is fundamental for anyone engaging with Hindi literature, media, or academic texts, as it forms the basis of how we identify and categorize creative and informational works. The concept of a title is universal, but the specific usage of 'शीर्षक' carries a sense of formal identification. When you open a book, the first thing you read is its शीर्षक. When you read a newspaper, the bold text at the top is the शीर्षक. It is derived from the Sanskrit root 'शीर्ष' (shīrṣa), meaning 'head', which logically extends to the 'heading' or the 'head' of a text. This etymological connection makes it easy to remember: just as the head is at the top of the body, the शीर्षक is at the top of the page.

Literal Meaning
The literal translation points towards 'that which is at the head' or 'heading'.
Contextual Meaning
In everyday use, it means the title of a book, movie, essay, or article.

इस कहानी का शीर्षक बहुत दिलचस्प है।

The title of this story is very interesting.

Beyond just books and movies, 'शीर्षक' is used in corporate environments for presentation slides, in legal documents for section headers, and in digital media for webpage titles. The versatility of the word makes it a high-frequency vocabulary item for learners at the A2 level and beyond. It is important to distinguish 'शीर्षक' from 'नाम' (name). While a person has a 'नाम', a book has a 'शीर्षक'. You would not typically ask for the 'नाम' of an essay; you ask for its 'शीर्षक'. This distinction is crucial for sounding natural in Hindi. Furthermore, in academic settings, students are often asked to provide a suitable 'शीर्षक' for an unseen passage during reading comprehension exercises. This highlights its role in summarizing and encapsulating the core theme of a text.

कृपया अपने निबंध के लिए एक उपयुक्त शीर्षक चुनें।

Please choose a suitable title for your essay.

When discussing news, the word 'शीर्षक' is often used interchangeably with 'सुर्खियां' (headlines), though 'सुर्खियां' specifically refers to news headlines, whereas 'शीर्षक' is the general term for any heading. For instance, a news anchor might say, 'आज के मुख्य शीर्षक' (today's main headlines), but a teacher will say 'पाठ का शीर्षक' (the title of the lesson). This nuanced application demonstrates the depth of the word. Let's look at how it breaks down in different categories of media.

In Literature
Refers to the name of the novel, poem, or short story.
In Journalism
Refers to the headline of an article or report.

समाचार पत्र का मुख्य शीर्षक चौंकाने वाला था।

The main headline of the newspaper was shocking.

The cultural weight of a 'शीर्षक' in Indian literature cannot be understated. Authors spend considerable time selecting a title that conveys the philosophical or emotional core of their work. A strong 'शीर्षक' is considered half the battle won in capturing the audience's attention. In modern digital contexts, SEO (Search Engine Optimization) relies heavily on the 'शीर्षक' of a webpage. Content creators in Hindi digital media constantly optimize their 'शीर्षक' to attract more clicks, showing how this traditional word has seamlessly adapted to the internet age.

इस कविता का शीर्षक क्या है?

What is the title of this poem?

To fully master this word, practice identifying the 'शीर्षक' of everything you read in Hindi. Look at the top of a YouTube video, a blog post, or a textbook chapter. By actively recognizing the 'शीर्षक' in your daily life, you reinforce your understanding of the word and its varied applications across different media formats.

Grammar Focus
It is a masculine noun, so adjectives and verbs must agree with it (e.g., 'अच्छा शीर्षक', not 'अच्छी शीर्षक').

यह एक बहुत ही आकर्षक शीर्षक है।

This is a very catchy title.

Using the word शीर्षक (shīrṣak) correctly involves understanding its grammatical gender and its typical collocations. As a masculine singular noun, it dictates the gender of the adjectives that describe it and the verbs that follow it. For example, you would say 'बड़ा शीर्षक' (big heading) or 'नया शीर्षक' (new title). You would never say 'नई शीर्षक'. This is a fundamental rule of Hindi grammar that learners must internalize. When constructing sentences, 'शीर्षक' often functions as the subject or the direct object. For instance, in the sentence 'मैंने शीर्षक पढ़ा' (I read the title), it is the object. In 'शीर्षक बहुत लंबा है' (The title is very long), it is the subject. Mastering these sentence structures will significantly improve your fluency and confidence when discussing media and literature in Hindi.

Subject Usage
When the title is performing the action or being described: 'शीर्षक दिलचस्प है' (The title is interesting).
Object Usage
When the action is performed on the title: 'उसने शीर्षक बदल दिया' (He changed the title).

लेखक ने अपनी नई किताब का शीर्षक घोषित किया।

The author announced the title of his new book.

Another common way to use 'शीर्षक' is with the postposition 'के तहत' (under) or 'के नाम से' (by the name of). For example, 'इस शीर्षक के तहत कई लेख प्रकाशित हुए हैं' (Many articles have been published under this title). This phrasing is highly formal and is frequently encountered in academic writing, legal documents, and official reports. In everyday conversation, you might ask a friend about a movie: 'उस फिल्म का शीर्षक क्या था जो हमने कल देखी थी?' (What was the title of that movie we saw yesterday?). Notice how the word fits seamlessly into casual dialogue while maintaining its formal definition.

मुझे इस प्रोजेक्ट के लिए एक अच्छा शीर्षक सोचना होगा।

I have to think of a good title for this project.

When writing essays or reports in Hindi, you will often need to use subheadings. In this context, the word 'उपशीर्षक' (up-shīrṣak) is used, where 'उप' means 'sub' or 'under'. So, a main heading is the 'मुख्य शीर्षक' and the subheadings are 'उपशीर्षक'. This hierarchical structure is essential for organizing written content logically. Teachers frequently instruct students: 'अपने निबंध को उचित शीर्षकों और उपशीर्षकों में विभाजित करें' (Divide your essay into appropriate headings and subheadings). This demonstrates the practical application of the word in educational settings.

Main Title
मुख्य शीर्षक (Mukhya Shīrṣak) - The primary heading of a document.
Subheading
उपशीर्षक (Up-shīrṣak) - The secondary heading used to divide sections.

इस पृष्ठ पर कोई शीर्षक नहीं है।

There is no heading on this page.

Let's consider the use of 'शीर्षक' in the digital realm. When creating a website, the `` tag in HTML is referred to as the 'वेबपेज का शीर्षक'. Bloggers are advised to write 'आकर्षक शीर्षक' (catchy titles) to draw in readers. In this context, the word takes on a marketing dimension. A good 'शीर्षक' is not just a name; it is a hook. You might hear digital marketers say, 'आपका शीर्षक क्लिकेबल होना चाहिए' (Your title should be clickable). Even though 'क्लिकेबल' is an English loanword, it pairs perfectly with the traditional Hindi word 'शीर्षक', showcasing the dynamic nature of modern Hindi.</p><aside class='my-3 flex gap-3 p-3 rounded-xl bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800' role='note'><span class='text-lg flex-shrink-0'>💡</span><div class='text-sm text-blue-800 dark:text-blue-200'><strong>Collocation:</strong> 'शीर्षक देना' (to give a title) is the standard verb phrase used when naming a piece of work.</div></aside><figure class='my-3 rounded-xl bg-emerald-50 dark:bg-emerald-900/20 border-s-4 border-emerald-400 overflow-hidden'><blockquote class='p-3 not-prose'><p class='font-sans text-base font-medium text-emerald-800 dark:text-emerald-200'>क्या आपने अपनी कहानी को कोई <mark class='bg-emerald-200 dark:bg-emerald-800 px-0.5 rounded'>शीर्षक</mark> दिया है?</p></blockquote><figcaption class='px-3 pb-3 text-sm text-emerald-600 dark:text-emerald-400'>Have you given any title to your story?</figcaption></figure><p>Finally, when translating from English to Hindi, be careful not to translate 'title' as 'शीर्षक' when it refers to a person's formal designation (like Sir, Dr., or Lord). In that specific context, the correct Hindi word is 'उपाधि' (upādhi) or 'पदवी' (padvī). 'शीर्षक' is strictly reserved for inanimate creative or informational works. Keeping this distinction clear will prevent confusing errors in your Hindi communication.</p><dl class='my-3 space-y-2'><dt class='text-sm font-semibold text-violet-600 dark:text-violet-400 uppercase tracking-wider'>For Things</dt><dd class='text-base text-surface-700 dark:text-surface-200 leading-relaxed ps-4 border-s-2 border-violet-200 dark:border-violet-800'>Use 'शीर्षक' for books, movies, articles, and essays.</dd></dl><figure class='my-3 rounded-xl bg-emerald-50 dark:bg-emerald-900/20 border-s-4 border-emerald-400 overflow-hidden'><blockquote class='p-3 not-prose'><p class='font-sans text-base font-medium text-emerald-800 dark:text-emerald-200'>ईमेल का <mark class='bg-emerald-200 dark:bg-emerald-800 px-0.5 rounded'>शीर्षक</mark> स्पष्ट होना चाहिए।</p></blockquote><figcaption class='px-3 pb-3 text-sm text-emerald-600 dark:text-emerald-400'>The subject/title of the email should be clear.</figcaption></figure></div> </div> </div> </div> <div class="bg-white dark:bg-dark-card border-2 border-surface-200 dark:border-[#3b3755] border-b-4 rounded-2xl overflow-hidden"> <button @click="openSection = (openSection === 2 ? null : 2)" class="flex items-center justify-between w-full p-5 ltr:text-left rtl:text-right group"> <div class="flex items-center gap-3 flex-1 min-w-0"> <span class="inline-flex items-center justify-center min-w-[2rem] h-8 rounded-xl bg-brand-100 dark:bg-brand-900/30 text-brand-700 dark:text-brand-300 text-sm font-bold flex-shrink-0">3</span> <h3 class="font-bold text-surface-900 dark:text-white text-sm sm:text-base group-hover:text-brand-600 dark:group-hover:text-brand-400 transition-colors leading-snug"> Where You Hear It </h3> </div> <svg :class="openSection === 2 && 'rotate-180'" class="w-5 h-5 text-surface-400 transition-transform duration-200 flex-shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"/></svg> </button> <div x-show="openSection === 2" x-collapse x-cloak class="px-5 pb-5"> <div class="rich-html text-surface-600 dark:text-surface-300"> <div class='text-surface-800 dark:text-surface-200 leading-relaxed space-y-4'><p>The word <strong>शीर्षक (shīrṣak)</strong> is ubiquitous in Hindi-speaking environments, bridging the gap between highly formal academic settings and everyday casual conversations about media. You will encounter this word almost daily if you consume Hindi content. One of the most common places to hear it is in educational institutions. From primary school to university, teachers constantly refer to the 'शीर्षक' of a chapter, a poem, or a research paper. During exams, a classic question format is 'निम्नलिखित गद्यांश को पढ़ें और एक उपयुक्त शीर्षक दें' (Read the following passage and give a suitable title). This makes it an essential vocabulary word for students. Furthermore, in libraries and bookstores, you might ask the staff to help you find a book by its 'शीर्षक', making it a highly practical word for navigating literary spaces.</p><dl class='my-3 space-y-2'><dt class='text-sm font-semibold text-violet-600 dark:text-violet-400 uppercase tracking-wider'>In Schools</dt><dd class='text-base text-surface-700 dark:text-surface-200 leading-relaxed ps-4 border-s-2 border-violet-200 dark:border-violet-800'>Used by teachers when discussing chapters, essays, and reading comprehension.</dd><dt class='text-sm font-semibold text-violet-600 dark:text-violet-400 uppercase tracking-wider'>In Bookstores</dt><dd class='text-base text-surface-700 dark:text-surface-200 leading-relaxed ps-4 border-s-2 border-violet-200 dark:border-violet-800'>Used when searching for a specific publication by its name.</dd></dl><figure class='my-3 rounded-xl bg-emerald-50 dark:bg-emerald-900/20 border-s-4 border-emerald-400 overflow-hidden'><blockquote class='p-3 not-prose'><p class='font-sans text-base font-medium text-emerald-800 dark:text-emerald-200'>अध्यापक ने बोर्ड पर पाठ का <mark class='bg-emerald-200 dark:bg-emerald-800 px-0.5 rounded'>शीर्षक</mark> लिखा।</p></blockquote><figcaption class='px-3 pb-3 text-sm text-emerald-600 dark:text-emerald-400'>The teacher wrote the title of the lesson on the board.</figcaption></figure><p>Another major domain where 'शीर्षक' is frequently heard is the entertainment industry. Bollywood news, film reviews, and discussions about television shows heavily rely on this word. When a new movie is announced, the media will report on its 'शीर्षक'. Film critics might analyze whether the 'शीर्षक' accurately reflects the plot of the movie. In casual conversations with friends, you might debate the meaning behind a cryptic movie title, saying, 'मुझे इस फिल्म का शीर्षक समझ नहीं आया' (I didn't understand the title of this film). This shows that while the word is formal in origin, it is fully integrated into colloquial discussions about pop culture.</p><aside class='my-3 flex gap-3 p-3 rounded-xl bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800' role='note'><span class='text-lg flex-shrink-0'>💡</span><div class='text-sm text-blue-800 dark:text-blue-200'><strong>Listening Tip:</strong> Pay attention to news anchors. They often use 'शीर्षक' when summarizing the top stories before going into detail.</div></aside><figure class='my-3 rounded-xl bg-emerald-50 dark:bg-emerald-900/20 border-s-4 border-emerald-400 overflow-hidden'><blockquote class='p-3 not-prose'><p class='font-sans text-base font-medium text-emerald-800 dark:text-emerald-200'>इस गाने का <mark class='bg-emerald-200 dark:bg-emerald-800 px-0.5 rounded'>शीर्षक</mark> मेरी जुबान पर है, लेकिन याद नहीं आ रहा।</p></blockquote><figcaption class='px-3 pb-3 text-sm text-emerald-600 dark:text-emerald-400'>The title of this song is on the tip of my tongue, but I can't remember it.</figcaption></figure><p>Journalism and news media are also prime environments for this word. While 'सुर्खियां' is the specific word for headlines, 'शीर्षक' is used broadly for the headings of articles, op-eds, and reports. An editor might tell a journalist, 'तुम्हारा लेख अच्छा है, लेकिन शीर्षक और बेहतर हो सकता है' (Your article is good, but the title could be better). In the digital age, the concept of 'clickbait' is often discussed in relation to 'भ्रामक शीर्षक' (misleading titles). As people consume more news online, the importance of a strong, accurate 'शीर्षक' has become a frequent topic of discussion in media literacy circles.</p><dl class='my-3 space-y-2'><dt class='text-sm font-semibold text-violet-600 dark:text-violet-400 uppercase tracking-wider'>In Newsrooms</dt><dd class='text-base text-surface-700 dark:text-surface-200 leading-relaxed ps-4 border-s-2 border-violet-200 dark:border-violet-800'>Editors discuss the impact and accuracy of article headings.</dd><dt class='text-sm font-semibold text-violet-600 dark:text-violet-400 uppercase tracking-wider'>Online Media</dt><dd class='text-base text-surface-700 dark:text-surface-200 leading-relaxed ps-4 border-s-2 border-violet-200 dark:border-violet-800'>Used to describe the titles of YouTube videos, blogs, and social media posts.</dd></dl><figure class='my-3 rounded-xl bg-emerald-50 dark:bg-emerald-900/20 border-s-4 border-emerald-400 overflow-hidden'><blockquote class='p-3 not-prose'><p class='font-sans text-base font-medium text-emerald-800 dark:text-emerald-200'>वीडियो का <mark class='bg-emerald-200 dark:bg-emerald-800 px-0.5 rounded'>शीर्षक</mark> देखकर ही मैंने उस पर क्लिक किया।</p></blockquote><figcaption class='px-3 pb-3 text-sm text-emerald-600 dark:text-emerald-400'>I clicked on the video just by seeing its title.</figcaption></figure><p>In the corporate world, 'शीर्षक' is used during presentations and report writing. A manager might ask an employee to change the 'शीर्षक' of a slide to make it more professional. In legal and bureaucratic contexts, documents are organized by 'शीर्षक' and 'उपशीर्षक' (subheadings) to ensure clarity. When reading a contract, you navigate through the different clauses by looking at their 'शीर्षक'. This formal application underscores the word's importance in maintaining structure and order in professional communication.</p><aside class='my-3 flex gap-3 p-3 rounded-xl bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800' role='note'><span class='text-lg flex-shrink-0'>💡</span><div class='text-sm text-blue-800 dark:text-blue-200'><strong>Cultural Context:</strong> In Indian classical music, the 'शीर्षक' of a composition often indicates the Raga (melodic framework) it is based on.</div></aside><figure class='my-3 rounded-xl bg-emerald-50 dark:bg-emerald-900/20 border-s-4 border-emerald-400 overflow-hidden'><blockquote class='p-3 not-prose'><p class='font-sans text-base font-medium text-emerald-800 dark:text-emerald-200'>रिपोर्ट के हर भाग का एक अलग <mark class='bg-emerald-200 dark:bg-emerald-800 px-0.5 rounded'>शीर्षक</mark> है।</p></blockquote><figcaption class='px-3 pb-3 text-sm text-emerald-600 dark:text-emerald-400'>Every section of the report has a different heading.</figcaption></figure><p>Finally, you will hear 'शीर्षक' in literary festivals and poetry recitals (Kavi Sammelans). Before reciting a poem, a poet will typically announce its 'शीर्षक' to set the mood and context for the audience. The announcement of the 'शीर्षक' is often met with applause if it is particularly clever or evocative. Understanding this word allows you to fully participate in and appreciate these rich cultural events in the Hindi-speaking world.</p><dl class='my-3 space-y-2'><dt class='text-sm font-semibold text-violet-600 dark:text-violet-400 uppercase tracking-wider'>Poetry Recitals</dt><dd class='text-base text-surface-700 dark:text-surface-200 leading-relaxed ps-4 border-s-2 border-violet-200 dark:border-violet-800'>Poets announce the title before beginning their recitation.</dd></dl><figure class='my-3 rounded-xl bg-emerald-50 dark:bg-emerald-900/20 border-s-4 border-emerald-400 overflow-hidden'><blockquote class='p-3 not-prose'><p class='font-sans text-base font-medium text-emerald-800 dark:text-emerald-200'>कवि ने अपनी कविता का <mark class='bg-emerald-200 dark:bg-emerald-800 px-0.5 rounded'>शीर्षक</mark> 'उम्मीद' बताया।</p></blockquote><figcaption class='px-3 pb-3 text-sm text-emerald-600 dark:text-emerald-400'>The poet announced the title of his poem as 'Hope'.</figcaption></figure></div> </div> </div> </div> <div class="bg-white dark:bg-dark-card border-2 border-surface-200 dark:border-[#3b3755] border-b-4 rounded-2xl overflow-hidden"> <button @click="openSection = (openSection === 3 ? null : 3)" class="flex items-center justify-between w-full p-5 ltr:text-left rtl:text-right group"> <div class="flex items-center gap-3 flex-1 min-w-0"> <span class="inline-flex items-center justify-center min-w-[2rem] h-8 rounded-xl bg-brand-100 dark:bg-brand-900/30 text-brand-700 dark:text-brand-300 text-sm font-bold flex-shrink-0">4</span> <h3 class="font-bold text-surface-900 dark:text-white text-sm sm:text-base group-hover:text-brand-600 dark:group-hover:text-brand-400 transition-colors leading-snug"> Common Mistakes </h3> </div> <svg :class="openSection === 3 && 'rotate-180'" class="w-5 h-5 text-surface-400 transition-transform duration-200 flex-shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"/></svg> </button> <div x-show="openSection === 3" x-collapse x-cloak class="px-5 pb-5"> <div class="rich-html text-surface-600 dark:text-surface-300"> <div class='text-surface-800 dark:text-surface-200 leading-relaxed space-y-4'><p>When learning the word <strong>शीर्षक (shīrṣak)</strong>, students often make a few predictable errors, primarily related to confusing it with other words that mean 'name' or 'subject', and making gender agreement mistakes. The most common mistake is using 'नाम' (nām - name) instead of 'शीर्षक' when referring to the title of a creative work. While it is not entirely incorrect to ask 'इस किताब का नाम क्या है?' (What is the name of this book?), using 'शीर्षक' is much more precise and sounds significantly more natural and educated. You would say 'इस किताब का शीर्षक क्या है?'. Conversely, you must never use 'शीर्षक' for a person. Asking a person 'आपका शीर्षक क्या है?' would mean 'What is your heading/title (like a book)?' which is nonsensical. For people, always use 'नाम' or 'उपाधि' (if referring to a professional title like Dr. or Sir).</p><dl class='my-3 space-y-2'><dt class='text-sm font-semibold text-violet-600 dark:text-violet-400 uppercase tracking-wider'>Mistake: Using for People</dt><dd class='text-base text-surface-700 dark:text-surface-200 leading-relaxed ps-4 border-s-2 border-violet-200 dark:border-violet-800'>Incorrect: उस आदमी का शीर्षक क्या है? (What is that man's title?) -> Correct: उस आदमी का नाम क्या है?</dd><dt class='text-sm font-semibold text-violet-600 dark:text-violet-400 uppercase tracking-wider'>Mistake: Confusing with Subject</dt><dd class='text-base text-surface-700 dark:text-surface-200 leading-relaxed ps-4 border-s-2 border-violet-200 dark:border-violet-800'>Incorrectly using 'विषय' (subject) when you mean the specific heading.</dd></dl><figure class='my-3 rounded-xl bg-emerald-50 dark:bg-emerald-900/20 border-s-4 border-emerald-400 overflow-hidden'><blockquote class='p-3 not-prose'><p class='font-sans text-base font-medium text-emerald-800 dark:text-emerald-200'>गलत: किताब का नाम। सही: किताब का <mark class='bg-emerald-200 dark:bg-emerald-800 px-0.5 rounded'>शीर्षक</mark>।</p></blockquote><figcaption class='px-3 pb-3 text-sm text-emerald-600 dark:text-emerald-400'>Incorrect: Name of the book. Correct: Title of the book.</figcaption></figure><p>Another frequent error involves grammatical gender. 'शीर्षक' is a masculine noun. Therefore, all associated adjectives and postpositions must be in their masculine forms. English speakers, who do not have grammatical gender for inanimate objects, often default to feminine endings by mistake, saying things like 'अच्छी शीर्षक' (achchhi shīrṣak) instead of the correct 'अच्छा शीर्षक' (achchha shīrṣak). Similarly, when using the genitive postposition 'of', you must use 'का' (kā) and not 'की' (kī). It is always 'कहानी का शीर्षक' (the story's title), never 'कहानी की शीर्षक'. The word 'कहानी' is feminine, but the postposition agrees with 'शीर्षक', which is masculine. This is a classic trap for A2 level learners.</p><aside class='my-3 flex gap-3 p-3 rounded-xl bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800' role='note'><span class='text-lg flex-shrink-0'>💡</span><div class='text-sm text-blue-800 dark:text-blue-200'><strong>Grammar Rule:</strong> Postpositions agree with the object possessed, not the possessor. Since 'शीर्षक' is masculine, always use 'का' before it.</div></aside><figure class='my-3 rounded-xl bg-emerald-50 dark:bg-emerald-900/20 border-s-4 border-emerald-400 overflow-hidden'><blockquote class='p-3 not-prose'><p class='font-sans text-base font-medium text-emerald-800 dark:text-emerald-200'>यह एक बहुत ही सुंदर <mark class='bg-emerald-200 dark:bg-emerald-800 px-0.5 rounded'>शीर्षक</mark> है।</p></blockquote><figcaption class='px-3 pb-3 text-sm text-emerald-600 dark:text-emerald-400'>This is a very beautiful title. (Note the masculine agreement).</figcaption></figure><p>Learners also sometimes confuse 'शीर्षक' with 'विषय' (viṣay), which means 'subject' or 'topic'. While the title of an essay might reflect its subject, the two words are not interchangeable. The 'विषय' is what the text is about (e.g., Global Warming), while the 'शीर्षक' is the specific name given to that text (e.g., 'The Heat is On: A Study of Climate Change'). If a teacher asks for the 'विषय', they want a summary of the content. If they ask for the 'शीर्षक', they want the exact heading. Mixing these up can lead to misunderstandings in academic environments.</p><dl class='my-3 space-y-2'><dt class='text-sm font-semibold text-violet-600 dark:text-violet-400 uppercase tracking-wider'>शीर्षक (Title)</dt><dd class='text-base text-surface-700 dark:text-surface-200 leading-relaxed ps-4 border-s-2 border-violet-200 dark:border-violet-800'>The specific name given to a piece of work.</dd><dt class='text-sm font-semibold text-violet-600 dark:text-violet-400 uppercase tracking-wider'>विषय (Subject)</dt><dd class='text-base text-surface-700 dark:text-surface-200 leading-relaxed ps-4 border-s-2 border-violet-200 dark:border-violet-800'>The broad topic or theme the work is discussing.</dd></dl><figure class='my-3 rounded-xl bg-emerald-50 dark:bg-emerald-900/20 border-s-4 border-emerald-400 overflow-hidden'><blockquote class='p-3 not-prose'><p class='font-sans text-base font-medium text-emerald-800 dark:text-emerald-200'>निबंध का विषय प्रदूषण है, लेकिन <mark class='bg-emerald-200 dark:bg-emerald-800 px-0.5 rounded'>शीर्षक</mark> 'काली हवा' है।</p></blockquote><figcaption class='px-3 pb-3 text-sm text-emerald-600 dark:text-emerald-400'>The subject of the essay is pollution, but the title is 'Black Air'.</figcaption></figure><p>A minor spelling mistake that occurs is writing 'शिर्षक' (with a short 'i' sound) instead of the correct 'शीर्षक' (with a long 'ī' sound). In Hindi script (Devanagari), the difference between 'ि' and 'ी' is crucial. The word derives from 'शीर्ष' (head), which has a long 'ī'. Pronouncing it with a short 'i' makes it sound incorrect to native speakers. Always emphasize the first syllable slightly to ensure the correct long vowel sound is produced.</p><aside class='my-3 flex gap-3 p-3 rounded-xl bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800' role='note'><span class='text-lg flex-shrink-0'>💡</span><div class='text-sm text-blue-800 dark:text-blue-200'><strong>Spelling Tip:</strong> Remember the long 'ee' sound. It's 'sheer-shak', not 'shir-shak'.</div></aside><figure class='my-3 rounded-xl bg-emerald-50 dark:bg-emerald-900/20 border-s-4 border-emerald-400 overflow-hidden'><blockquote class='p-3 not-prose'><p class='font-sans text-base font-medium text-emerald-800 dark:text-emerald-200'>सही वर्तनी <mark class='bg-emerald-200 dark:bg-emerald-800 px-0.5 rounded'>शीर्षक</mark> है, शिर्षक नहीं।</p></blockquote><figcaption class='px-3 pb-3 text-sm text-emerald-600 dark:text-emerald-400'>The correct spelling is shīrṣak, not shirṣak.</figcaption></figure><p>Lastly, avoid using 'शीर्षक' when referring to a person's legal right to property (which is also called 'title' in English law). In Hindi legal terminology, property title is usually referred to as 'स्वामित्व' (ownership) or 'हक' (right). Translating 'property title' as 'संपत्ति का शीर्षक' sounds like you are talking about the heading of a document about property, not the legal ownership itself. Context is key when translating English words with multiple meanings.</p><dl class='my-3 space-y-2'><dt class='text-sm font-semibold text-violet-600 dark:text-violet-400 uppercase tracking-wider'>Creative Title</dt><dd class='text-base text-surface-700 dark:text-surface-200 leading-relaxed ps-4 border-s-2 border-violet-200 dark:border-violet-800'>Use 'शीर्षक' (e.g., Book title).</dd></dl><figure class='my-3 rounded-xl bg-emerald-50 dark:bg-emerald-900/20 border-s-4 border-emerald-400 overflow-hidden'><blockquote class='p-3 not-prose'><p class='font-sans text-base font-medium text-emerald-800 dark:text-emerald-200'>उसने अपनी नई कविता को एक अद्भुत <mark class='bg-emerald-200 dark:bg-emerald-800 px-0.5 rounded'>शीर्षक</mark> दिया।</p></blockquote><figcaption class='px-3 pb-3 text-sm text-emerald-600 dark:text-emerald-400'>He gave a wonderful title to his new poem.</figcaption></figure></div> </div> </div> </div> <div class="bg-white dark:bg-dark-card border-2 border-surface-200 dark:border-[#3b3755] border-b-4 rounded-2xl overflow-hidden"> <button @click="openSection = (openSection === 4 ? null : 4)" class="flex items-center justify-between w-full p-5 ltr:text-left rtl:text-right group"> <div class="flex items-center gap-3 flex-1 min-w-0"> <span class="inline-flex items-center justify-center min-w-[2rem] h-8 rounded-xl bg-brand-100 dark:bg-brand-900/30 text-brand-700 dark:text-brand-300 text-sm font-bold flex-shrink-0">5</span> <h3 class="font-bold text-surface-900 dark:text-white text-sm sm:text-base group-hover:text-brand-600 dark:group-hover:text-brand-400 transition-colors leading-snug"> Similar Words </h3> </div> <svg :class="openSection === 4 && 'rotate-180'" class="w-5 h-5 text-surface-400 transition-transform duration-200 flex-shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"/></svg> </button> <div x-show="openSection === 4" x-collapse x-cloak class="px-5 pb-5"> <div class="rich-html text-surface-600 dark:text-surface-300"> <div class='text-surface-800 dark:text-surface-200 leading-relaxed space-y-4'><p>To truly master the vocabulary surrounding <strong>शीर्षक (shīrṣak)</strong>, it is helpful to explore its synonyms and related terms. Hindi has a rich vocabulary for different types of names, headings, and titles, and knowing the nuances between them will elevate your language skills. The most direct synonym in casual spoken Hindi is the English loanword 'टाइटल' (title) or 'हेडिंग' (heading). These are used interchangeably with 'शीर्षक' in modern, urban environments. However, in written and formal Hindi, 'शीर्षक' remains the undisputed standard. Let's look at some native Hindi words that share similar semantic space but have distinct applications.</p><dl class='my-3 space-y-2'><dt class='text-sm font-semibold text-violet-600 dark:text-violet-400 uppercase tracking-wider'>नाम (Nām)</dt><dd class='text-base text-surface-700 dark:text-surface-200 leading-relaxed ps-4 border-s-2 border-violet-200 dark:border-violet-800'>Meaning 'name'. Used for people, places, and things in a general sense. While a book has a 'नाम', 'शीर्षक' is the more precise term for its title.</dd><dt class='text-sm font-semibold text-violet-600 dark:text-violet-400 uppercase tracking-wider'>उपाधि (Upādhi)</dt><dd class='text-base text-surface-700 dark:text-surface-200 leading-relaxed ps-4 border-s-2 border-violet-200 dark:border-violet-800'>Meaning 'title' in the sense of a degree, honorific, or professional designation (e.g., Doctor, Sir, Padma Shri). Never used for books.</dd></dl><figure class='my-3 rounded-xl bg-emerald-50 dark:bg-emerald-900/20 border-s-4 border-emerald-400 overflow-hidden'><blockquote class='p-3 not-prose'><p class='font-sans text-base font-medium text-emerald-800 dark:text-emerald-200'>गांधीजी को 'महात्मा' की उपाधि मिली, लेकिन उनकी आत्मकथा का <mark class='bg-emerald-200 dark:bg-emerald-800 px-0.5 rounded'>शीर्षक</mark> 'सत्य के प्रयोग' है।</p></blockquote><figcaption class='px-3 pb-3 text-sm text-emerald-600 dark:text-emerald-400'>Gandhiji received the title (upadhi) of 'Mahatma', but the title (shirshak) of his autobiography is 'Experiments with Truth'.</figcaption></figure><p>Another closely related word is 'सुर्खी' (surkhī), which usually appears in its plural form 'सुर्खियां' (surkhiyān). This specifically translates to 'headlines' in the context of news. While a news article has a 'शीर्षक' (heading), the main, attention-grabbing headlines on the front page or news broadcast are 'सुर्खियां'. The word 'सुर्खी' originally meant 'redness', referring to the historical practice of writing important headings in red ink. Today, it is exclusively associated with breaking news. If you are talking about the heading of a scientific paper, you use 'शीर्षक'; if you are talking about the top story on a news channel, you use 'सुर्खियां'.</p><aside class='my-3 flex gap-3 p-3 rounded-xl bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800' role='note'><span class='text-lg flex-shrink-0'>💡</span><div class='text-sm text-blue-800 dark:text-blue-200'><strong>Nuance:</strong> Use 'सुर्खियां' for news headlines and 'शीर्षक' for everything else (books, essays, standard headings).</div></aside><figure class='my-3 rounded-xl bg-emerald-50 dark:bg-emerald-900/20 border-s-4 border-emerald-400 overflow-hidden'><blockquote class='p-3 not-prose'><p class='font-sans text-base font-medium text-emerald-800 dark:text-emerald-200'>आज के अखबार का मुख्य <mark class='bg-emerald-200 dark:bg-emerald-800 px-0.5 rounded'>शीर्षक</mark> चुनाव के बारे में है।</p></blockquote><figcaption class='px-3 pb-3 text-sm text-emerald-600 dark:text-emerald-400'>The main heading of today's newspaper is about the elections.</figcaption></figure><p>We must also consider the word 'विषय' (viṣay), meaning 'subject' or 'topic'. As discussed in the Common Mistakes section, 'विषय' is the broad theme, while 'शीर्षक' is the specific name. For example, the 'विषय' of a book might be Indian History, but its 'शीर्षक' could be 'The Discovery of India'. Understanding this distinction is vital for academic writing and formal discussions. When a moderator introduces a debate, they will state the 'विषय' (topic of debate), but the event itself might have a catchy 'शीर्षक' (event title).</p><dl class='my-3 space-y-2'><dt class='text-sm font-semibold text-violet-600 dark:text-violet-400 uppercase tracking-wider'>विषय (Viṣay)</dt><dd class='text-base text-surface-700 dark:text-surface-200 leading-relaxed ps-4 border-s-2 border-violet-200 dark:border-violet-800'>Subject or Topic. What the text is fundamentally about.</dd><dt class='text-sm font-semibold text-violet-600 dark:text-violet-400 uppercase tracking-wider'>प्रकरण (Prakaraṇ)</dt><dd class='text-base text-surface-700 dark:text-surface-200 leading-relaxed ps-4 border-s-2 border-violet-200 dark:border-violet-800'>Context or Chapter/Topic in a highly formal or academic sense.</dd></dl><figure class='my-3 rounded-xl bg-emerald-50 dark:bg-emerald-900/20 border-s-4 border-emerald-400 overflow-hidden'><blockquote class='p-3 not-prose'><p class='font-sans text-base font-medium text-emerald-800 dark:text-emerald-200'>इस लेख का <mark class='bg-emerald-200 dark:bg-emerald-800 px-0.5 rounded'>शीर्षक</mark> इसके विषय को स्पष्ट करता है।</p></blockquote><figcaption class='px-3 pb-3 text-sm text-emerald-600 dark:text-emerald-400'>The title of this article clarifies its subject.</figcaption></figure><p>In the context of legal and official documents, you might encounter the word 'मद' (mad) or 'शीर्ष' (shīrṣ). 'शीर्ष' is the root word of 'शीर्षक' and means 'head'. In accounting or budgeting, different categories are referred to as 'शीर्ष' (heads of account). While related, 'शीर्षक' is preferred for the actual written heading on the page. By understanding these subtle variations—नाम, उपाधि, सुर्खियां, विषय, and शीर्ष—you build a robust vocabulary that allows you to express yourself with precision and cultural accuracy in Hindi.</p><aside class='my-3 flex gap-3 p-3 rounded-xl bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800' role='note'><span class='text-lg flex-shrink-0'>💡</span><div class='text-sm text-blue-800 dark:text-blue-200'><strong>Vocabulary Builder:</strong> Group these words by category: 'नाम' (general), 'शीर्षक' (creative works), 'उपाधि' (people), 'सुर्खियां' (news).</div></aside><figure class='my-3 rounded-xl bg-emerald-50 dark:bg-emerald-900/20 border-s-4 border-emerald-400 overflow-hidden'><blockquote class='p-3 not-prose'><p class='font-sans text-base font-medium text-emerald-800 dark:text-emerald-200'>कृपया मुझे अपनी नई कहानी का <mark class='bg-emerald-200 dark:bg-emerald-800 px-0.5 rounded'>शीर्षक</mark> बताएं।</p></blockquote><figcaption class='px-3 pb-3 text-sm text-emerald-600 dark:text-emerald-400'>Please tell me the title of your new story.</figcaption></figure><p>Finally, the prefix 'उप' (up - sub) creates 'उपशीर्षक' (subtitle/subheading). This is crucial for formatting and reading complex texts. Whether you are reading a textbook or watching a movie with subtitles (which are also sometimes referred to as उपशीर्षक in formal contexts, though 'सबटाइटल्स' is more common), this related word is highly useful.</p><dl class='my-3 space-y-2'><dt class='text-sm font-semibold text-violet-600 dark:text-violet-400 uppercase tracking-wider'>उपशीर्षक (Up-shīrṣak)</dt><dd class='text-base text-surface-700 dark:text-surface-200 leading-relaxed ps-4 border-s-2 border-violet-200 dark:border-violet-800'>Subheading or subtitle.</dd></dl><figure class='my-3 rounded-xl bg-emerald-50 dark:bg-emerald-900/20 border-s-4 border-emerald-400 overflow-hidden'><blockquote class='p-3 not-prose'><p class='font-sans text-base font-medium text-emerald-800 dark:text-emerald-200'>मुख्य <mark class='bg-emerald-200 dark:bg-emerald-800 px-0.5 rounded'>शीर्षक</mark> के नीचे एक उपशीर्षक भी है।</p></blockquote><figcaption class='px-3 pb-3 text-sm text-emerald-600 dark:text-emerald-400'>There is also a subheading below the main heading.</figcaption></figure></div> </div> </div> </div> </div> <div class="bg-white dark:bg-dark-card border-2 border-surface-200 dark:border-[#3b3755] border-b-4 rounded-2xl p-5 sm:p-6"> <h2 class="text-lg font-bold text-surface-900 dark:text-white flex items-center gap-2 mb-4"> <svg class="w-5 h-5 text-indigo-500" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 7h12m0 0l-4-4m4 4l-4 4m0 6H4m0 0l4 4m-4-4l4-4"/></svg> How Formal Is It? </h2> <div class="divide-y divide-surface-100 dark:divide-surface-800 -mx-5 sm:-mx-6"> </div> </div> <div class="bg-white dark:bg-dark-card border-2 border-surface-200 dark:border-[#3b3755] border-b-4 rounded-2xl p-5 sm:p-6"> <h2 class="text-lg font-bold text-surface-900 dark:text-white flex items-center gap-2 mb-4"> <svg class="w-5 h-5 text-amber-600 dark:text-amber-400" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z"/></svg> Difficulty Rating </h2> <div class="grid gap-3 sm:grid-cols-2"> </div> </div> <div class="bg-white dark:bg-dark-card border-2 border-surface-200 dark:border-[#3b3755] border-b-4 rounded-2xl p-5 sm:p-6"> <h2 class="text-lg font-bold text-surface-900 dark:text-white flex items-center gap-2 mb-4"> <svg class="w-5 h-5 text-indigo-600 dark:text-indigo-400" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"/></svg> Grammar to Know </h2> <div class="space-y-2"> <div class="flex items-start gap-3 p-3 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50"> <svg class="w-4 h-4 text-indigo-500 flex-shrink-0 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 9l3 3m0 0l-3 3m3-3H8m13 0a9 9 0 11-18 0 9 9 0 0118 0z"/></svg> <div class="flex-1 min-w-0"> <p class="font-semibold text-surface-900 dark:text-white text-sm">Masculine Noun Agreement: Adjectives ending in -आ change to -ए for oblique case, but since 'शीर्षक' is masculine singular, it takes -आ in direct case (अच्छा शीर्षक).</p> </div> </div> <div class="flex items-start gap-3 p-3 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50"> <svg class="w-4 h-4 text-indigo-500 flex-shrink-0 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 9l3 3m0 0l-3 3m3-3H8m13 0a9 9 0 11-18 0 9 9 0 0118 0z"/></svg> <div class="flex-1 min-w-0"> <p class="font-semibold text-surface-900 dark:text-white text-sm">Genitive Postposition 'का': Always use 'का' when possessing a masculine singular object (किताब का शीर्षक).</p> </div> </div> <div class="flex items-start gap-3 p-3 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50"> <svg class="w-4 h-4 text-indigo-500 flex-shrink-0 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 9l3 3m0 0l-3 3m3-3H8m13 0a9 9 0 11-18 0 9 9 0 0118 0z"/></svg> <div class="flex-1 min-w-0"> <p class="font-semibold text-surface-900 dark:text-white text-sm">Ergative 'ने': When using transitive verbs in perfect tenses, the verb agrees with the object ('शीर्षक'). Example: उसने शीर्षक पढ़ा (He read the title).</p> </div> </div> <div class="flex items-start gap-3 p-3 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50"> <svg class="w-4 h-4 text-indigo-500 flex-shrink-0 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 9l3 3m0 0l-3 3m3-3H8m13 0a9 9 0 11-18 0 9 9 0 0118 0z"/></svg> <div class="flex-1 min-w-0"> <p class="font-semibold text-surface-900 dark:text-white text-sm">Direct vs Oblique Plural: Direct plural is 'शीर्षक' (दो शीर्षक - two titles). Oblique plural is 'शीर्षकों' (शीर्षकों में - in the titles).</p> </div> </div> <div class="flex items-start gap-3 p-3 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50"> <svg class="w-4 h-4 text-indigo-500 flex-shrink-0 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 9l3 3m0 0l-3 3m3-3H8m13 0a9 9 0 11-18 0 9 9 0 0118 0z"/></svg> <div class="flex-1 min-w-0"> <p class="font-semibold text-surface-900 dark:text-white text-sm">Compound Verbs: Using 'देना' (to give) with 'शीर्षक' creates the action of titling (शीर्षक देना).</p> </div> </div> </div> </div> </div> <div class="flex justify-center -mt-16 relative z-10"> <a href="https://sublearn.com/register" class="inline-flex items-center gap-2 px-6 py-3 text-sm font-bold rounded-xl bg-brand-600 hover:bg-brand-700 text-white shadow-[0_3px_0_0_#5b21b6] active:translate-y-[3px] active:shadow-none transition-all"> <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z"/></svg> Sign up free to read full explanation </a> </div> </div> <div x-show="fullTab === 'examples'" x-transition class="space-y-6 mt-3" role="tabpanel" id="panel-examples" aria-labelledby="tab-examples"> <div class=" paywall-fade "> <div class="bg-white dark:bg-dark-card border-2 border-surface-200 dark:border-[#3b3755] border-b-4 rounded-2xl p-6" x-data="{ exLevel: 'A2' }"> <h2 class="text-lg font-bold text-surface-900 dark:text-white flex items-center gap-2 mb-4"> <svg class="w-5 h-5 text-emerald-600 dark:text-emerald-400" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10"/></svg> Examples by Level </h2> <div class="flex gap-1.5 bg-emerald-100 dark:bg-emerald-900/30 rounded-xl p-1.5 pb-2.5 mb-4"> <button @click="exLevel = 'A1'" :class="exLevel === 'A1' ? 'bg-emerald-600 text-white shadow-[0_3px_0_0_#065f46] btn-glaze' : 'bg-white dark:bg-dark-card text-emerald-700 dark:text-emerald-300 shadow-[0_3px_0_0_#a7f3d0] dark:shadow-[0_3px_0_0_#064e3b]'" class="flex-1 min-h-[44px] py-2.5 px-1 text-xs font-bold rounded-xl transition-all active:translate-y-[3px] active:shadow-none" >A1</button> <button @click="exLevel = 'A2'" :class="exLevel === 'A2' ? 'bg-emerald-600 text-white shadow-[0_3px_0_0_#065f46] btn-glaze' : 'bg-white dark:bg-dark-card text-emerald-700 dark:text-emerald-300 shadow-[0_3px_0_0_#a7f3d0] dark:shadow-[0_3px_0_0_#064e3b]'" class="flex-1 min-h-[44px] py-2.5 px-1 text-xs font-bold rounded-xl transition-all active:translate-y-[3px] active:shadow-none" >A2</button> <button @click="exLevel = 'B1'" :class="exLevel === 'B1' ? 'bg-emerald-600 text-white shadow-[0_3px_0_0_#065f46] btn-glaze' : 'bg-white dark:bg-dark-card text-emerald-700 dark:text-emerald-300 shadow-[0_3px_0_0_#a7f3d0] dark:shadow-[0_3px_0_0_#064e3b]'" class="flex-1 min-h-[44px] py-2.5 px-1 text-xs font-bold rounded-xl transition-all active:translate-y-[3px] active:shadow-none" >B1</button> <button @click="exLevel = 'B2'" :class="exLevel === 'B2' ? 'bg-emerald-600 text-white shadow-[0_3px_0_0_#065f46] btn-glaze' : 'bg-white dark:bg-dark-card text-emerald-700 dark:text-emerald-300 shadow-[0_3px_0_0_#a7f3d0] dark:shadow-[0_3px_0_0_#064e3b]'" class="flex-1 min-h-[44px] py-2.5 px-1 text-xs font-bold rounded-xl transition-all active:translate-y-[3px] active:shadow-none" >B2</button> <button @click="exLevel = 'C1'" :class="exLevel === 'C1' ? 'bg-emerald-600 text-white shadow-[0_3px_0_0_#065f46] btn-glaze' : 'bg-white dark:bg-dark-card text-emerald-700 dark:text-emerald-300 shadow-[0_3px_0_0_#a7f3d0] dark:shadow-[0_3px_0_0_#064e3b]'" class="flex-1 min-h-[44px] py-2.5 px-1 text-xs font-bold rounded-xl transition-all active:translate-y-[3px] active:shadow-none" >C1</button> <button @click="exLevel = 'C2'" :class="exLevel === 'C2' ? 'bg-emerald-600 text-white shadow-[0_3px_0_0_#065f46] btn-glaze' : 'bg-white dark:bg-dark-card text-emerald-700 dark:text-emerald-300 shadow-[0_3px_0_0_#a7f3d0] dark:shadow-[0_3px_0_0_#064e3b]'" class="flex-1 min-h-[44px] py-2.5 px-1 text-xs font-bold rounded-xl transition-all active:translate-y-[3px] active:shadow-none" >C2</button> </div> <div x-show="exLevel === 'A1'" x-transition class="space-y-3"> <div class="flex items-start gap-3 p-3 rounded-xl bg-emerald-50/50 dark:bg-emerald-950/20 border border-emerald-100 dark:border-emerald-900/30"> <span class="mt-0.5 inline-flex h-6 w-6 items-center justify-center rounded-full bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300 text-xs font-bold flex-shrink-0">1</span> <div class="flex-1"> <p class="text-surface-900 dark:text-white font-medium leading-relaxed">किताब का शीर्षक क्या है?</p> <p class="text-sm text-surface-500 dark:text-surface-400 italic mt-1">What is the title of the book?</p> <p class="text-xs text-indigo-600 dark:text-indigo-400 mt-1 flex items-center gap-1"> <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg> Uses 'का' because 'शीर्षक' is masculine. </p> </div> </div> <div class="flex items-start gap-3 p-3 rounded-xl bg-emerald-50/50 dark:bg-emerald-950/20 border border-emerald-100 dark:border-emerald-900/30"> <span class="mt-0.5 inline-flex h-6 w-6 items-center justify-center rounded-full bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300 text-xs font-bold flex-shrink-0">2</span> <div class="flex-1"> <p class="text-surface-900 dark:text-white font-medium leading-relaxed">यह एक अच्छा शीर्षक है।</p> <p class="text-sm text-surface-500 dark:text-surface-400 italic mt-1">This is a good title.</p> <p class="text-xs text-indigo-600 dark:text-indigo-400 mt-1 flex items-center gap-1"> <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg> Adjective 'अच्छा' agrees with masculine 'शीर्षक'. </p> </div> </div> <div class="flex items-start gap-3 p-3 rounded-xl bg-emerald-50/50 dark:bg-emerald-950/20 border border-emerald-100 dark:border-emerald-900/30"> <span class="mt-0.5 inline-flex h-6 w-6 items-center justify-center rounded-full bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300 text-xs font-bold flex-shrink-0">3</span> <div class="flex-1"> <p class="text-surface-900 dark:text-white font-medium leading-relaxed">कहानी का शीर्षक 'शेर' है।</p> <p class="text-sm text-surface-500 dark:text-surface-400 italic mt-1">The title of the story is 'Lion'.</p> <p class="text-xs text-indigo-600 dark:text-indigo-400 mt-1 flex items-center gap-1"> <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg> Simple subject-verb sentence. </p> </div> </div> <div class="flex items-start gap-3 p-3 rounded-xl bg-emerald-50/50 dark:bg-emerald-950/20 border border-emerald-100 dark:border-emerald-900/30"> <span class="mt-0.5 inline-flex h-6 w-6 items-center justify-center rounded-full bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300 text-xs font-bold flex-shrink-0">4</span> <div class="flex-1"> <p class="text-surface-900 dark:text-white font-medium leading-relaxed">मुझे यह शीर्षक पसंद है।</p> <p class="text-sm text-surface-500 dark:text-surface-400 italic mt-1">I like this title.</p> <p class="text-xs text-indigo-600 dark:text-indigo-400 mt-1 flex items-center gap-1"> <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg> Uses 'मुझे... पसंद है' structure. </p> </div> </div> <div class="flex items-start gap-3 p-3 rounded-xl bg-emerald-50/50 dark:bg-emerald-950/20 border border-emerald-100 dark:border-emerald-900/30"> <span class="mt-0.5 inline-flex h-6 w-6 items-center justify-center rounded-full bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300 text-xs font-bold flex-shrink-0">5</span> <div class="flex-1"> <p class="text-surface-900 dark:text-white font-medium leading-relaxed">कविता का शीर्षक पढ़ो।</p> <p class="text-sm text-surface-500 dark:text-surface-400 italic mt-1">Read the title of the poem.</p> <p class="text-xs text-indigo-600 dark:text-indigo-400 mt-1 flex items-center gap-1"> <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg> Imperative form 'पढ़ो'. </p> </div> </div> <div class="flex items-start gap-3 p-3 rounded-xl bg-emerald-50/50 dark:bg-emerald-950/20 border border-emerald-100 dark:border-emerald-900/30"> <span class="mt-0.5 inline-flex h-6 w-6 items-center justify-center rounded-full bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300 text-xs font-bold flex-shrink-0">6</span> <div class="flex-1"> <p class="text-surface-900 dark:text-white font-medium leading-relaxed">शीर्षक बहुत बड़ा है।</p> <p class="text-sm text-surface-500 dark:text-surface-400 italic mt-1">The title is very big.</p> <p class="text-xs text-indigo-600 dark:text-indigo-400 mt-1 flex items-center gap-1"> <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg> Adjective 'बड़ा' (big). </p> </div> </div> <div class="flex items-start gap-3 p-3 rounded-xl bg-emerald-50/50 dark:bg-emerald-950/20 border border-emerald-100 dark:border-emerald-900/30"> <span class="mt-0.5 inline-flex h-6 w-6 items-center justify-center rounded-full bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300 text-xs font-bold flex-shrink-0">7</span> <div class="flex-1"> <p class="text-surface-900 dark:text-white font-medium leading-relaxed">नया शीर्षक लिखो।</p> <p class="text-sm text-surface-500 dark:text-surface-400 italic mt-1">Write a new title.</p> <p class="text-xs text-indigo-600 dark:text-indigo-400 mt-1 flex items-center gap-1"> <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg> Adjective 'नया' (new). </p> </div> </div> <div class="flex items-start gap-3 p-3 rounded-xl bg-emerald-50/50 dark:bg-emerald-950/20 border border-emerald-100 dark:border-emerald-900/30"> <span class="mt-0.5 inline-flex h-6 w-6 items-center justify-center rounded-full bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300 text-xs font-bold flex-shrink-0">8</span> <div class="flex-1"> <p class="text-surface-900 dark:text-white font-medium leading-relaxed">पाठ का शीर्षक देखो।</p> <p class="text-sm text-surface-500 dark:text-surface-400 italic mt-1">Look at the title of the lesson.</p> <p class="text-xs text-indigo-600 dark:text-indigo-400 mt-1 flex items-center gap-1"> <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg> Uses 'पाठ' (lesson). </p> </div> </div> </div> <div x-show="exLevel === 'A2'" x-transition class="space-y-3"> <div class="flex items-start gap-3 p-3 rounded-xl bg-emerald-50/50 dark:bg-emerald-950/20 border border-emerald-100 dark:border-emerald-900/30"> <span class="mt-0.5 inline-flex h-6 w-6 items-center justify-center rounded-full bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300 text-xs font-bold flex-shrink-0">1</span> <div class="flex-1"> <p class="text-surface-900 dark:text-white font-medium leading-relaxed">इस फिल्म का शीर्षक बहुत दिलचस्प है।</p> <p class="text-sm text-surface-500 dark:text-surface-400 italic mt-1">The title of this film is very interesting.</p> <p class="text-xs text-indigo-600 dark:text-indigo-400 mt-1 flex items-center gap-1"> <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg> Uses 'दिलचस्प' (interesting). </p> </div> </div> <div class="flex items-start gap-3 p-3 rounded-xl bg-emerald-50/50 dark:bg-emerald-950/20 border border-emerald-100 dark:border-emerald-900/30"> <span class="mt-0.5 inline-flex h-6 w-6 items-center justify-center rounded-full bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300 text-xs font-bold flex-shrink-0">2</span> <div class="flex-1"> <p class="text-surface-900 dark:text-white font-medium leading-relaxed">क्या आप मुझे इस लेख का शीर्षक बता सकते हैं?</p> <p class="text-sm text-surface-500 dark:text-surface-400 italic mt-1">Can you tell me the title of this article?</p> <p class="text-xs text-indigo-600 dark:text-indigo-400 mt-1 flex items-center gap-1"> <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg> Polite request using 'क्या आप... सकते हैं'. </p> </div> </div> <div class="flex items-start gap-3 p-3 rounded-xl bg-emerald-50/50 dark:bg-emerald-950/20 border border-emerald-100 dark:border-emerald-900/30"> <span class="mt-0.5 inline-flex h-6 w-6 items-center justify-center rounded-full bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300 text-xs font-bold flex-shrink-0">3</span> <div class="flex-1"> <p class="text-surface-900 dark:text-white font-medium leading-relaxed">शिक्षक ने बोर्ड पर नया शीर्षक लिखा।</p> <p class="text-sm text-surface-500 dark:text-surface-400 italic mt-1">The teacher wrote the new title on the board.</p> <p class="text-xs text-indigo-600 dark:text-indigo-400 mt-1 flex items-center gap-1"> <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg> Past tense with 'ने' (ergative marker). </p> </div> </div> <div class="flex items-start gap-3 p-3 rounded-xl bg-emerald-50/50 dark:bg-emerald-950/20 border border-emerald-100 dark:border-emerald-900/30"> <span class="mt-0.5 inline-flex h-6 w-6 items-center justify-center rounded-full bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300 text-xs font-bold flex-shrink-0">4</span> <div class="flex-1"> <p class="text-surface-900 dark:text-white font-medium leading-relaxed">मुझे अपनी कहानी के लिए एक शीर्षक चाहिए।</p> <p class="text-sm text-surface-500 dark:text-surface-400 italic mt-1">I need a title for my story.</p> <p class="text-xs text-indigo-600 dark:text-indigo-400 mt-1 flex items-center gap-1"> <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg> Uses 'चाहिए' (need/want). </p> </div> </div> <div class="flex items-start gap-3 p-3 rounded-xl bg-emerald-50/50 dark:bg-emerald-950/20 border border-emerald-100 dark:border-emerald-900/30"> <span class="mt-0.5 inline-flex h-6 w-6 items-center justify-center rounded-full bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300 text-xs font-bold flex-shrink-0">5</span> <div class="flex-1"> <p class="text-surface-900 dark:text-white font-medium leading-relaxed">इस गद्यांश का उचित शीर्षक क्या होगा?</p> <p class="text-sm text-surface-500 dark:text-surface-400 italic mt-1">What would be the proper title for this passage?</p> <p class="text-xs text-indigo-600 dark:text-indigo-400 mt-1 flex items-center gap-1"> <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg> Future tense 'होगा'. </p> </div> </div> <div class="flex items-start gap-3 p-3 rounded-xl bg-emerald-50/50 dark:bg-emerald-950/20 border border-emerald-100 dark:border-emerald-900/30"> <span class="mt-0.5 inline-flex h-6 w-6 items-center justify-center rounded-full bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300 text-xs font-bold flex-shrink-0">6</span> <div class="flex-1"> <p class="text-surface-900 dark:text-white font-medium leading-relaxed">उसने अपनी किताब का शीर्षक बदल दिया।</p> <p class="text-sm text-surface-500 dark:text-surface-400 italic mt-1">He changed the title of his book.</p> <p class="text-xs text-indigo-600 dark:text-indigo-400 mt-1 flex items-center gap-1"> <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg> Compound verb 'बदल दिया'. </p> </div> </div> <div class="flex items-start gap-3 p-3 rounded-xl bg-emerald-50/50 dark:bg-emerald-950/20 border border-emerald-100 dark:border-emerald-900/30"> <span class="mt-0.5 inline-flex h-6 w-6 items-center justify-center rounded-full bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300 text-xs font-bold flex-shrink-0">7</span> <div class="flex-1"> <p class="text-surface-900 dark:text-white font-medium leading-relaxed">समाचार पत्र का शीर्षक लाल रंग में है।</p> <p class="text-sm text-surface-500 dark:text-surface-400 italic mt-1">The heading of the newspaper is in red color.</p> <p class="text-xs text-indigo-600 dark:text-indigo-400 mt-1 flex items-center gap-1"> <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg> Prepositional phrase 'लाल रंग में'. </p> </div> </div> <div class="flex items-start gap-3 p-3 rounded-xl bg-emerald-50/50 dark:bg-emerald-950/20 border border-emerald-100 dark:border-emerald-900/30"> <span class="mt-0.5 inline-flex h-6 w-6 items-center justify-center rounded-full bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300 text-xs font-bold flex-shrink-0">8</span> <div class="flex-1"> <p class="text-surface-900 dark:text-white font-medium leading-relaxed">यह शीर्षक कहानी से मेल नहीं खाता।</p> <p class="text-sm text-surface-500 dark:text-surface-400 italic mt-1">This title does not match the story.</p> <p class="text-xs text-indigo-600 dark:text-indigo-400 mt-1 flex items-center gap-1"> <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg> Idiom 'मेल खाना' (to match). </p> </div> </div> </div> <div x-show="exLevel === 'B1'" x-transition class="space-y-3"> <div class="flex items-start gap-3 p-3 rounded-xl bg-emerald-50/50 dark:bg-emerald-950/20 border border-emerald-100 dark:border-emerald-900/30"> <span class="mt-0.5 inline-flex h-6 w-6 items-center justify-center rounded-full bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300 text-xs font-bold flex-shrink-0">1</span> <div class="flex-1"> <p class="text-surface-900 dark:text-white font-medium leading-relaxed">निबंध लिखते समय, मुख्य शीर्षक और उपशीर्षक का प्रयोग करें।</p> <p class="text-sm text-surface-500 dark:text-surface-400 italic mt-1">While writing an essay, use a main heading and subheadings.</p> <p class="text-xs text-indigo-600 dark:text-indigo-400 mt-1 flex items-center gap-1"> <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg> Introduces 'उपशीर्षक' (subheading). </p> </div> </div> <div class="flex items-start gap-3 p-3 rounded-xl bg-emerald-50/50 dark:bg-emerald-950/20 border border-emerald-100 dark:border-emerald-900/30"> <span class="mt-0.5 inline-flex h-6 w-6 items-center justify-center rounded-full bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300 text-xs font-bold flex-shrink-0">2</span> <div class="flex-1"> <p class="text-surface-900 dark:text-white font-medium leading-relaxed">यूट्यूब वीडियो का शीर्षक आकर्षक होना चाहिए ताकि लोग क्लिक करें।</p> <p class="text-sm text-surface-500 dark:text-surface-400 italic mt-1">The title of the YouTube video should be catchy so that people click.</p> <p class="text-xs text-indigo-600 dark:text-indigo-400 mt-1 flex items-center gap-1"> <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg> Complex sentence with 'ताकि' (so that). </p> </div> </div> <div class="flex items-start gap-3 p-3 rounded-xl bg-emerald-50/50 dark:bg-emerald-950/20 border border-emerald-100 dark:border-emerald-900/30"> <span class="mt-0.5 inline-flex h-6 w-6 items-center justify-center rounded-full bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300 text-xs font-bold flex-shrink-0">3</span> <div class="flex-1"> <p class="text-surface-900 dark:text-white font-medium leading-relaxed">लेखक ने अपनी आत्मकथा को एक बहुत ही भावुक शीर्षक दिया है।</p> <p class="text-sm text-surface-500 dark:text-surface-400 italic mt-1">The author has given a very emotional title to his autobiography.</p> <p class="text-xs text-indigo-600 dark:text-indigo-400 mt-1 flex items-center gap-1"> <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg> Present perfect tense. </p> </div> </div> <div class="flex items-start gap-3 p-3 rounded-xl bg-emerald-50/50 dark:bg-emerald-950/20 border border-emerald-100 dark:border-emerald-900/30"> <span class="mt-0.5 inline-flex h-6 w-6 items-center justify-center rounded-full bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300 text-xs font-bold flex-shrink-0">4</span> <div class="flex-1"> <p class="text-surface-900 dark:text-white font-medium leading-relaxed">अक्सर समाचारों के शीर्षक भ्रामक होते हैं।</p> <p class="text-sm text-surface-500 dark:text-surface-400 italic mt-1">Often, news headings are misleading.</p> <p class="text-xs text-indigo-600 dark:text-indigo-400 mt-1 flex items-center gap-1"> <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg> Uses 'भ्रामक' (misleading). </p> </div> </div> <div class="flex items-start gap-3 p-3 rounded-xl bg-emerald-50/50 dark:bg-emerald-950/20 border border-emerald-100 dark:border-emerald-900/30"> <span class="mt-0.5 inline-flex h-6 w-6 items-center justify-center rounded-full bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300 text-xs font-bold flex-shrink-0">5</span> <div class="flex-1"> <p class="text-surface-900 dark:text-white font-medium leading-relaxed">इस परियोजना का शीर्षक अभी तक तय नहीं हुआ है।</p> <p class="text-sm text-surface-500 dark:text-surface-400 italic mt-1">The title of this project has not been decided yet.</p> <p class="text-xs text-indigo-600 dark:text-indigo-400 mt-1 flex items-center gap-1"> <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg> Passive voice construction. </p> </div> </div> <div class="flex items-start gap-3 p-3 rounded-xl bg-emerald-50/50 dark:bg-emerald-950/20 border border-emerald-100 dark:border-emerald-900/30"> <span class="mt-0.5 inline-flex h-6 w-6 items-center justify-center rounded-full bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300 text-xs font-bold flex-shrink-0">6</span> <div class="flex-1"> <p class="text-surface-900 dark:text-white font-medium leading-relaxed">कृपया ईमेल भेजते समय विषय पंक्ति में सही शीर्षक लिखें।</p> <p class="text-sm text-surface-500 dark:text-surface-400 italic mt-1">Please write the correct title in the subject line when sending an email.</p> <p class="text-xs text-indigo-600 dark:text-indigo-400 mt-1 flex items-center gap-1"> <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg> Contextual use for emails. </p> </div> </div> <div class="flex items-start gap-3 p-3 rounded-xl bg-emerald-50/50 dark:bg-emerald-950/20 border border-emerald-100 dark:border-emerald-900/30"> <span class="mt-0.5 inline-flex h-6 w-6 items-center justify-center rounded-full bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300 text-xs font-bold flex-shrink-0">7</span> <div class="flex-1"> <p class="text-surface-900 dark:text-white font-medium leading-relaxed">कविता का शीर्षक इसके गहरे अर्थ को छुपाता है।</p> <p class="text-sm text-surface-500 dark:text-surface-400 italic mt-1">The title of the poem hides its deep meaning.</p> <p class="text-xs text-indigo-600 dark:text-indigo-400 mt-1 flex items-center gap-1"> <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg> Abstract concept expression. </p> </div> </div> <div class="flex items-start gap-3 p-3 rounded-xl bg-emerald-50/50 dark:bg-emerald-950/20 border border-emerald-100 dark:border-emerald-900/30"> <span class="mt-0.5 inline-flex h-6 w-6 items-center justify-center rounded-full bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300 text-xs font-bold flex-shrink-0">8</span> <div class="flex-1"> <p class="text-surface-900 dark:text-white font-medium leading-relaxed">रिपोर्ट को अलग-अलग शीर्षकों के अंतर्गत विभाजित किया गया है।</p> <p class="text-sm text-surface-500 dark:text-surface-400 italic mt-1">The report has been divided under different headings.</p> <p class="text-xs text-indigo-600 dark:text-indigo-400 mt-1 flex items-center gap-1"> <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg> Uses 'के अंतर्गत' (under). </p> </div> </div> </div> <div x-show="exLevel === 'B2'" x-transition class="space-y-3"> <div class="flex items-start gap-3 p-3 rounded-xl bg-emerald-50/50 dark:bg-emerald-950/20 border border-emerald-100 dark:border-emerald-900/30"> <span class="mt-0.5 inline-flex h-6 w-6 items-center justify-center rounded-full bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300 text-xs font-bold flex-shrink-0">1</span> <div class="flex-1"> <p class="text-surface-900 dark:text-white font-medium leading-relaxed">आधुनिक पत्रकारिता में सनसनीखेज शीर्षकों का चलन बहुत बढ़ गया है।</p> <p class="text-sm text-surface-500 dark:text-surface-400 italic mt-1">The trend of sensational titles has increased a lot in modern journalism.</p> <p class="text-xs text-indigo-600 dark:text-indigo-400 mt-1 flex items-center gap-1"> <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg> Advanced vocabulary 'सनसनीखेज' (sensational). </p> </div> </div> <div class="flex items-start gap-3 p-3 rounded-xl bg-emerald-50/50 dark:bg-emerald-950/20 border border-emerald-100 dark:border-emerald-900/30"> <span class="mt-0.5 inline-flex h-6 w-6 items-center justify-center rounded-full bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300 text-xs font-bold flex-shrink-0">2</span> <div class="flex-1"> <p class="text-surface-900 dark:text-white font-medium leading-relaxed">शोध पत्र का शीर्षक संक्षिप्त और शोध के उद्देश्य को स्पष्ट करने वाला होना चाहिए।</p> <p class="text-sm text-surface-500 dark:text-surface-400 italic mt-1">The title of the research paper should be concise and clarify the objective of the research.</p> <p class="text-xs text-indigo-600 dark:text-indigo-400 mt-1 flex items-center gap-1"> <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg> Academic register. </p> </div> </div> <div class="flex items-start gap-3 p-3 rounded-xl bg-emerald-50/50 dark:bg-emerald-950/20 border border-emerald-100 dark:border-emerald-900/30"> <span class="mt-0.5 inline-flex h-6 w-6 items-center justify-center rounded-full bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300 text-xs font-bold flex-shrink-0">3</span> <div class="flex-1"> <p class="text-surface-900 dark:text-white font-medium leading-relaxed">अनुवादक को यह सुनिश्चित करना होता है कि अनूदित शीर्षक मूल कृति की भावना को बनाए रखे।</p> <p class="text-sm text-surface-500 dark:text-surface-400 italic mt-1">The translator has to ensure that the translated title maintains the spirit of the original work.</p> <p class="text-xs text-indigo-600 dark:text-indigo-400 mt-1 flex items-center gap-1"> <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg> Complex sentence with dependent clause. </p> </div> </div> <div class="flex items-start gap-3 p-3 rounded-xl bg-emerald-50/50 dark:bg-emerald-950/20 border border-emerald-100 dark:border-emerald-900/30"> <span class="mt-0.5 inline-flex h-6 w-6 items-center justify-center rounded-full bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300 text-xs font-bold flex-shrink-0">4</span> <div class="flex-1"> <p class="text-surface-900 dark:text-white font-medium leading-relaxed">कानूनी दस्तावेजों में प्रत्येक खंड का एक विशिष्ट शीर्षक होता है जो उसकी सामग्री को परिभाषित करता है।</p> <p class="text-sm text-surface-500 dark:text-surface-400 italic mt-1">In legal documents, each section has a specific heading that defines its content.</p> <p class="text-xs text-indigo-600 dark:text-indigo-400 mt-1 flex items-center gap-1"> <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg> Legal register. </p> </div> </div> <div class="flex items-start gap-3 p-3 rounded-xl bg-emerald-50/50 dark:bg-emerald-950/20 border border-emerald-100 dark:border-emerald-900/30"> <span class="mt-0.5 inline-flex h-6 w-6 items-center justify-center rounded-full bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300 text-xs font-bold flex-shrink-0">5</span> <div class="flex-1"> <p class="text-surface-900 dark:text-white font-medium leading-relaxed">विपणन टीम ने अभियान के लिए एक ऐसा शीर्षक चुना जो तुरंत ध्यान आकर्षित करता है।</p> <p class="text-sm text-surface-500 dark:text-surface-400 italic mt-1">The marketing team chose a title for the campaign that immediately attracts attention.</p> <p class="text-xs text-indigo-600 dark:text-indigo-400 mt-1 flex items-center gap-1"> <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg> Relative clause 'जो तुरंत...'. </p> </div> </div> <div class="flex items-start gap-3 p-3 rounded-xl bg-emerald-50/50 dark:bg-emerald-950/20 border border-emerald-100 dark:border-emerald-900/30"> <span class="mt-0.5 inline-flex h-6 w-6 items-center justify-center rounded-full bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300 text-xs font-bold flex-shrink-0">6</span> <div class="flex-1"> <p class="text-surface-900 dark:text-white font-medium leading-relaxed">समीक्षक ने टिप्पणी की कि फिल्म का शीर्षक उसकी कहानी के साथ न्याय नहीं करता।</p> <p class="text-sm text-surface-500 dark:text-surface-400 italic mt-1">The reviewer commented that the film's title does not do justice to its story.</p> <p class="text-xs text-indigo-600 dark:text-indigo-400 mt-1 flex items-center gap-1"> <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg> Idiom 'न्याय करना' (to do justice). </p> </div> </div> <div class="flex items-start gap-3 p-3 rounded-xl bg-emerald-50/50 dark:bg-emerald-950/20 border border-emerald-100 dark:border-emerald-900/30"> <span class="mt-0.5 inline-flex h-6 w-6 items-center justify-center rounded-full bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300 text-xs font-bold flex-shrink-0">7</span> <div class="flex-1"> <p class="text-surface-900 dark:text-white font-medium leading-relaxed">वेबसाइट के एसईओ (SEO) के लिए पृष्ठ का शीर्षक अनुकूलित करना अत्यंत महत्वपूर्ण है।</p> <p class="text-sm text-surface-500 dark:text-surface-400 italic mt-1">Optimizing the page title is extremely important for the website's SEO.</p> <p class="text-xs text-indigo-600 dark:text-indigo-400 mt-1 flex items-center gap-1"> <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg> Technical/Digital context. </p> </div> </div> <div class="flex items-start gap-3 p-3 rounded-xl bg-emerald-50/50 dark:bg-emerald-950/20 border border-emerald-100 dark:border-emerald-900/30"> <span class="mt-0.5 inline-flex h-6 w-6 items-center justify-center rounded-full bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300 text-xs font-bold flex-shrink-0">8</span> <div class="flex-1"> <p class="text-surface-900 dark:text-white font-medium leading-relaxed">प्रस्तुति के दौरान, उन्होंने प्रत्येक स्लाइड के शीर्षक को विस्तार से समझाया।</p> <p class="text-sm text-surface-500 dark:text-surface-400 italic mt-1">During the presentation, he explained the title of each slide in detail.</p> <p class="text-xs text-indigo-600 dark:text-indigo-400 mt-1 flex items-center gap-1"> <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg> Formal business context. </p> </div> </div> </div> <div x-show="exLevel === 'C1'" x-transition class="space-y-3"> <div class="flex items-start gap-3 p-3 rounded-xl bg-emerald-50/50 dark:bg-emerald-950/20 border border-emerald-100 dark:border-emerald-900/30"> <span class="mt-0.5 inline-flex h-6 w-6 items-center justify-center rounded-full bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300 text-xs font-bold flex-shrink-0">1</span> <div class="flex-1"> <p class="text-surface-900 dark:text-white font-medium leading-relaxed">साहित्यिक आलोचना में, किसी कृति के शीर्षक की सार्थकता का विश्लेषण एक महत्वपूर्ण आयाम है।</p> <p class="text-sm text-surface-500 dark:text-surface-400 italic mt-1">In literary criticism, analyzing the significance of a work's title is an important dimension.</p> <p class="text-xs text-indigo-600 dark:text-indigo-400 mt-1 flex items-center gap-1"> <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg> High literary register. </p> </div> </div> <div class="flex items-start gap-3 p-3 rounded-xl bg-emerald-50/50 dark:bg-emerald-950/20 border border-emerald-100 dark:border-emerald-900/30"> <span class="mt-0.5 inline-flex h-6 w-6 items-center justify-center rounded-full bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300 text-xs font-bold flex-shrink-0">2</span> <div class="flex-1"> <p class="text-surface-900 dark:text-white font-medium leading-relaxed">डिजिटल मीडिया के युग में, 'क्लिकबेट' शीर्षकों ने सूचना की विश्वसनीयता पर गंभीर प्रश्नचिह्न लगा दिए हैं।</p> <p class="text-sm text-surface-500 dark:text-surface-400 italic mt-1">In the era of digital media, 'clickbait' titles have put a serious question mark on the reliability of information.</p> <p class="text-xs text-indigo-600 dark:text-indigo-400 mt-1 flex items-center gap-1"> <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg> Societal critique vocabulary. </p> </div> </div> <div class="flex items-start gap-3 p-3 rounded-xl bg-emerald-50/50 dark:bg-emerald-950/20 border border-emerald-100 dark:border-emerald-900/30"> <span class="mt-0.5 inline-flex h-6 w-6 items-center justify-center rounded-full bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300 text-xs font-bold flex-shrink-0">3</span> <div class="flex-1"> <p class="text-surface-900 dark:text-white font-medium leading-relaxed">विधेयक के विभिन्न अनुच्छेदों को उनके संबंधित शीर्षकों के अधीन वर्गीकृत किया गया है ताकि विधिक स्पष्टता बनी रहे।</p> <p class="text-sm text-surface-500 dark:text-surface-400 italic mt-1">The various articles of the bill have been categorized under their respective headings so that legal clarity is maintained.</p> <p class="text-xs text-indigo-600 dark:text-indigo-400 mt-1 flex items-center gap-1"> <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg> Highly formal legal syntax. </p> </div> </div> <div class="flex items-start gap-3 p-3 rounded-xl bg-emerald-50/50 dark:bg-emerald-950/20 border border-emerald-100 dark:border-emerald-900/30"> <span class="mt-0.5 inline-flex h-6 w-6 items-center justify-center rounded-full bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300 text-xs font-bold flex-shrink-0">4</span> <div class="flex-1"> <p class="text-surface-900 dark:text-white font-medium leading-relaxed">उपन्यास का विरोधाभासी शीर्षक पाठकों को मानवीय स्वभाव की जटिलताओं पर विचार करने के लिए विवश करता है।</p> <p class="text-sm text-surface-500 dark:text-surface-400 italic mt-1">The paradoxical title of the novel compels readers to ponder the complexities of human nature.</p> <p class="text-xs text-indigo-600 dark:text-indigo-400 mt-1 flex items-center gap-1"> <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg> Abstract analytical language. </p> </div> </div> <div class="flex items-start gap-3 p-3 rounded-xl bg-emerald-50/50 dark:bg-emerald-950/20 border border-emerald-100 dark:border-emerald-900/30"> <span class="mt-0.5 inline-flex h-6 w-6 items-center justify-center rounded-full bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300 text-xs font-bold flex-shrink-0">5</span> <div class="flex-1"> <p class="text-surface-900 dark:text-white font-medium leading-relaxed">संपादकीय लेख का शीर्षक इतना तीखा था कि उसने रातों-रात एक राष्ट्रीय बहस छेड़ दी।</p> <p class="text-sm text-surface-500 dark:text-surface-400 italic mt-1">The title of the editorial was so sharp that it sparked a national debate overnight.</p> <p class="text-xs text-indigo-600 dark:text-indigo-400 mt-1 flex items-center gap-1"> <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg> Cause and effect structure 'इतना... कि'. </p> </div> </div> <div class="flex items-start gap-3 p-3 rounded-xl bg-emerald-50/50 dark:bg-emerald-950/20 border border-emerald-100 dark:border-emerald-900/30"> <span class="mt-0.5 inline-flex h-6 w-6 items-center justify-center rounded-full bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300 text-xs font-bold flex-shrink-0">6</span> <div class="flex-1"> <p class="text-surface-900 dark:text-white font-medium leading-relaxed">संगोष्ठी का मुख्य शीर्षक 'सतत विकास' था, जिसके अंतर्गत कई प्रासंगिक उप-विषयों पर चर्चा हुई।</p> <p class="text-sm text-surface-500 dark:text-surface-400 italic mt-1">The main title of the symposium was 'Sustainable Development', under which many relevant sub-topics were discussed.</p> <p class="text-xs text-indigo-600 dark:text-indigo-400 mt-1 flex items-center gap-1"> <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg> Academic event context. </p> </div> </div> <div class="flex items-start gap-3 p-3 rounded-xl bg-emerald-50/50 dark:bg-emerald-950/20 border border-emerald-100 dark:border-emerald-900/30"> <span class="mt-0.5 inline-flex h-6 w-6 items-center justify-center rounded-full bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300 text-xs font-bold flex-shrink-0">7</span> <div class="flex-1"> <p class="text-surface-900 dark:text-white font-medium leading-relaxed">कवि ने जानबूझकर एक अस्पष्ट शीर्षक का चयन किया ताकि पाठक अपनी स्वयं की व्याख्या कर सकें।</p> <p class="text-sm text-surface-500 dark:text-surface-400 italic mt-1">The poet deliberately chose an ambiguous title so that readers could make their own interpretations.</p> <p class="text-xs text-indigo-600 dark:text-indigo-400 mt-1 flex items-center gap-1"> <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg> Expressing intention 'जानबूझकर'. </p> </div> </div> <div class="flex items-start gap-3 p-3 rounded-xl bg-emerald-50/50 dark:bg-emerald-950/20 border border-emerald-100 dark:border-emerald-900/30"> <span class="mt-0.5 inline-flex h-6 w-6 items-center justify-center rounded-full bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300 text-xs font-bold flex-shrink-0">8</span> <div class="flex-1"> <p class="text-surface-900 dark:text-white font-medium leading-relaxed">ऐतिहासिक दस्तावेजों के शीर्षकों का अध्ययन तत्कालीन समाज की प्राथमिकताओं को समझने में सहायक होता है।</p> <p class="text-sm text-surface-500 dark:text-surface-400 italic mt-1">Studying the titles of historical documents is helpful in understanding the priorities of the contemporary society.</p> <p class="text-xs text-indigo-600 dark:text-indigo-400 mt-1 flex items-center gap-1"> <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg> Historical analysis context. </p> </div> </div> </div> <div x-show="exLevel === 'C2'" x-transition class="space-y-3"> <div class="flex items-start gap-3 p-3 rounded-xl bg-emerald-50/50 dark:bg-emerald-950/20 border border-emerald-100 dark:border-emerald-900/30"> <span class="mt-0.5 inline-flex h-6 w-6 items-center justify-center rounded-full bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300 text-xs font-bold flex-shrink-0">1</span> <div class="flex-1"> <p class="text-surface-900 dark:text-white font-medium leading-relaxed">प्रस्तुत शोध-प्रबंध का शीर्षक यद्यपि प्रथम दृष्टया सामान्य प्रतीत होता है, तथापि इसके अंतर्गत निहित विमर्श अत्यंत गूढ़ है।</p> <p class="text-sm text-surface-500 dark:text-surface-400 italic mt-1">Although the title of the presented dissertation appears ordinary at first glance, the discourse contained within it is extremely profound.</p> <p class="text-xs text-indigo-600 dark:text-indigo-400 mt-1 flex items-center gap-1"> <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg> Complex concessive clause 'यद्यपि... तथापि'. </p> </div> </div> <div class="flex items-start gap-3 p-3 rounded-xl bg-emerald-50/50 dark:bg-emerald-950/20 border border-emerald-100 dark:border-emerald-900/30"> <span class="mt-0.5 inline-flex h-6 w-6 items-center justify-center rounded-full bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300 text-xs font-bold flex-shrink-0">2</span> <div class="flex-1"> <p class="text-surface-900 dark:text-white font-medium leading-relaxed">शास्त्रीय ग्रंथों में 'शीर्षक' मात्र एक नामकरण नहीं, अपितु संपूर्ण ग्रंथ के दार्शनिक सार का प्रतिनिधित्व करता है।</p> <p class="text-sm text-surface-500 dark:text-surface-400 italic mt-1">In classical texts, the 'title' is not merely a nomenclature, but represents the philosophical essence of the entire text.</p> <p class="text-xs text-indigo-600 dark:text-indigo-400 mt-1 flex items-center gap-1"> <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg> Philosophical and classical register. </p> </div> </div> <div class="flex items-start gap-3 p-3 rounded-xl bg-emerald-50/50 dark:bg-emerald-950/20 border border-emerald-100 dark:border-emerald-900/30"> <span class="mt-0.5 inline-flex h-6 w-6 items-center justify-center rounded-full bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300 text-xs font-bold flex-shrink-0">3</span> <div class="flex-1"> <p class="text-surface-900 dark:text-white font-medium leading-relaxed">समकालीन विमर्श में, हाशिए के वर्गों द्वारा अपने आख्यानों के लिए नए शीर्षकों का दावा करना सत्ता-संरचनाओं को चुनौती देने का एक रूप है।</p> <p class="text-sm text-surface-500 dark:text-surface-400 italic mt-1">In contemporary discourse, the claiming of new titles for their narratives by marginalized groups is a form of challenging power structures.</p> <p class="text-xs text-indigo-600 dark:text-indigo-400 mt-1 flex items-center gap-1"> <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg> Sociological and political analysis. </p> </div> </div> <div class="flex items-start gap-3 p-3 rounded-xl bg-emerald-50/50 dark:bg-emerald-950/20 border border-emerald-100 dark:border-emerald-900/30"> <span class="mt-0.5 inline-flex h-6 w-6 items-center justify-center rounded-full bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300 text-xs font-bold flex-shrink-0">4</span> <div class="flex-1"> <p class="text-surface-900 dark:text-white font-medium leading-relaxed">अनुवाद विज्ञान में यह सर्वमान्य है कि सांस्कृतिक रूप से विशिष्ट शीर्षकों का लक्ष्य भाषा में समतुल्य खोजना एक भगीरथ प्रयास है।</p> <p class="text-sm text-surface-500 dark:text-surface-400 italic mt-1">In translation studies, it is universally accepted that finding an equivalent for culturally specific titles in the target language is a Herculean task.</p> <p class="text-xs text-indigo-600 dark:text-indigo-400 mt-1 flex items-center gap-1"> <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg> Use of idiom 'भगीरथ प्रयास' (Herculean task). </p> </div> </div> <div class="flex items-start gap-3 p-3 rounded-xl bg-emerald-50/50 dark:bg-emerald-950/20 border border-emerald-100 dark:border-emerald-900/30"> <span class="mt-0.5 inline-flex h-6 w-6 items-center justify-center rounded-full bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300 text-xs font-bold flex-shrink-0">5</span> <div class="flex-1"> <p class="text-surface-900 dark:text-white font-medium leading-relaxed">संविधान के आमुख का शीर्षक ही अपने आप में राष्ट्र के लोकतांत्रिक और धर्मनिरपेक्ष मूल्यों की उद्घोषणा करता है।</p> <p class="text-sm text-surface-500 dark:text-surface-400 italic mt-1">The very title of the preamble of the constitution is in itself a proclamation of the democratic and secular values of the nation.</p> <p class="text-xs text-indigo-600 dark:text-indigo-400 mt-1 flex items-center gap-1"> <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg> Constitutional and legal rhetoric. </p> </div> </div> <div class="flex items-start gap-3 p-3 rounded-xl bg-emerald-50/50 dark:bg-emerald-950/20 border border-emerald-100 dark:border-emerald-900/30"> <span class="mt-0.5 inline-flex h-6 w-6 items-center justify-center rounded-full bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300 text-xs font-bold flex-shrink-0">6</span> <div class="flex-1"> <p class="text-surface-900 dark:text-white font-medium leading-relaxed">उत्तर-आधुनिक साहित्य में शीर्षकों का विखंडन पाठकों को अर्थ-निर्माण की प्रक्रिया में एक सक्रिय भागीदार बनने के लिए आमंत्रित करता है।</p> <p class="text-sm text-surface-500 dark:text-surface-400 italic mt-1">The deconstruction of titles in postmodern literature invites readers to become an active participant in the process of meaning-making.</p> <p class="text-xs text-indigo-600 dark:text-indigo-400 mt-1 flex items-center gap-1"> <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg> Literary theory vocabulary. </p> </div> </div> <div class="flex items-start gap-3 p-3 rounded-xl bg-emerald-50/50 dark:bg-emerald-950/20 border border-emerald-100 dark:border-emerald-900/30"> <span class="mt-0.5 inline-flex h-6 w-6 items-center justify-center rounded-full bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300 text-xs font-bold flex-shrink-0">7</span> <div class="flex-1"> <p class="text-surface-900 dark:text-white font-medium leading-relaxed">कॉर्पोरेट जगत की वार्षिक रिपोर्टों के शीर्षकों का सूक्ष्म विश्लेषण उनके अंतर्निहित जनसंपर्क एजेंडे को उजागर कर सकता है।</p> <p class="text-sm text-surface-500 dark:text-surface-400 italic mt-1">A microscopic analysis of the titles of corporate annual reports can expose their underlying public relations agenda.</p> <p class="text-xs text-indigo-600 dark:text-indigo-400 mt-1 flex items-center gap-1"> <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg> Corporate and critical analysis. </p> </div> </div> <div class="flex items-start gap-3 p-3 rounded-xl bg-emerald-50/50 dark:bg-emerald-950/20 border border-emerald-100 dark:border-emerald-900/30"> <span class="mt-0.5 inline-flex h-6 w-6 items-center justify-center rounded-full bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300 text-xs font-bold flex-shrink-0">8</span> <div class="flex-1"> <p class="text-surface-900 dark:text-white font-medium leading-relaxed">अभिलेखीय शोध से यह प्रमाणित होता है कि औपनिवेशिक काल में प्रशासनिक पत्राचार के शीर्षकों में शक्ति-संतुलन का स्पष्ट पदानुक्रम परिलक्षित होता था।</p> <p class="text-sm text-surface-500 dark:text-surface-400 italic mt-1">Archival research proves that in the colonial period, the clear hierarchy of power balance was reflected in the titles of administrative correspondence.</p> <p class="text-xs text-indigo-600 dark:text-indigo-400 mt-1 flex items-center gap-1"> <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg> Historiographical register. </p> </div> </div> </div> </div> <div class="bg-white dark:bg-dark-card border-2 border-surface-200 dark:border-[#3b3755] border-b-4 rounded-2xl p-6"> <h2 class="text-lg font-bold text-surface-900 dark:text-white flex items-center gap-2 mb-4"> <svg class="w-5 h-5 text-indigo-600 dark:text-indigo-400" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1"/></svg> Common Collocations </h2> <div class="grid gap-2 sm:grid-cols-2"> <div class="flex items-center justify-between gap-2 p-3 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50"> <span class="font-semibold text-surface-900 dark:text-white text-sm min-w-0 break-words">किताब का शीर्षक (Title of the book)</span> <span class="text-xs text-surface-500 dark:text-surface-400 italic flex-shrink-0 max-w-[40%] text-right"></span> </div> <div class="flex items-center justify-between gap-2 p-3 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50"> <span class="font-semibold text-surface-900 dark:text-white text-sm min-w-0 break-words">कहानी का शीर्षक (Title of the story)</span> <span class="text-xs text-surface-500 dark:text-surface-400 italic flex-shrink-0 max-w-[40%] text-right"></span> </div> <div class="flex items-center justify-between gap-2 p-3 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50"> <span class="font-semibold text-surface-900 dark:text-white text-sm min-w-0 break-words">मुख्य शीर्षक (Main heading)</span> <span class="text-xs text-surface-500 dark:text-surface-400 italic flex-shrink-0 max-w-[40%] text-right"></span> </div> <div class="flex items-center justify-between gap-2 p-3 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50"> <span class="font-semibold text-surface-900 dark:text-white text-sm min-w-0 break-words">उपयुक्त शीर्षक (Suitable title)</span> <span class="text-xs text-surface-500 dark:text-surface-400 italic flex-shrink-0 max-w-[40%] text-right"></span> </div> <div class="flex items-center justify-between gap-2 p-3 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50"> <span class="font-semibold text-surface-900 dark:text-white text-sm min-w-0 break-words">आकर्षक शीर्षक (Catchy title)</span> <span class="text-xs text-surface-500 dark:text-surface-400 italic flex-shrink-0 max-w-[40%] text-right"></span> </div> <div class="flex items-center justify-between gap-2 p-3 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50"> <span class="font-semibold text-surface-900 dark:text-white text-sm min-w-0 break-words">शीर्षक देना (To give a title)</span> <span class="text-xs text-surface-500 dark:text-surface-400 italic flex-shrink-0 max-w-[40%] text-right"></span> </div> <div class="flex items-center justify-between gap-2 p-3 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50"> <span class="font-semibold text-surface-900 dark:text-white text-sm min-w-0 break-words">शीर्षक पढ़ना (To read the title)</span> <span class="text-xs text-surface-500 dark:text-surface-400 italic flex-shrink-0 max-w-[40%] text-right"></span> </div> <div class="flex items-center justify-between gap-2 p-3 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50"> <span class="font-semibold text-surface-900 dark:text-white text-sm min-w-0 break-words">भ्रामक शीर्षक (Misleading title)</span> <span class="text-xs text-surface-500 dark:text-surface-400 italic flex-shrink-0 max-w-[40%] text-right"></span> </div> <div class="flex items-center justify-between gap-2 p-3 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50"> <span class="font-semibold text-surface-900 dark:text-white text-sm min-w-0 break-words">शीर्षक के अंतर्गत (Under the heading)</span> <span class="text-xs text-surface-500 dark:text-surface-400 italic flex-shrink-0 max-w-[40%] text-right"></span> </div> <div class="flex items-center justify-between gap-2 p-3 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50"> <span class="font-semibold text-surface-900 dark:text-white text-sm min-w-0 break-words">नया शीर्षक (New title)</span> <span class="text-xs text-surface-500 dark:text-surface-400 italic flex-shrink-0 max-w-[40%] text-right"></span> </div> </div> </div> <div class="bg-white dark:bg-dark-card border-2 border-surface-200 dark:border-[#3b3755] border-b-4 rounded-2xl p-6"> <h2 class="text-lg font-bold text-surface-900 dark:text-white flex items-center gap-2 mb-4"> <svg class="w-5 h-5 text-teal-600 dark:text-teal-400" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 10h.01M12 10h.01M16 10h.01M9 16H5a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v8a2 2 0 01-2 2h-5l-5 5v-5z"/></svg> Common Phrases </h2> <div class="space-y-2"> <div class="p-3 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50 border border-surface-100 dark:border-dark-surface-3"> <div class="flex items-start gap-2"> <span class="text-teal-500 dark:text-teal-400 mt-0.5 flex-shrink-0"> <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 8h10M7 12h4m1 8l-4-4H5a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v8a2 2 0 01-2 2h-3l-4 4z"/></svg> </span> <div class="flex-1 min-w-0"> <a href="https://sublearn.com/learn/hi/phrases/isa-gathayasha-ka-ucata-sharashhaka-tha-give-a-proper-title-to-this-passage" class="font-semibold text-sm text-violet-700 dark:text-violet-300 hover:underline">इस गद्यांश का उचित शीर्षक दें। (Give a proper title to this passage.)</a> </div> </div> </div> <div class="p-3 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50 border border-surface-100 dark:border-dark-surface-3"> <div class="flex items-start gap-2"> <span class="text-teal-500 dark:text-teal-400 mt-0.5 flex-shrink-0"> <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 8h10M7 12h4m1 8l-4-4H5a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v8a2 2 0 01-2 2h-3l-4 4z"/></svg> </span> <div class="flex-1 min-w-0"> <a href="https://sublearn.com/learn/hi/phrases/sharashhaka-kaya-ha-what-is-the-title" class="font-semibold text-sm text-violet-700 dark:text-violet-300 hover:underline">शीर्षक क्या है? (What is the title?)</a> </div> </div> </div> <div class="p-3 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50 border border-surface-100 dark:border-dark-surface-3"> <div class="flex items-start gap-2"> <span class="text-teal-500 dark:text-teal-400 mt-0.5 flex-shrink-0"> <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 8h10M7 12h4m1 8l-4-4H5a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v8a2 2 0 01-2 2h-3l-4 4z"/></svg> </span> <div class="flex-1 min-w-0"> <a href="https://sublearn.com/learn/hi/phrases/bna-sharashhaka-ka-without-a-titleuntitled" class="font-semibold text-sm text-violet-700 dark:text-violet-300 hover:underline">बिना शीर्षक के (Without a title/Untitled)</a> </div> </div> </div> <div class="p-3 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50 border border-surface-100 dark:border-dark-surface-3"> <div class="flex items-start gap-2"> <span class="text-teal-500 dark:text-teal-400 mt-0.5 flex-shrink-0"> <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 8h10M7 12h4m1 8l-4-4H5a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v8a2 2 0 01-2 2h-3l-4 4z"/></svg> </span> <div class="flex-1 min-w-0"> <a href="https://sublearn.com/learn/hi/phrases/sharashhaka-sa-pata-calta-ha-the-title-suggests" class="font-semibold text-sm text-violet-700 dark:text-violet-300 hover:underline">शीर्षक से पता चलता है... (The title suggests...)</a> </div> </div> </div> <div class="p-3 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50 border border-surface-100 dark:border-dark-surface-3"> <div class="flex items-start gap-2"> <span class="text-teal-500 dark:text-teal-400 mt-0.5 flex-shrink-0"> <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 8h10M7 12h4m1 8l-4-4H5a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v8a2 2 0 01-2 2h-3l-4 4z"/></svg> </span> <div class="flex-1 min-w-0"> <a href="https://sublearn.com/learn/hi/phrases/sharashhaka-ka-anasara-according-to-the-title" class="font-semibold text-sm text-violet-700 dark:text-violet-300 hover:underline">शीर्षक के अनुसार (According to the title)</a> </div> </div> </div> <div class="p-3 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50 border border-surface-100 dark:border-dark-surface-3"> <div class="flex items-start gap-2"> <span class="text-teal-500 dark:text-teal-400 mt-0.5 flex-shrink-0"> <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 8h10M7 12h4m1 8l-4-4H5a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v8a2 2 0 01-2 2h-3l-4 4z"/></svg> </span> <div class="flex-1 min-w-0"> <a href="https://sublearn.com/learn/hi/phrases/eka-acachha-sharashhaka-saca-think-of-a-good-title" class="font-semibold text-sm text-violet-700 dark:text-violet-300 hover:underline">एक अच्छा शीर्षक सोचो। (Think of a good title.)</a> </div> </div> </div> <div class="p-3 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50 border border-surface-100 dark:border-dark-surface-3"> <div class="flex items-start gap-2"> <span class="text-teal-500 dark:text-teal-400 mt-0.5 flex-shrink-0"> <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 8h10M7 12h4m1 8l-4-4H5a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v8a2 2 0 01-2 2h-3l-4 4z"/></svg> </span> <div class="flex-1 min-w-0"> <a href="https://sublearn.com/learn/hi/phrases/sharashhaka-oura-upasharashhaka-heading-and-subheading" class="font-semibold text-sm text-violet-700 dark:text-violet-300 hover:underline">शीर्षक और उपशीर्षक (Heading and subheading)</a> </div> </div> </div> <div class="p-3 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50 border border-surface-100 dark:border-dark-surface-3"> <div class="flex items-start gap-2"> <span class="text-teal-500 dark:text-teal-400 mt-0.5 flex-shrink-0"> <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 8h10M7 12h4m1 8l-4-4H5a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v8a2 2 0 01-2 2h-3l-4 4z"/></svg> </span> <div class="flex-1 min-w-0"> <a href="https://sublearn.com/learn/hi/phrases/sharashhaka-ma-bthalva-change-in-the-title" class="font-semibold text-sm text-violet-700 dark:text-violet-300 hover:underline">शीर्षक में बदलाव (Change in the title)</a> </div> </div> </div> <div class="p-3 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50 border border-surface-100 dark:border-dark-surface-3"> <div class="flex items-start gap-2"> <span class="text-teal-500 dark:text-teal-400 mt-0.5 flex-shrink-0"> <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 8h10M7 12h4m1 8l-4-4H5a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v8a2 2 0 01-2 2h-3l-4 4z"/></svg> </span> <div class="flex-1 min-w-0"> <a href="https://sublearn.com/learn/hi/phrases/sharashhaka-gata-title-tracksong" class="font-semibold text-sm text-violet-700 dark:text-violet-300 hover:underline">शीर्षक गीत (Title track/song)</a> </div> </div> </div> <div class="p-3 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50 border border-surface-100 dark:border-dark-surface-3"> <div class="flex items-start gap-2"> <span class="text-teal-500 dark:text-teal-400 mt-0.5 flex-shrink-0"> <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 8h10M7 12h4m1 8l-4-4H5a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v8a2 2 0 01-2 2h-3l-4 4z"/></svg> </span> <div class="flex-1 min-w-0"> <a href="https://sublearn.com/learn/hi/phrases/sharashhaka-bhamaka-title-role" class="font-semibold text-sm text-violet-700 dark:text-violet-300 hover:underline">शीर्षक भूमिका (Title role)</a> </div> </div> </div> </div> </div> <div class="bg-white dark:bg-dark-card border-2 border-surface-200 dark:border-[#3b3755] border-b-4 rounded-2xl p-6"> <h2 class="text-lg font-bold text-surface-900 dark:text-white flex items-center gap-2 mb-4"> <svg class="w-5 h-5 text-amber-600 dark:text-amber-400" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L4.082 16.5c-.77.833.192 2.5 1.732 2.5z"/></svg> Often Confused With </h2> <div class="space-y-3"> <div class="rounded-xl border-2 border-amber-200 dark:border-amber-800 bg-amber-50 dark:bg-amber-900/20 p-4"> <div class="flex items-center gap-2 mb-2"> <span class="font-bold text-surface-900 dark:text-white">शीर्षक</span> <span class="text-surface-400">vs</span> <span class="font-bold text-amber-700 dark:text-amber-300">नाम (Name) - Used for people and general identification.</span> </div> <p class="text-sm text-surface-600 dark:text-surface-300"></p> </div> <div class="rounded-xl border-2 border-amber-200 dark:border-amber-800 bg-amber-50 dark:bg-amber-900/20 p-4"> <div class="flex items-center gap-2 mb-2"> <span class="font-bold text-surface-900 dark:text-white">शीर्षक</span> <span class="text-surface-400">vs</span> <span class="font-bold text-amber-700 dark:text-amber-300">विषय (Subject) - The topic being discussed, not the specific heading.</span> </div> <p class="text-sm text-surface-600 dark:text-surface-300"></p> </div> <div class="rounded-xl border-2 border-amber-200 dark:border-amber-800 bg-amber-50 dark:bg-amber-900/20 p-4"> <div class="flex items-center gap-2 mb-2"> <span class="font-bold text-surface-900 dark:text-white">शीर्षक</span> <span class="text-surface-400">vs</span> <span class="font-bold text-amber-700 dark:text-amber-300">उपाधि (Title/Degree) - A professional or honorific title given to a person.</span> </div> <p class="text-sm text-surface-600 dark:text-surface-300"></p> </div> </div> </div> <div class="bg-white dark:bg-dark-card border-2 border-surface-200 dark:border-[#3b3755] border-b-4 rounded-2xl p-6"> <h2 class="text-lg font-bold text-surface-900 dark:text-white flex items-center gap-2 mb-4"> <svg class="w-5 h-5 text-teal-600 dark:text-teal-400" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 10h.01M12 10h.01M16 10h.01M9 16H5a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v8a2 2 0 01-2 2h-5l-5 5v-5z"/></svg> Idioms & Expressions </h2> <div class="space-y-3"> <div class="p-3 rounded-xl bg-teal-50/50 dark:bg-teal-950/20 border border-teal-100 dark:border-teal-900/30"> <a href="https://sublearn.com/learn/hi/phrases/sharashhaka-ma-ha-sab-kachha-ha-the-title-says-it-all" class="font-bold text-sm text-teal-700 dark:text-teal-300 hover:underline">"शीर्षक में ही सब कुछ है (The title says it all)"</a> </div> <div class="p-3 rounded-xl bg-teal-50/50 dark:bg-teal-950/20 border border-teal-100 dark:border-teal-900/30"> <a href="https://sublearn.com/learn/hi/phrases/nama-bugdha-oura-tharashana-chhata-great-cry-and-little-wool-related-to-deceptive-titles" class="font-bold text-sm text-teal-700 dark:text-teal-300 hover:underline">"नाम बड़े और दर्शन छोटे (Great cry and little wool - related to deceptive titles)"</a> </div> <div class="p-3 rounded-xl bg-teal-50/50 dark:bg-teal-950/20 border border-teal-100 dark:border-teal-900/30"> <a href="https://sublearn.com/learn/hi/phrases/sarakhaya-ma-rahana-to-be-in-the-headlines-related-to-news-titles" class="font-bold text-sm text-teal-700 dark:text-teal-300 hover:underline">"सुर्खियों में रहना (To be in the headlines - related to news titles)"</a> </div> <div class="p-3 rounded-xl bg-teal-50/50 dark:bg-teal-950/20 border border-teal-100 dark:border-teal-900/30"> <a href="https://sublearn.com/learn/hi/phrases/kagaza-ka-matha-the-forehead-of-the-paper-poetic-reference-to-heading" class="font-bold text-sm text-teal-700 dark:text-teal-300 hover:underline">"कागज़ का माथा (The forehead of the paper - poetic reference to heading)"</a> </div> <div class="p-3 rounded-xl bg-teal-50/50 dark:bg-teal-950/20 border border-teal-100 dark:border-teal-900/30"> <a href="https://sublearn.com/learn/hi/phrases/sharashha-para-hana-to-be-at-the-top" class="font-bold text-sm text-teal-700 dark:text-teal-300 hover:underline">"शीर्ष पर होना (To be at the top)"</a> </div> <div class="p-3 rounded-xl bg-teal-50/50 dark:bg-teal-950/20 border border-teal-100 dark:border-teal-900/30"> <a href="https://sublearn.com/learn/hi/phrases/bna-sara-para-ka-without-head-or-tail-lacking-structureheading" class="font-bold text-sm text-teal-700 dark:text-teal-300 hover:underline">"बिना सिर-पैर का (Without head or tail - lacking structure/heading)"</a> </div> <div class="p-3 rounded-xl bg-teal-50/50 dark:bg-teal-950/20 border border-teal-100 dark:border-teal-900/30"> <a href="https://sublearn.com/learn/hi/phrases/nama-kamana-to-earn-a-name-related-to-reputation" class="font-bold text-sm text-teal-700 dark:text-teal-300 hover:underline">"नाम कमाना (To earn a name - related to reputation)"</a> </div> <div class="p-3 rounded-xl bg-teal-50/50 dark:bg-teal-950/20 border border-teal-100 dark:border-teal-900/30"> <a href="https://sublearn.com/learn/hi/phrases/katab-ka-usaka-aavaranae-sa-na-aaka-dont-judge-a-book-by-its-covertitle" class="font-bold text-sm text-teal-700 dark:text-teal-300 hover:underline">"किताब को उसके आवरण से न आंकें (Don't judge a book by its cover/title)"</a> </div> <div class="p-3 rounded-xl bg-teal-50/50 dark:bg-teal-950/20 border border-teal-100 dark:border-teal-900/30"> <a href="https://sublearn.com/learn/hi/phrases/akashharasha-sataya-literally-true-referring-to-exact-titles" class="font-bold text-sm text-teal-700 dark:text-teal-300 hover:underline">"अक्षरशः सत्य (Literally true - referring to exact titles)"</a> </div> <div class="p-3 rounded-xl bg-teal-50/50 dark:bg-teal-950/20 border border-teal-100 dark:border-teal-900/30"> <a href="https://sublearn.com/learn/hi/phrases/mal-vashhaya-para-aana-to-come-to-the-main-pointheading" class="font-bold text-sm text-teal-700 dark:text-teal-300 hover:underline">"मूल विषय पर आना (To come to the main point/heading)"</a> </div> </div> </div> <div class="bg-white dark:bg-dark-card border-2 border-surface-200 dark:border-[#3b3755] border-b-4 rounded-2xl p-6"> <h2 class="text-lg font-bold text-surface-900 dark:text-white flex items-center gap-2 mb-4"> <svg class="w-5 h-5 text-amber-600 dark:text-amber-400" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L4.082 16.5c-.77.833.192 2.5 1.732 2.5z"/></svg> Easily Confused </h2> <div class="space-y-3"> <div class="rounded-xl border-2 border-amber-200 dark:border-amber-800 bg-amber-50 dark:bg-amber-900/20 p-4"> <div class="flex items-center gap-2 mb-1"> <span class="font-bold text-surface-900 dark:text-white">शीर्षक</span> <span class="text-surface-400">vs</span> <span class="font-bold text-amber-700 dark:text-amber-300"></span> </div> <p class="text-sm text-surface-600 dark:text-surface-300"></p> </div> <div class="rounded-xl border-2 border-amber-200 dark:border-amber-800 bg-amber-50 dark:bg-amber-900/20 p-4"> <div class="flex items-center gap-2 mb-1"> <span class="font-bold text-surface-900 dark:text-white">शीर्षक</span> <span class="text-surface-400">vs</span> <span class="font-bold text-amber-700 dark:text-amber-300"></span> </div> <p class="text-sm text-surface-600 dark:text-surface-300"></p> </div> <div class="rounded-xl border-2 border-amber-200 dark:border-amber-800 bg-amber-50 dark:bg-amber-900/20 p-4"> <div class="flex items-center gap-2 mb-1"> <span class="font-bold text-surface-900 dark:text-white">शीर्षक</span> <span class="text-surface-400">vs</span> <span class="font-bold text-amber-700 dark:text-amber-300"></span> </div> <p class="text-sm text-surface-600 dark:text-surface-300"></p> </div> <div class="rounded-xl border-2 border-amber-200 dark:border-amber-800 bg-amber-50 dark:bg-amber-900/20 p-4"> <div class="flex items-center gap-2 mb-1"> <span class="font-bold text-surface-900 dark:text-white">शीर्षक</span> <span class="text-surface-400">vs</span> <span class="font-bold text-amber-700 dark:text-amber-300"></span> </div> <p class="text-sm text-surface-600 dark:text-surface-300"></p> </div> <div class="rounded-xl border-2 border-amber-200 dark:border-amber-800 bg-amber-50 dark:bg-amber-900/20 p-4"> <div class="flex items-center gap-2 mb-1"> <span class="font-bold text-surface-900 dark:text-white">शीर्षक</span> <span class="text-surface-400">vs</span> <span class="font-bold text-amber-700 dark:text-amber-300"></span> </div> <p class="text-sm text-surface-600 dark:text-surface-300"></p> </div> </div> </div> <div class="bg-white dark:bg-dark-card border-2 border-surface-200 dark:border-[#3b3755] border-b-4 rounded-2xl p-6"> <h2 class="text-lg font-bold text-surface-900 dark:text-white flex items-center gap-2 mb-4"> <svg class="w-5 h-5 text-indigo-600 dark:text-indigo-400" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h7"/></svg> Sentence Patterns </h2> <div class="space-y-2"> <div class="flex items-start gap-3 p-3 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50"> <div class="flex-1 min-w-0"> <p class="font-mono text-sm font-semibold text-surface-900 dark:text-white"></p> </div> </div> <div class="flex items-start gap-3 p-3 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50"> <div class="flex-1 min-w-0"> <p class="font-mono text-sm font-semibold text-surface-900 dark:text-white"></p> </div> </div> <div class="flex items-start gap-3 p-3 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50"> <div class="flex-1 min-w-0"> <p class="font-mono text-sm font-semibold text-surface-900 dark:text-white"></p> </div> </div> <div class="flex items-start gap-3 p-3 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50"> <div class="flex-1 min-w-0"> <p class="font-mono text-sm font-semibold text-surface-900 dark:text-white"></p> </div> </div> <div class="flex items-start gap-3 p-3 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50"> <div class="flex-1 min-w-0"> <p class="font-mono text-sm font-semibold text-surface-900 dark:text-white"></p> </div> </div> <div class="flex items-start gap-3 p-3 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50"> <div class="flex-1 min-w-0"> <p class="font-mono text-sm font-semibold text-surface-900 dark:text-white"></p> </div> </div> <div class="flex items-start gap-3 p-3 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50"> <div class="flex-1 min-w-0"> <p class="font-mono text-sm font-semibold text-surface-900 dark:text-white"></p> </div> </div> <div class="flex items-start gap-3 p-3 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50"> <div class="flex-1 min-w-0"> <p class="font-mono text-sm font-semibold text-surface-900 dark:text-white"></p> </div> </div> </div> </div> </div> <div class="flex justify-center -mt-16 relative z-10"> <a href="https://sublearn.com/register" class="inline-flex items-center gap-2 px-6 py-3 text-sm font-bold rounded-xl bg-brand-600 hover:bg-brand-700 text-white shadow-[0_3px_0_0_#5b21b6] active:translate-y-[3px] active:shadow-none transition-all"> <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z"/></svg> Sign up free to see all examples </a> </div> </div> <div x-show="fullTab === 'tips'" x-transition class="space-y-6 mt-3" role="tabpanel" id="panel-tips" aria-labelledby="tab-tips"> <div class=" paywall-fade "> <div class="bg-white dark:bg-dark-card border-2 border-surface-200 dark:border-[#3b3755] border-b-4 rounded-2xl overflow-hidden"> <div class="px-5 sm:px-6 py-4 bg-gradient-to-r from-violet-50 to-white dark:from-violet-950/20 dark:to-[#111b2e] border-b border-surface-100 dark:border-surface-800"> <h2 class="text-lg font-bold text-surface-900 dark:text-white flex items-center gap-2"> <svg class="w-5 h-5 text-blue-500" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z"/></svg> How to Use It </h2> </div> <div class="divide-y divide-surface-100 dark:divide-surface-800"> <div class="px-5 sm:px-6 py-3.5 flex items-start gap-3"> <span class="px-2.5 py-1 rounded-lg bg-blue-100 dark:bg-blue-900/30 text-blue-700 dark:text-blue-300 text-xs font-bold uppercase flex-shrink-0">formality</span> <p class="text-surface-700 dark:text-surface-300 leading-relaxed flex-1">Formal and standard. Widely understood across all demographics.</p> </div> <div class="px-5 sm:px-6 py-3.5 flex items-start gap-3"> <span class="px-2.5 py-1 rounded-lg bg-blue-100 dark:bg-blue-900/30 text-blue-700 dark:text-blue-300 text-xs font-bold uppercase flex-shrink-0">media specific</span> <p class="text-surface-700 dark:text-surface-300 leading-relaxed flex-1">In digital media, 'शीर्षक' is the direct translation for the HTML <title> tag or a blog post heading.</p> </div> <div class="px-5 sm:px-6 py-3.5 flex items-start gap-3"> <span class="px-2.5 py-1 rounded-lg bg-blue-100 dark:bg-blue-900/30 text-blue-700 dark:text-blue-300 text-xs font-bold uppercase flex-shrink-0">regional variations</span> <p class="text-surface-700 dark:text-surface-300 leading-relaxed flex-1">In Urdu-influenced Hindi (Hindustani), the word 'उनवान' (unwān) is sometimes used for title/heading, but 'शीर्षक' is the standard in modern Hindi.</p> </div> <div class="px-5 sm:px-6 py-4"> <div class="flex items-start gap-3"> <svg class="w-4 h-4 text-amber-500 flex-shrink-0 mt-1" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L4.082 16.5c-.77.833.192 2.5 1.732 2.5z"/></svg> <div class="flex-1 min-w-0"> <span class="text-xs font-bold text-surface-400 dark:text-surface-500 uppercase tracking-wide">Common Mistakes</span> <ul class="mt-2 space-y-2"> <li class="text-surface-700 dark:text-surface-300"> <span class="text-rose-600 dark:text-rose-400 line-through">Using 'शीर्षक' instead of 'नाम' when asking for a person's name.</span> </li> <li class="text-surface-700 dark:text-surface-300"> <span class="text-rose-600 dark:text-rose-400 line-through">Using the feminine postposition 'की' instead of the masculine 'का' (e.g., saying 'किताब की शीर्षक' instead of 'किताब का शीर्षक').</span> </li> <li class="text-surface-700 dark:text-surface-300"> <span class="text-rose-600 dark:text-rose-400 line-through">Confusing 'शीर्षक' (the specific title) with 'विषय' (the general subject).</span> </li> <li class="text-surface-700 dark:text-surface-300"> <span class="text-rose-600 dark:text-rose-400 line-through">Spelling it with a short 'i' as 'शिर्षक' instead of the correct long 'ī' as 'शीर्षक'.</span> </li> <li class="text-surface-700 dark:text-surface-300"> <span class="text-rose-600 dark:text-rose-400 line-through">Translating the English legal term 'property title' as 'संपत्ति का शीर्षक' instead of 'स्वामित्व'.</span> </li> </ul> </div> </div> </div> </div> </div> <div id="section-learning-tips" class="scroll-mt-20 bg-white dark:bg-dark-card border-2 border-surface-200 dark:border-[#3b3755] border-b-4 rounded-2xl overflow-hidden"> <div class="px-5 sm:px-6 py-4 bg-gradient-to-r from-violet-50 to-white dark:from-violet-950/20 dark:to-[#111b2e] border-b border-surface-100 dark:border-surface-800"> <h2 class="text-lg font-bold text-surface-900 dark:text-white flex items-center gap-2"> <svg class="w-5 h-5 text-violet-500" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"/></svg> Tips </h2> </div> <div class="divide-y divide-surface-100 dark:divide-surface-800"> <div class="px-5 sm:px-6 py-4"> <div class="flex items-start gap-3"> <div class="flex-shrink-0 mt-0.5 p-2 rounded-xl bg-blue-50 dark:bg-blue-900/10 border-blue-200 dark:border-blue-800 border"> <span class="text-blue-500"><svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"/></svg></span> </div> <div class="flex-1 min-w-0"> <h3 class="font-bold text-surface-900 dark:text-white">Always Masculine</h3> <p class="text-surface-600 dark:text-surface-400 mt-1 leading-relaxed">Remember that 'शीर्षक' is always a masculine noun. This means you must use 'का' (kā) before it, not 'की' (kī). Say 'कहानी का शीर्षक' (title of the story), even though 'कहानी' is feminine. The postposition agrees with 'शीर्षक'.</p> </div> </div> </div> <div class="px-5 sm:px-6 py-4"> <div class="flex items-start gap-3"> <div class="flex-shrink-0 mt-0.5 p-2 rounded-xl bg-blue-50 dark:bg-blue-900/10 border-blue-200 dark:border-blue-800 border"> <span class="text-blue-500"><svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"/></svg></span> </div> <div class="flex-1 min-w-0"> <h3 class="font-bold text-surface-900 dark:text-white">Not for People</h3> <p class="text-surface-600 dark:text-surface-400 mt-1 leading-relaxed">Never use 'शीर्षक' to ask for a person's name. If you ask someone 'आपका शीर्षक क्या है?', they will be very confused. Always use 'नाम' (nām) for people and 'शीर्षक' for books, movies, and articles.</p> </div> </div> </div> <div class="px-5 sm:px-6 py-4"> <div class="flex items-start gap-3"> <div class="flex-shrink-0 mt-0.5 p-2 rounded-xl bg-blue-50 dark:bg-blue-900/10 border-blue-200 dark:border-blue-800 border"> <span class="text-blue-500"><svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"/></svg></span> </div> <div class="flex-1 min-w-0"> <h3 class="font-bold text-surface-900 dark:text-white">Long 'ee' Sound</h3> <p class="text-surface-600 dark:text-surface-400 mt-1 leading-relaxed">Pay attention to the spelling and pronunciation. It is 'शीर्षक' with a long 'ī' sound (sheer-shak), not 'शिर्षक' with a short 'i'. Emphasizing the first syllable will make you sound more like a native speaker.</p> </div> </div> </div> <div class="px-5 sm:px-6 py-4"> <div class="flex items-start gap-3"> <div class="flex-shrink-0 mt-0.5 p-2 rounded-xl bg-blue-50 dark:bg-blue-900/10 border-blue-200 dark:border-blue-800 border"> <span class="text-blue-500"><svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"/></svg></span> </div> <div class="flex-1 min-w-0"> <h3 class="font-bold text-surface-900 dark:text-white">Reading Comprehension Hack</h3> <p class="text-surface-600 dark:text-surface-400 mt-1 leading-relaxed">If you are taking a Hindi exam, look out for the question 'उचित शीर्षक दें' (Give a proper title). This is a guaranteed question in reading comprehension. Practice summarizing paragraphs into 2-3 word headings to ace this.</p> </div> </div> </div> <div class="px-5 sm:px-6 py-4"> <div class="flex items-start gap-3"> <div class="flex-shrink-0 mt-0.5 p-2 rounded-xl bg-blue-50 dark:bg-blue-900/10 border-blue-200 dark:border-blue-800 border"> <span class="text-blue-500"><svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"/></svg></span> </div> <div class="flex-1 min-w-0"> <h3 class="font-bold text-surface-900 dark:text-white">Title vs Subject</h3> <p class="text-surface-600 dark:text-surface-400 mt-1 leading-relaxed">Don't confuse 'शीर्षक' (title) with 'विषय' (subject). The 'विषय' is the broad topic (e.g., Science), while the 'शीर्षक' is the specific name of the text (e.g., The Wonders of Physics). Use them correctly in academic settings.</p> </div> </div> </div> <div class="px-5 sm:px-6 py-4"> <div class="flex items-start gap-3"> <div class="flex-shrink-0 mt-0.5 p-2 rounded-xl bg-blue-50 dark:bg-blue-900/10 border-blue-200 dark:border-blue-800 border"> <span class="text-blue-500"><svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"/></svg></span> </div> <div class="flex-1 min-w-0"> <h3 class="font-bold text-surface-900 dark:text-white">News Context</h3> <p class="text-surface-600 dark:text-surface-400 mt-1 leading-relaxed">When reading the news, use 'शीर्षक' for the heading of a specific article you are reading. But if you are talking about the 'Top Headlines' of the day, use the word 'सुर्खियां' (surkhiyān) instead.</p> </div> </div> </div> <div class="px-5 sm:px-6 py-4"> <div class="flex items-start gap-3"> <div class="flex-shrink-0 mt-0.5 p-2 rounded-xl bg-blue-50 dark:bg-blue-900/10 border-blue-200 dark:border-blue-800 border"> <span class="text-blue-500"><svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"/></svg></span> </div> <div class="flex-1 min-w-0"> <h3 class="font-bold text-surface-900 dark:text-white">Plural Forms</h3> <p class="text-surface-600 dark:text-surface-400 mt-1 leading-relaxed">The plural of 'शीर्षक' is just 'शीर्षक' unless it is followed by a postposition (like में, से, को). If there is a postposition, it changes to 'शीर्षकों' (shīrṣakoṃ). Example: 'इन दो शीर्षकों में' (in these two titles).</p> </div> </div> </div> <div class="px-5 sm:px-6 py-4"> <div class="flex items-start gap-3"> <div class="flex-shrink-0 mt-0.5 p-2 rounded-xl bg-blue-50 dark:bg-blue-900/10 border-blue-200 dark:border-blue-800 border"> <span class="text-blue-500"><svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"/></svg></span> </div> <div class="flex-1 min-w-0"> <h3 class="font-bold text-surface-900 dark:text-white">Common Verbs</h3> <p class="text-surface-600 dark:text-surface-400 mt-1 leading-relaxed">Pair 'शीर्षक' with verbs like 'देना' (to give), 'पढ़ना' (to read), 'लिखना' (to write), and 'चुनना' (to choose). Example: 'एक अच्छा शीर्षक चुनो' (Choose a good title).</p> </div> </div> </div> <div class="px-5 sm:px-6 py-4"> <div class="flex items-start gap-3"> <div class="flex-shrink-0 mt-0.5 p-2 rounded-xl bg-blue-50 dark:bg-blue-900/10 border-blue-200 dark:border-blue-800 border"> <span class="text-blue-500"><svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"/></svg></span> </div> <div class="flex-1 min-w-0"> <h3 class="font-bold text-surface-900 dark:text-white">Remember the Root</h3> <p class="text-surface-600 dark:text-surface-400 mt-1 leading-relaxed">Connect 'शीर्षक' to its root word 'शीर्ष' (shīrṣ), which means 'head'. Just as the head is at the top of the body, the 'शीर्षक' is at the top of the page. This mental image makes it impossible to forget.</p> </div> </div> </div> <div class="px-5 sm:px-6 py-4"> <div class="flex items-start gap-3"> <div class="flex-shrink-0 mt-0.5 p-2 rounded-xl bg-blue-50 dark:bg-blue-900/10 border-blue-200 dark:border-blue-800 border"> <span class="text-blue-500"><svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"/></svg></span> </div> <div class="flex-1 min-w-0"> <h3 class="font-bold text-surface-900 dark:text-white">Subheadings</h3> <p class="text-surface-600 dark:text-surface-400 mt-1 leading-relaxed">In professional or academic writing, structure your documents using 'मुख्य शीर्षक' (main heading) and 'उपशीर्षक' (subheadings). This shows a high level of proficiency in formal Hindi formatting.</p> </div> </div> </div> </div> </div> <div class="bg-white dark:bg-dark-card border-2 border-surface-200 dark:border-[#3b3755] border-b-4 rounded-2xl p-5 sm:p-6"> <h2 class="text-lg font-bold text-surface-900 dark:text-white mb-4">Memorize It</h2> <div class="space-y-4"> <div class="flex items-start gap-3 p-3 rounded-xl bg-violet-50 dark:bg-violet-900/20"> <svg class="w-5 h-5 text-violet-600 dark:text-violet-400 flex-shrink-0 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"/></svg> <div class="flex-1 min-w-0"> <h3 class="font-semibold text-violet-800 dark:text-violet-200 text-sm mb-1">Mnemonic</h3> <p class="text-sm text-violet-700 dark:text-violet-300 leading-relaxed">Think of the SHIRt you wear. It goes over your head. SHIRshak is the HEADing at the top of the page.</p> </div> </div> </div> </div> <div class="bg-surface-50 dark:bg-dark-surface-3/50 border-2 border-surface-200 dark:border-[#3b3755] border-b-4 rounded-2xl" x-data="{ open: false }"> <button @click="open = !open" class="flex items-center justify-between w-full p-5 sm:p-6 ltr:text-left rtl:text-right group"> <span class="text-lg font-bold text-surface-900 dark:text-white flex items-center gap-2"> <svg class="w-5 h-5 text-violet-500" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"/></svg> Did You Know? </span> <svg :class="open && 'rotate-180'" class="w-5 h-5 text-surface-400 transition-transform duration-200 flex-shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"/></svg> </button> <div x-show="open" x-collapse x-cloak class="px-5 sm:px-6 pb-5 sm:pb-6 space-y-4"> <div class="flex items-start gap-3"> <svg class="w-5 h-5 text-amber-500 flex-shrink-0 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253"/></svg> <div class="flex-1 min-w-0"> <h3 class="font-semibold text-surface-800 dark:text-surface-200 text-sm mb-1">Word Origin</h3> <p class="text-sm text-surface-600 dark:text-surface-400 leading-relaxed">Sanskrit</p> </div> </div> <div class="flex items-start gap-3"> <svg class="w-5 h-5 text-teal-500 flex-shrink-0 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3.055 11H5a2 2 0 012 2v1a2 2 0 002 2 2 2 0 012 2v2.945M8 3.935V5.5A2.5 2.5 0 0010.5 8h.5a2 2 0 012 2 2 2 0 104 0 2 2 0 012-2h1.064M15 20.488V18a2 2 0 012-2h3.064M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg> <div class="flex-1 min-w-0"> <h3 class="font-semibold text-surface-800 dark:text-surface-200 text-sm mb-1">Cultural Context</h3> <div class="space-y-2"> <p class="text-sm text-surface-600 dark:text-surface-400 leading-relaxed">The 'Title Track' of a movie is called the 'शीर्षक गीत' (shīrṣak gīt).</p> <p class="text-sm text-surface-600 dark:text-surface-400 leading-relaxed">Finding the 'शीर्षक' is a standard test of reading comprehension in Indian schools.</p> <p class="text-sm text-surface-600 dark:text-surface-400 leading-relaxed">Classical Sanskrit texts often use the suffix '-carita' or '-katha' as part of the title, rather than a separate 'शीर्षक'.</p> </div> </div> </div> </div> </div> <div class="bg-white dark:bg-dark-card border-2 border-surface-200 dark:border-[#3b3755] border-b-4 rounded-2xl p-5 sm:p-6"> <h2 class="text-lg font-bold text-surface-900 dark:text-white mb-4">Practice in Real Life</h2> <div class="space-y-4"> <div> <h3 class="text-sm font-semibold text-surface-500 dark:text-surface-400 uppercase tracking-wide mb-2">Real-World Contexts</h3> <div class="space-y-3"> <div class="p-3 rounded-xl bg-emerald-50 dark:bg-emerald-900/20 border border-emerald-200 dark:border-emerald-800"> <p class="font-bold text-emerald-800 dark:text-emerald-200 text-sm mb-1"></p> </div> <div class="p-3 rounded-xl bg-emerald-50 dark:bg-emerald-900/20 border border-emerald-200 dark:border-emerald-800"> <p class="font-bold text-emerald-800 dark:text-emerald-200 text-sm mb-1"></p> </div> <div class="p-3 rounded-xl bg-emerald-50 dark:bg-emerald-900/20 border border-emerald-200 dark:border-emerald-800"> <p class="font-bold text-emerald-800 dark:text-emerald-200 text-sm mb-1"></p> </div> <div class="p-3 rounded-xl bg-emerald-50 dark:bg-emerald-900/20 border border-emerald-200 dark:border-emerald-800"> <p class="font-bold text-emerald-800 dark:text-emerald-200 text-sm mb-1"></p> </div> <div class="p-3 rounded-xl bg-emerald-50 dark:bg-emerald-900/20 border border-emerald-200 dark:border-emerald-800"> <p class="font-bold text-emerald-800 dark:text-emerald-200 text-sm mb-1"></p> </div> </div> </div> <div> <h3 class="text-sm font-semibold text-surface-500 dark:text-surface-400 uppercase tracking-wide mb-2">Conversation Starters</h3> <div class="space-y-1.5"> <div class="flex items-start gap-2 p-2 rounded-lg bg-surface-50 dark:bg-dark-surface-3/50"> <svg class="w-4 h-4 text-blue-500 flex-shrink-0 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z"/></svg> <p class="text-sm text-surface-700 dark:text-surface-300">"आपकी पसंदीदा किताब का शीर्षक क्या है?"</p> </div> <div class="flex items-start gap-2 p-2 rounded-lg bg-surface-50 dark:bg-dark-surface-3/50"> <svg class="w-4 h-4 text-blue-500 flex-shrink-0 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z"/></svg> <p class="text-sm text-surface-700 dark:text-surface-300">"क्या आपको लगता है कि इस फिल्म का शीर्षक सही है?"</p> </div> <div class="flex items-start gap-2 p-2 rounded-lg bg-surface-50 dark:bg-dark-surface-3/50"> <svg class="w-4 h-4 text-blue-500 flex-shrink-0 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z"/></svg> <p class="text-sm text-surface-700 dark:text-surface-300">"अगर आप अपने जीवन पर एक किताब लिखें, तो उसका शीर्षक क्या होगा?"</p> </div> <div class="flex items-start gap-2 p-2 rounded-lg bg-surface-50 dark:bg-dark-surface-3/50"> <svg class="w-4 h-4 text-blue-500 flex-shrink-0 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z"/></svg> <p class="text-sm text-surface-700 dark:text-surface-300">"आज के अखबार का मुख्य शीर्षक क्या था?"</p> </div> <div class="flex items-start gap-2 p-2 rounded-lg bg-surface-50 dark:bg-dark-surface-3/50"> <svg class="w-4 h-4 text-blue-500 flex-shrink-0 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z"/></svg> <p class="text-sm text-surface-700 dark:text-surface-300">"क्या आप मुझे एक अच्छे शीर्षक वाली कहानी सुझा सकते हैं?"</p> </div> </div> </div> <div> <h3 class="text-sm font-semibold text-surface-500 dark:text-surface-400 uppercase tracking-wide mb-2">Journal Prompts</h3> <div class="space-y-1.5"> <div class="flex items-start gap-2 p-2 rounded-lg bg-surface-50 dark:bg-dark-surface-3/50"> <svg class="w-4 h-4 text-amber-500 flex-shrink-0 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z"/></svg> <p class="text-sm text-surface-700 dark:text-surface-300">Write down the titles (शीर्षक) of the last three books you read and explain why you think the authors chose them.</p> </div> <div class="flex items-start gap-2 p-2 rounded-lg bg-surface-50 dark:bg-dark-surface-3/50"> <svg class="w-4 h-4 text-amber-500 flex-shrink-0 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z"/></svg> <p class="text-sm text-surface-700 dark:text-surface-300">Invent a title (शीर्षक) for a movie about your life.</p> </div> <div class="flex items-start gap-2 p-2 rounded-lg bg-surface-50 dark:bg-dark-surface-3/50"> <svg class="w-4 h-4 text-amber-500 flex-shrink-0 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z"/></svg> <p class="text-sm text-surface-700 dark:text-surface-300">Read a short news article in Hindi and write a new, better title (शीर्षक) for it.</p> </div> <div class="flex items-start gap-2 p-2 rounded-lg bg-surface-50 dark:bg-dark-surface-3/50"> <svg class="w-4 h-4 text-amber-500 flex-shrink-0 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z"/></svg> <p class="text-sm text-surface-700 dark:text-surface-300">Explain the difference between 'नाम' and 'शीर्षक' in your own words.</p> </div> <div class="flex items-start gap-2 p-2 rounded-lg bg-surface-50 dark:bg-dark-surface-3/50"> <svg class="w-4 h-4 text-amber-500 flex-shrink-0 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z"/></svg> <p class="text-sm text-surface-700 dark:text-surface-300">Write a short paragraph using the words 'शीर्षक', 'उपशीर्षक', and 'विषय'.</p> </div> </div> </div> </div> </div> <div id="section-faq" class="scroll-mt-20 bg-white dark:bg-dark-card border-2 border-surface-200 dark:border-[#3b3755] border-b-4 rounded-2xl p-6 sm:p-8" x-data="{ openFaq: null }"> <div class="flex flex-wrap items-center justify-between gap-2 mb-6"> <h2 class="text-lg sm:text-xl font-bold text-surface-900 dark:text-white flex items-center gap-2"> <svg class="w-5 h-5 text-blue-600 dark:text-blue-400 flex-shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8.228 9c.549-1.065 2.05-1.37 3.04-1.37.79 0 1.553.235 2.04.83.45.55.502 1.34.146 2.023C13.1 11.192 12.228 11.7 11.5 12.5c-.354.389-.5 1-.5 1.5m0 3h.01"/><circle cx="12" cy="12" r="10" stroke="currentColor" stroke-width="2" fill="none"/></svg> Frequently Asked Questions </h2> <span class="inline-flex items-center rounded-full border border-surface-200 dark:border-[#3b3755] px-3 py-1 text-xs font-semibold text-surface-600 dark:text-surface-300"> 10 questions </span> </div> <div class="divide-y divide-surface-100 dark:divide-[#3b3755]"> <div class="py-3 first:pt-0 last:pb-0"> <button @click="openFaq === 0 ? openFaq = null : openFaq = 0" class="flex items-start justify-between w-full ltr:text-left rtl:text-right gap-3 group" > <div class="flex items-start gap-3 flex-1 min-w-0"> <span class="inline-flex items-center justify-center min-w-[1.75rem] h-7 rounded-xl bg-blue-100 dark:bg-blue-900/30 text-blue-700 dark:text-blue-300 text-xs font-bold flex-shrink-0 mt-0.5">1</span> <span class="text-sm font-semibold text-surface-900 dark:text-white group-hover:text-brand-600 dark:group-hover:text-brand-400 transition-colors leading-relaxed">Can I use 'शीर्षक' for a person's name?</span> </div> <svg :class="openFaq === 0 && 'rotate-180'" class="w-4 h-4 text-surface-400 transition-transform flex-shrink-0 mt-1.5" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"/></svg> </button> <div x-show="openFaq === 0" x-collapse x-cloak class="ltr:ml-10 rtl:mr-10 mt-2"> <p class="text-sm text-surface-600 dark:text-surface-300 leading-relaxed pb-2">No, you cannot use 'शीर्षक' for a person's name. The correct word for a person's name is 'नाम' (nām). 'शीर्षक' is strictly used for the titles or headings of inanimate things like books, movies, articles, and essays. Using it for a person sounds nonsensical in Hindi.</p> </div> </div> <div class="py-3 first:pt-0 last:pb-0"> <button @click="openFaq === 1 ? openFaq = null : openFaq = 1" class="flex items-start justify-between w-full ltr:text-left rtl:text-right gap-3 group" > <div class="flex items-start gap-3 flex-1 min-w-0"> <span class="inline-flex items-center justify-center min-w-[1.75rem] h-7 rounded-xl bg-blue-100 dark:bg-blue-900/30 text-blue-700 dark:text-blue-300 text-xs font-bold flex-shrink-0 mt-0.5">2</span> <span class="text-sm font-semibold text-surface-900 dark:text-white group-hover:text-brand-600 dark:group-hover:text-brand-400 transition-colors leading-relaxed">What is the difference between 'शीर्षक' and 'विषय'?</span> </div> <svg :class="openFaq === 1 && 'rotate-180'" class="w-4 h-4 text-surface-400 transition-transform flex-shrink-0 mt-1.5" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"/></svg> </button> <div x-show="openFaq === 1" x-collapse x-cloak class="ltr:ml-10 rtl:mr-10 mt-2"> <p class="text-sm text-surface-600 dark:text-surface-300 leading-relaxed pb-2">'शीर्षक' means 'title' or 'heading', while 'विषय' means 'subject' or 'topic'. For example, the 'विषय' of a book might be 'Indian History', but its 'शीर्षक' could be 'The Discovery of India'. The subject is what the text is about, while the title is its specific name.</p> </div> </div> <div class="py-3 first:pt-0 last:pb-0"> <button @click="openFaq === 2 ? openFaq = null : openFaq = 2" class="flex items-start justify-between w-full ltr:text-left rtl:text-right gap-3 group" > <div class="flex items-start gap-3 flex-1 min-w-0"> <span class="inline-flex items-center justify-center min-w-[1.75rem] h-7 rounded-xl bg-blue-100 dark:bg-blue-900/30 text-blue-700 dark:text-blue-300 text-xs font-bold flex-shrink-0 mt-0.5">3</span> <span class="text-sm font-semibold text-surface-900 dark:text-white group-hover:text-brand-600 dark:group-hover:text-brand-400 transition-colors leading-relaxed">Is 'शीर्षक' a masculine or feminine noun?</span> </div> <svg :class="openFaq === 2 && 'rotate-180'" class="w-4 h-4 text-surface-400 transition-transform flex-shrink-0 mt-1.5" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"/></svg> </button> <div x-show="openFaq === 2" x-collapse x-cloak class="ltr:ml-10 rtl:mr-10 mt-2"> <p class="text-sm text-surface-600 dark:text-surface-300 leading-relaxed pb-2">'शीर्षक' is a masculine noun in Hindi. This is very important for grammar. You must use masculine adjectives and postpositions with it. For example, you say 'अच्छा शीर्षक' (good title) and 'किताब का शीर्षक' (title of the book). Never use 'अच्छी' or 'की' with it.</p> </div> </div> <div class="py-3 first:pt-0 last:pb-0"> <button @click="openFaq === 3 ? openFaq = null : openFaq = 3" class="flex items-start justify-between w-full ltr:text-left rtl:text-right gap-3 group" > <div class="flex items-start gap-3 flex-1 min-w-0"> <span class="inline-flex items-center justify-center min-w-[1.75rem] h-7 rounded-xl bg-blue-100 dark:bg-blue-900/30 text-blue-700 dark:text-blue-300 text-xs font-bold flex-shrink-0 mt-0.5">4</span> <span class="text-sm font-semibold text-surface-900 dark:text-white group-hover:text-brand-600 dark:group-hover:text-brand-400 transition-colors leading-relaxed">How do you say 'subtitle' or 'subheading' in Hindi?</span> </div> <svg :class="openFaq === 3 && 'rotate-180'" class="w-4 h-4 text-surface-400 transition-transform flex-shrink-0 mt-1.5" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"/></svg> </button> <div x-show="openFaq === 3" x-collapse x-cloak class="ltr:ml-10 rtl:mr-10 mt-2"> <p class="text-sm text-surface-600 dark:text-surface-300 leading-relaxed pb-2">The word for subtitle or subheading is 'उपशीर्षक' (up-shīrṣak). The prefix 'उप' (up) means 'sub' or 'under'. So, a main heading is the 'मुख्य शीर्षक' and the sections below it are 'उपशीर्षक'. This is commonly used in essay writing and formatting.</p> </div> </div> <div class="py-3 first:pt-0 last:pb-0"> <button @click="openFaq === 4 ? openFaq = null : openFaq = 4" class="flex items-start justify-between w-full ltr:text-left rtl:text-right gap-3 group" > <div class="flex items-start gap-3 flex-1 min-w-0"> <span class="inline-flex items-center justify-center min-w-[1.75rem] h-7 rounded-xl bg-blue-100 dark:bg-blue-900/30 text-blue-700 dark:text-blue-300 text-xs font-bold flex-shrink-0 mt-0.5">5</span> <span class="text-sm font-semibold text-surface-900 dark:text-white group-hover:text-brand-600 dark:group-hover:text-brand-400 transition-colors leading-relaxed">Can I use the English word 'title' when speaking Hindi?</span> </div> <svg :class="openFaq === 4 && 'rotate-180'" class="w-4 h-4 text-surface-400 transition-transform flex-shrink-0 mt-1.5" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"/></svg> </button> <div x-show="openFaq === 4" x-collapse x-cloak class="ltr:ml-10 rtl:mr-10 mt-2"> <p class="text-sm text-surface-600 dark:text-surface-300 leading-relaxed pb-2">Yes, in casual, everyday spoken Hindi, especially in urban areas, the English word 'title' (टाइटल) is very commonly used. People often say 'मूवी का टाइटल क्या है?'. However, in written Hindi, exams, news, and formal speech, 'शीर्षक' is the required standard word.</p> </div> </div> <div class="py-3 first:pt-0 last:pb-0"> <button @click="openFaq === 5 ? openFaq = null : openFaq = 5" class="flex items-start justify-between w-full ltr:text-left rtl:text-right gap-3 group" > <div class="flex items-start gap-3 flex-1 min-w-0"> <span class="inline-flex items-center justify-center min-w-[1.75rem] h-7 rounded-xl bg-blue-100 dark:bg-blue-900/30 text-blue-700 dark:text-blue-300 text-xs font-bold flex-shrink-0 mt-0.5">6</span> <span class="text-sm font-semibold text-surface-900 dark:text-white group-hover:text-brand-600 dark:group-hover:text-brand-400 transition-colors leading-relaxed">What is the plural of 'शीर्षक'?</span> </div> <svg :class="openFaq === 5 && 'rotate-180'" class="w-4 h-4 text-surface-400 transition-transform flex-shrink-0 mt-1.5" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"/></svg> </button> <div x-show="openFaq === 5" x-collapse x-cloak class="ltr:ml-10 rtl:mr-10 mt-2"> <p class="text-sm text-surface-600 dark:text-surface-300 leading-relaxed pb-2">In the direct case, the plural of 'शीर्षक' remains 'शीर्षक' (e.g., दो शीर्षक - two titles). However, in the oblique case (when followed by a postposition like में, पर, को), it becomes 'शीर्षकों' (shīrṣakoṃ). For example, 'इन शीर्षकों में' (in these titles).</p> </div> </div> <div class="py-3 first:pt-0 last:pb-0"> <button @click="openFaq === 6 ? openFaq = null : openFaq = 6" class="flex items-start justify-between w-full ltr:text-left rtl:text-right gap-3 group" > <div class="flex items-start gap-3 flex-1 min-w-0"> <span class="inline-flex items-center justify-center min-w-[1.75rem] h-7 rounded-xl bg-blue-100 dark:bg-blue-900/30 text-blue-700 dark:text-blue-300 text-xs font-bold flex-shrink-0 mt-0.5">7</span> <span class="text-sm font-semibold text-surface-900 dark:text-white group-hover:text-brand-600 dark:group-hover:text-brand-400 transition-colors leading-relaxed">How do I say 'untitled' in Hindi?</span> </div> <svg :class="openFaq === 6 && 'rotate-180'" class="w-4 h-4 text-surface-400 transition-transform flex-shrink-0 mt-1.5" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"/></svg> </button> <div x-show="openFaq === 6" x-collapse x-cloak class="ltr:ml-10 rtl:mr-10 mt-2"> <p class="text-sm text-surface-600 dark:text-surface-300 leading-relaxed pb-2">To say 'untitled', you can use the phrase 'बिना शीर्षक का' (binā shīrṣak kā), which literally means 'without a title'. In highly formal or literary contexts, you might see the word 'शीर्षकहीन' (shīrṣakhīn), where 'हीन' means 'without'.</p> </div> </div> <div class="py-3 first:pt-0 last:pb-0"> <button @click="openFaq === 7 ? openFaq = null : openFaq = 7" class="flex items-start justify-between w-full ltr:text-left rtl:text-right gap-3 group" > <div class="flex items-start gap-3 flex-1 min-w-0"> <span class="inline-flex items-center justify-center min-w-[1.75rem] h-7 rounded-xl bg-blue-100 dark:bg-blue-900/30 text-blue-700 dark:text-blue-300 text-xs font-bold flex-shrink-0 mt-0.5">8</span> <span class="text-sm font-semibold text-surface-900 dark:text-white group-hover:text-brand-600 dark:group-hover:text-brand-400 transition-colors leading-relaxed">Is 'शीर्षक' used for news headlines?</span> </div> <svg :class="openFaq === 7 && 'rotate-180'" class="w-4 h-4 text-surface-400 transition-transform flex-shrink-0 mt-1.5" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"/></svg> </button> <div x-show="openFaq === 7" x-collapse x-cloak class="ltr:ml-10 rtl:mr-10 mt-2"> <p class="text-sm text-surface-600 dark:text-surface-300 leading-relaxed pb-2">While 'शीर्षक' can be used for the heading of a specific news article, the main, bold headlines on the front page or on TV are usually called 'सुर्खियां' (surkhiyān). 'सुर्खियां' implies breaking or important news highlights, whereas 'शीर्षक' is a general heading.</p> </div> </div> <div class="py-3 first:pt-0 last:pb-0"> <button @click="openFaq === 8 ? openFaq = null : openFaq = 8" class="flex items-start justify-between w-full ltr:text-left rtl:text-right gap-3 group" > <div class="flex items-start gap-3 flex-1 min-w-0"> <span class="inline-flex items-center justify-center min-w-[1.75rem] h-7 rounded-xl bg-blue-100 dark:bg-blue-900/30 text-blue-700 dark:text-blue-300 text-xs font-bold flex-shrink-0 mt-0.5">9</span> <span class="text-sm font-semibold text-surface-900 dark:text-white group-hover:text-brand-600 dark:group-hover:text-brand-400 transition-colors leading-relaxed">What verb do I use to say 'to give a title'?</span> </div> <svg :class="openFaq === 8 && 'rotate-180'" class="w-4 h-4 text-surface-400 transition-transform flex-shrink-0 mt-1.5" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"/></svg> </button> <div x-show="openFaq === 8" x-collapse x-cloak class="ltr:ml-10 rtl:mr-10 mt-2"> <p class="text-sm text-surface-600 dark:text-surface-300 leading-relaxed pb-2">The most common verb to use is 'देना' (to give). You say 'शीर्षक देना' (shīrṣak denā). For example, 'मैंने अपनी कहानी को एक नया शीर्षक दिया' (I gave a new title to my story). You can also use 'रखना' (to keep/put), as in 'शीर्षक रखना'.</p> </div> </div> <div class="py-3 first:pt-0 last:pb-0"> <button @click="openFaq === 9 ? openFaq = null : openFaq = 9" class="flex items-start justify-between w-full ltr:text-left rtl:text-right gap-3 group" > <div class="flex items-start gap-3 flex-1 min-w-0"> <span class="inline-flex items-center justify-center min-w-[1.75rem] h-7 rounded-xl bg-blue-100 dark:bg-blue-900/30 text-blue-700 dark:text-blue-300 text-xs font-bold flex-shrink-0 mt-0.5">10</span> <span class="text-sm font-semibold text-surface-900 dark:text-white group-hover:text-brand-600 dark:group-hover:text-brand-400 transition-colors leading-relaxed">Does 'शीर्षक' have any other meanings?</span> </div> <svg :class="openFaq === 9 && 'rotate-180'" class="w-4 h-4 text-surface-400 transition-transform flex-shrink-0 mt-1.5" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"/></svg> </button> <div x-show="openFaq === 9" x-collapse x-cloak class="ltr:ml-10 rtl:mr-10 mt-2"> <p class="text-sm text-surface-600 dark:text-surface-300 leading-relaxed pb-2">Its primary meaning is 'title' or 'heading'. In some highly specific legal or bureaucratic contexts, it can mean a 'head' or 'category' of an account or document, but even then, it functions essentially as a heading. It does not mean 'property title' (which is स्वामित्व).</p> </div> </div> </div> </div> </div> <div class="flex justify-center -mt-16 relative z-10"> <a href="https://sublearn.com/register" class="inline-flex items-center gap-2 px-6 py-3 text-sm font-bold rounded-xl bg-brand-600 hover:bg-brand-700 text-white shadow-[0_3px_0_0_#5b21b6] active:translate-y-[3px] active:shadow-none transition-all"> <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z"/></svg> Sign up free for tips & notes </a> </div> </div> <div x-show="fullTab === 'practice'" x-transition class="space-y-6 mt-3" role="tabpanel" id="panel-practice" aria-labelledby="tab-practice"> <div class=" paywall-fade "> <div id="section-practice-exercises" class="scroll-mt-20 bg-white dark:bg-dark-card border-2 border-surface-200 dark:border-[#3b3755] border-b-4 rounded-2xl overflow-hidden" x-data="{ ...practiceExercises(), currentEx: 0, exFilter: 'all', exLevel: 'all' }"> <div class="px-5 sm:px-6 py-4 bg-gradient-to-r from-orange-50 to-white dark:from-orange-950/20 dark:to-[#111b2e] border-b border-surface-100 dark:border-surface-800"> <h2 class="text-lg font-bold text-surface-900 dark:text-white flex items-center gap-2"> <svg class="w-5 h-5 text-orange-500" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"/></svg> Test Yourself <span class="text-sm font-normal text-surface-400 ltr:ml-2 rtl:mr-2">200 questions</span> </h2> </div> <div class="flex flex-wrap gap-2 px-5 sm:px-6 py-3 border-b border-surface-100 dark:border-surface-800 bg-surface-50/50 dark:bg-dark-surface-3/30"> <button @click="exFilter = 'all'; currentEx = 0" :class="exFilter === 'all' ? 'bg-orange-600 text-white shadow-[0_2px_0_0_#c2410c]' : 'bg-white dark:bg-dark-card text-surface-600 dark:text-surface-300 shadow-[0_2px_0_0_#d1d5db] dark:shadow-[0_2px_0_0_#374151]'" class="px-3 py-1.5 rounded-lg text-xs font-bold transition-all active:translate-y-[2px] active:shadow-none"> All (200) </button> <button @click="exFilter = 'fill_blank'; currentEx = 0" :class="exFilter === 'fill_blank' ? 'bg-orange-600 text-white shadow-[0_2px_0_0_#c2410c]' : 'bg-white dark:bg-dark-card text-surface-600 dark:text-surface-300 shadow-[0_2px_0_0_#d1d5db] dark:shadow-[0_2px_0_0_#374151]'" class="px-3 py-1.5 rounded-lg text-xs font-bold transition-all active:translate-y-[2px] active:shadow-none inline-flex items-center gap-1"> <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z"/></svg> Fill Blank (30) </button> <button @click="exFilter = 'multiple_choice'; currentEx = 0" :class="exFilter === 'multiple_choice' ? 'bg-orange-600 text-white shadow-[0_2px_0_0_#c2410c]' : 'bg-white dark:bg-dark-card text-surface-600 dark:text-surface-300 shadow-[0_2px_0_0_#d1d5db] dark:shadow-[0_2px_0_0_#374151]'" class="px-3 py-1.5 rounded-lg text-xs font-bold transition-all active:translate-y-[2px] active:shadow-none inline-flex items-center gap-1"> <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"/></svg> Multiple Choice (30) </button> <button @click="exFilter = 'true_false'; currentEx = 0" :class="exFilter === 'true_false' ? 'bg-orange-600 text-white shadow-[0_2px_0_0_#c2410c]' : 'bg-white dark:bg-dark-card text-surface-600 dark:text-surface-300 shadow-[0_2px_0_0_#d1d5db] dark:shadow-[0_2px_0_0_#374151]'" class="px-3 py-1.5 rounded-lg text-xs font-bold transition-all active:translate-y-[2px] active:shadow-none inline-flex items-center gap-1"> <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"/></svg> True / False (30) </button> <button @click="exFilter = 'writing'; currentEx = 0" :class="exFilter === 'writing' ? 'bg-orange-600 text-white shadow-[0_2px_0_0_#c2410c]' : 'bg-white dark:bg-dark-card text-surface-600 dark:text-surface-300 shadow-[0_2px_0_0_#d1d5db] dark:shadow-[0_2px_0_0_#374151]'" class="px-3 py-1.5 rounded-lg text-xs font-bold transition-all active:translate-y-[2px] active:shadow-none inline-flex items-center gap-1"> <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15.232 5.232l3.536 3.536m-2.036-5.036a2.5 2.5 0 113.536 3.536L6.5 21.036H3v-3.572L16.732 3.732z"/></svg> Writing (20) </button> <button @click="exFilter = 'reading'; currentEx = 0" :class="exFilter === 'reading' ? 'bg-orange-600 text-white shadow-[0_2px_0_0_#c2410c]' : 'bg-white dark:bg-dark-card text-surface-600 dark:text-surface-300 shadow-[0_2px_0_0_#d1d5db] dark:shadow-[0_2px_0_0_#374151]'" class="px-3 py-1.5 rounded-lg text-xs font-bold transition-all active:translate-y-[2px] active:shadow-none inline-flex items-center gap-1"> <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253"/></svg> Reading (20) </button> <button @click="exFilter = 'speaking'; currentEx = 0" :class="exFilter === 'speaking' ? 'bg-orange-600 text-white shadow-[0_2px_0_0_#c2410c]' : 'bg-white dark:bg-dark-card text-surface-600 dark:text-surface-300 shadow-[0_2px_0_0_#d1d5db] dark:shadow-[0_2px_0_0_#374151]'" class="px-3 py-1.5 rounded-lg text-xs font-bold transition-all active:translate-y-[2px] active:shadow-none inline-flex items-center gap-1"> <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 11a7 7 0 01-7 7m0 0a7 7 0 01-7-7m7 7v4m0 0H8m4 0h4m-4-8a3 3 0 01-3-3V5a3 3 0 116 0v6a3 3 0 01-3 3z"/></svg> Speaking (20) </button> <button @click="exFilter = 'listening'; currentEx = 0" :class="exFilter === 'listening' ? 'bg-orange-600 text-white shadow-[0_2px_0_0_#c2410c]' : 'bg-white dark:bg-dark-card text-surface-600 dark:text-surface-300 shadow-[0_2px_0_0_#d1d5db] dark:shadow-[0_2px_0_0_#374151]'" class="px-3 py-1.5 rounded-lg text-xs font-bold transition-all active:translate-y-[2px] active:shadow-none inline-flex items-center gap-1"> <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15.536 8.464a5 5 0 010 7.072m2.828-9.9a9 9 0 010 12.728M5.586 15H4a1 1 0 01-1-1v-4a1 1 0 011-1h1.586l4.707-4.707C10.923 3.663 12 4.109 12 5v14c0 .891-1.077 1.337-1.707.707L5.586 15z"/></svg> Listening (15) </button> <button @click="exFilter = 'sentence_order'; currentEx = 0" :class="exFilter === 'sentence_order' ? 'bg-orange-600 text-white shadow-[0_2px_0_0_#c2410c]' : 'bg-white dark:bg-dark-card text-surface-600 dark:text-surface-300 shadow-[0_2px_0_0_#d1d5db] dark:shadow-[0_2px_0_0_#374151]'" class="px-3 py-1.5 rounded-lg text-xs font-bold transition-all active:translate-y-[2px] active:shadow-none inline-flex items-center gap-1"> <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h7"/></svg> Word Order (15) </button> <button @click="exFilter = 'match_pairs'; currentEx = 0" :class="exFilter === 'match_pairs' ? 'bg-orange-600 text-white shadow-[0_2px_0_0_#c2410c]' : 'bg-white dark:bg-dark-card text-surface-600 dark:text-surface-300 shadow-[0_2px_0_0_#d1d5db] dark:shadow-[0_2px_0_0_#374151]'" class="px-3 py-1.5 rounded-lg text-xs font-bold transition-all active:translate-y-[2px] active:shadow-none inline-flex items-center gap-1"> <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1"/></svg> Match Pairs (10) </button> <button @click="exFilter = 'error_correction'; currentEx = 0" :class="exFilter === 'error_correction' ? 'bg-orange-600 text-white shadow-[0_2px_0_0_#c2410c]' : 'bg-white dark:bg-dark-card text-surface-600 dark:text-surface-300 shadow-[0_2px_0_0_#d1d5db] dark:shadow-[0_2px_0_0_#374151]'" class="px-3 py-1.5 rounded-lg text-xs font-bold transition-all active:translate-y-[2px] active:shadow-none inline-flex items-center gap-1"> Error correction (10) </button> </div> <div class="flex gap-1.5 px-5 sm:px-6 py-2.5 border-b border-surface-100 dark:border-surface-800"> <button @click="exLevel = 'all'" :class="exLevel === 'all' ? 'bg-brand-600 text-white' : 'bg-surface-100 dark:bg-surface-800 text-surface-600 dark:text-surface-300'" class="px-2.5 py-1 rounded-lg text-xs font-bold transition-all">All Levels</button> <button @click="exLevel = 'A1'" :class="exLevel === 'A1' ? 'bg-brand-600 text-white' : 'bg-surface-100 dark:bg-surface-800 text-surface-600 dark:text-surface-300'" class="px-2.5 py-1 rounded-lg text-xs font-bold transition-all">A1</button> <button @click="exLevel = 'A2'" :class="exLevel === 'A2' ? 'bg-brand-600 text-white' : 'bg-surface-100 dark:bg-surface-800 text-surface-600 dark:text-surface-300'" class="px-2.5 py-1 rounded-lg text-xs font-bold transition-all">A2</button> <button @click="exLevel = 'B1'" :class="exLevel === 'B1' ? 'bg-brand-600 text-white' : 'bg-surface-100 dark:bg-surface-800 text-surface-600 dark:text-surface-300'" class="px-2.5 py-1 rounded-lg text-xs font-bold transition-all">B1</button> <button @click="exLevel = 'B2'" :class="exLevel === 'B2' ? 'bg-brand-600 text-white' : 'bg-surface-100 dark:bg-surface-800 text-surface-600 dark:text-surface-300'" class="px-2.5 py-1 rounded-lg text-xs font-bold transition-all">B2</button> <button @click="exLevel = 'C1'" :class="exLevel === 'C1' ? 'bg-brand-600 text-white' : 'bg-surface-100 dark:bg-surface-800 text-surface-600 dark:text-surface-300'" class="px-2.5 py-1 rounded-lg text-xs font-bold transition-all">C1</button> <button @click="exLevel = 'C2'" :class="exLevel === 'C2' ? 'bg-brand-600 text-white' : 'bg-surface-100 dark:bg-surface-800 text-surface-600 dark:text-surface-300'" class="px-2.5 py-1 rounded-lg text-xs font-bold transition-all">C2</button> </div> <div class="p-5 sm:p-6"> <div class="space-y-6"> <div x-show="(exFilter === 'all' || exFilter === 'writing') && (exLevel === 'all' || exLevel === '')" x-cloak> <div class="p-5 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50 border-2 border-b-4 border-surface-200 dark:border-[#3b3755]"> <div class="flex items-center gap-2 mb-2"> <span class="inline-flex items-center px-2 py-0.5 rounded-md text-[10px] font-semibold uppercase tracking-wide bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-300"> writing </span> </div> <p class="text-lg font-semibold text-surface-900 dark:text-white mb-4">Write a sentence asking for the title of a book.</p> <div x-data="{ userText: '', checked: false, isCorrect: false, matchCount: 0 }" class="space-y-3"> <div class="p-3 rounded-xl bg-blue-50 dark:bg-blue-900/10 border border-blue-200 dark:border-blue-800"> <p class="text-surface-700 dark:text-surface-300"></p> </div> <textarea x-model="userText" :disabled="checked" rows="3" placeholder="Write your sentence here..." class="w-full px-4 py-3 rounded-xl border-2 border-surface-200 dark:border-surface-700 bg-white dark:bg-dark-card text-surface-900 dark:text-white focus:border-blue-400 focus:ring-2 focus:ring-blue-200 dark:focus:ring-blue-800 transition-all resize-none"></textarea> <button x-show="!checked && userText.trim().length > 10" x-cloak @click=" checked = true; const keywords = []; const lower = userText.toLowerCase(); matchCount = keywords.filter(k => lower.includes(k.toLowerCase())).length; isCorrect = matchCount >= Math.ceil(keywords.length * 0.5); answered[90] = true; correct[90] = isCorrect; if(isCorrect) score++; " class="px-4 py-2 rounded-xl text-sm font-bold bg-blue-600 text-white hover:bg-blue-700 shadow-[0_3px_0_0_#1e40af] active:translate-y-[3px] active:shadow-none transition-all"> Submit </button> <div x-show="checked" x-cloak class="text-sm space-y-2"> <p :class="isCorrect ? 'text-emerald-700 dark:text-emerald-300' : 'text-amber-700 dark:text-amber-300'"> <span x-show="isCorrect">Well written!</span> <span x-show="!isCorrect">Good try! Check the sample answer below.</span> <span class="text-surface-400" x-text="'(' + matchCount + '/0 keywords)'"></span> </p> <p class="text-surface-500">Uses the masculine genitive 'का'.</p> </div> </div> <div x-show="answered[90]" x-cloak class="mt-3 text-sm" :class="correct[90] ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="correct[90]">Correct!</span> <span x-show="!correct[90]">Not quite. Correct answer: <strong></strong></span> <p class="mt-1 text-surface-600 dark:text-surface-400">Uses the masculine genitive 'का'.</p> </div> </div> </div> <div x-show="(exFilter === 'all' || exFilter === 'writing') && (exLevel === 'all' || exLevel === '')" x-cloak> <div class="p-5 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50 border-2 border-b-4 border-surface-200 dark:border-[#3b3755]"> <div class="flex items-center gap-2 mb-2"> <span class="inline-flex items-center px-2 py-0.5 rounded-md text-[10px] font-semibold uppercase tracking-wide bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-300"> writing </span> </div> <p class="text-lg font-semibold text-surface-900 dark:text-white mb-4">Write a sentence stating that the title is very good.</p> <div x-data="{ userText: '', checked: false, isCorrect: false, matchCount: 0 }" class="space-y-3"> <div class="p-3 rounded-xl bg-blue-50 dark:bg-blue-900/10 border border-blue-200 dark:border-blue-800"> <p class="text-surface-700 dark:text-surface-300"></p> </div> <textarea x-model="userText" :disabled="checked" rows="3" placeholder="Write your sentence here..." class="w-full px-4 py-3 rounded-xl border-2 border-surface-200 dark:border-surface-700 bg-white dark:bg-dark-card text-surface-900 dark:text-white focus:border-blue-400 focus:ring-2 focus:ring-blue-200 dark:focus:ring-blue-800 transition-all resize-none"></textarea> <button x-show="!checked && userText.trim().length > 10" x-cloak @click=" checked = true; const keywords = []; const lower = userText.toLowerCase(); matchCount = keywords.filter(k => lower.includes(k.toLowerCase())).length; isCorrect = matchCount >= Math.ceil(keywords.length * 0.5); answered[91] = true; correct[91] = isCorrect; if(isCorrect) score++; " class="px-4 py-2 rounded-xl text-sm font-bold bg-blue-600 text-white hover:bg-blue-700 shadow-[0_3px_0_0_#1e40af] active:translate-y-[3px] active:shadow-none transition-all"> Submit </button> <div x-show="checked" x-cloak class="text-sm space-y-2"> <p :class="isCorrect ? 'text-emerald-700 dark:text-emerald-300' : 'text-amber-700 dark:text-amber-300'"> <span x-show="isCorrect">Well written!</span> <span x-show="!isCorrect">Good try! Check the sample answer below.</span> <span class="text-surface-400" x-text="'(' + matchCount + '/0 keywords)'"></span> </p> <p class="text-surface-500">Uses masculine adjective 'अच्छा'.</p> </div> </div> <div x-show="answered[91]" x-cloak class="mt-3 text-sm" :class="correct[91] ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="correct[91]">Correct!</span> <span x-show="!correct[91]">Not quite. Correct answer: <strong></strong></span> <p class="mt-1 text-surface-600 dark:text-surface-400">Uses masculine adjective 'अच्छा'.</p> </div> </div> </div> <div x-show="(exFilter === 'all' || exFilter === 'writing') && (exLevel === 'all' || exLevel === '')" x-cloak> <div class="p-5 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50 border-2 border-b-4 border-surface-200 dark:border-[#3b3755]"> <div class="flex items-center gap-2 mb-2"> <span class="inline-flex items-center px-2 py-0.5 rounded-md text-[10px] font-semibold uppercase tracking-wide bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-300"> writing </span> </div> <p class="text-lg font-semibold text-surface-900 dark:text-white mb-4">Translate: 'I need a title for my story.'</p> <div x-data="{ userText: '', checked: false, isCorrect: false, matchCount: 0 }" class="space-y-3"> <div class="p-3 rounded-xl bg-blue-50 dark:bg-blue-900/10 border border-blue-200 dark:border-blue-800"> <p class="text-surface-700 dark:text-surface-300"></p> </div> <textarea x-model="userText" :disabled="checked" rows="3" placeholder="Write your sentence here..." class="w-full px-4 py-3 rounded-xl border-2 border-surface-200 dark:border-surface-700 bg-white dark:bg-dark-card text-surface-900 dark:text-white focus:border-blue-400 focus:ring-2 focus:ring-blue-200 dark:focus:ring-blue-800 transition-all resize-none"></textarea> <button x-show="!checked && userText.trim().length > 10" x-cloak @click=" checked = true; const keywords = []; const lower = userText.toLowerCase(); matchCount = keywords.filter(k => lower.includes(k.toLowerCase())).length; isCorrect = matchCount >= Math.ceil(keywords.length * 0.5); answered[92] = true; correct[92] = isCorrect; if(isCorrect) score++; " class="px-4 py-2 rounded-xl text-sm font-bold bg-blue-600 text-white hover:bg-blue-700 shadow-[0_3px_0_0_#1e40af] active:translate-y-[3px] active:shadow-none transition-all"> Submit </button> <div x-show="checked" x-cloak class="text-sm space-y-2"> <p :class="isCorrect ? 'text-emerald-700 dark:text-emerald-300' : 'text-amber-700 dark:text-amber-300'"> <span x-show="isCorrect">Well written!</span> <span x-show="!isCorrect">Good try! Check the sample answer below.</span> <span class="text-surface-400" x-text="'(' + matchCount + '/0 keywords)'"></span> </p> <p class="text-surface-500">Uses 'चाहिए' structure.</p> </div> </div> <div x-show="answered[92]" x-cloak class="mt-3 text-sm" :class="correct[92] ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="correct[92]">Correct!</span> <span x-show="!correct[92]">Not quite. Correct answer: <strong></strong></span> <p class="mt-1 text-surface-600 dark:text-surface-400">Uses 'चाहिए' structure.</p> </div> </div> </div> <div x-show="(exFilter === 'all' || exFilter === 'writing') && (exLevel === 'all' || exLevel === '')" x-cloak> <div class="p-5 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50 border-2 border-b-4 border-surface-200 dark:border-[#3b3755]"> <div class="flex items-center gap-2 mb-2"> <span class="inline-flex items-center px-2 py-0.5 rounded-md text-[10px] font-semibold uppercase tracking-wide bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-300"> writing </span> </div> <p class="text-lg font-semibold text-surface-900 dark:text-white mb-4">Translate: 'The teacher wrote the title on the board.'</p> <div x-data="{ userText: '', checked: false, isCorrect: false, matchCount: 0 }" class="space-y-3"> <div class="p-3 rounded-xl bg-blue-50 dark:bg-blue-900/10 border border-blue-200 dark:border-blue-800"> <p class="text-surface-700 dark:text-surface-300"></p> </div> <textarea x-model="userText" :disabled="checked" rows="3" placeholder="Write your sentence here..." class="w-full px-4 py-3 rounded-xl border-2 border-surface-200 dark:border-surface-700 bg-white dark:bg-dark-card text-surface-900 dark:text-white focus:border-blue-400 focus:ring-2 focus:ring-blue-200 dark:focus:ring-blue-800 transition-all resize-none"></textarea> <button x-show="!checked && userText.trim().length > 10" x-cloak @click=" checked = true; const keywords = []; const lower = userText.toLowerCase(); matchCount = keywords.filter(k => lower.includes(k.toLowerCase())).length; isCorrect = matchCount >= Math.ceil(keywords.length * 0.5); answered[93] = true; correct[93] = isCorrect; if(isCorrect) score++; " class="px-4 py-2 rounded-xl text-sm font-bold bg-blue-600 text-white hover:bg-blue-700 shadow-[0_3px_0_0_#1e40af] active:translate-y-[3px] active:shadow-none transition-all"> Submit </button> <div x-show="checked" x-cloak class="text-sm space-y-2"> <p :class="isCorrect ? 'text-emerald-700 dark:text-emerald-300' : 'text-amber-700 dark:text-amber-300'"> <span x-show="isCorrect">Well written!</span> <span x-show="!isCorrect">Good try! Check the sample answer below.</span> <span class="text-surface-400" x-text="'(' + matchCount + '/0 keywords)'"></span> </p> <p class="text-surface-500">Past tense with 'ने'.</p> </div> </div> <div x-show="answered[93]" x-cloak class="mt-3 text-sm" :class="correct[93] ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="correct[93]">Correct!</span> <span x-show="!correct[93]">Not quite. Correct answer: <strong></strong></span> <p class="mt-1 text-surface-600 dark:text-surface-400">Past tense with 'ने'.</p> </div> </div> </div> <div x-show="(exFilter === 'all' || exFilter === 'writing') && (exLevel === 'all' || exLevel === '')" x-cloak> <div class="p-5 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50 border-2 border-b-4 border-surface-200 dark:border-[#3b3755]"> <div class="flex items-center gap-2 mb-2"> <span class="inline-flex items-center px-2 py-0.5 rounded-md text-[10px] font-semibold uppercase tracking-wide bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-300"> writing </span> </div> <p class="text-lg font-semibold text-surface-900 dark:text-white mb-4">Write a sentence using the word 'उपशीर्षक' (subheading).</p> <div x-data="{ userText: '', checked: false, isCorrect: false, matchCount: 0 }" class="space-y-3"> <div class="p-3 rounded-xl bg-blue-50 dark:bg-blue-900/10 border border-blue-200 dark:border-blue-800"> <p class="text-surface-700 dark:text-surface-300"></p> </div> <textarea x-model="userText" :disabled="checked" rows="3" placeholder="Write your sentence here..." class="w-full px-4 py-3 rounded-xl border-2 border-surface-200 dark:border-surface-700 bg-white dark:bg-dark-card text-surface-900 dark:text-white focus:border-blue-400 focus:ring-2 focus:ring-blue-200 dark:focus:ring-blue-800 transition-all resize-none"></textarea> <button x-show="!checked && userText.trim().length > 10" x-cloak @click=" checked = true; const keywords = []; const lower = userText.toLowerCase(); matchCount = keywords.filter(k => lower.includes(k.toLowerCase())).length; isCorrect = matchCount >= Math.ceil(keywords.length * 0.5); answered[94] = true; correct[94] = isCorrect; if(isCorrect) score++; " class="px-4 py-2 rounded-xl text-sm font-bold bg-blue-600 text-white hover:bg-blue-700 shadow-[0_3px_0_0_#1e40af] active:translate-y-[3px] active:shadow-none transition-all"> Submit </button> <div x-show="checked" x-cloak class="text-sm space-y-2"> <p :class="isCorrect ? 'text-emerald-700 dark:text-emerald-300' : 'text-amber-700 dark:text-amber-300'"> <span x-show="isCorrect">Well written!</span> <span x-show="!isCorrect">Good try! Check the sample answer below.</span> <span class="text-surface-400" x-text="'(' + matchCount + '/0 keywords)'"></span> </p> <p class="text-surface-500">Simple sentence indicating presence.</p> </div> </div> <div x-show="answered[94]" x-cloak class="mt-3 text-sm" :class="correct[94] ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="correct[94]">Correct!</span> <span x-show="!correct[94]">Not quite. Correct answer: <strong></strong></span> <p class="mt-1 text-surface-600 dark:text-surface-400">Simple sentence indicating presence.</p> </div> </div> </div> <div x-show="(exFilter === 'all' || exFilter === 'writing') && (exLevel === 'all' || exLevel === '')" x-cloak> <div class="p-5 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50 border-2 border-b-4 border-surface-200 dark:border-[#3b3755]"> <div class="flex items-center gap-2 mb-2"> <span class="inline-flex items-center px-2 py-0.5 rounded-md text-[10px] font-semibold uppercase tracking-wide bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-300"> writing </span> </div> <p class="text-lg font-semibold text-surface-900 dark:text-white mb-4">Translate: 'This is a catchy title.'</p> <div x-data="{ userText: '', checked: false, isCorrect: false, matchCount: 0 }" class="space-y-3"> <div class="p-3 rounded-xl bg-blue-50 dark:bg-blue-900/10 border border-blue-200 dark:border-blue-800"> <p class="text-surface-700 dark:text-surface-300"></p> </div> <textarea x-model="userText" :disabled="checked" rows="3" placeholder="Write your sentence here..." class="w-full px-4 py-3 rounded-xl border-2 border-surface-200 dark:border-surface-700 bg-white dark:bg-dark-card text-surface-900 dark:text-white focus:border-blue-400 focus:ring-2 focus:ring-blue-200 dark:focus:ring-blue-800 transition-all resize-none"></textarea> <button x-show="!checked && userText.trim().length > 10" x-cloak @click=" checked = true; const keywords = []; const lower = userText.toLowerCase(); matchCount = keywords.filter(k => lower.includes(k.toLowerCase())).length; isCorrect = matchCount >= Math.ceil(keywords.length * 0.5); answered[95] = true; correct[95] = isCorrect; if(isCorrect) score++; " class="px-4 py-2 rounded-xl text-sm font-bold bg-blue-600 text-white hover:bg-blue-700 shadow-[0_3px_0_0_#1e40af] active:translate-y-[3px] active:shadow-none transition-all"> Submit </button> <div x-show="checked" x-cloak class="text-sm space-y-2"> <p :class="isCorrect ? 'text-emerald-700 dark:text-emerald-300' : 'text-amber-700 dark:text-amber-300'"> <span x-show="isCorrect">Well written!</span> <span x-show="!isCorrect">Good try! Check the sample answer below.</span> <span class="text-surface-400" x-text="'(' + matchCount + '/0 keywords)'"></span> </p> <p class="text-surface-500">Uses 'आकर्षक' for catchy.</p> </div> </div> <div x-show="answered[95]" x-cloak class="mt-3 text-sm" :class="correct[95] ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="correct[95]">Correct!</span> <span x-show="!correct[95]">Not quite. Correct answer: <strong></strong></span> <p class="mt-1 text-surface-600 dark:text-surface-400">Uses 'आकर्षक' for catchy.</p> </div> </div> </div> <div x-show="(exFilter === 'all' || exFilter === 'writing') && (exLevel === 'all' || exLevel === '')" x-cloak> <div class="p-5 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50 border-2 border-b-4 border-surface-200 dark:border-[#3b3755]"> <div class="flex items-center gap-2 mb-2"> <span class="inline-flex items-center px-2 py-0.5 rounded-md text-[10px] font-semibold uppercase tracking-wide bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-300"> writing </span> </div> <p class="text-lg font-semibold text-surface-900 dark:text-white mb-4">Translate: 'Give a suitable title to this passage.'</p> <div x-data="{ userText: '', checked: false, isCorrect: false, matchCount: 0 }" class="space-y-3"> <div class="p-3 rounded-xl bg-blue-50 dark:bg-blue-900/10 border border-blue-200 dark:border-blue-800"> <p class="text-surface-700 dark:text-surface-300"></p> </div> <textarea x-model="userText" :disabled="checked" rows="3" placeholder="Write your sentence here..." class="w-full px-4 py-3 rounded-xl border-2 border-surface-200 dark:border-surface-700 bg-white dark:bg-dark-card text-surface-900 dark:text-white focus:border-blue-400 focus:ring-2 focus:ring-blue-200 dark:focus:ring-blue-800 transition-all resize-none"></textarea> <button x-show="!checked && userText.trim().length > 10" x-cloak @click=" checked = true; const keywords = []; const lower = userText.toLowerCase(); matchCount = keywords.filter(k => lower.includes(k.toLowerCase())).length; isCorrect = matchCount >= Math.ceil(keywords.length * 0.5); answered[96] = true; correct[96] = isCorrect; if(isCorrect) score++; " class="px-4 py-2 rounded-xl text-sm font-bold bg-blue-600 text-white hover:bg-blue-700 shadow-[0_3px_0_0_#1e40af] active:translate-y-[3px] active:shadow-none transition-all"> Submit </button> <div x-show="checked" x-cloak class="text-sm space-y-2"> <p :class="isCorrect ? 'text-emerald-700 dark:text-emerald-300' : 'text-amber-700 dark:text-amber-300'"> <span x-show="isCorrect">Well written!</span> <span x-show="!isCorrect">Good try! Check the sample answer below.</span> <span class="text-surface-400" x-text="'(' + matchCount + '/0 keywords)'"></span> </p> <p class="text-surface-500">Standard exam instruction.</p> </div> </div> <div x-show="answered[96]" x-cloak class="mt-3 text-sm" :class="correct[96] ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="correct[96]">Correct!</span> <span x-show="!correct[96]">Not quite. Correct answer: <strong></strong></span> <p class="mt-1 text-surface-600 dark:text-surface-400">Standard exam instruction.</p> </div> </div> </div> <div x-show="(exFilter === 'all' || exFilter === 'writing') && (exLevel === 'all' || exLevel === '')" x-cloak> <div class="p-5 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50 border-2 border-b-4 border-surface-200 dark:border-[#3b3755]"> <div class="flex items-center gap-2 mb-2"> <span class="inline-flex items-center px-2 py-0.5 rounded-md text-[10px] font-semibold uppercase tracking-wide bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-300"> writing </span> </div> <p class="text-lg font-semibold text-surface-900 dark:text-white mb-4">Write a sentence stating you forgot the title of the movie.</p> <div x-data="{ userText: '', checked: false, isCorrect: false, matchCount: 0 }" class="space-y-3"> <div class="p-3 rounded-xl bg-blue-50 dark:bg-blue-900/10 border border-blue-200 dark:border-blue-800"> <p class="text-surface-700 dark:text-surface-300"></p> </div> <textarea x-model="userText" :disabled="checked" rows="3" placeholder="Write your sentence here..." class="w-full px-4 py-3 rounded-xl border-2 border-surface-200 dark:border-surface-700 bg-white dark:bg-dark-card text-surface-900 dark:text-white focus:border-blue-400 focus:ring-2 focus:ring-blue-200 dark:focus:ring-blue-800 transition-all resize-none"></textarea> <button x-show="!checked && userText.trim().length > 10" x-cloak @click=" checked = true; const keywords = []; const lower = userText.toLowerCase(); matchCount = keywords.filter(k => lower.includes(k.toLowerCase())).length; isCorrect = matchCount >= Math.ceil(keywords.length * 0.5); answered[97] = true; correct[97] = isCorrect; if(isCorrect) score++; " class="px-4 py-2 rounded-xl text-sm font-bold bg-blue-600 text-white hover:bg-blue-700 shadow-[0_3px_0_0_#1e40af] active:translate-y-[3px] active:shadow-none transition-all"> Submit </button> <div x-show="checked" x-cloak class="text-sm space-y-2"> <p :class="isCorrect ? 'text-emerald-700 dark:text-emerald-300' : 'text-amber-700 dark:text-amber-300'"> <span x-show="isCorrect">Well written!</span> <span x-show="!isCorrect">Good try! Check the sample answer below.</span> <span class="text-surface-400" x-text="'(' + matchCount + '/0 keywords)'"></span> </p> <p class="text-surface-500">Uses 'भूल गया' (forgot).</p> </div> </div> <div x-show="answered[97]" x-cloak class="mt-3 text-sm" :class="correct[97] ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="correct[97]">Correct!</span> <span x-show="!correct[97]">Not quite. Correct answer: <strong></strong></span> <p class="mt-1 text-surface-600 dark:text-surface-400">Uses 'भूल गया' (forgot).</p> </div> </div> </div> <div x-show="(exFilter === 'all' || exFilter === 'writing') && (exLevel === 'all' || exLevel === '')" x-cloak> <div class="p-5 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50 border-2 border-b-4 border-surface-200 dark:border-[#3b3755]"> <div class="flex items-center gap-2 mb-2"> <span class="inline-flex items-center px-2 py-0.5 rounded-md text-[10px] font-semibold uppercase tracking-wide bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-300"> writing </span> </div> <p class="text-lg font-semibold text-surface-900 dark:text-white mb-4">Translate: 'The title of the poem is Hope.'</p> <div x-data="{ userText: '', checked: false, isCorrect: false, matchCount: 0 }" class="space-y-3"> <div class="p-3 rounded-xl bg-blue-50 dark:bg-blue-900/10 border border-blue-200 dark:border-blue-800"> <p class="text-surface-700 dark:text-surface-300"></p> </div> <textarea x-model="userText" :disabled="checked" rows="3" placeholder="Write your sentence here..." class="w-full px-4 py-3 rounded-xl border-2 border-surface-200 dark:border-surface-700 bg-white dark:bg-dark-card text-surface-900 dark:text-white focus:border-blue-400 focus:ring-2 focus:ring-blue-200 dark:focus:ring-blue-800 transition-all resize-none"></textarea> <button x-show="!checked && userText.trim().length > 10" x-cloak @click=" checked = true; const keywords = []; const lower = userText.toLowerCase(); matchCount = keywords.filter(k => lower.includes(k.toLowerCase())).length; isCorrect = matchCount >= Math.ceil(keywords.length * 0.5); answered[98] = true; correct[98] = isCorrect; if(isCorrect) score++; " class="px-4 py-2 rounded-xl text-sm font-bold bg-blue-600 text-white hover:bg-blue-700 shadow-[0_3px_0_0_#1e40af] active:translate-y-[3px] active:shadow-none transition-all"> Submit </button> <div x-show="checked" x-cloak class="text-sm space-y-2"> <p :class="isCorrect ? 'text-emerald-700 dark:text-emerald-300' : 'text-amber-700 dark:text-amber-300'"> <span x-show="isCorrect">Well written!</span> <span x-show="!isCorrect">Good try! Check the sample answer below.</span> <span class="text-surface-400" x-text="'(' + matchCount + '/0 keywords)'"></span> </p> <p class="text-surface-500">Simple equational sentence.</p> </div> </div> <div x-show="answered[98]" x-cloak class="mt-3 text-sm" :class="correct[98] ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="correct[98]">Correct!</span> <span x-show="!correct[98]">Not quite. Correct answer: <strong></strong></span> <p class="mt-1 text-surface-600 dark:text-surface-400">Simple equational sentence.</p> </div> </div> </div> <div x-show="(exFilter === 'all' || exFilter === 'writing') && (exLevel === 'all' || exLevel === '')" x-cloak> <div class="p-5 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50 border-2 border-b-4 border-surface-200 dark:border-[#3b3755]"> <div class="flex items-center gap-2 mb-2"> <span class="inline-flex items-center px-2 py-0.5 rounded-md text-[10px] font-semibold uppercase tracking-wide bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-300"> writing </span> </div> <p class="text-lg font-semibold text-surface-900 dark:text-white mb-4">Translate: 'He changed the title.'</p> <div x-data="{ userText: '', checked: false, isCorrect: false, matchCount: 0 }" class="space-y-3"> <div class="p-3 rounded-xl bg-blue-50 dark:bg-blue-900/10 border border-blue-200 dark:border-blue-800"> <p class="text-surface-700 dark:text-surface-300"></p> </div> <textarea x-model="userText" :disabled="checked" rows="3" placeholder="Write your sentence here..." class="w-full px-4 py-3 rounded-xl border-2 border-surface-200 dark:border-surface-700 bg-white dark:bg-dark-card text-surface-900 dark:text-white focus:border-blue-400 focus:ring-2 focus:ring-blue-200 dark:focus:ring-blue-800 transition-all resize-none"></textarea> <button x-show="!checked && userText.trim().length > 10" x-cloak @click=" checked = true; const keywords = []; const lower = userText.toLowerCase(); matchCount = keywords.filter(k => lower.includes(k.toLowerCase())).length; isCorrect = matchCount >= Math.ceil(keywords.length * 0.5); answered[99] = true; correct[99] = isCorrect; if(isCorrect) score++; " class="px-4 py-2 rounded-xl text-sm font-bold bg-blue-600 text-white hover:bg-blue-700 shadow-[0_3px_0_0_#1e40af] active:translate-y-[3px] active:shadow-none transition-all"> Submit </button> <div x-show="checked" x-cloak class="text-sm space-y-2"> <p :class="isCorrect ? 'text-emerald-700 dark:text-emerald-300' : 'text-amber-700 dark:text-amber-300'"> <span x-show="isCorrect">Well written!</span> <span x-show="!isCorrect">Good try! Check the sample answer below.</span> <span class="text-surface-400" x-text="'(' + matchCount + '/0 keywords)'"></span> </p> <p class="text-surface-500">Uses compound verb 'बदल दिया'.</p> </div> </div> <div x-show="answered[99]" x-cloak class="mt-3 text-sm" :class="correct[99] ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="correct[99]">Correct!</span> <span x-show="!correct[99]">Not quite. Correct answer: <strong></strong></span> <p class="mt-1 text-surface-600 dark:text-surface-400">Uses compound verb 'बदल दिया'.</p> </div> </div> </div> <div x-show="(exFilter === 'all' || exFilter === 'writing') && (exLevel === 'all' || exLevel === '')" x-cloak> <div class="p-5 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50 border-2 border-b-4 border-surface-200 dark:border-[#3b3755]"> <div class="flex items-center gap-2 mb-2"> <span class="inline-flex items-center px-2 py-0.5 rounded-md text-[10px] font-semibold uppercase tracking-wide bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-300"> writing </span> </div> <p class="text-lg font-semibold text-surface-900 dark:text-white mb-4">Write a sentence using 'मुख्य शीर्षक' (main heading).</p> <div x-data="{ userText: '', checked: false, isCorrect: false, matchCount: 0 }" class="space-y-3"> <div class="p-3 rounded-xl bg-blue-50 dark:bg-blue-900/10 border border-blue-200 dark:border-blue-800"> <p class="text-surface-700 dark:text-surface-300"></p> </div> <textarea x-model="userText" :disabled="checked" rows="3" placeholder="Write your sentence here..." class="w-full px-4 py-3 rounded-xl border-2 border-surface-200 dark:border-surface-700 bg-white dark:bg-dark-card text-surface-900 dark:text-white focus:border-blue-400 focus:ring-2 focus:ring-blue-200 dark:focus:ring-blue-800 transition-all resize-none"></textarea> <button x-show="!checked && userText.trim().length > 10" x-cloak @click=" checked = true; const keywords = []; const lower = userText.toLowerCase(); matchCount = keywords.filter(k => lower.includes(k.toLowerCase())).length; isCorrect = matchCount >= Math.ceil(keywords.length * 0.5); answered[100] = true; correct[100] = isCorrect; if(isCorrect) score++; " class="px-4 py-2 rounded-xl text-sm font-bold bg-blue-600 text-white hover:bg-blue-700 shadow-[0_3px_0_0_#1e40af] active:translate-y-[3px] active:shadow-none transition-all"> Submit </button> <div x-show="checked" x-cloak class="text-sm space-y-2"> <p :class="isCorrect ? 'text-emerald-700 dark:text-emerald-300' : 'text-amber-700 dark:text-amber-300'"> <span x-show="isCorrect">Well written!</span> <span x-show="!isCorrect">Good try! Check the sample answer below.</span> <span class="text-surface-400" x-text="'(' + matchCount + '/0 keywords)'"></span> </p> <p class="text-surface-500">Describes the main heading.</p> </div> </div> <div x-show="answered[100]" x-cloak class="mt-3 text-sm" :class="correct[100] ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="correct[100]">Correct!</span> <span x-show="!correct[100]">Not quite. Correct answer: <strong></strong></span> <p class="mt-1 text-surface-600 dark:text-surface-400">Describes the main heading.</p> </div> </div> </div> <div x-show="(exFilter === 'all' || exFilter === 'writing') && (exLevel === 'all' || exLevel === '')" x-cloak> <div class="p-5 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50 border-2 border-b-4 border-surface-200 dark:border-[#3b3755]"> <div class="flex items-center gap-2 mb-2"> <span class="inline-flex items-center px-2 py-0.5 rounded-md text-[10px] font-semibold uppercase tracking-wide bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-300"> writing </span> </div> <p class="text-lg font-semibold text-surface-900 dark:text-white mb-4">Translate: 'Read the title aloud.'</p> <div x-data="{ userText: '', checked: false, isCorrect: false, matchCount: 0 }" class="space-y-3"> <div class="p-3 rounded-xl bg-blue-50 dark:bg-blue-900/10 border border-blue-200 dark:border-blue-800"> <p class="text-surface-700 dark:text-surface-300"></p> </div> <textarea x-model="userText" :disabled="checked" rows="3" placeholder="Write your sentence here..." class="w-full px-4 py-3 rounded-xl border-2 border-surface-200 dark:border-surface-700 bg-white dark:bg-dark-card text-surface-900 dark:text-white focus:border-blue-400 focus:ring-2 focus:ring-blue-200 dark:focus:ring-blue-800 transition-all resize-none"></textarea> <button x-show="!checked && userText.trim().length > 10" x-cloak @click=" checked = true; const keywords = []; const lower = userText.toLowerCase(); matchCount = keywords.filter(k => lower.includes(k.toLowerCase())).length; isCorrect = matchCount >= Math.ceil(keywords.length * 0.5); answered[101] = true; correct[101] = isCorrect; if(isCorrect) score++; " class="px-4 py-2 rounded-xl text-sm font-bold bg-blue-600 text-white hover:bg-blue-700 shadow-[0_3px_0_0_#1e40af] active:translate-y-[3px] active:shadow-none transition-all"> Submit </button> <div x-show="checked" x-cloak class="text-sm space-y-2"> <p :class="isCorrect ? 'text-emerald-700 dark:text-emerald-300' : 'text-amber-700 dark:text-amber-300'"> <span x-show="isCorrect">Well written!</span> <span x-show="!isCorrect">Good try! Check the sample answer below.</span> <span class="text-surface-400" x-text="'(' + matchCount + '/0 keywords)'"></span> </p> <p class="text-surface-500">Imperative sentence.</p> </div> </div> <div x-show="answered[101]" x-cloak class="mt-3 text-sm" :class="correct[101] ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="correct[101]">Correct!</span> <span x-show="!correct[101]">Not quite. Correct answer: <strong></strong></span> <p class="mt-1 text-surface-600 dark:text-surface-400">Imperative sentence.</p> </div> </div> </div> <div x-show="(exFilter === 'all' || exFilter === 'writing') && (exLevel === 'all' || exLevel === '')" x-cloak> <div class="p-5 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50 border-2 border-b-4 border-surface-200 dark:border-[#3b3755]"> <div class="flex items-center gap-2 mb-2"> <span class="inline-flex items-center px-2 py-0.5 rounded-md text-[10px] font-semibold uppercase tracking-wide bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-300"> writing </span> </div> <p class="text-lg font-semibold text-surface-900 dark:text-white mb-4">Translate: 'The title is misleading.'</p> <div x-data="{ userText: '', checked: false, isCorrect: false, matchCount: 0 }" class="space-y-3"> <div class="p-3 rounded-xl bg-blue-50 dark:bg-blue-900/10 border border-blue-200 dark:border-blue-800"> <p class="text-surface-700 dark:text-surface-300"></p> </div> <textarea x-model="userText" :disabled="checked" rows="3" placeholder="Write your sentence here..." class="w-full px-4 py-3 rounded-xl border-2 border-surface-200 dark:border-surface-700 bg-white dark:bg-dark-card text-surface-900 dark:text-white focus:border-blue-400 focus:ring-2 focus:ring-blue-200 dark:focus:ring-blue-800 transition-all resize-none"></textarea> <button x-show="!checked && userText.trim().length > 10" x-cloak @click=" checked = true; const keywords = []; const lower = userText.toLowerCase(); matchCount = keywords.filter(k => lower.includes(k.toLowerCase())).length; isCorrect = matchCount >= Math.ceil(keywords.length * 0.5); answered[102] = true; correct[102] = isCorrect; if(isCorrect) score++; " class="px-4 py-2 rounded-xl text-sm font-bold bg-blue-600 text-white hover:bg-blue-700 shadow-[0_3px_0_0_#1e40af] active:translate-y-[3px] active:shadow-none transition-all"> Submit </button> <div x-show="checked" x-cloak class="text-sm space-y-2"> <p :class="isCorrect ? 'text-emerald-700 dark:text-emerald-300' : 'text-amber-700 dark:text-amber-300'"> <span x-show="isCorrect">Well written!</span> <span x-show="!isCorrect">Good try! Check the sample answer below.</span> <span class="text-surface-400" x-text="'(' + matchCount + '/0 keywords)'"></span> </p> <p class="text-surface-500">Uses 'भ्रामक'.</p> </div> </div> <div x-show="answered[102]" x-cloak class="mt-3 text-sm" :class="correct[102] ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="correct[102]">Correct!</span> <span x-show="!correct[102]">Not quite. Correct answer: <strong></strong></span> <p class="mt-1 text-surface-600 dark:text-surface-400">Uses 'भ्रामक'.</p> </div> </div> </div> <div x-show="(exFilter === 'all' || exFilter === 'writing') && (exLevel === 'all' || exLevel === '')" x-cloak> <div class="p-5 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50 border-2 border-b-4 border-surface-200 dark:border-[#3b3755]"> <div class="flex items-center gap-2 mb-2"> <span class="inline-flex items-center px-2 py-0.5 rounded-md text-[10px] font-semibold uppercase tracking-wide bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-300"> writing </span> </div> <p class="text-lg font-semibold text-surface-900 dark:text-white mb-4">Write a sentence about a YouTube video title.</p> <div x-data="{ userText: '', checked: false, isCorrect: false, matchCount: 0 }" class="space-y-3"> <div class="p-3 rounded-xl bg-blue-50 dark:bg-blue-900/10 border border-blue-200 dark:border-blue-800"> <p class="text-surface-700 dark:text-surface-300"></p> </div> <textarea x-model="userText" :disabled="checked" rows="3" placeholder="Write your sentence here..." class="w-full px-4 py-3 rounded-xl border-2 border-surface-200 dark:border-surface-700 bg-white dark:bg-dark-card text-surface-900 dark:text-white focus:border-blue-400 focus:ring-2 focus:ring-blue-200 dark:focus:ring-blue-800 transition-all resize-none"></textarea> <button x-show="!checked && userText.trim().length > 10" x-cloak @click=" checked = true; const keywords = []; const lower = userText.toLowerCase(); matchCount = keywords.filter(k => lower.includes(k.toLowerCase())).length; isCorrect = matchCount >= Math.ceil(keywords.length * 0.5); answered[103] = true; correct[103] = isCorrect; if(isCorrect) score++; " class="px-4 py-2 rounded-xl text-sm font-bold bg-blue-600 text-white hover:bg-blue-700 shadow-[0_3px_0_0_#1e40af] active:translate-y-[3px] active:shadow-none transition-all"> Submit </button> <div x-show="checked" x-cloak class="text-sm space-y-2"> <p :class="isCorrect ? 'text-emerald-700 dark:text-emerald-300' : 'text-amber-700 dark:text-amber-300'"> <span x-show="isCorrect">Well written!</span> <span x-show="!isCorrect">Good try! Check the sample answer below.</span> <span class="text-surface-400" x-text="'(' + matchCount + '/0 keywords)'"></span> </p> <p class="text-surface-500">Describes the length of the title.</p> </div> </div> <div x-show="answered[103]" x-cloak class="mt-3 text-sm" :class="correct[103] ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="correct[103]">Correct!</span> <span x-show="!correct[103]">Not quite. Correct answer: <strong></strong></span> <p class="mt-1 text-surface-600 dark:text-surface-400">Describes the length of the title.</p> </div> </div> </div> <div x-show="(exFilter === 'all' || exFilter === 'writing') && (exLevel === 'all' || exLevel === '')" x-cloak> <div class="p-5 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50 border-2 border-b-4 border-surface-200 dark:border-[#3b3755]"> <div class="flex items-center gap-2 mb-2"> <span class="inline-flex items-center px-2 py-0.5 rounded-md text-[10px] font-semibold uppercase tracking-wide bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-300"> writing </span> </div> <p class="text-lg font-semibold text-surface-900 dark:text-white mb-4">Translate: 'Untitled story'</p> <div x-data="{ userText: '', checked: false, isCorrect: false, matchCount: 0 }" class="space-y-3"> <div class="p-3 rounded-xl bg-blue-50 dark:bg-blue-900/10 border border-blue-200 dark:border-blue-800"> <p class="text-surface-700 dark:text-surface-300"></p> </div> <textarea x-model="userText" :disabled="checked" rows="3" placeholder="Write your sentence here..." class="w-full px-4 py-3 rounded-xl border-2 border-surface-200 dark:border-surface-700 bg-white dark:bg-dark-card text-surface-900 dark:text-white focus:border-blue-400 focus:ring-2 focus:ring-blue-200 dark:focus:ring-blue-800 transition-all resize-none"></textarea> <button x-show="!checked && userText.trim().length > 10" x-cloak @click=" checked = true; const keywords = []; const lower = userText.toLowerCase(); matchCount = keywords.filter(k => lower.includes(k.toLowerCase())).length; isCorrect = matchCount >= Math.ceil(keywords.length * 0.5); answered[104] = true; correct[104] = isCorrect; if(isCorrect) score++; " class="px-4 py-2 rounded-xl text-sm font-bold bg-blue-600 text-white hover:bg-blue-700 shadow-[0_3px_0_0_#1e40af] active:translate-y-[3px] active:shadow-none transition-all"> Submit </button> <div x-show="checked" x-cloak class="text-sm space-y-2"> <p :class="isCorrect ? 'text-emerald-700 dark:text-emerald-300' : 'text-amber-700 dark:text-amber-300'"> <span x-show="isCorrect">Well written!</span> <span x-show="!isCorrect">Good try! Check the sample answer below.</span> <span class="text-surface-400" x-text="'(' + matchCount + '/0 keywords)'"></span> </p> <p class="text-surface-500">Uses 'बिना शीर्षक की' modifying the feminine 'कहानी'.</p> </div> </div> <div x-show="answered[104]" x-cloak class="mt-3 text-sm" :class="correct[104] ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="correct[104]">Correct!</span> <span x-show="!correct[104]">Not quite. Correct answer: <strong></strong></span> <p class="mt-1 text-surface-600 dark:text-surface-400">Uses 'बिना शीर्षक की' modifying the feminine 'कहानी'.</p> </div> </div> </div> <div x-show="(exFilter === 'all' || exFilter === 'writing') && (exLevel === 'all' || exLevel === '')" x-cloak> <div class="p-5 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50 border-2 border-b-4 border-surface-200 dark:border-[#3b3755]"> <div class="flex items-center gap-2 mb-2"> <span class="inline-flex items-center px-2 py-0.5 rounded-md text-[10px] font-semibold uppercase tracking-wide bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-300"> writing </span> </div> <p class="text-lg font-semibold text-surface-900 dark:text-white mb-4">Translate: 'According to the title...'</p> <div x-data="{ userText: '', checked: false, isCorrect: false, matchCount: 0 }" class="space-y-3"> <div class="p-3 rounded-xl bg-blue-50 dark:bg-blue-900/10 border border-blue-200 dark:border-blue-800"> <p class="text-surface-700 dark:text-surface-300"></p> </div> <textarea x-model="userText" :disabled="checked" rows="3" placeholder="Write your sentence here..." class="w-full px-4 py-3 rounded-xl border-2 border-surface-200 dark:border-surface-700 bg-white dark:bg-dark-card text-surface-900 dark:text-white focus:border-blue-400 focus:ring-2 focus:ring-blue-200 dark:focus:ring-blue-800 transition-all resize-none"></textarea> <button x-show="!checked && userText.trim().length > 10" x-cloak @click=" checked = true; const keywords = []; const lower = userText.toLowerCase(); matchCount = keywords.filter(k => lower.includes(k.toLowerCase())).length; isCorrect = matchCount >= Math.ceil(keywords.length * 0.5); answered[105] = true; correct[105] = isCorrect; if(isCorrect) score++; " class="px-4 py-2 rounded-xl text-sm font-bold bg-blue-600 text-white hover:bg-blue-700 shadow-[0_3px_0_0_#1e40af] active:translate-y-[3px] active:shadow-none transition-all"> Submit </button> <div x-show="checked" x-cloak class="text-sm space-y-2"> <p :class="isCorrect ? 'text-emerald-700 dark:text-emerald-300' : 'text-amber-700 dark:text-amber-300'"> <span x-show="isCorrect">Well written!</span> <span x-show="!isCorrect">Good try! Check the sample answer below.</span> <span class="text-surface-400" x-text="'(' + matchCount + '/0 keywords)'"></span> </p> <p class="text-surface-500">Uses 'के अनुसार'.</p> </div> </div> <div x-show="answered[105]" x-cloak class="mt-3 text-sm" :class="correct[105] ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="correct[105]">Correct!</span> <span x-show="!correct[105]">Not quite. Correct answer: <strong></strong></span> <p class="mt-1 text-surface-600 dark:text-surface-400">Uses 'के अनुसार'.</p> </div> </div> </div> <div x-show="(exFilter === 'all' || exFilter === 'writing') && (exLevel === 'all' || exLevel === '')" x-cloak> <div class="p-5 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50 border-2 border-b-4 border-surface-200 dark:border-[#3b3755]"> <div class="flex items-center gap-2 mb-2"> <span class="inline-flex items-center px-2 py-0.5 rounded-md text-[10px] font-semibold uppercase tracking-wide bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-300"> writing </span> </div> <p class="text-lg font-semibold text-surface-900 dark:text-white mb-4">Write a sentence using 'शीर्षकों' (plural oblique).</p> <div x-data="{ userText: '', checked: false, isCorrect: false, matchCount: 0 }" class="space-y-3"> <div class="p-3 rounded-xl bg-blue-50 dark:bg-blue-900/10 border border-blue-200 dark:border-blue-800"> <p class="text-surface-700 dark:text-surface-300"></p> </div> <textarea x-model="userText" :disabled="checked" rows="3" placeholder="Write your sentence here..." class="w-full px-4 py-3 rounded-xl border-2 border-surface-200 dark:border-surface-700 bg-white dark:bg-dark-card text-surface-900 dark:text-white focus:border-blue-400 focus:ring-2 focus:ring-blue-200 dark:focus:ring-blue-800 transition-all resize-none"></textarea> <button x-show="!checked && userText.trim().length > 10" x-cloak @click=" checked = true; const keywords = []; const lower = userText.toLowerCase(); matchCount = keywords.filter(k => lower.includes(k.toLowerCase())).length; isCorrect = matchCount >= Math.ceil(keywords.length * 0.5); answered[106] = true; correct[106] = isCorrect; if(isCorrect) score++; " class="px-4 py-2 rounded-xl text-sm font-bold bg-blue-600 text-white hover:bg-blue-700 shadow-[0_3px_0_0_#1e40af] active:translate-y-[3px] active:shadow-none transition-all"> Submit </button> <div x-show="checked" x-cloak class="text-sm space-y-2"> <p :class="isCorrect ? 'text-emerald-700 dark:text-emerald-300' : 'text-amber-700 dark:text-amber-300'"> <span x-show="isCorrect">Well written!</span> <span x-show="!isCorrect">Good try! Check the sample answer below.</span> <span class="text-surface-400" x-text="'(' + matchCount + '/0 keywords)'"></span> </p> <p class="text-surface-500">Means 'choose one from these titles'.</p> </div> </div> <div x-show="answered[106]" x-cloak class="mt-3 text-sm" :class="correct[106] ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="correct[106]">Correct!</span> <span x-show="!correct[106]">Not quite. Correct answer: <strong></strong></span> <p class="mt-1 text-surface-600 dark:text-surface-400">Means 'choose one from these titles'.</p> </div> </div> </div> <div x-show="(exFilter === 'all' || exFilter === 'writing') && (exLevel === 'all' || exLevel === '')" x-cloak> <div class="p-5 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50 border-2 border-b-4 border-surface-200 dark:border-[#3b3755]"> <div class="flex items-center gap-2 mb-2"> <span class="inline-flex items-center px-2 py-0.5 rounded-md text-[10px] font-semibold uppercase tracking-wide bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-300"> writing </span> </div> <p class="text-lg font-semibold text-surface-900 dark:text-white mb-4">Translate: 'Title track'</p> <div x-data="{ userText: '', checked: false, isCorrect: false, matchCount: 0 }" class="space-y-3"> <div class="p-3 rounded-xl bg-blue-50 dark:bg-blue-900/10 border border-blue-200 dark:border-blue-800"> <p class="text-surface-700 dark:text-surface-300"></p> </div> <textarea x-model="userText" :disabled="checked" rows="3" placeholder="Write your sentence here..." class="w-full px-4 py-3 rounded-xl border-2 border-surface-200 dark:border-surface-700 bg-white dark:bg-dark-card text-surface-900 dark:text-white focus:border-blue-400 focus:ring-2 focus:ring-blue-200 dark:focus:ring-blue-800 transition-all resize-none"></textarea> <button x-show="!checked && userText.trim().length > 10" x-cloak @click=" checked = true; const keywords = []; const lower = userText.toLowerCase(); matchCount = keywords.filter(k => lower.includes(k.toLowerCase())).length; isCorrect = matchCount >= Math.ceil(keywords.length * 0.5); answered[107] = true; correct[107] = isCorrect; if(isCorrect) score++; " class="px-4 py-2 rounded-xl text-sm font-bold bg-blue-600 text-white hover:bg-blue-700 shadow-[0_3px_0_0_#1e40af] active:translate-y-[3px] active:shadow-none transition-all"> Submit </button> <div x-show="checked" x-cloak class="text-sm space-y-2"> <p :class="isCorrect ? 'text-emerald-700 dark:text-emerald-300' : 'text-amber-700 dark:text-amber-300'"> <span x-show="isCorrect">Well written!</span> <span x-show="!isCorrect">Good try! Check the sample answer below.</span> <span class="text-surface-400" x-text="'(' + matchCount + '/0 keywords)'"></span> </p> <p class="text-surface-500">Standard translation.</p> </div> </div> <div x-show="answered[107]" x-cloak class="mt-3 text-sm" :class="correct[107] ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="correct[107]">Correct!</span> <span x-show="!correct[107]">Not quite. Correct answer: <strong></strong></span> <p class="mt-1 text-surface-600 dark:text-surface-400">Standard translation.</p> </div> </div> </div> <div x-show="(exFilter === 'all' || exFilter === 'writing') && (exLevel === 'all' || exLevel === '')" x-cloak> <div class="p-5 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50 border-2 border-b-4 border-surface-200 dark:border-[#3b3755]"> <div class="flex items-center gap-2 mb-2"> <span class="inline-flex items-center px-2 py-0.5 rounded-md text-[10px] font-semibold uppercase tracking-wide bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-300"> writing </span> </div> <p class="text-lg font-semibold text-surface-900 dark:text-white mb-4">Translate: 'I like this title.'</p> <div x-data="{ userText: '', checked: false, isCorrect: false, matchCount: 0 }" class="space-y-3"> <div class="p-3 rounded-xl bg-blue-50 dark:bg-blue-900/10 border border-blue-200 dark:border-blue-800"> <p class="text-surface-700 dark:text-surface-300"></p> </div> <textarea x-model="userText" :disabled="checked" rows="3" placeholder="Write your sentence here..." class="w-full px-4 py-3 rounded-xl border-2 border-surface-200 dark:border-surface-700 bg-white dark:bg-dark-card text-surface-900 dark:text-white focus:border-blue-400 focus:ring-2 focus:ring-blue-200 dark:focus:ring-blue-800 transition-all resize-none"></textarea> <button x-show="!checked && userText.trim().length > 10" x-cloak @click=" checked = true; const keywords = []; const lower = userText.toLowerCase(); matchCount = keywords.filter(k => lower.includes(k.toLowerCase())).length; isCorrect = matchCount >= Math.ceil(keywords.length * 0.5); answered[108] = true; correct[108] = isCorrect; if(isCorrect) score++; " class="px-4 py-2 rounded-xl text-sm font-bold bg-blue-600 text-white hover:bg-blue-700 shadow-[0_3px_0_0_#1e40af] active:translate-y-[3px] active:shadow-none transition-all"> Submit </button> <div x-show="checked" x-cloak class="text-sm space-y-2"> <p :class="isCorrect ? 'text-emerald-700 dark:text-emerald-300' : 'text-amber-700 dark:text-amber-300'"> <span x-show="isCorrect">Well written!</span> <span x-show="!isCorrect">Good try! Check the sample answer below.</span> <span class="text-surface-400" x-text="'(' + matchCount + '/0 keywords)'"></span> </p> <p class="text-surface-500">Uses 'पसंद है' structure.</p> </div> </div> <div x-show="answered[108]" x-cloak class="mt-3 text-sm" :class="correct[108] ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="correct[108]">Correct!</span> <span x-show="!correct[108]">Not quite. Correct answer: <strong></strong></span> <p class="mt-1 text-surface-600 dark:text-surface-400">Uses 'पसंद है' structure.</p> </div> </div> </div> <div x-show="(exFilter === 'all' || exFilter === 'writing') && (exLevel === 'all' || exLevel === '')" x-cloak> <div class="p-5 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50 border-2 border-b-4 border-surface-200 dark:border-[#3b3755]"> <div class="flex items-center gap-2 mb-2"> <span class="inline-flex items-center px-2 py-0.5 rounded-md text-[10px] font-semibold uppercase tracking-wide bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-300"> writing </span> </div> <p class="text-lg font-semibold text-surface-900 dark:text-white mb-4">Write a sentence explaining the difference between name and title.</p> <div x-data="{ userText: '', checked: false, isCorrect: false, matchCount: 0 }" class="space-y-3"> <div class="p-3 rounded-xl bg-blue-50 dark:bg-blue-900/10 border border-blue-200 dark:border-blue-800"> <p class="text-surface-700 dark:text-surface-300"></p> </div> <textarea x-model="userText" :disabled="checked" rows="3" placeholder="Write your sentence here..." class="w-full px-4 py-3 rounded-xl border-2 border-surface-200 dark:border-surface-700 bg-white dark:bg-dark-card text-surface-900 dark:text-white focus:border-blue-400 focus:ring-2 focus:ring-blue-200 dark:focus:ring-blue-800 transition-all resize-none"></textarea> <button x-show="!checked && userText.trim().length > 10" x-cloak @click=" checked = true; const keywords = []; const lower = userText.toLowerCase(); matchCount = keywords.filter(k => lower.includes(k.toLowerCase())).length; isCorrect = matchCount >= Math.ceil(keywords.length * 0.5); answered[109] = true; correct[109] = isCorrect; if(isCorrect) score++; " class="px-4 py-2 rounded-xl text-sm font-bold bg-blue-600 text-white hover:bg-blue-700 shadow-[0_3px_0_0_#1e40af] active:translate-y-[3px] active:shadow-none transition-all"> Submit </button> <div x-show="checked" x-cloak class="text-sm space-y-2"> <p :class="isCorrect ? 'text-emerald-700 dark:text-emerald-300' : 'text-amber-700 dark:text-amber-300'"> <span x-show="isCorrect">Well written!</span> <span x-show="!isCorrect">Good try! Check the sample answer below.</span> <span class="text-surface-400" x-text="'(' + matchCount + '/0 keywords)'"></span> </p> <p class="text-surface-500">Contrasts 'नाम' and 'शीर्षक'.</p> </div> </div> <div x-show="answered[109]" x-cloak class="mt-3 text-sm" :class="correct[109] ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="correct[109]">Correct!</span> <span x-show="!correct[109]">Not quite. Correct answer: <strong></strong></span> <p class="mt-1 text-surface-600 dark:text-surface-400">Contrasts 'नाम' and 'शीर्षक'.</p> </div> </div> </div> <div x-show="(exFilter === 'all' || exFilter === 'speaking') && (exLevel === 'all' || exLevel === '')" x-cloak> <div class="p-5 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50 border-2 border-b-4 border-surface-200 dark:border-[#3b3755]"> <div class="flex items-center gap-2 mb-2"> <span class="inline-flex items-center px-2 py-0.5 rounded-md text-[10px] font-semibold uppercase tracking-wide bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-300"> speaking </span> </div> <p class="text-lg font-semibold text-surface-900 dark:text-white mb-4">Pronounce the word 'शीर्षक'.</p> <div x-data="{ recording: false, transcript: '', checked: false, isCorrect: false, analyzing: false, aiFeedback: null, supported: 'webkitSpeechRecognition' in window || 'SpeechRecognition' in window }" class="space-y-3"> <div class="p-4 rounded-xl bg-emerald-50 dark:bg-emerald-900/10 border border-emerald-200 dark:border-emerald-800"> <p class="text-sm text-surface-500 dark:text-surface-400 mb-1">Read this aloud:</p> <p class="text-lg font-semibold text-surface-900 dark:text-white font-sans" lang="en" dir="ltr"></p> </div> <button @click="const u = new SpeechSynthesisUtterance(''); u.lang = 'en-US'; u.rate = 0.85; speechSynthesis.speak(u)" class="inline-flex items-center gap-2 px-4 py-2 rounded-xl text-sm font-medium bg-surface-100 dark:bg-surface-800 text-surface-700 dark:text-surface-300 hover:bg-surface-200 transition-all"> <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15.536 8.464a5 5 0 010 7.072m2.828-9.9a9 9 0 010 12.728M5.586 15H4a1 1 0 01-1-1v-4a1 1 0 011-1h1.586l4.707-4.707C10.923 3.663 12 4.109 12 5v14c0 .891-1.077 1.337-1.707.707L5.586 15z"/></svg> Listen first </button> <template x-if="supported"> <div> <button @click=" if(recording || checked) return; recording = true; transcript = ''; aiFeedback = null; try { const SR = window.SpeechRecognition || window.webkitSpeechRecognition; const r = new SR(); r.lang = 'en-US'; r.continuous = false; r.interimResults = false; r.onresult = function(e) { transcript = e.results[0][0].transcript; recording = false; checked = true; const target = ''; const got = transcript.toLowerCase().replace(/[^a-z\s]/g, ''); const words = target.replace(/[^a-z\s]/g, '').split(' '); const matched = words.filter(w => got.includes(w)).length; isCorrect = matched >= words.length * 0.7; answered[130] = true; correct[130] = isCorrect; if(isCorrect) score++; analyzing = true; fetch('/api/vocabulary/analyze-speech', { method: 'POST', headers: {'Content-Type':'application/json','X-CSRF-TOKEN':document.querySelector('meta[name=csrf-token]')?.content||''}, body: JSON.stringify({transcript: transcript, expected: '', word: '\u0936\u0940\u0930\u094d\u0937\u0915'}) }).then(r => r.json()).then(d => { aiFeedback = d; analyzing = false; }).catch(() => { aiFeedback = {feedback:'Analysis unavailable.'}; analyzing = false; }); }; r.onerror = function() { recording = false; }; r.onend = function() { if(!transcript) recording = false; }; r.start(); } catch(err) { recording = false; alert('Microphone access denied or not available. Please allow microphone access.'); } " :class="recording ? 'bg-rose-600 animate-pulse' : 'bg-emerald-600 hover:bg-emerald-700'" class="inline-flex items-center gap-2 px-5 py-3 rounded-xl text-white font-bold shadow-[0_3px_0_0_#065f46] active:translate-y-[3px] active:shadow-none transition-all" :disabled="checked"> <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 11a7 7 0 01-7 7m0 0a7 7 0 01-7-7m7 7v4m0 0H8m4 0h4m-4-8a3 3 0 01-3-3V5a3 3 0 116 0v6a3 3 0 01-3 3z"/></svg> <span x-text="recording ? 'Listening...' : 'Start Speaking'"></span> </button> <div x-show="transcript" x-cloak class="mt-3 p-3 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50"> <p class="text-xs text-surface-400 uppercase font-bold mb-1">You said:</p> <p class="text-surface-900 dark:text-white font-medium" x-text="transcript"></p> </div> <div x-show="analyzing" x-cloak class="flex items-center gap-2 text-sm text-violet-600 dark:text-violet-400"> <svg class="w-4 h-4 animate-spin" fill="none" viewBox="0 0 24 24"><circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle><path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path></svg> AI is analyzing your pronunciation... </div> <div x-show="aiFeedback && !analyzing" x-cloak class="mt-2 space-y-2"> <div class="flex items-center gap-3"> <div class="flex-shrink-0 w-12 h-12 rounded-xl flex items-center justify-center text-lg font-black" :class="(aiFeedback?.score || 0) >= 7 ? 'bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300' : (aiFeedback?.score || 0) >= 4 ? 'bg-amber-100 dark:bg-amber-900/30 text-amber-700 dark:text-amber-300' : 'bg-rose-100 dark:bg-rose-900/30 text-rose-700 dark:text-rose-300'" x-text="(aiFeedback?.score || 0) + '/10'"></div> <p class="text-surface-700 dark:text-surface-300" x-text="aiFeedback?.feedback || ''"></p> </div> <template x-if="aiFeedback?.pronunciation_tips"> <div class="flex items-start gap-2 p-3 rounded-xl bg-violet-50 dark:bg-violet-900/10 border border-violet-200 dark:border-violet-800"> <svg class="w-4 h-4 text-violet-500 flex-shrink-0 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"/></svg> <p class="text-sm text-violet-700 dark:text-violet-300" x-text="aiFeedback.pronunciation_tips"></p> </div> </template> </div> </div> </template> <template x-if="!supported"> <p class="text-sm text-surface-500 italic">Speech recognition is not supported in your browser. Try Chrome or Edge.</p> </template> </div> <div x-show="answered[130]" x-cloak class="mt-3 text-sm" :class="correct[130] ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="correct[130]">Correct!</span> <span x-show="!correct[130]">Not quite. Correct answer: <strong></strong></span> <p class="mt-1 text-surface-600 dark:text-surface-400">Ensure the first syllable has a long 'ī' and the 'ṣ' is retroflex.</p> </div> </div> </div> <div x-show="(exFilter === 'all' || exFilter === 'speaking') && (exLevel === 'all' || exLevel === '')" x-cloak> <div class="p-5 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50 border-2 border-b-4 border-surface-200 dark:border-[#3b3755]"> <div class="flex items-center gap-2 mb-2"> <span class="inline-flex items-center px-2 py-0.5 rounded-md text-[10px] font-semibold uppercase tracking-wide bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-300"> speaking </span> </div> <p class="text-lg font-semibold text-surface-900 dark:text-white mb-4">Say 'Title of the book' in Hindi.</p> <div x-data="{ recording: false, transcript: '', checked: false, isCorrect: false, analyzing: false, aiFeedback: null, supported: 'webkitSpeechRecognition' in window || 'SpeechRecognition' in window }" class="space-y-3"> <div class="p-4 rounded-xl bg-emerald-50 dark:bg-emerald-900/10 border border-emerald-200 dark:border-emerald-800"> <p class="text-sm text-surface-500 dark:text-surface-400 mb-1">Read this aloud:</p> <p class="text-lg font-semibold text-surface-900 dark:text-white font-sans" lang="en" dir="ltr"></p> </div> <button @click="const u = new SpeechSynthesisUtterance(''); u.lang = 'en-US'; u.rate = 0.85; speechSynthesis.speak(u)" class="inline-flex items-center gap-2 px-4 py-2 rounded-xl text-sm font-medium bg-surface-100 dark:bg-surface-800 text-surface-700 dark:text-surface-300 hover:bg-surface-200 transition-all"> <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15.536 8.464a5 5 0 010 7.072m2.828-9.9a9 9 0 010 12.728M5.586 15H4a1 1 0 01-1-1v-4a1 1 0 011-1h1.586l4.707-4.707C10.923 3.663 12 4.109 12 5v14c0 .891-1.077 1.337-1.707.707L5.586 15z"/></svg> Listen first </button> <template x-if="supported"> <div> <button @click=" if(recording || checked) return; recording = true; transcript = ''; aiFeedback = null; try { const SR = window.SpeechRecognition || window.webkitSpeechRecognition; const r = new SR(); r.lang = 'en-US'; r.continuous = false; r.interimResults = false; r.onresult = function(e) { transcript = e.results[0][0].transcript; recording = false; checked = true; const target = ''; const got = transcript.toLowerCase().replace(/[^a-z\s]/g, ''); const words = target.replace(/[^a-z\s]/g, '').split(' '); const matched = words.filter(w => got.includes(w)).length; isCorrect = matched >= words.length * 0.7; answered[131] = true; correct[131] = isCorrect; if(isCorrect) score++; analyzing = true; fetch('/api/vocabulary/analyze-speech', { method: 'POST', headers: {'Content-Type':'application/json','X-CSRF-TOKEN':document.querySelector('meta[name=csrf-token]')?.content||''}, body: JSON.stringify({transcript: transcript, expected: '', word: '\u0936\u0940\u0930\u094d\u0937\u0915'}) }).then(r => r.json()).then(d => { aiFeedback = d; analyzing = false; }).catch(() => { aiFeedback = {feedback:'Analysis unavailable.'}; analyzing = false; }); }; r.onerror = function() { recording = false; }; r.onend = function() { if(!transcript) recording = false; }; r.start(); } catch(err) { recording = false; alert('Microphone access denied or not available. Please allow microphone access.'); } " :class="recording ? 'bg-rose-600 animate-pulse' : 'bg-emerald-600 hover:bg-emerald-700'" class="inline-flex items-center gap-2 px-5 py-3 rounded-xl text-white font-bold shadow-[0_3px_0_0_#065f46] active:translate-y-[3px] active:shadow-none transition-all" :disabled="checked"> <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 11a7 7 0 01-7 7m0 0a7 7 0 01-7-7m7 7v4m0 0H8m4 0h4m-4-8a3 3 0 01-3-3V5a3 3 0 116 0v6a3 3 0 01-3 3z"/></svg> <span x-text="recording ? 'Listening...' : 'Start Speaking'"></span> </button> <div x-show="transcript" x-cloak class="mt-3 p-3 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50"> <p class="text-xs text-surface-400 uppercase font-bold mb-1">You said:</p> <p class="text-surface-900 dark:text-white font-medium" x-text="transcript"></p> </div> <div x-show="analyzing" x-cloak class="flex items-center gap-2 text-sm text-violet-600 dark:text-violet-400"> <svg class="w-4 h-4 animate-spin" fill="none" viewBox="0 0 24 24"><circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle><path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path></svg> AI is analyzing your pronunciation... </div> <div x-show="aiFeedback && !analyzing" x-cloak class="mt-2 space-y-2"> <div class="flex items-center gap-3"> <div class="flex-shrink-0 w-12 h-12 rounded-xl flex items-center justify-center text-lg font-black" :class="(aiFeedback?.score || 0) >= 7 ? 'bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300' : (aiFeedback?.score || 0) >= 4 ? 'bg-amber-100 dark:bg-amber-900/30 text-amber-700 dark:text-amber-300' : 'bg-rose-100 dark:bg-rose-900/30 text-rose-700 dark:text-rose-300'" x-text="(aiFeedback?.score || 0) + '/10'"></div> <p class="text-surface-700 dark:text-surface-300" x-text="aiFeedback?.feedback || ''"></p> </div> <template x-if="aiFeedback?.pronunciation_tips"> <div class="flex items-start gap-2 p-3 rounded-xl bg-violet-50 dark:bg-violet-900/10 border border-violet-200 dark:border-violet-800"> <svg class="w-4 h-4 text-violet-500 flex-shrink-0 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"/></svg> <p class="text-sm text-violet-700 dark:text-violet-300" x-text="aiFeedback.pronunciation_tips"></p> </div> </template> </div> </div> </template> <template x-if="!supported"> <p class="text-sm text-surface-500 italic">Speech recognition is not supported in your browser. Try Chrome or Edge.</p> </template> </div> <div x-show="answered[131]" x-cloak class="mt-3 text-sm" :class="correct[131] ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="correct[131]">Correct!</span> <span x-show="!correct[131]">Not quite. Correct answer: <strong></strong></span> <p class="mt-1 text-surface-600 dark:text-surface-400">Use the masculine genitive 'का'.</p> </div> </div> </div> <div x-show="(exFilter === 'all' || exFilter === 'speaking') && (exLevel === 'all' || exLevel === '')" x-cloak> <div class="p-5 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50 border-2 border-b-4 border-surface-200 dark:border-[#3b3755]"> <div class="flex items-center gap-2 mb-2"> <span class="inline-flex items-center px-2 py-0.5 rounded-md text-[10px] font-semibold uppercase tracking-wide bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-300"> speaking </span> </div> <p class="text-lg font-semibold text-surface-900 dark:text-white mb-4">Ask 'What is the title?' in Hindi.</p> <div x-data="{ recording: false, transcript: '', checked: false, isCorrect: false, analyzing: false, aiFeedback: null, supported: 'webkitSpeechRecognition' in window || 'SpeechRecognition' in window }" class="space-y-3"> <div class="p-4 rounded-xl bg-emerald-50 dark:bg-emerald-900/10 border border-emerald-200 dark:border-emerald-800"> <p class="text-sm text-surface-500 dark:text-surface-400 mb-1">Read this aloud:</p> <p class="text-lg font-semibold text-surface-900 dark:text-white font-sans" lang="en" dir="ltr"></p> </div> <button @click="const u = new SpeechSynthesisUtterance(''); u.lang = 'en-US'; u.rate = 0.85; speechSynthesis.speak(u)" class="inline-flex items-center gap-2 px-4 py-2 rounded-xl text-sm font-medium bg-surface-100 dark:bg-surface-800 text-surface-700 dark:text-surface-300 hover:bg-surface-200 transition-all"> <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15.536 8.464a5 5 0 010 7.072m2.828-9.9a9 9 0 010 12.728M5.586 15H4a1 1 0 01-1-1v-4a1 1 0 011-1h1.586l4.707-4.707C10.923 3.663 12 4.109 12 5v14c0 .891-1.077 1.337-1.707.707L5.586 15z"/></svg> Listen first </button> <template x-if="supported"> <div> <button @click=" if(recording || checked) return; recording = true; transcript = ''; aiFeedback = null; try { const SR = window.SpeechRecognition || window.webkitSpeechRecognition; const r = new SR(); r.lang = 'en-US'; r.continuous = false; r.interimResults = false; r.onresult = function(e) { transcript = e.results[0][0].transcript; recording = false; checked = true; const target = ''; const got = transcript.toLowerCase().replace(/[^a-z\s]/g, ''); const words = target.replace(/[^a-z\s]/g, '').split(' '); const matched = words.filter(w => got.includes(w)).length; isCorrect = matched >= words.length * 0.7; answered[132] = true; correct[132] = isCorrect; if(isCorrect) score++; analyzing = true; fetch('/api/vocabulary/analyze-speech', { method: 'POST', headers: {'Content-Type':'application/json','X-CSRF-TOKEN':document.querySelector('meta[name=csrf-token]')?.content||''}, body: JSON.stringify({transcript: transcript, expected: '', word: '\u0936\u0940\u0930\u094d\u0937\u0915'}) }).then(r => r.json()).then(d => { aiFeedback = d; analyzing = false; }).catch(() => { aiFeedback = {feedback:'Analysis unavailable.'}; analyzing = false; }); }; r.onerror = function() { recording = false; }; r.onend = function() { if(!transcript) recording = false; }; r.start(); } catch(err) { recording = false; alert('Microphone access denied or not available. Please allow microphone access.'); } " :class="recording ? 'bg-rose-600 animate-pulse' : 'bg-emerald-600 hover:bg-emerald-700'" class="inline-flex items-center gap-2 px-5 py-3 rounded-xl text-white font-bold shadow-[0_3px_0_0_#065f46] active:translate-y-[3px] active:shadow-none transition-all" :disabled="checked"> <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 11a7 7 0 01-7 7m0 0a7 7 0 01-7-7m7 7v4m0 0H8m4 0h4m-4-8a3 3 0 01-3-3V5a3 3 0 116 0v6a3 3 0 01-3 3z"/></svg> <span x-text="recording ? 'Listening...' : 'Start Speaking'"></span> </button> <div x-show="transcript" x-cloak class="mt-3 p-3 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50"> <p class="text-xs text-surface-400 uppercase font-bold mb-1">You said:</p> <p class="text-surface-900 dark:text-white font-medium" x-text="transcript"></p> </div> <div x-show="analyzing" x-cloak class="flex items-center gap-2 text-sm text-violet-600 dark:text-violet-400"> <svg class="w-4 h-4 animate-spin" fill="none" viewBox="0 0 24 24"><circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle><path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path></svg> AI is analyzing your pronunciation... </div> <div x-show="aiFeedback && !analyzing" x-cloak class="mt-2 space-y-2"> <div class="flex items-center gap-3"> <div class="flex-shrink-0 w-12 h-12 rounded-xl flex items-center justify-center text-lg font-black" :class="(aiFeedback?.score || 0) >= 7 ? 'bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300' : (aiFeedback?.score || 0) >= 4 ? 'bg-amber-100 dark:bg-amber-900/30 text-amber-700 dark:text-amber-300' : 'bg-rose-100 dark:bg-rose-900/30 text-rose-700 dark:text-rose-300'" x-text="(aiFeedback?.score || 0) + '/10'"></div> <p class="text-surface-700 dark:text-surface-300" x-text="aiFeedback?.feedback || ''"></p> </div> <template x-if="aiFeedback?.pronunciation_tips"> <div class="flex items-start gap-2 p-3 rounded-xl bg-violet-50 dark:bg-violet-900/10 border border-violet-200 dark:border-violet-800"> <svg class="w-4 h-4 text-violet-500 flex-shrink-0 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"/></svg> <p class="text-sm text-violet-700 dark:text-violet-300" x-text="aiFeedback.pronunciation_tips"></p> </div> </template> </div> </div> </template> <template x-if="!supported"> <p class="text-sm text-surface-500 italic">Speech recognition is not supported in your browser. Try Chrome or Edge.</p> </template> </div> <div x-show="answered[132]" x-cloak class="mt-3 text-sm" :class="correct[132] ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="correct[132]">Correct!</span> <span x-show="!correct[132]">Not quite. Correct answer: <strong></strong></span> <p class="mt-1 text-surface-600 dark:text-surface-400">Simple question format.</p> </div> </div> </div> <div x-show="(exFilter === 'all' || exFilter === 'speaking') && (exLevel === 'all' || exLevel === '')" x-cloak> <div class="p-5 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50 border-2 border-b-4 border-surface-200 dark:border-[#3b3755]"> <div class="flex items-center gap-2 mb-2"> <span class="inline-flex items-center px-2 py-0.5 rounded-md text-[10px] font-semibold uppercase tracking-wide bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-300"> speaking </span> </div> <p class="text-lg font-semibold text-surface-900 dark:text-white mb-4">Say 'This is a good title' in Hindi.</p> <div x-data="{ recording: false, transcript: '', checked: false, isCorrect: false, analyzing: false, aiFeedback: null, supported: 'webkitSpeechRecognition' in window || 'SpeechRecognition' in window }" class="space-y-3"> <div class="p-4 rounded-xl bg-emerald-50 dark:bg-emerald-900/10 border border-emerald-200 dark:border-emerald-800"> <p class="text-sm text-surface-500 dark:text-surface-400 mb-1">Read this aloud:</p> <p class="text-lg font-semibold text-surface-900 dark:text-white font-sans" lang="en" dir="ltr"></p> </div> <button @click="const u = new SpeechSynthesisUtterance(''); u.lang = 'en-US'; u.rate = 0.85; speechSynthesis.speak(u)" class="inline-flex items-center gap-2 px-4 py-2 rounded-xl text-sm font-medium bg-surface-100 dark:bg-surface-800 text-surface-700 dark:text-surface-300 hover:bg-surface-200 transition-all"> <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15.536 8.464a5 5 0 010 7.072m2.828-9.9a9 9 0 010 12.728M5.586 15H4a1 1 0 01-1-1v-4a1 1 0 011-1h1.586l4.707-4.707C10.923 3.663 12 4.109 12 5v14c0 .891-1.077 1.337-1.707.707L5.586 15z"/></svg> Listen first </button> <template x-if="supported"> <div> <button @click=" if(recording || checked) return; recording = true; transcript = ''; aiFeedback = null; try { const SR = window.SpeechRecognition || window.webkitSpeechRecognition; const r = new SR(); r.lang = 'en-US'; r.continuous = false; r.interimResults = false; r.onresult = function(e) { transcript = e.results[0][0].transcript; recording = false; checked = true; const target = ''; const got = transcript.toLowerCase().replace(/[^a-z\s]/g, ''); const words = target.replace(/[^a-z\s]/g, '').split(' '); const matched = words.filter(w => got.includes(w)).length; isCorrect = matched >= words.length * 0.7; answered[133] = true; correct[133] = isCorrect; if(isCorrect) score++; analyzing = true; fetch('/api/vocabulary/analyze-speech', { method: 'POST', headers: {'Content-Type':'application/json','X-CSRF-TOKEN':document.querySelector('meta[name=csrf-token]')?.content||''}, body: JSON.stringify({transcript: transcript, expected: '', word: '\u0936\u0940\u0930\u094d\u0937\u0915'}) }).then(r => r.json()).then(d => { aiFeedback = d; analyzing = false; }).catch(() => { aiFeedback = {feedback:'Analysis unavailable.'}; analyzing = false; }); }; r.onerror = function() { recording = false; }; r.onend = function() { if(!transcript) recording = false; }; r.start(); } catch(err) { recording = false; alert('Microphone access denied or not available. Please allow microphone access.'); } " :class="recording ? 'bg-rose-600 animate-pulse' : 'bg-emerald-600 hover:bg-emerald-700'" class="inline-flex items-center gap-2 px-5 py-3 rounded-xl text-white font-bold shadow-[0_3px_0_0_#065f46] active:translate-y-[3px] active:shadow-none transition-all" :disabled="checked"> <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 11a7 7 0 01-7 7m0 0a7 7 0 01-7-7m7 7v4m0 0H8m4 0h4m-4-8a3 3 0 01-3-3V5a3 3 0 116 0v6a3 3 0 01-3 3z"/></svg> <span x-text="recording ? 'Listening...' : 'Start Speaking'"></span> </button> <div x-show="transcript" x-cloak class="mt-3 p-3 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50"> <p class="text-xs text-surface-400 uppercase font-bold mb-1">You said:</p> <p class="text-surface-900 dark:text-white font-medium" x-text="transcript"></p> </div> <div x-show="analyzing" x-cloak class="flex items-center gap-2 text-sm text-violet-600 dark:text-violet-400"> <svg class="w-4 h-4 animate-spin" fill="none" viewBox="0 0 24 24"><circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle><path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path></svg> AI is analyzing your pronunciation... </div> <div x-show="aiFeedback && !analyzing" x-cloak class="mt-2 space-y-2"> <div class="flex items-center gap-3"> <div class="flex-shrink-0 w-12 h-12 rounded-xl flex items-center justify-center text-lg font-black" :class="(aiFeedback?.score || 0) >= 7 ? 'bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300' : (aiFeedback?.score || 0) >= 4 ? 'bg-amber-100 dark:bg-amber-900/30 text-amber-700 dark:text-amber-300' : 'bg-rose-100 dark:bg-rose-900/30 text-rose-700 dark:text-rose-300'" x-text="(aiFeedback?.score || 0) + '/10'"></div> <p class="text-surface-700 dark:text-surface-300" x-text="aiFeedback?.feedback || ''"></p> </div> <template x-if="aiFeedback?.pronunciation_tips"> <div class="flex items-start gap-2 p-3 rounded-xl bg-violet-50 dark:bg-violet-900/10 border border-violet-200 dark:border-violet-800"> <svg class="w-4 h-4 text-violet-500 flex-shrink-0 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"/></svg> <p class="text-sm text-violet-700 dark:text-violet-300" x-text="aiFeedback.pronunciation_tips"></p> </div> </template> </div> </div> </template> <template x-if="!supported"> <p class="text-sm text-surface-500 italic">Speech recognition is not supported in your browser. Try Chrome or Edge.</p> </template> </div> <div x-show="answered[133]" x-cloak class="mt-3 text-sm" :class="correct[133] ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="correct[133]">Correct!</span> <span x-show="!correct[133]">Not quite. Correct answer: <strong></strong></span> <p class="mt-1 text-surface-600 dark:text-surface-400">Use masculine adjective 'अच्छा'.</p> </div> </div> </div> <div x-show="(exFilter === 'all' || exFilter === 'speaking') && (exLevel === 'all' || exLevel === '')" x-cloak> <div class="p-5 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50 border-2 border-b-4 border-surface-200 dark:border-[#3b3755]"> <div class="flex items-center gap-2 mb-2"> <span class="inline-flex items-center px-2 py-0.5 rounded-md text-[10px] font-semibold uppercase tracking-wide bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-300"> speaking </span> </div> <p class="text-lg font-semibold text-surface-900 dark:text-white mb-4">Say 'Subheading' in Hindi.</p> <div x-data="{ recording: false, transcript: '', checked: false, isCorrect: false, analyzing: false, aiFeedback: null, supported: 'webkitSpeechRecognition' in window || 'SpeechRecognition' in window }" class="space-y-3"> <div class="p-4 rounded-xl bg-emerald-50 dark:bg-emerald-900/10 border border-emerald-200 dark:border-emerald-800"> <p class="text-sm text-surface-500 dark:text-surface-400 mb-1">Read this aloud:</p> <p class="text-lg font-semibold text-surface-900 dark:text-white font-sans" lang="en" dir="ltr"></p> </div> <button @click="const u = new SpeechSynthesisUtterance(''); u.lang = 'en-US'; u.rate = 0.85; speechSynthesis.speak(u)" class="inline-flex items-center gap-2 px-4 py-2 rounded-xl text-sm font-medium bg-surface-100 dark:bg-surface-800 text-surface-700 dark:text-surface-300 hover:bg-surface-200 transition-all"> <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15.536 8.464a5 5 0 010 7.072m2.828-9.9a9 9 0 010 12.728M5.586 15H4a1 1 0 01-1-1v-4a1 1 0 011-1h1.586l4.707-4.707C10.923 3.663 12 4.109 12 5v14c0 .891-1.077 1.337-1.707.707L5.586 15z"/></svg> Listen first </button> <template x-if="supported"> <div> <button @click=" if(recording || checked) return; recording = true; transcript = ''; aiFeedback = null; try { const SR = window.SpeechRecognition || window.webkitSpeechRecognition; const r = new SR(); r.lang = 'en-US'; r.continuous = false; r.interimResults = false; r.onresult = function(e) { transcript = e.results[0][0].transcript; recording = false; checked = true; const target = ''; const got = transcript.toLowerCase().replace(/[^a-z\s]/g, ''); const words = target.replace(/[^a-z\s]/g, '').split(' '); const matched = words.filter(w => got.includes(w)).length; isCorrect = matched >= words.length * 0.7; answered[134] = true; correct[134] = isCorrect; if(isCorrect) score++; analyzing = true; fetch('/api/vocabulary/analyze-speech', { method: 'POST', headers: {'Content-Type':'application/json','X-CSRF-TOKEN':document.querySelector('meta[name=csrf-token]')?.content||''}, body: JSON.stringify({transcript: transcript, expected: '', word: '\u0936\u0940\u0930\u094d\u0937\u0915'}) }).then(r => r.json()).then(d => { aiFeedback = d; analyzing = false; }).catch(() => { aiFeedback = {feedback:'Analysis unavailable.'}; analyzing = false; }); }; r.onerror = function() { recording = false; }; r.onend = function() { if(!transcript) recording = false; }; r.start(); } catch(err) { recording = false; alert('Microphone access denied or not available. Please allow microphone access.'); } " :class="recording ? 'bg-rose-600 animate-pulse' : 'bg-emerald-600 hover:bg-emerald-700'" class="inline-flex items-center gap-2 px-5 py-3 rounded-xl text-white font-bold shadow-[0_3px_0_0_#065f46] active:translate-y-[3px] active:shadow-none transition-all" :disabled="checked"> <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 11a7 7 0 01-7 7m0 0a7 7 0 01-7-7m7 7v4m0 0H8m4 0h4m-4-8a3 3 0 01-3-3V5a3 3 0 116 0v6a3 3 0 01-3 3z"/></svg> <span x-text="recording ? 'Listening...' : 'Start Speaking'"></span> </button> <div x-show="transcript" x-cloak class="mt-3 p-3 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50"> <p class="text-xs text-surface-400 uppercase font-bold mb-1">You said:</p> <p class="text-surface-900 dark:text-white font-medium" x-text="transcript"></p> </div> <div x-show="analyzing" x-cloak class="flex items-center gap-2 text-sm text-violet-600 dark:text-violet-400"> <svg class="w-4 h-4 animate-spin" fill="none" viewBox="0 0 24 24"><circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle><path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path></svg> AI is analyzing your pronunciation... </div> <div x-show="aiFeedback && !analyzing" x-cloak class="mt-2 space-y-2"> <div class="flex items-center gap-3"> <div class="flex-shrink-0 w-12 h-12 rounded-xl flex items-center justify-center text-lg font-black" :class="(aiFeedback?.score || 0) >= 7 ? 'bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300' : (aiFeedback?.score || 0) >= 4 ? 'bg-amber-100 dark:bg-amber-900/30 text-amber-700 dark:text-amber-300' : 'bg-rose-100 dark:bg-rose-900/30 text-rose-700 dark:text-rose-300'" x-text="(aiFeedback?.score || 0) + '/10'"></div> <p class="text-surface-700 dark:text-surface-300" x-text="aiFeedback?.feedback || ''"></p> </div> <template x-if="aiFeedback?.pronunciation_tips"> <div class="flex items-start gap-2 p-3 rounded-xl bg-violet-50 dark:bg-violet-900/10 border border-violet-200 dark:border-violet-800"> <svg class="w-4 h-4 text-violet-500 flex-shrink-0 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"/></svg> <p class="text-sm text-violet-700 dark:text-violet-300" x-text="aiFeedback.pronunciation_tips"></p> </div> </template> </div> </div> </template> <template x-if="!supported"> <p class="text-sm text-surface-500 italic">Speech recognition is not supported in your browser. Try Chrome or Edge.</p> </template> </div> <div x-show="answered[134]" x-cloak class="mt-3 text-sm" :class="correct[134] ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="correct[134]">Correct!</span> <span x-show="!correct[134]">Not quite. Correct answer: <strong></strong></span> <p class="mt-1 text-surface-600 dark:text-surface-400">Add the prefix 'उप'.</p> </div> </div> </div> <div x-show="(exFilter === 'all' || exFilter === 'speaking') && (exLevel === 'all' || exLevel === '')" x-cloak> <div class="p-5 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50 border-2 border-b-4 border-surface-200 dark:border-[#3b3755]"> <div class="flex items-center gap-2 mb-2"> <span class="inline-flex items-center px-2 py-0.5 rounded-md text-[10px] font-semibold uppercase tracking-wide bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-300"> speaking </span> </div> <p class="text-lg font-semibold text-surface-900 dark:text-white mb-4">Say 'Catchy title' in Hindi.</p> <div x-data="{ recording: false, transcript: '', checked: false, isCorrect: false, analyzing: false, aiFeedback: null, supported: 'webkitSpeechRecognition' in window || 'SpeechRecognition' in window }" class="space-y-3"> <div class="p-4 rounded-xl bg-emerald-50 dark:bg-emerald-900/10 border border-emerald-200 dark:border-emerald-800"> <p class="text-sm text-surface-500 dark:text-surface-400 mb-1">Read this aloud:</p> <p class="text-lg font-semibold text-surface-900 dark:text-white font-sans" lang="en" dir="ltr"></p> </div> <button @click="const u = new SpeechSynthesisUtterance(''); u.lang = 'en-US'; u.rate = 0.85; speechSynthesis.speak(u)" class="inline-flex items-center gap-2 px-4 py-2 rounded-xl text-sm font-medium bg-surface-100 dark:bg-surface-800 text-surface-700 dark:text-surface-300 hover:bg-surface-200 transition-all"> <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15.536 8.464a5 5 0 010 7.072m2.828-9.9a9 9 0 010 12.728M5.586 15H4a1 1 0 01-1-1v-4a1 1 0 011-1h1.586l4.707-4.707C10.923 3.663 12 4.109 12 5v14c0 .891-1.077 1.337-1.707.707L5.586 15z"/></svg> Listen first </button> <template x-if="supported"> <div> <button @click=" if(recording || checked) return; recording = true; transcript = ''; aiFeedback = null; try { const SR = window.SpeechRecognition || window.webkitSpeechRecognition; const r = new SR(); r.lang = 'en-US'; r.continuous = false; r.interimResults = false; r.onresult = function(e) { transcript = e.results[0][0].transcript; recording = false; checked = true; const target = ''; const got = transcript.toLowerCase().replace(/[^a-z\s]/g, ''); const words = target.replace(/[^a-z\s]/g, '').split(' '); const matched = words.filter(w => got.includes(w)).length; isCorrect = matched >= words.length * 0.7; answered[135] = true; correct[135] = isCorrect; if(isCorrect) score++; analyzing = true; fetch('/api/vocabulary/analyze-speech', { method: 'POST', headers: {'Content-Type':'application/json','X-CSRF-TOKEN':document.querySelector('meta[name=csrf-token]')?.content||''}, body: JSON.stringify({transcript: transcript, expected: '', word: '\u0936\u0940\u0930\u094d\u0937\u0915'}) }).then(r => r.json()).then(d => { aiFeedback = d; analyzing = false; }).catch(() => { aiFeedback = {feedback:'Analysis unavailable.'}; analyzing = false; }); }; r.onerror = function() { recording = false; }; r.onend = function() { if(!transcript) recording = false; }; r.start(); } catch(err) { recording = false; alert('Microphone access denied or not available. Please allow microphone access.'); } " :class="recording ? 'bg-rose-600 animate-pulse' : 'bg-emerald-600 hover:bg-emerald-700'" class="inline-flex items-center gap-2 px-5 py-3 rounded-xl text-white font-bold shadow-[0_3px_0_0_#065f46] active:translate-y-[3px] active:shadow-none transition-all" :disabled="checked"> <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 11a7 7 0 01-7 7m0 0a7 7 0 01-7-7m7 7v4m0 0H8m4 0h4m-4-8a3 3 0 01-3-3V5a3 3 0 116 0v6a3 3 0 01-3 3z"/></svg> <span x-text="recording ? 'Listening...' : 'Start Speaking'"></span> </button> <div x-show="transcript" x-cloak class="mt-3 p-3 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50"> <p class="text-xs text-surface-400 uppercase font-bold mb-1">You said:</p> <p class="text-surface-900 dark:text-white font-medium" x-text="transcript"></p> </div> <div x-show="analyzing" x-cloak class="flex items-center gap-2 text-sm text-violet-600 dark:text-violet-400"> <svg class="w-4 h-4 animate-spin" fill="none" viewBox="0 0 24 24"><circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle><path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path></svg> AI is analyzing your pronunciation... </div> <div x-show="aiFeedback && !analyzing" x-cloak class="mt-2 space-y-2"> <div class="flex items-center gap-3"> <div class="flex-shrink-0 w-12 h-12 rounded-xl flex items-center justify-center text-lg font-black" :class="(aiFeedback?.score || 0) >= 7 ? 'bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300' : (aiFeedback?.score || 0) >= 4 ? 'bg-amber-100 dark:bg-amber-900/30 text-amber-700 dark:text-amber-300' : 'bg-rose-100 dark:bg-rose-900/30 text-rose-700 dark:text-rose-300'" x-text="(aiFeedback?.score || 0) + '/10'"></div> <p class="text-surface-700 dark:text-surface-300" x-text="aiFeedback?.feedback || ''"></p> </div> <template x-if="aiFeedback?.pronunciation_tips"> <div class="flex items-start gap-2 p-3 rounded-xl bg-violet-50 dark:bg-violet-900/10 border border-violet-200 dark:border-violet-800"> <svg class="w-4 h-4 text-violet-500 flex-shrink-0 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"/></svg> <p class="text-sm text-violet-700 dark:text-violet-300" x-text="aiFeedback.pronunciation_tips"></p> </div> </template> </div> </div> </template> <template x-if="!supported"> <p class="text-sm text-surface-500 italic">Speech recognition is not supported in your browser. Try Chrome or Edge.</p> </template> </div> <div x-show="answered[135]" x-cloak class="mt-3 text-sm" :class="correct[135] ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="correct[135]">Correct!</span> <span x-show="!correct[135]">Not quite. Correct answer: <strong></strong></span> <p class="mt-1 text-surface-600 dark:text-surface-400">'आकर्षक' means attractive/catchy.</p> </div> </div> </div> <div x-show="(exFilter === 'all' || exFilter === 'speaking') && (exLevel === 'all' || exLevel === '')" x-cloak> <div class="p-5 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50 border-2 border-b-4 border-surface-200 dark:border-[#3b3755]"> <div class="flex items-center gap-2 mb-2"> <span class="inline-flex items-center px-2 py-0.5 rounded-md text-[10px] font-semibold uppercase tracking-wide bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-300"> speaking </span> </div> <p class="text-lg font-semibold text-surface-900 dark:text-white mb-4">Say 'I read the title' in Hindi.</p> <div x-data="{ recording: false, transcript: '', checked: false, isCorrect: false, analyzing: false, aiFeedback: null, supported: 'webkitSpeechRecognition' in window || 'SpeechRecognition' in window }" class="space-y-3"> <div class="p-4 rounded-xl bg-emerald-50 dark:bg-emerald-900/10 border border-emerald-200 dark:border-emerald-800"> <p class="text-sm text-surface-500 dark:text-surface-400 mb-1">Read this aloud:</p> <p class="text-lg font-semibold text-surface-900 dark:text-white font-sans" lang="en" dir="ltr"></p> </div> <button @click="const u = new SpeechSynthesisUtterance(''); u.lang = 'en-US'; u.rate = 0.85; speechSynthesis.speak(u)" class="inline-flex items-center gap-2 px-4 py-2 rounded-xl text-sm font-medium bg-surface-100 dark:bg-surface-800 text-surface-700 dark:text-surface-300 hover:bg-surface-200 transition-all"> <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15.536 8.464a5 5 0 010 7.072m2.828-9.9a9 9 0 010 12.728M5.586 15H4a1 1 0 01-1-1v-4a1 1 0 011-1h1.586l4.707-4.707C10.923 3.663 12 4.109 12 5v14c0 .891-1.077 1.337-1.707.707L5.586 15z"/></svg> Listen first </button> <template x-if="supported"> <div> <button @click=" if(recording || checked) return; recording = true; transcript = ''; aiFeedback = null; try { const SR = window.SpeechRecognition || window.webkitSpeechRecognition; const r = new SR(); r.lang = 'en-US'; r.continuous = false; r.interimResults = false; r.onresult = function(e) { transcript = e.results[0][0].transcript; recording = false; checked = true; const target = ''; const got = transcript.toLowerCase().replace(/[^a-z\s]/g, ''); const words = target.replace(/[^a-z\s]/g, '').split(' '); const matched = words.filter(w => got.includes(w)).length; isCorrect = matched >= words.length * 0.7; answered[136] = true; correct[136] = isCorrect; if(isCorrect) score++; analyzing = true; fetch('/api/vocabulary/analyze-speech', { method: 'POST', headers: {'Content-Type':'application/json','X-CSRF-TOKEN':document.querySelector('meta[name=csrf-token]')?.content||''}, body: JSON.stringify({transcript: transcript, expected: '', word: '\u0936\u0940\u0930\u094d\u0937\u0915'}) }).then(r => r.json()).then(d => { aiFeedback = d; analyzing = false; }).catch(() => { aiFeedback = {feedback:'Analysis unavailable.'}; analyzing = false; }); }; r.onerror = function() { recording = false; }; r.onend = function() { if(!transcript) recording = false; }; r.start(); } catch(err) { recording = false; alert('Microphone access denied or not available. Please allow microphone access.'); } " :class="recording ? 'bg-rose-600 animate-pulse' : 'bg-emerald-600 hover:bg-emerald-700'" class="inline-flex items-center gap-2 px-5 py-3 rounded-xl text-white font-bold shadow-[0_3px_0_0_#065f46] active:translate-y-[3px] active:shadow-none transition-all" :disabled="checked"> <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 11a7 7 0 01-7 7m0 0a7 7 0 01-7-7m7 7v4m0 0H8m4 0h4m-4-8a3 3 0 01-3-3V5a3 3 0 116 0v6a3 3 0 01-3 3z"/></svg> <span x-text="recording ? 'Listening...' : 'Start Speaking'"></span> </button> <div x-show="transcript" x-cloak class="mt-3 p-3 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50"> <p class="text-xs text-surface-400 uppercase font-bold mb-1">You said:</p> <p class="text-surface-900 dark:text-white font-medium" x-text="transcript"></p> </div> <div x-show="analyzing" x-cloak class="flex items-center gap-2 text-sm text-violet-600 dark:text-violet-400"> <svg class="w-4 h-4 animate-spin" fill="none" viewBox="0 0 24 24"><circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle><path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path></svg> AI is analyzing your pronunciation... </div> <div x-show="aiFeedback && !analyzing" x-cloak class="mt-2 space-y-2"> <div class="flex items-center gap-3"> <div class="flex-shrink-0 w-12 h-12 rounded-xl flex items-center justify-center text-lg font-black" :class="(aiFeedback?.score || 0) >= 7 ? 'bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300' : (aiFeedback?.score || 0) >= 4 ? 'bg-amber-100 dark:bg-amber-900/30 text-amber-700 dark:text-amber-300' : 'bg-rose-100 dark:bg-rose-900/30 text-rose-700 dark:text-rose-300'" x-text="(aiFeedback?.score || 0) + '/10'"></div> <p class="text-surface-700 dark:text-surface-300" x-text="aiFeedback?.feedback || ''"></p> </div> <template x-if="aiFeedback?.pronunciation_tips"> <div class="flex items-start gap-2 p-3 rounded-xl bg-violet-50 dark:bg-violet-900/10 border border-violet-200 dark:border-violet-800"> <svg class="w-4 h-4 text-violet-500 flex-shrink-0 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"/></svg> <p class="text-sm text-violet-700 dark:text-violet-300" x-text="aiFeedback.pronunciation_tips"></p> </div> </template> </div> </div> </template> <template x-if="!supported"> <p class="text-sm text-surface-500 italic">Speech recognition is not supported in your browser. Try Chrome or Edge.</p> </template> </div> <div x-show="answered[136]" x-cloak class="mt-3 text-sm" :class="correct[136] ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="correct[136]">Correct!</span> <span x-show="!correct[136]">Not quite. Correct answer: <strong></strong></span> <p class="mt-1 text-surface-600 dark:text-surface-400">Past tense with 'ने'.</p> </div> </div> </div> <div x-show="(exFilter === 'all' || exFilter === 'speaking') && (exLevel === 'all' || exLevel === '')" x-cloak> <div class="p-5 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50 border-2 border-b-4 border-surface-200 dark:border-[#3b3755]"> <div class="flex items-center gap-2 mb-2"> <span class="inline-flex items-center px-2 py-0.5 rounded-md text-[10px] font-semibold uppercase tracking-wide bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-300"> speaking </span> </div> <p class="text-lg font-semibold text-surface-900 dark:text-white mb-4">Say 'Change the title' in Hindi.</p> <div x-data="{ recording: false, transcript: '', checked: false, isCorrect: false, analyzing: false, aiFeedback: null, supported: 'webkitSpeechRecognition' in window || 'SpeechRecognition' in window }" class="space-y-3"> <div class="p-4 rounded-xl bg-emerald-50 dark:bg-emerald-900/10 border border-emerald-200 dark:border-emerald-800"> <p class="text-sm text-surface-500 dark:text-surface-400 mb-1">Read this aloud:</p> <p class="text-lg font-semibold text-surface-900 dark:text-white font-sans" lang="en" dir="ltr"></p> </div> <button @click="const u = new SpeechSynthesisUtterance(''); u.lang = 'en-US'; u.rate = 0.85; speechSynthesis.speak(u)" class="inline-flex items-center gap-2 px-4 py-2 rounded-xl text-sm font-medium bg-surface-100 dark:bg-surface-800 text-surface-700 dark:text-surface-300 hover:bg-surface-200 transition-all"> <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15.536 8.464a5 5 0 010 7.072m2.828-9.9a9 9 0 010 12.728M5.586 15H4a1 1 0 01-1-1v-4a1 1 0 011-1h1.586l4.707-4.707C10.923 3.663 12 4.109 12 5v14c0 .891-1.077 1.337-1.707.707L5.586 15z"/></svg> Listen first </button> <template x-if="supported"> <div> <button @click=" if(recording || checked) return; recording = true; transcript = ''; aiFeedback = null; try { const SR = window.SpeechRecognition || window.webkitSpeechRecognition; const r = new SR(); r.lang = 'en-US'; r.continuous = false; r.interimResults = false; r.onresult = function(e) { transcript = e.results[0][0].transcript; recording = false; checked = true; const target = ''; const got = transcript.toLowerCase().replace(/[^a-z\s]/g, ''); const words = target.replace(/[^a-z\s]/g, '').split(' '); const matched = words.filter(w => got.includes(w)).length; isCorrect = matched >= words.length * 0.7; answered[137] = true; correct[137] = isCorrect; if(isCorrect) score++; analyzing = true; fetch('/api/vocabulary/analyze-speech', { method: 'POST', headers: {'Content-Type':'application/json','X-CSRF-TOKEN':document.querySelector('meta[name=csrf-token]')?.content||''}, body: JSON.stringify({transcript: transcript, expected: '', word: '\u0936\u0940\u0930\u094d\u0937\u0915'}) }).then(r => r.json()).then(d => { aiFeedback = d; analyzing = false; }).catch(() => { aiFeedback = {feedback:'Analysis unavailable.'}; analyzing = false; }); }; r.onerror = function() { recording = false; }; r.onend = function() { if(!transcript) recording = false; }; r.start(); } catch(err) { recording = false; alert('Microphone access denied or not available. Please allow microphone access.'); } " :class="recording ? 'bg-rose-600 animate-pulse' : 'bg-emerald-600 hover:bg-emerald-700'" class="inline-flex items-center gap-2 px-5 py-3 rounded-xl text-white font-bold shadow-[0_3px_0_0_#065f46] active:translate-y-[3px] active:shadow-none transition-all" :disabled="checked"> <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 11a7 7 0 01-7 7m0 0a7 7 0 01-7-7m7 7v4m0 0H8m4 0h4m-4-8a3 3 0 01-3-3V5a3 3 0 116 0v6a3 3 0 01-3 3z"/></svg> <span x-text="recording ? 'Listening...' : 'Start Speaking'"></span> </button> <div x-show="transcript" x-cloak class="mt-3 p-3 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50"> <p class="text-xs text-surface-400 uppercase font-bold mb-1">You said:</p> <p class="text-surface-900 dark:text-white font-medium" x-text="transcript"></p> </div> <div x-show="analyzing" x-cloak class="flex items-center gap-2 text-sm text-violet-600 dark:text-violet-400"> <svg class="w-4 h-4 animate-spin" fill="none" viewBox="0 0 24 24"><circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle><path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path></svg> AI is analyzing your pronunciation... </div> <div x-show="aiFeedback && !analyzing" x-cloak class="mt-2 space-y-2"> <div class="flex items-center gap-3"> <div class="flex-shrink-0 w-12 h-12 rounded-xl flex items-center justify-center text-lg font-black" :class="(aiFeedback?.score || 0) >= 7 ? 'bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300' : (aiFeedback?.score || 0) >= 4 ? 'bg-amber-100 dark:bg-amber-900/30 text-amber-700 dark:text-amber-300' : 'bg-rose-100 dark:bg-rose-900/30 text-rose-700 dark:text-rose-300'" x-text="(aiFeedback?.score || 0) + '/10'"></div> <p class="text-surface-700 dark:text-surface-300" x-text="aiFeedback?.feedback || ''"></p> </div> <template x-if="aiFeedback?.pronunciation_tips"> <div class="flex items-start gap-2 p-3 rounded-xl bg-violet-50 dark:bg-violet-900/10 border border-violet-200 dark:border-violet-800"> <svg class="w-4 h-4 text-violet-500 flex-shrink-0 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"/></svg> <p class="text-sm text-violet-700 dark:text-violet-300" x-text="aiFeedback.pronunciation_tips"></p> </div> </template> </div> </div> </template> <template x-if="!supported"> <p class="text-sm text-surface-500 italic">Speech recognition is not supported in your browser. Try Chrome or Edge.</p> </template> </div> <div x-show="answered[137]" x-cloak class="mt-3 text-sm" :class="correct[137] ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="correct[137]">Correct!</span> <span x-show="!correct[137]">Not quite. Correct answer: <strong></strong></span> <p class="mt-1 text-surface-600 dark:text-surface-400">Imperative form.</p> </div> </div> </div> <div x-show="(exFilter === 'all' || exFilter === 'speaking') && (exLevel === 'all' || exLevel === '')" x-cloak> <div class="p-5 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50 border-2 border-b-4 border-surface-200 dark:border-[#3b3755]"> <div class="flex items-center gap-2 mb-2"> <span class="inline-flex items-center px-2 py-0.5 rounded-md text-[10px] font-semibold uppercase tracking-wide bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-300"> speaking </span> </div> <p class="text-lg font-semibold text-surface-900 dark:text-white mb-4">Say 'Main heading' in Hindi.</p> <div x-data="{ recording: false, transcript: '', checked: false, isCorrect: false, analyzing: false, aiFeedback: null, supported: 'webkitSpeechRecognition' in window || 'SpeechRecognition' in window }" class="space-y-3"> <div class="p-4 rounded-xl bg-emerald-50 dark:bg-emerald-900/10 border border-emerald-200 dark:border-emerald-800"> <p class="text-sm text-surface-500 dark:text-surface-400 mb-1">Read this aloud:</p> <p class="text-lg font-semibold text-surface-900 dark:text-white font-sans" lang="en" dir="ltr"></p> </div> <button @click="const u = new SpeechSynthesisUtterance(''); u.lang = 'en-US'; u.rate = 0.85; speechSynthesis.speak(u)" class="inline-flex items-center gap-2 px-4 py-2 rounded-xl text-sm font-medium bg-surface-100 dark:bg-surface-800 text-surface-700 dark:text-surface-300 hover:bg-surface-200 transition-all"> <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15.536 8.464a5 5 0 010 7.072m2.828-9.9a9 9 0 010 12.728M5.586 15H4a1 1 0 01-1-1v-4a1 1 0 011-1h1.586l4.707-4.707C10.923 3.663 12 4.109 12 5v14c0 .891-1.077 1.337-1.707.707L5.586 15z"/></svg> Listen first </button> <template x-if="supported"> <div> <button @click=" if(recording || checked) return; recording = true; transcript = ''; aiFeedback = null; try { const SR = window.SpeechRecognition || window.webkitSpeechRecognition; const r = new SR(); r.lang = 'en-US'; r.continuous = false; r.interimResults = false; r.onresult = function(e) { transcript = e.results[0][0].transcript; recording = false; checked = true; const target = ''; const got = transcript.toLowerCase().replace(/[^a-z\s]/g, ''); const words = target.replace(/[^a-z\s]/g, '').split(' '); const matched = words.filter(w => got.includes(w)).length; isCorrect = matched >= words.length * 0.7; answered[138] = true; correct[138] = isCorrect; if(isCorrect) score++; analyzing = true; fetch('/api/vocabulary/analyze-speech', { method: 'POST', headers: {'Content-Type':'application/json','X-CSRF-TOKEN':document.querySelector('meta[name=csrf-token]')?.content||''}, body: JSON.stringify({transcript: transcript, expected: '', word: '\u0936\u0940\u0930\u094d\u0937\u0915'}) }).then(r => r.json()).then(d => { aiFeedback = d; analyzing = false; }).catch(() => { aiFeedback = {feedback:'Analysis unavailable.'}; analyzing = false; }); }; r.onerror = function() { recording = false; }; r.onend = function() { if(!transcript) recording = false; }; r.start(); } catch(err) { recording = false; alert('Microphone access denied or not available. Please allow microphone access.'); } " :class="recording ? 'bg-rose-600 animate-pulse' : 'bg-emerald-600 hover:bg-emerald-700'" class="inline-flex items-center gap-2 px-5 py-3 rounded-xl text-white font-bold shadow-[0_3px_0_0_#065f46] active:translate-y-[3px] active:shadow-none transition-all" :disabled="checked"> <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 11a7 7 0 01-7 7m0 0a7 7 0 01-7-7m7 7v4m0 0H8m4 0h4m-4-8a3 3 0 01-3-3V5a3 3 0 116 0v6a3 3 0 01-3 3z"/></svg> <span x-text="recording ? 'Listening...' : 'Start Speaking'"></span> </button> <div x-show="transcript" x-cloak class="mt-3 p-3 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50"> <p class="text-xs text-surface-400 uppercase font-bold mb-1">You said:</p> <p class="text-surface-900 dark:text-white font-medium" x-text="transcript"></p> </div> <div x-show="analyzing" x-cloak class="flex items-center gap-2 text-sm text-violet-600 dark:text-violet-400"> <svg class="w-4 h-4 animate-spin" fill="none" viewBox="0 0 24 24"><circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle><path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path></svg> AI is analyzing your pronunciation... </div> <div x-show="aiFeedback && !analyzing" x-cloak class="mt-2 space-y-2"> <div class="flex items-center gap-3"> <div class="flex-shrink-0 w-12 h-12 rounded-xl flex items-center justify-center text-lg font-black" :class="(aiFeedback?.score || 0) >= 7 ? 'bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300' : (aiFeedback?.score || 0) >= 4 ? 'bg-amber-100 dark:bg-amber-900/30 text-amber-700 dark:text-amber-300' : 'bg-rose-100 dark:bg-rose-900/30 text-rose-700 dark:text-rose-300'" x-text="(aiFeedback?.score || 0) + '/10'"></div> <p class="text-surface-700 dark:text-surface-300" x-text="aiFeedback?.feedback || ''"></p> </div> <template x-if="aiFeedback?.pronunciation_tips"> <div class="flex items-start gap-2 p-3 rounded-xl bg-violet-50 dark:bg-violet-900/10 border border-violet-200 dark:border-violet-800"> <svg class="w-4 h-4 text-violet-500 flex-shrink-0 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"/></svg> <p class="text-sm text-violet-700 dark:text-violet-300" x-text="aiFeedback.pronunciation_tips"></p> </div> </template> </div> </div> </template> <template x-if="!supported"> <p class="text-sm text-surface-500 italic">Speech recognition is not supported in your browser. Try Chrome or Edge.</p> </template> </div> <div x-show="answered[138]" x-cloak class="mt-3 text-sm" :class="correct[138] ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="correct[138]">Correct!</span> <span x-show="!correct[138]">Not quite. Correct answer: <strong></strong></span> <p class="mt-1 text-surface-600 dark:text-surface-400">'मुख्य' means main.</p> </div> </div> </div> <div x-show="(exFilter === 'all' || exFilter === 'speaking') && (exLevel === 'all' || exLevel === '')" x-cloak> <div class="p-5 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50 border-2 border-b-4 border-surface-200 dark:border-[#3b3755]"> <div class="flex items-center gap-2 mb-2"> <span class="inline-flex items-center px-2 py-0.5 rounded-md text-[10px] font-semibold uppercase tracking-wide bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-300"> speaking </span> </div> <p class="text-lg font-semibold text-surface-900 dark:text-white mb-4">Say 'Untitled' in Hindi.</p> <div x-data="{ recording: false, transcript: '', checked: false, isCorrect: false, analyzing: false, aiFeedback: null, supported: 'webkitSpeechRecognition' in window || 'SpeechRecognition' in window }" class="space-y-3"> <div class="p-4 rounded-xl bg-emerald-50 dark:bg-emerald-900/10 border border-emerald-200 dark:border-emerald-800"> <p class="text-sm text-surface-500 dark:text-surface-400 mb-1">Read this aloud:</p> <p class="text-lg font-semibold text-surface-900 dark:text-white font-sans" lang="en" dir="ltr"></p> </div> <button @click="const u = new SpeechSynthesisUtterance(''); u.lang = 'en-US'; u.rate = 0.85; speechSynthesis.speak(u)" class="inline-flex items-center gap-2 px-4 py-2 rounded-xl text-sm font-medium bg-surface-100 dark:bg-surface-800 text-surface-700 dark:text-surface-300 hover:bg-surface-200 transition-all"> <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15.536 8.464a5 5 0 010 7.072m2.828-9.9a9 9 0 010 12.728M5.586 15H4a1 1 0 01-1-1v-4a1 1 0 011-1h1.586l4.707-4.707C10.923 3.663 12 4.109 12 5v14c0 .891-1.077 1.337-1.707.707L5.586 15z"/></svg> Listen first </button> <template x-if="supported"> <div> <button @click=" if(recording || checked) return; recording = true; transcript = ''; aiFeedback = null; try { const SR = window.SpeechRecognition || window.webkitSpeechRecognition; const r = new SR(); r.lang = 'en-US'; r.continuous = false; r.interimResults = false; r.onresult = function(e) { transcript = e.results[0][0].transcript; recording = false; checked = true; const target = ''; const got = transcript.toLowerCase().replace(/[^a-z\s]/g, ''); const words = target.replace(/[^a-z\s]/g, '').split(' '); const matched = words.filter(w => got.includes(w)).length; isCorrect = matched >= words.length * 0.7; answered[139] = true; correct[139] = isCorrect; if(isCorrect) score++; analyzing = true; fetch('/api/vocabulary/analyze-speech', { method: 'POST', headers: {'Content-Type':'application/json','X-CSRF-TOKEN':document.querySelector('meta[name=csrf-token]')?.content||''}, body: JSON.stringify({transcript: transcript, expected: '', word: '\u0936\u0940\u0930\u094d\u0937\u0915'}) }).then(r => r.json()).then(d => { aiFeedback = d; analyzing = false; }).catch(() => { aiFeedback = {feedback:'Analysis unavailable.'}; analyzing = false; }); }; r.onerror = function() { recording = false; }; r.onend = function() { if(!transcript) recording = false; }; r.start(); } catch(err) { recording = false; alert('Microphone access denied or not available. Please allow microphone access.'); } " :class="recording ? 'bg-rose-600 animate-pulse' : 'bg-emerald-600 hover:bg-emerald-700'" class="inline-flex items-center gap-2 px-5 py-3 rounded-xl text-white font-bold shadow-[0_3px_0_0_#065f46] active:translate-y-[3px] active:shadow-none transition-all" :disabled="checked"> <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 11a7 7 0 01-7 7m0 0a7 7 0 01-7-7m7 7v4m0 0H8m4 0h4m-4-8a3 3 0 01-3-3V5a3 3 0 116 0v6a3 3 0 01-3 3z"/></svg> <span x-text="recording ? 'Listening...' : 'Start Speaking'"></span> </button> <div x-show="transcript" x-cloak class="mt-3 p-3 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50"> <p class="text-xs text-surface-400 uppercase font-bold mb-1">You said:</p> <p class="text-surface-900 dark:text-white font-medium" x-text="transcript"></p> </div> <div x-show="analyzing" x-cloak class="flex items-center gap-2 text-sm text-violet-600 dark:text-violet-400"> <svg class="w-4 h-4 animate-spin" fill="none" viewBox="0 0 24 24"><circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle><path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path></svg> AI is analyzing your pronunciation... </div> <div x-show="aiFeedback && !analyzing" x-cloak class="mt-2 space-y-2"> <div class="flex items-center gap-3"> <div class="flex-shrink-0 w-12 h-12 rounded-xl flex items-center justify-center text-lg font-black" :class="(aiFeedback?.score || 0) >= 7 ? 'bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300' : (aiFeedback?.score || 0) >= 4 ? 'bg-amber-100 dark:bg-amber-900/30 text-amber-700 dark:text-amber-300' : 'bg-rose-100 dark:bg-rose-900/30 text-rose-700 dark:text-rose-300'" x-text="(aiFeedback?.score || 0) + '/10'"></div> <p class="text-surface-700 dark:text-surface-300" x-text="aiFeedback?.feedback || ''"></p> </div> <template x-if="aiFeedback?.pronunciation_tips"> <div class="flex items-start gap-2 p-3 rounded-xl bg-violet-50 dark:bg-violet-900/10 border border-violet-200 dark:border-violet-800"> <svg class="w-4 h-4 text-violet-500 flex-shrink-0 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"/></svg> <p class="text-sm text-violet-700 dark:text-violet-300" x-text="aiFeedback.pronunciation_tips"></p> </div> </template> </div> </div> </template> <template x-if="!supported"> <p class="text-sm text-surface-500 italic">Speech recognition is not supported in your browser. Try Chrome or Edge.</p> </template> </div> <div x-show="answered[139]" x-cloak class="mt-3 text-sm" :class="correct[139] ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="correct[139]">Correct!</span> <span x-show="!correct[139]">Not quite. Correct answer: <strong></strong></span> <p class="mt-1 text-surface-600 dark:text-surface-400">Literally 'without title'.</p> </div> </div> </div> <div x-show="(exFilter === 'all' || exFilter === 'speaking') && (exLevel === 'all' || exLevel === '')" x-cloak> <div class="p-5 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50 border-2 border-b-4 border-surface-200 dark:border-[#3b3755]"> <div class="flex items-center gap-2 mb-2"> <span class="inline-flex items-center px-2 py-0.5 rounded-md text-[10px] font-semibold uppercase tracking-wide bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-300"> speaking </span> </div> <p class="text-lg font-semibold text-surface-900 dark:text-white mb-4">Say 'Title track' in Hindi.</p> <div x-data="{ recording: false, transcript: '', checked: false, isCorrect: false, analyzing: false, aiFeedback: null, supported: 'webkitSpeechRecognition' in window || 'SpeechRecognition' in window }" class="space-y-3"> <div class="p-4 rounded-xl bg-emerald-50 dark:bg-emerald-900/10 border border-emerald-200 dark:border-emerald-800"> <p class="text-sm text-surface-500 dark:text-surface-400 mb-1">Read this aloud:</p> <p class="text-lg font-semibold text-surface-900 dark:text-white font-sans" lang="en" dir="ltr"></p> </div> <button @click="const u = new SpeechSynthesisUtterance(''); u.lang = 'en-US'; u.rate = 0.85; speechSynthesis.speak(u)" class="inline-flex items-center gap-2 px-4 py-2 rounded-xl text-sm font-medium bg-surface-100 dark:bg-surface-800 text-surface-700 dark:text-surface-300 hover:bg-surface-200 transition-all"> <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15.536 8.464a5 5 0 010 7.072m2.828-9.9a9 9 0 010 12.728M5.586 15H4a1 1 0 01-1-1v-4a1 1 0 011-1h1.586l4.707-4.707C10.923 3.663 12 4.109 12 5v14c0 .891-1.077 1.337-1.707.707L5.586 15z"/></svg> Listen first </button> <template x-if="supported"> <div> <button @click=" if(recording || checked) return; recording = true; transcript = ''; aiFeedback = null; try { const SR = window.SpeechRecognition || window.webkitSpeechRecognition; const r = new SR(); r.lang = 'en-US'; r.continuous = false; r.interimResults = false; r.onresult = function(e) { transcript = e.results[0][0].transcript; recording = false; checked = true; const target = ''; const got = transcript.toLowerCase().replace(/[^a-z\s]/g, ''); const words = target.replace(/[^a-z\s]/g, '').split(' '); const matched = words.filter(w => got.includes(w)).length; isCorrect = matched >= words.length * 0.7; answered[140] = true; correct[140] = isCorrect; if(isCorrect) score++; analyzing = true; fetch('/api/vocabulary/analyze-speech', { method: 'POST', headers: {'Content-Type':'application/json','X-CSRF-TOKEN':document.querySelector('meta[name=csrf-token]')?.content||''}, body: JSON.stringify({transcript: transcript, expected: '', word: '\u0936\u0940\u0930\u094d\u0937\u0915'}) }).then(r => r.json()).then(d => { aiFeedback = d; analyzing = false; }).catch(() => { aiFeedback = {feedback:'Analysis unavailable.'}; analyzing = false; }); }; r.onerror = function() { recording = false; }; r.onend = function() { if(!transcript) recording = false; }; r.start(); } catch(err) { recording = false; alert('Microphone access denied or not available. Please allow microphone access.'); } " :class="recording ? 'bg-rose-600 animate-pulse' : 'bg-emerald-600 hover:bg-emerald-700'" class="inline-flex items-center gap-2 px-5 py-3 rounded-xl text-white font-bold shadow-[0_3px_0_0_#065f46] active:translate-y-[3px] active:shadow-none transition-all" :disabled="checked"> <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 11a7 7 0 01-7 7m0 0a7 7 0 01-7-7m7 7v4m0 0H8m4 0h4m-4-8a3 3 0 01-3-3V5a3 3 0 116 0v6a3 3 0 01-3 3z"/></svg> <span x-text="recording ? 'Listening...' : 'Start Speaking'"></span> </button> <div x-show="transcript" x-cloak class="mt-3 p-3 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50"> <p class="text-xs text-surface-400 uppercase font-bold mb-1">You said:</p> <p class="text-surface-900 dark:text-white font-medium" x-text="transcript"></p> </div> <div x-show="analyzing" x-cloak class="flex items-center gap-2 text-sm text-violet-600 dark:text-violet-400"> <svg class="w-4 h-4 animate-spin" fill="none" viewBox="0 0 24 24"><circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle><path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path></svg> AI is analyzing your pronunciation... </div> <div x-show="aiFeedback && !analyzing" x-cloak class="mt-2 space-y-2"> <div class="flex items-center gap-3"> <div class="flex-shrink-0 w-12 h-12 rounded-xl flex items-center justify-center text-lg font-black" :class="(aiFeedback?.score || 0) >= 7 ? 'bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300' : (aiFeedback?.score || 0) >= 4 ? 'bg-amber-100 dark:bg-amber-900/30 text-amber-700 dark:text-amber-300' : 'bg-rose-100 dark:bg-rose-900/30 text-rose-700 dark:text-rose-300'" x-text="(aiFeedback?.score || 0) + '/10'"></div> <p class="text-surface-700 dark:text-surface-300" x-text="aiFeedback?.feedback || ''"></p> </div> <template x-if="aiFeedback?.pronunciation_tips"> <div class="flex items-start gap-2 p-3 rounded-xl bg-violet-50 dark:bg-violet-900/10 border border-violet-200 dark:border-violet-800"> <svg class="w-4 h-4 text-violet-500 flex-shrink-0 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"/></svg> <p class="text-sm text-violet-700 dark:text-violet-300" x-text="aiFeedback.pronunciation_tips"></p> </div> </template> </div> </div> </template> <template x-if="!supported"> <p class="text-sm text-surface-500 italic">Speech recognition is not supported in your browser. Try Chrome or Edge.</p> </template> </div> <div x-show="answered[140]" x-cloak class="mt-3 text-sm" :class="correct[140] ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="correct[140]">Correct!</span> <span x-show="!correct[140]">Not quite. Correct answer: <strong></strong></span> <p class="mt-1 text-surface-600 dark:text-surface-400">'गीत' means song.</p> </div> </div> </div> <div x-show="(exFilter === 'all' || exFilter === 'speaking') && (exLevel === 'all' || exLevel === '')" x-cloak> <div class="p-5 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50 border-2 border-b-4 border-surface-200 dark:border-[#3b3755]"> <div class="flex items-center gap-2 mb-2"> <span class="inline-flex items-center px-2 py-0.5 rounded-md text-[10px] font-semibold uppercase tracking-wide bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-300"> speaking </span> </div> <p class="text-lg font-semibold text-surface-900 dark:text-white mb-4">Say 'According to the title' in Hindi.</p> <div x-data="{ recording: false, transcript: '', checked: false, isCorrect: false, analyzing: false, aiFeedback: null, supported: 'webkitSpeechRecognition' in window || 'SpeechRecognition' in window }" class="space-y-3"> <div class="p-4 rounded-xl bg-emerald-50 dark:bg-emerald-900/10 border border-emerald-200 dark:border-emerald-800"> <p class="text-sm text-surface-500 dark:text-surface-400 mb-1">Read this aloud:</p> <p class="text-lg font-semibold text-surface-900 dark:text-white font-sans" lang="en" dir="ltr"></p> </div> <button @click="const u = new SpeechSynthesisUtterance(''); u.lang = 'en-US'; u.rate = 0.85; speechSynthesis.speak(u)" class="inline-flex items-center gap-2 px-4 py-2 rounded-xl text-sm font-medium bg-surface-100 dark:bg-surface-800 text-surface-700 dark:text-surface-300 hover:bg-surface-200 transition-all"> <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15.536 8.464a5 5 0 010 7.072m2.828-9.9a9 9 0 010 12.728M5.586 15H4a1 1 0 01-1-1v-4a1 1 0 011-1h1.586l4.707-4.707C10.923 3.663 12 4.109 12 5v14c0 .891-1.077 1.337-1.707.707L5.586 15z"/></svg> Listen first </button> <template x-if="supported"> <div> <button @click=" if(recording || checked) return; recording = true; transcript = ''; aiFeedback = null; try { const SR = window.SpeechRecognition || window.webkitSpeechRecognition; const r = new SR(); r.lang = 'en-US'; r.continuous = false; r.interimResults = false; r.onresult = function(e) { transcript = e.results[0][0].transcript; recording = false; checked = true; const target = ''; const got = transcript.toLowerCase().replace(/[^a-z\s]/g, ''); const words = target.replace(/[^a-z\s]/g, '').split(' '); const matched = words.filter(w => got.includes(w)).length; isCorrect = matched >= words.length * 0.7; answered[141] = true; correct[141] = isCorrect; if(isCorrect) score++; analyzing = true; fetch('/api/vocabulary/analyze-speech', { method: 'POST', headers: {'Content-Type':'application/json','X-CSRF-TOKEN':document.querySelector('meta[name=csrf-token]')?.content||''}, body: JSON.stringify({transcript: transcript, expected: '', word: '\u0936\u0940\u0930\u094d\u0937\u0915'}) }).then(r => r.json()).then(d => { aiFeedback = d; analyzing = false; }).catch(() => { aiFeedback = {feedback:'Analysis unavailable.'}; analyzing = false; }); }; r.onerror = function() { recording = false; }; r.onend = function() { if(!transcript) recording = false; }; r.start(); } catch(err) { recording = false; alert('Microphone access denied or not available. Please allow microphone access.'); } " :class="recording ? 'bg-rose-600 animate-pulse' : 'bg-emerald-600 hover:bg-emerald-700'" class="inline-flex items-center gap-2 px-5 py-3 rounded-xl text-white font-bold shadow-[0_3px_0_0_#065f46] active:translate-y-[3px] active:shadow-none transition-all" :disabled="checked"> <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 11a7 7 0 01-7 7m0 0a7 7 0 01-7-7m7 7v4m0 0H8m4 0h4m-4-8a3 3 0 01-3-3V5a3 3 0 116 0v6a3 3 0 01-3 3z"/></svg> <span x-text="recording ? 'Listening...' : 'Start Speaking'"></span> </button> <div x-show="transcript" x-cloak class="mt-3 p-3 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50"> <p class="text-xs text-surface-400 uppercase font-bold mb-1">You said:</p> <p class="text-surface-900 dark:text-white font-medium" x-text="transcript"></p> </div> <div x-show="analyzing" x-cloak class="flex items-center gap-2 text-sm text-violet-600 dark:text-violet-400"> <svg class="w-4 h-4 animate-spin" fill="none" viewBox="0 0 24 24"><circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle><path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path></svg> AI is analyzing your pronunciation... </div> <div x-show="aiFeedback && !analyzing" x-cloak class="mt-2 space-y-2"> <div class="flex items-center gap-3"> <div class="flex-shrink-0 w-12 h-12 rounded-xl flex items-center justify-center text-lg font-black" :class="(aiFeedback?.score || 0) >= 7 ? 'bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300' : (aiFeedback?.score || 0) >= 4 ? 'bg-amber-100 dark:bg-amber-900/30 text-amber-700 dark:text-amber-300' : 'bg-rose-100 dark:bg-rose-900/30 text-rose-700 dark:text-rose-300'" x-text="(aiFeedback?.score || 0) + '/10'"></div> <p class="text-surface-700 dark:text-surface-300" x-text="aiFeedback?.feedback || ''"></p> </div> <template x-if="aiFeedback?.pronunciation_tips"> <div class="flex items-start gap-2 p-3 rounded-xl bg-violet-50 dark:bg-violet-900/10 border border-violet-200 dark:border-violet-800"> <svg class="w-4 h-4 text-violet-500 flex-shrink-0 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"/></svg> <p class="text-sm text-violet-700 dark:text-violet-300" x-text="aiFeedback.pronunciation_tips"></p> </div> </template> </div> </div> </template> <template x-if="!supported"> <p class="text-sm text-surface-500 italic">Speech recognition is not supported in your browser. Try Chrome or Edge.</p> </template> </div> <div x-show="answered[141]" x-cloak class="mt-3 text-sm" :class="correct[141] ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="correct[141]">Correct!</span> <span x-show="!correct[141]">Not quite. Correct answer: <strong></strong></span> <p class="mt-1 text-surface-600 dark:text-surface-400">'के अनुसार' means according to.</p> </div> </div> </div> <div x-show="(exFilter === 'all' || exFilter === 'speaking') && (exLevel === 'all' || exLevel === '')" x-cloak> <div class="p-5 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50 border-2 border-b-4 border-surface-200 dark:border-[#3b3755]"> <div class="flex items-center gap-2 mb-2"> <span class="inline-flex items-center px-2 py-0.5 rounded-md text-[10px] font-semibold uppercase tracking-wide bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-300"> speaking </span> </div> <p class="text-lg font-semibold text-surface-900 dark:text-white mb-4">Say 'New title' in Hindi.</p> <div x-data="{ recording: false, transcript: '', checked: false, isCorrect: false, analyzing: false, aiFeedback: null, supported: 'webkitSpeechRecognition' in window || 'SpeechRecognition' in window }" class="space-y-3"> <div class="p-4 rounded-xl bg-emerald-50 dark:bg-emerald-900/10 border border-emerald-200 dark:border-emerald-800"> <p class="text-sm text-surface-500 dark:text-surface-400 mb-1">Read this aloud:</p> <p class="text-lg font-semibold text-surface-900 dark:text-white font-sans" lang="en" dir="ltr"></p> </div> <button @click="const u = new SpeechSynthesisUtterance(''); u.lang = 'en-US'; u.rate = 0.85; speechSynthesis.speak(u)" class="inline-flex items-center gap-2 px-4 py-2 rounded-xl text-sm font-medium bg-surface-100 dark:bg-surface-800 text-surface-700 dark:text-surface-300 hover:bg-surface-200 transition-all"> <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15.536 8.464a5 5 0 010 7.072m2.828-9.9a9 9 0 010 12.728M5.586 15H4a1 1 0 01-1-1v-4a1 1 0 011-1h1.586l4.707-4.707C10.923 3.663 12 4.109 12 5v14c0 .891-1.077 1.337-1.707.707L5.586 15z"/></svg> Listen first </button> <template x-if="supported"> <div> <button @click=" if(recording || checked) return; recording = true; transcript = ''; aiFeedback = null; try { const SR = window.SpeechRecognition || window.webkitSpeechRecognition; const r = new SR(); r.lang = 'en-US'; r.continuous = false; r.interimResults = false; r.onresult = function(e) { transcript = e.results[0][0].transcript; recording = false; checked = true; const target = ''; const got = transcript.toLowerCase().replace(/[^a-z\s]/g, ''); const words = target.replace(/[^a-z\s]/g, '').split(' '); const matched = words.filter(w => got.includes(w)).length; isCorrect = matched >= words.length * 0.7; answered[142] = true; correct[142] = isCorrect; if(isCorrect) score++; analyzing = true; fetch('/api/vocabulary/analyze-speech', { method: 'POST', headers: {'Content-Type':'application/json','X-CSRF-TOKEN':document.querySelector('meta[name=csrf-token]')?.content||''}, body: JSON.stringify({transcript: transcript, expected: '', word: '\u0936\u0940\u0930\u094d\u0937\u0915'}) }).then(r => r.json()).then(d => { aiFeedback = d; analyzing = false; }).catch(() => { aiFeedback = {feedback:'Analysis unavailable.'}; analyzing = false; }); }; r.onerror = function() { recording = false; }; r.onend = function() { if(!transcript) recording = false; }; r.start(); } catch(err) { recording = false; alert('Microphone access denied or not available. Please allow microphone access.'); } " :class="recording ? 'bg-rose-600 animate-pulse' : 'bg-emerald-600 hover:bg-emerald-700'" class="inline-flex items-center gap-2 px-5 py-3 rounded-xl text-white font-bold shadow-[0_3px_0_0_#065f46] active:translate-y-[3px] active:shadow-none transition-all" :disabled="checked"> <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 11a7 7 0 01-7 7m0 0a7 7 0 01-7-7m7 7v4m0 0H8m4 0h4m-4-8a3 3 0 01-3-3V5a3 3 0 116 0v6a3 3 0 01-3 3z"/></svg> <span x-text="recording ? 'Listening...' : 'Start Speaking'"></span> </button> <div x-show="transcript" x-cloak class="mt-3 p-3 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50"> <p class="text-xs text-surface-400 uppercase font-bold mb-1">You said:</p> <p class="text-surface-900 dark:text-white font-medium" x-text="transcript"></p> </div> <div x-show="analyzing" x-cloak class="flex items-center gap-2 text-sm text-violet-600 dark:text-violet-400"> <svg class="w-4 h-4 animate-spin" fill="none" viewBox="0 0 24 24"><circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle><path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path></svg> AI is analyzing your pronunciation... </div> <div x-show="aiFeedback && !analyzing" x-cloak class="mt-2 space-y-2"> <div class="flex items-center gap-3"> <div class="flex-shrink-0 w-12 h-12 rounded-xl flex items-center justify-center text-lg font-black" :class="(aiFeedback?.score || 0) >= 7 ? 'bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300' : (aiFeedback?.score || 0) >= 4 ? 'bg-amber-100 dark:bg-amber-900/30 text-amber-700 dark:text-amber-300' : 'bg-rose-100 dark:bg-rose-900/30 text-rose-700 dark:text-rose-300'" x-text="(aiFeedback?.score || 0) + '/10'"></div> <p class="text-surface-700 dark:text-surface-300" x-text="aiFeedback?.feedback || ''"></p> </div> <template x-if="aiFeedback?.pronunciation_tips"> <div class="flex items-start gap-2 p-3 rounded-xl bg-violet-50 dark:bg-violet-900/10 border border-violet-200 dark:border-violet-800"> <svg class="w-4 h-4 text-violet-500 flex-shrink-0 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"/></svg> <p class="text-sm text-violet-700 dark:text-violet-300" x-text="aiFeedback.pronunciation_tips"></p> </div> </template> </div> </div> </template> <template x-if="!supported"> <p class="text-sm text-surface-500 italic">Speech recognition is not supported in your browser. Try Chrome or Edge.</p> </template> </div> <div x-show="answered[142]" x-cloak class="mt-3 text-sm" :class="correct[142] ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="correct[142]">Correct!</span> <span x-show="!correct[142]">Not quite. Correct answer: <strong></strong></span> <p class="mt-1 text-surface-600 dark:text-surface-400">Masculine adjective 'नया'.</p> </div> </div> </div> <div x-show="(exFilter === 'all' || exFilter === 'speaking') && (exLevel === 'all' || exLevel === '')" x-cloak> <div class="p-5 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50 border-2 border-b-4 border-surface-200 dark:border-[#3b3755]"> <div class="flex items-center gap-2 mb-2"> <span class="inline-flex items-center px-2 py-0.5 rounded-md text-[10px] font-semibold uppercase tracking-wide bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-300"> speaking </span> </div> <p class="text-lg font-semibold text-surface-900 dark:text-white mb-4">Say 'Give a title' in Hindi.</p> <div x-data="{ recording: false, transcript: '', checked: false, isCorrect: false, analyzing: false, aiFeedback: null, supported: 'webkitSpeechRecognition' in window || 'SpeechRecognition' in window }" class="space-y-3"> <div class="p-4 rounded-xl bg-emerald-50 dark:bg-emerald-900/10 border border-emerald-200 dark:border-emerald-800"> <p class="text-sm text-surface-500 dark:text-surface-400 mb-1">Read this aloud:</p> <p class="text-lg font-semibold text-surface-900 dark:text-white font-sans" lang="en" dir="ltr"></p> </div> <button @click="const u = new SpeechSynthesisUtterance(''); u.lang = 'en-US'; u.rate = 0.85; speechSynthesis.speak(u)" class="inline-flex items-center gap-2 px-4 py-2 rounded-xl text-sm font-medium bg-surface-100 dark:bg-surface-800 text-surface-700 dark:text-surface-300 hover:bg-surface-200 transition-all"> <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15.536 8.464a5 5 0 010 7.072m2.828-9.9a9 9 0 010 12.728M5.586 15H4a1 1 0 01-1-1v-4a1 1 0 011-1h1.586l4.707-4.707C10.923 3.663 12 4.109 12 5v14c0 .891-1.077 1.337-1.707.707L5.586 15z"/></svg> Listen first </button> <template x-if="supported"> <div> <button @click=" if(recording || checked) return; recording = true; transcript = ''; aiFeedback = null; try { const SR = window.SpeechRecognition || window.webkitSpeechRecognition; const r = new SR(); r.lang = 'en-US'; r.continuous = false; r.interimResults = false; r.onresult = function(e) { transcript = e.results[0][0].transcript; recording = false; checked = true; const target = ''; const got = transcript.toLowerCase().replace(/[^a-z\s]/g, ''); const words = target.replace(/[^a-z\s]/g, '').split(' '); const matched = words.filter(w => got.includes(w)).length; isCorrect = matched >= words.length * 0.7; answered[143] = true; correct[143] = isCorrect; if(isCorrect) score++; analyzing = true; fetch('/api/vocabulary/analyze-speech', { method: 'POST', headers: {'Content-Type':'application/json','X-CSRF-TOKEN':document.querySelector('meta[name=csrf-token]')?.content||''}, body: JSON.stringify({transcript: transcript, expected: '', word: '\u0936\u0940\u0930\u094d\u0937\u0915'}) }).then(r => r.json()).then(d => { aiFeedback = d; analyzing = false; }).catch(() => { aiFeedback = {feedback:'Analysis unavailable.'}; analyzing = false; }); }; r.onerror = function() { recording = false; }; r.onend = function() { if(!transcript) recording = false; }; r.start(); } catch(err) { recording = false; alert('Microphone access denied or not available. Please allow microphone access.'); } " :class="recording ? 'bg-rose-600 animate-pulse' : 'bg-emerald-600 hover:bg-emerald-700'" class="inline-flex items-center gap-2 px-5 py-3 rounded-xl text-white font-bold shadow-[0_3px_0_0_#065f46] active:translate-y-[3px] active:shadow-none transition-all" :disabled="checked"> <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 11a7 7 0 01-7 7m0 0a7 7 0 01-7-7m7 7v4m0 0H8m4 0h4m-4-8a3 3 0 01-3-3V5a3 3 0 116 0v6a3 3 0 01-3 3z"/></svg> <span x-text="recording ? 'Listening...' : 'Start Speaking'"></span> </button> <div x-show="transcript" x-cloak class="mt-3 p-3 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50"> <p class="text-xs text-surface-400 uppercase font-bold mb-1">You said:</p> <p class="text-surface-900 dark:text-white font-medium" x-text="transcript"></p> </div> <div x-show="analyzing" x-cloak class="flex items-center gap-2 text-sm text-violet-600 dark:text-violet-400"> <svg class="w-4 h-4 animate-spin" fill="none" viewBox="0 0 24 24"><circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle><path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path></svg> AI is analyzing your pronunciation... </div> <div x-show="aiFeedback && !analyzing" x-cloak class="mt-2 space-y-2"> <div class="flex items-center gap-3"> <div class="flex-shrink-0 w-12 h-12 rounded-xl flex items-center justify-center text-lg font-black" :class="(aiFeedback?.score || 0) >= 7 ? 'bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300' : (aiFeedback?.score || 0) >= 4 ? 'bg-amber-100 dark:bg-amber-900/30 text-amber-700 dark:text-amber-300' : 'bg-rose-100 dark:bg-rose-900/30 text-rose-700 dark:text-rose-300'" x-text="(aiFeedback?.score || 0) + '/10'"></div> <p class="text-surface-700 dark:text-surface-300" x-text="aiFeedback?.feedback || ''"></p> </div> <template x-if="aiFeedback?.pronunciation_tips"> <div class="flex items-start gap-2 p-3 rounded-xl bg-violet-50 dark:bg-violet-900/10 border border-violet-200 dark:border-violet-800"> <svg class="w-4 h-4 text-violet-500 flex-shrink-0 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"/></svg> <p class="text-sm text-violet-700 dark:text-violet-300" x-text="aiFeedback.pronunciation_tips"></p> </div> </template> </div> </div> </template> <template x-if="!supported"> <p class="text-sm text-surface-500 italic">Speech recognition is not supported in your browser. Try Chrome or Edge.</p> </template> </div> <div x-show="answered[143]" x-cloak class="mt-3 text-sm" :class="correct[143] ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="correct[143]">Correct!</span> <span x-show="!correct[143]">Not quite. Correct answer: <strong></strong></span> <p class="mt-1 text-surface-600 dark:text-surface-400">Formal imperative.</p> </div> </div> </div> <div x-show="(exFilter === 'all' || exFilter === 'speaking') && (exLevel === 'all' || exLevel === '')" x-cloak> <div class="p-5 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50 border-2 border-b-4 border-surface-200 dark:border-[#3b3755]"> <div class="flex items-center gap-2 mb-2"> <span class="inline-flex items-center px-2 py-0.5 rounded-md text-[10px] font-semibold uppercase tracking-wide bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-300"> speaking </span> </div> <p class="text-lg font-semibold text-surface-900 dark:text-white mb-4">Say 'The title is misleading' in Hindi.</p> <div x-data="{ recording: false, transcript: '', checked: false, isCorrect: false, analyzing: false, aiFeedback: null, supported: 'webkitSpeechRecognition' in window || 'SpeechRecognition' in window }" class="space-y-3"> <div class="p-4 rounded-xl bg-emerald-50 dark:bg-emerald-900/10 border border-emerald-200 dark:border-emerald-800"> <p class="text-sm text-surface-500 dark:text-surface-400 mb-1">Read this aloud:</p> <p class="text-lg font-semibold text-surface-900 dark:text-white font-sans" lang="en" dir="ltr"></p> </div> <button @click="const u = new SpeechSynthesisUtterance(''); u.lang = 'en-US'; u.rate = 0.85; speechSynthesis.speak(u)" class="inline-flex items-center gap-2 px-4 py-2 rounded-xl text-sm font-medium bg-surface-100 dark:bg-surface-800 text-surface-700 dark:text-surface-300 hover:bg-surface-200 transition-all"> <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15.536 8.464a5 5 0 010 7.072m2.828-9.9a9 9 0 010 12.728M5.586 15H4a1 1 0 01-1-1v-4a1 1 0 011-1h1.586l4.707-4.707C10.923 3.663 12 4.109 12 5v14c0 .891-1.077 1.337-1.707.707L5.586 15z"/></svg> Listen first </button> <template x-if="supported"> <div> <button @click=" if(recording || checked) return; recording = true; transcript = ''; aiFeedback = null; try { const SR = window.SpeechRecognition || window.webkitSpeechRecognition; const r = new SR(); r.lang = 'en-US'; r.continuous = false; r.interimResults = false; r.onresult = function(e) { transcript = e.results[0][0].transcript; recording = false; checked = true; const target = ''; const got = transcript.toLowerCase().replace(/[^a-z\s]/g, ''); const words = target.replace(/[^a-z\s]/g, '').split(' '); const matched = words.filter(w => got.includes(w)).length; isCorrect = matched >= words.length * 0.7; answered[144] = true; correct[144] = isCorrect; if(isCorrect) score++; analyzing = true; fetch('/api/vocabulary/analyze-speech', { method: 'POST', headers: {'Content-Type':'application/json','X-CSRF-TOKEN':document.querySelector('meta[name=csrf-token]')?.content||''}, body: JSON.stringify({transcript: transcript, expected: '', word: '\u0936\u0940\u0930\u094d\u0937\u0915'}) }).then(r => r.json()).then(d => { aiFeedback = d; analyzing = false; }).catch(() => { aiFeedback = {feedback:'Analysis unavailable.'}; analyzing = false; }); }; r.onerror = function() { recording = false; }; r.onend = function() { if(!transcript) recording = false; }; r.start(); } catch(err) { recording = false; alert('Microphone access denied or not available. Please allow microphone access.'); } " :class="recording ? 'bg-rose-600 animate-pulse' : 'bg-emerald-600 hover:bg-emerald-700'" class="inline-flex items-center gap-2 px-5 py-3 rounded-xl text-white font-bold shadow-[0_3px_0_0_#065f46] active:translate-y-[3px] active:shadow-none transition-all" :disabled="checked"> <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 11a7 7 0 01-7 7m0 0a7 7 0 01-7-7m7 7v4m0 0H8m4 0h4m-4-8a3 3 0 01-3-3V5a3 3 0 116 0v6a3 3 0 01-3 3z"/></svg> <span x-text="recording ? 'Listening...' : 'Start Speaking'"></span> </button> <div x-show="transcript" x-cloak class="mt-3 p-3 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50"> <p class="text-xs text-surface-400 uppercase font-bold mb-1">You said:</p> <p class="text-surface-900 dark:text-white font-medium" x-text="transcript"></p> </div> <div x-show="analyzing" x-cloak class="flex items-center gap-2 text-sm text-violet-600 dark:text-violet-400"> <svg class="w-4 h-4 animate-spin" fill="none" viewBox="0 0 24 24"><circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle><path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path></svg> AI is analyzing your pronunciation... </div> <div x-show="aiFeedback && !analyzing" x-cloak class="mt-2 space-y-2"> <div class="flex items-center gap-3"> <div class="flex-shrink-0 w-12 h-12 rounded-xl flex items-center justify-center text-lg font-black" :class="(aiFeedback?.score || 0) >= 7 ? 'bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300' : (aiFeedback?.score || 0) >= 4 ? 'bg-amber-100 dark:bg-amber-900/30 text-amber-700 dark:text-amber-300' : 'bg-rose-100 dark:bg-rose-900/30 text-rose-700 dark:text-rose-300'" x-text="(aiFeedback?.score || 0) + '/10'"></div> <p class="text-surface-700 dark:text-surface-300" x-text="aiFeedback?.feedback || ''"></p> </div> <template x-if="aiFeedback?.pronunciation_tips"> <div class="flex items-start gap-2 p-3 rounded-xl bg-violet-50 dark:bg-violet-900/10 border border-violet-200 dark:border-violet-800"> <svg class="w-4 h-4 text-violet-500 flex-shrink-0 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"/></svg> <p class="text-sm text-violet-700 dark:text-violet-300" x-text="aiFeedback.pronunciation_tips"></p> </div> </template> </div> </div> </template> <template x-if="!supported"> <p class="text-sm text-surface-500 italic">Speech recognition is not supported in your browser. Try Chrome or Edge.</p> </template> </div> <div x-show="answered[144]" x-cloak class="mt-3 text-sm" :class="correct[144] ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="correct[144]">Correct!</span> <span x-show="!correct[144]">Not quite. Correct answer: <strong></strong></span> <p class="mt-1 text-surface-600 dark:text-surface-400">'भ्रामक' means misleading.</p> </div> </div> </div> <div x-show="(exFilter === 'all' || exFilter === 'speaking') && (exLevel === 'all' || exLevel === '')" x-cloak> <div class="p-5 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50 border-2 border-b-4 border-surface-200 dark:border-[#3b3755]"> <div class="flex items-center gap-2 mb-2"> <span class="inline-flex items-center px-2 py-0.5 rounded-md text-[10px] font-semibold uppercase tracking-wide bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-300"> speaking </span> </div> <p class="text-lg font-semibold text-surface-900 dark:text-white mb-4">Say 'I forgot the title' in Hindi.</p> <div x-data="{ recording: false, transcript: '', checked: false, isCorrect: false, analyzing: false, aiFeedback: null, supported: 'webkitSpeechRecognition' in window || 'SpeechRecognition' in window }" class="space-y-3"> <div class="p-4 rounded-xl bg-emerald-50 dark:bg-emerald-900/10 border border-emerald-200 dark:border-emerald-800"> <p class="text-sm text-surface-500 dark:text-surface-400 mb-1">Read this aloud:</p> <p class="text-lg font-semibold text-surface-900 dark:text-white font-sans" lang="en" dir="ltr"></p> </div> <button @click="const u = new SpeechSynthesisUtterance(''); u.lang = 'en-US'; u.rate = 0.85; speechSynthesis.speak(u)" class="inline-flex items-center gap-2 px-4 py-2 rounded-xl text-sm font-medium bg-surface-100 dark:bg-surface-800 text-surface-700 dark:text-surface-300 hover:bg-surface-200 transition-all"> <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15.536 8.464a5 5 0 010 7.072m2.828-9.9a9 9 0 010 12.728M5.586 15H4a1 1 0 01-1-1v-4a1 1 0 011-1h1.586l4.707-4.707C10.923 3.663 12 4.109 12 5v14c0 .891-1.077 1.337-1.707.707L5.586 15z"/></svg> Listen first </button> <template x-if="supported"> <div> <button @click=" if(recording || checked) return; recording = true; transcript = ''; aiFeedback = null; try { const SR = window.SpeechRecognition || window.webkitSpeechRecognition; const r = new SR(); r.lang = 'en-US'; r.continuous = false; r.interimResults = false; r.onresult = function(e) { transcript = e.results[0][0].transcript; recording = false; checked = true; const target = ''; const got = transcript.toLowerCase().replace(/[^a-z\s]/g, ''); const words = target.replace(/[^a-z\s]/g, '').split(' '); const matched = words.filter(w => got.includes(w)).length; isCorrect = matched >= words.length * 0.7; answered[145] = true; correct[145] = isCorrect; if(isCorrect) score++; analyzing = true; fetch('/api/vocabulary/analyze-speech', { method: 'POST', headers: {'Content-Type':'application/json','X-CSRF-TOKEN':document.querySelector('meta[name=csrf-token]')?.content||''}, body: JSON.stringify({transcript: transcript, expected: '', word: '\u0936\u0940\u0930\u094d\u0937\u0915'}) }).then(r => r.json()).then(d => { aiFeedback = d; analyzing = false; }).catch(() => { aiFeedback = {feedback:'Analysis unavailable.'}; analyzing = false; }); }; r.onerror = function() { recording = false; }; r.onend = function() { if(!transcript) recording = false; }; r.start(); } catch(err) { recording = false; alert('Microphone access denied or not available. Please allow microphone access.'); } " :class="recording ? 'bg-rose-600 animate-pulse' : 'bg-emerald-600 hover:bg-emerald-700'" class="inline-flex items-center gap-2 px-5 py-3 rounded-xl text-white font-bold shadow-[0_3px_0_0_#065f46] active:translate-y-[3px] active:shadow-none transition-all" :disabled="checked"> <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 11a7 7 0 01-7 7m0 0a7 7 0 01-7-7m7 7v4m0 0H8m4 0h4m-4-8a3 3 0 01-3-3V5a3 3 0 116 0v6a3 3 0 01-3 3z"/></svg> <span x-text="recording ? 'Listening...' : 'Start Speaking'"></span> </button> <div x-show="transcript" x-cloak class="mt-3 p-3 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50"> <p class="text-xs text-surface-400 uppercase font-bold mb-1">You said:</p> <p class="text-surface-900 dark:text-white font-medium" x-text="transcript"></p> </div> <div x-show="analyzing" x-cloak class="flex items-center gap-2 text-sm text-violet-600 dark:text-violet-400"> <svg class="w-4 h-4 animate-spin" fill="none" viewBox="0 0 24 24"><circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle><path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path></svg> AI is analyzing your pronunciation... </div> <div x-show="aiFeedback && !analyzing" x-cloak class="mt-2 space-y-2"> <div class="flex items-center gap-3"> <div class="flex-shrink-0 w-12 h-12 rounded-xl flex items-center justify-center text-lg font-black" :class="(aiFeedback?.score || 0) >= 7 ? 'bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300' : (aiFeedback?.score || 0) >= 4 ? 'bg-amber-100 dark:bg-amber-900/30 text-amber-700 dark:text-amber-300' : 'bg-rose-100 dark:bg-rose-900/30 text-rose-700 dark:text-rose-300'" x-text="(aiFeedback?.score || 0) + '/10'"></div> <p class="text-surface-700 dark:text-surface-300" x-text="aiFeedback?.feedback || ''"></p> </div> <template x-if="aiFeedback?.pronunciation_tips"> <div class="flex items-start gap-2 p-3 rounded-xl bg-violet-50 dark:bg-violet-900/10 border border-violet-200 dark:border-violet-800"> <svg class="w-4 h-4 text-violet-500 flex-shrink-0 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"/></svg> <p class="text-sm text-violet-700 dark:text-violet-300" x-text="aiFeedback.pronunciation_tips"></p> </div> </template> </div> </div> </template> <template x-if="!supported"> <p class="text-sm text-surface-500 italic">Speech recognition is not supported in your browser. Try Chrome or Edge.</p> </template> </div> <div x-show="answered[145]" x-cloak class="mt-3 text-sm" :class="correct[145] ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="correct[145]">Correct!</span> <span x-show="!correct[145]">Not quite. Correct answer: <strong></strong></span> <p class="mt-1 text-surface-600 dark:text-surface-400">Past tense of forget.</p> </div> </div> </div> <div x-show="(exFilter === 'all' || exFilter === 'speaking') && (exLevel === 'all' || exLevel === '')" x-cloak> <div class="p-5 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50 border-2 border-b-4 border-surface-200 dark:border-[#3b3755]"> <div class="flex items-center gap-2 mb-2"> <span class="inline-flex items-center px-2 py-0.5 rounded-md text-[10px] font-semibold uppercase tracking-wide bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-300"> speaking </span> </div> <p class="text-lg font-semibold text-surface-900 dark:text-white mb-4">Say 'Read the title' in Hindi.</p> <div x-data="{ recording: false, transcript: '', checked: false, isCorrect: false, analyzing: false, aiFeedback: null, supported: 'webkitSpeechRecognition' in window || 'SpeechRecognition' in window }" class="space-y-3"> <div class="p-4 rounded-xl bg-emerald-50 dark:bg-emerald-900/10 border border-emerald-200 dark:border-emerald-800"> <p class="text-sm text-surface-500 dark:text-surface-400 mb-1">Read this aloud:</p> <p class="text-lg font-semibold text-surface-900 dark:text-white font-sans" lang="en" dir="ltr"></p> </div> <button @click="const u = new SpeechSynthesisUtterance(''); u.lang = 'en-US'; u.rate = 0.85; speechSynthesis.speak(u)" class="inline-flex items-center gap-2 px-4 py-2 rounded-xl text-sm font-medium bg-surface-100 dark:bg-surface-800 text-surface-700 dark:text-surface-300 hover:bg-surface-200 transition-all"> <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15.536 8.464a5 5 0 010 7.072m2.828-9.9a9 9 0 010 12.728M5.586 15H4a1 1 0 01-1-1v-4a1 1 0 011-1h1.586l4.707-4.707C10.923 3.663 12 4.109 12 5v14c0 .891-1.077 1.337-1.707.707L5.586 15z"/></svg> Listen first </button> <template x-if="supported"> <div> <button @click=" if(recording || checked) return; recording = true; transcript = ''; aiFeedback = null; try { const SR = window.SpeechRecognition || window.webkitSpeechRecognition; const r = new SR(); r.lang = 'en-US'; r.continuous = false; r.interimResults = false; r.onresult = function(e) { transcript = e.results[0][0].transcript; recording = false; checked = true; const target = ''; const got = transcript.toLowerCase().replace(/[^a-z\s]/g, ''); const words = target.replace(/[^a-z\s]/g, '').split(' '); const matched = words.filter(w => got.includes(w)).length; isCorrect = matched >= words.length * 0.7; answered[146] = true; correct[146] = isCorrect; if(isCorrect) score++; analyzing = true; fetch('/api/vocabulary/analyze-speech', { method: 'POST', headers: {'Content-Type':'application/json','X-CSRF-TOKEN':document.querySelector('meta[name=csrf-token]')?.content||''}, body: JSON.stringify({transcript: transcript, expected: '', word: '\u0936\u0940\u0930\u094d\u0937\u0915'}) }).then(r => r.json()).then(d => { aiFeedback = d; analyzing = false; }).catch(() => { aiFeedback = {feedback:'Analysis unavailable.'}; analyzing = false; }); }; r.onerror = function() { recording = false; }; r.onend = function() { if(!transcript) recording = false; }; r.start(); } catch(err) { recording = false; alert('Microphone access denied or not available. Please allow microphone access.'); } " :class="recording ? 'bg-rose-600 animate-pulse' : 'bg-emerald-600 hover:bg-emerald-700'" class="inline-flex items-center gap-2 px-5 py-3 rounded-xl text-white font-bold shadow-[0_3px_0_0_#065f46] active:translate-y-[3px] active:shadow-none transition-all" :disabled="checked"> <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 11a7 7 0 01-7 7m0 0a7 7 0 01-7-7m7 7v4m0 0H8m4 0h4m-4-8a3 3 0 01-3-3V5a3 3 0 116 0v6a3 3 0 01-3 3z"/></svg> <span x-text="recording ? 'Listening...' : 'Start Speaking'"></span> </button> <div x-show="transcript" x-cloak class="mt-3 p-3 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50"> <p class="text-xs text-surface-400 uppercase font-bold mb-1">You said:</p> <p class="text-surface-900 dark:text-white font-medium" x-text="transcript"></p> </div> <div x-show="analyzing" x-cloak class="flex items-center gap-2 text-sm text-violet-600 dark:text-violet-400"> <svg class="w-4 h-4 animate-spin" fill="none" viewBox="0 0 24 24"><circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle><path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path></svg> AI is analyzing your pronunciation... </div> <div x-show="aiFeedback && !analyzing" x-cloak class="mt-2 space-y-2"> <div class="flex items-center gap-3"> <div class="flex-shrink-0 w-12 h-12 rounded-xl flex items-center justify-center text-lg font-black" :class="(aiFeedback?.score || 0) >= 7 ? 'bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300' : (aiFeedback?.score || 0) >= 4 ? 'bg-amber-100 dark:bg-amber-900/30 text-amber-700 dark:text-amber-300' : 'bg-rose-100 dark:bg-rose-900/30 text-rose-700 dark:text-rose-300'" x-text="(aiFeedback?.score || 0) + '/10'"></div> <p class="text-surface-700 dark:text-surface-300" x-text="aiFeedback?.feedback || ''"></p> </div> <template x-if="aiFeedback?.pronunciation_tips"> <div class="flex items-start gap-2 p-3 rounded-xl bg-violet-50 dark:bg-violet-900/10 border border-violet-200 dark:border-violet-800"> <svg class="w-4 h-4 text-violet-500 flex-shrink-0 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"/></svg> <p class="text-sm text-violet-700 dark:text-violet-300" x-text="aiFeedback.pronunciation_tips"></p> </div> </template> </div> </div> </template> <template x-if="!supported"> <p class="text-sm text-surface-500 italic">Speech recognition is not supported in your browser. Try Chrome or Edge.</p> </template> </div> <div x-show="answered[146]" x-cloak class="mt-3 text-sm" :class="correct[146] ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="correct[146]">Correct!</span> <span x-show="!correct[146]">Not quite. Correct answer: <strong></strong></span> <p class="mt-1 text-surface-600 dark:text-surface-400">Imperative form.</p> </div> </div> </div> <div x-show="(exFilter === 'all' || exFilter === 'speaking') && (exLevel === 'all' || exLevel === '')" x-cloak> <div class="p-5 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50 border-2 border-b-4 border-surface-200 dark:border-[#3b3755]"> <div class="flex items-center gap-2 mb-2"> <span class="inline-flex items-center px-2 py-0.5 rounded-md text-[10px] font-semibold uppercase tracking-wide bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-300"> speaking </span> </div> <p class="text-lg font-semibold text-surface-900 dark:text-white mb-4">Say 'Write the title' in Hindi.</p> <div x-data="{ recording: false, transcript: '', checked: false, isCorrect: false, analyzing: false, aiFeedback: null, supported: 'webkitSpeechRecognition' in window || 'SpeechRecognition' in window }" class="space-y-3"> <div class="p-4 rounded-xl bg-emerald-50 dark:bg-emerald-900/10 border border-emerald-200 dark:border-emerald-800"> <p class="text-sm text-surface-500 dark:text-surface-400 mb-1">Read this aloud:</p> <p class="text-lg font-semibold text-surface-900 dark:text-white font-sans" lang="en" dir="ltr"></p> </div> <button @click="const u = new SpeechSynthesisUtterance(''); u.lang = 'en-US'; u.rate = 0.85; speechSynthesis.speak(u)" class="inline-flex items-center gap-2 px-4 py-2 rounded-xl text-sm font-medium bg-surface-100 dark:bg-surface-800 text-surface-700 dark:text-surface-300 hover:bg-surface-200 transition-all"> <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15.536 8.464a5 5 0 010 7.072m2.828-9.9a9 9 0 010 12.728M5.586 15H4a1 1 0 01-1-1v-4a1 1 0 011-1h1.586l4.707-4.707C10.923 3.663 12 4.109 12 5v14c0 .891-1.077 1.337-1.707.707L5.586 15z"/></svg> Listen first </button> <template x-if="supported"> <div> <button @click=" if(recording || checked) return; recording = true; transcript = ''; aiFeedback = null; try { const SR = window.SpeechRecognition || window.webkitSpeechRecognition; const r = new SR(); r.lang = 'en-US'; r.continuous = false; r.interimResults = false; r.onresult = function(e) { transcript = e.results[0][0].transcript; recording = false; checked = true; const target = ''; const got = transcript.toLowerCase().replace(/[^a-z\s]/g, ''); const words = target.replace(/[^a-z\s]/g, '').split(' '); const matched = words.filter(w => got.includes(w)).length; isCorrect = matched >= words.length * 0.7; answered[147] = true; correct[147] = isCorrect; if(isCorrect) score++; analyzing = true; fetch('/api/vocabulary/analyze-speech', { method: 'POST', headers: {'Content-Type':'application/json','X-CSRF-TOKEN':document.querySelector('meta[name=csrf-token]')?.content||''}, body: JSON.stringify({transcript: transcript, expected: '', word: '\u0936\u0940\u0930\u094d\u0937\u0915'}) }).then(r => r.json()).then(d => { aiFeedback = d; analyzing = false; }).catch(() => { aiFeedback = {feedback:'Analysis unavailable.'}; analyzing = false; }); }; r.onerror = function() { recording = false; }; r.onend = function() { if(!transcript) recording = false; }; r.start(); } catch(err) { recording = false; alert('Microphone access denied or not available. Please allow microphone access.'); } " :class="recording ? 'bg-rose-600 animate-pulse' : 'bg-emerald-600 hover:bg-emerald-700'" class="inline-flex items-center gap-2 px-5 py-3 rounded-xl text-white font-bold shadow-[0_3px_0_0_#065f46] active:translate-y-[3px] active:shadow-none transition-all" :disabled="checked"> <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 11a7 7 0 01-7 7m0 0a7 7 0 01-7-7m7 7v4m0 0H8m4 0h4m-4-8a3 3 0 01-3-3V5a3 3 0 116 0v6a3 3 0 01-3 3z"/></svg> <span x-text="recording ? 'Listening...' : 'Start Speaking'"></span> </button> <div x-show="transcript" x-cloak class="mt-3 p-3 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50"> <p class="text-xs text-surface-400 uppercase font-bold mb-1">You said:</p> <p class="text-surface-900 dark:text-white font-medium" x-text="transcript"></p> </div> <div x-show="analyzing" x-cloak class="flex items-center gap-2 text-sm text-violet-600 dark:text-violet-400"> <svg class="w-4 h-4 animate-spin" fill="none" viewBox="0 0 24 24"><circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle><path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path></svg> AI is analyzing your pronunciation... </div> <div x-show="aiFeedback && !analyzing" x-cloak class="mt-2 space-y-2"> <div class="flex items-center gap-3"> <div class="flex-shrink-0 w-12 h-12 rounded-xl flex items-center justify-center text-lg font-black" :class="(aiFeedback?.score || 0) >= 7 ? 'bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300' : (aiFeedback?.score || 0) >= 4 ? 'bg-amber-100 dark:bg-amber-900/30 text-amber-700 dark:text-amber-300' : 'bg-rose-100 dark:bg-rose-900/30 text-rose-700 dark:text-rose-300'" x-text="(aiFeedback?.score || 0) + '/10'"></div> <p class="text-surface-700 dark:text-surface-300" x-text="aiFeedback?.feedback || ''"></p> </div> <template x-if="aiFeedback?.pronunciation_tips"> <div class="flex items-start gap-2 p-3 rounded-xl bg-violet-50 dark:bg-violet-900/10 border border-violet-200 dark:border-violet-800"> <svg class="w-4 h-4 text-violet-500 flex-shrink-0 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"/></svg> <p class="text-sm text-violet-700 dark:text-violet-300" x-text="aiFeedback.pronunciation_tips"></p> </div> </template> </div> </div> </template> <template x-if="!supported"> <p class="text-sm text-surface-500 italic">Speech recognition is not supported in your browser. Try Chrome or Edge.</p> </template> </div> <div x-show="answered[147]" x-cloak class="mt-3 text-sm" :class="correct[147] ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="correct[147]">Correct!</span> <span x-show="!correct[147]">Not quite. Correct answer: <strong></strong></span> <p class="mt-1 text-surface-600 dark:text-surface-400">Imperative form.</p> </div> </div> </div> <div x-show="(exFilter === 'all' || exFilter === 'speaking') && (exLevel === 'all' || exLevel === '')" x-cloak> <div class="p-5 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50 border-2 border-b-4 border-surface-200 dark:border-[#3b3755]"> <div class="flex items-center gap-2 mb-2"> <span class="inline-flex items-center px-2 py-0.5 rounded-md text-[10px] font-semibold uppercase tracking-wide bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-300"> speaking </span> </div> <p class="text-lg font-semibold text-surface-900 dark:text-white mb-4">Say 'In these titles' in Hindi.</p> <div x-data="{ recording: false, transcript: '', checked: false, isCorrect: false, analyzing: false, aiFeedback: null, supported: 'webkitSpeechRecognition' in window || 'SpeechRecognition' in window }" class="space-y-3"> <div class="p-4 rounded-xl bg-emerald-50 dark:bg-emerald-900/10 border border-emerald-200 dark:border-emerald-800"> <p class="text-sm text-surface-500 dark:text-surface-400 mb-1">Read this aloud:</p> <p class="text-lg font-semibold text-surface-900 dark:text-white font-sans" lang="en" dir="ltr"></p> </div> <button @click="const u = new SpeechSynthesisUtterance(''); u.lang = 'en-US'; u.rate = 0.85; speechSynthesis.speak(u)" class="inline-flex items-center gap-2 px-4 py-2 rounded-xl text-sm font-medium bg-surface-100 dark:bg-surface-800 text-surface-700 dark:text-surface-300 hover:bg-surface-200 transition-all"> <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15.536 8.464a5 5 0 010 7.072m2.828-9.9a9 9 0 010 12.728M5.586 15H4a1 1 0 01-1-1v-4a1 1 0 011-1h1.586l4.707-4.707C10.923 3.663 12 4.109 12 5v14c0 .891-1.077 1.337-1.707.707L5.586 15z"/></svg> Listen first </button> <template x-if="supported"> <div> <button @click=" if(recording || checked) return; recording = true; transcript = ''; aiFeedback = null; try { const SR = window.SpeechRecognition || window.webkitSpeechRecognition; const r = new SR(); r.lang = 'en-US'; r.continuous = false; r.interimResults = false; r.onresult = function(e) { transcript = e.results[0][0].transcript; recording = false; checked = true; const target = ''; const got = transcript.toLowerCase().replace(/[^a-z\s]/g, ''); const words = target.replace(/[^a-z\s]/g, '').split(' '); const matched = words.filter(w => got.includes(w)).length; isCorrect = matched >= words.length * 0.7; answered[148] = true; correct[148] = isCorrect; if(isCorrect) score++; analyzing = true; fetch('/api/vocabulary/analyze-speech', { method: 'POST', headers: {'Content-Type':'application/json','X-CSRF-TOKEN':document.querySelector('meta[name=csrf-token]')?.content||''}, body: JSON.stringify({transcript: transcript, expected: '', word: '\u0936\u0940\u0930\u094d\u0937\u0915'}) }).then(r => r.json()).then(d => { aiFeedback = d; analyzing = false; }).catch(() => { aiFeedback = {feedback:'Analysis unavailable.'}; analyzing = false; }); }; r.onerror = function() { recording = false; }; r.onend = function() { if(!transcript) recording = false; }; r.start(); } catch(err) { recording = false; alert('Microphone access denied or not available. Please allow microphone access.'); } " :class="recording ? 'bg-rose-600 animate-pulse' : 'bg-emerald-600 hover:bg-emerald-700'" class="inline-flex items-center gap-2 px-5 py-3 rounded-xl text-white font-bold shadow-[0_3px_0_0_#065f46] active:translate-y-[3px] active:shadow-none transition-all" :disabled="checked"> <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 11a7 7 0 01-7 7m0 0a7 7 0 01-7-7m7 7v4m0 0H8m4 0h4m-4-8a3 3 0 01-3-3V5a3 3 0 116 0v6a3 3 0 01-3 3z"/></svg> <span x-text="recording ? 'Listening...' : 'Start Speaking'"></span> </button> <div x-show="transcript" x-cloak class="mt-3 p-3 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50"> <p class="text-xs text-surface-400 uppercase font-bold mb-1">You said:</p> <p class="text-surface-900 dark:text-white font-medium" x-text="transcript"></p> </div> <div x-show="analyzing" x-cloak class="flex items-center gap-2 text-sm text-violet-600 dark:text-violet-400"> <svg class="w-4 h-4 animate-spin" fill="none" viewBox="0 0 24 24"><circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle><path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path></svg> AI is analyzing your pronunciation... </div> <div x-show="aiFeedback && !analyzing" x-cloak class="mt-2 space-y-2"> <div class="flex items-center gap-3"> <div class="flex-shrink-0 w-12 h-12 rounded-xl flex items-center justify-center text-lg font-black" :class="(aiFeedback?.score || 0) >= 7 ? 'bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300' : (aiFeedback?.score || 0) >= 4 ? 'bg-amber-100 dark:bg-amber-900/30 text-amber-700 dark:text-amber-300' : 'bg-rose-100 dark:bg-rose-900/30 text-rose-700 dark:text-rose-300'" x-text="(aiFeedback?.score || 0) + '/10'"></div> <p class="text-surface-700 dark:text-surface-300" x-text="aiFeedback?.feedback || ''"></p> </div> <template x-if="aiFeedback?.pronunciation_tips"> <div class="flex items-start gap-2 p-3 rounded-xl bg-violet-50 dark:bg-violet-900/10 border border-violet-200 dark:border-violet-800"> <svg class="w-4 h-4 text-violet-500 flex-shrink-0 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"/></svg> <p class="text-sm text-violet-700 dark:text-violet-300" x-text="aiFeedback.pronunciation_tips"></p> </div> </template> </div> </div> </template> <template x-if="!supported"> <p class="text-sm text-surface-500 italic">Speech recognition is not supported in your browser. Try Chrome or Edge.</p> </template> </div> <div x-show="answered[148]" x-cloak class="mt-3 text-sm" :class="correct[148] ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="correct[148]">Correct!</span> <span x-show="!correct[148]">Not quite. Correct answer: <strong></strong></span> <p class="mt-1 text-surface-600 dark:text-surface-400">Oblique plural form.</p> </div> </div> </div> <div x-show="(exFilter === 'all' || exFilter === 'speaking') && (exLevel === 'all' || exLevel === '')" x-cloak> <div class="p-5 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50 border-2 border-b-4 border-surface-200 dark:border-[#3b3755]"> <div class="flex items-center gap-2 mb-2"> <span class="inline-flex items-center px-2 py-0.5 rounded-md text-[10px] font-semibold uppercase tracking-wide bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-300"> speaking </span> </div> <p class="text-lg font-semibold text-surface-900 dark:text-white mb-4">Say 'Title of the poem' in Hindi.</p> <div x-data="{ recording: false, transcript: '', checked: false, isCorrect: false, analyzing: false, aiFeedback: null, supported: 'webkitSpeechRecognition' in window || 'SpeechRecognition' in window }" class="space-y-3"> <div class="p-4 rounded-xl bg-emerald-50 dark:bg-emerald-900/10 border border-emerald-200 dark:border-emerald-800"> <p class="text-sm text-surface-500 dark:text-surface-400 mb-1">Read this aloud:</p> <p class="text-lg font-semibold text-surface-900 dark:text-white font-sans" lang="en" dir="ltr"></p> </div> <button @click="const u = new SpeechSynthesisUtterance(''); u.lang = 'en-US'; u.rate = 0.85; speechSynthesis.speak(u)" class="inline-flex items-center gap-2 px-4 py-2 rounded-xl text-sm font-medium bg-surface-100 dark:bg-surface-800 text-surface-700 dark:text-surface-300 hover:bg-surface-200 transition-all"> <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15.536 8.464a5 5 0 010 7.072m2.828-9.9a9 9 0 010 12.728M5.586 15H4a1 1 0 01-1-1v-4a1 1 0 011-1h1.586l4.707-4.707C10.923 3.663 12 4.109 12 5v14c0 .891-1.077 1.337-1.707.707L5.586 15z"/></svg> Listen first </button> <template x-if="supported"> <div> <button @click=" if(recording || checked) return; recording = true; transcript = ''; aiFeedback = null; try { const SR = window.SpeechRecognition || window.webkitSpeechRecognition; const r = new SR(); r.lang = 'en-US'; r.continuous = false; r.interimResults = false; r.onresult = function(e) { transcript = e.results[0][0].transcript; recording = false; checked = true; const target = ''; const got = transcript.toLowerCase().replace(/[^a-z\s]/g, ''); const words = target.replace(/[^a-z\s]/g, '').split(' '); const matched = words.filter(w => got.includes(w)).length; isCorrect = matched >= words.length * 0.7; answered[149] = true; correct[149] = isCorrect; if(isCorrect) score++; analyzing = true; fetch('/api/vocabulary/analyze-speech', { method: 'POST', headers: {'Content-Type':'application/json','X-CSRF-TOKEN':document.querySelector('meta[name=csrf-token]')?.content||''}, body: JSON.stringify({transcript: transcript, expected: '', word: '\u0936\u0940\u0930\u094d\u0937\u0915'}) }).then(r => r.json()).then(d => { aiFeedback = d; analyzing = false; }).catch(() => { aiFeedback = {feedback:'Analysis unavailable.'}; analyzing = false; }); }; r.onerror = function() { recording = false; }; r.onend = function() { if(!transcript) recording = false; }; r.start(); } catch(err) { recording = false; alert('Microphone access denied or not available. Please allow microphone access.'); } " :class="recording ? 'bg-rose-600 animate-pulse' : 'bg-emerald-600 hover:bg-emerald-700'" class="inline-flex items-center gap-2 px-5 py-3 rounded-xl text-white font-bold shadow-[0_3px_0_0_#065f46] active:translate-y-[3px] active:shadow-none transition-all" :disabled="checked"> <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 11a7 7 0 01-7 7m0 0a7 7 0 01-7-7m7 7v4m0 0H8m4 0h4m-4-8a3 3 0 01-3-3V5a3 3 0 116 0v6a3 3 0 01-3 3z"/></svg> <span x-text="recording ? 'Listening...' : 'Start Speaking'"></span> </button> <div x-show="transcript" x-cloak class="mt-3 p-3 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50"> <p class="text-xs text-surface-400 uppercase font-bold mb-1">You said:</p> <p class="text-surface-900 dark:text-white font-medium" x-text="transcript"></p> </div> <div x-show="analyzing" x-cloak class="flex items-center gap-2 text-sm text-violet-600 dark:text-violet-400"> <svg class="w-4 h-4 animate-spin" fill="none" viewBox="0 0 24 24"><circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle><path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path></svg> AI is analyzing your pronunciation... </div> <div x-show="aiFeedback && !analyzing" x-cloak class="mt-2 space-y-2"> <div class="flex items-center gap-3"> <div class="flex-shrink-0 w-12 h-12 rounded-xl flex items-center justify-center text-lg font-black" :class="(aiFeedback?.score || 0) >= 7 ? 'bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300' : (aiFeedback?.score || 0) >= 4 ? 'bg-amber-100 dark:bg-amber-900/30 text-amber-700 dark:text-amber-300' : 'bg-rose-100 dark:bg-rose-900/30 text-rose-700 dark:text-rose-300'" x-text="(aiFeedback?.score || 0) + '/10'"></div> <p class="text-surface-700 dark:text-surface-300" x-text="aiFeedback?.feedback || ''"></p> </div> <template x-if="aiFeedback?.pronunciation_tips"> <div class="flex items-start gap-2 p-3 rounded-xl bg-violet-50 dark:bg-violet-900/10 border border-violet-200 dark:border-violet-800"> <svg class="w-4 h-4 text-violet-500 flex-shrink-0 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"/></svg> <p class="text-sm text-violet-700 dark:text-violet-300" x-text="aiFeedback.pronunciation_tips"></p> </div> </template> </div> </div> </template> <template x-if="!supported"> <p class="text-sm text-surface-500 italic">Speech recognition is not supported in your browser. Try Chrome or Edge.</p> </template> </div> <div x-show="answered[149]" x-cloak class="mt-3 text-sm" :class="correct[149] ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="correct[149]">Correct!</span> <span x-show="!correct[149]">Not quite. Correct answer: <strong></strong></span> <p class="mt-1 text-surface-600 dark:text-surface-400">Genitive agreement.</p> </div> </div> </div> <div x-show="(exFilter === 'all' || exFilter === 'listening') && (exLevel === 'all' || exLevel === '')" x-cloak> <div class="p-5 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50 border-2 border-b-4 border-surface-200 dark:border-[#3b3755]"> <div class="flex items-center gap-2 mb-2"> <span class="inline-flex items-center px-2 py-0.5 rounded-md text-[10px] font-semibold uppercase tracking-wide bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-300"> listening </span> </div> <p class="text-lg font-semibold text-surface-900 dark:text-white mb-4">Listen and write the word: [Audio: shīrṣak]</p> <div x-data="{ userInput: '', checked: false, isCorrect: false, playing: false }" class="space-y-3"> <div class="flex items-center gap-3"> <button @click="playing = true; const u = new SpeechSynthesisUtterance(''); u.lang = 'en-US'; u.rate = 0.9; u.onend = () => playing = false; speechSynthesis.speak(u)" :class="playing ? 'bg-violet-600 text-white' : 'bg-violet-100 dark:bg-violet-900/30 text-violet-700 dark:text-violet-300'" class="p-4 rounded-xl border-2 border-violet-200 dark:border-violet-800 transition-all hover:scale-105 active:scale-95" :disabled="playing"> <svg class="w-8 h-8" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15.536 8.464a5 5 0 010 7.072m2.828-9.9a9 9 0 010 12.728M5.586 15H4a1 1 0 01-1-1v-4a1 1 0 011-1h1.586l4.707-4.707C10.923 3.663 12 4.109 12 5v14c0 .891-1.077 1.337-1.707.707L5.586 15z"/></svg> </button> <div class="flex-1"> <input x-model="userInput" type="text" :disabled="checked" placeholder="Type what you hear..." class="w-full px-4 py-3 rounded-xl border-2 border-surface-200 dark:border-surface-700 bg-white dark:bg-dark-card text-surface-900 dark:text-white focus:border-violet-400 focus:ring-2 focus:ring-violet-200 dark:focus:ring-violet-800 transition-all" @keydown.enter="if(!checked && userInput.trim()) { checked = true; isCorrect = userInput.trim().toLowerCase() === ''.toLowerCase(); if(isCorrect) { answered[150] = true; correct[150] = true; score++; } else { answered[150] = true; correct[150] = false; } }"> </div> </div> <button x-show="!checked && userInput.trim()" @click="checked = true; isCorrect = userInput.trim().toLowerCase() === ''.toLowerCase(); if(isCorrect) { answered[150] = true; correct[150] = true; score++; } else { answered[150] = true; correct[150] = false; }" class="px-4 py-2 rounded-xl text-sm font-bold bg-violet-600 text-white hover:bg-violet-700 shadow-[0_3px_0_0_#5b21b6] active:translate-y-[3px] active:shadow-none transition-all"> Check </button> <div x-show="checked" x-cloak class="text-sm" :class="isCorrect ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="isCorrect">Correct!</span> <span x-show="!isCorrect">Not quite. Correct answer: <strong></strong></span> </div> </div> <div x-show="answered[150]" x-cloak class="mt-3 text-sm" :class="correct[150] ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="correct[150]">Correct!</span> <span x-show="!correct[150]">Not quite. Correct answer: <strong></strong></span> <p class="mt-1 text-surface-600 dark:text-surface-400">Pay attention to the long 'ī' and retroflex 'ṣ'.</p> </div> </div> </div> <div x-show="(exFilter === 'all' || exFilter === 'listening') && (exLevel === 'all' || exLevel === '')" x-cloak> <div class="p-5 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50 border-2 border-b-4 border-surface-200 dark:border-[#3b3755]"> <div class="flex items-center gap-2 mb-2"> <span class="inline-flex items-center px-2 py-0.5 rounded-md text-[10px] font-semibold uppercase tracking-wide bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-300"> listening </span> </div> <p class="text-lg font-semibold text-surface-900 dark:text-white mb-4">Listen and write: [Audio: kitāb kā shīrṣak]</p> <div x-data="{ userInput: '', checked: false, isCorrect: false, playing: false }" class="space-y-3"> <div class="flex items-center gap-3"> <button @click="playing = true; const u = new SpeechSynthesisUtterance(''); u.lang = 'en-US'; u.rate = 0.9; u.onend = () => playing = false; speechSynthesis.speak(u)" :class="playing ? 'bg-violet-600 text-white' : 'bg-violet-100 dark:bg-violet-900/30 text-violet-700 dark:text-violet-300'" class="p-4 rounded-xl border-2 border-violet-200 dark:border-violet-800 transition-all hover:scale-105 active:scale-95" :disabled="playing"> <svg class="w-8 h-8" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15.536 8.464a5 5 0 010 7.072m2.828-9.9a9 9 0 010 12.728M5.586 15H4a1 1 0 01-1-1v-4a1 1 0 011-1h1.586l4.707-4.707C10.923 3.663 12 4.109 12 5v14c0 .891-1.077 1.337-1.707.707L5.586 15z"/></svg> </button> <div class="flex-1"> <input x-model="userInput" type="text" :disabled="checked" placeholder="Type what you hear..." class="w-full px-4 py-3 rounded-xl border-2 border-surface-200 dark:border-surface-700 bg-white dark:bg-dark-card text-surface-900 dark:text-white focus:border-violet-400 focus:ring-2 focus:ring-violet-200 dark:focus:ring-violet-800 transition-all" @keydown.enter="if(!checked && userInput.trim()) { checked = true; isCorrect = userInput.trim().toLowerCase() === ''.toLowerCase(); if(isCorrect) { answered[151] = true; correct[151] = true; score++; } else { answered[151] = true; correct[151] = false; } }"> </div> </div> <button x-show="!checked && userInput.trim()" @click="checked = true; isCorrect = userInput.trim().toLowerCase() === ''.toLowerCase(); if(isCorrect) { answered[151] = true; correct[151] = true; score++; } else { answered[151] = true; correct[151] = false; }" class="px-4 py-2 rounded-xl text-sm font-bold bg-violet-600 text-white hover:bg-violet-700 shadow-[0_3px_0_0_#5b21b6] active:translate-y-[3px] active:shadow-none transition-all"> Check </button> <div x-show="checked" x-cloak class="text-sm" :class="isCorrect ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="isCorrect">Correct!</span> <span x-show="!isCorrect">Not quite. Correct answer: <strong></strong></span> </div> </div> <div x-show="answered[151]" x-cloak class="mt-3 text-sm" :class="correct[151] ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="correct[151]">Correct!</span> <span x-show="!correct[151]">Not quite. Correct answer: <strong></strong></span> <p class="mt-1 text-surface-600 dark:text-surface-400">Title of the book.</p> </div> </div> </div> <div x-show="(exFilter === 'all' || exFilter === 'listening') && (exLevel === 'all' || exLevel === '')" x-cloak> <div class="p-5 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50 border-2 border-b-4 border-surface-200 dark:border-[#3b3755]"> <div class="flex items-center gap-2 mb-2"> <span class="inline-flex items-center px-2 py-0.5 rounded-md text-[10px] font-semibold uppercase tracking-wide bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-300"> listening </span> </div> <p class="text-lg font-semibold text-surface-900 dark:text-white mb-4">Listen and write: [Audio: up-shīrṣak]</p> <div x-data="{ userInput: '', checked: false, isCorrect: false, playing: false }" class="space-y-3"> <div class="flex items-center gap-3"> <button @click="playing = true; const u = new SpeechSynthesisUtterance(''); u.lang = 'en-US'; u.rate = 0.9; u.onend = () => playing = false; speechSynthesis.speak(u)" :class="playing ? 'bg-violet-600 text-white' : 'bg-violet-100 dark:bg-violet-900/30 text-violet-700 dark:text-violet-300'" class="p-4 rounded-xl border-2 border-violet-200 dark:border-violet-800 transition-all hover:scale-105 active:scale-95" :disabled="playing"> <svg class="w-8 h-8" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15.536 8.464a5 5 0 010 7.072m2.828-9.9a9 9 0 010 12.728M5.586 15H4a1 1 0 01-1-1v-4a1 1 0 011-1h1.586l4.707-4.707C10.923 3.663 12 4.109 12 5v14c0 .891-1.077 1.337-1.707.707L5.586 15z"/></svg> </button> <div class="flex-1"> <input x-model="userInput" type="text" :disabled="checked" placeholder="Type what you hear..." class="w-full px-4 py-3 rounded-xl border-2 border-surface-200 dark:border-surface-700 bg-white dark:bg-dark-card text-surface-900 dark:text-white focus:border-violet-400 focus:ring-2 focus:ring-violet-200 dark:focus:ring-violet-800 transition-all" @keydown.enter="if(!checked && userInput.trim()) { checked = true; isCorrect = userInput.trim().toLowerCase() === ''.toLowerCase(); if(isCorrect) { answered[152] = true; correct[152] = true; score++; } else { answered[152] = true; correct[152] = false; } }"> </div> </div> <button x-show="!checked && userInput.trim()" @click="checked = true; isCorrect = userInput.trim().toLowerCase() === ''.toLowerCase(); if(isCorrect) { answered[152] = true; correct[152] = true; score++; } else { answered[152] = true; correct[152] = false; }" class="px-4 py-2 rounded-xl text-sm font-bold bg-violet-600 text-white hover:bg-violet-700 shadow-[0_3px_0_0_#5b21b6] active:translate-y-[3px] active:shadow-none transition-all"> Check </button> <div x-show="checked" x-cloak class="text-sm" :class="isCorrect ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="isCorrect">Correct!</span> <span x-show="!isCorrect">Not quite. Correct answer: <strong></strong></span> </div> </div> <div x-show="answered[152]" x-cloak class="mt-3 text-sm" :class="correct[152] ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="correct[152]">Correct!</span> <span x-show="!correct[152]">Not quite. Correct answer: <strong></strong></span> <p class="mt-1 text-surface-600 dark:text-surface-400">Subheading.</p> </div> </div> </div> <div x-show="(exFilter === 'all' || exFilter === 'listening') && (exLevel === 'all' || exLevel === '')" x-cloak> <div class="p-5 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50 border-2 border-b-4 border-surface-200 dark:border-[#3b3755]"> <div class="flex items-center gap-2 mb-2"> <span class="inline-flex items-center px-2 py-0.5 rounded-md text-[10px] font-semibold uppercase tracking-wide bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-300"> listening </span> </div> <p class="text-lg font-semibold text-surface-900 dark:text-white mb-4">Listen and write: [Audio: achchha shīrṣak]</p> <div x-data="{ userInput: '', checked: false, isCorrect: false, playing: false }" class="space-y-3"> <div class="flex items-center gap-3"> <button @click="playing = true; const u = new SpeechSynthesisUtterance(''); u.lang = 'en-US'; u.rate = 0.9; u.onend = () => playing = false; speechSynthesis.speak(u)" :class="playing ? 'bg-violet-600 text-white' : 'bg-violet-100 dark:bg-violet-900/30 text-violet-700 dark:text-violet-300'" class="p-4 rounded-xl border-2 border-violet-200 dark:border-violet-800 transition-all hover:scale-105 active:scale-95" :disabled="playing"> <svg class="w-8 h-8" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15.536 8.464a5 5 0 010 7.072m2.828-9.9a9 9 0 010 12.728M5.586 15H4a1 1 0 01-1-1v-4a1 1 0 011-1h1.586l4.707-4.707C10.923 3.663 12 4.109 12 5v14c0 .891-1.077 1.337-1.707.707L5.586 15z"/></svg> </button> <div class="flex-1"> <input x-model="userInput" type="text" :disabled="checked" placeholder="Type what you hear..." class="w-full px-4 py-3 rounded-xl border-2 border-surface-200 dark:border-surface-700 bg-white dark:bg-dark-card text-surface-900 dark:text-white focus:border-violet-400 focus:ring-2 focus:ring-violet-200 dark:focus:ring-violet-800 transition-all" @keydown.enter="if(!checked && userInput.trim()) { checked = true; isCorrect = userInput.trim().toLowerCase() === ''.toLowerCase(); if(isCorrect) { answered[153] = true; correct[153] = true; score++; } else { answered[153] = true; correct[153] = false; } }"> </div> </div> <button x-show="!checked && userInput.trim()" @click="checked = true; isCorrect = userInput.trim().toLowerCase() === ''.toLowerCase(); if(isCorrect) { answered[153] = true; correct[153] = true; score++; } else { answered[153] = true; correct[153] = false; }" class="px-4 py-2 rounded-xl text-sm font-bold bg-violet-600 text-white hover:bg-violet-700 shadow-[0_3px_0_0_#5b21b6] active:translate-y-[3px] active:shadow-none transition-all"> Check </button> <div x-show="checked" x-cloak class="text-sm" :class="isCorrect ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="isCorrect">Correct!</span> <span x-show="!isCorrect">Not quite. Correct answer: <strong></strong></span> </div> </div> <div x-show="answered[153]" x-cloak class="mt-3 text-sm" :class="correct[153] ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="correct[153]">Correct!</span> <span x-show="!correct[153]">Not quite. Correct answer: <strong></strong></span> <p class="mt-1 text-surface-600 dark:text-surface-400">Good title.</p> </div> </div> </div> <div x-show="(exFilter === 'all' || exFilter === 'listening') && (exLevel === 'all' || exLevel === '')" x-cloak> <div class="p-5 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50 border-2 border-b-4 border-surface-200 dark:border-[#3b3755]"> <div class="flex items-center gap-2 mb-2"> <span class="inline-flex items-center px-2 py-0.5 rounded-md text-[10px] font-semibold uppercase tracking-wide bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-300"> listening </span> </div> <p class="text-lg font-semibold text-surface-900 dark:text-white mb-4">Listen and write: [Audio: shīrṣak kya hai]</p> <div x-data="{ userInput: '', checked: false, isCorrect: false, playing: false }" class="space-y-3"> <div class="flex items-center gap-3"> <button @click="playing = true; const u = new SpeechSynthesisUtterance(''); u.lang = 'en-US'; u.rate = 0.9; u.onend = () => playing = false; speechSynthesis.speak(u)" :class="playing ? 'bg-violet-600 text-white' : 'bg-violet-100 dark:bg-violet-900/30 text-violet-700 dark:text-violet-300'" class="p-4 rounded-xl border-2 border-violet-200 dark:border-violet-800 transition-all hover:scale-105 active:scale-95" :disabled="playing"> <svg class="w-8 h-8" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15.536 8.464a5 5 0 010 7.072m2.828-9.9a9 9 0 010 12.728M5.586 15H4a1 1 0 01-1-1v-4a1 1 0 011-1h1.586l4.707-4.707C10.923 3.663 12 4.109 12 5v14c0 .891-1.077 1.337-1.707.707L5.586 15z"/></svg> </button> <div class="flex-1"> <input x-model="userInput" type="text" :disabled="checked" placeholder="Type what you hear..." class="w-full px-4 py-3 rounded-xl border-2 border-surface-200 dark:border-surface-700 bg-white dark:bg-dark-card text-surface-900 dark:text-white focus:border-violet-400 focus:ring-2 focus:ring-violet-200 dark:focus:ring-violet-800 transition-all" @keydown.enter="if(!checked && userInput.trim()) { checked = true; isCorrect = userInput.trim().toLowerCase() === ''.toLowerCase(); if(isCorrect) { answered[154] = true; correct[154] = true; score++; } else { answered[154] = true; correct[154] = false; } }"> </div> </div> <button x-show="!checked && userInput.trim()" @click="checked = true; isCorrect = userInput.trim().toLowerCase() === ''.toLowerCase(); if(isCorrect) { answered[154] = true; correct[154] = true; score++; } else { answered[154] = true; correct[154] = false; }" class="px-4 py-2 rounded-xl text-sm font-bold bg-violet-600 text-white hover:bg-violet-700 shadow-[0_3px_0_0_#5b21b6] active:translate-y-[3px] active:shadow-none transition-all"> Check </button> <div x-show="checked" x-cloak class="text-sm" :class="isCorrect ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="isCorrect">Correct!</span> <span x-show="!isCorrect">Not quite. Correct answer: <strong></strong></span> </div> </div> <div x-show="answered[154]" x-cloak class="mt-3 text-sm" :class="correct[154] ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="correct[154]">Correct!</span> <span x-show="!correct[154]">Not quite. Correct answer: <strong></strong></span> <p class="mt-1 text-surface-600 dark:text-surface-400">What is the title?</p> </div> </div> </div> <div x-show="(exFilter === 'all' || exFilter === 'listening') && (exLevel === 'all' || exLevel === '')" x-cloak> <div class="p-5 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50 border-2 border-b-4 border-surface-200 dark:border-[#3b3755]"> <div class="flex items-center gap-2 mb-2"> <span class="inline-flex items-center px-2 py-0.5 rounded-md text-[10px] font-semibold uppercase tracking-wide bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-300"> listening </span> </div> <p class="text-lg font-semibold text-surface-900 dark:text-white mb-4">Listen and write: [Audio: mukhya shīrṣak]</p> <div x-data="{ userInput: '', checked: false, isCorrect: false, playing: false }" class="space-y-3"> <div class="flex items-center gap-3"> <button @click="playing = true; const u = new SpeechSynthesisUtterance(''); u.lang = 'en-US'; u.rate = 0.9; u.onend = () => playing = false; speechSynthesis.speak(u)" :class="playing ? 'bg-violet-600 text-white' : 'bg-violet-100 dark:bg-violet-900/30 text-violet-700 dark:text-violet-300'" class="p-4 rounded-xl border-2 border-violet-200 dark:border-violet-800 transition-all hover:scale-105 active:scale-95" :disabled="playing"> <svg class="w-8 h-8" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15.536 8.464a5 5 0 010 7.072m2.828-9.9a9 9 0 010 12.728M5.586 15H4a1 1 0 01-1-1v-4a1 1 0 011-1h1.586l4.707-4.707C10.923 3.663 12 4.109 12 5v14c0 .891-1.077 1.337-1.707.707L5.586 15z"/></svg> </button> <div class="flex-1"> <input x-model="userInput" type="text" :disabled="checked" placeholder="Type what you hear..." class="w-full px-4 py-3 rounded-xl border-2 border-surface-200 dark:border-surface-700 bg-white dark:bg-dark-card text-surface-900 dark:text-white focus:border-violet-400 focus:ring-2 focus:ring-violet-200 dark:focus:ring-violet-800 transition-all" @keydown.enter="if(!checked && userInput.trim()) { checked = true; isCorrect = userInput.trim().toLowerCase() === ''.toLowerCase(); if(isCorrect) { answered[155] = true; correct[155] = true; score++; } else { answered[155] = true; correct[155] = false; } }"> </div> </div> <button x-show="!checked && userInput.trim()" @click="checked = true; isCorrect = userInput.trim().toLowerCase() === ''.toLowerCase(); if(isCorrect) { answered[155] = true; correct[155] = true; score++; } else { answered[155] = true; correct[155] = false; }" class="px-4 py-2 rounded-xl text-sm font-bold bg-violet-600 text-white hover:bg-violet-700 shadow-[0_3px_0_0_#5b21b6] active:translate-y-[3px] active:shadow-none transition-all"> Check </button> <div x-show="checked" x-cloak class="text-sm" :class="isCorrect ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="isCorrect">Correct!</span> <span x-show="!isCorrect">Not quite. Correct answer: <strong></strong></span> </div> </div> <div x-show="answered[155]" x-cloak class="mt-3 text-sm" :class="correct[155] ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="correct[155]">Correct!</span> <span x-show="!correct[155]">Not quite. Correct answer: <strong></strong></span> <p class="mt-1 text-surface-600 dark:text-surface-400">Main heading.</p> </div> </div> </div> <div x-show="(exFilter === 'all' || exFilter === 'listening') && (exLevel === 'all' || exLevel === '')" x-cloak> <div class="p-5 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50 border-2 border-b-4 border-surface-200 dark:border-[#3b3755]"> <div class="flex items-center gap-2 mb-2"> <span class="inline-flex items-center px-2 py-0.5 rounded-md text-[10px] font-semibold uppercase tracking-wide bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-300"> listening </span> </div> <p class="text-lg font-semibold text-surface-900 dark:text-white mb-4">Listen and write: [Audio: naya shīrṣak]</p> <div x-data="{ userInput: '', checked: false, isCorrect: false, playing: false }" class="space-y-3"> <div class="flex items-center gap-3"> <button @click="playing = true; const u = new SpeechSynthesisUtterance(''); u.lang = 'en-US'; u.rate = 0.9; u.onend = () => playing = false; speechSynthesis.speak(u)" :class="playing ? 'bg-violet-600 text-white' : 'bg-violet-100 dark:bg-violet-900/30 text-violet-700 dark:text-violet-300'" class="p-4 rounded-xl border-2 border-violet-200 dark:border-violet-800 transition-all hover:scale-105 active:scale-95" :disabled="playing"> <svg class="w-8 h-8" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15.536 8.464a5 5 0 010 7.072m2.828-9.9a9 9 0 010 12.728M5.586 15H4a1 1 0 01-1-1v-4a1 1 0 011-1h1.586l4.707-4.707C10.923 3.663 12 4.109 12 5v14c0 .891-1.077 1.337-1.707.707L5.586 15z"/></svg> </button> <div class="flex-1"> <input x-model="userInput" type="text" :disabled="checked" placeholder="Type what you hear..." class="w-full px-4 py-3 rounded-xl border-2 border-surface-200 dark:border-surface-700 bg-white dark:bg-dark-card text-surface-900 dark:text-white focus:border-violet-400 focus:ring-2 focus:ring-violet-200 dark:focus:ring-violet-800 transition-all" @keydown.enter="if(!checked && userInput.trim()) { checked = true; isCorrect = userInput.trim().toLowerCase() === ''.toLowerCase(); if(isCorrect) { answered[156] = true; correct[156] = true; score++; } else { answered[156] = true; correct[156] = false; } }"> </div> </div> <button x-show="!checked && userInput.trim()" @click="checked = true; isCorrect = userInput.trim().toLowerCase() === ''.toLowerCase(); if(isCorrect) { answered[156] = true; correct[156] = true; score++; } else { answered[156] = true; correct[156] = false; }" class="px-4 py-2 rounded-xl text-sm font-bold bg-violet-600 text-white hover:bg-violet-700 shadow-[0_3px_0_0_#5b21b6] active:translate-y-[3px] active:shadow-none transition-all"> Check </button> <div x-show="checked" x-cloak class="text-sm" :class="isCorrect ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="isCorrect">Correct!</span> <span x-show="!isCorrect">Not quite. Correct answer: <strong></strong></span> </div> </div> <div x-show="answered[156]" x-cloak class="mt-3 text-sm" :class="correct[156] ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="correct[156]">Correct!</span> <span x-show="!correct[156]">Not quite. Correct answer: <strong></strong></span> <p class="mt-1 text-surface-600 dark:text-surface-400">New title.</p> </div> </div> </div> <div x-show="(exFilter === 'all' || exFilter === 'listening') && (exLevel === 'all' || exLevel === '')" x-cloak> <div class="p-5 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50 border-2 border-b-4 border-surface-200 dark:border-[#3b3755]"> <div class="flex items-center gap-2 mb-2"> <span class="inline-flex items-center px-2 py-0.5 rounded-md text-[10px] font-semibold uppercase tracking-wide bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-300"> listening </span> </div> <p class="text-lg font-semibold text-surface-900 dark:text-white mb-4">Listen and write: [Audio: shīrṣak padho]</p> <div x-data="{ userInput: '', checked: false, isCorrect: false, playing: false }" class="space-y-3"> <div class="flex items-center gap-3"> <button @click="playing = true; const u = new SpeechSynthesisUtterance(''); u.lang = 'en-US'; u.rate = 0.9; u.onend = () => playing = false; speechSynthesis.speak(u)" :class="playing ? 'bg-violet-600 text-white' : 'bg-violet-100 dark:bg-violet-900/30 text-violet-700 dark:text-violet-300'" class="p-4 rounded-xl border-2 border-violet-200 dark:border-violet-800 transition-all hover:scale-105 active:scale-95" :disabled="playing"> <svg class="w-8 h-8" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15.536 8.464a5 5 0 010 7.072m2.828-9.9a9 9 0 010 12.728M5.586 15H4a1 1 0 01-1-1v-4a1 1 0 011-1h1.586l4.707-4.707C10.923 3.663 12 4.109 12 5v14c0 .891-1.077 1.337-1.707.707L5.586 15z"/></svg> </button> <div class="flex-1"> <input x-model="userInput" type="text" :disabled="checked" placeholder="Type what you hear..." class="w-full px-4 py-3 rounded-xl border-2 border-surface-200 dark:border-surface-700 bg-white dark:bg-dark-card text-surface-900 dark:text-white focus:border-violet-400 focus:ring-2 focus:ring-violet-200 dark:focus:ring-violet-800 transition-all" @keydown.enter="if(!checked && userInput.trim()) { checked = true; isCorrect = userInput.trim().toLowerCase() === ''.toLowerCase(); if(isCorrect) { answered[157] = true; correct[157] = true; score++; } else { answered[157] = true; correct[157] = false; } }"> </div> </div> <button x-show="!checked && userInput.trim()" @click="checked = true; isCorrect = userInput.trim().toLowerCase() === ''.toLowerCase(); if(isCorrect) { answered[157] = true; correct[157] = true; score++; } else { answered[157] = true; correct[157] = false; }" class="px-4 py-2 rounded-xl text-sm font-bold bg-violet-600 text-white hover:bg-violet-700 shadow-[0_3px_0_0_#5b21b6] active:translate-y-[3px] active:shadow-none transition-all"> Check </button> <div x-show="checked" x-cloak class="text-sm" :class="isCorrect ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="isCorrect">Correct!</span> <span x-show="!isCorrect">Not quite. Correct answer: <strong></strong></span> </div> </div> <div x-show="answered[157]" x-cloak class="mt-3 text-sm" :class="correct[157] ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="correct[157]">Correct!</span> <span x-show="!correct[157]">Not quite. Correct answer: <strong></strong></span> <p class="mt-1 text-surface-600 dark:text-surface-400">Read the title.</p> </div> </div> </div> <div x-show="(exFilter === 'all' || exFilter === 'listening') && (exLevel === 'all' || exLevel === '')" x-cloak> <div class="p-5 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50 border-2 border-b-4 border-surface-200 dark:border-[#3b3755]"> <div class="flex items-center gap-2 mb-2"> <span class="inline-flex items-center px-2 py-0.5 rounded-md text-[10px] font-semibold uppercase tracking-wide bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-300"> listening </span> </div> <p class="text-lg font-semibold text-surface-900 dark:text-white mb-4">Listen and write: [Audio: shīrṣak likho]</p> <div x-data="{ userInput: '', checked: false, isCorrect: false, playing: false }" class="space-y-3"> <div class="flex items-center gap-3"> <button @click="playing = true; const u = new SpeechSynthesisUtterance(''); u.lang = 'en-US'; u.rate = 0.9; u.onend = () => playing = false; speechSynthesis.speak(u)" :class="playing ? 'bg-violet-600 text-white' : 'bg-violet-100 dark:bg-violet-900/30 text-violet-700 dark:text-violet-300'" class="p-4 rounded-xl border-2 border-violet-200 dark:border-violet-800 transition-all hover:scale-105 active:scale-95" :disabled="playing"> <svg class="w-8 h-8" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15.536 8.464a5 5 0 010 7.072m2.828-9.9a9 9 0 010 12.728M5.586 15H4a1 1 0 01-1-1v-4a1 1 0 011-1h1.586l4.707-4.707C10.923 3.663 12 4.109 12 5v14c0 .891-1.077 1.337-1.707.707L5.586 15z"/></svg> </button> <div class="flex-1"> <input x-model="userInput" type="text" :disabled="checked" placeholder="Type what you hear..." class="w-full px-4 py-3 rounded-xl border-2 border-surface-200 dark:border-surface-700 bg-white dark:bg-dark-card text-surface-900 dark:text-white focus:border-violet-400 focus:ring-2 focus:ring-violet-200 dark:focus:ring-violet-800 transition-all" @keydown.enter="if(!checked && userInput.trim()) { checked = true; isCorrect = userInput.trim().toLowerCase() === ''.toLowerCase(); if(isCorrect) { answered[158] = true; correct[158] = true; score++; } else { answered[158] = true; correct[158] = false; } }"> </div> </div> <button x-show="!checked && userInput.trim()" @click="checked = true; isCorrect = userInput.trim().toLowerCase() === ''.toLowerCase(); if(isCorrect) { answered[158] = true; correct[158] = true; score++; } else { answered[158] = true; correct[158] = false; }" class="px-4 py-2 rounded-xl text-sm font-bold bg-violet-600 text-white hover:bg-violet-700 shadow-[0_3px_0_0_#5b21b6] active:translate-y-[3px] active:shadow-none transition-all"> Check </button> <div x-show="checked" x-cloak class="text-sm" :class="isCorrect ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="isCorrect">Correct!</span> <span x-show="!isCorrect">Not quite. Correct answer: <strong></strong></span> </div> </div> <div x-show="answered[158]" x-cloak class="mt-3 text-sm" :class="correct[158] ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="correct[158]">Correct!</span> <span x-show="!correct[158]">Not quite. Correct answer: <strong></strong></span> <p class="mt-1 text-surface-600 dark:text-surface-400">Write the title.</p> </div> </div> </div> <div x-show="(exFilter === 'all' || exFilter === 'listening') && (exLevel === 'all' || exLevel === '')" x-cloak> <div class="p-5 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50 border-2 border-b-4 border-surface-200 dark:border-[#3b3755]"> <div class="flex items-center gap-2 mb-2"> <span class="inline-flex items-center px-2 py-0.5 rounded-md text-[10px] font-semibold uppercase tracking-wide bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-300"> listening </span> </div> <p class="text-lg font-semibold text-surface-900 dark:text-white mb-4">Listen and write: [Audio: akarshak shīrṣak]</p> <div x-data="{ userInput: '', checked: false, isCorrect: false, playing: false }" class="space-y-3"> <div class="flex items-center gap-3"> <button @click="playing = true; const u = new SpeechSynthesisUtterance(''); u.lang = 'en-US'; u.rate = 0.9; u.onend = () => playing = false; speechSynthesis.speak(u)" :class="playing ? 'bg-violet-600 text-white' : 'bg-violet-100 dark:bg-violet-900/30 text-violet-700 dark:text-violet-300'" class="p-4 rounded-xl border-2 border-violet-200 dark:border-violet-800 transition-all hover:scale-105 active:scale-95" :disabled="playing"> <svg class="w-8 h-8" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15.536 8.464a5 5 0 010 7.072m2.828-9.9a9 9 0 010 12.728M5.586 15H4a1 1 0 01-1-1v-4a1 1 0 011-1h1.586l4.707-4.707C10.923 3.663 12 4.109 12 5v14c0 .891-1.077 1.337-1.707.707L5.586 15z"/></svg> </button> <div class="flex-1"> <input x-model="userInput" type="text" :disabled="checked" placeholder="Type what you hear..." class="w-full px-4 py-3 rounded-xl border-2 border-surface-200 dark:border-surface-700 bg-white dark:bg-dark-card text-surface-900 dark:text-white focus:border-violet-400 focus:ring-2 focus:ring-violet-200 dark:focus:ring-violet-800 transition-all" @keydown.enter="if(!checked && userInput.trim()) { checked = true; isCorrect = userInput.trim().toLowerCase() === ''.toLowerCase(); if(isCorrect) { answered[159] = true; correct[159] = true; score++; } else { answered[159] = true; correct[159] = false; } }"> </div> </div> <button x-show="!checked && userInput.trim()" @click="checked = true; isCorrect = userInput.trim().toLowerCase() === ''.toLowerCase(); if(isCorrect) { answered[159] = true; correct[159] = true; score++; } else { answered[159] = true; correct[159] = false; }" class="px-4 py-2 rounded-xl text-sm font-bold bg-violet-600 text-white hover:bg-violet-700 shadow-[0_3px_0_0_#5b21b6] active:translate-y-[3px] active:shadow-none transition-all"> Check </button> <div x-show="checked" x-cloak class="text-sm" :class="isCorrect ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="isCorrect">Correct!</span> <span x-show="!isCorrect">Not quite. Correct answer: <strong></strong></span> </div> </div> <div x-show="answered[159]" x-cloak class="mt-3 text-sm" :class="correct[159] ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="correct[159]">Correct!</span> <span x-show="!correct[159]">Not quite. Correct answer: <strong></strong></span> <p class="mt-1 text-surface-600 dark:text-surface-400">Catchy title.</p> </div> </div> </div> <div x-show="(exFilter === 'all' || exFilter === 'listening') && (exLevel === 'all' || exLevel === '')" x-cloak> <div class="p-5 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50 border-2 border-b-4 border-surface-200 dark:border-[#3b3755]"> <div class="flex items-center gap-2 mb-2"> <span class="inline-flex items-center px-2 py-0.5 rounded-md text-[10px] font-semibold uppercase tracking-wide bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-300"> listening </span> </div> <p class="text-lg font-semibold text-surface-900 dark:text-white mb-4">Listen and write: [Audio: bina shīrṣak ka]</p> <div x-data="{ userInput: '', checked: false, isCorrect: false, playing: false }" class="space-y-3"> <div class="flex items-center gap-3"> <button @click="playing = true; const u = new SpeechSynthesisUtterance(''); u.lang = 'en-US'; u.rate = 0.9; u.onend = () => playing = false; speechSynthesis.speak(u)" :class="playing ? 'bg-violet-600 text-white' : 'bg-violet-100 dark:bg-violet-900/30 text-violet-700 dark:text-violet-300'" class="p-4 rounded-xl border-2 border-violet-200 dark:border-violet-800 transition-all hover:scale-105 active:scale-95" :disabled="playing"> <svg class="w-8 h-8" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15.536 8.464a5 5 0 010 7.072m2.828-9.9a9 9 0 010 12.728M5.586 15H4a1 1 0 01-1-1v-4a1 1 0 011-1h1.586l4.707-4.707C10.923 3.663 12 4.109 12 5v14c0 .891-1.077 1.337-1.707.707L5.586 15z"/></svg> </button> <div class="flex-1"> <input x-model="userInput" type="text" :disabled="checked" placeholder="Type what you hear..." class="w-full px-4 py-3 rounded-xl border-2 border-surface-200 dark:border-surface-700 bg-white dark:bg-dark-card text-surface-900 dark:text-white focus:border-violet-400 focus:ring-2 focus:ring-violet-200 dark:focus:ring-violet-800 transition-all" @keydown.enter="if(!checked && userInput.trim()) { checked = true; isCorrect = userInput.trim().toLowerCase() === ''.toLowerCase(); if(isCorrect) { answered[160] = true; correct[160] = true; score++; } else { answered[160] = true; correct[160] = false; } }"> </div> </div> <button x-show="!checked && userInput.trim()" @click="checked = true; isCorrect = userInput.trim().toLowerCase() === ''.toLowerCase(); if(isCorrect) { answered[160] = true; correct[160] = true; score++; } else { answered[160] = true; correct[160] = false; }" class="px-4 py-2 rounded-xl text-sm font-bold bg-violet-600 text-white hover:bg-violet-700 shadow-[0_3px_0_0_#5b21b6] active:translate-y-[3px] active:shadow-none transition-all"> Check </button> <div x-show="checked" x-cloak class="text-sm" :class="isCorrect ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="isCorrect">Correct!</span> <span x-show="!isCorrect">Not quite. Correct answer: <strong></strong></span> </div> </div> <div x-show="answered[160]" x-cloak class="mt-3 text-sm" :class="correct[160] ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="correct[160]">Correct!</span> <span x-show="!correct[160]">Not quite. Correct answer: <strong></strong></span> <p class="mt-1 text-surface-600 dark:text-surface-400">Untitled.</p> </div> </div> </div> <div x-show="(exFilter === 'all' || exFilter === 'listening') && (exLevel === 'all' || exLevel === '')" x-cloak> <div class="p-5 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50 border-2 border-b-4 border-surface-200 dark:border-[#3b3755]"> <div class="flex items-center gap-2 mb-2"> <span class="inline-flex items-center px-2 py-0.5 rounded-md text-[10px] font-semibold uppercase tracking-wide bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-300"> listening </span> </div> <p class="text-lg font-semibold text-surface-900 dark:text-white mb-4">Listen and write: [Audio: shīrṣak geet]</p> <div x-data="{ userInput: '', checked: false, isCorrect: false, playing: false }" class="space-y-3"> <div class="flex items-center gap-3"> <button @click="playing = true; const u = new SpeechSynthesisUtterance(''); u.lang = 'en-US'; u.rate = 0.9; u.onend = () => playing = false; speechSynthesis.speak(u)" :class="playing ? 'bg-violet-600 text-white' : 'bg-violet-100 dark:bg-violet-900/30 text-violet-700 dark:text-violet-300'" class="p-4 rounded-xl border-2 border-violet-200 dark:border-violet-800 transition-all hover:scale-105 active:scale-95" :disabled="playing"> <svg class="w-8 h-8" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15.536 8.464a5 5 0 010 7.072m2.828-9.9a9 9 0 010 12.728M5.586 15H4a1 1 0 01-1-1v-4a1 1 0 011-1h1.586l4.707-4.707C10.923 3.663 12 4.109 12 5v14c0 .891-1.077 1.337-1.707.707L5.586 15z"/></svg> </button> <div class="flex-1"> <input x-model="userInput" type="text" :disabled="checked" placeholder="Type what you hear..." class="w-full px-4 py-3 rounded-xl border-2 border-surface-200 dark:border-surface-700 bg-white dark:bg-dark-card text-surface-900 dark:text-white focus:border-violet-400 focus:ring-2 focus:ring-violet-200 dark:focus:ring-violet-800 transition-all" @keydown.enter="if(!checked && userInput.trim()) { checked = true; isCorrect = userInput.trim().toLowerCase() === ''.toLowerCase(); if(isCorrect) { answered[161] = true; correct[161] = true; score++; } else { answered[161] = true; correct[161] = false; } }"> </div> </div> <button x-show="!checked && userInput.trim()" @click="checked = true; isCorrect = userInput.trim().toLowerCase() === ''.toLowerCase(); if(isCorrect) { answered[161] = true; correct[161] = true; score++; } else { answered[161] = true; correct[161] = false; }" class="px-4 py-2 rounded-xl text-sm font-bold bg-violet-600 text-white hover:bg-violet-700 shadow-[0_3px_0_0_#5b21b6] active:translate-y-[3px] active:shadow-none transition-all"> Check </button> <div x-show="checked" x-cloak class="text-sm" :class="isCorrect ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="isCorrect">Correct!</span> <span x-show="!isCorrect">Not quite. Correct answer: <strong></strong></span> </div> </div> <div x-show="answered[161]" x-cloak class="mt-3 text-sm" :class="correct[161] ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="correct[161]">Correct!</span> <span x-show="!correct[161]">Not quite. Correct answer: <strong></strong></span> <p class="mt-1 text-surface-600 dark:text-surface-400">Title track.</p> </div> </div> </div> <div x-show="(exFilter === 'all' || exFilter === 'listening') && (exLevel === 'all' || exLevel === '')" x-cloak> <div class="p-5 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50 border-2 border-b-4 border-surface-200 dark:border-[#3b3755]"> <div class="flex items-center gap-2 mb-2"> <span class="inline-flex items-center px-2 py-0.5 rounded-md text-[10px] font-semibold uppercase tracking-wide bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-300"> listening </span> </div> <p class="text-lg font-semibold text-surface-900 dark:text-white mb-4">Listen and write: [Audio: in shīrṣakon mein]</p> <div x-data="{ userInput: '', checked: false, isCorrect: false, playing: false }" class="space-y-3"> <div class="flex items-center gap-3"> <button @click="playing = true; const u = new SpeechSynthesisUtterance(''); u.lang = 'en-US'; u.rate = 0.9; u.onend = () => playing = false; speechSynthesis.speak(u)" :class="playing ? 'bg-violet-600 text-white' : 'bg-violet-100 dark:bg-violet-900/30 text-violet-700 dark:text-violet-300'" class="p-4 rounded-xl border-2 border-violet-200 dark:border-violet-800 transition-all hover:scale-105 active:scale-95" :disabled="playing"> <svg class="w-8 h-8" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15.536 8.464a5 5 0 010 7.072m2.828-9.9a9 9 0 010 12.728M5.586 15H4a1 1 0 01-1-1v-4a1 1 0 011-1h1.586l4.707-4.707C10.923 3.663 12 4.109 12 5v14c0 .891-1.077 1.337-1.707.707L5.586 15z"/></svg> </button> <div class="flex-1"> <input x-model="userInput" type="text" :disabled="checked" placeholder="Type what you hear..." class="w-full px-4 py-3 rounded-xl border-2 border-surface-200 dark:border-surface-700 bg-white dark:bg-dark-card text-surface-900 dark:text-white focus:border-violet-400 focus:ring-2 focus:ring-violet-200 dark:focus:ring-violet-800 transition-all" @keydown.enter="if(!checked && userInput.trim()) { checked = true; isCorrect = userInput.trim().toLowerCase() === ''.toLowerCase(); if(isCorrect) { answered[162] = true; correct[162] = true; score++; } else { answered[162] = true; correct[162] = false; } }"> </div> </div> <button x-show="!checked && userInput.trim()" @click="checked = true; isCorrect = userInput.trim().toLowerCase() === ''.toLowerCase(); if(isCorrect) { answered[162] = true; correct[162] = true; score++; } else { answered[162] = true; correct[162] = false; }" class="px-4 py-2 rounded-xl text-sm font-bold bg-violet-600 text-white hover:bg-violet-700 shadow-[0_3px_0_0_#5b21b6] active:translate-y-[3px] active:shadow-none transition-all"> Check </button> <div x-show="checked" x-cloak class="text-sm" :class="isCorrect ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="isCorrect">Correct!</span> <span x-show="!isCorrect">Not quite. Correct answer: <strong></strong></span> </div> </div> <div x-show="answered[162]" x-cloak class="mt-3 text-sm" :class="correct[162] ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="correct[162]">Correct!</span> <span x-show="!correct[162]">Not quite. Correct answer: <strong></strong></span> <p class="mt-1 text-surface-600 dark:text-surface-400">In these titles (plural oblique).</p> </div> </div> </div> <div x-show="(exFilter === 'all' || exFilter === 'listening') && (exLevel === 'all' || exLevel === '')" x-cloak> <div class="p-5 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50 border-2 border-b-4 border-surface-200 dark:border-[#3b3755]"> <div class="flex items-center gap-2 mb-2"> <span class="inline-flex items-center px-2 py-0.5 rounded-md text-[10px] font-semibold uppercase tracking-wide bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-300"> listening </span> </div> <p class="text-lg font-semibold text-surface-900 dark:text-white mb-4">Listen and write: [Audio: shīrṣak badlo]</p> <div x-data="{ userInput: '', checked: false, isCorrect: false, playing: false }" class="space-y-3"> <div class="flex items-center gap-3"> <button @click="playing = true; const u = new SpeechSynthesisUtterance(''); u.lang = 'en-US'; u.rate = 0.9; u.onend = () => playing = false; speechSynthesis.speak(u)" :class="playing ? 'bg-violet-600 text-white' : 'bg-violet-100 dark:bg-violet-900/30 text-violet-700 dark:text-violet-300'" class="p-4 rounded-xl border-2 border-violet-200 dark:border-violet-800 transition-all hover:scale-105 active:scale-95" :disabled="playing"> <svg class="w-8 h-8" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15.536 8.464a5 5 0 010 7.072m2.828-9.9a9 9 0 010 12.728M5.586 15H4a1 1 0 01-1-1v-4a1 1 0 011-1h1.586l4.707-4.707C10.923 3.663 12 4.109 12 5v14c0 .891-1.077 1.337-1.707.707L5.586 15z"/></svg> </button> <div class="flex-1"> <input x-model="userInput" type="text" :disabled="checked" placeholder="Type what you hear..." class="w-full px-4 py-3 rounded-xl border-2 border-surface-200 dark:border-surface-700 bg-white dark:bg-dark-card text-surface-900 dark:text-white focus:border-violet-400 focus:ring-2 focus:ring-violet-200 dark:focus:ring-violet-800 transition-all" @keydown.enter="if(!checked && userInput.trim()) { checked = true; isCorrect = userInput.trim().toLowerCase() === ''.toLowerCase(); if(isCorrect) { answered[163] = true; correct[163] = true; score++; } else { answered[163] = true; correct[163] = false; } }"> </div> </div> <button x-show="!checked && userInput.trim()" @click="checked = true; isCorrect = userInput.trim().toLowerCase() === ''.toLowerCase(); if(isCorrect) { answered[163] = true; correct[163] = true; score++; } else { answered[163] = true; correct[163] = false; }" class="px-4 py-2 rounded-xl text-sm font-bold bg-violet-600 text-white hover:bg-violet-700 shadow-[0_3px_0_0_#5b21b6] active:translate-y-[3px] active:shadow-none transition-all"> Check </button> <div x-show="checked" x-cloak class="text-sm" :class="isCorrect ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="isCorrect">Correct!</span> <span x-show="!isCorrect">Not quite. Correct answer: <strong></strong></span> </div> </div> <div x-show="answered[163]" x-cloak class="mt-3 text-sm" :class="correct[163] ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="correct[163]">Correct!</span> <span x-show="!correct[163]">Not quite. Correct answer: <strong></strong></span> <p class="mt-1 text-surface-600 dark:text-surface-400">Change the title.</p> </div> </div> </div> <div x-show="(exFilter === 'all' || exFilter === 'listening') && (exLevel === 'all' || exLevel === '')" x-cloak> <div class="p-5 rounded-xl bg-surface-50 dark:bg-dark-surface-3/50 border-2 border-b-4 border-surface-200 dark:border-[#3b3755]"> <div class="flex items-center gap-2 mb-2"> <span class="inline-flex items-center px-2 py-0.5 rounded-md text-[10px] font-semibold uppercase tracking-wide bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-300"> listening </span> </div> <p class="text-lg font-semibold text-surface-900 dark:text-white mb-4">Listen and write: [Audio: uchit shīrṣak den]</p> <div x-data="{ userInput: '', checked: false, isCorrect: false, playing: false }" class="space-y-3"> <div class="flex items-center gap-3"> <button @click="playing = true; const u = new SpeechSynthesisUtterance(''); u.lang = 'en-US'; u.rate = 0.9; u.onend = () => playing = false; speechSynthesis.speak(u)" :class="playing ? 'bg-violet-600 text-white' : 'bg-violet-100 dark:bg-violet-900/30 text-violet-700 dark:text-violet-300'" class="p-4 rounded-xl border-2 border-violet-200 dark:border-violet-800 transition-all hover:scale-105 active:scale-95" :disabled="playing"> <svg class="w-8 h-8" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15.536 8.464a5 5 0 010 7.072m2.828-9.9a9 9 0 010 12.728M5.586 15H4a1 1 0 01-1-1v-4a1 1 0 011-1h1.586l4.707-4.707C10.923 3.663 12 4.109 12 5v14c0 .891-1.077 1.337-1.707.707L5.586 15z"/></svg> </button> <div class="flex-1"> <input x-model="userInput" type="text" :disabled="checked" placeholder="Type what you hear..." class="w-full px-4 py-3 rounded-xl border-2 border-surface-200 dark:border-surface-700 bg-white dark:bg-dark-card text-surface-900 dark:text-white focus:border-violet-400 focus:ring-2 focus:ring-violet-200 dark:focus:ring-violet-800 transition-all" @keydown.enter="if(!checked && userInput.trim()) { checked = true; isCorrect = userInput.trim().toLowerCase() === ''.toLowerCase(); if(isCorrect) { answered[164] = true; correct[164] = true; score++; } else { answered[164] = true; correct[164] = false; } }"> </div> </div> <button x-show="!checked && userInput.trim()" @click="checked = true; isCorrect = userInput.trim().toLowerCase() === ''.toLowerCase(); if(isCorrect) { answered[164] = true; correct[164] = true; score++; } else { answered[164] = true; correct[164] = false; }" class="px-4 py-2 rounded-xl text-sm font-bold bg-violet-600 text-white hover:bg-violet-700 shadow-[0_3px_0_0_#5b21b6] active:translate-y-[3px] active:shadow-none transition-all"> Check </button> <div x-show="checked" x-cloak class="text-sm" :class="isCorrect ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="isCorrect">Correct!</span> <span x-show="!isCorrect">Not quite. Correct answer: <strong></strong></span> </div> </div> <div x-show="answered[164]" x-cloak class="mt-3 text-sm" :class="correct[164] ? 'text-emerald-700 dark:text-emerald-300' : 'text-rose-700 dark:text-rose-300'"> <span x-show="correct[164]">Correct!</span> <span x-show="!correct[164]">Not quite. Correct answer: <strong></strong></span> <p class="mt-1 text-surface-600 dark:text-surface-400">Give a suitable title.</p> </div> </div> </div> </div> <div x-show="Object.keys(answered).length >= 3" x-cloak class="mt-6 p-4 rounded-xl bg-gradient-to-r from-brand-50 to-violet-50 dark:from-brand-900/20 dark:to-violet-900/20 border border-brand-200 dark:border-brand-800 text-center"> <p class="font-bold text-brand-700 dark:text-brand-300 text-lg"> <span x-text="score"></span> / 200 correct </p> <p class="text-sm text-surface-500 dark:text-surface-400 mt-1" x-show="score === 200">Perfect score!</p> </div> </div> </div> </div> <div class="flex justify-center -mt-16 relative z-10"> <a href="https://sublearn.com/register" class="inline-flex items-center gap-2 px-6 py-3 text-sm font-bold rounded-xl bg-brand-600 hover:bg-brand-700 text-white shadow-[0_3px_0_0_#5b21b6] active:translate-y-[3px] active:shadow-none transition-all"> <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z"/></svg> Sign up free to practice </a> </div> </div> <div x-show="false" class="hidden"> <div class="card p-6 bg-gradient-to-br from-brand-50 via-white to-blue-50 dark:from-brand-900/20 dark:via-dark-card dark:to-blue-900/10"> <h2 class="text-lg font-bold text-surface-900 dark:text-white flex items-center gap-2 mb-3"> <svg class="w-5 h-5 text-brand-600 dark:text-brand-400" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg> Summary </h2> <p class="text-surface-700 dark:text-surface-300 leading-relaxed">Use 'शीर्षक' (shīrṣak) when referring to the title of a book, movie, or article. Remember it is a masculine noun, so always say 'किताब का शीर्षक' (title of the book), never 'की शीर्षक'.</p> <ul class="mt-2 space-y-1.5"> <li class="flex items-start gap-2 text-sm text-surface-600 dark:text-surface-300"> <span class="mt-1.5 w-1.5 h-1.5 rounded-full bg-brand-400 dark:bg-brand-500 flex-shrink-0"></span> <span>Meaning: Title or Heading of a work.</span> </li> <li class="flex items-start gap-2 text-sm text-surface-600 dark:text-surface-300"> <span class="mt-1.5 w-1.5 h-1.5 rounded-full bg-brand-400 dark:bg-brand-500 flex-shrink-0"></span> <span>Gender: Masculine Noun (अच्छा शीर्षक).</span> </li> <li class="flex items-start gap-2 text-sm text-surface-600 dark:text-surface-300"> <span class="mt-1.5 w-1.5 h-1.5 rounded-full bg-brand-400 dark:bg-brand-500 flex-shrink-0"></span> <span>Usage: Books, movies, articles, essays.</span> </li> <li class="flex items-start gap-2 text-sm text-surface-600 dark:text-surface-300"> <span class="mt-1.5 w-1.5 h-1.5 rounded-full bg-brand-400 dark:bg-brand-500 flex-shrink-0"></span> <span>Do Not Use For: People's names or professional titles.</span> </li> </ul> </div> <div class="grid gap-4 sm:grid-cols-2"> <div class="rounded-xl border-2 bg-blue-50 dark:bg-blue-900/20 border-blue-200 dark:border-blue-800 p-4"> <div class="flex items-start gap-3"> <span class="text-2xl flex-shrink-0">📝</span> <div> <h3 class="font-semibold text-surface-900 dark:text-white text-sm">Always Masculine</h3> <p class="text-xs text-surface-600 dark:text-surface-300 mt-1">Remember that 'शीर्षक' is always a masculine noun. This means you must use 'का' (kā) before it, not 'की' (kī). Say 'कहानी का शीर्षक' (title of the story), even though 'कहानी' is feminine. The postposition agrees with 'शीर्षक'.</p> </div> </div> </div> <div class="rounded-xl border-2 bg-blue-50 dark:bg-blue-900/20 border-blue-200 dark:border-blue-800 p-4"> <div class="flex items-start gap-3"> <span class="text-2xl flex-shrink-0">📚</span> <div> <h3 class="font-semibold text-surface-900 dark:text-white text-sm">Not for People</h3> <p class="text-xs text-surface-600 dark:text-surface-300 mt-1">Never use 'शीर्षक' to ask for a person's name. If you ask someone 'आपका शीर्षक क्या है?', they will be very confused. Always use 'नाम' (nām) for people and 'शीर्षक' for books, movies, and articles.</p> </div> </div> </div> <div class="rounded-xl border-2 bg-blue-50 dark:bg-blue-900/20 border-blue-200 dark:border-blue-800 p-4"> <div class="flex items-start gap-3"> <span class="text-2xl flex-shrink-0">🗣️</span> <div> <h3 class="font-semibold text-surface-900 dark:text-white text-sm">Long 'ee' Sound</h3> <p class="text-xs text-surface-600 dark:text-surface-300 mt-1">Pay attention to the spelling and pronunciation. It is 'शीर्षक' with a long 'ī' sound (sheer-shak), not 'शिर्षक' with a short 'i'. Emphasizing the first syllable will make you sound more like a native speaker.</p> </div> </div> </div> <div class="rounded-xl border-2 bg-blue-50 dark:bg-blue-900/20 border-blue-200 dark:border-blue-800 p-4"> <div class="flex items-start gap-3"> <span class="text-2xl flex-shrink-0">✍️</span> <div> <h3 class="font-semibold text-surface-900 dark:text-white text-sm">Reading Comprehension Hack</h3> <p class="text-xs text-surface-600 dark:text-surface-300 mt-1">If you are taking a Hindi exam, look out for the question 'उचित शीर्षक दें' (Give a proper title). This is a guaranteed question in reading comprehension. Practice summarizing paragraphs into 2-3 word headings to ace this.</p> </div> </div> </div> </div> <div class="bg-white dark:bg-dark-card border-2 border-surface-200 dark:border-[#3b3755] border-b-4 rounded-2xl p-6"> <h2 class="text-lg font-bold text-surface-900 dark:text-white flex items-center gap-2 mb-4"> <svg class="w-5 h-5 text-emerald-600 dark:text-emerald-400" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"/></svg> Example </h2> <p class="text-surface-900 dark:text-white italic bg-surface-50 dark:bg-dark-surface-3 p-4 rounded-xl ltr:border-l-4 rtl:border-r-4 border-brand-500 dark:border-brand-400"> कहानी का शीर्षक बहुत आकर्षक था। </p> </div> </div> <div class="mt-8" x-data="{ relTab: 'grammar' }"> <h2 class="text-lg font-bold text-surface-900 dark:text-white mb-3">Related Content</h2> <div class="flex gap-1.5 bg-brand-100 dark:bg-brand-900/40 rounded-xl p-1.5 pb-2.5 mb-4 overflow-x-auto" role="tablist" aria-label="Related content categories"> <button @click="relTab = 'grammar'" role="tab" id="rel-tab-grammar" :aria-selected="(relTab === 'grammar').toString()" aria-controls="rel-panel-grammar" :class="relTab === 'grammar' ? 'bg-indigo-600 text-white shadow-[0_3px_0_0_#3730a3] btn-glaze' : 'bg-white dark:bg-dark-card text-indigo-700 dark:text-indigo-300 shadow-[0_3px_0_0_#c7d2fe] dark:shadow-[0_3px_0_0_#312e81]'" class="flex-shrink-0 px-4 py-2.5 text-xs font-bold rounded-xl transition-all active:translate-y-[3px] active:shadow-none">Grammar</button> <button @click="relTab = 'vocab'" role="tab" id="rel-tab-vocab" :aria-selected="(relTab === 'vocab').toString()" aria-controls="rel-panel-vocab" :class="relTab === 'vocab' ? 'bg-cyan-600 text-white shadow-[0_3px_0_0_#155e75] btn-glaze' : 'bg-white dark:bg-dark-card text-cyan-700 dark:text-cyan-300 shadow-[0_3px_0_0_#a5f3fc] dark:shadow-[0_3px_0_0_#083344]'" class="flex-shrink-0 px-4 py-2.5 text-xs font-bold rounded-xl transition-all active:translate-y-[3px] active:shadow-none">Vocabulary</button> </div> <div x-show="relTab === 'videos'" x-transition role="tabpanel" id="rel-panel-videos" aria-labelledby="rel-tab-videos"> </div> <div x-show="relTab === 'country'" x-transition role="tabpanel" id="rel-panel-country" aria-labelledby="rel-tab-country"> </div> <div x-show="relTab === 'grammar'" x-transition role="tabpanel" id="rel-panel-grammar" aria-labelledby="rel-tab-grammar"> <div class="mt-8"> <h2 class="text-xl font-bold text-surface-900 dark:text-white mb-4 flex items-center gap-2"> <svg class="w-5 h-5 text-indigo-600 dark:text-indigo-400" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253"/></svg> Related Grammar Rules </h2> <div class="grid gap-3"> <a href="https://sublearn.com/learn/hi/grammar/syntactic-conventions-of-hindi-journalistic-headlines" class="group flex items-center justify-between p-4 bg-white dark:bg-dark-card border-2 border-b-4 border-surface-200 dark:border-[#3b3755] rounded-xl hover:shadow-elevation-2 hover:border-brand-300 dark:hover:border-brand-600 transition-all"> <div class="flex items-center gap-3"> <span class="inline-flex items-center justify-center w-8 h-8 rounded-xl bg-indigo-100 dark:bg-indigo-900/30 text-indigo-600 dark:text-indigo-400"> <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"/></svg> </span> <div> <span class="font-semibold text-surface-900 dark:text-white group-hover:text-brand-600 dark:group-hover:text-brand-400 transition-colors">Hindi News Headline Syntax (Media Style)</span> <span class="ltr:ml-2 rtl:mr-2 px-2 py-0.5 text-xs font-bold rounded-md bg-brand-100 dark:bg-brand-900/30 text-brand-700 dark:text-brand-300">C2</span> </div> </div> <svg class="w-4 h-4 text-surface-400 group-hover:text-brand-500 transition-colors rtl:rotate-180" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7"/></svg> </a> </div> </div> </div> <div x-show="relTab === 'phrases'" x-transition role="tabpanel" id="rel-panel-phrases" aria-labelledby="rel-tab-phrases"> <div class="mt-8 text-center"> <a href="https://sublearn.com/learn/hi/vocabulary/sharashhaka/network" class="inline-flex items-center gap-2 px-6 py-3 text-sm font-bold rounded-xl bg-brand-600 hover:bg-brand-700 text-white shadow-[0_3px_0_0_#5b21b6] active:translate-y-[3px] active:shadow-none transition-all"> <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1"/></svg> Explore Word Network (1) </a> </div> </div> <div x-show="relTab === 'vocab'" x-transition role="tabpanel" id="rel-panel-vocab" aria-labelledby="rel-tab-vocab"> <div class="mt-6"> <h2 class="text-xl font-bold text-surface-900 dark:text-white mb-4 flex items-center gap-2"> <svg class="w-5 h-5 text-brand-600 dark:text-brand-400" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10"/></svg> More academic words </h2> <div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4"> <a href="https://sublearn.com/learn/hi/vocabulary/aacaraya" class="group bg-white dark:bg-dark-card border-2 border-b-4 border-surface-200 dark:border-[#3b3755] rounded-xl p-4 hover:shadow-elevation-2 hover:border-brand-300 dark:hover:border-brand-600 transition-all" > <div class="flex items-start justify-between mb-2"> <h3 class="font-bold text-surface-900 dark:text-white group-hover:text-brand-600 dark:group-hover:text-brand-400 transition-colors"> आचार्य </h3> <span class="px-2 py-0.5 text-xs font-semibold rounded-md bg-brand-100 dark:bg-brand-900/30 text-brand-700 dark:text-brand-300"> B1 </span> </div> <p class="text-sm text-surface-600 dark:text-surface-300 line-clamp-2"> A respected teacher, scholar, or professor. </p> </a> <a href="https://sublearn.com/learn/hi/vocabulary/aaga-calkara" class="group bg-white dark:bg-dark-card border-2 border-b-4 border-surface-200 dark:border-[#3b3755] rounded-xl p-4 hover:shadow-elevation-2 hover:border-brand-300 dark:hover:border-brand-600 transition-all" > <div class="flex items-start justify-between mb-2"> <h3 class="font-bold text-surface-900 dark:text-white group-hover:text-brand-600 dark:group-hover:text-brand-400 transition-colors"> आगे चलकर </h3> <span class="px-2 py-0.5 text-xs font-semibold rounded-md bg-brand-100 dark:bg-brand-900/30 text-brand-700 dark:text-brand-300"> B1 </span> </div> <p class="text-sm text-surface-600 dark:text-surface-300 line-clamp-2"> At a later or subsequent time; in the future. </p> </a> <a href="https://sublearn.com/learn/hi/vocabulary/aakalna" class="group bg-white dark:bg-dark-card border-2 border-b-4 border-surface-200 dark:border-[#3b3755] rounded-xl p-4 hover:shadow-elevation-2 hover:border-brand-300 dark:hover:border-brand-600 transition-all" > <div class="flex items-start justify-between mb-2"> <h3 class="font-bold text-surface-900 dark:text-white group-hover:text-brand-600 dark:group-hover:text-brand-400 transition-colors"> आकलन </h3> <span class="px-2 py-0.5 text-xs font-semibold rounded-md bg-brand-100 dark:bg-brand-900/30 text-brand-700 dark:text-brand-300"> B1 </span> </div> <p class="text-sm text-surface-600 dark:text-surface-300 line-clamp-2"> The evaluation or estimation of the nature, quality, or ability of someone. </p> </a> <a href="https://sublearn.com/learn/hi/vocabulary/aakalna-karana" class="group bg-white dark:bg-dark-card border-2 border-b-4 border-surface-200 dark:border-[#3b3755] rounded-xl p-4 hover:shadow-elevation-2 hover:border-brand-300 dark:hover:border-brand-600 transition-all" > <div class="flex items-start justify-between mb-2"> <h3 class="font-bold text-surface-900 dark:text-white group-hover:text-brand-600 dark:group-hover:text-brand-400 transition-colors"> आकलन करना </h3> <span class="px-2 py-0.5 text-xs font-semibold rounded-md bg-brand-100 dark:bg-brand-900/30 text-brand-700 dark:text-brand-300"> B1 </span> </div> <p class="text-sm text-surface-600 dark:text-surface-300 line-clamp-2"> To assess; to evaluate or estimate the nature, ability, or quality of. </p> </a> <a href="https://sublearn.com/learn/hi/vocabulary/aakana" class="group bg-white dark:bg-dark-card border-2 border-b-4 border-surface-200 dark:border-[#3b3755] rounded-xl p-4 hover:shadow-elevation-2 hover:border-brand-300 dark:hover:border-brand-600 transition-all" > <div class="flex items-start justify-between mb-2"> <h3 class="font-bold text-surface-900 dark:text-white group-hover:text-brand-600 dark:group-hover:text-brand-400 transition-colors"> आँकना </h3> <span class="px-2 py-0.5 text-xs font-semibold rounded-md bg-brand-100 dark:bg-brand-900/30 text-brand-700 dark:text-brand-300"> B1 </span> </div> <p class="text-sm text-surface-600 dark:text-surface-300 line-clamp-2"> To estimate or calculate the value, quantity, or extent of something. </p> </a> <a href="https://sublearn.com/learn/hi/vocabulary/aakana-2" class="group bg-white dark:bg-dark-card border-2 border-b-4 border-surface-200 dark:border-[#3b3755] rounded-xl p-4 hover:shadow-elevation-2 hover:border-brand-300 dark:hover:border-brand-600 transition-all" > <div class="flex items-start justify-between mb-2"> <h3 class="font-bold text-surface-900 dark:text-white group-hover:text-brand-600 dark:group-hover:text-brand-400 transition-colors"> आंकना </h3> <span class="px-2 py-0.5 text-xs font-semibold rounded-md bg-brand-100 dark:bg-brand-900/30 text-brand-700 dark:text-brand-300"> B1 </span> </div> <p class="text-sm text-surface-600 dark:text-surface-300 line-clamp-2"> To assess, estimate, evaluate. </p> </a> <a href="https://sublearn.com/learn/hi/vocabulary/aakaugdha" class="group bg-white dark:bg-dark-card border-2 border-b-4 border-surface-200 dark:border-[#3b3755] rounded-xl p-4 hover:shadow-elevation-2 hover:border-brand-300 dark:hover:border-brand-600 transition-all" > <div class="flex items-start justify-between mb-2"> <h3 class="font-bold text-surface-900 dark:text-white group-hover:text-brand-600 dark:group-hover:text-brand-400 transition-colors"> आंकड़ा </h3> <span class="px-2 py-0.5 text-xs font-semibold rounded-md bg-brand-100 dark:bg-brand-900/30 text-brand-700 dark:text-brand-300"> A2 </span> </div> <p class="text-sm text-surface-600 dark:text-surface-300 line-clamp-2"> Data; facts and statistics collected together for reference or analysis. </p> </a> <a href="https://sublearn.com/learn/hi/vocabulary/aakaugdha-2" class="group bg-white dark:bg-dark-card border-2 border-b-4 border-surface-200 dark:border-[#3b3755] rounded-xl p-4 hover:shadow-elevation-2 hover:border-brand-300 dark:hover:border-brand-600 transition-all" > <div class="flex items-start justify-between mb-2"> <h3 class="font-bold text-surface-900 dark:text-white group-hover:text-brand-600 dark:group-hover:text-brand-400 transition-colors"> आँकड़े </h3> <span class="px-2 py-0.5 text-xs font-semibold rounded-md bg-brand-100 dark:bg-brand-900/30 text-brand-700 dark:text-brand-300"> B1 </span> </div> <p class="text-sm text-surface-600 dark:text-surface-300 line-clamp-2"> Facts and statistics collected together for reference or analysis. </p> </a> <a href="https://sublearn.com/learn/hi/vocabulary/aakaugdha-3" class="group bg-white dark:bg-dark-card border-2 border-b-4 border-surface-200 dark:border-[#3b3755] rounded-xl p-4 hover:shadow-elevation-2 hover:border-brand-300 dark:hover:border-brand-600 transition-all" > <div class="flex items-start justify-between mb-2"> <h3 class="font-bold text-surface-900 dark:text-white group-hover:text-brand-600 dark:group-hover:text-brand-400 transition-colors"> आँकड़ा </h3> <span class="px-2 py-0.5 text-xs font-semibold rounded-md bg-brand-100 dark:bg-brand-900/30 text-brand-700 dark:text-brand-300"> B1 </span> </div> <p class="text-sm text-surface-600 dark:text-surface-300 line-clamp-2"> Facts and statistics collected together for reference or analysis; data. </p> </a> <a href="https://sublearn.com/learn/hi/vocabulary/aakaugdha-4" class="group bg-white dark:bg-dark-card border-2 border-b-4 border-surface-200 dark:border-[#3b3755] rounded-xl p-4 hover:shadow-elevation-2 hover:border-brand-300 dark:hover:border-brand-600 transition-all" > <div class="flex items-start justify-between mb-2"> <h3 class="font-bold text-surface-900 dark:text-white group-hover:text-brand-600 dark:group-hover:text-brand-400 transition-colors"> आंकड़े </h3> <span class="px-2 py-0.5 text-xs font-semibold rounded-md bg-brand-100 dark:bg-brand-900/30 text-brand-700 dark:text-brand-300"> B1 </span> </div> <p class="text-sm text-surface-600 dark:text-surface-300 line-clamp-2"> Facts and statistics collected together for reference or analysis. </p> </a> </div> </div> </div> </div> <div class="mt-8 bg-white dark:bg-dark-card border-2 border-surface-200 dark:border-[#3b3755] border-b-4 rounded-2xl p-6" x-data="contentRating('vocabulary', 185072)"> <div class="flex flex-wrap items-center justify-between gap-4"> <div class="flex items-center gap-3"> <span class="text-sm font-medium text-surface-600 dark:text-surface-300">Was this helpful?</span> <button @click="rate(5)" :class="userRating === 5 ? 'bg-success-100 dark:bg-success-900/40 text-success-700 dark:text-success-300 ring-2 ring-success-500' : 'bg-surface-100 dark:bg-dark-surface-3 text-surface-600 dark:text-surface-300 hover:bg-success-50 dark:hover:bg-success-900/20'" class="inline-flex items-center gap-1.5 px-3 py-1.5 rounded-xl text-sm font-medium transition-all touch-target whitespace-nowrap min-w-[3.5rem]" aria-label="Yes - Was this helpful?" > <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M14 10h4.764a2 2 0 011.789 2.894l-3.5 7A2 2 0 0115.263 21h-4.017c-.163 0-.326-.02-.485-.06L7 20m7-10V5a2 2 0 00-2-2h-.095c-.5 0-.905.405-.905.905 0 .714-.211 1.412-.608 2.006L7 11v9m7-10h-2M7 20H5a2 2 0 01-2-2v-6a2 2 0 012-2h2.5"/></svg> Yes </button> <button @click="rate(1)" :class="userRating === 1 ? 'bg-danger-100 dark:bg-danger-900/40 text-danger-700 dark:text-danger-300 ring-2 ring-danger-500' : 'bg-surface-100 dark:bg-dark-surface-3 text-surface-600 dark:text-surface-300 hover:bg-danger-50 dark:hover:bg-danger-900/20'" class="inline-flex items-center gap-1.5 px-3 py-1.5 rounded-xl text-sm font-medium transition-all touch-target whitespace-nowrap min-w-[3.5rem]" aria-label="No - Was this helpful?" > <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 14H5.236a2 2 0 01-1.789-2.894l3.5-7A2 2 0 018.736 3h4.018a2 2 0 01.485.06l3.76.94m-7 10v5a2 2 0 002 2h.096c.5 0 .905-.405.905-.904 0-.715.211-1.413.608-2.008L17 13V4m-7 10h2m5-10h2a2 2 0 012 2v6a2 2 0 01-2 2h-2.5"/></svg> No </button> <span x-show="feedback" x-text="feedback" class="text-sm text-success-600 dark:text-success-400 ltr:ml-2 rtl:mr-2" x-cloak></span> </div> <button @click="showReport = !showReport" class="text-sm text-surface-500 dark:text-surface-400 hover:text-danger-600 dark:hover:text-danger-400 px-3 py-1.5 rounded-xl shadow-[0_2px_0_0_#d1d5db] dark:shadow-[0_2px_0_0_#374151] active:translate-y-[2px] active:shadow-none transition-all flex items-center gap-1" > <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L4.082 16.5c-.77.833.192 2.5 1.732 2.5z"/></svg> Report error </button> </div> <div x-show="showReport" x-cloak class="mt-4"> <textarea x-model="reportComment" class="w-full rounded-xl border-2 border-surface-300 dark:border-[#3b3755] bg-white dark:bg-dark-surface-3 text-surface-900 dark:text-white px-4 py-3 text-sm focus:ring-2 focus:ring-brand-500 dark:focus:ring-brand-400 focus:border-transparent" rows="3" aria-label="Describe the issue with this content..." placeholder="Describe the issue with this content..." ></textarea> <div class="flex justify-end mt-2 gap-2"> <button @click="showReport = false" class="px-4 py-2 text-sm font-medium text-surface-600 dark:text-surface-300 hover:text-surface-900 dark:hover:text-white rounded-xl shadow-[0_2px_0_0_#d1d5db] dark:shadow-[0_2px_0_0_#374151] active:translate-y-[2px] active:shadow-none transition-all">Cancel</button> <button @click="submitReport()" class="px-4 py-2 text-sm font-bold bg-danger-600 text-white rounded-xl hover:bg-danger-700 shadow-[0_3px_0_0_#991b1b] active:translate-y-[3px] active:shadow-none transition-all">Submit Report</button> </div> <span x-show="reportFeedback" x-text="reportFeedback" class="text-sm text-success-600 dark:text-success-400 mt-2 block" x-cloak></span> </div> </div> <div wire:snapshot="{"data":{"commentableType":"App\\Models\\VocabularyItem","commentableId":185072,"newComment":"","showForm":false},"memo":{"id":"I8N1tCwtCcKmjG6vJGPZ","name":"comment-section","path":"learn\/hi\/vocabulary\/sharashhaka","method":"GET","release":"a-a-a","children":[],"scripts":[],"assets":[],"errors":[],"locale":"en"},"checksum":"4be5c0c96313bc4fa047f7ea597ef8f5f959b40624e5d4082608dc94b947aca0"}" wire:effects="[]" wire:id="I8N1tCwtCcKmjG6vJGPZ"> <div class="flex items-center justify-between mb-6"> <h3 class="text-base font-bold text-surface-900 dark:text-white"> Comments (0) </h3> <!--[if BLOCK]><![endif]--><!--[if ENDBLOCK]><![endif]--> <!--[if BLOCK]><![endif]--> <a href="https://sublearn.com/login" class="btn-primary text-sm"> Login to Comment </a> <!--[if ENDBLOCK]><![endif]--> </div> <!--[if BLOCK]><![endif]--><!--[if ENDBLOCK]><![endif]--> <!--[if BLOCK]><![endif]--><!--[if ENDBLOCK]><![endif]--> <!--[if BLOCK]><![endif]--><!--[if ENDBLOCK]><![endif]--> <div class="space-y-4"> <!--[if BLOCK]><![endif]--> <div class="text-center py-8 text-surface-500 dark:text-surface-400"> No comments yet. Be the first to share your thoughts! </div> <!--[if ENDBLOCK]><![endif]--> </div> </div> </div> <script type="application/ld+json">{"@context":"https://schema.org","@type":["DefinedTerm","LearningResource"],"name":"शीर्षक","description":"Title/Heading, the name of a book, composition, or other artistic work.","inDefinedTermSet":{"@type":"DefinedTermSet","name":"Hindi Vocabulary","url":"https://sublearn.com/learn/hi/vocabulary"},"termCode":"A2","educationalLevel":"A2","inLanguage":"hi","learningResourceType":"vocabulary","teaches":"शीर्षक — noun (A2)","provider":{"@type":"Organization","name":"SubLearn","url":"https://sublearn.com"},"sameAs":"https://en.wiktionary.org/wiki/%E0%A4%B6%E0%A5%80%E0%A4%B0%E0%A5%8D%E0%A4%B7%E0%A4%95","identifier":{"@type":"PropertyValue","propertyID":"frequencyRank","value":1500,"name":"Word Frequency Rank"}}</script> <script type="application/ld+json"> {"@context":"https://schema.org","@type":"FAQPage","mainEntity":[{"@type":"Question","name":"Can I use 'शीर्षक' for a person's name?","acceptedAnswer":{"@type":"Answer","text":"No, you cannot use 'शीर्षक' for a person's name. The correct word for a person's name is 'नाम' (nām). 'शीर्षक' is strictly used for the titles or headings of inanimate things like books, movies, articles, and essays. Using it for a person sounds nonsensical in Hindi."}},{"@type":"Question","name":"What is the difference between 'शीर्षक' and 'विषय'?","acceptedAnswer":{"@type":"Answer","text":"'शीर्षक' means 'title' or 'heading', while 'विषय' means 'subject' or 'topic'. For example, the 'विषय' of a book might be 'Indian History', but its 'शीर्षक' could be 'The Discovery of India'. The subject is what the text is about, while the title is its specific name."}},{"@type":"Question","name":"Is 'शीर्षक' a masculine or feminine noun?","acceptedAnswer":{"@type":"Answer","text":"'शीर्षक' is a masculine noun in Hindi. This is very important for grammar. You must use masculine adjectives and postpositions with it. For example, you say 'अच्छा शीर्षक' (good title) and 'किताब का शीर्षक' (title of the book). Never use 'अच्छी' or 'की' with it."}},{"@type":"Question","name":"How do you say 'subtitle' or 'subheading' in Hindi?","acceptedAnswer":{"@type":"Answer","text":"The word for subtitle or subheading is 'उपशीर्षक' (up-shīrṣak). The prefix 'उप' (up) means 'sub' or 'under'. So, a main heading is the 'मुख्य शीर्षक' and the sections below it are 'उपशीर्षक'. This is commonly used in essay writing and formatting."}},{"@type":"Question","name":"Can I use the English word 'title' when speaking Hindi?","acceptedAnswer":{"@type":"Answer","text":"Yes, in casual, everyday spoken Hindi, especially in urban areas, the English word 'title' (टाइटल) is very commonly used. People often say 'मूवी का टाइटल क्या है?'. However, in written Hindi, exams, news, and formal speech, 'शीर्षक' is the required standard word."}},{"@type":"Question","name":"What is the plural of 'शीर्षक'?","acceptedAnswer":{"@type":"Answer","text":"In the direct case, the plural of 'शीर्षक' remains 'शीर्षक' (e.g., दो शीर्षक - two titles). However, in the oblique case (when followed by a postposition like में, पर, को), it becomes 'शीर्षकों' (shīrṣakoṃ). For example, 'इन शीर्षकों में' (in these titles)."}},{"@type":"Question","name":"How do I say 'untitled' in Hindi?","acceptedAnswer":{"@type":"Answer","text":"To say 'untitled', you can use the phrase 'बिना शीर्षक का' (binā shīrṣak kā), which literally means 'without a title'. In highly formal or literary contexts, you might see the word 'शीर्षकहीन' (shīrṣakhīn), where 'हीन' means 'without'."}},{"@type":"Question","name":"Is 'शीर्षक' used for news headlines?","acceptedAnswer":{"@type":"Answer","text":"While 'शीर्षक' can be used for the heading of a specific news article, the main, bold headlines on the front page or on TV are usually called 'सुर्खियां' (surkhiyān). 'सुर्खियां' implies breaking or important news highlights, whereas 'शीर्षक' is a general heading."}},{"@type":"Question","name":"What verb do I use to say 'to give a title'?","acceptedAnswer":{"@type":"Answer","text":"The most common verb to use is 'देना' (to give). You say 'शीर्षक देना' (shīrṣak denā). For example, 'मैंने अपनी कहानी को एक नया शीर्षक दिया' (I gave a new title to my story). You can also use 'रखना' (to keep/put), as in 'शीर्षक रखना'."}},{"@type":"Question","name":"Does 'शीर्षक' have any other meanings?","acceptedAnswer":{"@type":"Answer","text":"Its primary meaning is 'title' or 'heading'. In some highly specific legal or bureaucratic contexts, it can mean a 'head' or 'category' of an account or document, but even then, it functions essentially as a heading. It does not mean 'property title' (which is स्वामित्व)."}}]} </script> <script> function vocabPage() { return { fullTab: 'explain', showImage: false }; } function practiceExercises() { return { answered: {}, correct: {}, selected: {}, get score() { return Object.values(this.correct).filter(Boolean).length; }, checkAnswer(index, selected, correctAnswer) { if (this.answered[index]) return; this.answered[index] = true; this.selected[index] = selected; this.correct[index] = (selected === correctAnswer); }, getOptionClass(index, option, correctAnswer) { if (!this.answered[index]) { return 'border-surface-200 dark:border-[#3b3755] bg-white dark:bg-dark-surface-3 text-surface-700 dark:text-surface-300 hover:border-brand-300 dark:hover:border-brand-600 hover:bg-brand-50 dark:hover:bg-brand-900/20 cursor-pointer'; } if (option === correctAnswer) { return 'border-success-500 bg-success-50 dark:bg-success-900/30 text-success-700 dark:text-success-300 ring-2 ring-success-500/50'; } if (option === this.selected[index] && !this.correct[index]) { return 'border-danger-500 bg-danger-50 dark:bg-danger-900/30 text-danger-700 dark:text-danger-300 ring-2 ring-danger-500/50'; } return 'border-surface-200 dark:border-[#3b3755] bg-surface-50 dark:bg-dark-surface-3 text-surface-400 dark:text-surface-500 opacity-50'; } }; } function vocabQuiz() { return { answered: false, correct: false, selected: null, correctAnswer: null, checkAnswer(selected, correct) { if (this.answered) return; this.answered = true; this.selected = selected; this.correctAnswer = correct; this.correct = (selected === correct); }, getOptionClass(option) { if (!this.answered) { return 'border-surface-200 dark:border-[#3b3755] bg-white dark:bg-dark-surface-3 text-surface-700 dark:text-surface-300 hover:border-brand-300 dark:hover:border-brand-600 hover:bg-brand-50 dark:hover:bg-brand-900/20 cursor-pointer'; } if (option === this.correctAnswer) { return 'border-success-500 bg-success-50 dark:bg-success-900/30 text-success-700 dark:text-success-300 ring-2 ring-success-500/50'; } if (option === this.selected && !this.correct) { return 'border-danger-500 bg-danger-50 dark:bg-danger-900/30 text-danger-700 dark:text-danger-300 ring-2 ring-danger-500/50'; } return 'border-surface-200 dark:border-[#3b3755] bg-surface-50 dark:bg-dark-surface-3 text-surface-400 dark:text-surface-500 opacity-50'; } }; } function contentRating(type, id) { return { userRating: null, feedback: '', showReport: false, reportComment: '', reportFeedback: '', async rate(value) { this.userRating = value; try { const res = await fetch('/api/content-ratings', { method: 'POST', headers: {'Content-Type':'application/json','Accept':'application/json','X-CSRF-TOKEN':document.querySelector('meta[name=csrf-token]')?.content||''}, body: JSON.stringify({type, id, rating: value}) }); const data = await res.json(); this.feedback = data.status === 'ok' ? 'Thank you!' : ''; setTimeout(() => this.feedback = '', 3000); } catch(e) { this.feedback = ''; } }, async submitReport() { if (!this.reportComment.trim()) return; try { const res = await fetch('/api/content-ratings/report', { method: 'POST', headers: {'Content-Type':'application/json','Accept':'application/json','X-CSRF-TOKEN':document.querySelector('meta[name=csrf-token]')?.content||''}, body: JSON.stringify({type, id, comment: this.reportComment}) }); const data = await res.json(); this.reportFeedback = data.status === 'ok' ? 'Report submitted. Thank you!' : ''; this.reportComment = ''; setTimeout(() => { this.showReport = false; this.reportFeedback = ''; }, 3000); } catch(e) { this.reportFeedback = ''; } } }; } </script> </main> <section class="bg-brand-50/50 dark:bg-[#0d1526] border-t border-brand-200/30 dark:border-surface-800"> <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-10 lg:py-14"> <h2 class="text-lg font-bold text-surface-800 dark:text-surface-100 mb-8 text-center"> Explore Our Learning Content </h2> <div class="space-y-8"> <div> <h3 class="text-xs font-semibold uppercase tracking-wider text-surface-600 dark:text-surface-300 mb-3"> Languages </h3> <div class="flex flex-wrap gap-2"> <a href="https://sublearn.com/learn/sw" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-violet-50 text-violet-700 border-2 border-violet-200 border-b-4 hover:bg-violet-100 active:translate-y-[2px] active:border-b-2 dark:bg-violet-900/20 dark:text-violet-300 dark:border-violet-700 dark:hover:bg-violet-900/40 transition-all duration-100" title="Learn Swahili"> <span>🇰🇪</span> Swahili </a> <a href="https://sublearn.com/learn/bn" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-violet-50 text-violet-700 border-2 border-violet-200 border-b-4 hover:bg-violet-100 active:translate-y-[2px] active:border-b-2 dark:bg-violet-900/20 dark:text-violet-300 dark:border-violet-700 dark:hover:bg-violet-900/40 transition-all duration-100" title="Learn Bengali"> <span>🇧🇩</span> Bengali </a> <a href="https://sublearn.com/learn/lo" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-violet-50 text-violet-700 border-2 border-violet-200 border-b-4 hover:bg-violet-100 active:translate-y-[2px] active:border-b-2 dark:bg-violet-900/20 dark:text-violet-300 dark:border-violet-700 dark:hover:bg-violet-900/40 transition-all duration-100" title="Learn Lao"> <span>🇱🇦</span> Lao </a> <a href="https://sublearn.com/learn/pt" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-violet-50 text-violet-700 border-2 border-violet-200 border-b-4 hover:bg-violet-100 active:translate-y-[2px] active:border-b-2 dark:bg-violet-900/20 dark:text-violet-300 dark:border-violet-700 dark:hover:bg-violet-900/40 transition-all duration-100" title="Learn Portuguese"> <span>🇧🇷</span> Portuguese </a> <a href="https://sublearn.com/learn/fi" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-violet-50 text-violet-700 border-2 border-violet-200 border-b-4 hover:bg-violet-100 active:translate-y-[2px] active:border-b-2 dark:bg-violet-900/20 dark:text-violet-300 dark:border-violet-700 dark:hover:bg-violet-900/40 transition-all duration-100" title="Learn Finnish"> <span>🇫🇮</span> Finnish </a> <a href="https://sublearn.com/learn/id" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-violet-50 text-violet-700 border-2 border-violet-200 border-b-4 hover:bg-violet-100 active:translate-y-[2px] active:border-b-2 dark:bg-violet-900/20 dark:text-violet-300 dark:border-violet-700 dark:hover:bg-violet-900/40 transition-all duration-100" title="Learn Indonesian"> <span>🇮🇩</span> Indonesian </a> <a href="https://sublearn.com/learn/ru" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-violet-50 text-violet-700 border-2 border-violet-200 border-b-4 hover:bg-violet-100 active:translate-y-[2px] active:border-b-2 dark:bg-violet-900/20 dark:text-violet-300 dark:border-violet-700 dark:hover:bg-violet-900/40 transition-all duration-100" title="Learn Russian"> <span>🇷🇺</span> Russian </a> <a href="https://sublearn.com/learn/ne" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-violet-50 text-violet-700 border-2 border-violet-200 border-b-4 hover:bg-violet-100 active:translate-y-[2px] active:border-b-2 dark:bg-violet-900/20 dark:text-violet-300 dark:border-violet-700 dark:hover:bg-violet-900/40 transition-all duration-100" title="Learn Nepali"> <span>🇳🇵</span> Nepali </a> <a href="https://sublearn.com/learn/ro" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-violet-50 text-violet-700 border-2 border-violet-200 border-b-4 hover:bg-violet-100 active:translate-y-[2px] active:border-b-2 dark:bg-violet-900/20 dark:text-violet-300 dark:border-violet-700 dark:hover:bg-violet-900/40 transition-all duration-100" title="Learn Romanian"> <span>🇷🇴</span> Romanian </a> <a href="https://sublearn.com/learn/my" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-violet-50 text-violet-700 border-2 border-violet-200 border-b-4 hover:bg-violet-100 active:translate-y-[2px] active:border-b-2 dark:bg-violet-900/20 dark:text-violet-300 dark:border-violet-700 dark:hover:bg-violet-900/40 transition-all duration-100" title="Learn Burmese"> <span>🇲🇲</span> Burmese </a> <a href="https://sublearn.com/learn/th" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-violet-50 text-violet-700 border-2 border-violet-200 border-b-4 hover:bg-violet-100 active:translate-y-[2px] active:border-b-2 dark:bg-violet-900/20 dark:text-violet-300 dark:border-violet-700 dark:hover:bg-violet-900/40 transition-all duration-100" title="Learn Thai"> <span>🇹🇭</span> Thai </a> <a href="https://sublearn.com/learn/de" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-violet-50 text-violet-700 border-2 border-violet-200 border-b-4 hover:bg-violet-100 active:translate-y-[2px] active:border-b-2 dark:bg-violet-900/20 dark:text-violet-300 dark:border-violet-700 dark:hover:bg-violet-900/40 transition-all duration-100" title="Learn German"> <span>🇩🇪</span> German </a> <a href="https://sublearn.com/learn/sk" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-violet-50 text-violet-700 border-2 border-violet-200 border-b-4 hover:bg-violet-100 active:translate-y-[2px] active:border-b-2 dark:bg-violet-900/20 dark:text-violet-300 dark:border-violet-700 dark:hover:bg-violet-900/40 transition-all duration-100" title="Learn Slovak"> <span>🇸🇰</span> Slovak </a> <a href="https://sublearn.com/learn/es" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-violet-50 text-violet-700 border-2 border-violet-200 border-b-4 hover:bg-violet-100 active:translate-y-[2px] active:border-b-2 dark:bg-violet-900/20 dark:text-violet-300 dark:border-violet-700 dark:hover:bg-violet-900/40 transition-all duration-100" title="Learn Spanish"> <span>🇪🇸</span> Spanish </a> <a href="https://sublearn.com/learn/ta" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-violet-50 text-violet-700 border-2 border-violet-200 border-b-4 hover:bg-violet-100 active:translate-y-[2px] active:border-b-2 dark:bg-violet-900/20 dark:text-violet-300 dark:border-violet-700 dark:hover:bg-violet-900/40 transition-all duration-100" title="Learn Tamil"> <span>🇮🇳</span> Tamil </a> <a href="https://sublearn.com/learn/bg" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-violet-50 text-violet-700 border-2 border-violet-200 border-b-4 hover:bg-violet-100 active:translate-y-[2px] active:border-b-2 dark:bg-violet-900/20 dark:text-violet-300 dark:border-violet-700 dark:hover:bg-violet-900/40 transition-all duration-100" title="Learn Bulgarian"> <span>🇧🇬</span> Bulgarian </a> <a href="https://sublearn.com/learn/az" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-violet-50 text-violet-700 border-2 border-violet-200 border-b-4 hover:bg-violet-100 active:translate-y-[2px] active:border-b-2 dark:bg-violet-900/20 dark:text-violet-300 dark:border-violet-700 dark:hover:bg-violet-900/40 transition-all duration-100" title="Learn Azerbaijani"> <span>🇦🇿</span> Azerbaijani </a> <a href="https://sublearn.com/learn/hi" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-violet-50 text-violet-700 border-2 border-violet-200 border-b-4 hover:bg-violet-100 active:translate-y-[2px] active:border-b-2 dark:bg-violet-900/20 dark:text-violet-300 dark:border-violet-700 dark:hover:bg-violet-900/40 transition-all duration-100" title="Learn Hindi"> <span>🇮🇳</span> Hindi </a> <a href="https://sublearn.com/learn/en" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-violet-50 text-violet-700 border-2 border-violet-200 border-b-4 hover:bg-violet-100 active:translate-y-[2px] active:border-b-2 dark:bg-violet-900/20 dark:text-violet-300 dark:border-violet-700 dark:hover:bg-violet-900/40 transition-all duration-100" title="Learn English"> <span>🇬🇧</span> English </a> <a href="https://sublearn.com/learn/el" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-violet-50 text-violet-700 border-2 border-violet-200 border-b-4 hover:bg-violet-100 active:translate-y-[2px] active:border-b-2 dark:bg-violet-900/20 dark:text-violet-300 dark:border-violet-700 dark:hover:bg-violet-900/40 transition-all duration-100" title="Learn Greek"> <span>🇬🇷</span> Greek </a> <a href="https://sublearn.com/learn" class="inline-flex items-center gap-1 px-3 py-2 rounded-xl text-xs font-bold bg-surface-100 text-surface-700 border-2 border-surface-200 border-b-4 hover:bg-surface-200 active:translate-y-[2px] active:border-b-2 dark:bg-surface-800 dark:text-surface-300 dark:border-surface-600 dark:hover:bg-surface-700 transition-all duration-100"> All Languages → </a> </div> </div> <div> <h3 class="text-xs font-semibold uppercase tracking-wider text-surface-600 dark:text-surface-300 mb-3"> Vocabulary </h3> <div class="flex flex-wrap gap-2"> <a href="https://sublearn.com/learn/ja/vocabulary/hotly" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-emerald-50 text-emerald-700 border-2 border-emerald-200 border-b-4 hover:bg-emerald-100 active:translate-y-[2px] active:border-b-2 dark:bg-emerald-900/20 dark:text-emerald-300 dark:border-emerald-700 dark:hover:bg-emerald-900/40 transition-all duration-100" title="暑く — Japanese"> <span class="max-w-[140px] truncate">暑く</span> <span class="text-xs text-emerald-700 dark:text-emerald-300 font-bold uppercase">ja</span> </a> <a href="https://sublearn.com/learn/hi/vocabulary/kashhata-pahacana" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-emerald-50 text-emerald-700 border-2 border-emerald-200 border-b-4 hover:bg-emerald-100 active:translate-y-[2px] active:border-b-2 dark:bg-emerald-900/20 dark:text-emerald-300 dark:border-emerald-700 dark:hover:bg-emerald-900/40 transition-all duration-100" title="क्षति पहुँचाना — Hindi"> <span class="max-w-[140px] truncate">क्षति पहुँचाना</span> <span class="text-xs text-emerald-700 dark:text-emerald-300 font-bold uppercase">hi</span> </a> <a href="https://sublearn.com/learn/el/vocabulary/%CE%B4%CE%B7%CE%BC%CF%8C%CF%83%CE%B9%CE%BF%CF%82" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-emerald-50 text-emerald-700 border-2 border-emerald-200 border-b-4 hover:bg-emerald-100 active:translate-y-[2px] active:border-b-2 dark:bg-emerald-900/20 dark:text-emerald-300 dark:border-emerald-700 dark:hover:bg-emerald-900/40 transition-all duration-100" title="δημόσιος — Greek"> <span class="max-w-[140px] truncate">δημόσιος</span> <span class="text-xs text-emerald-700 dark:text-emerald-300 font-bold uppercase">el</span> </a> <a href="https://sublearn.com/learn/de/vocabulary/der-schwimmer" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-emerald-50 text-emerald-700 border-2 border-emerald-200 border-b-4 hover:bg-emerald-100 active:translate-y-[2px] active:border-b-2 dark:bg-emerald-900/20 dark:text-emerald-300 dark:border-emerald-700 dark:hover:bg-emerald-900/40 transition-all duration-100" title="der Schwimmer — German"> <span class="max-w-[140px] truncate">der Schwimmer</span> <span class="text-xs text-emerald-700 dark:text-emerald-300 font-bold uppercase">de</span> </a> <a href="https://sublearn.com/learn/hi/vocabulary/parathasha" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-emerald-50 text-emerald-700 border-2 border-emerald-200 border-b-4 hover:bg-emerald-100 active:translate-y-[2px] active:border-b-2 dark:bg-emerald-900/20 dark:text-emerald-300 dark:border-emerald-700 dark:hover:bg-emerald-900/40 transition-all duration-100" title="प्रदेश — Hindi"> <span class="max-w-[140px] truncate">प्रदेश</span> <span class="text-xs text-emerald-700 dark:text-emerald-300 font-bold uppercase">hi</span> </a> <a href="https://sublearn.com/learn/zh/vocabulary/drink-tea-2" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-emerald-50 text-emerald-700 border-2 border-emerald-200 border-b-4 hover:bg-emerald-100 active:translate-y-[2px] active:border-b-2 dark:bg-emerald-900/20 dark:text-emerald-300 dark:border-emerald-700 dark:hover:bg-emerald-900/40 transition-all duration-100" title="饮茶 — Chinese"> <span class="max-w-[140px] truncate">饮茶</span> <span class="text-xs text-emerald-700 dark:text-emerald-300 font-bold uppercase">zh</span> </a> <a href="https://sublearn.com/learn/fa/vocabulary/klmrng" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-emerald-50 text-emerald-700 border-2 border-emerald-200 border-b-4 hover:bg-emerald-100 active:translate-y-[2px] active:border-b-2 dark:bg-emerald-900/20 dark:text-emerald-300 dark:border-emerald-700 dark:hover:bg-emerald-900/40 transition-all duration-100" title="قلم‌رنگ — Persian"> <span class="max-w-[140px] truncate">قلم‌رنگ</span> <span class="text-xs text-emerald-700 dark:text-emerald-300 font-bold uppercase">fa</span> </a> <a href="https://sublearn.com/learn/hi/vocabulary/varaga-karana" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-emerald-50 text-emerald-700 border-2 border-emerald-200 border-b-4 hover:bg-emerald-100 active:translate-y-[2px] active:border-b-2 dark:bg-emerald-900/20 dark:text-emerald-300 dark:border-emerald-700 dark:hover:bg-emerald-900/40 transition-all duration-100" title="वर्ग करना — Hindi"> <span class="max-w-[140px] truncate">वर्ग करना</span> <span class="text-xs text-emerald-700 dark:text-emerald-300 font-bold uppercase">hi</span> </a> <a href="https://sublearn.com/learn/ar/vocabulary/ykdm-3" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-emerald-50 text-emerald-700 border-2 border-emerald-200 border-b-4 hover:bg-emerald-100 active:translate-y-[2px] active:border-b-2 dark:bg-emerald-900/20 dark:text-emerald-300 dark:border-emerald-700 dark:hover:bg-emerald-900/40 transition-all duration-100" title="يُقدّم — Arabic"> <span class="max-w-[140px] truncate">يُقدّم</span> <span class="text-xs text-emerald-700 dark:text-emerald-300 font-bold uppercase">ar</span> </a> <a href="https://sublearn.com/learn/fa/vocabulary/aktshaf" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-emerald-50 text-emerald-700 border-2 border-emerald-200 border-b-4 hover:bg-emerald-100 active:translate-y-[2px] active:border-b-2 dark:bg-emerald-900/20 dark:text-emerald-300 dark:border-emerald-700 dark:hover:bg-emerald-900/40 transition-all duration-100" title="اکتشاف — Persian"> <span class="max-w-[140px] truncate">اکتشاف</span> <span class="text-xs text-emerald-700 dark:text-emerald-300 font-bold uppercase">fa</span> </a> <a href="https://sublearn.com/learn/ko/vocabulary/correct-ko-2" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-emerald-50 text-emerald-700 border-2 border-emerald-200 border-b-4 hover:bg-emerald-100 active:translate-y-[2px] active:border-b-2 dark:bg-emerald-900/20 dark:text-emerald-300 dark:border-emerald-700 dark:hover:bg-emerald-900/40 transition-all duration-100" title="교정하다 — Korean"> <span class="max-w-[140px] truncate">교정하다</span> <span class="text-xs text-emerald-700 dark:text-emerald-300 font-bold uppercase">ko</span> </a> <a href="https://sublearn.com/learn/ar/vocabulary/arshad" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-emerald-50 text-emerald-700 border-2 border-emerald-200 border-b-4 hover:bg-emerald-100 active:translate-y-[2px] active:border-b-2 dark:bg-emerald-900/20 dark:text-emerald-300 dark:border-emerald-700 dark:hover:bg-emerald-900/40 transition-all duration-100" title="إرشاد — Arabic"> <span class="max-w-[140px] truncate">إرشاد</span> <span class="text-xs text-emerald-700 dark:text-emerald-300 font-bold uppercase">ar</span> </a> <a href="https://sublearn.com/learn/ja/vocabulary/in-the-middle-of" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-emerald-50 text-emerald-700 border-2 border-emerald-200 border-b-4 hover:bg-emerald-100 active:translate-y-[2px] active:border-b-2 dark:bg-emerald-900/20 dark:text-emerald-300 dark:border-emerald-700 dark:hover:bg-emerald-900/40 transition-all duration-100" title="〜かける — Japanese"> <span class="max-w-[140px] truncate">〜かける</span> <span class="text-xs text-emerald-700 dark:text-emerald-300 font-bold uppercase">ja</span> </a> <a href="https://sublearn.com/learn/hi/vocabulary/ekal-abhabhavaka" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-emerald-50 text-emerald-700 border-2 border-emerald-200 border-b-4 hover:bg-emerald-100 active:translate-y-[2px] active:border-b-2 dark:bg-emerald-900/20 dark:text-emerald-300 dark:border-emerald-700 dark:hover:bg-emerald-900/40 transition-all duration-100" title="एकल अभिभावक — Hindi"> <span class="max-w-[140px] truncate">एकल अभिभावक</span> <span class="text-xs text-emerald-700 dark:text-emerald-300 font-bold uppercase">hi</span> </a> <a href="https://sublearn.com/learn/ko/vocabulary/abundant-ko" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-emerald-50 text-emerald-700 border-2 border-emerald-200 border-b-4 hover:bg-emerald-100 active:translate-y-[2px] active:border-b-2 dark:bg-emerald-900/20 dark:text-emerald-300 dark:border-emerald-700 dark:hover:bg-emerald-900/40 transition-all duration-100" title="풍부하다 — Korean"> <span class="max-w-[140px] truncate">풍부하다</span> <span class="text-xs text-emerald-700 dark:text-emerald-300 font-bold uppercase">ko</span> </a> <a href="https://sublearn.com/learn/hi/vocabulary/bgaugdha-jana" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-emerald-50 text-emerald-700 border-2 border-emerald-200 border-b-4 hover:bg-emerald-100 active:translate-y-[2px] active:border-b-2 dark:bg-emerald-900/20 dark:text-emerald-300 dark:border-emerald-700 dark:hover:bg-emerald-900/40 transition-all duration-100" title="बिगड़ जाना — Hindi"> <span class="max-w-[140px] truncate">बिगड़ जाना</span> <span class="text-xs text-emerald-700 dark:text-emerald-300 font-bold uppercase">hi</span> </a> <a href="https://sublearn.com/learn/tr/vocabulary/g%C3%BCzel" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-emerald-50 text-emerald-700 border-2 border-emerald-200 border-b-4 hover:bg-emerald-100 active:translate-y-[2px] active:border-b-2 dark:bg-emerald-900/20 dark:text-emerald-300 dark:border-emerald-700 dark:hover:bg-emerald-900/40 transition-all duration-100" title="güzel — Turkish"> <span class="max-w-[140px] truncate">güzel</span> <span class="text-xs text-emerald-700 dark:text-emerald-300 font-bold uppercase">tr</span> </a> <a href="https://sublearn.com/learn/ar/vocabulary/yshgaa" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-emerald-50 text-emerald-700 border-2 border-emerald-200 border-b-4 hover:bg-emerald-100 active:translate-y-[2px] active:border-b-2 dark:bg-emerald-900/20 dark:text-emerald-300 dark:border-emerald-700 dark:hover:bg-emerald-900/40 transition-all duration-100" title="يُشجّع — Arabic"> <span class="max-w-[140px] truncate">يُشجّع</span> <span class="text-xs text-emerald-700 dark:text-emerald-300 font-bold uppercase">ar</span> </a> <a href="https://sublearn.com/learn/fr/vocabulary/maniere-que" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-emerald-50 text-emerald-700 border-2 border-emerald-200 border-b-4 hover:bg-emerald-100 active:translate-y-[2px] active:border-b-2 dark:bg-emerald-900/20 dark:text-emerald-300 dark:border-emerald-700 dark:hover:bg-emerald-900/40 transition-all duration-100" title="de manière que — French"> <span class="max-w-[140px] truncate">de manière que</span> <span class="text-xs text-emerald-700 dark:text-emerald-300 font-bold uppercase">fr</span> </a> <a href="https://sublearn.com/learn/nl/vocabulary/overeenkomst" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-emerald-50 text-emerald-700 border-2 border-emerald-200 border-b-4 hover:bg-emerald-100 active:translate-y-[2px] active:border-b-2 dark:bg-emerald-900/20 dark:text-emerald-300 dark:border-emerald-700 dark:hover:bg-emerald-900/40 transition-all duration-100" title="overeenkomst — Dutch"> <span class="max-w-[140px] truncate">overeenkomst</span> <span class="text-xs text-emerald-700 dark:text-emerald-300 font-bold uppercase">nl</span> </a> <a href="https://sublearn.com/learn/es/vocabulary/abordar" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-emerald-50 text-emerald-700 border-2 border-emerald-200 border-b-4 hover:bg-emerald-100 active:translate-y-[2px] active:border-b-2 dark:bg-emerald-900/20 dark:text-emerald-300 dark:border-emerald-700 dark:hover:bg-emerald-900/40 transition-all duration-100" title="abordar — Spanish"> <span class="max-w-[140px] truncate">abordar</span> <span class="text-xs text-emerald-700 dark:text-emerald-300 font-bold uppercase">es</span> </a> <a href="https://sublearn.com/learn/ar/vocabulary/mll" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-emerald-50 text-emerald-700 border-2 border-emerald-200 border-b-4 hover:bg-emerald-100 active:translate-y-[2px] active:border-b-2 dark:bg-emerald-900/20 dark:text-emerald-300 dark:border-emerald-700 dark:hover:bg-emerald-900/40 transition-all duration-100" title="ملل — Arabic"> <span class="max-w-[140px] truncate">ملل</span> <span class="text-xs text-emerald-700 dark:text-emerald-300 font-bold uppercase">ar</span> </a> <a href="https://sublearn.com/learn/fr/vocabulary/ouie" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-emerald-50 text-emerald-700 border-2 border-emerald-200 border-b-4 hover:bg-emerald-100 active:translate-y-[2px] active:border-b-2 dark:bg-emerald-900/20 dark:text-emerald-300 dark:border-emerald-700 dark:hover:bg-emerald-900/40 transition-all duration-100" title="ouïe — French"> <span class="max-w-[140px] truncate">ouïe</span> <span class="text-xs text-emerald-700 dark:text-emerald-300 font-bold uppercase">fr</span> </a> <a href="https://sublearn.com/learn/ko/vocabulary/to-chew" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-emerald-50 text-emerald-700 border-2 border-emerald-200 border-b-4 hover:bg-emerald-100 active:translate-y-[2px] active:border-b-2 dark:bg-emerald-900/20 dark:text-emerald-300 dark:border-emerald-700 dark:hover:bg-emerald-900/40 transition-all duration-100" title="씹다 — Korean"> <span class="max-w-[140px] truncate">씹다</span> <span class="text-xs text-emerald-700 dark:text-emerald-300 font-bold uppercase">ko</span> </a> </div> </div> <div> <h3 class="text-xs font-semibold uppercase tracking-wider text-surface-600 dark:text-surface-300 mb-3"> Phrases </h3> <div class="flex flex-wrap gap-2"> <a href="https://sublearn.com/learn/ru/phrases/%D0%BF%D0%BE-%D0%B4%D1%83%D1%88%D0%B5" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-amber-50 text-amber-700 border-2 border-amber-200 border-b-4 hover:bg-amber-100 active:translate-y-[2px] active:border-b-2 dark:bg-amber-900/20 dark:text-amber-300 dark:border-amber-700 dark:hover:bg-amber-900/40 transition-all duration-100" title="по душе — Russian"> <span class="max-w-[180px] truncate">по душе</span> <span class="text-xs text-amber-700 dark:text-amber-300 font-bold uppercase">ru</span> </a> <a href="https://sublearn.com/learn/ar/phrases/ar-yshark-maalomat-1" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-amber-50 text-amber-700 border-2 border-amber-200 border-b-4 hover:bg-amber-100 active:translate-y-[2px] active:border-b-2 dark:bg-amber-900/20 dark:text-amber-300 dark:border-amber-700 dark:hover:bg-amber-900/40 transition-all duration-100" title="يُشارك معلومات — Arabic"> <span class="max-w-[180px] truncate">يُشارك معلومات</span> <span class="text-xs text-amber-700 dark:text-amber-300 font-bold uppercase">ar</span> </a> <a href="https://sublearn.com/learn/id/phrases/maaf-sebentar" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-amber-50 text-amber-700 border-2 border-amber-200 border-b-4 hover:bg-amber-100 active:translate-y-[2px] active:border-b-2 dark:bg-amber-900/20 dark:text-amber-300 dark:border-amber-700 dark:hover:bg-amber-900/40 transition-all duration-100" title="Maaf sebentar — Indonesian"> <span class="max-w-[180px] truncate">Maaf sebentar</span> <span class="text-xs text-amber-700 dark:text-amber-300 font-bold uppercase">id</span> </a> <a href="https://sublearn.com/learn/ta/phrases/%E0%AE%95%E0%AE%9F%E0%AE%9F%E0%AE%AA-%E0%AE%AA%E0%AE%9F%E0%AE%A4%E0%AE%B2" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-amber-50 text-amber-700 border-2 border-amber-200 border-b-4 hover:bg-amber-100 active:translate-y-[2px] active:border-b-2 dark:bg-amber-900/20 dark:text-amber-300 dark:border-amber-700 dark:hover:bg-amber-900/40 transition-all duration-100" title="கட்டிப் போடுதல் — Tamil"> <span class="max-w-[180px] truncate">கட்டிப் போடுதல்</span> <span class="text-xs text-amber-700 dark:text-amber-300 font-bold uppercase">ta</span> </a> <a href="https://sublearn.com/learn/da/phrases/at-lave-mad" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-amber-50 text-amber-700 border-2 border-amber-200 border-b-4 hover:bg-amber-100 active:translate-y-[2px] active:border-b-2 dark:bg-amber-900/20 dark:text-amber-300 dark:border-amber-700 dark:hover:bg-amber-900/40 transition-all duration-100" title="at lave mad — Danish"> <span class="max-w-[180px] truncate">at lave mad</span> <span class="text-xs text-amber-700 dark:text-amber-300 font-bold uppercase">da</span> </a> <a href="https://sublearn.com/learn/hi/phrases/hi-eka-bugdha-bthalva-lna" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-amber-50 text-amber-700 border-2 border-amber-200 border-b-4 hover:bg-amber-100 active:translate-y-[2px] active:border-b-2 dark:bg-amber-900/20 dark:text-amber-300 dark:border-amber-700 dark:hover:bg-amber-900/40 transition-all duration-100" title="एक बड़ा बदलाव लाना — Hindi"> <span class="max-w-[180px] truncate">एक बड़ा बदलाव लाना</span> <span class="text-xs text-amber-700 dark:text-amber-300 font-bold uppercase">hi</span> </a> <a href="https://sublearn.com/learn/de/phrases/de-ich-bin-schlecht-drauf" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-amber-50 text-amber-700 border-2 border-amber-200 border-b-4 hover:bg-amber-100 active:translate-y-[2px] active:border-b-2 dark:bg-amber-900/20 dark:text-amber-300 dark:border-amber-700 dark:hover:bg-amber-900/40 transition-all duration-100" title="Ich bin schlecht drauf. — German"> <span class="max-w-[180px] truncate">Ich bin schlecht drauf.</span> <span class="text-xs text-amber-700 dark:text-amber-300 font-bold uppercase">de</span> </a> <a href="https://sublearn.com/learn/ja/phrases/ja-1691" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-amber-50 text-amber-700 border-2 border-amber-200 border-b-4 hover:bg-amber-100 active:translate-y-[2px] active:border-b-2 dark:bg-amber-900/20 dark:text-amber-300 dark:border-amber-700 dark:hover:bg-amber-900/40 transition-all duration-100" title="私は~です — Japanese"> <span class="max-w-[180px] truncate">私は~です</span> <span class="text-xs text-amber-700 dark:text-amber-300 font-bold uppercase">ja</span> </a> <a href="https://sublearn.com/learn/zh/phrases/zh-4485" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-amber-50 text-amber-700 border-2 border-amber-200 border-b-4 hover:bg-amber-100 active:translate-y-[2px] active:border-b-2 dark:bg-amber-900/20 dark:text-amber-300 dark:border-amber-700 dark:hover:bg-amber-900/40 transition-all duration-100" title="百善孝为先 — Chinese"> <span class="max-w-[180px] truncate">百善孝为先</span> <span class="text-xs text-amber-700 dark:text-amber-300 font-bold uppercase">zh</span> </a> <a href="https://sublearn.com/learn/fa/phrases/fa-ltfa-sraat-dhyd" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-amber-50 text-amber-700 border-2 border-amber-200 border-b-4 hover:bg-amber-100 active:translate-y-[2px] active:border-b-2 dark:bg-amber-900/20 dark:text-amber-300 dark:border-amber-700 dark:hover:bg-amber-900/40 transition-all duration-100" title="لطفاً سرعت دهید — Persian"> <span class="max-w-[180px] truncate">لطفاً سرعت دهید</span> <span class="text-xs text-amber-700 dark:text-amber-300 font-bold uppercase">fa</span> </a> <a href="https://sublearn.com/learn/pt/phrases/pt-no-que-toca-a" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-amber-50 text-amber-700 border-2 border-amber-200 border-b-4 hover:bg-amber-100 active:translate-y-[2px] active:border-b-2 dark:bg-amber-900/20 dark:text-amber-300 dark:border-amber-700 dark:hover:bg-amber-900/40 transition-all duration-100" title="No que toca a — Portuguese"> <span class="max-w-[180px] truncate">No que toca a</span> <span class="text-xs text-amber-700 dark:text-amber-300 font-bold uppercase">pt</span> </a> <a href="https://sublearn.com/learn/tr/phrases/bal%C4%B1k-kava%C4%9Fa-%C3%A7%C4%B1k%C4%B1nca" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-amber-50 text-amber-700 border-2 border-amber-200 border-b-4 hover:bg-amber-100 active:translate-y-[2px] active:border-b-2 dark:bg-amber-900/20 dark:text-amber-300 dark:border-amber-700 dark:hover:bg-amber-900/40 transition-all duration-100" title="balık kavağa çıkınca — Turkish"> <span class="max-w-[180px] truncate">balık kavağa çıkınca</span> <span class="text-xs text-amber-700 dark:text-amber-300 font-bold uppercase">tr</span> </a> <a href="https://sublearn.com/learn/ko/phrases/ko-6258" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-amber-50 text-amber-700 border-2 border-amber-200 border-b-4 hover:bg-amber-100 active:translate-y-[2px] active:border-b-2 dark:bg-amber-900/20 dark:text-amber-300 dark:border-amber-700 dark:hover:bg-amber-900/40 transition-all duration-100" title="품절남/녀. — Korean"> <span class="max-w-[180px] truncate">품절남/녀.</span> <span class="text-xs text-amber-700 dark:text-amber-300 font-bold uppercase">ko</span> </a> <a href="https://sublearn.com/learn/fa/phrases/fa-aygad-angyzh" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-amber-50 text-amber-700 border-2 border-amber-200 border-b-4 hover:bg-amber-100 active:translate-y-[2px] active:border-b-2 dark:bg-amber-900/20 dark:text-amber-300 dark:border-amber-700 dark:hover:bg-amber-900/40 transition-all duration-100" title="ایجاد انگیزه — Persian"> <span class="max-w-[180px] truncate">ایجاد انگیزه</span> <span class="text-xs text-amber-700 dark:text-amber-300 font-bold uppercase">fa</span> </a> <a href="https://sublearn.com/learn/el/phrases/%CF%80%CE%BF%CE%BB%CF%8D-%CE%BA%CE%B1%CE%BB%CE%AE-%CE%B4%CE%BF%CF%85%CE%BB%CE%B5%CE%B9%CE%AC" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-amber-50 text-amber-700 border-2 border-amber-200 border-b-4 hover:bg-amber-100 active:translate-y-[2px] active:border-b-2 dark:bg-amber-900/20 dark:text-amber-300 dark:border-amber-700 dark:hover:bg-amber-900/40 transition-all duration-100" title="Πολύ καλή δουλειά — Greek"> <span class="max-w-[180px] truncate">Πολύ καλή δουλειά</span> <span class="text-xs text-amber-700 dark:text-amber-300 font-bold uppercase">el</span> </a> <a href="https://sublearn.com/learn/de/phrases/de-mitleid-haben" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-amber-50 text-amber-700 border-2 border-amber-200 border-b-4 hover:bg-amber-100 active:translate-y-[2px] active:border-b-2 dark:bg-amber-900/20 dark:text-amber-300 dark:border-amber-700 dark:hover:bg-amber-900/40 transition-all duration-100" title="Mitleid haben — German"> <span class="max-w-[180px] truncate">Mitleid haben</span> <span class="text-xs text-amber-700 dark:text-amber-300 font-bold uppercase">de</span> </a> <a href="https://sublearn.com/learn/ko/phrases/ko-6018" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-amber-50 text-amber-700 border-2 border-amber-200 border-b-4 hover:bg-amber-100 active:translate-y-[2px] active:border-b-2 dark:bg-amber-900/20 dark:text-amber-300 dark:border-amber-700 dark:hover:bg-amber-900/40 transition-all duration-100" title="별로 안 좋아요 — Korean"> <span class="max-w-[180px] truncate">별로 안 좋아요</span> <span class="text-xs text-amber-700 dark:text-amber-300 font-bold uppercase">ko</span> </a> <a href="https://sublearn.com/learn/zh/phrases/zh-zh-phrase-01473" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-amber-50 text-amber-700 border-2 border-amber-200 border-b-4 hover:bg-amber-100 active:translate-y-[2px] active:border-b-2 dark:bg-amber-900/20 dark:text-amber-300 dark:border-amber-700 dark:hover:bg-amber-900/40 transition-all duration-100" title="继续 — Chinese"> <span class="max-w-[180px] truncate">继续</span> <span class="text-xs text-amber-700 dark:text-amber-300 font-bold uppercase">zh</span> </a> <a href="https://sublearn.com/learn/da/phrases/at-have-det-sjovt-sammen" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-amber-50 text-amber-700 border-2 border-amber-200 border-b-4 hover:bg-amber-100 active:translate-y-[2px] active:border-b-2 dark:bg-amber-900/20 dark:text-amber-300 dark:border-amber-700 dark:hover:bg-amber-900/40 transition-all duration-100" title="at have det sjovt sammen — Danish"> <span class="max-w-[180px] truncate">at have det sjovt sammen</span> <span class="text-xs text-amber-700 dark:text-amber-300 font-bold uppercase">da</span> </a> <a href="https://sublearn.com/learn/hi/phrases/hi-yaha-parashasanaya-ha" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-amber-50 text-amber-700 border-2 border-amber-200 border-b-4 hover:bg-amber-100 active:translate-y-[2px] active:border-b-2 dark:bg-amber-900/20 dark:text-amber-300 dark:border-amber-700 dark:hover:bg-amber-900/40 transition-all duration-100" title="यह प्रशंसनीय है। — Hindi"> <span class="max-w-[180px] truncate">यह प्रशंसनीय है।</span> <span class="text-xs text-amber-700 dark:text-amber-300 font-bold uppercase">hi</span> </a> <a href="https://sublearn.com/learn/pl/phrases/da%C4%87-s%C5%82owo" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-amber-50 text-amber-700 border-2 border-amber-200 border-b-4 hover:bg-amber-100 active:translate-y-[2px] active:border-b-2 dark:bg-amber-900/20 dark:text-amber-300 dark:border-amber-700 dark:hover:bg-amber-900/40 transition-all duration-100" title="dać słowo — Polish"> <span class="max-w-[180px] truncate">dać słowo</span> <span class="text-xs text-amber-700 dark:text-amber-300 font-bold uppercase">pl</span> </a> <a href="https://sublearn.com/learn/de/phrases/de-immer-mit-der-ruhe-1" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-amber-50 text-amber-700 border-2 border-amber-200 border-b-4 hover:bg-amber-100 active:translate-y-[2px] active:border-b-2 dark:bg-amber-900/20 dark:text-amber-300 dark:border-amber-700 dark:hover:bg-amber-900/40 transition-all duration-100" title="Immer mit der Ruhe. — German"> <span class="max-w-[180px] truncate">Immer mit der Ruhe.</span> <span class="text-xs text-amber-700 dark:text-amber-300 font-bold uppercase">de</span> </a> <a href="https://sublearn.com/learn/vi/phrases/t%C6%B0%E1%BB%9Bi-c%C3%A2y" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-amber-50 text-amber-700 border-2 border-amber-200 border-b-4 hover:bg-amber-100 active:translate-y-[2px] active:border-b-2 dark:bg-amber-900/20 dark:text-amber-300 dark:border-amber-700 dark:hover:bg-amber-900/40 transition-all duration-100" title="Tưới cây — Vietnamese"> <span class="max-w-[180px] truncate">Tưới cây</span> <span class="text-xs text-amber-700 dark:text-amber-300 font-bold uppercase">vi</span> </a> <a href="https://sublearn.com/learn/zh/phrases/zh-3581" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-amber-50 text-amber-700 border-2 border-amber-200 border-b-4 hover:bg-amber-100 active:translate-y-[2px] active:border-b-2 dark:bg-amber-900/20 dark:text-amber-300 dark:border-amber-700 dark:hover:bg-amber-900/40 transition-all duration-100" title="别提多...了 — Chinese"> <span class="max-w-[180px] truncate">别提多...了</span> <span class="text-xs text-amber-700 dark:text-amber-300 font-bold uppercase">zh</span> </a> </div> </div> <div> <h3 class="text-xs font-semibold uppercase tracking-wider text-surface-600 dark:text-surface-300 mb-3"> Grammar Rules </h3> <div class="flex flex-wrap gap-2"> <a href="https://sublearn.com/learn/hy/grammar/forming-positive-commands-do-it" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-sky-50 text-sky-700 border-2 border-sky-200 border-b-4 hover:bg-sky-100 active:translate-y-[2px] active:border-b-2 dark:bg-sky-900/20 dark:text-sky-300 dark:border-sky-700 dark:hover:bg-sky-900/40 transition-all duration-100" title="Forming Positive Commands: Do It! — Armenian"> <span class="max-w-[180px] truncate">Forming Positive Commands: Do It!</span> <span class="text-xs text-sky-700 dark:text-sky-300 font-bold uppercase">hy</span> </a> <a href="https://sublearn.com/learn/km/grammar/km-final-particles-for-nuance-na-phaw-pong-softeningemphasis" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-sky-50 text-sky-700 border-2 border-sky-200 border-b-4 hover:bg-sky-100 active:translate-y-[2px] active:border-b-2 dark:bg-sky-900/20 dark:text-sky-300 dark:border-sky-700 dark:hover:bg-sky-900/40 transition-all duration-100" title="Final Particles for Nuance 'Na, Phaw, Pong' (Softening/Emphasis) — Khmer"> <span class="max-w-[180px] truncate">Final Particles for Nuance 'Na, Phaw, Pong' (Softening/Emphasis)</span> <span class="text-xs text-sky-700 dark:text-sky-300 font-bold uppercase">km</span> </a> <a href="https://sublearn.com/learn/ko/grammar/ko-descriptive-verbs-vs-action-verbs" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-sky-50 text-sky-700 border-2 border-sky-200 border-b-4 hover:bg-sky-100 active:translate-y-[2px] active:border-b-2 dark:bg-sky-900/20 dark:text-sky-300 dark:border-sky-700 dark:hover:bg-sky-900/40 transition-all duration-100" title="Descriptive Verbs vs Action Verbs: The 'Be' Trap — Korean"> <span class="max-w-[180px] truncate">Descriptive Verbs vs Action Verbs: The 'Be' Trap</span> <span class="text-xs text-sky-700 dark:text-sky-300 font-bold uppercase">ko</span> </a> <a href="https://sublearn.com/learn/no/grammar/the-particle-jo-for-shared-knowledge" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-sky-50 text-sky-700 border-2 border-sky-200 border-b-4 hover:bg-sky-100 active:translate-y-[2px] active:border-b-2 dark:bg-sky-900/20 dark:text-sky-300 dark:border-sky-700 dark:hover:bg-sky-900/40 transition-all duration-100" title="The Particle 'Jo' for Shared Knowledge — Norwegian"> <span class="max-w-[180px] truncate">The Particle 'Jo' for Shared Knowledge</span> <span class="text-xs text-sky-700 dark:text-sky-300 font-bold uppercase">no</span> </a> <a href="https://sublearn.com/learn/pt/grammar/sem-que-o-uso-do" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-sky-50 text-sky-700 border-2 border-sky-200 border-b-4 hover:bg-sky-100 active:translate-y-[2px] active:border-b-2 dark:bg-sky-900/20 dark:text-sky-300 dark:border-sky-700 dark:hover:bg-sky-900/40 transition-all duration-100" title="Using 'Sem que': Without/Unless with Subjunctive — Portuguese"> <span class="max-w-[180px] truncate">Using 'Sem que': Without/Unless with Subjunctive</span> <span class="text-xs text-sky-700 dark:text-sky-300 font-bold uppercase">pt</span> </a> <a href="https://sublearn.com/learn/en/grammar/en-c1-by-gerund-clause-means-method" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-sky-50 text-sky-700 border-2 border-sky-200 border-b-4 hover:bg-sky-100 active:translate-y-[2px] active:border-b-2 dark:bg-sky-900/20 dark:text-sky-300 dark:border-sky-700 dark:hover:bg-sky-900/40 transition-all duration-100" title="By + Gerund: Describing How Something Is Done — English"> <span class="max-w-[180px] truncate">By + Gerund: Describing How Something Is Done</span> <span class="text-xs text-sky-700 dark:text-sky-300 font-bold uppercase">en</span> </a> <a href="https://sublearn.com/learn/kk/grammar/past-counterfactuals" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-sky-50 text-sky-700 border-2 border-sky-200 border-b-4 hover:bg-sky-100 active:translate-y-[2px] active:border-b-2 dark:bg-sky-900/20 dark:text-sky-300 dark:border-sky-700 dark:hover:bg-sky-900/40 transition-all duration-100" title="Past Counterfactuals — Kazakh"> <span class="max-w-[180px] truncate">Past Counterfactuals</span> <span class="text-xs text-sky-700 dark:text-sky-300 font-bold uppercase">kk</span> </a> <a href="https://sublearn.com/learn/km/grammar/km-formal-concessive-clauses-touhbi-kor-daoy" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-sky-50 text-sky-700 border-2 border-sky-200 border-b-4 hover:bg-sky-100 active:translate-y-[2px] active:border-b-2 dark:bg-sky-900/20 dark:text-sky-300 dark:border-sky-700 dark:hover:bg-sky-900/40 transition-all duration-100" title="Formal Concessive Clauses (touhbi... kor daoy) — Khmer"> <span class="max-w-[180px] truncate">Formal Concessive Clauses (touhbi... kor daoy)</span> <span class="text-xs text-sky-700 dark:text-sky-300 font-bold uppercase">km</span> </a> <a href="https://sublearn.com/learn/en/grammar/can-i-asking-for-permission" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-sky-50 text-sky-700 border-2 border-sky-200 border-b-4 hover:bg-sky-100 active:translate-y-[2px] active:border-b-2 dark:bg-sky-900/20 dark:text-sky-300 dark:border-sky-700 dark:hover:bg-sky-900/40 transition-all duration-100" title="Asking for Permission: Can I...? — English"> <span class="max-w-[180px] truncate">Asking for Permission: Can I...?</span> <span class="text-xs text-sky-700 dark:text-sky-300 font-bold uppercase">en</span> </a> <a href="https://sublearn.com/learn/az/grammar/possessive-suffixes-with-nouns" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-sky-50 text-sky-700 border-2 border-sky-200 border-b-4 hover:bg-sky-100 active:translate-y-[2px] active:border-b-2 dark:bg-sky-900/20 dark:text-sky-300 dark:border-sky-700 dark:hover:bg-sky-900/40 transition-all duration-100" title="Possessive Suffixes with Nouns — Azerbaijani"> <span class="max-w-[180px] truncate">Possessive Suffixes with Nouns</span> <span class="text-xs text-sky-700 dark:text-sky-300 font-bold uppercase">az</span> </a> <a href="https://sublearn.com/learn/id/grammar/causative-nuances" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-sky-50 text-sky-700 border-2 border-sky-200 border-b-4 hover:bg-sky-100 active:translate-y-[2px] active:border-b-2 dark:bg-sky-900/20 dark:text-sky-300 dark:border-sky-700 dark:hover:bg-sky-900/40 transition-all duration-100" title="Causative Nuances — Indonesian"> <span class="max-w-[180px] truncate">Causative Nuances</span> <span class="text-xs text-sky-700 dark:text-sky-300 font-bold uppercase">id</span> </a> <a href="https://sublearn.com/learn/zh/grammar/zh-dates-and-calendar" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-sky-50 text-sky-700 border-2 border-sky-200 border-b-4 hover:bg-sky-100 active:translate-y-[2px] active:border-b-2 dark:bg-sky-900/20 dark:text-sky-300 dark:border-sky-700 dark:hover:bg-sky-900/40 transition-all duration-100" title="Chinese Dates & Calendar: Year, Month, Day — Chinese"> <span class="max-w-[180px] truncate">Chinese Dates & Calendar: Year, Month, Day</span> <span class="text-xs text-sky-700 dark:text-sky-300 font-bold uppercase">zh</span> </a> <a href="https://sublearn.com/learn/km/grammar/standard-svo-order" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-sky-50 text-sky-700 border-2 border-sky-200 border-b-4 hover:bg-sky-100 active:translate-y-[2px] active:border-b-2 dark:bg-sky-900/20 dark:text-sky-300 dark:border-sky-700 dark:hover:bg-sky-900/40 transition-all duration-100" title="Standard SVO Order — Khmer"> <span class="max-w-[180px] truncate">Standard SVO Order</span> <span class="text-xs text-sky-700 dark:text-sky-300 font-bold uppercase">km</span> </a> <a href="https://sublearn.com/learn/ms/grammar/peribahasa-proverbs" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-sky-50 text-sky-700 border-2 border-sky-200 border-b-4 hover:bg-sky-100 active:translate-y-[2px] active:border-b-2 dark:bg-sky-900/20 dark:text-sky-300 dark:border-sky-700 dark:hover:bg-sky-900/40 transition-all duration-100" title="Peribahasa (Proverbs) — Malay"> <span class="max-w-[180px] truncate">Peribahasa (Proverbs)</span> <span class="text-xs text-sky-700 dark:text-sky-300 font-bold uppercase">ms</span> </a> <a href="https://sublearn.com/learn/es/grammar/ver-keeping-the-e" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-sky-50 text-sky-700 border-2 border-sky-200 border-b-4 hover:bg-sky-100 active:translate-y-[2px] active:border-b-2 dark:bg-sky-900/20 dark:text-sky-300 dark:border-sky-700 dark:hover:bg-sky-900/40 transition-all duration-100" title="Spanish Verb 'Ver': Keeping the 'E' (veo, ves, ve) — Spanish"> <span class="max-w-[180px] truncate">Spanish Verb 'Ver': Keeping the 'E' (veo, ves, ve)</span> <span class="text-xs text-sky-700 dark:text-sky-300 font-bold uppercase">es</span> </a> <a href="https://sublearn.com/learn/en/grammar/en-adjective-noun-collocations-strongheavy" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-sky-50 text-sky-700 border-2 border-sky-200 border-b-4 hover:bg-sky-100 active:translate-y-[2px] active:border-b-2 dark:bg-sky-900/20 dark:text-sky-300 dark:border-sky-700 dark:hover:bg-sky-900/40 transition-all duration-100" title="Strong vs. Heavy: Choosing the Right Word Partnerships — English"> <span class="max-w-[180px] truncate">Strong vs. Heavy: Choosing the Right Word Partnerships</span> <span class="text-xs text-sky-700 dark:text-sky-300 font-bold uppercase">en</span> </a> <a href="https://sublearn.com/learn/pt/grammar/pt-periphrastic-future-ir-infinitive" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-sky-50 text-sky-700 border-2 border-sky-200 border-b-4 hover:bg-sky-100 active:translate-y-[2px] active:border-b-2 dark:bg-sky-900/20 dark:text-sky-300 dark:border-sky-700 dark:hover:bg-sky-900/40 transition-all duration-100" title="Talking About the Future (Ir + Infinitive) — Portuguese"> <span class="max-w-[180px] truncate">Talking About the Future (Ir + Infinitive)</span> <span class="text-xs text-sky-700 dark:text-sky-300 font-bold uppercase">pt</span> </a> <a href="https://sublearn.com/learn/sl/grammar/formal-vs-informal-greetings" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-sky-50 text-sky-700 border-2 border-sky-200 border-b-4 hover:bg-sky-100 active:translate-y-[2px] active:border-b-2 dark:bg-sky-900/20 dark:text-sky-300 dark:border-sky-700 dark:hover:bg-sky-900/40 transition-all duration-100" title="Formal vs. Informal Greetings — Slovenian"> <span class="max-w-[180px] truncate">Formal vs. Informal Greetings</span> <span class="text-xs text-sky-700 dark:text-sky-300 font-bold uppercase">sl</span> </a> </div> </div> <div> <h3 class="text-xs font-semibold uppercase tracking-wider text-surface-600 dark:text-surface-300 mb-3"> Categories </h3> <div class="flex flex-wrap gap-2"> <a href="https://sublearn.com/videos/category/vocabulary" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-surface-100 text-surface-600 border-2 border-surface-200 border-b-4 hover:bg-surface-200 active:translate-y-[2px] active:border-b-2 dark:bg-surface-800 dark:text-surface-300 dark:border-surface-600 dark:hover:bg-surface-700 transition-all duration-100"> Vocabulary </a> <a href="https://sublearn.com/videos/category/history" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-surface-100 text-surface-600 border-2 border-surface-200 border-b-4 hover:bg-surface-200 active:translate-y-[2px] active:border-b-2 dark:bg-surface-800 dark:text-surface-300 dark:border-surface-600 dark:hover:bg-surface-700 transition-all duration-100"> History </a> <a href="https://sublearn.com/videos/category/news" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-surface-100 text-surface-600 border-2 border-surface-200 border-b-4 hover:bg-surface-200 active:translate-y-[2px] active:border-b-2 dark:bg-surface-800 dark:text-surface-300 dark:border-surface-600 dark:hover:bg-surface-700 transition-all duration-100"> News </a> <a href="https://sublearn.com/videos/category/daily-life" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-surface-100 text-surface-600 border-2 border-surface-200 border-b-4 hover:bg-surface-200 active:translate-y-[2px] active:border-b-2 dark:bg-surface-800 dark:text-surface-300 dark:border-surface-600 dark:hover:bg-surface-700 transition-all duration-100"> Daily Life </a> <a href="https://sublearn.com/videos/category/travel" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-surface-100 text-surface-600 border-2 border-surface-200 border-b-4 hover:bg-surface-200 active:translate-y-[2px] active:border-b-2 dark:bg-surface-800 dark:text-surface-300 dark:border-surface-600 dark:hover:bg-surface-700 transition-all duration-100"> Travel </a> <a href="https://sublearn.com/videos/category/writing" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-surface-100 text-surface-600 border-2 border-surface-200 border-b-4 hover:bg-surface-200 active:translate-y-[2px] active:border-b-2 dark:bg-surface-800 dark:text-surface-300 dark:border-surface-600 dark:hover:bg-surface-700 transition-all duration-100"> Writing </a> <a href="https://sublearn.com/videos/category/conversation" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-surface-100 text-surface-600 border-2 border-surface-200 border-b-4 hover:bg-surface-200 active:translate-y-[2px] active:border-b-2 dark:bg-surface-800 dark:text-surface-300 dark:border-surface-600 dark:hover:bg-surface-700 transition-all duration-100"> Conversation </a> <a href="https://sublearn.com/videos/category/culture" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-surface-100 text-surface-600 border-2 border-surface-200 border-b-4 hover:bg-surface-200 active:translate-y-[2px] active:border-b-2 dark:bg-surface-800 dark:text-surface-300 dark:border-surface-600 dark:hover:bg-surface-700 transition-all duration-100"> Culture </a> <a href="https://sublearn.com/videos/category/literature" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-surface-100 text-surface-600 border-2 border-surface-200 border-b-4 hover:bg-surface-200 active:translate-y-[2px] active:border-b-2 dark:bg-surface-800 dark:text-surface-300 dark:border-surface-600 dark:hover:bg-surface-700 transition-all duration-100"> Literature </a> <a href="https://sublearn.com/videos/category/science" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-surface-100 text-surface-600 border-2 border-surface-200 border-b-4 hover:bg-surface-200 active:translate-y-[2px] active:border-b-2 dark:bg-surface-800 dark:text-surface-300 dark:border-surface-600 dark:hover:bg-surface-700 transition-all duration-100"> Science </a> <a href="https://sublearn.com/videos/category/business" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-surface-100 text-surface-600 border-2 border-surface-200 border-b-4 hover:bg-surface-200 active:translate-y-[2px] active:border-b-2 dark:bg-surface-800 dark:text-surface-300 dark:border-surface-600 dark:hover:bg-surface-700 transition-all duration-100"> Business </a> <a href="https://sublearn.com/videos/category/reading" class="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-xs font-bold bg-surface-100 text-surface-600 border-2 border-surface-200 border-b-4 hover:bg-surface-200 active:translate-y-[2px] active:border-b-2 dark:bg-surface-800 dark:text-surface-300 dark:border-surface-600 dark:hover:bg-surface-700 transition-all duration-100"> Reading </a> </div> </div> </div> </div> </section> <footer class="bg-surface-900 text-surface-300 mt-auto"> <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-12 lg:py-16"> <div class="grid gap-8 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-6"> <div> <div class="flex items-center gap-2 mb-4"> <span class="text-2xl font-bold bg-gradient-to-r from-violet-600 to-violet-500 bg-clip-text text-transparent">SubLearn</span> </div> <p class="text-sm text-surface-400 leading-relaxed mb-6"> Learn languages through videos with interactive subtitles, exercises, and AI-powered content. </p> <a href="https://sublearn.com/register" class="btn-primary !text-sm"> Start Learning Free <svg aria-hidden="true" class="w-4 h-4 rtl:rotate-180" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 7l5 5m0 0l-5 5m5-5H6"/></svg> </a> </div> <div> <h2 class="text-sm font-semibold text-white uppercase tracking-wider mb-4">Learn</h2> <ul class="space-y-3"> <li> <a href="https://sublearn.com/learn/en" class="flex items-center gap-2 text-sm text-surface-400 hover:text-white transition-colors min-h-[44px]"> <img src="https://sublearn.com/images/flags/gb.svg" class="w-4 h-3 object-cover rounded-sm" alt="" loading="lazy"> English </a> </li> <li> <a href="https://sublearn.com/learn/es" class="flex items-center gap-2 text-sm text-surface-400 hover:text-white transition-colors min-h-[44px]"> <img src="https://sublearn.com/images/flags/es.svg" class="w-4 h-3 object-cover rounded-sm" alt="" loading="lazy"> Spanish </a> </li> <li> <a href="https://sublearn.com/learn/fr" class="flex items-center gap-2 text-sm text-surface-400 hover:text-white transition-colors min-h-[44px]"> <img src="https://sublearn.com/images/flags/fr.svg" class="w-4 h-3 object-cover rounded-sm" alt="" loading="lazy"> French </a> </li> <li> <a href="https://sublearn.com/learn/de" class="flex items-center gap-2 text-sm text-surface-400 hover:text-white transition-colors min-h-[44px]"> <img src="https://sublearn.com/images/flags/de.svg" class="w-4 h-3 object-cover rounded-sm" alt="" loading="lazy"> German </a> </li> <li> <a href="https://sublearn.com/learn/ja" class="flex items-center gap-2 text-sm text-surface-400 hover:text-white transition-colors min-h-[44px]"> <img src="https://sublearn.com/images/flags/jp.svg" class="w-4 h-3 object-cover rounded-sm" alt="" loading="lazy"> Japanese </a> </li> <li><a href="https://sublearn.com/learn" class="text-sm text-surface-400 hover:text-white transition-colors">All Languages</a></li> </ul> </div> <div> <h2 class="text-sm font-semibold text-white uppercase tracking-wider mb-4"> Categories </h2> <ul class="space-y-3"> <li> <a href="https://sublearn.com/videos/category/conversation" class="text-sm text-surface-400 hover:text-white transition-colors"> Conversation </a> </li> <li> <a href="https://sublearn.com/videos/category/business" class="text-sm text-surface-400 hover:text-white transition-colors"> Business </a> </li> <li> <a href="https://sublearn.com/videos/category/travel" class="text-sm text-surface-400 hover:text-white transition-colors"> Travel </a> </li> <li> <a href="https://sublearn.com/learn/en/grammar" class="text-sm text-surface-400 hover:text-white transition-colors"> Grammar </a> </li> <li> <a href="https://sublearn.com/learn/en/vocabulary" class="text-sm text-surface-400 hover:text-white transition-colors"> Vocabulary </a> </li> <li> <a href="https://sublearn.com/music" class="text-sm text-surface-400 hover:text-white transition-colors"> Music </a> </li> <li> <a href="https://sublearn.com/videos" class="text-sm text-surface-400 hover:text-white transition-colors font-medium"> All Categories → </a> </li> </ul> </div> <div> <h2 class="text-sm font-semibold text-white uppercase tracking-wider mb-4"> Features </h2> <ul class="space-y-3"> <li> <a href="https://sublearn.com/help/guides/ai-conversation" class="text-sm text-surface-400 hover:text-white transition-colors"> AI Conversation </a> </li> <li> <a href="https://sublearn.com/help/guides/using-subtitles" class="text-sm text-surface-400 hover:text-white transition-colors"> Interactive Subtitles </a> </li> <li> <a href="https://sublearn.com/help/guides/building-vocabulary" class="text-sm text-surface-400 hover:text-white transition-colors"> Vocabulary Tracking </a> </li> <li> <a href="https://sublearn.com/help/guides/spaced-repetition" class="text-sm text-surface-400 hover:text-white transition-colors"> Spaced Repetition </a> </li> <li> <a href="https://sublearn.com/help/guides/learning-paths" class="text-sm text-surface-400 hover:text-white transition-colors"> Learning Paths </a> </li> </ul> </div> <div> <h2 class="text-sm font-semibold text-white uppercase tracking-wider mb-4">Resources</h2> <ul class="space-y-3"> <li><a href="https://sublearn.com/videos" class="text-sm text-surface-400 hover:text-white transition-colors">Videos</a></li> <li><a href="https://sublearn.com/blog" class="text-sm text-surface-400 hover:text-white transition-colors">Blog</a></li> <li><a href="https://sublearn.com/help" class="text-sm text-surface-400 hover:text-white transition-colors">Help Center</a></li> <li><a href="https://sublearn.com/help/faq" class="text-sm text-surface-400 hover:text-white transition-colors">FAQs</a></li> <li><a href="https://sublearn.com/help/guides" class="text-sm text-surface-400 hover:text-white transition-colors">Learning Guides</a></li> <li><a href="https://sublearn.com/pricing" class="text-sm text-surface-400 hover:text-white transition-colors">Pricing</a></li> </ul> </div> <div> <h2 class="text-sm font-semibold text-white uppercase tracking-wider mb-4">Company</h2> <ul class="space-y-3"> <li><a href="https://sublearn.com/about" class="text-sm text-surface-400 hover:text-white transition-colors">About</a></li> <li><a href="https://sublearn.com/changelog" class="text-sm text-surface-400 hover:text-white transition-colors">What's New</a></li> <li><a href="https://sublearn.com/help/contact" class="text-sm text-surface-400 hover:text-white transition-colors">Contact</a></li> <li><a href="https://sublearn.com/privacy" class="text-sm text-surface-400 hover:text-white transition-colors">Privacy</a></li> <li><a href="https://sublearn.com/terms" class="text-sm text-surface-400 hover:text-white transition-colors">Terms</a></li> <li><a href="https://sublearn.com/cookies" class="text-sm text-surface-400 hover:text-white transition-colors">Cookies</a></li> <li><a href="https://sublearn.com/refund" class="text-sm text-surface-400 hover:text-white transition-colors">Refund Policy</a></li> </ul> </div> </div> <div class="border-t border-surface-700 mt-10 pt-6 flex flex-col sm:flex-row justify-between items-center gap-4 flex-wrap"> <div class="flex flex-col sm:flex-row items-center gap-2 sm:gap-4"> <p class="text-sm text-surface-500 dark:text-surface-400">© 2026 SubLearn. All rights reserved.</p> <a href="https://sublearn.com/sitemap.xml" class="text-sm text-surface-400 hover:text-white transition-colors"> Sitemap </a> </div> <div class="flex items-center gap-6"> <div x-data="{ open: false }" class="relative"> <button @click="open = !open" @click.outside="open = false" class="flex items-center gap-2 px-3 py-2.5 min-h-[44px] rounded-lg hover:bg-gray-100 dark:hover:bg-white/10 transition text-sm" aria-label="Switch language" aria-expanded="false" :aria-expanded="open.toString()"> <img src="https://sublearn.com/images/flags/gb.svg" class="w-5 h-3.5 object-cover rounded-sm shadow-sm" alt="English"> <span class="text-gray-700 dark:text-gray-200">English</span> <svg aria-hidden="true" class="w-4 h-4 text-gray-500 transition-transform" :class="open && 'rotate-180'" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"/></svg> </button> <div x-show="open" x-transition class="absolute mt-2 ltr:right-0 rtl:left-0 w-[280px] sm:w-[320px] lg:w-[420px] max-h-[70vh] overflow-y-auto rounded-xl bg-white dark:bg-[#111b2e] border border-gray-200 dark:border-[#1e3348] shadow-lg z-50 p-2" role="menu"> <div class="grid grid-cols-2 lg:grid-cols-3 gap-1"> <a href="https://sublearn.com/learn/hi/vocabulary/sharashhaka" class="flex items-center gap-2 px-3 py-2.5 rounded-xl hover:bg-gray-50 dark:hover:bg-white/5 transition bg-violet-50 dark:bg-violet-500/10" role="menuitem" hreflang="en"> <img src="https://sublearn.com/images/flags/gb.svg" class="w-5 h-3.5 object-cover rounded-sm shadow-sm" alt="English"> <span class="text-sm font-medium text-gray-700 dark:text-gray-300">English</span> <svg aria-hidden="true" class="w-4 h-4 ltr:ml-auto rtl:mr-auto text-violet-500 dark:text-violet-400" fill="currentColor" viewBox="0 0 20 20"><path fill-rule="evenodd" d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z" clip-rule="evenodd"/></svg> </a> <a href="https://sublearn.com/es/learn/hi/vocabulary/sharashhaka" class="flex items-center gap-2 px-3 py-2.5 rounded-xl hover:bg-gray-50 dark:hover:bg-white/5 transition " role="menuitem" hreflang="es"> <img src="https://sublearn.com/images/flags/es.svg" class="w-5 h-3.5 object-cover rounded-sm shadow-sm" alt="Spanish"> <span class="text-sm font-medium text-gray-700 dark:text-gray-300">Español</span> </a> <a href="https://sublearn.com/fr/learn/hi/vocabulary/sharashhaka" class="flex items-center gap-2 px-3 py-2.5 rounded-xl hover:bg-gray-50 dark:hover:bg-white/5 transition " role="menuitem" hreflang="fr"> <img src="https://sublearn.com/images/flags/fr.svg" class="w-5 h-3.5 object-cover rounded-sm shadow-sm" alt="French"> <span class="text-sm font-medium text-gray-700 dark:text-gray-300">Français</span> </a> <a href="https://sublearn.com/de/learn/hi/vocabulary/sharashhaka" class="flex items-center gap-2 px-3 py-2.5 rounded-xl hover:bg-gray-50 dark:hover:bg-white/5 transition " role="menuitem" hreflang="de"> <img src="https://sublearn.com/images/flags/de.svg" class="w-5 h-3.5 object-cover rounded-sm shadow-sm" alt="German"> <span class="text-sm font-medium text-gray-700 dark:text-gray-300">Deutsch</span> </a> <a href="https://sublearn.com/ja/learn/hi/vocabulary/sharashhaka" class="flex items-center gap-2 px-3 py-2.5 rounded-xl hover:bg-gray-50 dark:hover:bg-white/5 transition " role="menuitem" hreflang="ja"> <img src="https://sublearn.com/images/flags/jp.svg" class="w-5 h-3.5 object-cover rounded-sm shadow-sm" alt="Japanese"> <span class="text-sm font-medium text-gray-700 dark:text-gray-300">日本語</span> </a> <a href="https://sublearn.com/zh/learn/hi/vocabulary/sharashhaka" class="flex items-center gap-2 px-3 py-2.5 rounded-xl hover:bg-gray-50 dark:hover:bg-white/5 transition " role="menuitem" hreflang="zh"> <img src="https://sublearn.com/images/flags/cn.svg" class="w-5 h-3.5 object-cover rounded-sm shadow-sm" alt="Chinese"> <span class="text-sm font-medium text-gray-700 dark:text-gray-300">中文</span> </a> <a href="https://sublearn.com/ko/learn/hi/vocabulary/sharashhaka" class="flex items-center gap-2 px-3 py-2.5 rounded-xl hover:bg-gray-50 dark:hover:bg-white/5 transition " role="menuitem" hreflang="ko"> <img src="https://sublearn.com/images/flags/kr.svg" class="w-5 h-3.5 object-cover rounded-sm shadow-sm" alt="Korean"> <span class="text-sm font-medium text-gray-700 dark:text-gray-300">한국어</span> </a> <a href="https://sublearn.com/pt/learn/hi/vocabulary/sharashhaka" class="flex items-center gap-2 px-3 py-2.5 rounded-xl hover:bg-gray-50 dark:hover:bg-white/5 transition " role="menuitem" hreflang="pt"> <img src="https://sublearn.com/images/flags/br.svg" class="w-5 h-3.5 object-cover rounded-sm shadow-sm" alt="Portuguese"> <span class="text-sm font-medium text-gray-700 dark:text-gray-300">Português</span> </a> <a href="https://sublearn.com/ar/learn/hi/vocabulary/sharashhaka" dir="rtl" class="flex items-center gap-2 px-3 py-2.5 rounded-xl hover:bg-gray-50 dark:hover:bg-white/5 transition " role="menuitem" hreflang="ar"> <img src="https://sublearn.com/images/flags/sa.svg" class="w-5 h-3.5 object-cover rounded-sm shadow-sm" alt="Arabic"> <span class="text-sm font-medium text-gray-700 dark:text-gray-300">العربية</span> </a> <a href="https://sublearn.com/hi/learn/hi/vocabulary/sharashhaka" class="flex items-center gap-2 px-3 py-2.5 rounded-xl hover:bg-gray-50 dark:hover:bg-white/5 transition " role="menuitem" hreflang="hi"> <img src="https://sublearn.com/images/flags/in.svg" class="w-5 h-3.5 object-cover rounded-sm shadow-sm" alt="Hindi"> <span class="text-sm font-medium text-gray-700 dark:text-gray-300">हिन्दी</span> </a> <a href="https://sublearn.com/fa/learn/hi/vocabulary/sharashhaka" dir="rtl" class="flex items-center gap-2 px-3 py-2.5 rounded-xl hover:bg-gray-50 dark:hover:bg-white/5 transition " role="menuitem" hreflang="fa"> <img src="https://sublearn.com/images/flags/ir.svg" class="w-5 h-3.5 object-cover rounded-sm shadow-sm" alt="Persian"> <span class="text-sm font-medium text-gray-700 dark:text-gray-300">فارسی</span> </a> </div> </div> </div> <div class="flex items-center gap-4"> <a href="https://twitter.com/sublearn" class="inline-flex items-center justify-center min-w-[44px] min-h-[44px] text-surface-400 hover:text-white transition-colors" aria-label="Twitter"> <svg aria-hidden="true" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" fill="currentColor"> <path d="M18.244 2.25h3.308l-7.227 7.719 8.502 11.25h-6.657l-5.214-6.817L4.99 21.25H1.68l7.73-8.235L1.25 2.25h6.826l4.712 6.231 5.456-6.231zm-1.161 17.52h1.833L7.084 4.126H5.117L17.083 19.77z"/> </svg> </a> <a href="https://facebook.com/sublearn" class="inline-flex items-center justify-center min-w-[44px] min-h-[44px] text-surface-400 hover:text-white transition-colors" aria-label="Facebook"> <svg aria-hidden="true" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" fill="currentColor"> <path d="M22 12c0-5.523-4.477-10-10-10S2 6.477 2 12c0 4.991 3.657 9.128 8.438 9.878v-6.987h-2.54V12h2.54V9.797c0-2.506 1.492-3.89 3.777-3.89 1.094 0 2.238.195 2.238.195v2.46h-1.26c-1.243 0-1.63.771-1.63 1.562V12h2.773l-.443 2.89h-2.33v6.988C18.343 21.128 22 16.991 22 12z"/> </svg> </a> </div> </div> </div> </div> </footer> </div> <div data-nosnippet x-data="{ show: false, init() { this.installGlobalHelpers(); this.migrateLegacyConsent(); const cookieValue = this.getCookie(); if (!cookieValue) { setTimeout(() => this.show = true, 1000); } window.addEventListener('sublearn-open-cookie-preferences', () => { this.show = true; }); document.querySelectorAll('[data-open-cookie-preferences]').forEach((trigger) => { trigger.addEventListener('click', () => { this.show = true; }); }); }, getCookie() { const match = document.cookie.match(/(?:^|; )cookieConsent=([^;]+)/); return match ? decodeURIComponent(match[1]) : ''; }, setCookie(value) { const secure = window.location.protocol === 'https:' ? '; Secure' : ''; document.cookie = `cookieConsent=${encodeURIComponent(value)}; Path=/; Max-Age=31536000; SameSite=Lax${secure}`; }, migrateLegacyConsent() { if (this.getCookie()) { try { localStorage.removeItem('cookieConsent'); } catch {} return; } try { const cookieKey = 'cookieConsent'; const legacyValue = window.localStorage.getItem(cookieKey); if (legacyValue === 'accepted' || legacyValue === 'declined') { this.setCookie(legacyValue); localStorage.removeItem('cookieConsent'); } } catch {} }, installGlobalHelpers() { window.sublearnGetCookieConsent = () => this.getCookie(); window.sublearnSetCookieConsent = (value) => { if (value !== 'accepted' && value !== 'declined') { return; } this.setCookie(value); try { localStorage.removeItem('cookieConsent'); } catch {} this.show = false; this.dispatchConsent(value); }; }, dispatchConsent(value) { window.dispatchEvent(new CustomEvent('sublearn-cookie-consent', { detail: { value }, })); }, accept() { window.sublearnSetCookieConsent('accepted'); }, decline() { window.sublearnSetCookieConsent('declined'); } }" x-show="show" x-cloak x-transition:enter="transition ease-out duration-300" x-transition:enter-start="opacity-0 translate-y-4" x-transition:enter-end="opacity-100 translate-y-0" class="fixed bottom-0 left-0 right-0 z-[100] p-2 sm:p-4 md:p-6"> <div class="max-w-7xl mx-auto"> <div class="bg-white dark:bg-[#111b2e] rounded-xl sm:rounded-2xl shadow-2xl border border-surface-200 dark:border-[#1e3348] px-3 py-2.5 sm:p-6 flex items-center justify-between gap-3 sm:gap-6"> <p class="flex-1 text-xs sm:text-sm text-surface-700 dark:text-surface-300 line-clamp-2 sm:line-clamp-none"> We use essential cookies for sign-in, security, and preferences. Optional analytics starts only if you accept. <a href="https://sublearn.com/cookies" class="text-violet-600 dark:text-violet-400 hover:underline font-medium hidden sm:inline">Cookie Policy</a> </p> <div class="flex gap-2 sm:gap-3 flex-shrink-0"> <button type="button" data-open-cookie-preferences @click="show = true" class="btn-ghost !text-xs sm:!text-sm !py-1.5 sm:!py-2.5 !px-2 sm:!px-4"> Cookie settings </button> <button @click="accept" class="btn-primary !text-xs sm:!text-sm !py-1.5 sm:!py-2.5 !px-3 sm:!px-4"> Accept </button> <button @click="decline" class="btn-ghost !text-xs sm:!text-sm !py-1.5 sm:!py-2.5 !px-2 sm:!px-4"> Decline </button> </div> </div> </div> </div> <div x-data="{ show: false, deferredPrompt: null, init() { let visits = parseInt(localStorage.getItem('visitCount') || '0') + 1; localStorage.setItem('visitCount', visits); const dismissed = localStorage.getItem('installDismissed'); if (visits >= 3 && !dismissed && !window.matchMedia('(display-mode: standalone)').matches) { window.addEventListener('beforeinstallprompt', (e) => { e.preventDefault(); this.deferredPrompt = e; this.show = true; }); } }, async install() { if (!this.deferredPrompt) return; this.deferredPrompt.prompt(); const result = await this.deferredPrompt.userChoice; this.deferredPrompt = null; this.show = false; if (result.outcome === 'accepted') { localStorage.setItem('installDismissed', 'true'); } }, dismiss() { this.show = false; localStorage.setItem('installDismissed', 'true'); } }" x-show="show" x-cloak x-transition:enter="transition ease-out duration-300" x-transition:enter-start="opacity-0 translate-y-4" x-transition:enter-end="opacity-100 translate-y-0" class="hidden md:block md:fixed md:bottom-4 md:ltr:right-4 md:rtl:left-4 md:w-96 z-40 bg-white dark:bg-dark-elevated rounded-2xl shadow-xl border border-surface-200 dark:border-surface-700 p-4"> <div class="flex items-start gap-3"> <img src="/android-chrome-48x48.png" alt="SubLearn" class="w-12 h-12 rounded-xl flex-shrink-0" loading="lazy" decoding="async"> <div class="flex-1 min-w-0"> <h3 class="font-semibold text-surface-900 dark:text-surface-100 text-sm">Install SubLearn</h3> <p class="text-xs text-surface-500 dark:text-surface-400 mt-0.5">Add to your home screen for a faster, app-like experience</p> </div> <button @click="dismiss()" class="text-surface-400 hover:text-surface-600 dark:hover:text-surface-300 p-1 ltr:-mr-1 rtl:-ml-1 -mt-1" aria-label="Dismiss"> <svg aria-hidden="true" class="w-4 h-4" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" d="M6 18 18 6M6 6l12 12"/></svg> </button> </div> <div class="flex gap-2 mt-3"> <button @click="dismiss()" class="btn-ghost flex-1 !text-sm !py-2 !min-h-0">Not now</button> <button @click="install()" class="btn-primary flex-1 !text-sm !py-2 !min-h-0">Install</button> </div> </div> <div x-data="{ open: false, mode: 'login', socialError: '', notifyGoogleButton() { const context = 'public'; this.$nextTick(() => { window.dispatchEvent(new CustomEvent('sublearn-auth-modal-opened', { detail: { context }, })); }); }, init() { const context = 'public'; window.addEventListener('auth-social-start', (event) => { if (event.detail?.context !== context) { return; } this.socialError = ''; }); window.addEventListener('auth-social-error', (event) => { if (event.detail?.context !== context) { return; } this.socialError = event.detail?.message || ''; this.open = true; this.notifyGoogleButton(); }); window.addEventListener('auth-social-success', (event) => { if (event.detail?.context !== context) { return; } this.socialError = ''; }); } }" @open-auth-modal.window="mode = $event.detail && $event.detail.mode ? $event.detail.mode : 'login'; socialError = ''; open = true; notifyGoogleButton()" @close-auth-modal.window="open = false; socialError = ''" @keydown.escape.window="open = false; socialError = ''" > <div x-show="open" x-cloak x-transition.opacity class="fixed inset-0 z-[90]" aria-hidden="false" > <button type="button" class="absolute inset-0 bg-surface-950/70 backdrop-blur-sm" @click="open = false" aria-label="Close" ></button> <div class="relative z-[91] flex min-h-full items-center justify-center px-4 py-6"> <div class="w-full max-w-md overflow-hidden rounded-[2rem] border border-surface-200 bg-white shadow-2xl dark:border-dark-border dark:bg-dark-surface-2" role="dialog" aria-modal="true" aria-labelledby="public-auth-modal-title" @click.outside="open = false" > <div class="flex items-start justify-between gap-4 border-b border-surface-200 px-6 py-5 dark:border-dark-border"> <div> <h2 id="public-auth-modal-title" class="mt-1 text-2xl font-extrabold text-surface-900 dark:text-white"> <span x-show="mode === 'login'">Sign In</span> <span x-show="mode === 'register'">Create Account</span> </h2> <p class="mt-2 text-sm leading-relaxed text-surface-500 dark:text-surface-400"> Fastest option </p> </div> <button type="button" class="inline-flex h-11 w-11 items-center justify-center rounded-2xl border border-surface-200 text-surface-500 transition-colors hover:border-surface-300 hover:text-surface-700 dark:border-dark-border dark:text-surface-400 dark:hover:border-dark-border-hover dark:hover:text-surface-200" @click="open = false" aria-label="Close" > <svg class="h-5 w-5" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" /> </svg> </button> </div> <div class="space-y-4 px-6 py-6"> <div class="space-y-3" data-auth-popup-root data-auth-context="public" data-auth-surface="public_modal" data-google-gis-modal-root> <div data-google-shell-gis-button class="hidden min-h-[56px] w-full items-center justify-center overflow-hidden rounded-2xl border-2 border-surface-200 bg-white dark:border-dark-border dark:bg-dark-surface-3" ></div> <a href="https://sublearn.com/auth/google?context=public" data-google-shell-fallback data-social-popup="true" data-provider="google" rel="nofollow" data-track="auth-google-public-modal" class="group relative flex min-h-[56px] w-full items-center justify-center overflow-hidden rounded-2xl border-2 border-surface-200 bg-white px-4 py-3 text-sm font-semibold text-surface-800 transition-all duration-200 hover:-translate-y-0.5 hover:border-surface-300 hover:shadow-lg dark:border-dark-border dark:bg-dark-surface-3 dark:text-surface-100 dark:hover:border-dark-border-hover" aria-label="Sign in with Google" > <span class="absolute inset-x-0 top-0 h-px bg-gradient-to-r from-transparent via-brand-300/80 to-transparent"></span> <span data-social-idle class="flex items-center gap-3"> <img src="https://sublearn.com/logo-google-oauth.webp" alt="" class="h-5 w-5 flex-shrink-0" width="20" height="20" loading="eager" decoding="async" > <span>Continue with Google</span> </span> <span data-social-loading class="hidden items-center gap-2 text-sm font-semibold"> <svg class="h-[18px] w-[18px] animate-spin" viewBox="0 0 24 24" fill="none" aria-hidden="true"> <circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle> <path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 0 1 8-8V0C5.373 0 0 5.373 0 12h4Zm2 5.291A7.958 7.958 0 0 1 4 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647Z"></path> </svg> <span>Opening secure popup...</span> </span> </a> <div class="grid grid-cols-2 gap-2.5"> <a href="https://sublearn.com/auth/github?context=public" data-social-popup="true" data-provider="github" rel="nofollow" data-track="auth-github-public-modal" class="inline-flex min-h-[48px] items-center justify-center gap-2 rounded-2xl border border-surface-200 bg-white px-3 py-2.5 text-xs font-semibold text-surface-700 transition-all duration-200 hover:border-surface-300 hover:bg-surface-50 dark:border-dark-border dark:bg-dark-surface-3 dark:text-surface-300 dark:hover:bg-dark-surface-4" aria-label="Sign in with GitHub" > <svg class="h-[18px] w-[18px]" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true"> <path fill-rule="evenodd" d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0 1 12 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0 0 22 12.017C22 6.484 17.522 2 12 2Z" clip-rule="evenodd" /> </svg> <span>GitHub</span> </a> <a href="https://sublearn.com/auth/discord?context=public" data-social-popup="true" data-provider="discord" rel="nofollow" data-track="auth-discord-public-modal" class="inline-flex min-h-[48px] items-center justify-center gap-2 rounded-2xl border border-surface-200 bg-white px-3 py-2.5 text-xs font-semibold text-surface-700 transition-all duration-200 hover:border-surface-300 hover:bg-surface-50 dark:border-dark-border dark:bg-dark-surface-3 dark:text-surface-300 dark:hover:bg-dark-surface-4" aria-label="Sign in with Discord" > <svg class="h-[18px] w-[18px] text-[#5865F2]" fill="currentColor" viewBox="0 0 16 16" aria-hidden="true"> <path d="M13.554 3.016A13.2 13.2 0 0 0 10.253 2a9 9 0 0 0-.423.86 12.3 12.3 0 0 0-3.664 0A9 9 0 0 0 5.744 2A13.4 13.4 0 0 0 2.44 3.018C.351 6.108-.215 9.123.068 12.094a13.3 13.3 0 0 0 4.048 2.033a10 10 0 0 0 .867-1.399 8.6 8.6 0 0 1-1.365-.652q.173-.126.335-.251a9.51 9.51 0 0 0 8.094 0q.165.136.335.251a8.7 8.7 0 0 1-1.368.654a9.7 9.7 0 0 0 .867 1.396a13.3 13.3 0 0 0 4.051-2.03c.332-3.446-.568-6.433-2.379-9.08m-8.212 7.25c-.789 0-1.44-.715-1.44-1.596S4.53 7.067 5.34 7.067s1.456.722 1.442 1.603c-.014.88-.636 1.597-1.44 1.597m5.316 0c-.79 0-1.44-.715-1.44-1.596s.63-1.603 1.44-1.603s1.452.722 1.438 1.603c-.014.88-.634 1.597-1.438 1.597" /> </svg> <span>Discord</span> </a> </div> </div> <div x-show="socialError" x-cloak class="rounded-2xl border border-red-200 bg-red-50 px-4 py-3 text-xs leading-relaxed text-red-700 dark:border-red-800/40 dark:bg-red-900/20 dark:text-red-300" role="alert" aria-live="assertive" x-text="socialError"></div> <div class="rounded-2xl bg-surface-50 px-4 py-3 text-xs leading-relaxed text-surface-500 dark:bg-dark-surface-3 dark:text-surface-400"> <span x-show="mode === 'login'">You can continue where you left off after signing in.</span> <span x-show="mode === 'register'">Your progress syncs automatically across all your devices.</span> </div> <div class="grid grid-cols-2 gap-3"> <a href="https://sublearn.com/login" data-auth-modal-ignore="true" class="inline-flex min-h-[48px] items-center justify-center rounded-2xl border border-surface-200 px-3 py-2.5 text-sm font-semibold text-surface-700 transition-colors hover:border-surface-300 hover:bg-surface-50 dark:border-dark-border dark:text-surface-300 dark:hover:bg-dark-surface-3" > Sign In </a> <a href="https://sublearn.com/register" data-auth-modal-ignore="true" class="inline-flex min-h-[48px] items-center justify-center rounded-2xl bg-brand-600 px-3 py-2.5 text-sm font-semibold text-white transition-colors hover:bg-brand-700" > Create Account </a> </div> </div> </div> </div> </div> </div> <button x-data="{ show: false }" x-on:scroll.window="show = window.scrollY > 500" x-show="show" x-transition:enter="transition ease-out duration-200" x-transition:enter-start="opacity-0 translate-y-2" x-transition:enter-end="opacity-100 translate-y-0" x-transition:leave="transition ease-in duration-150" x-transition:leave-start="opacity-100" x-transition:leave-end="opacity-0 translate-y-2" x-cloak @click="window.scrollTo({ top: 0, behavior: 'smooth' })" class="hidden md:flex fixed bottom-6 ltr:right-6 rtl:left-6 z-sticky items-center gap-1.5 px-3 py-2 bg-surface-800 dark:bg-surface-200 text-white dark:text-surface-900 rounded-full shadow-elevation-3 hover:bg-surface-700 dark:hover:bg-surface-100 transition-colors text-xs font-medium touch-target" aria-label="Scroll to top"> <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 15l7-7 7 7"/></svg> <span class="hidden sm:inline">Top</span> </button> <script> window.__t = Object.assign({}, window.__t || {}, JSON.parse('{\u0022got_it\u0022:\u0022Got it\u0022,\u0022link_copied\u0022:\u0022Link copied to clipboard\u0022,\u0022keep_up_great_work\u0022:\u0022Keep up the great work!\u0022,\u0022legendary_dedication\u0022:\u0022Legendary dedication!\u0022,\u0022unstoppable\u0022:\u0022Unstoppable!\u0022,\u0022incredible_consistency\u0022:\u0022Incredible consistency!\u0022,\u0022great_streak\u0022:\u0022Great streak!\u0022,\u0022keep_it_up\u0022:\u0022Keep it up!\u0022,\u0022speech_not_supported\u0022:\u0022Speech recognition is not supported in this browser.\u0022,\u0022speech_no_speech\u0022:\u0022No speech was detected. Please try again.\u0022,\u0022speech_audio_capture\u0022:\u0022No microphone was found. Make sure a microphone is connected.\u0022,\u0022speech_not_allowed\u0022:\u0022Microphone access was denied. Please allow access in your browser settings.\u0022,\u0022speech_network\u0022:\u0022A network error occurred. Please check your connection.\u0022,\u0022speech_aborted\u0022:\u0022Recording was stopped.\u0022,\u0022speech_lang_unsupported\u0022:\u0022The selected language is not supported for speech recognition.\u0022,\u0022speech_service_unavailable\u0022:\u0022Speech recognition is not available right now.\u0022,\u0022speech_error_generic\u0022:\u0022An error occurred\u0022,\u0022video_player_requires_video\u0022:\u0022[video-player] initMobileVideoPlayer requires a \\u003Cvideo\\u003E element.\u0022,\u0022video_player_pip_not_supported\u0022:\u0022[video-player] Picture-in-Picture is not supported in this browser.\u0022,\u0022video_player_pip_disabled\u0022:\u0022[video-player] Picture-in-Picture is disabled for this video.\u0022,\u0022video_player_pip_enter_failed\u0022:\u0022[video-player] Failed to enter PiP:\u0022,\u0022video_player_pip_exit_failed\u0022:\u0022[video-player] Failed to exit PiP:\u0022,\u0022ab_loop_requires_video\u0022:\u0022[ab-loop] initABLoop requires a \\u003Cvideo\\u003E element.\u0022,\u0022tts_request_failed\u0022:\u0022TTS request failed\u0022,\u0022fetch_failed\u0022:\u0022Fetch failed\u0022,\u0022notification_preferences_save_failed\u0022:\u0022Failed to save notification preferences:\u0022,\u0022quiet_hours_save_failed\u0022:\u0022Failed to save quiet hours:\u0022,\u0022push_subscription_failed\u0022:\u0022Push subscription failed:\u0022,\u0022search_error\u0022:\u0022Search error:\u0022,\u0022chat_tts_api_error\u0022:\u0022TTS API error\u0022,\u0022chat_tts_no_audio\u0022:\u0022No audio returned\u0022,\u0022auth_social_popup_interrupted\u0022:\u0022Sign-in interrupted\u0022,\u0022auth_social_popup_failed\u0022:\u0022Unable to complete sign-in right now. Please try again.\u0022,\u0022wizard_welcome\u0022:\u0022Welcome\u0022,\u0022wizard_lets_get_started\u0022:\u0022Let\\u0027s get started\u0022,\u0022wizard_your_language\u0022:\u0022Your Language\u0022,\u0022wizard_select_preferred_language\u0022:\u0022Select your preferred language\u0022,\u0022wizard_what_to_learn\u0022:\u0022What to Learn\u0022,\u0022wizard_choose_language_to_learn\u0022:\u0022Choose a language to learn\u0022,\u0022wizard_your_level\u0022:\u0022Your Level\u0022,\u0022wizard_how_experienced\u0022:\u0022How\\u0027s your journey so far?\u0022,\u0022wizard_your_goals\u0022:\u0022Your Goals\u0022,\u0022wizard_what_to_achieve\u0022:\u0022What do you want to achieve?\u0022,\u0022wizard_all_set\u0022:\u0022You\\u0027re All Set!\u0022,\u0022wizard_ready_to_start\u0022:\u0022Ready to start learning\u0022,\u0022level_up\u0022:\u0022Level Up!\u0022,\u0022level_label\u0022:\u0022Level :level\u0022,\u0022xp_gain\u0022:\u0022+:amount XP\u0022,\u0022wizard_failed_to_load_data\u0022:\u0022Couldn\\u0027t load your setup data\u0022,\u0022wizard_failed_to_save\u0022:\u0022Couldn\\u0027t save your changes\u0022,\u0022wizard_failed_to_save_data\u0022:\u0022Couldn\\u0027t save your setup data\u0022}')); </script> <link rel="modulepreload" href="https://sublearn.com/build/assets/app-BluOe0ZF.js" /><link rel="modulepreload" href="https://sublearn.com/build/assets/i18n-vcFhbzxv.js" /><script type="module" src="https://sublearn.com/build/assets/app-BluOe0ZF.js" data-navigate-track="reload"></script> <script src="https://sublearn.com/vendor/livewire/livewire.min.js?id=61e33937" data-csrf="QCWvT9LR6nBZzwXQmbWIJm62ASMqTqMkszh9mkkT" data-update-uri="/livewire/update" data-navigate-once="true"></script> <script> document.addEventListener('alpine:init', () => { Alpine.store('darkMode', { on: localStorage.getItem('darkMode') === 'true' || (localStorage.getItem('darkMode') === null && window.matchMedia('(prefers-color-scheme: dark)').matches), toggle() { this.on = !this.on; localStorage.setItem('darkMode', this.on); document.getElementById('theme-color-meta')?.setAttribute('content', this.on ? '#0b1222' : '#7c3aed'); }, init() { window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', (e) => { if (localStorage.getItem('darkMode') === null) { this.on = e.matches; } }); } }); }); </script> <div x-data="chatWidget()" x-cloak x-show="!optedOut" data-nosnippet class="hidden md:block md:fixed z-50" role="complementary" aria-label="AI Assistant" :class="isOpen ? 'md:inset-0 lg:inset-auto lg:bottom-6 lg:ltr:right-6 lg:rtl:left-6' : 'md:bottom-6 md:ltr:right-6 md:rtl:left-6'"> <div x-show="showHistory && isOpen" x-transition:enter="transition ease-out duration-200" x-transition:enter-start="opacity-0 ltr:-translate-x-4 rtl:translate-x-4" x-transition:enter-end="opacity-100 translate-x-0" x-transition:leave="transition ease-in duration-150" x-transition:leave-start="opacity-100" x-transition:leave-end="opacity-0 ltr:-translate-x-4 rtl:translate-x-4" class="absolute inset-0 sm:inset-auto sm:bottom-0 sm:ltr:right-full sm:rtl:left-full sm:ltr:mr-2 sm:rtl:ml-2 w-full sm:w-[280px] bg-white dark:bg-dark-card border border-surface-200 dark:border-dark-border shadow-xl sm:rounded-2xl overflow-hidden flex flex-col" style="height: 100%; max-height: 560px;"> <div class="flex items-center justify-between px-4 py-3 border-b border-surface-200 dark:border-dark-border flex-shrink-0"> <h3 class="text-sm font-semibold text-surface-900 dark:text-surface-100">Chat History</h3> <button @click="showHistory = false" class="p-1 rounded-lg hover:bg-surface-100 dark:hover:bg-surface-800 transition-colors" aria-label="Close"> <svg aria-hidden="true" class="w-4 h-4 text-surface-500" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"/></svg> </button> </div> <div class="flex-1 overflow-y-auto p-2 space-y-1"> <template x-if="historyItems.length === 0"> <p class="text-xs text-surface-400 dark:text-surface-500 text-center py-4">No past conversations yet.</p> </template> <template x-for="(item, idx) in historyItems" :key="item.token"> <div class="flex items-center justify-between px-3 py-2 rounded-lg hover:bg-surface-50 dark:hover:bg-surface-800/50 cursor-pointer group" @click="loadSession(item.token)"> <div class="min-w-0 flex-1"> <p class="text-xs font-medium text-surface-900 dark:text-surface-100 truncate" x-text="item.title"></p> <p class="text-[10px] text-surface-400 dark:text-surface-500" x-text="item.date"></p> </div> <button @click.stop="deleteSession(item.token, idx)" class="p-1 rounded opacity-0 group-hover:opacity-100 hover:bg-red-100 dark:hover:bg-red-900/30 transition-all" :title="'Delete'" :aria-label="'Delete'"> <svg aria-hidden="true" class="w-3.5 h-3.5 text-red-400" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16"/></svg> </button> </div> </template> </div> </div> <div x-show="showTeaser && isOpen" x-transition:enter="transition ease-out duration-200" x-transition:enter-start="opacity-0 scale-95 translate-y-4" x-transition:enter-end="opacity-100 scale-100 translate-y-0" x-transition:leave="transition ease-in duration-150" x-transition:leave-start="opacity-100 scale-100" x-transition:leave-end="opacity-0 scale-95 translate-y-4" class="flex flex-col bg-white dark:bg-dark-card border border-surface-200 dark:border-dark-border shadow-xl w-full h-full sm:w-[400px] sm:h-auto sm:max-h-[80vh] sm:rounded-2xl overflow-hidden"> <div class="flex items-center justify-between px-4 py-3 bg-gradient-to-r from-violet-600 to-violet-500 text-white flex-shrink-0"> <div class="flex items-center gap-3"> <div class="w-8 h-8 rounded-full bg-white/20 flex items-center justify-center"> <svg aria-hidden="true" class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.75 3.104v5.714a2.25 2.25 0 01-.659 1.591L5 14.5M9.75 3.104c-.251.023-.501.05-.75.082m.75-.082a24.301 24.301 0 014.5 0m0 0v5.714c0 .597.237 1.17.659 1.591L19.8 15.3M14.25 3.104c.251.023.501.05.75.082M19.8 15.3l-1.57.393A9.065 9.065 0 0112 15a9.065 9.065 0 00-6.23.693L5 14.5m14.8.8l1.402 1.402c1.232 1.232.65 3.318-1.067 3.611A48.309 48.309 0 0112 21c-2.773 0-5.491-.235-8.135-.687-1.718-.293-2.3-2.379-1.067-3.61L5 14.5"/></svg> </div> <h3 class="text-sm font-semibold" x-text="teaserContent.headline"></h3> </div> <button @click="closeChat()" class="p-1.5 rounded-lg hover:bg-white/20 transition-colors" aria-label="Close"> <svg aria-hidden="true" class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"/></svg> </button> </div> <div class="flex-1 overflow-y-auto p-4 space-y-4"> <div class="relative overflow-hidden rounded-xl"> <div class="blur-[2px] opacity-60 space-y-2 p-3"> <div class="flex ltr:justify-end rtl:justify-start"> <div class="bg-accent-600 text-white rounded-2xl ltr:rounded-tr-md rtl:rounded-tl-md px-3 py-2 max-w-[80%] text-xs"> How do I improve my grammar? </div> </div> <div class="flex ltr:justify-start rtl:justify-end"> <div class="bg-surface-100 dark:bg-surface-800 text-surface-900 dark:text-surface-100 rounded-2xl ltr:rounded-tl-md rtl:rounded-tr-md px-3 py-2 max-w-[80%] text-xs"> Great question! I can correct your sentences in real-time and quiz you on tricky rules... </div> </div> <div class="flex ltr:justify-end rtl:justify-start"> <div class="bg-accent-600 text-white rounded-2xl ltr:rounded-tr-md rtl:rounded-tl-md px-3 py-2 max-w-[80%] text-xs"> That sounds amazing! </div> </div> </div> <div class="absolute inset-0 bg-gradient-to-t from-white/90 dark:from-dark-card/90 via-white/40 dark:via-dark-card/40 to-transparent"></div> </div> <div class="grid grid-cols-2 gap-2"> <template x-for="(f, fi) in teaserContent.features" :key="'tf-'+fi"> <div class="flex items-center gap-2 text-xs text-surface-700 dark:text-surface-300 bg-surface-50 dark:bg-surface-800/50 rounded-lg px-2.5 py-2"> <span x-text="f.icon" class="text-sm"></span> <span x-text="f.text" class="font-medium"></span> </div> </template> </div> <div class="space-y-2 pt-1"> <a href="https://sublearn.com/login" class="btn-primary w-full !text-sm"> <svg aria-hidden="true" class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15.75 9V5.25A2.25 2.25 0 0013.5 3h-6a2.25 2.25 0 00-2.25 2.25v13.5A2.25 2.25 0 007.5 21h6a2.25 2.25 0 002.25-2.25V15m3 0l3-3m0 0l-3-3m3 3H9"/></svg> Sign in to start chatting </a> <a href="https://sublearn.com/register" class="flex items-center justify-center gap-2 w-full py-2.5 px-4 text-sm font-semibold text-violet-700 dark:text-violet-300 bg-violet-50 dark:bg-violet-900/20 border border-violet-200 dark:border-violet-800 rounded-xl hover:bg-violet-100 dark:hover:bg-violet-900/30 transition-all"> Create free account </a> <button @click="startGuestChat()" class="w-full text-xs text-surface-400 hover:text-surface-600 dark:hover:text-surface-300 underline underline-offset-2 py-1 transition-colors"> Try 3 messages as guest </button> </div> </div> </div> <div x-show="isOpen && !showTeaser" x-transition:enter="transition ease-out duration-200" x-transition:enter-start="opacity-0 scale-95 translate-y-4" x-transition:enter-end="opacity-100 scale-100 translate-y-0" x-transition:leave="transition ease-in duration-150" x-transition:leave-start="opacity-100 scale-100" x-transition:leave-end="opacity-0 scale-95 translate-y-4" class="flex flex-col bg-white dark:bg-dark-card border border-surface-200 dark:border-dark-border shadow-xl w-full h-full sm:w-[400px] sm:h-[560px] sm:rounded-2xl sm:max-h-[80vh] overflow-hidden"> <div class="flex items-center justify-between px-4 py-3 bg-gradient-to-r from-violet-600 to-violet-500 text-white flex-shrink-0"> <div class="flex items-center gap-3"> <div class="w-8 h-8 rounded-full bg-white/20 flex items-center justify-center"> <svg aria-hidden="true" class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.75 3.104v5.714a2.25 2.25 0 01-.659 1.591L5 14.5M9.75 3.104c-.251.023-.501.05-.75.082m.75-.082a24.301 24.301 0 014.5 0m0 0v5.714c0 .597.237 1.17.659 1.591L19.8 15.3M14.25 3.104c.251.023.501.05.75.082M19.8 15.3l-1.57.393A9.065 9.065 0 0112 15a9.065 9.065 0 00-6.23.693L5 14.5m14.8.8l1.402 1.402c1.232 1.232.65 3.318-1.067 3.611A48.309 48.309 0 0112 21c-2.773 0-5.491-.235-8.135-.687-1.718-.293-2.3-2.379-1.067-3.61L5 14.5"/></svg> </div> <div> <h3 class="text-sm font-semibold">SubLearn Assistant</h3> <p class="text-xs text-white/80" x-show="!practiceLanguage">AI-powered support</p> <p class="text-xs text-white/80" x-show="practiceLanguage" x-text="practiceLabel"></p> </div> </div> <div class="flex items-center gap-1"> <button @click="resetChat()" class="p-1.5 rounded-lg hover:bg-white/20 transition-colors" :title="'New chat'" :aria-label="'New chat'"> <svg aria-hidden="true" class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M16.023 9.348h4.992v-.001M2.985 19.644v-4.992m0 0h4.992m-4.993 0l3.181 3.183a8.25 8.25 0 0013.803-3.7M4.031 9.865a8.25 8.25 0 0113.803-3.7l3.181 3.182"/></svg> </button> <button @click="closeChat()" class="p-1.5 rounded-lg hover:bg-white/20 transition-colors" :title="'Close'" :aria-label="'Close'"> <svg aria-hidden="true" class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"/></svg> </button> </div> </div> <div class="flex-1 overflow-y-auto p-4 space-y-4" x-ref="messagesContainer"> <div x-show="messages.length <= 1 && !typing" class="space-y-2 mt-2"> <template x-for="(prompt, pi) in suggestedPrompts" :key="'sp-'+pi"> <button @click="input = prompt; sendMessage()" class="w-full ltr:text-left rtl:text-right text-xs px-3 py-2 rounded-xl border border-surface-200 dark:border-dark-border text-surface-700 dark:text-surface-300 hover:bg-surface-50 dark:hover:bg-surface-800/50 hover:border-accent-300 dark:hover:border-accent-600 transition-colors" x-text="prompt"> </button> </template> </div> <template x-for="(msg, i) in messages" :key="i"> <div :class="msg.role === 'user' ? 'flex ltr:justify-end rtl:justify-start' : 'flex ltr:justify-start rtl:justify-end'"> <template x-if="msg.isCommand"> <div class="bg-accent-50 dark:bg-accent-900/20 border border-accent-200 dark:border-accent-800 rounded-2xl px-4 py-3 max-w-[90%]"> <div class="text-sm text-surface-900 dark:text-surface-100 whitespace-pre-wrap" x-html="msg.content"></div> </div> </template> <template x-if="msg.isQuiz"> <div class="bg-violet-50 dark:bg-violet-900/20 border border-violet-200 dark:border-violet-800 rounded-2xl px-4 py-3 max-w-[90%] w-full"> <p class="text-xs font-semibold text-violet-600 dark:text-violet-400 mb-2">Quick Quiz</p> <p class="text-sm font-medium text-surface-900 dark:text-surface-100 mb-3" x-text="msg.quizData.question"></p> <div class="space-y-2"> <template x-for="opt in msg.quizData.options" :key="opt.id"> <button @click="answerQuiz(msg, opt.id)" :disabled="msg.quizAnswered" class="w-full ltr:text-left rtl:text-right text-sm px-3 py-2 rounded-lg border transition-all" :class="msg.quizAnswered ? (opt.id === msg.quizData.correct_id ? 'border-green-400 bg-green-50 dark:bg-green-900/20 text-green-700 dark:text-green-300' : (opt.id === msg.quizSelected ? 'border-red-400 bg-red-50 dark:bg-red-900/20 text-red-700 dark:text-red-300' : 'border-surface-200 dark:border-surface-700 text-surface-500 dark:text-surface-400')) : 'border-violet-200 dark:border-violet-700 text-surface-800 dark:text-surface-200 hover:bg-violet-100 dark:hover:bg-violet-900/30 cursor-pointer'" x-text="opt.label"> </button> </template> </div> <template x-if="msg.quizAnswered"> <p class="text-xs mt-2" :class="msg.quizCorrect ? 'text-green-600 dark:text-green-400' : 'text-red-500 dark:text-red-400'" x-text="msg.quizCorrect ? 'Correct! Great job!' : 'Not quite. The answer: ' + msg.quizData.word + ' = ' + msg.quizData.definition"></p> </template> </div> </template> <template x-if="!msg.isCommand && !msg.isQuiz"> <div :class="msg.role === 'user' ? 'bg-accent-600 text-white rounded-2xl ltr:rounded-tr-md rtl:rounded-tl-md px-4 py-2.5 max-w-[85%]' : 'bg-surface-100 dark:bg-surface-800 text-surface-900 dark:text-surface-100 rounded-2xl ltr:rounded-tl-md rtl:rounded-tr-md px-4 py-2.5 max-w-[85%]'"> <template x-if="msg.role === 'user'"> <p class="text-sm whitespace-pre-wrap" x-text="msg.content"></p> </template> <template x-if="msg.role === 'assistant'"> <div class="text-sm prose prose-sm dark:prose-invert max-w-none prose-p:my-1 prose-ul:my-1 prose-ol:my-1 prose-li:my-0.5 prose-headings:my-2 prose-a:text-accent-600 dark:prose-a:text-accent-400" x-html="renderMarkdown(msg.content)"></div> </template> <template x-if="msg.role === 'assistant' && ttsSupported"> <div class="mt-1.5 flex items-center gap-1"> <button @click="speakMessage(msg, i)" class="p-1 rounded hover:bg-surface-200 dark:hover:bg-surface-700 transition-colors group/tts" :title="speakingIndex === i ? 'Stop speaking' : 'Listen'" :aria-label="speakingIndex === i ? 'Stop speaking' : 'Listen'"> <svg aria-hidden="true" class="w-3.5 h-3.5" :class="speakingIndex === i ? 'text-accent-500 animate-pulse' : 'text-surface-400 group-hover/tts:text-surface-600 dark:group-hover/tts:text-surface-300'" fill="none" stroke="currentColor" viewBox="0 0 24 24"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15.536 8.464a5 5 0 010 7.072M18.364 5.636a9 9 0 010 12.728M11 5L6 9H2v6h4l5 4V5z"/> </svg> </button> </div> </template> <template x-if="msg.sources && msg.sources.length > 0"> <div class="mt-2 pt-2 border-t" :class="msg.role === 'user' ? 'border-white/20' : 'border-surface-200 dark:border-surface-700'"> <p class="text-xs opacity-70 mb-1">Related:</p> <template x-for="(src, si) in msg.sources" :key="'src-'+si"> <a href="https://sublearn.com/search" @click.prevent="window.location.href = src.url || 'https://sublearn.com/search'" class="text-xs underline block" :class="msg.role === 'user' ? 'text-white/90' : 'text-accent-600 dark:text-accent-400'" x-text="src.title || src.question"></a> </template> </div> </template> <template x-if="msg.role === 'assistant' && msg.message_id && !msg.feedbackGiven"> <div class="mt-2 pt-2 border-t border-surface-200 dark:border-surface-700 flex items-center gap-2"> <span class="text-xs opacity-60">Helpful?</span> <button @click="giveFeedback(msg, true)" class="p-1 rounded hover:bg-surface-200 dark:hover:bg-surface-700 transition-colors" aria-label="Yes"> <svg aria-hidden="true" class="w-3.5 h-3.5 text-green-500" fill="currentColor" viewBox="0 0 20 20"><path d="M2 10.5a1.5 1.5 0 113 0v6a1.5 1.5 0 01-3 0v-6zM6 10.333v5.43a2 2 0 001.106 1.79l.05.025A4 4 0 008.943 18h5.416a2 2 0 001.962-1.608l1.2-6A2 2 0 0015.56 8H12V4a2 2 0 00-2-2 1 1 0 00-1 1v.667a4 4 0 01-.8 2.4L6.8 7.933a4 4 0 00-.8 2.4z"/></svg> </button> <button @click="giveFeedback(msg, false)" class="p-1 rounded hover:bg-surface-200 dark:hover:bg-surface-700 transition-colors" aria-label="No"> <svg aria-hidden="true" class="w-3.5 h-3.5 text-red-400" fill="currentColor" viewBox="0 0 20 20"><path d="M18 9.5a1.5 1.5 0 11-3 0v-6a1.5 1.5 0 013 0v6zM14 9.667v-5.43a2 2 0 00-1.105-1.79l-.05-.025A4 4 0 0011.055 2H5.64a2 2 0 00-1.962 1.608l-1.2 6A2 2 0 004.44 12H8v4a2 2 0 002 2 1 1 0 001-1v-.667a4 4 0 01.8-2.4l1.4-1.866a4 4 0 00.8-2.4z"/></svg> </button> </div> </template> <template x-if="msg.feedbackGiven"> <p class="text-xs opacity-50 mt-1">Thanks for feedback!</p> </template> </div> </template> </div> </template> <template x-if="lastFollowUps.length > 0 && !typing"> <div class="flex flex-wrap gap-2"> <template x-for="(fu, fi) in lastFollowUps" :key="'fu-'+fi"> <button @click="input = fu; sendMessage()" class="text-xs px-3 py-1.5 rounded-full border border-accent-200 dark:border-accent-700 text-accent-700 dark:text-accent-300 hover:bg-accent-50 dark:hover:bg-accent-900/20 transition-colors" x-text="fu"> </button> </template> </div> </template> <div x-show="typing" class="flex ltr:justify-start rtl:justify-end"> <div class="bg-surface-100 dark:bg-surface-800 rounded-2xl ltr:rounded-tl-md rtl:rounded-tr-md px-4 py-3"> <div class="flex items-center gap-1.5"> <div class="w-2 h-2 bg-surface-400 rounded-full animate-bounce" style="animation-delay: 0ms"></div> <div class="w-2 h-2 bg-surface-400 rounded-full animate-bounce" style="animation-delay: 150ms"></div> <div class="w-2 h-2 bg-surface-400 rounded-full animate-bounce" style="animation-delay: 300ms"></div> </div> </div> </div> <div x-show="showEscalation" class="bg-amber-50 dark:bg-amber-900/20 border border-amber-200 dark:border-amber-800 rounded-xl p-3"> <p class="text-sm text-amber-800 dark:text-amber-200 mb-2">Would you like to create a support ticket? A human agent will help you.</p> <div class="flex gap-2"> <button @click="escalateToTicket()" class="px-3 py-1.5 text-xs font-medium bg-accent-600 text-white rounded-lg hover:bg-accent-700 transition-colors"> Create Ticket </button> <button @click="showEscalation = false" class="px-3 py-1.5 text-xs font-medium bg-surface-200 dark:bg-surface-700 text-surface-700 dark:text-surface-300 rounded-lg hover:bg-surface-300 dark:hover:bg-surface-600 transition-colors"> No thanks </button> </div> </div> <div x-show="ticketCreated" class="bg-green-50 dark:bg-green-900/20 border border-green-200 dark:border-green-800 rounded-xl p-3"> <div class="flex items-start gap-2"> <svg aria-hidden="true" class="w-5 h-5 text-green-500 flex-shrink-0 mt-0.5" fill="currentColor" viewBox="0 0 20 20"><path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clip-rule="evenodd"></path></svg> <div> <p class="text-sm font-medium text-green-800 dark:text-green-200" x-text="ticketMessage"></p> <a href="https://sublearn.com/help/tickets/create" @click.prevent="window.location.href = ticketUrl || 'https://sublearn.com/help/tickets/create'" class="text-xs text-green-600 dark:text-green-400 hover:underline mt-1 inline-block">View ticket</a> </div> </div> </div> </div> <div class="flex-shrink-0 border-t border-surface-200 dark:border-dark-border p-3"> <div x-show="isGuest && guestMessagesUsed >= guestMessageLimit" class="text-center py-2 space-y-2"> <p class="text-sm font-medium text-surface-700 dark:text-surface-300">You've used your free messages</p> <a href="https://sublearn.com/register" class="btn-primary w-full !text-sm"> Sign up for unlimited AI chat </a> </div> <div x-show="!(isGuest && guestMessagesUsed >= guestMessageLimit)"> <form @submit.prevent="sendMessage()" class="flex items-end gap-2"> <textarea x-ref="chatInput" x-model="input" @keydown.enter.prevent="if (!$event.shiftKey) sendMessage()" @focus="stopPlaceholderRotation()" @blur="startPlaceholderRotation()" rows="1" class="input text-sm resize-none max-h-24 flex-1" :placeholder="placeholders[currentPlaceholder]" :disabled="typing || ticketCreated" x-init="$watch('input', () => { $el.style.height = 'auto'; $el.style.height = Math.min($el.scrollHeight, 96) + 'px'; })"></textarea> <template x-if="speechSupported && !isRecording"> <button type="button" @click="startRecording()" class="p-2.5 rounded-xl bg-surface-100 dark:bg-surface-700 text-surface-500 dark:text-surface-400 hover:bg-surface-200 dark:hover:bg-surface-600 transition-colors flex-shrink-0" :title="'Voice input'" :aria-label="'Voice input'"> <svg aria-hidden="true" class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 11a7 7 0 01-7 7m0 0a7 7 0 01-7-7m7 7v4m0 0H8m4 0h4m-4-8a3 3 0 01-3-3V5a3 3 0 116 0v6a3 3 0 01-3 3z"/></svg> </button> </template> <template x-if="speechSupported && isRecording"> <button type="button" @click="stopRecording()" class="p-2.5 rounded-xl bg-red-500 text-white animate-pulse transition-colors flex-shrink-0" :title="'Stop recording'" :aria-label="'Stop recording'"> <svg aria-hidden="true" class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 10a1 1 0 011-1h4a1 1 0 011 1v4a1 1 0 01-1 1h-4a1 1 0 01-1-1v-4z"/></svg> </button> </template> <button type="submit" :disabled="!input.trim() || typing || ticketCreated" class="p-2.5 rounded-xl bg-accent-600 text-white hover:bg-accent-700 disabled:opacity-50 disabled:cursor-not-allowed transition-colors flex-shrink-0" aria-label="Send"> <svg aria-hidden="true" class="w-5 h-5 ltr:rotate-0 rtl:rotate-180" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 19l9 2-9-18-9 18 9-2zm0 0v-8"></path></svg> </button> </form> <p class="text-[10px] text-surface-400 dark:text-surface-500 mt-1.5 text-center"> AI-powered — answers may not always be accurate </p> </div> </div> </div> <button x-show="!isOpen" @click="openChat()" x-transition:enter="transition ease-out duration-200" x-transition:enter-start="scale-0" x-transition:enter-end="scale-100" class="relative w-14 h-14 rounded-full bg-gradient-to-br from-violet-600 to-violet-500 text-white shadow-lg hover:shadow-xl hover:scale-105 transition-all duration-200 flex items-center justify-center group" :aria-label="'Open AI chat assistant'"> <svg aria-hidden="true" class="w-6 h-6 group-hover:scale-110 transition-transform" fill="none" stroke="currentColor" viewBox="0 0 24 24"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z"></path> </svg> <span x-show="!hasOpened" class="absolute top-0 ltr:right-0 rtl:left-0 w-3 h-3 bg-red-500 rounded-full border-2 border-white dark:border-dark-bg animate-pulse"></span> <template x-if="nudgeData"> <span class="absolute -top-1 ltr:-left-1 rtl:-right-1 bg-amber-500 text-white text-[10px] font-bold rounded-full w-5 h-5 flex items-center justify-center shadow-sm" x-text="nudgeData.icon"></span> </template> </button> <div x-show="nudgeData && !isOpen" x-transition class="absolute bottom-16 ltr:right-0 rtl:left-0 bg-white dark:bg-dark-card border border-surface-200 dark:border-dark-border rounded-xl shadow-lg px-3 py-2 max-w-[200px] pointer-events-none"> <p class="text-xs text-surface-700 dark:text-surface-300" x-text="nudgeData?.message"></p> </div> <div x-show="contextHint && !nudgeData && !isOpen" x-transition:enter="transition ease-out duration-300" x-transition:enter-start="opacity-0 translate-y-2" x-transition:enter-end="opacity-100 translate-y-0" x-transition:leave="transition ease-in duration-200" x-transition:leave-start="opacity-100" x-transition:leave-end="opacity-0 translate-y-2" class="absolute bottom-16 ltr:right-0 rtl:left-0 bg-gradient-to-r from-violet-50 to-white dark:from-violet-900/30 dark:to-dark-card border border-violet-200 dark:border-violet-800 rounded-xl shadow-lg px-3 py-2 w-[220px] min-w-[180px] pointer-events-none"> <p class="text-xs text-violet-700 dark:text-violet-300 font-medium" x-text="contextHint"></p> </div> </div> <script> window.slTrack = function(event, props) { props = props || {}; if (typeof window.sublearnHasAnalyticsConsent === 'function' && !window.sublearnHasAnalyticsConsent()) { return; } var consentValue = typeof window.sublearnGetCookieConsent === 'function' ? (window.sublearnGetCookieConsent() || '') : ''; // Internal analytics fetch('/api/analytics/track', { method: 'POST', keepalive: true, headers: { 'Content-Type': 'application/json', 'Accept': 'application/json', 'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]')?.content || '', 'X-Cookie-Consent': consentValue }, body: JSON.stringify({event: event, properties: props}) }).catch(function() {}); // Browser-side third-party analytics should stay on the browser path only. var ampEvent = event.replace(/_/g, ' ').replace(/\b\w/g, function(c){ return c.toUpperCase(); }); if (window.slAmp) { window.slAmp(ampEvent, props); } }; document.querySelectorAll('[data-track]').forEach(function(el) { el.addEventListener('click', function() { slTrack('cta_clicked', {cta: this.dataset.track, page: location.pathname}); }); }); </script> <script> (function () { const cancelGooglePrompt = function () { if (window.google?.accounts?.id?.cancel) { window.google.accounts.id.cancel(); } }; window.sublearnCancelGooglePrompt = cancelGooglePrompt; const syncAmplitude = function (payload) { if (!payload.auth_state || !window.amplitude || !window.amplitude.Identify) { return; } if (typeof window.amplitude.setUserId === 'function') { window.amplitude.setUserId(`sl-${payload.auth_state.user_id}`); } const identify = new window.amplitude.Identify(); identify.set('locale', document.documentElement.lang || 'en'); identify.set('is_guest', false); identify.set('subscription_tier', payload.auth_state.subscription_tier || 'free'); identify.set('level', payload.auth_state.level || 1); identify.set('total_xp', payload.auth_state.total_xp || 0); identify.set('is_premium', Boolean(payload.auth_state.is_premium)); identify.set('auth_provider', payload.auth_state.auth_provider || 'google'); window.amplitude.identify(identify); }; const syncCsrfToken = function (payload) { if (!payload.csrf_token) { return; } let csrfMeta = document.querySelector('meta[name="csrf-token"]'); if (!csrfMeta) { csrfMeta = document.createElement('meta'); csrfMeta.name = 'csrf-token'; document.head.appendChild(csrfMeta); } csrfMeta.setAttribute('content', payload.csrf_token); document.querySelectorAll('input[name="_token"]').forEach(function (input) { input.value = payload.csrf_token; }); if (window.axios?.defaults?.headers?.common) { window.axios.defaults.headers.common['X-CSRF-TOKEN'] = payload.csrf_token; } }; window.sublearnApplyAuthState = function (payload) { document.documentElement.dataset.authenticated = 'true'; document.documentElement.classList.add('sl-authenticated'); window.sublearnAuthState = payload.auth_state || null; syncCsrfToken(payload); document.querySelectorAll('[data-auth-guest-only]').forEach(function (element) { element.classList.add('hidden'); }); document.querySelectorAll('[data-auth-user-only]').forEach(function (element) { element.classList.remove('hidden'); }); document.querySelectorAll('[data-dashboard-link]').forEach(function (element) { if (payload.dashboard_url) { element.setAttribute('href', payload.dashboard_url); } }); document.querySelectorAll('[data-auth-user-url]:not([data-auth-home-link])').forEach(function (element) { if (element.dataset.authUserUrl) { element.setAttribute('href', element.dataset.authUserUrl); } }); document.querySelectorAll('[data-auth-home-link]').forEach(function (element) { if (element.dataset.authUserUrl) { element.setAttribute('href', element.dataset.authUserUrl); } const label = element.querySelector('[data-auth-home-label]'); if (label && element.dataset.authUserLabel) { label.textContent = element.dataset.authUserLabel; } }); if (payload.auth_state?.user_id) { let userIdMeta = document.querySelector('meta[name="user-id"]'); if (!userIdMeta) { userIdMeta = document.createElement('meta'); userIdMeta.name = 'user-id'; document.head.appendChild(userIdMeta); } userIdMeta.content = String(payload.auth_state.user_id); } syncAmplitude(payload); cancelGooglePrompt(); }; window.addEventListener('auth-social-start', cancelGooglePrompt); window.addEventListener('open-auth-modal', cancelGooglePrompt); window.addEventListener('sublearn-auth-manual-start', cancelGooglePrompt); })(); </script> <script src="https://sublearn.com/vendor/js/google-gis.js" async defer></script> <script> const initializeOneTap = function () { const context = "public"; const endpoint = "https:\/\/sublearn.com\/auth\/google\/one-tap"; const clientId = "674636946661-6otn45imjvh2odjkddcaq0apeo7jl3ho.apps.googleusercontent.com"; const nonce = "pdQGMHe2qBDGMMRShSJwKR2rWuu8E4QAZH01VTXsJzOae0fG"; const surface = context === 'public' ? 'public_shell' : 'app_shell'; const fallbackGoogleError = document.documentElement.dataset.authGoogleError || document.documentElement.dataset.authSocialPopupFailed || window.__t?.auth_social_popup_failed || 'Unable to complete sign-in right now. Please try again.'; let gisInitialized = false; if (!clientId || !nonce) { return; } const readConsentState = function () { if (typeof window.sublearnGetCookieConsent === 'function') { return window.sublearnGetCookieConsent() || ''; } const match = document.cookie.match(/(?:^|; )cookieConsent=([^;]+)/); const cookieValue = match ? decodeURIComponent(match[1]) : ''; try { if (cookieValue) { window.localStorage.setItem('cookieConsent', cookieValue); return cookieValue; } window.localStorage.removeItem('cookieConsent'); } catch { // Ignore storage failures and rely on cookie state only. } return cookieValue; }; const trackEvent = function (eventName, props) { if (!window.slTrack) { return; } window.slTrack(eventName, Object.assign({ context: context, surface: surface, }, props || {})); }; const resolveInteraction = function (response) { const state = typeof response?.state === 'string' ? response.state : ''; if (state === 'public_modal_google_button') { return { method: 'google_gis_button', surface: 'public_modal', }; } if (state === 'app_modal_google_button') { return { method: 'google_gis_button', surface: 'app_modal', }; } return { method: 'google_gis', surface: surface, }; }; const normalizeSelectBy = function (response) { const selectBy = typeof response?.select_by === 'string' ? response.select_by.trim() : ''; return selectBy !== '' ? selectBy : null; }; const handleCredential = function (response) { const credential = typeof response?.credential === 'string' ? response.credential : ''; if (!credential) { return; } const interaction = resolveInteraction(response); const selectBy = normalizeSelectBy(response); trackEvent('auth_started', { method: interaction.method, provider: 'google', surface: interaction.surface, google_select_by: selectBy, }); fetch(endpoint, { method: 'POST', credentials: 'same-origin', headers: { 'Content-Type': 'application/json', 'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]')?.content || '', 'Accept': 'application/json', 'X-Cookie-Consent': readConsentState(), }, body: JSON.stringify({ credential: credential, context: context, return_to: window.location.pathname + window.location.search + window.location.hash, inline_safe: document.documentElement.dataset.authInlineSafe === 'true', method: interaction.method, surface: interaction.surface, select_by: selectBy, }) }) .then(function (response) { return response.json().then(function (data) { return { ok: response.ok, data: data }; }); }) .then(function (result) { const data = result.data || {}; if (!result.ok || !data.success) { window.dispatchEvent(new CustomEvent('auth-social-error', { detail: { context: context, provider: 'google', method: interaction.method, surface: interaction.surface, select_by: selectBy, reason: data.reason || 'credential_exchange_failed', message: data.message || fallbackGoogleError, }, })); return; } const isNewUser = Boolean(data.is_new_user); trackEvent(isNewUser ? 'signup_completed' : 'login_completed', { method: interaction.method, provider: 'google', surface: interaction.surface, google_select_by: selectBy, is_new_user: isNewUser, }); if (data.stay_on_page) { if (typeof window.sublearnApplyAuthState === 'function') { window.sublearnApplyAuthState(data); } window.dispatchEvent(new CustomEvent('sublearn-authenticated', { detail: data, })); return; } if (data.redirect) { window.location.replace(data.redirect); } }) .catch(function () { window.dispatchEvent(new CustomEvent('auth-social-error', { detail: { context: context, provider: 'google', method: interaction.method, surface: interaction.surface, select_by: selectBy, reason: 'credential_exchange_failed', message: fallbackGoogleError, }, })); trackEvent('auth_failed', { method: interaction.method, provider: 'google', surface: interaction.surface, google_select_by: selectBy, reason: 'credential_exchange_failed', }); }); }; const ensureGoogleIdentityInitialized = function () { if (!window.google?.accounts?.id || gisInitialized) { return; } window.google.accounts.id.initialize({ client_id: clientId, nonce: nonce, callback: function (response) { handleCredential(response); }, auto_select: false, cancel_on_tap_outside: true, context: 'signin', itp_support: true, use_fedcm_for_prompt: true, use_fedcm_for_button: true, }); gisInitialized = true; }; const renderModalGoogleButtons = function () { if (!window.google?.accounts?.id?.renderButton) { return; } document.querySelectorAll('[data-google-shell-gis-button]').forEach(function (button) { if (!(button instanceof HTMLElement) || button.dataset.gisRendered === 'true') { return; } const root = button.closest('[data-google-gis-modal-root]'); const fallback = root?.querySelector('[data-google-shell-fallback]'); const containerWidth = Math.max( Math.round(button.getBoundingClientRect().width || root?.getBoundingClientRect().width || 0), 0 ); if (containerWidth < 220) { return; } try { button.innerHTML = ''; button.classList.remove('hidden'); button.classList.add('flex'); window.google.accounts.id.renderButton(button, { type: 'standard', theme: document.documentElement.classList.contains('dark') ? 'filled_black' : 'outline', size: 'large', text: 'continue_with', shape: 'pill', logo_alignment: 'left', state: context === 'public' ? 'public_modal_google_button' : 'app_modal_google_button', width: Math.min(containerWidth, 400), locale: document.documentElement.lang || 'en', click_listener: function () { cancelGooglePrompt(); window.dispatchEvent(new CustomEvent('auth-social-start', { detail: { context: context, provider: 'google', method: 'google_gis_button', surface: context === 'public' ? 'public_modal' : 'app_modal', }, })); }, }); button.dataset.gisRendered = 'true'; if (fallback instanceof HTMLElement) { fallback.classList.add('hidden'); } } catch { button.classList.add('hidden'); button.classList.remove('flex'); if (fallback instanceof HTMLElement) { fallback.classList.remove('hidden'); } } }); }; const bootstrapGoogleIdentity = function () { if (!window.google?.accounts?.id) { return; } ensureGoogleIdentityInitialized(); renderModalGoogleButtons(); window.google.accounts.id.prompt(); }; window.addEventListener('sublearn-auth-modal-opened', function (event) { if (event.detail?.context !== context) { return; } window.requestAnimationFrame(function () { window.requestAnimationFrame(function () { ensureGoogleIdentityInitialized(); renderModalGoogleButtons(); }); }); }); if (window.google?.accounts?.id) { bootstrapGoogleIdentity(); return; } let attempts = 0; const interval = window.setInterval(function () { attempts += 1; if (window.google?.accounts?.id) { window.clearInterval(interval); bootstrapGoogleIdentity(); return; } if (attempts >= 40) { window.clearInterval(interval); } }, 250); }; if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', initializeOneTap, { once: true }); } else { initializeOneTap(); } </script> <div id="live-announcer" aria-live="polite" aria-atomic="true" class="sr-only"></div> <script> const sublearnLoginTargets = [ new URL("https:\/\/sublearn.com\/login", window.location.origin).pathname, new URL("https:\/\/sublearn.com\/login", window.location.origin).pathname, ]; const sublearnRegisterTargets = [ new URL("https:\/\/sublearn.com\/register", window.location.origin).pathname, new URL("https:\/\/sublearn.com\/register", window.location.origin).pathname, ]; const sublearnWizardTargets = [ new URL("https:\/\/sublearn.com\/learn\/start", window.location.origin).pathname, ]; const dispatchAuthModal = function (mode) { window.dispatchEvent(new CustomEvent('open-auth-modal', { detail: { mode: mode, }, })); }; const sublearnUserIsAuthenticated = function () { return document.documentElement.dataset.authenticated === 'true'; }; document.addEventListener('click', function (event) { const trigger = event.target.closest('[data-open-auth-modal]'); const anchor = event.target.closest('a[href]'); if ((event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) || event.button !== 0) { return; } if (sublearnUserIsAuthenticated()) { return; } if (trigger) { event.preventDefault(); dispatchAuthModal(trigger.dataset.authMode === 'register' ? 'register' : 'login'); return; } if (!anchor || anchor.dataset.authModalIgnore === 'true' || anchor.target === '_blank' || anchor.hasAttribute('download')) { return; } const anchorUrl = new URL(anchor.href, window.location.origin); if (anchorUrl.origin !== window.location.origin) { return; } const isLoginTarget = sublearnLoginTargets.includes(anchorUrl.pathname); const isRegisterTarget = sublearnRegisterTargets.includes(anchorUrl.pathname); const isWizardTarget = sublearnWizardTargets.includes(anchorUrl.pathname); if (! isLoginTarget && ! isRegisterTarget && ! isWizardTarget) { return; } event.preventDefault(); dispatchAuthModal(isLoginTarget ? 'login' : 'register'); }); window.addEventListener('sublearn-authenticated', function () { document.documentElement.dataset.authenticated = 'true'; window.dispatchEvent(new CustomEvent('close-auth-modal')); }); </script> <script src="https://sublearn.com/vendor/js/marked.min.js"></script> <script src="https://sublearn.com/vendor/js/purify.min.js"></script> <script> function chatWidget() { return { isOpen: false, hasOpened: localStorage.getItem('chat_opened') === 'true', optedOut: localStorage.getItem('chat_opted_out') === 'true', sessionToken: null, messages: [], input: '', typing: false, showEscalation: false, ticketCreated: false, ticketMessage: '', ticketUrl: '', negativeCount: 0, // Guest teaser mode (Phase 7B) isGuest: true, guestMessagesUsed: parseInt(localStorage.getItem('chat_guest_msgs') || '0'), guestMessageLimit: 3, showTeaser: false, teaserContent: { headline: '', features: [] }, // Streaming useStreaming: true, // Follow-ups lastFollowUps: [], // History showHistory: false, historyItems: [], // Language practice practiceLanguage: null, practiceLabel: '', userLanguages: [] , // Suggested prompts (pool of 10, shuffle to show 4) allPrompts: [ 'How do I add vocabulary from videos?', 'What exercises are available?', 'How does the XP system work?', 'How do I change my subscription?', 'Quiz me on my vocabulary', 'Can I practice grammar here?', 'Can I use voice input?', 'How\u0027s my streak doing?', 'Do I have flashcards to review?', 'What can you do?', ], suggestedPrompts: [], // Commands list (client-side handled) commands: { '/help': true, '/feedback': true, }, // Voice input (F6) speechSupported: false, isRecording: false, recognition: null, // TTS (F7) — Google Cloud TTS with browser fallback ttsSupported: true, speakingIndex: -1, currentAudio: null, // Rotating placeholder placeholders: [ 'Type your question...', 'Try \/quiz for a vocabulary quiz...', 'Ask me to correct your grammar...', 'Click the mic to use voice input...', 'Type \/help to see all commands...', 'Practice any language with me...', ], currentPlaceholder: 0, placeholderInterval: null, // Page context hint contextHint: null, // Nudges (F9) nudgeData: null, nudgeChecked: false, init() { // Check Speech Recognition support const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition; this.speechSupported = !!SpeechRecognition; // TTS always supported (Google Cloud API with browser fallback) this.ttsSupported = true; // Configure marked for safe rendering if (window.marked) { marked.setOptions({ breaks: true, gfm: true, }); } // Initialize teaser content for guests if (this.isGuest) { this.teaserContent = this.getTeaserContent(); } // Page-context-aware chips and placeholder const pageCtx = this.getPageContext(); if (window.__chatSuggestedPrompts && Array.isArray(window.__chatSuggestedPrompts) && window.__chatSuggestedPrompts.length > 0) { this.suggestedPrompts = window.__chatSuggestedPrompts.slice(0, 4); } else if (pageCtx.priorityIndices.length > 0) { const priority = pageCtx.priorityIndices.map(i => this.allPrompts[i]); const rest = this.allPrompts.filter((_, i) => !pageCtx.priorityIndices.includes(i)); this.suggestedPrompts = [...priority, ...this.shuffleArray([...rest]).slice(0, 4 - priority.length)]; } else { this.suggestedPrompts = this.shuffleArray([...this.allPrompts]).slice(0, 4); } this.currentPlaceholder = pageCtx.placeholderStart; // Show context hint tooltip once per session per page type if (pageCtx.type !== 'default' && !sessionStorage.getItem('chat_ctx_' + pageCtx.type)) { setTimeout(() => { if (!this.isOpen && !this.nudgeData) { this.contextHint = this.placeholders[pageCtx.placeholderStart]; sessionStorage.setItem('chat_ctx_' + pageCtx.type, '1'); setTimeout(() => { this.contextHint = null; }, 8000); } }, 2000); } // Start rotating placeholder this.startPlaceholderRotation(); // Listen for open-chat custom event document.addEventListener('open-chat', () => this.openChat()); // Keyboard shortcut: Ctrl+/ or Cmd+/ document.addEventListener('keydown', (e) => { if ((e.ctrlKey || e.metaKey) && e.key === '/') { e.preventDefault(); this.isOpen ? this.closeChat() : this.openChat(); } }); // Check nudge once per session }, // Markdown rendering with action buttons and sanitization renderMarkdown(text) { if (!text) return ''; if (!window.marked || !window.DOMPurify) return this.escapeHtml(text); try { // Strip [FOLLOWUP] lines (they display as chips separately) let processed = text.replace(/\[FOLLOWUP\].+\n?/gm, '').trim(); // Replace [action:Label|/url] with styled button HTML before parsing processed = processed.replace(/\[action:([^\]|]+)\|([^\]]+)\]/g, '<a href="$2" class="inline-flex items-center gap-1 px-3 py-1 mt-1 mb-1 text-xs font-medium text-white bg-accent-600 hover:bg-accent-700 rounded-lg transition-colors no-underline">$1 →</a>'); const html = marked.parse(processed); return DOMPurify.sanitize(html, { ADD_ATTR: ['target', 'class'], ADD_TAGS: ['a'], }); } catch (e) { return this.escapeHtml(text); } }, escapeHtml(text) { const div = document.createElement('div'); div.textContent = text; return div.innerHTML; }, getContext() { const ctx = { page: { url: window.location.pathname, title: document.title, }, }; if (this.practiceLanguage) { ctx.practice_language = this.practiceLanguage; } return ctx; }, getCsrfHeaders() { return { 'Content-Type': 'application/json', 'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').content, }; }, async openChat() { this.hasOpened = true; this.nudgeData = null; this.contextHint = null; localStorage.setItem('chat_opened', 'true'); // Guest teaser: show teaser on first click if no guest messages used yet if (this.isGuest && this.guestMessagesUsed < 1) { this.teaserContent = this.getTeaserContent(); this.showTeaser = true; this.isOpen = true; return; } // Normal flow (auth users or returning guests) this.showTeaser = false; this.isOpen = true; if (!this.sessionToken) await this.startSession(); this.$nextTick(() => this.$refs.chatInput?.focus()); }, closeChat() { this.isOpen = false; this.showHistory = false; this.showTeaser = false; }, async startSession() { try { const res = await fetch('/api/chat/sessions', { method: 'POST', headers: this.getCsrfHeaders(), body: JSON.stringify({ context: this.getContext() }), }); const data = await res.json(); this.sessionToken = data.session_token; this.messages = [{ role: 'assistant', content: data.message, sources: [] }]; } catch (e) { this.messages = [{ role: 'assistant', content: 'Hi! I\u0027m SubLearn\u0027s AI assistant. Ask me anything about the platform!', sources: [] }]; } }, async sendMessage() { const text = this.input.trim(); if (!text || this.typing) return; // Client-side command handling if (text === '/help') { this.input = ''; this.messages.push({ role: 'user', content: text, sources: [] }); this.messages.push({ role: 'assistant', content: this.getHelpCommandContent(), isCommand: true, sources: [], }); this.lastFollowUps = []; this.scrollToBottom(); return; } if (text === '/feedback') { this.input = ''; window.location.href = 'https:\/\/sublearn.com\/help\/contact'; return; } // Server-side command handling (including /quiz) if (text.startsWith('/') && ['/stats', '/review', '/goal', '/streak', '/quiz'].includes(text.split(' ')[0])) { this.messages.push({ role: 'user', content: text, sources: [] }); this.input = ''; this.typing = true; this.lastFollowUps = []; this.scrollToBottom(); try { const res = await fetch('/api/chat/command', { method: 'POST', headers: this.getCsrfHeaders(), body: JSON.stringify({ session_token: this.sessionToken, command: text }), }); const data = await res.json(); // Quiz returns structured data if (data.type === 'quiz') { this.messages.push({ role: 'assistant', isQuiz: true, quizData: data, quizAnswered: false, quizSelected: null, quizCorrect: false, sources: [], }); } else if (data.type === 'quiz_error') { this.messages.push({ role: 'assistant', content: data.content, isCommand: true, sources: [], }); } else { this.messages.push({ role: 'assistant', content: data.content, isCommand: true, sources: [], }); } } catch (e) { this.messages.push({ role: 'assistant', content: 'I\u0027m sorry, I\u0027m having trouble processing your request right now. Would you like to create a support ticket instead?', sources: [] }); } this.typing = false; this.scrollToBottom(); return; } // Regular message — try streaming first, fall back to non-streaming this.messages.push({ role: 'user', content: text, sources: [] }); this.input = ''; this.typing = true; this.lastFollowUps = []; this.scrollToBottom(); if (this.useStreaming) { await this.sendMessageStream(text); } else { await this.sendMessageNonStream(text); } // Track guest message usage if (this.isGuest) { this.guestMessagesUsed++; localStorage.setItem('chat_guest_msgs', this.guestMessagesUsed.toString()); } }, async sendMessageStream(text) { try { const res = await fetch('/api/chat/messages/stream', { method: 'POST', headers: this.getCsrfHeaders(), body: JSON.stringify({ session_token: this.sessionToken, message: text, context: this.getContext(), }), }); if (!res.ok || !res.body) { // Fallback to non-streaming this.useStreaming = false; await this.sendMessageNonStream(text); return; } // Create placeholder message for streaming content const msgIndex = this.messages.length; this.messages.push({ role: 'assistant', content: '', sources: [], message_id: null, feedbackGiven: false, }); const reader = res.body.getReader(); const decoder = new TextDecoder(); let buffer = ''; let firstChunk = true; while (true) { const { done, value } = await reader.read(); if (done) break; buffer += decoder.decode(value, { stream: true }); const lines = buffer.split('\n'); buffer = lines.pop() || ''; for (const line of lines) { const trimmed = line.trim(); if (!trimmed.startsWith('data: ')) continue; const jsonStr = trimmed.slice(6); let data; try { data = JSON.parse(jsonStr); } catch (e) { continue; } if (data.chunk) { if (firstChunk) { this.typing = false; firstChunk = false; } this.messages[msgIndex].content += data.chunk; this.scrollToBottom(); } if (data.done) { this.messages[msgIndex].message_id = data.message_id; this.messages[msgIndex].sources = data.sources || []; // Strip [FOLLOWUP] lines from stored content this.messages[msgIndex].content = this.messages[msgIndex].content.replace(/\[FOLLOWUP\].+\n?/gm, '').trim(); this.lastFollowUps = data.follow_ups || []; this.scrollToBottom(); } if (data.error) { if (!this.messages[msgIndex].content) { this.messages[msgIndex].content = 'I\u0027m sorry, I\u0027m having trouble processing your request right now. Would you like to create a support ticket instead?'; } this.showEscalation = true; } } } this.typing = false; this.scrollToBottom(); } catch (e) { // Fallback to non-streaming on network error this.useStreaming = false; // Remove the empty streaming message if it was added const lastMsg = this.messages[this.messages.length - 1]; if (lastMsg && lastMsg.role === 'assistant' && !lastMsg.content) { this.messages.pop(); } await this.sendMessageNonStream(text); } }, async sendMessageNonStream(text) { try { const res = await fetch('/api/chat/messages', { method: 'POST', headers: this.getCsrfHeaders(), body: JSON.stringify({ session_token: this.sessionToken, message: text, context: this.getContext(), }), }); const data = await res.json(); this.messages.push({ role: 'assistant', content: data.content, sources: data.sources || [], message_id: data.message_id, feedbackGiven: false, }); this.lastFollowUps = data.follow_ups || []; if (data.error) this.showEscalation = true; } catch (e) { this.messages.push({ role: 'assistant', content: 'I\u0027m sorry, I\u0027m having trouble processing your request right now. Would you like to create a support ticket instead?', sources: [], }); this.showEscalation = true; } this.typing = false; this.scrollToBottom(); }, // Quiz answer handler answerQuiz(msg, selectedId) { if (msg.quizAnswered) return; msg.quizAnswered = true; msg.quizSelected = selectedId; msg.quizCorrect = selectedId === msg.quizData.correct_id; }, getHelpCommandContent() { return `<strong>Available Commands</strong>\n\n/stats — Your XP, level, streak, and words learned\n/review — Due flashcard count and review link\n/goal — Daily goal progress\n/streak — Current streak and best streak\n/quiz — Quick vocabulary quiz\n/help — Show available commands\n/feedback — Open feedback form`; }, async giveFeedback(msg, helpful) { msg.feedbackGiven = true; if (!helpful) { this.negativeCount++; if (this.negativeCount >= 2) this.showEscalation = true; } if (msg.message_id) { fetch(`/api/chat/messages/${msg.message_id}/feedback`, { method: 'POST', headers: this.getCsrfHeaders(), body: JSON.stringify({ helpful }), }).catch(() => {}); } }, async escalateToTicket() { this.showEscalation = false; this.typing = true; try { const res = await fetch('/api/chat/escalate', { method: 'POST', headers: this.getCsrfHeaders(), body: JSON.stringify({ session_token: this.sessionToken }), }); if (res.status === 401) { window.location.href = 'https://sublearn.com/help/tickets/create'; return; } const data = await res.json(); this.ticketCreated = true; this.ticketMessage = data.message; this.ticketUrl = data.ticket_url; } catch (e) { window.location.href = 'https://sublearn.com/help/tickets/create'; } this.typing = false; this.scrollToBottom(); }, resetChat() { this.sessionToken = null; this.messages = []; this.input = ''; this.typing = false; this.showEscalation = false; this.ticketCreated = false; this.negativeCount = 0; this.practiceLanguage = null; this.practiceLabel = ''; this.lastFollowUps = []; this.useStreaming = true; this.startSession(); }, // Guest teaser: start guest chat async startGuestChat() { this.showTeaser = false; if (!this.sessionToken) await this.startSession(); this.$nextTick(() => this.$refs.chatInput?.focus()); }, // Guest teaser: get page-contextual teaser content getTeaserContent() { const pageCtx = this.getPageContext(); const contents = { grammar: { headline: 'Your AI Grammar Tutor', features: [ { icon: '✏️', text: 'Grammar correction' }, { icon: '🎯', text: 'Practice mode' }, { icon: '📝', text: 'Interactive exercises' }, { icon: '🎙️', text: 'Voice input' }, ], }, vocabulary: { headline: 'Your AI Vocabulary Coach', features: [ { icon: '🧠', text: 'Vocabulary quizzes' }, { icon: '🃏', text: 'Flashcard review' }, { icon: '🔄', text: 'Spaced repetition' }, { icon: '🎙️', text: 'Voice input' }, ], }, video: { headline: 'Your AI Video Companion', features: [ { icon: '💬', text: 'Ask about subtitles' }, { icon: '🎬', text: 'Learn from videos' }, { icon: '📖', text: 'Vocabulary extraction' }, { icon: '🎙️', text: 'Voice input' }, ], }, }; const fallback = { headline: 'Your AI Language Tutor', features: [ { icon: '✏️', text: 'Grammar correction' }, { icon: '🧠', text: 'Vocabulary quizzes' }, { icon: '🎙️', text: 'Voice input' }, { icon: '🎯', text: 'Practice mode' }, ], }; return contents[pageCtx.type] || fallback; }, // History async toggleHistory() { if (this.showHistory) { this.showHistory = false; return; } try { const res = await fetch('/api/chat/history', { headers: this.getCsrfHeaders() }); if (res.ok) { this.historyItems = await res.json(); } } catch (e) {} this.showHistory = true; }, async loadSession(token) { this.showHistory = false; this.typing = true; try { const res = await fetch(`/api/chat/sessions/${token}`, { headers: this.getCsrfHeaders() }); if (res.ok) { const data = await res.json(); this.sessionToken = token; this.messages = data.messages.map(m => ({ role: m.role, content: m.content, sources: m.metadata?.sources || [], message_id: m.id, feedbackGiven: !!m.metadata?.feedback, })); this.ticketCreated = false; this.showEscalation = false; this.lastFollowUps = []; } } catch (e) {} this.typing = false; this.scrollToBottom(); }, async deleteSession(token, idx) { try { await fetch(`/api/chat/sessions/${token}`, { method: 'DELETE', headers: this.getCsrfHeaders(), }); this.historyItems.splice(idx, 1); } catch (e) {} }, // Language practice setPracticeLanguage(lang) { this.practiceLanguage = lang; if (lang) { this.practiceLabel = 'Practicing ' + lang.name; } else { this.practiceLabel = ''; } }, // Export async exportChat() { if (!this.sessionToken) return; try { const res = await fetch(`/api/chat/sessions/${this.sessionToken}/export?format=txt`, { headers: this.getCsrfHeaders(), }); if (res.ok) { const blob = await res.blob(); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = `sublearn-chat-${new Date().toISOString().split('T')[0]}.txt`; a.click(); URL.revokeObjectURL(url); } } catch (e) {} }, // Voice input (F6) startRecording() { const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition; if (!SpeechRecognition) return; this.recognition = new SpeechRecognition(); this.recognition.continuous = false; this.recognition.interimResults = false; // Set language based on practice mode if (this.practiceLanguage?.code) { this.recognition.lang = this.practiceLanguage.code; } this.recognition.onresult = (event) => { const transcript = event.results[0][0].transcript; this.input = (this.input ? this.input + ' ' : '') + transcript; this.isRecording = false; }; this.recognition.onerror = () => { this.isRecording = false; }; this.recognition.onend = () => { this.isRecording = false; }; this.recognition.start(); this.isRecording = true; }, stopRecording() { if (this.recognition) { this.recognition.stop(); } this.isRecording = false; }, // TTS (F7) — Google Cloud TTS with browser speechSynthesis fallback async speakMessage(msg, index) { // Toggle off if already speaking this message if (this.speakingIndex === index) { if (this.currentAudio) { this.currentAudio.pause(); this.currentAudio = null; } if ('speechSynthesis' in window) speechSynthesis.cancel(); this.speakingIndex = -1; return; } // Stop any current playback if (this.currentAudio) { this.currentAudio.pause(); this.currentAudio = null; } if ('speechSynthesis' in window) speechSynthesis.cancel(); this.speakingIndex = index; // Strip HTML for clean text const div = document.createElement('div'); div.innerHTML = this.renderMarkdown(msg.content); const cleanText = (div.textContent || div.innerText || msg.content).substring(0, 5000); // Check client-side cache const cacheKey = 'tts_' + this.simpleHash(cleanText); const cached = sessionStorage.getItem(cacheKey); if (cached) { this.playAudioBase64(cached, index); return; } try { const res = await fetch('/api/chat/tts', { method: 'POST', headers: this.getCsrfHeaders(), body: JSON.stringify({ text: cleanText, lang: this.practiceLanguage?.code || document.documentElement.lang || 'en', }), }); if (!res.ok) throw new Error(window.__t?.chat_tts_api_error || 'TTS API error'); const data = await res.json(); if (data.audio) { sessionStorage.setItem(cacheKey, data.audio); this.playAudioBase64(data.audio, index); } else { throw new Error(window.__t?.chat_tts_no_audio || 'No audio returned'); } } catch (e) { // Fallback to browser TTS this.speakBrowser(cleanText, index); } }, playAudioBase64(base64, index) { try { const binaryStr = atob(base64); const bytes = new Uint8Array(binaryStr.length); for (let i = 0; i < binaryStr.length; i++) { bytes[i] = binaryStr.charCodeAt(i); } const blob = new Blob([bytes], { type: 'audio/mp3' }); const url = URL.createObjectURL(blob); this.currentAudio = new Audio(url); this.currentAudio.onended = () => { this.speakingIndex = -1; this.currentAudio = null; URL.revokeObjectURL(url); }; this.currentAudio.onerror = () => { this.speakingIndex = -1; this.currentAudio = null; URL.revokeObjectURL(url); }; this.currentAudio.play(); } catch (e) { this.speakingIndex = -1; this.currentAudio = null; } }, speakBrowser(text, index) { if (!('speechSynthesis' in window)) { this.speakingIndex = -1; return; } const utterance = new SpeechSynthesisUtterance(text); if (this.practiceLanguage?.code) { utterance.lang = this.practiceLanguage.code; } utterance.onend = () => { this.speakingIndex = -1; }; utterance.onerror = () => { this.speakingIndex = -1; }; speechSynthesis.speak(utterance); }, simpleHash(str) { let hash = 0; for (let i = 0; i < str.length; i++) { const char = str.charCodeAt(i); hash = ((hash << 5) - hash) + char; hash |= 0; } return hash.toString(36); }, // Nudge check (F9) async checkNudge() { try { const res = await fetch('/api/chat/nudge', { headers: this.getCsrfHeaders() }); if (res.ok) { const data = await res.json(); if (data.nudge) { this.nudgeData = data.nudge; } } } catch (e) {} sessionStorage.setItem('chat_nudge_checked', 'true'); }, // Detect page type for contextual chip/placeholder ordering // allPrompts indices: 0=vocabulary, 1=exercises, 2=xp, 3=subscription, // 4=quiz_me, 5=practice_grammar, 6=voice_input, 7=streak_check, 8=review_cards, 9=what_can_you_do // placeholders indices: 0=default, 1=quiz, 2=grammar, 3=voice, 4=commands, 5=practice getPageContext() { const path = window.location.pathname.replace(/^\/[a-z]{2}(\/|$)/, '/'); if (/\/grammar/i.test(path)) return { type: 'grammar', priorityIndices: [5, 9], placeholderStart: 2 }; if (/\/vocabulary/i.test(path)) return { type: 'vocabulary', priorityIndices: [4, 8], placeholderStart: 1 }; if (/\/video|\/watch/i.test(path)) return { type: 'video', priorityIndices: [0, 6], placeholderStart: 5 }; if (/\/phrase|\/idiom/i.test(path)) return { type: 'phrases', priorityIndices: [5, 4], placeholderStart: 5 }; if (/\/exercise|\/practice|\/review/i.test(path)) return { type: 'exercises', priorityIndices: [4, 1], placeholderStart: 1 }; if (/\/dashboard|\/home/i.test(path)) return { type: 'dashboard', priorityIndices: [7, 8], placeholderStart: 4 }; if (/\/help/i.test(path)) return { type: 'help', priorityIndices: [9, 3], placeholderStart: 4 }; return { type: 'default', priorityIndices: [], placeholderStart: 0 }; }, // Fisher-Yates shuffle shuffleArray(arr) { for (let i = arr.length - 1; i > 0; i--) { const j = Math.floor(Math.random() * (i + 1)); [arr[i], arr[j]] = [arr[j], arr[i]]; } return arr; }, startPlaceholderRotation() { if (this.placeholderInterval) return; this.placeholderInterval = setInterval(() => { this.currentPlaceholder = (this.currentPlaceholder + 1) % this.placeholders.length; }, 4000); }, stopPlaceholderRotation() { if (this.placeholderInterval) { clearInterval(this.placeholderInterval); this.placeholderInterval = null; } }, scrollToBottom() { this.$nextTick(() => { const c = this.$refs.messagesContainer; if (c) c.scrollTop = c.scrollHeight; }); }, } } </script> <script src="/js/push.js" defer></script> </body> </html>