- पहले tooltip लागू करने में जिन JavaScript event listeners, state management, और ARIA attributes की manual synchronization ज़रूरी होती थी, उन्हें Popover API ब्राउज़र की नेटिव क्षमता से replace करता है
- सिर्फ
popover attribute और popovertarget attribute से open/close, Esc key handling, और keyboard navigation अपने-आप काम करते हैं
- screen reader की predictability बेहतर होती है,
aria-expanded अपने-आप sync होता है, और focus restoration जैसी accessibility bug categories ही खत्म हो जाती हैं
- timing control, hover intent detection जैसे कुछ क्षेत्रों में अभी भी JavaScript की ज़रूरत है, लेकिन core interaction model अब ब्राउज़र संभालता है
- बड़े design systems या complex positioning की ज़रूरत होने पर libraries अभी भी उपयोगी हैं, लेकिन default अब नेटिव API की ओर शिफ्ट हो रहा है
मौजूदा tooltips की समस्याएँ
- Popover API से पहले ब्राउज़र में mouse, keyboard, और assistive technologies के बीच काम करने वाली नेटिव tooltip की अवधारणा मौजूद नहीं थी
- trigger element, hidden tooltip element, और दोनों को coordinate करने वाले JavaScript का वही पैटर्न बार-बार दोहराया जाता था
- ऊपर से यह सरल दिखता है, लेकिन असली users तक पहुँचते ही कई समस्याएँ सामने आती हैं
- keyboard users
Tab से trigger पर पहुँचें तब भी tooltip दिखाई नहीं देता
- screen reader कभी दो बार पढ़ता है, कभी बिल्कुल नहीं पढ़ता
- mouse को तेज़ी से हिलाने पर flicker होता है
- छोटी screens पर content overlap करता है
Esc key से बंद नहीं होता, focus खो जाता है
- समय के साथ event listeners बढ़ते जाते हैं, hover/focus को अलग-अलग handle करना पड़ता है, outside click के special cases, और ARIA attributes की manual synchronization के कारण code बहुत भारी हो जाता है
libraries क्यों इस्तेमाल की गईं
- libraries positioning, viewport boundary पर flipping, अलग input types के events का coordination, और complex layouts में scroll awareness जैसी वास्तविक समस्याएँ संभालती हैं
- सिर्फ positioning ही dependency को जायज़ ठहराने के लिए काफ़ी है, क्योंकि scroll containers, transforms, और responsive layouts को संभालना काफ़ी complex होता है
- असली समस्या accessibility behavior में आती है
- tooltip देर से दिखता है या बिल्कुल नहीं दिखता
- तेज़ी से tab करने पर tooltip skip हो जाता है
Esc से dismiss करना अस्थिर रहता है
- mouse users immediacy चाहते हैं, जबकि keyboard users predictability; दोनों को साथ support करने पर delays और edge cases पैदा होते हैं
- screen reader में tooltip कभी पढ़ा जाता है, कभी नहीं, और कभी दो बार पढ़ा जाता है — यानी inconsistent behavior
- ARIA attributes को manually update करते समय एक भी चीज़ छूट जाए तो accessibility tree में confusion या invisible state बन सकती है
समस्या code में नहीं, platform की सीमा में थी
- implementation tested था और libraries भी robust थीं, लेकिन मुख्य समस्या यह थी कि web platform में सही affordance मौजूद नहीं था
- ब्राउज़र के पास यह समझने का कोई तरीका नहीं था कि कोई element tooltip है; सब कुछ generic elements, event listeners, manual ARIA, और custom dismiss logic जैसी convention पर आधारित था
- समय के साथ छोटे बदलाव भी risk लेकर आते हैं, और मामूली fixes से regression हो सकता है — यानी fragile structure
- नया tooltip जोड़ने पर वही जटिलता फिर से विरासत में मिलती थी
Popover API का पहला उपयोग
- यह किसी नए experiment के लिए switch नहीं था, बल्कि ब्राउज़र को पहले से समझ में आनी चाहिए ऐसी tooltip behavior maintenance से थकान इसकी वजह थी
- सबसे छोटे रूप में शुरुआत की गई:
<button popovertarget="tip-1"> + <div id="tip-1" popover="manual" role="tooltip">
- कोई event listener नहीं, कोई state tracking नहीं, JavaScript से कोई ARIA update नहीं
- button पर focus करते ही tooltip दिखता है,
Esc दबाते ही गायब हो जाता है
तुरंत महसूस हुए फ़र्क
- JavaScript के बिना open/close: ब्राउज़र सिर्फ HTML से invocation संभालता है, और trigger तथा tooltip के बीच संबंध स्पष्ट रहता है
Esc key का automatic behavior: बिना key listener जोड़े ब्राउज़र खुद समझता है कि popover को dismiss किया जा सकता है
- ARIA state की automatic synchronization: popover open/close होने पर
aria-expanded अपने-आप update होता है, manual management की ज़रूरत नहीं रहती, और stale state का risk खत्म हो जाता है
- code कम होना महत्वपूर्ण है, लेकिन उससे भी ज़्यादा अहम है responsibility का shift: पहले JavaScript tooltip को “मौजूद” कराता था, अब ब्राउज़र markup में उसकी role समझता है और focus model, accessibility tree, और native dismiss rules में उसे शामिल करता है
Invoker Commands को समझना
popovertarget="id" button को popover element से जोड़ता है
popovertargetaction से behavior तय किया जाता है
show: सिर्फ खोलना
hide: सिर्फ बंद करना
toggle (default): खुला हो तो बंद, बंद हो तो खोलना
- एक ही tooltip के लिए multiple triggers हो सकते हैं, और basic interaction के लिए JavaScript की ज़रूरत नहीं पड़ती
accessibility में मुफ़्त लाभ
-
keyboard “बस काम करता है”
- पहले focus को trigger करना पड़ता था, blur से hide करना पड़ता था,
Esc को manually wire करना पड़ता था, और timing भी सही रखनी पड़ती थी — यानी multi-layered structure
popover attribute (auto या manual) सेट करते ही ब्राउज़र default handling देता है: Tab/Shift+Tab सामान्य रूप से काम करते हैं, Esc हर बार भरोसेमंद तरीके से बंद करता है
- codebase से global keydown handlers,
Esc-specific cleanup logic, और keyboard navigation के दौरान state checks हटाए जा सकते हैं
-
screen reader की predictability
- यह सबसे बड़ा सुधार वाला क्षेत्र है; पहले बहुत सावधानी से ARIA करने पर भी behavior बदल जाता था और छोटे बदलाव भी जोखिम भरे होते थे
popover="manual" role="tooltip" के साथ behavior काफ़ी ज़्यादा stable और predictable हो जाता है
- migration के बाद Lighthouse अब गलत ARIA states की warning नहीं दिखाता — क्योंकि गलत करने लायक custom ARIA state ही नहीं बचती
-
focus management
- पहले focus trigger show, tooltip के भीतर focus जाए तो बंद न करना, blur handle करना, और focus को manually restore करना जैसी complex rules थीं
- Popover API में focus स्वाभाविक रूप से popover की ओर जा सकता है, और बंद होने पर focus अपने-आप trigger पर restore हो जाता है
- focus restore करने वाला code जोड़ा नहीं गया, बल्कि हटाया गया
जहाँ Popover API अभी भी कमज़ोर है
-
tooltip timing
- नेटिव popover तुरंत खुलता और बंद होता है; अगर mouse थोड़ा तेज़ हिल जाए या trigger को बस छूकर निकल जाए, तो tooltip flicker करता है और unstable महसूस हो सकता है
- hover/focus और open होने के बीच delay control अभी भी ज़रूरी है
- default open/close behavior ब्राउज़र और HTML invoker commands संभालते हैं, और JavaScript सिर्फ intentional behavior refinement के लिए इस्तेमाल होता है, जैसे pointer tooltip की ओर जाए तो hide cancel करना
- CSS में भी इस क्षेत्र पर काम चल रहा है, और interest/invoker-related work ऐसी दिशा में बढ़ रहा है जहाँ entry/exit delays को सीधे CSS में व्यक्त किया जा सके
-
hover intent और Invoker Commands
- ब्राउज़र यह नहीं जान सकता कि किसी ने element पर hover क्यों किया — वह जानबूझकर था या pointer बस गुज़र रहा था, यह निर्णय नहीं कर सकता
- चूँकि invoker commands core open/close संभालते हैं, JavaScript अब interaction model का मालिक नहीं रहता, बल्कि उसके ऊपर सिर्फ intent जोड़ता है
- JavaScript अब सिर्फ ऐसे behaviors के लिए चाहिए जिन्हें ब्राउज़र infer नहीं कर सकता, जैसे hide से पहले छोटा delay, या pointer tooltip की ओर जाए तो dismiss cancel करना
-
Manual Popover और focus
popover="manual" में, auto popover के विपरीत, ब्राउज़र focus अपने-आप restore नहीं करता
- जब tooltip focus से खुले और blur से बंद हो, तब focus को trigger पर explicitly लौटाना पड़ता है
- यह platform behavior और user intent के बीच की स्पष्ट सीमा दिखाता है
-
ईमानदार आकलन
- Popover API tooltip को जादू की तरह पूरी तरह हल नहीं करता, लेकिन यह fragile infrastructure को बार-बार फिर से बनाने का काम रोक देता है
- JavaScript और edge cases अभी भी मौजूद हैं, लेकिन अब UI primitives को दोबारा बनाने के बजाय product problems हल करने पर ध्यान दिया जा सकता है
जहाँ tooltip library अभी भी ज़रूरी है
-
बड़े या mature design systems
- कई teams द्वारा इस्तेमाल होने वाले बड़े design systems में centralized behavior, documented patterns, और consistent defaults के लिए library एक व्यावहारिक विकल्प है
- underlying interaction model को बदलना सिर्फ technical decision नहीं, बल्कि organizational decision भी है
- accessibility की बारीकियों से कम परिचित team members के लिए guardrails देता है
-
complex positioning requirements
- अगर nested scroll containers के बीच collision detection, custom flipping logic, और offset/boundary की fine control चाहिए, तो Floating UI जैसी libraries अभी भी फ़ायदेमंद हैं
- CSS anchor positioning इस समस्या के बड़े हिस्से को कवर करना शुरू कर चुका है — pure CSS से trigger के सापेक्ष placement, viewport-aware placement, और edge flipping संभव है
- यह अभी नया feature है और known issues मौजूद हैं, लेकिन Interop में शामिल होने के कारण व्यापक और consistent browser support की संभावना है
- फिलहाल अगर consistent cross-browser behavior चाहिए, तो library एक व्यावहारिक विकल्प है
-
accessibility अनुभव कम होने वाली teams
- जिन teams में accessibility knowledge कम है, उनके लिए अच्छी library safety net का काम करती है — यह perfect accessibility की guarantee नहीं देती, लेकिन आम गलतियाँ रोक सकती है
- Popover API बेहतर defaults देता है, लेकिन role, labels, focus management, और testing को कब जोड़ना है यह जानना अभी भी ज़रूरी है
- समझ के बिना नेटिव tools का भी गलत इस्तेमाल हो सकता है
निष्कर्ष
- Popover API की वजह से tooltip अब simulate की जाने वाली चीज़ नहीं, बल्कि ब्राउज़र द्वारा समझा जाने वाला element बन गया है
- open, close, keyboard behavior,
Esc handling, और accessibility का बड़ा हिस्सा अब platform खुद प्रदान करता है
- complex design systems, high customization, और legacy constraints में libraries अभी भी उपयोगी हैं, लेकिन default बदल रहा है
- यह पहला ऐसा समय है जब सबसे simple tooltip ही सबसे सही tooltip भी हो सकता है
- अगर आप अपने product में सिर्फ एक tooltip को Popover API से replace करके देखें, तो आप देख पाएँगे कि code से क्या-क्या गायब हो जाता है
अभी कोई टिप्पणी नहीं है.