{"id":88703,"date":"2024-12-17T23:30:45","date_gmt":"2024-12-17T20:00:45","guid":{"rendered":"https:\/\/nabfollower.com\/blog\/building-a-realtime-eye-tracking-experience-with-supabase-and-webgazerjs-3llj\/"},"modified":"2024-12-17T23:30:45","modified_gmt":"2024-12-17T20:00:45","slug":"building-a-realtime-eye-tracking-experience-with-supabase-and-webgazerjs-3llj","status":"publish","type":"post","link":"https:\/\/nabfollower.com\/blog\/building-a-realtime-eye-tracking-experience-with-supabase-and-webgazerjs-3llj\/","title":{"rendered":"\u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u062a\u062c\u0631\u0628\u0647 \u0631\u062f\u06cc\u0627\u0628\u06cc \u0686\u0634\u0645 \u062f\u0631 \u0632\u0645\u0627\u0646 \u0648\u0627\u0642\u0639\u06cc \u0628\u0627 Supabase \u0648 WebGazer.js"},"content":{"rendered":"<p>Summarize this content to 400 words in Persian Lang<br \/>\n              TL;DR:<\/p>\n<p>\u0633\u0627\u062e\u062a\u0647 \u0634\u062f\u0647 \u0628\u0627 Supabase\u060c React\u060c WebGazer.js\u060c Motion One\u060c anime.js\u060c \u0635\u062f\u0627\u06cc \u067e\u0627\u06cc\u062f\u0627\u0631<br \/>\n\u0627\u0632 Supabase Realtime Presence &#038; Broadcast \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u062f (\u0627\u0635\u0644\u0627\u064b \u0627\u0632 \u062c\u062f\u0627\u0648\u0644 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0646\u0645\u06cc \u0634\u0648\u062f!)<br \/>\n\u0645\u062e\u0632\u0646 GitHub<br \/>\n\u0648\u0628 \u0633\u0627\u06cc\u062a<br \/>\n\u0648\u06cc\u062f\u0626\u0648\u06cc \u0646\u0645\u0627\u06cc\u0634\u06cc<\/p>\n<p>\u06cc\u06a9\u06cc \u062f\u06cc\u06af\u0631 \u0627\u0632 \u0647\u06a9\u0627\u062a\u0648\u0646 \u0647\u0627\u06cc \u0647\u0641\u062a\u0647 \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc Supabase \u0648 \u06cc\u06a9 \u067e\u0631\u0648\u0698\u0647 \u0622\u0632\u0645\u0627\u06cc\u0634\u06cc \u062f\u06cc\u06af\u0631 \u0628\u0647 \u0646\u0627\u0645 \u0628\u0647 \u067e\u0631\u062a\u06af\u0627\u0647 \u062e\u06cc\u0631\u0647 \u0634\u0648\u06cc\u062f. \u0627\u06cc\u0646 \u062f\u0631 \u0646\u0647\u0627\u06cc\u062a \u06cc\u06a9\u06cc \u0627\u0632 \u0633\u0627\u062f\u0647 \u062a\u0631\u06cc\u0646 \u0648 \u062f\u0631 \u0639\u06cc\u0646 \u062d\u0627\u0644 \u067e\u06cc\u0686\u06cc\u062f\u0647 \u062a\u0631\u06cc\u0646 \u067e\u0631\u0648\u0698\u0647 \u0647\u0627 \u0628\u0648\u062f. \u062e\u0648\u0634\u0628\u062e\u062a\u0627\u0646\u0647 \u0627\u062e\u06cc\u0631\u0627\u064b \u06a9\u0645\u06cc \u0627\u0632 \u0645\u06a9\u0627\u0646\u200c\u0646\u0645\u0627 \u0644\u0630\u062a \u0645\u06cc\u200c\u0628\u0631\u0645\u060c \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0686\u0646\u062f \u062f\u0633\u062a \u06cc\u0627\u0631\u06cc \u062f\u0627\u0634\u062a\u0645 \u062a\u0627 \u0627\u0632 \u067e\u0633 \u0622\u0646 \u0628\u0631 \u0628\u06cc\u0627\u06cc\u0645! \u0645\u0646 \u0647\u0645\u0686\u0646\u06cc\u0646 \u0645\u06cc \u062e\u0648\u0627\u0633\u062a\u0645 \u06cc\u06a9 \u0633\u0648\u0627\u0644 \u0631\u0627 \u062f\u0631 \u0630\u0647\u0646 \u062e\u0648\u062f \u062a\u0623\u06cc\u06cc\u062f \u06a9\u0646\u0645: \u0622\u06cc\u0627 \u0627\u0645\u06a9\u0627\u0646 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f\u061f \u0641\u0642\u0637 \u0648\u06cc\u0698\u06af\u06cc \u0647\u0627\u06cc \u0628\u06cc\u062f\u0631\u0646\u06af \u0627\u0632 Supabase \u0628\u062f\u0648\u0646 \u0647\u0631 \u062c\u062f\u0627\u0648\u0644 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647\u061f \u067e\u0627\u0633\u062e (\u0634\u0627\u06cc\u062f \u062a\u0627 \u062d\u062f\u0648\u062f\u06cc \u0648\u0627\u0636\u062d) \u0627\u06cc\u0646 \u0627\u0633\u062a: \u0628\u0644\u0647\u060c \u0628\u0644\u0647 \u0627\u06cc\u0646 \u0627\u0633\u062a (\u062f\u0648\u0633\u062a\u062a \u062f\u0627\u0631\u0645\u060c \u062a\u06cc\u0645 Realtime \u2665\ufe0f). \u067e\u0633 \u0628\u06cc\u0627\u06cc\u06cc\u062f \u06a9\u0645\u06cc \u0639\u0645\u06cc\u0642 \u062a\u0631 \u062f\u0631 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0641\u0631\u0648 \u0628\u0631\u0648\u06cc\u0645.<\/p>\n<p>\u0645\u0646 \u0641\u0642\u0637 \u06cc\u06a9 \u0631\u0648\u0632 \u0628\u0647 \u0637\u0648\u0631 \u062a\u0635\u0627\u062f\u0641\u06cc \u0641\u0642\u0637 \u0628\u0647 \u0646\u0642\u0644 \u0642\u0648\u0644 \u0646\u06cc\u0686\u0647 \u062f\u0631 \u0645\u0648\u0631\u062f \u067e\u0631\u062a\u06af\u0627\u0647 \u0641\u06a9\u0631 \u0645\u06cc \u06a9\u0631\u062f\u0645 \u0648 \u0627\u06cc\u0646\u06a9\u0647 \u062e\u0648\u0628 (\u0648 \u062c\u0627\u0644\u0628) \u0627\u0633\u062a \u06a9\u0647 \u0622\u0646 \u0631\u0627 \u0628\u0647 \u0646\u0648\u0639\u06cc \u062a\u062c\u0633\u0645 \u06a9\u0646\u0645: \u0634\u0645\u0627 \u0628\u0647 \u06cc\u06a9 \u0635\u0641\u062d\u0647 \u062a\u0627\u0631\u06cc\u06a9 \u062e\u06cc\u0631\u0647 \u0645\u06cc \u0634\u0648\u06cc\u062f \u0648 \u0686\u06cc\u0632\u06cc \u0628\u0647 \u0634\u0645\u0627 \u062e\u06cc\u0631\u0647 \u0645\u06cc \u0634\u0648\u062f. \u0647\u06cc\u0686 \u0686\u06cc\u0632 \u062e\u06cc\u0644\u06cc \u0628\u06cc\u0634\u062a\u0631 \u0627\u0632 \u0622\u0646!<\/p>\n<p>\u062f\u0631 \u0627\u0628\u062a\u062f\u0627 \u0627\u06cc\u0646 \u0627\u06cc\u062f\u0647 \u0631\u0627 \u062f\u0627\u0634\u062a\u0645 \u06a9\u0647 \u0627\u0632 Three.js \u0628\u0631\u0627\u06cc \u0633\u0627\u062e\u062a\u0646 \u0627\u06cc\u0646 \u067e\u0631\u0648\u0698\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u0645\u060c \u0628\u0627 \u0627\u06cc\u0646 \u062d\u0627\u0644 \u0645\u062a\u0648\u062c\u0647 \u0634\u062f\u0645 \u06a9\u0647 \u0627\u06cc\u0646 \u0628\u062f\u0627\u0646 \u0645\u0639\u0646\u0627\u0633\u062a \u06a9\u0647 \u0628\u0627\u06cc\u062f \u062f\u0627\u0631\u0627\u06cc\u06cc \u0647\u0627\u06cc \u0631\u0627\u06cc\u06af\u0627\u0646 \u0628\u0631\u0627\u06cc \u0686\u0634\u0645(\u0647\u0627\u06cc) \u0633\u0647 \u0628\u0639\u062f\u06cc \u0627\u06cc\u062c\u0627\u062f \u06cc\u0627 \u067e\u06cc\u062f\u0627 \u06a9\u0646\u0645. \u0645\u0646 \u062a\u0635\u0645\u06cc\u0645 \u06af\u0631\u0641\u062a\u0645 \u06a9\u0647 \u06a9\u0645\u06cc \u0632\u06cc\u0627\u062f \u0627\u0633\u062a\u060c \u0628\u0647 \u062e\u0635\u0648\u0635 \u06a9\u0647 \u0632\u0645\u0627\u0646 \u0632\u06cc\u0627\u062f\u06cc \u0628\u0631\u0627\u06cc \u06a9\u0627\u0631 \u0631\u0648\u06cc \u062e\u0648\u062f \u067e\u0631\u0648\u0698\u0647 \u0646\u062f\u0627\u0634\u062a\u0645 \u0648 \u0628\u0647 \u062c\u0627\u06cc \u0622\u0646 \u062a\u0635\u0645\u06cc\u0645 \u06af\u0631\u0641\u062a\u0645 \u0622\u0646 \u0631\u0627 \u0628\u0647 \u0635\u0648\u0631\u062a \u062f\u0648 \u0628\u0639\u062f\u06cc \u0628\u0627 SVG \u0627\u0646\u062c\u0627\u0645 \u062f\u0647\u0645.<\/p>\n<p>\u0647\u0645\u0686\u0646\u06cc\u0646 \u0646\u0645\u06cc\u200c\u062e\u0648\u0627\u0633\u062a\u0645 \u0641\u0642\u0637 \u0628\u0635\u0631\u06cc \u0628\u0627\u0634\u062f: \u0628\u0627 \u0628\u0631\u062e\u06cc \u0635\u062f\u0627\u0647\u0627 \u0646\u06cc\u0632 \u062a\u062c\u0631\u0628\u0647 \u0628\u0647\u062a\u0631\u06cc \u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f. \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0628\u0647 \u0627\u06cc\u0646 \u0641\u06a9\u0631 \u0627\u0641\u062a\u0627\u062f\u0645 \u06a9\u0647 \u0627\u06af\u0631 \u0634\u0631\u06a9\u062a\u200c\u06a9\u0646\u0646\u062f\u06af\u0627\u0646 \u0628\u062a\u0648\u0627\u0646\u0646\u062f \u0628\u0627 \u0645\u06cc\u06a9\u0631\u0648\u0641\u0648\u0646 \u0635\u062d\u0628\u062a \u06a9\u0646\u0646\u062f \u0648 \u062f\u06cc\u06af\u0631\u0627\u0646 \u0628\u062a\u0648\u0627\u0646\u0646\u062f \u0622\u0646 \u0631\u0627 \u0628\u0647\u200c\u0639\u0646\u0648\u0627\u0646 \u0632\u0645\u0632\u0645\u0647\u200c\u0647\u0627\u06cc \u0646\u0627\u0645\u0646\u0627\u0633\u0628 \u06cc\u0627 \u0628\u0627\u062f\u0647\u0627\u06cc\u06cc \u06a9\u0647 \u062f\u0631 \u062d\u0627\u0644 \u0639\u0628\u0648\u0631 \u0647\u0633\u062a\u0646\u062f \u0628\u0634\u0646\u0648\u0646\u062f\u060c \u0628\u0633\u06cc\u0627\u0631 \u0639\u0627\u0644\u06cc \u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f. \u0628\u0627 \u0627\u06cc\u0646 \u062d\u0627\u0644\u060c \u0627\u06cc\u0646 \u0628\u0633\u06cc\u0627\u0631 \u0686\u0627\u0644\u0634 \u0628\u0631\u0627\u0646\u06af\u06cc\u0632 \u0634\u062f \u0648 \u062a\u0635\u0645\u06cc\u0645 \u06af\u0631\u0641\u062a\u0645 \u0622\u0646 \u0631\u0627 \u0628\u0647 \u0637\u0648\u0631 \u06a9\u0627\u0645\u0644 \u06a9\u0646\u0627\u0631 \u0628\u06af\u0630\u0627\u0631\u0645 \u0632\u06cc\u0631\u0627 \u0646\u062a\u0648\u0627\u0646\u0633\u062a\u0645 WebAudio \u0648 WebRTC \u0631\u0627 \u0628\u0647 \u062e\u0648\u0628\u06cc \u0628\u0647 \u0647\u0645 \u0645\u062a\u0635\u0644 \u06a9\u0646\u0645. \u0645\u0646 \u06cc\u06a9 \u062c\u0632\u0621 \u0628\u0627\u0642\u06cc\u0645\u0627\u0646\u062f\u0647 \u062f\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u06a9\u062f \u062f\u0627\u0631\u0645 \u06a9\u0647 \u0628\u0647 \u0645\u06cc\u06a9\u0631\u0648\u0641\u0648\u0646 \u0645\u062d\u0644\u06cc \u06af\u0648\u0634 \u0645\u06cc \u062f\u0647\u062f \u0648 \u0627\u06af\u0631 \u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u062f \u0646\u06af\u0627\u0647\u06cc \u0628\u06cc\u0646\u062f\u0627\u0632\u06cc\u062f\u060c &#8220;\u0635\u062f\u0627\u06cc \u0628\u0627\u062f&#8221; \u0631\u0627 \u0628\u0631\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631 \u0641\u0639\u0644\u06cc \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u06a9\u0646\u062f. \u0634\u0627\u06cc\u062f \u062f\u0631 \u0622\u06cc\u0646\u062f\u0647 \u0686\u06cc\u0632\u06cc \u0627\u0636\u0627\u0641\u0647 \u0634\u0648\u062f\u061f<\/p>\n<p>  \u0627\u062a\u0627\u0642 \u0647\u0627\u06cc \u0628\u06cc\u062f\u0631\u0646\u06af<\/p>\n<p>\u0642\u0628\u0644 \u0627\u0632 \u06a9\u0627\u0631 \u0631\u0648\u06cc \u0647\u0631 \u0686\u06cc\u0632 \u0628\u0635\u0631\u06cc\u060c \u0645\u06cc\u200c\u062e\u0648\u0627\u0633\u062a\u0645 \u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u0628\u06cc\u062f\u0631\u0646\u06af \u0631\u0627 \u06a9\u0647 \u062f\u0631 \u0630\u0647\u0646 \u062f\u0627\u0634\u062a\u0645 \u0622\u0632\u0645\u0627\u06cc\u0634 \u06a9\u0646\u0645. \u0627\u0632 \u0622\u0646\u062c\u0627\u06cc\u06cc \u06a9\u0647 \u062f\u0631 \u0648\u06cc\u0698\u06af\u06cc \u0628\u0644\u0627\u062f\u0631\u0646\u06af \u0645\u062d\u062f\u0648\u062f\u06cc\u062a\u200c\u0647\u0627\u06cc\u06cc \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f\u060c \u0645\u06cc\u200c\u062e\u0648\u0627\u0633\u062a\u0645 \u0627\u06cc\u0646 \u0648\u06cc\u0698\u06af\u06cc \u06a9\u0627\u0631 \u06a9\u0646\u062f:<\/p>\n<p>\u062d\u062f\u0627\u06a9\u062b\u0631 \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f. 10 \u0634\u0631\u06a9\u062a \u06a9\u0646\u0646\u062f\u0647 \u062f\u0631 \u06cc\u06a9 \u06a9\u0627\u0646\u0627\u0644 \u062f\u0631 \u06cc\u06a9 \u0632\u0645\u0627\u0646<\/p>\n<p>\u0628\u0647 \u0627\u06cc\u0646 \u0645\u0639\u0646\u06cc \u06a9\u0647 \u0627\u06af\u0631 \u06a9\u0627\u0646\u0627\u0644 \u067e\u0631 \u0627\u0633\u062a\u060c \u0628\u0627\u06cc\u062f \u0628\u0647 \u06cc\u06a9 \u06a9\u0627\u0646\u0627\u0644 \u062c\u062f\u06cc\u062f \u0628\u067e\u06cc\u0648\u0646\u062f\u06cc\u062f<\/p>\n<p>\u0634\u0645\u0627 \u0641\u0642\u0637 \u0628\u0627\u06cc\u062f \u0686\u0634\u0645 \u0633\u0627\u06cc\u0631 \u0634\u0631\u06a9\u062a \u06a9\u0646\u0646\u062f\u06af\u0627\u0646 \u0631\u0627 \u0628\u0628\u06cc\u0646\u06cc\u062f<\/p>\n<p>\u0628\u0631\u0627\u06cc \u0627\u06cc\u0646 \u0645\u0646 \u0622\u0645\u062f\u0645 \u0628\u0627 \u06cc\u06a9 useEffect \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u062c\u0627\u06cc\u06cc \u06a9\u0647 \u0628\u0647 \u0635\u0648\u0631\u062a \u0628\u0627\u0632\u06af\u0634\u062a\u06cc \u0628\u0647 \u06cc\u06a9 \u06a9\u0627\u0646\u0627\u0644 \u0628\u06cc\u062f\u0631\u0646\u06af \u0645\u0627\u0646\u0646\u062f \u0627\u06cc\u0646 \u0645\u06cc \u067e\u06cc\u0648\u0646\u062f\u062f:<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0627\u06cc\u0646 joinRoom \u062f\u0631 \u062f\u0627\u062e\u0644 \u0632\u0646\u062f\u06af\u06cc \u0645\u06cc \u06a9\u0646\u062f useEffect \u0642\u0644\u0627\u0628 \u0648 \u0647\u0646\u06af\u0627\u0645\u06cc \u06a9\u0647 \u062c\u0632\u0621 \u0627\u062a\u0627\u0642 \u0646\u0635\u0628 \u0634\u062f\u0647 \u0628\u0627\u0634\u062f \u0641\u0631\u0627\u062e\u0648\u0627\u0646\u06cc \u0645\u06cc \u0634\u0648\u062f. \u06cc\u06a9\u06cc \u0627\u0632 \u0646\u06a9\u0627\u062a\u06cc \u06a9\u0647 \u0647\u0646\u06af\u0627\u0645 \u06a9\u0627\u0631 \u0628\u0631 \u0631\u0648\u06cc \u0627\u06cc\u0646 \u0648\u06cc\u0698\u06af\u06cc \u0645\u062a\u0648\u062c\u0647 \u0634\u062f\u0645 \u0627\u06cc\u0646 \u0628\u0648\u062f \u06a9\u0647 currentPresences param \u0647\u06cc\u0686 \u0645\u0642\u062f\u0627\u0631\u06cc \u062f\u0631 \u0622\u0646 \u0646\u062f\u0627\u0631\u062f join \u0631\u0648\u06cc\u062f\u0627\u062f \u062d\u062a\u06cc \u0627\u06af\u0631 \u062f\u0631 \u062f\u0633\u062a\u0631\u0633 \u0628\u0627\u0634\u062f. \u0645\u0646 \u0645\u0637\u0645\u0626\u0646 \u0646\u06cc\u0633\u062a\u0645 \u06a9\u0647 \u0627\u06cc\u0646 \u06cc\u06a9 \u0627\u0634\u06a9\u0627\u0644 \u062f\u0631 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0627\u0633\u062a \u06cc\u0627 \u0647\u0645\u0627\u0646\u0637\u0648\u0631 \u06a9\u0647 \u062f\u0631 \u0646\u0638\u0631 \u06af\u0631\u0641\u062a\u0647 \u0634\u062f\u0647 \u06a9\u0627\u0631 \u0645\u06cc \u06a9\u0646\u062f. \u0627\u0632 \u0627\u06cc\u0646 \u0631\u0648 \u0646\u06cc\u0627\u0632 \u0628\u0647 \u0627\u0646\u062c\u0627\u0645 \u06cc\u06a9 \u06a9\u062a\u0627\u0628\u0686\u0647 \u0631\u0627\u0647\u0646\u0645\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631 room.presenceState \u0648\u0627\u06a9\u0634\u06cc \u06a9\u0646\u06cc\u062f \u062a\u0627 \u0647\u0631 \u0632\u0645\u0627\u0646 \u06a9\u0647 \u06a9\u0627\u0631\u0628\u0631 \u0645\u06cc\u200c\u067e\u06cc\u0648\u0646\u062f\u062f\u060c \u062a\u0639\u062f\u0627\u062f \u0634\u0631\u06a9\u062a\u200c\u06a9\u0646\u0646\u062f\u06af\u0627\u0646 \u062f\u0631 \u0627\u062a\u0627\u0642 \u0631\u0627 \u062f\u0631\u06cc\u0627\u0641\u062a \u06a9\u0646\u06cc\u062f.<\/p>\n<p>\u062a\u0639\u062f\u0627\u062f \u0634\u0631\u06a9\u062a\u200c\u06a9\u0646\u0646\u062f\u06af\u0627\u0646 \u0631\u0627 \u0628\u0631\u0631\u0633\u06cc \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645 \u0648 \u06cc\u0627 \u0627\u0634\u062a\u0631\u0627\u06a9 \u0627\u062a\u0627\u0642 \u0641\u0639\u0644\u06cc \u0631\u0627 \u0644\u063a\u0648 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645 \u0648 \u0633\u0639\u06cc \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645 \u0628\u0647 \u0627\u062a\u0627\u0642 \u062f\u06cc\u06af\u0631\u06cc \u0628\u067e\u06cc\u0648\u0646\u062f\u06cc\u0645\u060c \u06cc\u0627 \u0633\u067e\u0633 \u0628\u0647 \u0627\u062a\u0627\u0642 \u0641\u0639\u0644\u06cc \u0627\u062f\u0627\u0645\u0647 \u0645\u06cc\u200c\u062f\u0647\u06cc\u0645. \u0645\u0627 \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0631\u0627 \u062f\u0631 join \u0631\u0648\u06cc\u062f\u0627\u062f \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 sync \u062e\u06cc\u0644\u06cc \u062f\u06cc\u0631 \u0645\u06cc \u0634\u0648\u062f (\u0628\u0639\u062f \u0627\u0632 \u0622\u0646 \u0634\u0631\u0648\u0639 \u0645\u06cc \u0634\u0648\u062f join \u06cc\u0627 leave \u0631\u0648\u06cc\u062f\u0627\u062f\u0647\u0627).<\/p>\n<p>\u0645\u0646 \u0627\u06cc\u0646 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0631\u0627 \u0628\u0627 \u0628\u0627\u0632 \u06a9\u0631\u062f\u0646 \u062a\u0639\u062f\u0627\u062f \u0632\u06cc\u0627\u062f\u06cc \u062a\u0628 \u062f\u0631 \u0645\u0631\u0648\u0631\u06af\u0631\u0645 \u0622\u0632\u0645\u0627\u06cc\u0634 \u06a9\u0631\u062f\u0645 \u0648 \u0628\u0647 \u0646\u0638\u0631 \u0645\u06cc \u0631\u0633\u06cc\u062f \u06a9\u0647 \u0647\u0645\u0647 \u0645\u062a\u0648\u0631\u0645 \u0634\u062f\u0647 \u0627\u0646\u062f!<\/p>\n<p>\u0628\u0639\u062f \u0627\u0632 \u0622\u0646 \u0645\u06cc \u062e\u0648\u0627\u0633\u062a\u0645 \u0631\u0627\u0647 \u062d\u0644 \u0631\u0627 \u0628\u0627 \u0628\u0647 \u0631\u0648\u0632 \u0631\u0633\u0627\u0646\u06cc \u0645\u0648\u0642\u0639\u06cc\u062a \u0645\u0627\u0648\u0633 \u0627\u0634\u06a9\u0627\u0644 \u0632\u062f\u0627\u06cc\u06cc \u06a9\u0646\u0645 \u0648 \u0628\u0647 \u0633\u0631\u0639\u062a \u0628\u0627 \u0645\u0634\u06a9\u0644\u0627\u062a \u0627\u0631\u0633\u0627\u0644 \u067e\u06cc\u0627\u0645 \u0647\u0627\u06cc \u0632\u06cc\u0627\u062f \u062f\u0631 \u06a9\u0627\u0646\u0627\u0644 \u0645\u0648\u0627\u062c\u0647 \u0634\u062f\u0645! \u0631\u0627\u0647 \u062d\u0644: \u062a\u0645\u0627\u0633 \u0647\u0627 \u0631\u0627 \u06a9\u0627\u0647\u0634 \u062f\u0647\u06cc\u062f.<\/p>\n<p>\/**<br \/>\n * Creates a throttled version of a function that can only be called at most once<br \/>\n * in the specified time period.<br \/>\n *\/<br \/>\nfunction createThrottledFunction&lt;T extends (&#8230;args: unknown[]) =&gt; unknown&gt;(<br \/>\n  functionToThrottle: T,<br \/>\n  waitTimeMs: number<br \/>\n): (&#8230;args: Parameters&lt;T&gt;) =&gt; void {<br \/>\n  let isWaitingToExecute = false<\/p>\n<p>  return function throttledFunction(&#8230;args: Parameters&lt;T&gt;) {<br \/>\n    if (!isWaitingToExecute) {<br \/>\n      functionToThrottle.apply(this, args)<br \/>\n      isWaitingToExecute = true<br \/>\n      setTimeout(() =&gt; {<br \/>\n        isWaitingToExecute = false<br \/>\n      }, waitTimeMs)<br \/>\n    }<br \/>\n  }<br \/>\n}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0645\u06a9\u0627\u0646 \u0646\u0645\u0627 \u0628\u0627 \u0627\u06cc\u0646 \u0633\u0627\u0632\u0646\u062f\u0647 \u0639\u0645\u0644\u06a9\u0631\u062f \u06a9\u0648\u0686\u06a9 \u062f\u0631\u06cc\u0686\u0647 \u06af\u0627\u0632 \u0622\u0645\u062f \u0648 \u0645\u0646 \u0627\u0632 \u0622\u0646 \u0628\u0627 \u067e\u062e\u0634 \u0647\u0627\u06cc \u0631\u062f\u06cc\u0627\u0628\u06cc \u0686\u0634\u0645 \u0645\u0627\u0646\u0646\u062f \u0632\u06cc\u0631 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0631\u062f\u0645:<\/p>\n<p>const throttledBroadcast = createThrottledFunction((data: EyeTrackingData) =&gt; {<br \/>\n  if (currentChannel) {<br \/>\n    currentChannel.send({<br \/>\n      type: &#8216;broadcast&#8217;,<br \/>\n      event: &#8216;eye_tracking&#8217;,<br \/>\n      payload: data<br \/>\n    })<br \/>\n  }<br \/>\n}, THROTTLE_MS)<\/p>\n<p>throttledBroadcast({<br \/>\n userId: userId.current,<br \/>\n isBlinking: isCurrentlyBlinking,<br \/>\n gazeX,<br \/>\n gazeY<br \/>\n})<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0627\u06cc\u0646 \u062e\u06cc\u0644\u06cc \u06a9\u0645\u06a9 \u06a9\u0631\u062f! \u0647\u0645\u0686\u0646\u06cc\u0646\u060c \u062f\u0631 \u0646\u0633\u062e\u0647 \u0647\u0627\u06cc \u0627\u0648\u0644\u06cc\u0647\u060c \u067e\u06cc\u0627\u0645 \u0647\u0627\u06cc \u0631\u062f\u06cc\u0627\u0628\u06cc \u0686\u0634\u0645 \u0631\u0627 \u062f\u0627\u0634\u062a\u0645 presence \u0628\u0627 \u0627\u06cc\u0646 \u062d\u0627\u0644 broadcast \u0628\u0647 \u067e\u06cc\u0627\u0645\u200c\u0647\u0627\u06cc \u0628\u06cc\u0634\u062a\u0631\u06cc \u062f\u0631 \u062b\u0627\u0646\u06cc\u0647 \u0627\u062c\u0627\u0632\u0647 \u0645\u06cc\u200c\u062f\u0647\u062f\u060c \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0628\u0647 \u062c\u0627\u06cc \u0622\u0646 \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u0631\u0627 \u0628\u0647 \u0622\u0646 \u062a\u063a\u06cc\u06cc\u0631 \u062f\u0627\u062f\u0645. \u0627\u06cc\u0646 \u0628\u0647 \u0648\u06cc\u0698\u0647 \u062f\u0631 \u0631\u062f\u06cc\u0627\u0628\u06cc \u0686\u0634\u0645 \u0628\u0633\u06cc\u0627\u0631 \u0645\u0647\u0645 \u0627\u0633\u062a \u0632\u06cc\u0631\u0627 \u062f\u0648\u0631\u0628\u06cc\u0646 \u0647\u0645\u06cc\u0634\u0647 \u0647\u0645\u0647 \u0686\u06cc\u0632 \u0631\u0627 \u0636\u0628\u0637 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>  \u0631\u062f\u06cc\u0627\u0628\u06cc \u0686\u0634\u0645<\/p>\n<p>\u0632\u0645\u0627\u0646\u06cc \u06a9\u0647 \u0628\u0631\u0627\u06cc \u0627\u0648\u0644\u06cc\u0646 \u0628\u0627\u0631 \u0627\u06cc\u062f\u0647 \u0627\u06cc\u0646 \u067e\u0631\u0648\u0698\u0647 \u0631\u0627 \u062f\u0627\u0634\u062a\u0645\u060c \u0628\u0627 WebGazer.js \u0628\u0631\u062e\u0648\u0631\u062f \u06a9\u0631\u062f\u0645. \u0627\u06cc\u0646 \u06cc\u06a9 \u067e\u0631\u0648\u0698\u0647 \u0628\u0633\u06cc\u0627\u0631 \u062c\u0627\u0644\u0628 \u0627\u0633\u062a \u0648 \u0628\u0647 \u0637\u0631\u0632 \u0634\u06af\u0641\u062a \u0627\u0646\u06af\u06cc\u0632\u06cc \u062e\u0648\u0628 \u06a9\u0627\u0631 \u0645\u06cc \u06a9\u0646\u062f!<\/p>\n<p>\u06a9\u0644 \u0642\u0627\u0628\u0644\u06cc\u062a \u0647\u0627\u06cc \u0631\u062f\u06cc\u0627\u0628\u06cc \u0686\u0634\u0645 \u062f\u0631 \u06cc\u06a9 \u0639\u0645\u0644\u06a9\u0631\u062f \u062f\u0631 \u06cc\u06a9 \u0627\u0646\u062c\u0627\u0645 \u0645\u06cc \u0634\u0648\u062f useEffect \u0642\u0644\u0627\u0628:<\/p>\n<p>    window.webgazer<br \/>\n      .setGazeListener(async (data: any) =&gt; {<br \/>\n        if (data == null || !currentChannel || !ctxRef.current) return<\/p>\n<p>        try {<br \/>\n          \/\/ Get normalized gaze coordinates<br \/>\n          const gazeX = data.x \/ windowSize.width<br \/>\n          const gazeY = data.y \/ windowSize.height<\/p>\n<p>          \/\/ Get video element<br \/>\n          const videoElement = document.getElementById(&#8216;webgazerVideoFeed&#8217;) as HTMLVideoElement<br \/>\n          if (!videoElement) {<br \/>\n            console.error(&#8216;WebGazer video element not found&#8217;)<br \/>\n            return<br \/>\n          }<\/p>\n<p>          \/\/ Set canvas size to match video<br \/>\n          imageCanvasRef.current.width = videoElement.videoWidth<br \/>\n          imageCanvasRef.current.height = videoElement.videoHeight<\/p>\n<p>          \/\/ Draw current frame to canvas<br \/>\n          ctxRef.current?.drawImage(videoElement, 0, 0)<\/p>\n<p>          \/\/ Get eye patches<br \/>\n          const tracker = window.webgazer.getTracker()<br \/>\n          const patches = await tracker.getEyePatches(<br \/>\n            videoElement,<br \/>\n            imageCanvasRef.current,<br \/>\n            videoElement.videoWidth,<br \/>\n            videoElement.videoHeight<br \/>\n          )<\/p>\n<p>          if (!patches?.right?.patch?.data || !patches?.left?.patch?.data) {<br \/>\n            console.error(&#8216;No eye patches detected&#8217;)<br \/>\n            return<br \/>\n          }<\/p>\n<p>          \/\/ Calculate brightness for each eye<br \/>\n          const calculateBrightness = (imageData: ImageData) =&gt; {<br \/>\n            let total = 0<\/p>\n<p>            for (let i = 0; i &lt; imageData.data.length; i += 16) {<br \/>\n              \/\/ Convert RGB to grayscale<br \/>\n              const r = imageData.data[i]\n              const g = imageData.data[i + 1]\n              const b = imageData.data[i + 2]\n              total += (r + g + b) \/ 3<br \/>\n            }<br \/>\n            return total \/ (imageData.width * imageData.height \/ 4)<br \/>\n          }<\/p>\n<p>          const rightEyeBrightness = calculateBrightness(patches.right.patch)<br \/>\n          const leftEyeBrightness = calculateBrightness(patches.left.patch)<br \/>\n          const avgBrightness = (rightEyeBrightness + leftEyeBrightness) \/ 2<\/p>\n<p>          \/\/ Update rolling average<br \/>\n          if (brightnessSamples.current.length &gt;= SAMPLES_SIZE) {<br \/>\n            brightnessSamples.current.shift() \/\/ Remove oldest sample<br \/>\n          }<br \/>\n          brightnessSamples.current.push(avgBrightness)<\/p>\n<p>          \/\/ Calculate dynamic threshold from rolling average<br \/>\n          const rollingAverage = brightnessSamples.current.reduce((a, b) =&gt; a + b, 0) \/ brightnessSamples.current.length<br \/>\n          const dynamicThreshold = rollingAverage * THRESHOLD_MULTIPLIER<br \/>\n          \/\/ Detect blink using dynamic threshold<br \/>\n          const blinkDetected = avgBrightness &gt; dynamicThreshold<\/p>\n<p>          \/\/ Debounce blink detection to avoid rapid changes<br \/>\n          if (blinkDetected !== isCurrentlyBlinking) {<br \/>\n            const now = Date.now()<br \/>\n            if (now &#8211; lastBlinkTime &gt; 100) { \/\/ Minimum time between blink state changes<br \/>\n              isCurrentlyBlinking = blinkDetected<br \/>\n              lastBlinkTime = now<br \/>\n            }<br \/>\n          }<\/p>\n<p>          \/\/ Use throttled broadcast instead of direct send<br \/>\n          throttledBroadcast({<br \/>\n            userId: userId.current,<br \/>\n            isBlinking: isCurrentlyBlinking,<br \/>\n            gazeX,<br \/>\n            gazeY<br \/>\n          })<\/p>\n<p>        } catch (error) {<br \/>\n          console.error(&#8216;Error processing gaze data:&#8217;, error)<br \/>\n        }<br \/>\n      })<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u062f\u0631\u06cc\u0627\u0641\u062a \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0627\u0632 \u062c\u0627\u06cc\u06cc \u06a9\u0647 \u06a9\u0627\u0631\u0628\u0631 \u0628\u0647 \u0622\u0646 \u0646\u06af\u0627\u0647 \u0645\u06cc \u06a9\u0646\u062f \u0633\u0627\u062f\u0647 \u0627\u0633\u062a \u0648 \u0645\u0627\u0646\u0646\u062f \u06af\u0631\u0641\u062a\u0646 \u0645\u0648\u0642\u0639\u06cc\u062a \u0647\u0627\u06cc \u0645\u0627\u0648\u0633 \u0631\u0648\u06cc \u0635\u0641\u062d\u0647 \u0639\u0645\u0644 \u0645\u06cc \u06a9\u0646\u062f. \u0628\u0627 \u0627\u06cc\u0646 \u062d\u0627\u0644\u060c \u0645\u0646 \u0647\u0645\u0686\u0646\u06cc\u0646 \u0645\u06cc\u200c\u062e\u0648\u0627\u0633\u062a\u0645 \u062a\u0634\u062e\u06cc\u0635 \u067e\u0644\u06a9 \u0632\u062f\u0646 \u0631\u0627 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 (\u06cc\u06a9 \u0648\u06cc\u0698\u06af\u06cc \u062c\u0627\u0644\u0628) \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u0645\u060c \u06a9\u0647 \u0646\u06cc\u0627\u0632 \u0628\u0647 \u067e\u0631\u0634 \u0627\u0632 \u0645\u06cc\u0627\u0646 \u062d\u0644\u0642\u0647\u200c\u0647\u0627 \u062f\u0627\u0634\u062a.<\/p>\n<p>\u0647\u0646\u06af\u0627\u0645\u06cc \u06a9\u0647 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 WebGazer \u0631\u0627 \u062f\u0631 \u06af\u0648\u06af\u0644 \u062c\u0633\u062a\u062c\u0648 \u0645\u06cc \u06a9\u0646\u06cc\u062f \u0648 \u062a\u0634\u062e\u06cc\u0635 \u0686\u0634\u0645\u06a9 \u0645\u06cc \u0632\u0646\u06cc\u062f\u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0628\u0631\u062e\u06cc \u0627\u0632 \u0628\u0627\u0632\u0645\u0627\u0646\u062f\u0647 \u0647\u0627\u06cc \u0627\u062c\u0631\u0627\u06cc \u0627\u0648\u0644\u06cc\u0647 \u0631\u0627 \u0645\u0634\u0627\u0647\u062f\u0647 \u06a9\u0646\u06cc\u062f. \u0645\u062b\u0644 \u0627\u06cc\u0646\u06a9\u0647 \u06a9\u062f\u0647\u0627\u06cc \u0646\u0638\u0631 \u062f\u0627\u062f\u0647 \u0634\u062f\u0647 \u062f\u0631 \u0645\u0646\u0628\u0639 \u062d\u062a\u06cc \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f. \u0645\u062a\u0623\u0633\u0641\u0627\u0646\u0647 \u0627\u06cc\u0646 \u0646\u0648\u0639 \u0642\u0627\u0628\u0644\u06cc\u062a \u0647\u0627 \u062f\u0631 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u062e\u0627\u0631\u062c \u0646\u0645\u06cc \u0634\u0648\u0646\u062f. \u0634\u0645\u0627 \u0628\u0627\u06cc\u062f \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0631\u0627 \u0628\u0647 \u0635\u0648\u0631\u062a \u062f\u0633\u062a\u06cc \u0627\u0646\u062c\u0627\u0645 \u062f\u0647\u06cc\u062f.<\/p>\n<p>\u067e\u0633 \u0627\u0632 \u0622\u0632\u0645\u0648\u0646 \u0648 \u062e\u0637\u0627\u06cc \u0641\u0631\u0627\u0648\u0627\u0646\u060c \u0645\u0646 \u0648 \u0645\u06a9\u0627\u0646\u200c\u0646\u0645\u0627 \u062a\u0648\u0627\u0646\u0633\u062a\u06cc\u0645 \u0631\u0627\u0647\u200c\u062d\u0644\u06cc \u0627\u0631\u0627\u0626\u0647 \u06a9\u0646\u06cc\u0645 \u06a9\u0647 \u067e\u06cc\u06a9\u0633\u0644\u200c\u0647\u0627 \u0648 \u0633\u0637\u0648\u062d \u0631\u0648\u0634\u0646\u0627\u06cc\u06cc \u0631\u0627 \u0627\u0632 \u062f\u0627\u062f\u0647\u200c\u0647\u0627\u06cc \u067e\u0686 \u0686\u0634\u0645 \u0645\u062d\u0627\u0633\u0628\u0647 \u0645\u06cc\u200c\u06a9\u0646\u062f \u062a\u0627 \u0645\u0634\u062e\u0635 \u0634\u0648\u062f \u06a9\u0627\u0631\u0628\u0631 \u0686\u0647 \u0632\u0645\u0627\u0646\u06cc \u0686\u0634\u0645\u06a9 \u0645\u06cc\u200c\u0632\u0646\u062f. \u0647\u0645\u0686\u0646\u06cc\u0646 \u062f\u0627\u0631\u0627\u06cc \u0628\u0631\u062e\u06cc \u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u0646\u0648\u0631 \u067e\u0648\u06cc\u0627 \u0627\u0633\u062a \u0632\u06cc\u0631\u0627 \u0645\u062a\u0648\u062c\u0647 \u0634\u062f\u0645 \u06a9\u0647 (\u062d\u062f\u0627\u0642\u0644 \u0628\u0631\u0627\u06cc \u0645\u0646) \u0648\u0628 \u06a9\u0645 \u0628\u0633\u062a\u0647 \u0628\u0647 \u0646\u0648\u0631 \u0634\u0645\u0627 \u0647\u0645\u06cc\u0634\u0647 \u062a\u0634\u062e\u06cc\u0635 \u0646\u0645\u06cc \u062f\u0647\u062f \u06a9\u0647 \u0634\u0645\u0627 \u0686\u0647 \u0632\u0645\u0627\u0646\u06cc \u0686\u0634\u0645\u06a9 \u0645\u06cc \u0632\u0646\u06cc\u062f. \u0628\u0631\u0627\u06cc \u0645\u0646\u060c \u0647\u0631 \u0686\u0647 \u062a\u0635\u0648\u06cc\u0631\/\u0627\u062a\u0627\u0642 \u0645\u0646 \u0631\u0648\u0634\u0646\u200c\u062a\u0631 \u0628\u0627\u0634\u062f\u060c \u0628\u062f\u062a\u0631 \u06a9\u0627\u0631 \u0645\u06cc\u200c\u06a9\u0646\u062f \u0648 \u062f\u0631 \u0646\u0648\u0631 \u062a\u0627\u0631\u06cc\u06a9\u200c\u062a\u0631 \u0628\u0647\u062a\u0631 \u0639\u0645\u0644 \u0645\u06cc\u200c\u06a9\u0646\u062f.<\/p>\n<p>\u0647\u0646\u06af\u0627\u0645 \u0627\u0634\u06a9\u0627\u0644 \u0632\u062f\u0627\u06cc\u06cc \u0642\u0627\u0628\u0644\u06cc\u062a \u0647\u0627\u06cc \u0631\u062f\u06cc\u0627\u0628\u06cc \u0686\u0634\u0645 (WebGazer \u062f\u0627\u0631\u0627\u06cc \u0648\u06cc\u0698\u06af\u06cc \u0647\u0627\u06cc \u0628\u0633\u06cc\u0627\u0631 \u062e\u0648\u0628\u06cc \u0627\u0633\u062a .setPredictionPoints \u062a\u0645\u0627\u0633\u06cc \u06a9\u0647 \u06cc\u06a9 \u0646\u0642\u0637\u0647 \u0642\u0631\u0645\u0632 \u0631\u0627 \u0631\u0648\u06cc \u0635\u0641\u062d\u0647 \u0646\u0645\u0627\u06cc\u0634 \u0645\u06cc \u062f\u0647\u062f \u062a\u0627 \u062c\u0627\u06cc\u06cc \u06a9\u0647 \u0634\u0645\u0627 \u0628\u0647 \u0622\u0646 \u0646\u06af\u0627\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u062f \u062a\u062c\u0633\u0645 \u06a9\u0646\u06cc\u062f)\u060c \u0645\u062a\u0648\u062c\u0647 \u0634\u062f\u0645 \u06a9\u0647 \u0631\u062f\u06cc\u0627\u0628\u06cc \u062e\u06cc\u0644\u06cc \u062f\u0642\u06cc\u0642 \u0646\u06cc\u0633\u062a. \u0645\u06af\u0631 \u0627\u06cc\u0646\u06a9\u0647 \u0622\u0646 \u0631\u0627 \u06a9\u0627\u0644\u06cc\u0628\u0631\u0647 \u06a9\u0646\u06cc\u062f \u06a9\u0627\u0631\u06cc \u06a9\u0647 \u067e\u0631\u0648\u0698\u0647 \u0627\u0632 \u0634\u0645\u0627 \u0645\u06cc \u062e\u0648\u0627\u0647\u062f \u0642\u0628\u0644 \u0627\u0632 \u067e\u06cc\u0648\u0633\u062a\u0646 \u0628\u0647 \u0647\u0631 \u0627\u062a\u0627\u0642\u06cc \u0627\u0646\u062c\u0627\u0645 \u062f\u0647\u06cc\u062f.<\/p>\n<p>const startCalibration = useCallback(() =&gt; {<br \/>\n    const points: CalibrationPoint[] = [<br \/>\n      { x: 0.1, y: 0.1 },<br \/>\n      { x: 0.9, y: 0.1 },<br \/>\n      { x: 0.5, y: 0.5 },<br \/>\n      { x: 0.1, y: 0.9 },<br \/>\n      { x: 0.9, y: 0.9 },<br \/>\n    ]\n    setCalibrationPoints(points)<br \/>\n    setCurrentPoint(0)<br \/>\n    setIsCalibrating(true)<\/p>\n<p>    window.webgazer.clearData()<br \/>\n  }, [])<\/p>\n<p>  const handleCalibrationClick = useCallback((event: React.MouseEvent) =&gt; {<br \/>\n    if (!isCalibrating) return<\/p>\n<p>    \/\/ Record click location for calibration<br \/>\n    const x = event.clientX<br \/>\n    const y = event.clientY<br \/>\n    window.webgazer.recordScreenPosition(x, y, &#8216;click&#8217;)<\/p>\n<p>    if (currentPoint &lt; calibrationPoints.length &#8211; 1) {<br \/>\n      setCurrentPoint(prev =&gt; prev + 1)<br \/>\n    } else {<br \/>\n      setIsCalibrating(false)<br \/>\n      setHasCalibrated(true)<br \/>\n    }<br \/>\n  }, [isCalibrating, currentPoint, calibrationPoints.length])<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>            {calibrationPoints.map((point, index) =&gt; (<\/p>\n<p>            ))}<\/p>\n<p>              Click the red dot to calibrate ({currentPoint + 1}\/{calibrationPoints.length})<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0627\u0633\u0627\u0633\u0627\u064b \u0645\u0627 5 \u0646\u0642\u0637\u0647 \u0631\u0627 \u0631\u0648\u06cc \u0635\u0641\u062d\u0647 \u0646\u0645\u0627\u06cc\u0634 \u0645\u06cc\u200c\u062f\u0647\u06cc\u0645: \u06cc\u06a9\u06cc \u062f\u0631 \u0647\u0631 \u06af\u0648\u0634\u0647 \u0648 \u062f\u06cc\u06af\u0631\u06cc \u062f\u0631 \u0645\u0631\u06a9\u0632. \u0628\u0627 \u06a9\u0644\u06cc\u06a9 \u06a9\u0631\u062f\u0646 \u0631\u0648\u06cc \u0622\u0646\u0647\u0627 \u0645\u0648\u0642\u0639\u06cc\u062a \u0635\u0641\u062d\u0647 \u062f\u0631 WebGazer \u062b\u0628\u062a \u0645\u06cc \u0634\u0648\u062f \u062a\u0627 \u0628\u062a\u0648\u0627\u0646\u062f \u0645\u062f\u0644 \u0631\u0627 \u06a9\u0645\u06cc \u0628\u0647\u062a\u0631 \u062a\u0646\u0638\u06cc\u0645 \u06a9\u0646\u062f \u062a\u0627 \u062c\u0627\u06cc\u06cc \u06a9\u0647 \u0628\u0647 \u062f\u0646\u0628\u0627\u0644 \u0622\u0646 \u0647\u0633\u062a\u06cc\u062f \u0631\u0627 \u067e\u06cc\u0634 \u0628\u06cc\u0646\u06cc \u06a9\u0646\u062f. \u0645\u0645\u06a9\u0646 \u0627\u0633\u062a \u062a\u0639\u062c\u0628 \u06a9\u0646\u06cc\u062f \u06a9\u0647 \u0627\u06cc\u0646 \u06a9\u0644\u06cc\u06a9 \u062f\u0631 \u0648\u0627\u0642\u0639 \u0686\u0647 \u06a9\u0627\u0631\u06cc \u0627\u0646\u062c\u0627\u0645 \u0645\u06cc \u062f\u0647\u062f \u0648 \u0642\u0633\u0645\u062a \u062e\u0646\u062f\u0647 \u062f\u0627\u0631 \u0627\u06cc\u0646 \u0627\u0633\u062a \u06a9\u0647 \u0634\u0645\u0627 \u062f\u0631 \u0648\u0627\u0642\u0639 \u0628\u0647 \u062c\u0627\u06cc\u06cc \u06a9\u0647 \u06a9\u0644\u06cc\u06a9 \u0645\u06cc \u06a9\u0646\u06cc\u062f \u0646\u06af\u0627\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u062f\u060c \u062f\u0631\u0633\u062a \u0627\u0633\u062a\u061f \u0648 \u0628\u0627 \u0627\u0646\u062c\u0627\u0645 \u0627\u06cc\u0646 \u06a9\u0627\u0631\u060c WebGazer \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u062d\u0631\u06a9\u0627\u062a \u0686\u0634\u0645 \u0634\u0645\u0627 \u0631\u0627 \u06a9\u0645\u06cc \u0628\u0647\u062a\u0631 \u067e\u0631\u062f\u0627\u0632\u0634 \u06a9\u0646\u062f \u0648 \u0646\u062a\u0627\u06cc\u062c \u062f\u0642\u06cc\u0642 \u062a\u0631\u06cc \u0627\u0631\u0627\u0626\u0647 \u062f\u0647\u062f. \u062e\u06cc\u0644\u06cc \u0628\u0627\u062d\u0627\u0644\u0647<\/p>\n<p>  \u0686\u0634\u0645<\/p>\n<p>\u0645\u0646 \u0642\u0628\u0644\u0627\u064b \u06cc\u06a9 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc SVG \u0633\u0627\u062f\u0647 \u0628\u0631\u0627\u06cc \u0686\u0634\u0645 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u0647 \u0628\u0648\u062f\u0645 \u0648 \u0622\u0646 \u0631\u0627 \u0628\u0647 \u0631\u062f\u06cc\u0627\u0628\u06cc \u0645\u062a\u0635\u0644 \u06a9\u0631\u062f\u0647 \u0628\u0648\u062f\u0645\u060c \u0628\u0627 \u0627\u06cc\u0646 \u062d\u0627\u0644 \u0628\u0627\u06cc\u062f \u06a9\u0645\u06cc \u0628\u06cc\u0634\u062a\u0631 \u062a\u0644\u0637\u06cc\u0641 \u0634\u0648\u062f. \u062f\u0631 \u0632\u06cc\u0631 \u06a9\u0645\u06cc \u0646\u062d\u0648\u0647 \u0638\u0627\u0647\u0631 \u0622\u0646 \u0631\u0627 \u0645\u0634\u0627\u0647\u062f\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u062f. \u0627\u0644\u0647\u0627\u0645 \u0628\u062e\u0634 Alucard Eyes \u062a\u0648\u0633\u0637 MIKELopez \u0628\u0648\u062f.<\/p>\n<p>\u0627\u06cc\u0646 \u06cc\u06a9 \u0646\u0633\u062e\u0647 \u0642\u0628\u0644\u06cc \u0627\u0632 \u0686\u0634\u0645 \u0627\u0633\u062a\u060c \u0627\u0645\u0627 \u062a\u0642\u0631\u06cc\u0628\u0627\u064b 95\u066a \u062f\u0631 \u0622\u0646\u062c\u0627 \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f. \u0645\u0646 \u0627\u06cc\u0646 \u0648\u06cc\u062f\u06cc\u0648 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0632\u0648\u062c \u062f\u0648\u0633\u062a\u0627\u0646\u0645 \u0641\u0631\u0633\u062a\u0627\u062f\u0645 \u0648 \u0622\u0646\u0647\u0627 \u0641\u06a9\u0631 \u06a9\u0631\u062f\u0646\u062f \u0628\u0633\u06cc\u0627\u0631 \u062c\u0627\u0644\u0628 \u0627\u0633\u062a\u060c \u0628\u0647 \u062e\u0635\u0648\u0635 \u0648\u0642\u062a\u06cc \u0645\u06cc \u062f\u0627\u0646\u0633\u062a\u0646\u062f \u06a9\u0647 \u062f\u0631 \u0648\u0627\u0642\u0639 \u062d\u0631\u06a9\u0627\u062a \u0686\u0634\u0645 \u0634\u0645\u0627 \u0631\u0627 \u062f\u0646\u0628\u0627\u0644 \u0645\u06cc \u06a9\u0646\u062f! \u0647\u0645\u0686\u0646\u06cc\u0646 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0646\u0642\u0637\u0647 \u067e\u06cc\u0634\u200c\u0628\u06cc\u0646\u06cc WebGazer \u0631\u0627 \u062f\u0631 \u062d\u0627\u0644 \u062d\u0631\u06a9\u062a \u0631\u0648\u06cc \u0635\u0641\u062d\u0647 \u0645\u0634\u0627\u0647\u062f\u0647 \u06a9\u0646\u06cc\u062f.<\/p>\n<p>\u06a9\u0627\u0645\u067e\u0648\u0646\u0646\u062a \u0686\u0634\u0645 \u062e\u0648\u062f \u06cc\u06a9 SVG \u0628\u0627 \u062a\u0639\u062f\u0627\u062f\u06cc \u0627\u0646\u06cc\u0645\u06cc\u0634\u0646 \u0645\u0633\u06cc\u0631 \u0627\u0632 \u0637\u0631\u06cc\u0642 Motion \u0627\u0633\u062a.<\/p>\n<p>      &lt;svg<br \/>\n        className={`w-full h-full self-${alignment} max-w-[350px] max-h-[235px]`}<br \/>\n        viewBox=&#8221;-50 0 350 235&#8243;<br \/>\n        preserveAspectRatio=&#8221;xMidYMid meet&#8221;<br \/>\n      &gt;<br \/>\n        {\/* Definitions for gradients and filters *\/}<br \/>\n        &lt;defs&gt;<br \/>\n          &lt;filter id=&#8221;pupil-blur&#8221;&gt;<br \/>\n            &lt;feGaussianBlur stdDeviation=&#8221;0.75&#8243; \/&gt;<br \/>\n          filter&gt;<br \/>\n          &lt;radialGradient id=&#8221;eyeball-gradient&#8221;&gt;<br \/>\n            &lt;stop offset=&#8221;60%&#8221; stopColor=&#8221;#dcdae0&#8243; \/&gt;<br \/>\n            &lt;stop offset=&#8221;100%&#8221; stopColor=&#8221;#a8a7ad&#8221; \/&gt;<br \/>\n          radialGradient&gt;<br \/>\n          &lt;radialGradient<br \/>\n            id=&#8221;pupil-gradient&#8221;<br \/>\n            cx=&#8221;0.35&#8243;<br \/>\n            cy=&#8221;0.35&#8243;<br \/>\n            r=&#8221;0.65&#8243;<br \/>\n          &gt;<br \/>\n            &lt;stop offset=&#8221;0%&#8221; stopColor=&#8221;#444&#8243; \/&gt;<br \/>\n            &lt;stop offset=&#8221;75%&#8221; stopColor=&#8221;#000&#8243; \/&gt;<br \/>\n            &lt;stop offset=&#8221;100%&#8221; stopColor=&#8221;#000&#8243; \/&gt;<br \/>\n          radialGradient&gt;<br \/>\n          &lt;radialGradient<br \/>\n            id=&#8221;corner-gradient-left&#8221;<br \/>\n            cx=&#8221;0.3&#8243;<br \/>\n            cy=&#8221;0.5&#8243;<br \/>\n            r=&#8221;0.25&#8243;<br \/>\n            gradientUnits=&#8221;objectBoundingBox&#8221;<br \/>\n          &gt;<br \/>\n            &lt;stop offset=&#8221;0%&#8221; stopColor=&#8221;rgba(0,0,0,0.75)&#8221; \/&gt;<br \/>\n            &lt;stop offset=&#8221;100%&#8221; stopColor=&#8221;rgba(0,0,0,0)&#8221; \/&gt;<br \/>\n          radialGradient&gt;<\/p>\n<p>          &lt;radialGradient<br \/>\n            id=&#8221;corner-gradient-right&#8221;<br \/>\n            cx=&#8221;0.7&#8243;<br \/>\n            cy=&#8221;0.5&#8243;<br \/>\n            r=&#8221;0.25&#8243;<br \/>\n            gradientUnits=&#8221;objectBoundingBox&#8221;<br \/>\n          &gt;<br \/>\n            &lt;stop offset=&#8221;0%&#8221; stopColor=&#8221;rgba(0,0,0,0.75)&#8221; \/&gt;<br \/>\n            &lt;stop offset=&#8221;100%&#8221; stopColor=&#8221;rgba(0,0,0,0)&#8221; \/&gt;<br \/>\n          radialGradient&gt;<\/p>\n<p>          &lt;filter id=&#8221;filter0_f_302_14&#8243; x=&#8221;-25&#8243; y=&#8221;0&#8243; width=&#8221;320&#8243; height=&#8221;150&#8243; filterUnits=&#8221;userSpaceOnUse&#8221; colorInterpolationFilters=&#8221;sRGB&#8221;&gt;<br \/>\n            &lt;feGaussianBlur stdDeviation=&#8221;4.1&#8243; result=&#8221;effect1_foregroundBlur_302_14&#8243;\/&gt;<br \/>\n          filter&gt;<br \/>\n          &lt;filter id=&#8221;filter1_f_302_14&#8243; x=&#8221;-25&#8243; y=&#8221;85&#8243; width=&#8221;320&#8243; height=&#8221;150&#8243; filterUnits=&#8221;userSpaceOnUse&#8221; colorInterpolationFilters=&#8221;sRGB&#8221;&gt;<br \/>\n            &lt;feGaussianBlur stdDeviation=&#8221;4.1&#8243; result=&#8221;effect1_foregroundBlur_302_14&#8243;\/&gt;<br \/>\n          filter&gt;<br \/>\n          &lt;filter id=&#8221;filter2_f_302_14&#8243; x=&#8221;-50&#8243; y=&#8221;-30&#8243; width=&#8221;400&#8243; height=&#8221;170&#8243; filterUnits=&#8221;userSpaceOnUse&#8221; colorInterpolationFilters=&#8221;sRGB&#8221;&gt;<br \/>\n            &lt;feGaussianBlur stdDeviation=&#8221;7.6&#8243; result=&#8221;effect1_foregroundBlur_302_14&#8243;\/&gt;<br \/>\n          filter&gt;<br \/>\n          &lt;filter id=&#8221;filter3_f_302_14&#8243; x=&#8221;-50&#8243; y=&#8221;95&#8243; width=&#8221;400&#8243; height=&#8221;170&#8243; filterUnits=&#8221;userSpaceOnUse&#8221; colorInterpolationFilters=&#8221;sRGB&#8221;&gt;<br \/>\n            &lt;feGaussianBlur stdDeviation=&#8221;7.6&#8243; result=&#8221;effect1_foregroundBlur_302_14&#8243;\/&gt;<br \/>\n          filter&gt;<br \/>\n          &lt;filter id=&#8221;filter4_f_302_14&#8243; x=&#8221;0&#8243; y=&#8221;-20&#8243; width=&#8221;260&#8243; height=&#8221;150&#8243; filterUnits=&#8221;userSpaceOnUse&#8221; colorInterpolationFilters=&#8221;sRGB&#8221;&gt;<br \/>\n            &lt;feGaussianBlur stdDeviation=&#8221;3.35&#8243; result=&#8221;effect1_foregroundBlur_302_14&#8243;\/&gt;<br \/>\n          filter&gt;<br \/>\n          &lt;filter id=&#8221;filter5_f_302_14&#8243; x=&#8221;0&#8243; y=&#8221;105&#8243; width=&#8221;260&#8243; height=&#8221;150&#8243; filterUnits=&#8221;userSpaceOnUse&#8221; colorInterpolationFilters=&#8221;sRGB&#8221;&gt;<br \/>\n            &lt;feGaussianBlur stdDeviation=&#8221;3.35&#8243; result=&#8221;effect1_foregroundBlur_302_14&#8243;\/&gt;<br \/>\n          filter&gt;<br \/>\n        defs&gt;<\/p>\n<p>        {\/* Eyeball *\/}<br \/>\n        &lt;ellipse<br \/>\n          cx=&#8221;131&#8243;<br \/>\n          cy=&#8221;117.5&#8243;<br \/>\n          rx=&#8221;100&#8243;<br \/>\n          ry=&#8221;65&#8243;<br \/>\n          fill=&#8221;url(#eyeball-gradient)&#8221;<br \/>\n        \/&gt;<\/p>\n<p>        {\/* After the main eyeball ellipse but before the eyelids, add the corner shadows *\/}<br \/>\n        &lt;ellipse<br \/>\n          cx=&#8221;50&#8243;<br \/>\n          cy=&#8221;117.5&#8243;<br \/>\n          rx=&#8221;50&#8243;<br \/>\n          ry=&#8221;90&#8243;<br \/>\n          fill=&#8221;url(#corner-gradient-left)&#8221;<br \/>\n        \/&gt;<\/p>\n<p>        &lt;ellipse<br \/>\n          cx=&#8221;205&#8243;<br \/>\n          cy=&#8221;117.5&#8243;<br \/>\n          rx=&#8221;50&#8243;<br \/>\n          ry=&#8221;90&#8243;<br \/>\n          fill=&#8221;url(#corner-gradient-right)&#8221;<br \/>\n        \/&gt;<\/p>\n<p>        {\/* Corner reflections &#8211; repositioned diagonally *\/}<br \/>\n        &lt;circle<br \/>\n          cx={45}<br \/>\n          cy={135}<br \/>\n          r=&#8221;1.5&#8243;<br \/>\n          fill=&#8221;white&#8221;<br \/>\n          className=&#8221;opacity-60&#8243;<br \/>\n        \/&gt;<br \/>\n        &lt;circle<br \/>\n          cx={215}<br \/>\n          cy={100}<br \/>\n          r=&#8221;2&#8243;<br \/>\n          fill=&#8221;white&#8221;<br \/>\n          className=&#8221;opacity-60&#8243;<br \/>\n        \/&gt;<\/p>\n<p>        {\/* Smaller companion reflections &#8211; repositioned diagonally *\/}<br \/>\n        &lt;circle<br \/>\n          cx={35}<br \/>\n          cy={120}<br \/>\n          r=&#8221;1&#8243;<br \/>\n          fill=&#8221;white&#8221;<br \/>\n          className=&#8221;opacity-40&#8243;<br \/>\n        \/&gt;<br \/>\n        &lt;circle<br \/>\n          cx={222}<br \/>\n          cy={110}<br \/>\n          r=&#8221;1.5&#8243;<br \/>\n          fill=&#8221;white&#8221;<br \/>\n          className=&#8221;opacity-40&#8243;<br \/>\n        \/&gt;<\/p>\n<p>        {\/* Pupil group with animations *\/}<br \/>\n        &lt;motion.g<br \/>\n          variants={pupilVariants}<br \/>\n          animate={isBlinking ? &#8220;hidden&#8221; : &#8220;visible&#8221;}<br \/>\n        &gt;<br \/>\n          {\/* Pupil *\/}<br \/>\n          &lt;motion.ellipse<br \/>\n            cx={131}<br \/>\n            cy={117.5}<br \/>\n            rx=&#8221;50&#8243;<br \/>\n            ry=&#8221;50&#8243;<br \/>\n            fill=&#8221;url(#pupil-gradient)&#8221;<br \/>\n            filter=&#8221;url(#pupil-blur)&#8221;<br \/>\n            animate={{<br \/>\n              cx: 131 + pupilOffsetX,<br \/>\n              cy: 117.5 + pupilOffsetY<br \/>\n            }}<br \/>\n            transition={{<br \/>\n              type: &#8220;spring&#8221;,<br \/>\n              stiffness: 400,<br \/>\n              damping: 30<br \/>\n            }}<br \/>\n          \/&gt;<\/p>\n<p>          {\/* Light reflections *\/}<br \/>\n          &lt;motion.circle<br \/>\n            cx={111}<br \/>\n            cy={102.5}<br \/>\n            r=&#8221;5&#8243;<br \/>\n            fill=&#8221;white&#8221;<br \/>\n            animate={{<br \/>\n              cx: 111 + pupilOffsetX,<br \/>\n              cy: 102.5 + pupilOffsetY<br \/>\n            }}<br \/>\n            transition={{<br \/>\n              type: &#8220;spring&#8221;,<br \/>\n              stiffness: 400,<br \/>\n              damping: 30<br \/>\n            }}<br \/>\n          \/&gt;<br \/>\n          &lt;motion.circle<br \/>\n            cx={124}<br \/>\n            cy={102.5}<br \/>\n            r=&#8221;3&#8243;<br \/>\n            fill=&#8221;white&#8221;<br \/>\n            animate={{<br \/>\n              cx: 124 + pupilOffsetX,<br \/>\n              cy: 102.5 + pupilOffsetY<br \/>\n            }}<br \/>\n            transition={{<br \/>\n              type: &#8220;spring&#8221;,<br \/>\n              stiffness: 400,<br \/>\n              damping: 30<br \/>\n            }}<br \/>\n          \/&gt;<br \/>\n        motion.g&gt;<\/p>\n<p>        {\/* Upper eyelid *\/}<br \/>\n        &lt;motion.path<br \/>\n          custom={true}<br \/>\n          variants={eyelidVariants}<br \/>\n          animate={isBlinking ? &#8220;closed&#8221; : &#8220;open&#8221;}<br \/>\n          fill=&#8221;#000&#8243;<br \/>\n        \/&gt;<\/p>\n<p>        {\/* Lower eyelid *\/}<br \/>\n        &lt;motion.path<br \/>\n          custom={false}<br \/>\n          variants={eyelidVariants}<br \/>\n          animate={isBlinking ? &#8220;closed&#8221; : &#8220;open&#8221;}<br \/>\n          fill=&#8221;#000&#8243;<br \/>\n        \/&gt;<\/p>\n<p>        {\/* Top blurred lines *\/}<br \/>\n        &lt;g filter=&#8221;url(#filter0_f_302_14)&#8221;&gt;<br \/>\n          &lt;motion.path<br \/>\n            custom={true}<br \/>\n            variants={blurredLineVariants}<br \/>\n            animate={isBlinking ? &#8220;closed&#8221; : &#8220;open&#8221;}<br \/>\n            stroke=&#8221;#2A2A2A&#8221;<br \/>\n            strokeWidth=&#8221;5&#8243;<br \/>\n            strokeLinecap=&#8221;round&#8221;<br \/>\n          \/&gt;<br \/>\n        g&gt;<br \/>\n        &lt;g filter=&#8221;url(#filter2_f_302_14)&#8221;&gt;<br \/>\n          &lt;motion.path<br \/>\n            custom={true}<br \/>\n            variants={outerBlurredLineVariants}<br \/>\n            animate={isBlinking ? &#8220;closed&#8221; : &#8220;open&#8221;}<br \/>\n            stroke=&#8221;#777777&#8243;<br \/>\n            strokeWidth=&#8221;5&#8243;<br \/>\n            strokeLinecap=&#8221;round&#8221;<br \/>\n          \/&gt;<br \/>\n        g&gt;<br \/>\n        &lt;g filter=&#8221;url(#filter4_f_302_14)&#8221;&gt;<br \/>\n          &lt;motion.path<br \/>\n            custom={true}<br \/>\n            variants={arcLineVariants}<br \/>\n            animate={isBlinking ? &#8220;closed&#8221; : &#8220;open&#8221;}<br \/>\n            stroke=&#8221;#838383&#8243;<br \/>\n            strokeWidth=&#8221;5&#8243;<br \/>\n            strokeLinecap=&#8221;round&#8221;<br \/>\n          \/&gt;<br \/>\n        g&gt;<\/p>\n<p>        {\/* Bottom blurred lines *\/}<br \/>\n        &lt;g filter=&#8221;url(#filter1_f_302_14)&#8221;&gt;<br \/>\n          &lt;motion.path<br \/>\n            variants={bottomBlurredLineVariants}<br \/>\n            animate={isBlinking ? &#8220;closed&#8221; : &#8220;open&#8221;}<br \/>\n            stroke=&#8221;#2A2A2A&#8221;<br \/>\n            strokeWidth=&#8221;5&#8243;<br \/>\n            strokeLinecap=&#8221;round&#8221;<br \/>\n          \/&gt;<br \/>\n        g&gt;<br \/>\n        &lt;g filter=&#8221;url(#filter3_f_302_14)&#8221;&gt;<br \/>\n          &lt;motion.path<br \/>\n            variants={bottomOuterBlurredLineVariants}<br \/>\n            animate={isBlinking ? &#8220;closed&#8221; : &#8220;open&#8221;}<br \/>\n            stroke=&#8221;#777777&#8243;<br \/>\n            strokeWidth=&#8221;5&#8243;<br \/>\n            strokeLinecap=&#8221;round&#8221;<br \/>\n          \/&gt;<br \/>\n        g&gt;<br \/>\n        &lt;g filter=&#8221;url(#filter5_f_302_14)&#8221;&gt;<br \/>\n          &lt;motion.path<br \/>\n            variants={bottomArcLineVariants}<br \/>\n            animate={isBlinking ? &#8220;closed&#8221; : &#8220;open&#8221;}<br \/>\n            stroke=&#8221;#838383&#8243;<br \/>\n            strokeWidth=&#8221;5&#8243;<br \/>\n            strokeLinecap=&#8221;round&#8221;<br \/>\n          \/&gt;<br \/>\n        g&gt;<br \/>\n      svg&gt;<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0645\u06a9\u0627\u0646 \u0646\u0645\u0627 \u0628\u0647 \u0637\u0631\u0632 \u0634\u06af\u0641\u062a \u0627\u0646\u06af\u06cc\u0632\u06cc \u0628\u0627 \u0645\u0633\u06cc\u0631\u0647\u0627\u06cc SVG \u06a9\u0627\u0631 \u0645\u06cc \u06a9\u0646\u062f. \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0645\u062b\u0627\u0644\u060c \u0627\u0646\u06cc\u0645\u06cc\u0634\u0646 \u0628\u0633\u062a\u0646 \u067e\u0644\u06a9 \u0627\u0633\u0627\u0633\u0627\u064b \u0628\u0627 \u0635\u0627\u0641 \u06a9\u0631\u062f\u0646 \u06cc\u06a9 \u0645\u0633\u06cc\u0631 \u0645\u0646\u062d\u0646\u06cc \u0627\u0646\u062c\u0627\u0645 \u0645\u06cc \u0634\u0648\u062f. \u0645\u0646 \u0628\u0647 \u062a\u0627\u0632\u06af\u06cc \u0645\u0633\u06cc\u0631 \u0631\u0627 \u062f\u0631 \u0648\u06cc\u0631\u0627\u06cc\u0634\u06af\u0631 \u0647\u0627\u06cc\u0644\u0627\u06cc\u062a \u06a9\u0631\u062f\u0647 \u0628\u0648\u062f\u0645\u060c \u0622\u0646 \u0631\u0627 \u062f\u0631 Composer \u0686\u0633\u0628\u0627\u0646\u062f\u0647 \u0628\u0648\u062f\u0645 \u0648 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0631\u062f\u0645 \u0627\u0646\u06cc\u0645\u06cc\u0634\u0646\u06cc \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u0645 \u06a9\u0647 \u0646\u0642\u0627\u0637 \u0631\u0627 \u0635\u0627\u0641 \u06a9\u0646\u062f \u062a\u0627 \u0686\u0634\u0645 \u062f\u0631 \u062d\u0627\u0644 \u0628\u0633\u062a\u0647 \u0634\u062f\u0646\/\u067e\u0644\u06a9 \u0632\u062f\u0646 \u0628\u0647 \u0646\u0638\u0631 \u0628\u0631\u0633\u062f. <\/p>\n<p>  \/\/ Define the open and closed states for both eyelids<br \/>\n  const upperLidOpen = &#8220;M128.5 53.5C59.3 55.5 33 99.6667 28.5 121.5H0V0L261.5 0V121.5H227.5C214.7 65.1 156.167 52.6667 128.5 53.5Z&#8221;<br \/>\n  const upperLidClosed = &#8220;M128.5 117.5C59.3 117.5 33 117.5 28.5 117.5H0V0L261.5 0V117.5H227.5C214.7 117.5 156.167 117.5 128.5 117.5Z&#8221;<\/p>\n<p>  const lowerLidOpen = &#8220;M128.5 181C59.3 179 33 134.833 28.5 113H0V234.5H261.5V113H227.5C214.7 169.4 156.167 181.833 128.5 181Z&#8221;<br \/>\n  const lowerLidClosed = &#8220;M128.5 117.5C59.3 117.5 33 117.5 28.5 117.5H0V234.5H261.5V117.5H227.5C214.7 117.5 156.167 117.5 128.5 117.5Z&#8221;<\/p>\n<p>  \/\/ Animation variants for the eyelids<br \/>\n  const eyelidVariants = {<br \/>\n    open: (isUpper: boolean) =&gt; ({<br \/>\n      d: isUpper ? upperLidOpen : lowerLidOpen,<br \/>\n      transition: {<br \/>\n        duration: 0.4,<br \/>\n        ease: &#8220;easeOut&#8221;<br \/>\n      }<br \/>\n    }),<br \/>\n    closed: (isUpper: boolean) =&gt; ({<br \/>\n      d: isUpper ? upperLidClosed : lowerLidClosed,<br \/>\n      transition: {<br \/>\n        duration: 0.15,<br \/>\n        ease: &#8220;easeIn&#8221;<br \/>\n      }<br \/>\n    })<br \/>\n  }<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u062f\u06cc\u062f\u0646 \u0627\u06cc\u0646 \u062f\u0631 \u0639\u0645\u0644 \u062a\u062c\u0631\u0628\u0647 \u0628\u0633\u06cc\u0627\u0631 \u062c\u0627\u0644\u0628\u06cc \u0628\u0648\u062f! \u0645\u0646 \u0647\u0645\u06cc\u0646 \u0631\u0648\u06cc\u06a9\u0631\u062f \u0631\u0627 \u0628\u0631\u0627\u06cc \u062e\u0637\u0648\u0637 \u0627\u0637\u0631\u0627\u0641 \u0627\u0639\u0645\u0627\u0644 \u06a9\u0631\u062f\u0645 \u0648 \u0628\u0647 \u0645\u06a9\u0627\u0646\u200c\u0646\u0645\u0627 \u062f\u0633\u062a\u0648\u0631 \u062f\u0627\u062f\u0645 \u06a9\u0647 \u0622\u0646\u0647\u0627 \u0631\u0627 \u0628\u0647 \u0633\u0645\u062a \u0645\u0631\u06a9\u0632 &#8220;\u062c\u0645\u0639 \u06a9\u0646\u062f&#8221;: \u06a9\u0647 \u062a\u0642\u0631\u06cc\u0628\u0627\u064b \u0628\u0627 \u06cc\u06a9 \u062d\u0631\u06a9\u062a \u0627\u0646\u062c\u0627\u0645 \u0634\u062f!<\/p>\n<p>\u0633\u067e\u0633 \u0686\u0634\u0645\u200c\u0647\u0627 \u062f\u0631 \u06cc\u06a9 \u0634\u0628\u06a9\u0647 CSS \u0633\u0627\u062f\u0647 \u0628\u0627 \u0633\u0644\u0648\u0644\u200c\u0647\u0627\u06cc \u062a\u0631\u0627\u0632 \u0634\u062f\u0647 \u0628\u0647\u200c\u06af\u0648\u0646\u0647\u200c\u0627\u06cc \u0646\u0645\u0627\u06cc\u0634 \u062f\u0627\u062f\u0647 \u0645\u06cc\u200c\u0634\u0648\u0646\u062f \u06a9\u0647 \u06cc\u06a9 \u0627\u062a\u0627\u0642 \u06a9\u0627\u0645\u0644 \u0634\u0628\u06cc\u0647 \u06cc\u06a9 \u0686\u0634\u0645 \u0628\u0632\u0631\u06af \u0628\u0647 \u0646\u0638\u0631 \u0628\u0631\u0633\u062f.<\/p>\n<p>&lt;div className=&#8221;fixed inset-0 grid grid-cols-3 grid-rows-3 gap-4 p-8 md:gap-2 md:p-4 lg:max-w-6xl lg:mx-auto&#8221;&gt;<br \/>\n          {Object.entries(roomState.participants).map(([key, presences]) =&gt; {<br \/>\n            const participant = presences[0]\n            const eyeData = eyeTrackingState[key]\n            if (key === userId.current) return null<\/p>\n<p>            return (<br \/>\n              &lt;div<br \/>\n                key={key}<br \/>\n                className={`flex items-center justify-center ${getGridClass(participant.position)}`}<br \/>\n              &gt;<br \/>\n                &lt;Eyes<br \/>\n                  isBlinking={eyeData?.isBlinking ?? false}<br \/>\n                  gazeX={eyeData?.gazeX ?? 0.5}<br \/>\n                  gazeY={eyeData?.gazeY ?? 0.5}<br \/>\n                  alignment={getEyeAlignment(participant.position)}<br \/>\n                \/&gt;<br \/>\n              &lt;\/div&gt;<br \/>\n            )<br \/>\n          })}<br \/>\n        &lt;\/div&gt;<\/p>\n<p>\/\/ Helper function to convert position to Tailwind grid classes<br \/>\nfunction getGridClass(position: string): string {<br \/>\n  switch (position) {<br \/>\n    case &#8216;center&#8217;: return &#8216;col-start-2 row-start-2&#8217;<br \/>\n    case &#8216;middleLeft&#8217;: return &#8216;col-start-1 row-start-2&#8217;<br \/>\n    case &#8216;middleRight&#8217;: return &#8216;col-start-3 row-start-2&#8217;<br \/>\n    case &#8216;topCenter&#8217;: return &#8216;col-start-2 row-start-1&#8217;<br \/>\n    case &#8216;bottomCenter&#8217;: return &#8216;col-start-2 row-start-3&#8217;<br \/>\n    case &#8216;topLeft&#8217;: return &#8216;col-start-1 row-start-1&#8217;<br \/>\n    case &#8216;topRight&#8217;: return &#8216;col-start-3 row-start-1&#8217;<br \/>\n    case &#8216;bottomLeft&#8217;: return &#8216;col-start-1 row-start-3&#8217;<br \/>\n    case &#8216;bottomRight&#8217;: return &#8216;col-start-3 row-start-3&#8217;<br \/>\n    default: return &#8216;col-start-2 row-start-2&#8217;<br \/>\n  }<br \/>\n}<\/p>\n<p>function getEyeAlignment(position: string): &#8216;start&#8217; | &#8216;center&#8217; | &#8216;end&#8217; {<br \/>\n  switch (position) {<br \/>\n    case &#8216;topLeft&#8217;:<br \/>\n    case &#8216;topRight&#8217;:<br \/>\n      return &#8216;end&#8217;<br \/>\n    case &#8216;bottomLeft&#8217;:<br \/>\n    case &#8216;bottomRight&#8217;:<br \/>\n      return &#8216;start&#8217;<br \/>\n    default:<br \/>\n      return &#8216;center&#8217;<br \/>\n  }<br \/>\n}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>  \u0644\u0645\u0633 \u0647\u0627\u06cc \u0646\u0647\u0627\u06cc\u06cc<\/p>\n<p>\u0633\u067e\u0633 \u0686\u0646\u062f \u0635\u0641\u062d\u0647 \u0646\u0645\u0627\u06cc\u0634 \u0645\u0642\u062f\u0645\u0627\u062a\u06cc \u0632\u06cc\u0628\u0627 \u0648 \u0645\u0648\u0633\u06cc\u0642\u06cc \u067e\u0633\u200c\u0632\u0645\u06cc\u0646\u0647 \u0628\u0632\u0646\u06cc\u062f \u0648 \u067e\u0631\u0648\u0698\u0647 \u062e\u0648\u0628 \u0627\u0633\u062a!<\/p>\n<p>\u0647\u0646\u06af\u0627\u0645\u06cc \u06a9\u0647 \u0634\u0645\u0627 \u0631\u0648\u06cc \u0686\u06cc\u0632\u0647\u0627\u06cc\u06cc \u0645\u0627\u0646\u0646\u062f \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0645\u06cc \u06a9\u0646\u06cc\u062f\u060c \u0635\u062f\u0627 \u0647\u0645\u06cc\u0634\u0647 \u062a\u062c\u0631\u0628\u0647 \u0631\u0627 \u0628\u0647\u0628\u0648\u062f \u0645\u06cc \u0628\u062e\u0634\u062f\u060c \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0645\u0646 \u0627\u0632 Stable Audio \u0628\u0631\u0627\u06cc \u062a\u0648\u0644\u06cc\u062f \u0645\u0648\u0633\u06cc\u0642\u06cc \u067e\u0633 \u0632\u0645\u06cc\u0646\u0647 \u0632\u0645\u0627\u0646\u06cc \u06a9\u0647 \u06a9\u0627\u0631\u0628\u0631 &#8220;\u0648\u0627\u0631\u062f \u067e\u0631\u062a\u06af\u0627\u0647&#8221; \u0645\u06cc \u0634\u0648\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0631\u062f\u0645. \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u06cc \u06a9\u0647 \u0628\u0631\u0627\u06cc \u0645\u0648\u0633\u06cc\u0642\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0631\u062f\u0645 \u0627\u06cc\u0646 \u0628\u0648\u062f:<\/p>\n<p>\u0645\u062d\u06cc\u0637\u060c \u062e\u0632\u0646\u062f\u0647\u060c \u0645\u0648\u0633\u06cc\u0642\u06cc \u067e\u0633\u200c\u0632\u0645\u06cc\u0646\u0647\u060c \u0635\u062f\u0627\u0647\u0627\u06cc \u0632\u0645\u0632\u0645\u0647\u200c\u06a9\u0646\u0646\u062f\u0647\u060c \u0628\u0627\u062f\u0647\u0627\u060c \u0633\u0631\u0639\u062a \u0622\u0647\u0633\u062a\u0647\u060c \u0648\u0647\u0645\u200c\u0622\u0648\u0631\u060c \u067e\u0631\u062a\u06af\u0627\u0647<\/p>\n<p>\u0645\u0646 \u0647\u0645\u0686\u0646\u06cc\u0646 \u0641\u06a9\u0631 \u0645\u06cc \u06a9\u0631\u062f\u0645 \u06a9\u0647 \u0641\u0642\u0637 \u0635\u0641\u062d\u0647 \u0633\u06cc\u0627\u0647 \u0648 \u0633\u0641\u06cc\u062f \u0633\u0627\u062f\u0647 \u06a9\u0645\u06cc \u062e\u0633\u062a\u0647 \u06a9\u0646\u0646\u062f\u0647 \u0627\u0633\u062a\u060c \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0686\u0646\u062f \u0641\u06cc\u0644\u062a\u0631 SVG \u0645\u062a\u062d\u0631\u06a9 \u0631\u0627 \u062f\u0631 \u067e\u0633 \u0632\u0645\u06cc\u0646\u0647 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u0645. \u0639\u0644\u0627\u0648\u0647 \u0628\u0631 \u0627\u06cc\u0646\u060c \u06cc\u06a9 \u062f\u0627\u06cc\u0631\u0647 \u062a\u06cc\u0631\u0647 \u0648 \u062a\u0627\u0631 \u062f\u0631 \u0645\u0631\u06a9\u0632 \u0635\u0641\u062d\u0647 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u0645 \u062a\u0627 \u062c\u0644\u0648\u0647 \u0645\u062d\u0648 \u0634\u062f\u0646 \u062e\u0648\u0628\u06cc \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u062f. \u0627\u062d\u062a\u0645\u0627\u0644\u0627\u064b \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u0633\u062a\u0645 \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0631\u0627 \u0628\u0627 \u0641\u06cc\u0644\u062a\u0631\u0647\u0627\u06cc SVG \u0627\u0646\u062c\u0627\u0645 \u062f\u0647\u0645\u060c \u0627\u0645\u0627 \u0646\u0645\u06cc\u200c\u062e\u0648\u0627\u0633\u062a\u0645 \u0632\u0645\u0627\u0646 \u0632\u06cc\u0627\u062f\u06cc \u0631\u0627 \u0628\u0631\u0627\u06cc \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0635\u0631\u0641 \u06a9\u0646\u0645. \u0633\u067e\u0633 \u0628\u0631\u0627\u06cc \u062f\u0627\u0634\u062a\u0646 \u0645\u0642\u062f\u0627\u0631\u06cc \u062d\u0631\u06a9\u062a \u0628\u06cc\u0634\u062a\u0631\u060c \u067e\u0633\u200c\u0632\u0645\u06cc\u0646\u0647 \u0631\u0627 \u0631\u0648\u06cc \u0645\u062d\u0648\u0631 \u062e\u0648\u062f \u0645\u06cc\u200c\u0686\u0631\u062e\u0627\u0646\u0645. \u06af\u0627\u0647\u06cc \u0627\u0648\u0642\u0627\u062a \u0627\u0646\u062c\u0627\u0645 \u0627\u0646\u06cc\u0645\u06cc\u0634\u0646 \u0628\u0627 \u0641\u06cc\u0644\u062a\u0631\u0647\u0627\u06cc SVG \u06a9\u0645\u06cc \u0628\u062f \u0627\u0633\u062a\u060c \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u062a\u0635\u0645\u06cc\u0645 \u06af\u0631\u0641\u062a\u0645 \u0628\u0647 \u062c\u0627\u06cc \u0622\u0646 \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0631\u0627 \u0627\u0646\u062c\u0627\u0645 \u062f\u0647\u0645.<\/p>\n<p>    &lt;div style={{ width: &#8216;100vw&#8217;, height: &#8216;100vh&#8217; }}&gt;<br \/>\n      {\/* Background Elements *\/}<br \/>\n      &lt;svg className=&#8221;fixed inset-0 w-full h-full -z-10&#8243;&gt;<br \/>\n        &lt;defs&gt;<br \/>\n          &lt;filter id=&#8221;noise&#8221;&gt;<br \/>\n            &lt;feTurbulence<br \/>\n              id=&#8221;turbFreq&#8221;<br \/>\n              type=&#8221;fractalNoise&#8221;<br \/>\n              baseFrequency=&#8221;0.01&#8243;<br \/>\n              seed=&#8221;5&#8243;<br \/>\n              numOctaves=&#8221;1&#8243;<br \/>\n            &gt;<br \/>\n            &lt;\/feTurbulence&gt;<br \/>\n            &lt;feGaussianBlur stdDeviation=&#8221;10&#8243;&gt;<br \/>\n              &lt;animate<br \/>\n                attributeName=&#8221;stdDeviation&#8221;<br \/>\n                values=&#8221;10;50;10&#8243;<br \/>\n                dur=&#8221;20s&#8221;<br \/>\n                repeatCount=&#8221;indefinite&#8221;<br \/>\n              \/&gt;<br \/>\n            &lt;\/feGaussianBlur&gt;<br \/>\n            &lt;feColorMatrix<br \/>\n              type=&#8221;matrix&#8221;<br \/>\n              values=&#8221;1 0 0 0 1<br \/>\n                      0 1 0 0 1<br \/>\n                      0 0 1 0 1<br \/>\n                      0 0 0 25 -13&#8243;<br \/>\n            \/&gt;<br \/>\n          &lt;\/filter&gt;<br \/>\n        &lt;\/defs&gt;<br \/>\n        &lt;rect width=&#8221;200%&#8221; height=&#8221;200%&#8221; filter=&#8221;url(#noise)&#8221; className=&#8221;rotation-animation&#8221; \/&gt;<br \/>\n      &lt;\/svg&gt;<br \/>\n      &lt;div className=&#8221;fixed inset-0 w-[95vw] h-[95vh] bg-black rounded-full blur-[128px] m-auto&#8221; \/&gt;<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0634\u0645\u0627 \u0622\u0646 \u0631\u0627 \u062f\u0627\u0631\u06cc\u062f: \u0646\u0633\u0628\u062a\u0627\u064b \u0645\u0633\u062a\u0642\u06cc\u0645 \u0628\u0647 \u0646\u062d\u0648\u0647 \u0627\u062c\u0631\u0627\u06cc \u06cc\u06a9 \u0631\u062f\u06cc\u0627\u0628\u06cc \u0686\u0634\u0645 \u0633\u0628\u06a9 \u0628\u0627 \u0642\u0627\u0628\u0644\u06cc\u062a \u0647\u0627\u06cc \u0628\u0644\u0627\u062f\u0631\u0646\u06af Supabase \u0646\u06af\u0627\u0647 \u06a9\u0646\u06cc\u062f. \u0634\u062e\u0635\u0627\u064b \u0627\u06cc\u0646 \u0622\u0632\u0645\u0627\u06cc\u0634 \u0628\u0633\u06cc\u0627\u0631 \u062c\u0627\u0644\u0628\u06cc \u0628\u0648\u062f \u0648 \u062f\u0631 \u062d\u06cc\u0646 \u06a9\u0627\u0631 \u0628\u0631 \u0631\u0648\u06cc \u0622\u0646 \u0645\u0634\u06a9\u0644 \u0632\u06cc\u0627\u062f\u06cc \u0646\u062f\u0627\u0634\u062a\u0645. \u0648 \u0628\u0627 \u06a9\u0645\u0627\u0644 \u062a\u0639\u062c\u0628 \u0645\u0646 \u0645\u062c\u0628\u0648\u0631 \u0646\u0628\u0648\u062f\u0645 \u0634\u0628 \u0622\u062e\u0631 \u0642\u0628\u0644 \u0627\u0632 \u0627\u0631\u0633\u0627\u0644 \u067e\u0631\u0648\u0698\u0647 \u06cc\u06a9 \u0634\u0628 \u06a9\u0627\u0645\u0644 \u0627\u0646\u062c\u0627\u0645 \u062f\u0647\u0645!<\/p>\n<p>\u0628\u0647 \u0631\u0627\u062d\u062a\u06cc \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u067e\u0631\u0648\u0698\u0647 \u06cc\u0627 \u0648\u06cc\u062f\u0626\u0648\u06cc \u0646\u0645\u0627\u06cc\u0634\u06cc \u0631\u0627 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u062f \u06a9\u0647 \u0686\u06af\u0648\u0646\u0647 \u0628\u0647 \u0646\u062a\u06cc\u062c\u0647 \u0631\u0633\u06cc\u062f\u0647 \u0627\u0633\u062a. \u0627\u06af\u0631 \u062a\u0639\u062f\u0627\u062f \u0632\u06cc\u0627\u062f\u06cc \u0627\u0632 \u0627\u0641\u0631\u0627\u062f \u0647\u0645\u0632\u0645\u0627\u0646 \u0627\u0632 \u0622\u0646 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u0646\u062f \u0645\u0645\u06a9\u0646 \u0627\u0633\u062a \u0645\u0634\u06a9\u0644\u0627\u062a\u06cc \u0648\u062c\u0648\u062f \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u062f (\u0622\u0632\u0645\u0627\u06cc\u0634 \u0622\u0646 \u0628\u0633\u06cc\u0627\u0631 \u0633\u062e\u062a \u0627\u0633\u062a \u0632\u06cc\u0631\u0627 \u0628\u0631\u0627\u06cc \u0627\u0646\u062c\u0627\u0645 \u062f\u0631\u0633\u062a \u0622\u0646 \u0628\u0647 \u0686\u0646\u062f\u06cc\u0646 \u062f\u0633\u062a\u06af\u0627\u0647 \u0648 \u0648\u0628 \u06a9\u0645 \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u062f)\u060c \u0627\u0645\u0627 \u062d\u062f\u0633 \u0645\u06cc\u200c\u0632\u0646\u0645 \u06a9\u0647 \u0627\u06cc\u0646 \u062f\u0631 \u0645\u062f \u067e\u0631\u0648\u0698\u0647\u200c\u0647\u0627\u06cc \u0647\u06a9\u0627\u062a\u0648\u0646 \u0628\u0627\u0634\u062f\u061f \u0648 \u0627\u06af\u0631 \u0622\u0646 \u0631\u0627 \u0622\u0632\u0645\u0627\u06cc\u0634 \u06a9\u0631\u062f\u06cc\u062f\u060c \u0628\u0647 \u06cc\u0627\u062f \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f \u06a9\u0647 \u0627\u06af\u0631 \u06cc\u06a9 \u0686\u0634\u0645 \u062f\u06cc\u062f\u06cc\u062f\u060c \u0622\u0646 \u0634\u062e\u0635 \u062f\u06cc\u06af\u0631\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0634\u0645\u0627 \u0631\u0627 \u062f\u0631 \u062c\u0627\u06cc\u06cc \u0627\u0632 \u0637\u0631\u06cc\u0642 \u0627\u06cc\u0646\u062a\u0631\u0646\u062a \u062a\u0645\u0627\u0634\u0627 \u0645\u06cc \u06a9\u0646\u062f!<\/p>\n<div data-article-id=\"2161412\" id=\"article-body\">\n<p>TL;DR:<\/p>\n<blockquote>\n<ul>\n<li>\u0633\u0627\u062e\u062a\u0647 \u0634\u062f\u0647 \u0628\u0627 Supabase\u060c React\u060c WebGazer.js\u060c Motion One\u060c anime.js\u060c \u0635\u062f\u0627\u06cc \u067e\u0627\u06cc\u062f\u0627\u0631<\/li>\n<li>\u0627\u0632 Supabase Realtime Presence &#038; Broadcast \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u062f (\u0627\u0635\u0644\u0627\u064b \u0627\u0632 \u062c\u062f\u0627\u0648\u0644 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0646\u0645\u06cc \u0634\u0648\u062f!)<\/li>\n<li>\u0645\u062e\u0632\u0646 GitHub<\/li>\n<li>\u0648\u0628 \u0633\u0627\u06cc\u062a<\/li>\n<li>\u0648\u06cc\u062f\u0626\u0648\u06cc \u0646\u0645\u0627\u06cc\u0634\u06cc<\/li>\n<\/ul>\n<\/blockquote>\n<p>\u06cc\u06a9\u06cc \u062f\u06cc\u06af\u0631 \u0627\u0632 \u0647\u06a9\u0627\u062a\u0648\u0646 \u0647\u0627\u06cc \u0647\u0641\u062a\u0647 \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc Supabase \u0648 \u06cc\u06a9 \u067e\u0631\u0648\u0698\u0647 \u0622\u0632\u0645\u0627\u06cc\u0634\u06cc \u062f\u06cc\u06af\u0631 \u0628\u0647 \u0646\u0627\u0645 <strong>\u0628\u0647 \u067e\u0631\u062a\u06af\u0627\u0647 \u062e\u06cc\u0631\u0647 \u0634\u0648\u06cc\u062f.<\/strong> \u0627\u06cc\u0646 \u062f\u0631 \u0646\u0647\u0627\u06cc\u062a \u06cc\u06a9\u06cc \u0627\u0632 \u0633\u0627\u062f\u0647 \u062a\u0631\u06cc\u0646 \u0648 \u062f\u0631 \u0639\u06cc\u0646 \u062d\u0627\u0644 \u067e\u06cc\u0686\u06cc\u062f\u0647 \u062a\u0631\u06cc\u0646 \u067e\u0631\u0648\u0698\u0647 \u0647\u0627 \u0628\u0648\u062f. \u062e\u0648\u0634\u0628\u062e\u062a\u0627\u0646\u0647 \u0627\u062e\u06cc\u0631\u0627\u064b \u06a9\u0645\u06cc \u0627\u0632 \u0645\u06a9\u0627\u0646\u200c\u0646\u0645\u0627 \u0644\u0630\u062a \u0645\u06cc\u200c\u0628\u0631\u0645\u060c \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0686\u0646\u062f \u062f\u0633\u062a \u06cc\u0627\u0631\u06cc \u062f\u0627\u0634\u062a\u0645 \u062a\u0627 \u0627\u0632 \u067e\u0633 \u0622\u0646 \u0628\u0631 \u0628\u06cc\u0627\u06cc\u0645! \u0645\u0646 \u0647\u0645\u0686\u0646\u06cc\u0646 \u0645\u06cc \u062e\u0648\u0627\u0633\u062a\u0645 \u06cc\u06a9 \u0633\u0648\u0627\u0644 \u0631\u0627 \u062f\u0631 \u0630\u0647\u0646 \u062e\u0648\u062f \u062a\u0623\u06cc\u06cc\u062f \u06a9\u0646\u0645: \u0622\u06cc\u0627 \u0627\u0645\u06a9\u0627\u0646 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f\u061f <em>\u0641\u0642\u0637<\/em> \u0648\u06cc\u0698\u06af\u06cc \u0647\u0627\u06cc \u0628\u06cc\u062f\u0631\u0646\u06af \u0627\u0632 Supabase <em>\u0628\u062f\u0648\u0646<\/em> \u0647\u0631 \u062c\u062f\u0627\u0648\u0644 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647\u061f \u067e\u0627\u0633\u062e (\u0634\u0627\u06cc\u062f \u062a\u0627 \u062d\u062f\u0648\u062f\u06cc \u0648\u0627\u0636\u062d) \u0627\u06cc\u0646 \u0627\u0633\u062a: \u0628\u0644\u0647\u060c \u0628\u0644\u0647 \u0627\u06cc\u0646 \u0627\u0633\u062a (\u062f\u0648\u0633\u062a\u062a \u062f\u0627\u0631\u0645\u060c \u062a\u06cc\u0645 Realtime \u2665\ufe0f). \u067e\u0633 \u0628\u06cc\u0627\u06cc\u06cc\u062f \u06a9\u0645\u06cc \u0639\u0645\u06cc\u0642 \u062a\u0631 \u062f\u0631 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0641\u0631\u0648 \u0628\u0631\u0648\u06cc\u0645.<\/p>\n<p>\u0645\u0646 \u0641\u0642\u0637 \u06cc\u06a9 \u0631\u0648\u0632 \u0628\u0647 \u0637\u0648\u0631 \u062a\u0635\u0627\u062f\u0641\u06cc \u0641\u0642\u0637 \u0628\u0647 \u0646\u0642\u0644 \u0642\u0648\u0644 \u0646\u06cc\u0686\u0647 \u062f\u0631 \u0645\u0648\u0631\u062f \u067e\u0631\u062a\u06af\u0627\u0647 \u0641\u06a9\u0631 \u0645\u06cc \u06a9\u0631\u062f\u0645 \u0648 \u0627\u06cc\u0646\u06a9\u0647 \u062e\u0648\u0628 (\u0648 \u062c\u0627\u0644\u0628) \u0627\u0633\u062a \u06a9\u0647 \u0622\u0646 \u0631\u0627 \u0628\u0647 \u0646\u0648\u0639\u06cc \u062a\u062c\u0633\u0645 \u06a9\u0646\u0645: \u0634\u0645\u0627 \u0628\u0647 \u06cc\u06a9 \u0635\u0641\u062d\u0647 \u062a\u0627\u0631\u06cc\u06a9 \u062e\u06cc\u0631\u0647 \u0645\u06cc \u0634\u0648\u06cc\u062f \u0648 \u0686\u06cc\u0632\u06cc \u0628\u0647 \u0634\u0645\u0627 \u062e\u06cc\u0631\u0647 \u0645\u06cc \u0634\u0648\u062f. \u0647\u06cc\u0686 \u0686\u06cc\u0632 \u062e\u06cc\u0644\u06cc \u0628\u06cc\u0634\u062a\u0631 \u0627\u0632 \u0622\u0646!<\/p>\n<p>\u062f\u0631 \u0627\u0628\u062a\u062f\u0627 \u0627\u06cc\u0646 \u0627\u06cc\u062f\u0647 \u0631\u0627 \u062f\u0627\u0634\u062a\u0645 \u06a9\u0647 \u0627\u0632 Three.js \u0628\u0631\u0627\u06cc \u0633\u0627\u062e\u062a\u0646 \u0627\u06cc\u0646 \u067e\u0631\u0648\u0698\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u0645\u060c \u0628\u0627 \u0627\u06cc\u0646 \u062d\u0627\u0644 \u0645\u062a\u0648\u062c\u0647 \u0634\u062f\u0645 \u06a9\u0647 \u0627\u06cc\u0646 \u0628\u062f\u0627\u0646 \u0645\u0639\u0646\u0627\u0633\u062a \u06a9\u0647 \u0628\u0627\u06cc\u062f \u062f\u0627\u0631\u0627\u06cc\u06cc \u0647\u0627\u06cc \u0631\u0627\u06cc\u06af\u0627\u0646 \u0628\u0631\u0627\u06cc \u0686\u0634\u0645(\u0647\u0627\u06cc) \u0633\u0647 \u0628\u0639\u062f\u06cc \u0627\u06cc\u062c\u0627\u062f \u06cc\u0627 \u067e\u06cc\u062f\u0627 \u06a9\u0646\u0645. \u0645\u0646 \u062a\u0635\u0645\u06cc\u0645 \u06af\u0631\u0641\u062a\u0645 \u06a9\u0647 \u06a9\u0645\u06cc \u0632\u06cc\u0627\u062f \u0627\u0633\u062a\u060c \u0628\u0647 \u062e\u0635\u0648\u0635 \u06a9\u0647 \u0632\u0645\u0627\u0646 \u0632\u06cc\u0627\u062f\u06cc \u0628\u0631\u0627\u06cc \u06a9\u0627\u0631 \u0631\u0648\u06cc \u062e\u0648\u062f \u067e\u0631\u0648\u0698\u0647 \u0646\u062f\u0627\u0634\u062a\u0645 \u0648 \u0628\u0647 \u062c\u0627\u06cc \u0622\u0646 \u062a\u0635\u0645\u06cc\u0645 \u06af\u0631\u0641\u062a\u0645 \u0622\u0646 \u0631\u0627 \u0628\u0647 \u0635\u0648\u0631\u062a \u062f\u0648 \u0628\u0639\u062f\u06cc \u0628\u0627 SVG \u0627\u0646\u062c\u0627\u0645 \u062f\u0647\u0645.<\/p>\n<p>\u0647\u0645\u0686\u0646\u06cc\u0646 \u0646\u0645\u06cc\u200c\u062e\u0648\u0627\u0633\u062a\u0645 \u0641\u0642\u0637 \u0628\u0635\u0631\u06cc \u0628\u0627\u0634\u062f: \u0628\u0627 \u0628\u0631\u062e\u06cc \u0635\u062f\u0627\u0647\u0627 \u0646\u06cc\u0632 \u062a\u062c\u0631\u0628\u0647 \u0628\u0647\u062a\u0631\u06cc \u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f. \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0628\u0647 \u0627\u06cc\u0646 \u0641\u06a9\u0631 \u0627\u0641\u062a\u0627\u062f\u0645 \u06a9\u0647 \u0627\u06af\u0631 \u0634\u0631\u06a9\u062a\u200c\u06a9\u0646\u0646\u062f\u06af\u0627\u0646 \u0628\u062a\u0648\u0627\u0646\u0646\u062f \u0628\u0627 \u0645\u06cc\u06a9\u0631\u0648\u0641\u0648\u0646 \u0635\u062d\u0628\u062a \u06a9\u0646\u0646\u062f \u0648 \u062f\u06cc\u06af\u0631\u0627\u0646 \u0628\u062a\u0648\u0627\u0646\u0646\u062f \u0622\u0646 \u0631\u0627 \u0628\u0647\u200c\u0639\u0646\u0648\u0627\u0646 \u0632\u0645\u0632\u0645\u0647\u200c\u0647\u0627\u06cc \u0646\u0627\u0645\u0646\u0627\u0633\u0628 \u06cc\u0627 \u0628\u0627\u062f\u0647\u0627\u06cc\u06cc \u06a9\u0647 \u062f\u0631 \u062d\u0627\u0644 \u0639\u0628\u0648\u0631 \u0647\u0633\u062a\u0646\u062f \u0628\u0634\u0646\u0648\u0646\u062f\u060c \u0628\u0633\u06cc\u0627\u0631 \u0639\u0627\u0644\u06cc \u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f. \u0628\u0627 \u0627\u06cc\u0646 \u062d\u0627\u0644\u060c \u0627\u06cc\u0646 \u0628\u0633\u06cc\u0627\u0631 \u0686\u0627\u0644\u0634 \u0628\u0631\u0627\u0646\u06af\u06cc\u0632 \u0634\u062f \u0648 \u062a\u0635\u0645\u06cc\u0645 \u06af\u0631\u0641\u062a\u0645 \u0622\u0646 \u0631\u0627 \u0628\u0647 \u0637\u0648\u0631 \u06a9\u0627\u0645\u0644 \u06a9\u0646\u0627\u0631 \u0628\u06af\u0630\u0627\u0631\u0645 \u0632\u06cc\u0631\u0627 \u0646\u062a\u0648\u0627\u0646\u0633\u062a\u0645 WebAudio \u0648 WebRTC \u0631\u0627 \u0628\u0647 \u062e\u0648\u0628\u06cc \u0628\u0647 \u0647\u0645 \u0645\u062a\u0635\u0644 \u06a9\u0646\u0645. \u0645\u0646 \u06cc\u06a9 \u062c\u0632\u0621 \u0628\u0627\u0642\u06cc\u0645\u0627\u0646\u062f\u0647 \u062f\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u06a9\u062f \u062f\u0627\u0631\u0645 \u06a9\u0647 \u0628\u0647 \u0645\u06cc\u06a9\u0631\u0648\u0641\u0648\u0646 \u0645\u062d\u0644\u06cc \u06af\u0648\u0634 \u0645\u06cc \u062f\u0647\u062f \u0648 \u0627\u06af\u0631 \u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u062f \u0646\u06af\u0627\u0647\u06cc \u0628\u06cc\u0646\u062f\u0627\u0632\u06cc\u062f\u060c &#8220;\u0635\u062f\u0627\u06cc \u0628\u0627\u062f&#8221; \u0631\u0627 \u0628\u0631\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631 \u0641\u0639\u0644\u06cc \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u06a9\u0646\u062f. \u0634\u0627\u06cc\u062f \u062f\u0631 \u0622\u06cc\u0646\u062f\u0647 \u0686\u06cc\u0632\u06cc \u0627\u0636\u0627\u0641\u0647 \u0634\u0648\u062f\u061f<\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_84 counter-hierarchy ez-toc-counter-rtl ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">\u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/nabfollower.com\/blog\/building-a-realtime-eye-tracking-experience-with-supabase-and-webgazerjs-3llj\/#%D8%A7%D8%AA%D8%A7%D9%82_%D9%87%D8%A7%DB%8C_%D8%A8%DB%8C%D8%AF%D8%B1%D9%86%DA%AF\" >\u0627\u062a\u0627\u0642 \u0647\u0627\u06cc \u0628\u06cc\u062f\u0631\u0646\u06af<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/nabfollower.com\/blog\/building-a-realtime-eye-tracking-experience-with-supabase-and-webgazerjs-3llj\/#%D8%B1%D8%AF%DB%8C%D8%A7%D8%A8%DB%8C_%DA%86%D8%B4%D9%85\" >\u0631\u062f\u06cc\u0627\u0628\u06cc \u0686\u0634\u0645<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/nabfollower.com\/blog\/building-a-realtime-eye-tracking-experience-with-supabase-and-webgazerjs-3llj\/#%DA%86%D8%B4%D9%85\" >\u0686\u0634\u0645<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/nabfollower.com\/blog\/building-a-realtime-eye-tracking-experience-with-supabase-and-webgazerjs-3llj\/#%D9%84%D9%85%D8%B3_%D9%87%D8%A7%DB%8C_%D9%86%D9%87%D8%A7%DB%8C%DB%8C\" >\u0644\u0645\u0633 \u0647\u0627\u06cc \u0646\u0647\u0627\u06cc\u06cc<\/a><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"%D8%A7%D8%AA%D8%A7%D9%82_%D9%87%D8%A7%DB%8C_%D8%A8%DB%8C%D8%AF%D8%B1%D9%86%DA%AF\"><\/span>\n<p>  \u0627\u062a\u0627\u0642 \u0647\u0627\u06cc \u0628\u06cc\u062f\u0631\u0646\u06af<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0642\u0628\u0644 \u0627\u0632 \u06a9\u0627\u0631 \u0631\u0648\u06cc \u0647\u0631 \u0686\u06cc\u0632 \u0628\u0635\u0631\u06cc\u060c \u0645\u06cc\u200c\u062e\u0648\u0627\u0633\u062a\u0645 \u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u0628\u06cc\u062f\u0631\u0646\u06af \u0631\u0627 \u06a9\u0647 \u062f\u0631 \u0630\u0647\u0646 \u062f\u0627\u0634\u062a\u0645 \u0622\u0632\u0645\u0627\u06cc\u0634 \u06a9\u0646\u0645. \u0627\u0632 \u0622\u0646\u062c\u0627\u06cc\u06cc \u06a9\u0647 \u062f\u0631 \u0648\u06cc\u0698\u06af\u06cc \u0628\u0644\u0627\u062f\u0631\u0646\u06af \u0645\u062d\u062f\u0648\u062f\u06cc\u062a\u200c\u0647\u0627\u06cc\u06cc \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f\u060c \u0645\u06cc\u200c\u062e\u0648\u0627\u0633\u062a\u0645 \u0627\u06cc\u0646 \u0648\u06cc\u0698\u06af\u06cc \u06a9\u0627\u0631 \u06a9\u0646\u062f:<\/p>\n<ul>\n<li>\u062d\u062f\u0627\u06a9\u062b\u0631 \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f. 10 \u0634\u0631\u06a9\u062a \u06a9\u0646\u0646\u062f\u0647 \u062f\u0631 \u06cc\u06a9 \u06a9\u0627\u0646\u0627\u0644 \u062f\u0631 \u06cc\u06a9 \u0632\u0645\u0627\u0646\n<ul>\n<li>\u0628\u0647 \u0627\u06cc\u0646 \u0645\u0639\u0646\u06cc \u06a9\u0647 \u0627\u06af\u0631 \u06a9\u0627\u0646\u0627\u0644 \u067e\u0631 \u0627\u0633\u062a\u060c \u0628\u0627\u06cc\u062f \u0628\u0647 \u06cc\u06a9 \u06a9\u0627\u0646\u0627\u0644 \u062c\u062f\u06cc\u062f \u0628\u067e\u06cc\u0648\u0646\u062f\u06cc\u062f<\/li>\n<\/ul>\n<\/li>\n<li>\u0634\u0645\u0627 \u0641\u0642\u0637 \u0628\u0627\u06cc\u062f \u0686\u0634\u0645 \u0633\u0627\u06cc\u0631 \u0634\u0631\u06a9\u062a \u06a9\u0646\u0646\u062f\u06af\u0627\u0646 \u0631\u0627 \u0628\u0628\u06cc\u0646\u06cc\u062f<\/li>\n<\/ul>\n<p>\u0628\u0631\u0627\u06cc \u0627\u06cc\u0646 \u0645\u0646 \u0622\u0645\u062f\u0645 \u0628\u0627 \u06cc\u06a9 <code>useEffect<\/code> \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u062c\u0627\u06cc\u06cc \u06a9\u0647 \u0628\u0647 \u0635\u0648\u0631\u062a \u0628\u0627\u0632\u06af\u0634\u062a\u06cc \u0628\u0647 \u06cc\u06a9 \u06a9\u0627\u0646\u0627\u0644 \u0628\u06cc\u062f\u0631\u0646\u06af \u0645\u0627\u0646\u0646\u062f \u0627\u06cc\u0646 \u0645\u06cc \u067e\u06cc\u0648\u0646\u062f\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u06cc\u0646 <code>joinRoom<\/code> \u062f\u0631 \u062f\u0627\u062e\u0644 \u0632\u0646\u062f\u06af\u06cc \u0645\u06cc \u06a9\u0646\u062f <code>useEffect<\/code> \u0642\u0644\u0627\u0628 \u0648 \u0647\u0646\u06af\u0627\u0645\u06cc \u06a9\u0647 \u062c\u0632\u0621 \u0627\u062a\u0627\u0642 \u0646\u0635\u0628 \u0634\u062f\u0647 \u0628\u0627\u0634\u062f \u0641\u0631\u0627\u062e\u0648\u0627\u0646\u06cc \u0645\u06cc \u0634\u0648\u062f. \u06cc\u06a9\u06cc \u0627\u0632 \u0646\u06a9\u0627\u062a\u06cc \u06a9\u0647 \u0647\u0646\u06af\u0627\u0645 \u06a9\u0627\u0631 \u0628\u0631 \u0631\u0648\u06cc \u0627\u06cc\u0646 \u0648\u06cc\u0698\u06af\u06cc \u0645\u062a\u0648\u062c\u0647 \u0634\u062f\u0645 \u0627\u06cc\u0646 \u0628\u0648\u062f \u06a9\u0647 <code>currentPresences<\/code> param \u0647\u06cc\u0686 \u0645\u0642\u062f\u0627\u0631\u06cc \u062f\u0631 \u0622\u0646 \u0646\u062f\u0627\u0631\u062f <code>join<\/code> \u0631\u0648\u06cc\u062f\u0627\u062f \u062d\u062a\u06cc \u0627\u06af\u0631 \u062f\u0631 \u062f\u0633\u062a\u0631\u0633 \u0628\u0627\u0634\u062f. \u0645\u0646 \u0645\u0637\u0645\u0626\u0646 \u0646\u06cc\u0633\u062a\u0645 \u06a9\u0647 \u0627\u06cc\u0646 \u06cc\u06a9 \u0627\u0634\u06a9\u0627\u0644 \u062f\u0631 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0627\u0633\u062a \u06cc\u0627 \u0647\u0645\u0627\u0646\u0637\u0648\u0631 \u06a9\u0647 \u062f\u0631 \u0646\u0638\u0631 \u06af\u0631\u0641\u062a\u0647 \u0634\u062f\u0647 \u06a9\u0627\u0631 \u0645\u06cc \u06a9\u0646\u062f. \u0627\u0632 \u0627\u06cc\u0646 \u0631\u0648 \u0646\u06cc\u0627\u0632 \u0628\u0647 \u0627\u0646\u062c\u0627\u0645 \u06cc\u06a9 \u06a9\u062a\u0627\u0628\u0686\u0647 \u0631\u0627\u0647\u0646\u0645\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631 <code>room.presenceState<\/code> \u0648\u0627\u06a9\u0634\u06cc \u06a9\u0646\u06cc\u062f \u062a\u0627 \u0647\u0631 \u0632\u0645\u0627\u0646 \u06a9\u0647 \u06a9\u0627\u0631\u0628\u0631 \u0645\u06cc\u200c\u067e\u06cc\u0648\u0646\u062f\u062f\u060c \u062a\u0639\u062f\u0627\u062f \u0634\u0631\u06a9\u062a\u200c\u06a9\u0646\u0646\u062f\u06af\u0627\u0646 \u062f\u0631 \u0627\u062a\u0627\u0642 \u0631\u0627 \u062f\u0631\u06cc\u0627\u0641\u062a \u06a9\u0646\u06cc\u062f.<\/p>\n<p>\u062a\u0639\u062f\u0627\u062f \u0634\u0631\u06a9\u062a\u200c\u06a9\u0646\u0646\u062f\u06af\u0627\u0646 \u0631\u0627 \u0628\u0631\u0631\u0633\u06cc \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645 \u0648 \u06cc\u0627 \u0627\u0634\u062a\u0631\u0627\u06a9 \u0627\u062a\u0627\u0642 \u0641\u0639\u0644\u06cc \u0631\u0627 \u0644\u063a\u0648 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645 \u0648 \u0633\u0639\u06cc \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645 \u0628\u0647 \u0627\u062a\u0627\u0642 \u062f\u06cc\u06af\u0631\u06cc \u0628\u067e\u06cc\u0648\u0646\u062f\u06cc\u0645\u060c \u06cc\u0627 \u0633\u067e\u0633 \u0628\u0647 \u0627\u062a\u0627\u0642 \u0641\u0639\u0644\u06cc \u0627\u062f\u0627\u0645\u0647 \u0645\u06cc\u200c\u062f\u0647\u06cc\u0645. \u0645\u0627 \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0631\u0627 \u062f\u0631 <code>join<\/code> \u0631\u0648\u06cc\u062f\u0627\u062f \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 <code>sync<\/code> \u062e\u06cc\u0644\u06cc \u062f\u06cc\u0631 \u0645\u06cc \u0634\u0648\u062f (\u0628\u0639\u062f \u0627\u0632 \u0622\u0646 \u0634\u0631\u0648\u0639 \u0645\u06cc \u0634\u0648\u062f <code>join<\/code> \u06cc\u0627 <code>leave<\/code> \u0631\u0648\u06cc\u062f\u0627\u062f\u0647\u0627).<\/p>\n<p>\u0645\u0646 \u0627\u06cc\u0646 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0631\u0627 \u0628\u0627 \u0628\u0627\u0632 \u06a9\u0631\u062f\u0646 \u062a\u0639\u062f\u0627\u062f \u0632\u06cc\u0627\u062f\u06cc \u062a\u0628 \u062f\u0631 \u0645\u0631\u0648\u0631\u06af\u0631\u0645 \u0622\u0632\u0645\u0627\u06cc\u0634 \u06a9\u0631\u062f\u0645 \u0648 \u0628\u0647 \u0646\u0638\u0631 \u0645\u06cc \u0631\u0633\u06cc\u062f \u06a9\u0647 \u0647\u0645\u0647 \u0645\u062a\u0648\u0631\u0645 \u0634\u062f\u0647 \u0627\u0646\u062f!<\/p>\n<p>\u0628\u0639\u062f \u0627\u0632 \u0622\u0646 \u0645\u06cc \u062e\u0648\u0627\u0633\u062a\u0645 \u0631\u0627\u0647 \u062d\u0644 \u0631\u0627 \u0628\u0627 \u0628\u0647 \u0631\u0648\u0632 \u0631\u0633\u0627\u0646\u06cc \u0645\u0648\u0642\u0639\u06cc\u062a \u0645\u0627\u0648\u0633 \u0627\u0634\u06a9\u0627\u0644 \u0632\u062f\u0627\u06cc\u06cc \u06a9\u0646\u0645 \u0648 \u0628\u0647 \u0633\u0631\u0639\u062a \u0628\u0627 \u0645\u0634\u06a9\u0644\u0627\u062a \u0627\u0631\u0633\u0627\u0644 \u067e\u06cc\u0627\u0645 \u0647\u0627\u06cc \u0632\u06cc\u0627\u062f \u062f\u0631 \u06a9\u0627\u0646\u0627\u0644 \u0645\u0648\u0627\u062c\u0647 \u0634\u062f\u0645! \u0631\u0627\u0647 \u062d\u0644: \u062a\u0645\u0627\u0633 \u0647\u0627 \u0631\u0627 \u06a9\u0627\u0647\u0634 \u062f\u0647\u06cc\u062f.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"cm\">\/**\n * Creates a throttled version of a function that can only be called at most once \n * in the specified time period.\n *\/<\/span>\n<span class=\"kd\">function<\/span> <span class=\"nf\">createThrottledFunction<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">T<\/span> <span class=\"nf\">extends <\/span><span class=\"p\">(...<\/span><span class=\"nx\">args<\/span><span class=\"p\">:<\/span> <span class=\"nx\">unknown<\/span><span class=\"p\">[])<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nx\">unknown<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">(<\/span>\n  <span class=\"nx\">functionToThrottle<\/span><span class=\"p\">:<\/span> <span class=\"nx\">T<\/span><span class=\"p\">,<\/span>\n  <span class=\"nx\">waitTimeMs<\/span><span class=\"p\">:<\/span> <span class=\"kr\">number<\/span>\n<span class=\"p\">):<\/span> <span class=\"p\">(...<\/span><span class=\"nx\">args<\/span><span class=\"p\">:<\/span> <span class=\"nb\">Parameters<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">T<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"k\">void<\/span> <span class=\"p\">{<\/span>\n  <span class=\"kd\">let<\/span> <span class=\"nx\">isWaitingToExecute<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">false<\/span>\n\n  <span class=\"k\">return<\/span> <span class=\"kd\">function<\/span> <span class=\"nf\">throttledFunction<\/span><span class=\"p\">(...<\/span><span class=\"na\">args<\/span><span class=\"p\">:<\/span> <span class=\"nb\">Parameters<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">T<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"o\">!<\/span><span class=\"nx\">isWaitingToExecute<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n      <span class=\"nx\">functionToThrottle<\/span><span class=\"p\">.<\/span><span class=\"nf\">apply<\/span><span class=\"p\">(<\/span><span class=\"k\">this<\/span><span class=\"p\">,<\/span> <span class=\"nx\">args<\/span><span class=\"p\">)<\/span>\n      <span class=\"nx\">isWaitingToExecute<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">true<\/span>\n      <span class=\"nf\">setTimeout<\/span><span class=\"p\">(()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n        <span class=\"nx\">isWaitingToExecute<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">false<\/span>\n      <span class=\"p\">},<\/span> <span class=\"nx\">waitTimeMs<\/span><span class=\"p\">)<\/span>\n    <span class=\"p\">}<\/span>\n  <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0645\u06a9\u0627\u0646 \u0646\u0645\u0627 \u0628\u0627 \u0627\u06cc\u0646 \u0633\u0627\u0632\u0646\u062f\u0647 \u0639\u0645\u0644\u06a9\u0631\u062f \u06a9\u0648\u0686\u06a9 \u062f\u0631\u06cc\u0686\u0647 \u06af\u0627\u0632 \u0622\u0645\u062f \u0648 \u0645\u0646 \u0627\u0632 \u0622\u0646 \u0628\u0627 \u067e\u062e\u0634 \u0647\u0627\u06cc \u0631\u062f\u06cc\u0627\u0628\u06cc \u0686\u0634\u0645 \u0645\u0627\u0646\u0646\u062f \u0632\u06cc\u0631 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0631\u062f\u0645:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code>\n<span class=\"kd\">const<\/span> <span class=\"nx\">throttledBroadcast<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">createThrottledFunction<\/span><span class=\"p\">((<\/span><span class=\"nx\">data<\/span><span class=\"p\">:<\/span> <span class=\"nx\">EyeTrackingData<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n  <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">currentChannel<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"nx\">currentChannel<\/span><span class=\"p\">.<\/span><span class=\"nf\">send<\/span><span class=\"p\">({<\/span>\n      <span class=\"na\">type<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">broadcast<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n      <span class=\"na\">event<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">eye_tracking<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n      <span class=\"na\">payload<\/span><span class=\"p\">:<\/span> <span class=\"nx\">data<\/span>\n    <span class=\"p\">})<\/span>\n  <span class=\"p\">}<\/span>\n<span class=\"p\">},<\/span> <span class=\"nx\">THROTTLE_MS<\/span><span class=\"p\">)<\/span>\n\n<span class=\"nf\">throttledBroadcast<\/span><span class=\"p\">({<\/span>\n <span class=\"na\">userId<\/span><span class=\"p\">:<\/span> <span class=\"nx\">userId<\/span><span class=\"p\">.<\/span><span class=\"nx\">current<\/span><span class=\"p\">,<\/span>\n <span class=\"na\">isBlinking<\/span><span class=\"p\">:<\/span> <span class=\"nx\">isCurrentlyBlinking<\/span><span class=\"p\">,<\/span>\n <span class=\"nx\">gazeX<\/span><span class=\"p\">,<\/span>\n <span class=\"nx\">gazeY<\/span>\n<span class=\"p\">})<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u06cc\u0646 \u062e\u06cc\u0644\u06cc \u06a9\u0645\u06a9 \u06a9\u0631\u062f! \u0647\u0645\u0686\u0646\u06cc\u0646\u060c \u062f\u0631 \u0646\u0633\u062e\u0647 \u0647\u0627\u06cc \u0627\u0648\u0644\u06cc\u0647\u060c \u067e\u06cc\u0627\u0645 \u0647\u0627\u06cc \u0631\u062f\u06cc\u0627\u0628\u06cc \u0686\u0634\u0645 \u0631\u0627 \u062f\u0627\u0634\u062a\u0645 <code>presence<\/code> \u0628\u0627 \u0627\u06cc\u0646 \u062d\u0627\u0644 <code>broadcast<\/code> \u0628\u0647 \u067e\u06cc\u0627\u0645\u200c\u0647\u0627\u06cc \u0628\u06cc\u0634\u062a\u0631\u06cc \u062f\u0631 \u062b\u0627\u0646\u06cc\u0647 \u0627\u062c\u0627\u0632\u0647 \u0645\u06cc\u200c\u062f\u0647\u062f\u060c \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0628\u0647 \u062c\u0627\u06cc \u0622\u0646 \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u0631\u0627 \u0628\u0647 \u0622\u0646 \u062a\u063a\u06cc\u06cc\u0631 \u062f\u0627\u062f\u0645. \u0627\u06cc\u0646 \u0628\u0647 \u0648\u06cc\u0698\u0647 \u062f\u0631 \u0631\u062f\u06cc\u0627\u0628\u06cc \u0686\u0634\u0645 \u0628\u0633\u06cc\u0627\u0631 \u0645\u0647\u0645 \u0627\u0633\u062a \u0632\u06cc\u0631\u0627 \u062f\u0648\u0631\u0628\u06cc\u0646 \u0647\u0645\u06cc\u0634\u0647 \u0647\u0645\u0647 \u0686\u06cc\u0632 \u0631\u0627 \u0636\u0628\u0637 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"%D8%B1%D8%AF%DB%8C%D8%A7%D8%A8%DB%8C_%DA%86%D8%B4%D9%85\"><\/span>\n<p>  \u0631\u062f\u06cc\u0627\u0628\u06cc \u0686\u0634\u0645<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0632\u0645\u0627\u0646\u06cc \u06a9\u0647 \u0628\u0631\u0627\u06cc \u0627\u0648\u0644\u06cc\u0646 \u0628\u0627\u0631 \u0627\u06cc\u062f\u0647 \u0627\u06cc\u0646 \u067e\u0631\u0648\u0698\u0647 \u0631\u0627 \u062f\u0627\u0634\u062a\u0645\u060c \u0628\u0627 WebGazer.js \u0628\u0631\u062e\u0648\u0631\u062f \u06a9\u0631\u062f\u0645. \u0627\u06cc\u0646 \u06cc\u06a9 \u067e\u0631\u0648\u0698\u0647 \u0628\u0633\u06cc\u0627\u0631 \u062c\u0627\u0644\u0628 \u0627\u0633\u062a \u0648 \u0628\u0647 \u0637\u0631\u0632 \u0634\u06af\u0641\u062a \u0627\u0646\u06af\u06cc\u0632\u06cc \u062e\u0648\u0628 \u06a9\u0627\u0631 \u0645\u06cc \u06a9\u0646\u062f!<\/p>\n<p>\u06a9\u0644 \u0642\u0627\u0628\u0644\u06cc\u062a \u0647\u0627\u06cc \u0631\u062f\u06cc\u0627\u0628\u06cc \u0686\u0634\u0645 \u062f\u0631 \u06cc\u06a9 \u0639\u0645\u0644\u06a9\u0631\u062f \u062f\u0631 \u06cc\u06a9 \u0627\u0646\u062c\u0627\u0645 \u0645\u06cc \u0634\u0648\u062f <code>useEffect<\/code> \u0642\u0644\u0627\u0628:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code>    <span class=\"nb\">window<\/span><span class=\"p\">.<\/span><span class=\"nx\">webgazer<\/span>\n      <span class=\"p\">.<\/span><span class=\"nf\">setGazeListener<\/span><span class=\"p\">(<\/span><span class=\"k\">async <\/span><span class=\"p\">(<\/span><span class=\"nx\">data<\/span><span class=\"p\">:<\/span> <span class=\"kr\">any<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n        <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">data<\/span> <span class=\"o\">==<\/span> <span class=\"kc\">null<\/span> <span class=\"o\">||<\/span> <span class=\"o\">!<\/span><span class=\"nx\">currentChannel<\/span> <span class=\"o\">||<\/span> <span class=\"o\">!<\/span><span class=\"nx\">ctxRef<\/span><span class=\"p\">.<\/span><span class=\"nx\">current<\/span><span class=\"p\">)<\/span> <span class=\"k\">return<\/span>\n\n        <span class=\"k\">try<\/span> <span class=\"p\">{<\/span>\n          <span class=\"c1\">\/\/ Get normalized gaze coordinates<\/span>\n          <span class=\"kd\">const<\/span> <span class=\"nx\">gazeX<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">x<\/span> <span class=\"o\">\/<\/span> <span class=\"nx\">windowSize<\/span><span class=\"p\">.<\/span><span class=\"nx\">width<\/span>\n          <span class=\"kd\">const<\/span> <span class=\"nx\">gazeY<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">y<\/span> <span class=\"o\">\/<\/span> <span class=\"nx\">windowSize<\/span><span class=\"p\">.<\/span><span class=\"nx\">height<\/span>\n\n          <span class=\"c1\">\/\/ Get video element<\/span>\n          <span class=\"kd\">const<\/span> <span class=\"nx\">videoElement<\/span> <span class=\"o\">=<\/span> <span class=\"nb\">document<\/span><span class=\"p\">.<\/span><span class=\"nf\">getElementById<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">webgazerVideoFeed<\/span><span class=\"dl\">'<\/span><span class=\"p\">)<\/span> <span class=\"k\">as<\/span> <span class=\"nx\">HTMLVideoElement<\/span>\n          <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"o\">!<\/span><span class=\"nx\">videoElement<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n            <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nf\">error<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">WebGazer video element not found<\/span><span class=\"dl\">'<\/span><span class=\"p\">)<\/span>\n            <span class=\"k\">return<\/span>\n          <span class=\"p\">}<\/span>\n\n          <span class=\"c1\">\/\/ Set canvas size to match video<\/span>\n          <span class=\"nx\">imageCanvasRef<\/span><span class=\"p\">.<\/span><span class=\"nx\">current<\/span><span class=\"p\">.<\/span><span class=\"nx\">width<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">videoElement<\/span><span class=\"p\">.<\/span><span class=\"nx\">videoWidth<\/span>\n          <span class=\"nx\">imageCanvasRef<\/span><span class=\"p\">.<\/span><span class=\"nx\">current<\/span><span class=\"p\">.<\/span><span class=\"nx\">height<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">videoElement<\/span><span class=\"p\">.<\/span><span class=\"nx\">videoHeight<\/span>\n\n          <span class=\"c1\">\/\/ Draw current frame to canvas<\/span>\n          <span class=\"nx\">ctxRef<\/span><span class=\"p\">.<\/span><span class=\"nx\">current<\/span><span class=\"p\">?.<\/span><span class=\"nf\">drawImage<\/span><span class=\"p\">(<\/span><span class=\"nx\">videoElement<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">)<\/span>\n\n          <span class=\"c1\">\/\/ Get eye patches<\/span>\n          <span class=\"kd\">const<\/span> <span class=\"nx\">tracker<\/span> <span class=\"o\">=<\/span> <span class=\"nb\">window<\/span><span class=\"p\">.<\/span><span class=\"nx\">webgazer<\/span><span class=\"p\">.<\/span><span class=\"nf\">getTracker<\/span><span class=\"p\">()<\/span>\n          <span class=\"kd\">const<\/span> <span class=\"nx\">patches<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">tracker<\/span><span class=\"p\">.<\/span><span class=\"nf\">getEyePatches<\/span><span class=\"p\">(<\/span>\n            <span class=\"nx\">videoElement<\/span><span class=\"p\">,<\/span>\n            <span class=\"nx\">imageCanvasRef<\/span><span class=\"p\">.<\/span><span class=\"nx\">current<\/span><span class=\"p\">,<\/span>\n            <span class=\"nx\">videoElement<\/span><span class=\"p\">.<\/span><span class=\"nx\">videoWidth<\/span><span class=\"p\">,<\/span>\n            <span class=\"nx\">videoElement<\/span><span class=\"p\">.<\/span><span class=\"nx\">videoHeight<\/span>\n          <span class=\"p\">)<\/span>\n\n          <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"o\">!<\/span><span class=\"nx\">patches<\/span><span class=\"p\">?.<\/span><span class=\"nx\">right<\/span><span class=\"p\">?.<\/span><span class=\"nx\">patch<\/span><span class=\"p\">?.<\/span><span class=\"nx\">data<\/span> <span class=\"o\">||<\/span> <span class=\"o\">!<\/span><span class=\"nx\">patches<\/span><span class=\"p\">?.<\/span><span class=\"nx\">left<\/span><span class=\"p\">?.<\/span><span class=\"nx\">patch<\/span><span class=\"p\">?.<\/span><span class=\"nx\">data<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n            <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nf\">error<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">No eye patches detected<\/span><span class=\"dl\">'<\/span><span class=\"p\">)<\/span>\n            <span class=\"k\">return<\/span>\n          <span class=\"p\">}<\/span>\n\n          <span class=\"c1\">\/\/ Calculate brightness for each eye<\/span>\n          <span class=\"kd\">const<\/span> <span class=\"nx\">calculateBrightness<\/span> <span class=\"o\">=<\/span> <span class=\"p\">(<\/span><span class=\"na\">imageData<\/span><span class=\"p\">:<\/span> <span class=\"nx\">ImageData<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n            <span class=\"kd\">let<\/span> <span class=\"nx\">total<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">0<\/span>\n\n            <span class=\"k\">for <\/span><span class=\"p\">(<\/span><span class=\"kd\">let<\/span> <span class=\"nx\">i<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">0<\/span><span class=\"p\">;<\/span> <span class=\"nx\">i<\/span> <span class=\"o\">&lt;<\/span> <span class=\"nx\">imageData<\/span><span class=\"p\">.<\/span><span class=\"nx\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">length<\/span><span class=\"p\">;<\/span> <span class=\"nx\">i<\/span> <span class=\"o\">+=<\/span> <span class=\"mi\">16<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n              <span class=\"c1\">\/\/ Convert RGB to grayscale<\/span>\n              <span class=\"kd\">const<\/span> <span class=\"nx\">r<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">imageData<\/span><span class=\"p\">.<\/span><span class=\"nx\">data<\/span><span class=\"p\">[<\/span><span class=\"nx\">i<\/span><span class=\"p\">]<\/span>\n              <span class=\"kd\">const<\/span> <span class=\"nx\">g<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">imageData<\/span><span class=\"p\">.<\/span><span class=\"nx\">data<\/span><span class=\"p\">[<\/span><span class=\"nx\">i<\/span> <span class=\"o\">+<\/span> <span class=\"mi\">1<\/span><span class=\"p\">]<\/span>\n              <span class=\"kd\">const<\/span> <span class=\"nx\">b<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">imageData<\/span><span class=\"p\">.<\/span><span class=\"nx\">data<\/span><span class=\"p\">[<\/span><span class=\"nx\">i<\/span> <span class=\"o\">+<\/span> <span class=\"mi\">2<\/span><span class=\"p\">]<\/span>\n              <span class=\"nx\">total<\/span> <span class=\"o\">+=<\/span> <span class=\"p\">(<\/span><span class=\"nx\">r<\/span> <span class=\"o\">+<\/span> <span class=\"nx\">g<\/span> <span class=\"o\">+<\/span> <span class=\"nx\">b<\/span><span class=\"p\">)<\/span> <span class=\"o\">\/<\/span> <span class=\"mi\">3<\/span>\n            <span class=\"p\">}<\/span>\n            <span class=\"k\">return<\/span> <span class=\"nx\">total<\/span> <span class=\"o\">\/<\/span> <span class=\"p\">(<\/span><span class=\"nx\">imageData<\/span><span class=\"p\">.<\/span><span class=\"nx\">width<\/span> <span class=\"o\">*<\/span> <span class=\"nx\">imageData<\/span><span class=\"p\">.<\/span><span class=\"nx\">height<\/span> <span class=\"o\">\/<\/span> <span class=\"mi\">4<\/span><span class=\"p\">)<\/span>\n          <span class=\"p\">}<\/span>\n\n          <span class=\"kd\">const<\/span> <span class=\"nx\">rightEyeBrightness<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">calculateBrightness<\/span><span class=\"p\">(<\/span><span class=\"nx\">patches<\/span><span class=\"p\">.<\/span><span class=\"nx\">right<\/span><span class=\"p\">.<\/span><span class=\"nx\">patch<\/span><span class=\"p\">)<\/span>\n          <span class=\"kd\">const<\/span> <span class=\"nx\">leftEyeBrightness<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">calculateBrightness<\/span><span class=\"p\">(<\/span><span class=\"nx\">patches<\/span><span class=\"p\">.<\/span><span class=\"nx\">left<\/span><span class=\"p\">.<\/span><span class=\"nx\">patch<\/span><span class=\"p\">)<\/span>\n          <span class=\"kd\">const<\/span> <span class=\"nx\">avgBrightness<\/span> <span class=\"o\">=<\/span> <span class=\"p\">(<\/span><span class=\"nx\">rightEyeBrightness<\/span> <span class=\"o\">+<\/span> <span class=\"nx\">leftEyeBrightness<\/span><span class=\"p\">)<\/span> <span class=\"o\">\/<\/span> <span class=\"mi\">2<\/span>\n\n          <span class=\"c1\">\/\/ Update rolling average<\/span>\n          <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">brightnessSamples<\/span><span class=\"p\">.<\/span><span class=\"nx\">current<\/span><span class=\"p\">.<\/span><span class=\"nx\">length<\/span> <span class=\"o\">&gt;=<\/span> <span class=\"nx\">SAMPLES_SIZE<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n            <span class=\"nx\">brightnessSamples<\/span><span class=\"p\">.<\/span><span class=\"nx\">current<\/span><span class=\"p\">.<\/span><span class=\"nf\">shift<\/span><span class=\"p\">()<\/span> <span class=\"c1\">\/\/ Remove oldest sample<\/span>\n          <span class=\"p\">}<\/span>\n          <span class=\"nx\">brightnessSamples<\/span><span class=\"p\">.<\/span><span class=\"nx\">current<\/span><span class=\"p\">.<\/span><span class=\"nf\">push<\/span><span class=\"p\">(<\/span><span class=\"nx\">avgBrightness<\/span><span class=\"p\">)<\/span>\n\n          <span class=\"c1\">\/\/ Calculate dynamic threshold from rolling average<\/span>\n          <span class=\"kd\">const<\/span> <span class=\"nx\">rollingAverage<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">brightnessSamples<\/span><span class=\"p\">.<\/span><span class=\"nx\">current<\/span><span class=\"p\">.<\/span><span class=\"nf\">reduce<\/span><span class=\"p\">((<\/span><span class=\"nx\">a<\/span><span class=\"p\">,<\/span> <span class=\"nx\">b<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nx\">a<\/span> <span class=\"o\">+<\/span> <span class=\"nx\">b<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">)<\/span> <span class=\"o\">\/<\/span> <span class=\"nx\">brightnessSamples<\/span><span class=\"p\">.<\/span><span class=\"nx\">current<\/span><span class=\"p\">.<\/span><span class=\"nx\">length<\/span>\n          <span class=\"kd\">const<\/span> <span class=\"nx\">dynamicThreshold<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">rollingAverage<\/span> <span class=\"o\">*<\/span> <span class=\"nx\">THRESHOLD_MULTIPLIER<\/span>\n          <span class=\"c1\">\/\/ Detect blink using dynamic threshold<\/span>\n          <span class=\"kd\">const<\/span> <span class=\"nx\">blinkDetected<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">avgBrightness<\/span> <span class=\"o\">&gt;<\/span> <span class=\"nx\">dynamicThreshold<\/span>\n\n          <span class=\"c1\">\/\/ Debounce blink detection to avoid rapid changes<\/span>\n          <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">blinkDetected<\/span> <span class=\"o\">!==<\/span> <span class=\"nx\">isCurrentlyBlinking<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n            <span class=\"kd\">const<\/span> <span class=\"nx\">now<\/span> <span class=\"o\">=<\/span> <span class=\"nb\">Date<\/span><span class=\"p\">.<\/span><span class=\"nf\">now<\/span><span class=\"p\">()<\/span>\n            <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">now<\/span> <span class=\"o\">-<\/span> <span class=\"nx\">lastBlinkTime<\/span> <span class=\"o\">&gt;<\/span> <span class=\"mi\">100<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span> <span class=\"c1\">\/\/ Minimum time between blink state changes<\/span>\n              <span class=\"nx\">isCurrentlyBlinking<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">blinkDetected<\/span>\n              <span class=\"nx\">lastBlinkTime<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">now<\/span>\n            <span class=\"p\">}<\/span>\n          <span class=\"p\">}<\/span>\n\n          <span class=\"c1\">\/\/ Use throttled broadcast instead of direct send<\/span>\n          <span class=\"nf\">throttledBroadcast<\/span><span class=\"p\">({<\/span>\n            <span class=\"na\">userId<\/span><span class=\"p\">:<\/span> <span class=\"nx\">userId<\/span><span class=\"p\">.<\/span><span class=\"nx\">current<\/span><span class=\"p\">,<\/span>\n            <span class=\"na\">isBlinking<\/span><span class=\"p\">:<\/span> <span class=\"nx\">isCurrentlyBlinking<\/span><span class=\"p\">,<\/span>\n            <span class=\"nx\">gazeX<\/span><span class=\"p\">,<\/span>\n            <span class=\"nx\">gazeY<\/span>\n          <span class=\"p\">})<\/span>\n\n        <span class=\"p\">}<\/span> <span class=\"k\">catch <\/span><span class=\"p\">(<\/span><span class=\"nx\">error<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n          <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nf\">error<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">Error processing gaze data:<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"nx\">error<\/span><span class=\"p\">)<\/span>\n        <span class=\"p\">}<\/span>\n      <span class=\"p\">})<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u062f\u0631\u06cc\u0627\u0641\u062a \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0627\u0632 \u062c\u0627\u06cc\u06cc \u06a9\u0647 \u06a9\u0627\u0631\u0628\u0631 \u0628\u0647 \u0622\u0646 \u0646\u06af\u0627\u0647 \u0645\u06cc \u06a9\u0646\u062f \u0633\u0627\u062f\u0647 \u0627\u0633\u062a \u0648 \u0645\u0627\u0646\u0646\u062f \u06af\u0631\u0641\u062a\u0646 \u0645\u0648\u0642\u0639\u06cc\u062a \u0647\u0627\u06cc \u0645\u0627\u0648\u0633 \u0631\u0648\u06cc \u0635\u0641\u062d\u0647 \u0639\u0645\u0644 \u0645\u06cc \u06a9\u0646\u062f. \u0628\u0627 \u0627\u06cc\u0646 \u062d\u0627\u0644\u060c \u0645\u0646 \u0647\u0645\u0686\u0646\u06cc\u0646 \u0645\u06cc\u200c\u062e\u0648\u0627\u0633\u062a\u0645 \u062a\u0634\u062e\u06cc\u0635 \u067e\u0644\u06a9 \u0632\u062f\u0646 \u0631\u0627 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 (\u06cc\u06a9 \u0648\u06cc\u0698\u06af\u06cc \u062c\u0627\u0644\u0628) \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u0645\u060c \u06a9\u0647 \u0646\u06cc\u0627\u0632 \u0628\u0647 \u067e\u0631\u0634 \u0627\u0632 \u0645\u06cc\u0627\u0646 \u062d\u0644\u0642\u0647\u200c\u0647\u0627 \u062f\u0627\u0634\u062a.<\/p>\n<p>\u0647\u0646\u06af\u0627\u0645\u06cc \u06a9\u0647 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 WebGazer \u0631\u0627 \u062f\u0631 \u06af\u0648\u06af\u0644 \u062c\u0633\u062a\u062c\u0648 \u0645\u06cc \u06a9\u0646\u06cc\u062f \u0648 \u062a\u0634\u062e\u06cc\u0635 \u0686\u0634\u0645\u06a9 \u0645\u06cc \u0632\u0646\u06cc\u062f\u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0628\u0631\u062e\u06cc \u0627\u0632 \u0628\u0627\u0632\u0645\u0627\u0646\u062f\u0647 \u0647\u0627\u06cc \u0627\u062c\u0631\u0627\u06cc \u0627\u0648\u0644\u06cc\u0647 \u0631\u0627 \u0645\u0634\u0627\u0647\u062f\u0647 \u06a9\u0646\u06cc\u062f. \u0645\u062b\u0644 \u0627\u06cc\u0646\u06a9\u0647 \u06a9\u062f\u0647\u0627\u06cc \u0646\u0638\u0631 \u062f\u0627\u062f\u0647 \u0634\u062f\u0647 \u062f\u0631 \u0645\u0646\u0628\u0639 \u062d\u062a\u06cc \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f. \u0645\u062a\u0623\u0633\u0641\u0627\u0646\u0647 \u0627\u06cc\u0646 \u0646\u0648\u0639 \u0642\u0627\u0628\u0644\u06cc\u062a \u0647\u0627 \u062f\u0631 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u062e\u0627\u0631\u062c \u0646\u0645\u06cc \u0634\u0648\u0646\u062f. \u0634\u0645\u0627 \u0628\u0627\u06cc\u062f \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0631\u0627 \u0628\u0647 \u0635\u0648\u0631\u062a \u062f\u0633\u062a\u06cc \u0627\u0646\u062c\u0627\u0645 \u062f\u0647\u06cc\u062f.<\/p>\n<p>\u067e\u0633 \u0627\u0632 \u0622\u0632\u0645\u0648\u0646 \u0648 \u062e\u0637\u0627\u06cc \u0641\u0631\u0627\u0648\u0627\u0646\u060c \u0645\u0646 \u0648 \u0645\u06a9\u0627\u0646\u200c\u0646\u0645\u0627 \u062a\u0648\u0627\u0646\u0633\u062a\u06cc\u0645 \u0631\u0627\u0647\u200c\u062d\u0644\u06cc \u0627\u0631\u0627\u0626\u0647 \u06a9\u0646\u06cc\u0645 \u06a9\u0647 \u067e\u06cc\u06a9\u0633\u0644\u200c\u0647\u0627 \u0648 \u0633\u0637\u0648\u062d \u0631\u0648\u0634\u0646\u0627\u06cc\u06cc \u0631\u0627 \u0627\u0632 \u062f\u0627\u062f\u0647\u200c\u0647\u0627\u06cc \u067e\u0686 \u0686\u0634\u0645 \u0645\u062d\u0627\u0633\u0628\u0647 \u0645\u06cc\u200c\u06a9\u0646\u062f \u062a\u0627 \u0645\u0634\u062e\u0635 \u0634\u0648\u062f \u06a9\u0627\u0631\u0628\u0631 \u0686\u0647 \u0632\u0645\u0627\u0646\u06cc \u0686\u0634\u0645\u06a9 \u0645\u06cc\u200c\u0632\u0646\u062f. \u0647\u0645\u0686\u0646\u06cc\u0646 \u062f\u0627\u0631\u0627\u06cc \u0628\u0631\u062e\u06cc \u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u0646\u0648\u0631 \u067e\u0648\u06cc\u0627 \u0627\u0633\u062a \u0632\u06cc\u0631\u0627 \u0645\u062a\u0648\u062c\u0647 \u0634\u062f\u0645 \u06a9\u0647 (\u062d\u062f\u0627\u0642\u0644 \u0628\u0631\u0627\u06cc \u0645\u0646) \u0648\u0628 \u06a9\u0645 \u0628\u0633\u062a\u0647 \u0628\u0647 \u0646\u0648\u0631 \u0634\u0645\u0627 \u0647\u0645\u06cc\u0634\u0647 \u062a\u0634\u062e\u06cc\u0635 \u0646\u0645\u06cc \u062f\u0647\u062f \u06a9\u0647 \u0634\u0645\u0627 \u0686\u0647 \u0632\u0645\u0627\u0646\u06cc \u0686\u0634\u0645\u06a9 \u0645\u06cc \u0632\u0646\u06cc\u062f. \u0628\u0631\u0627\u06cc \u0645\u0646\u060c \u0647\u0631 \u0686\u0647 \u062a\u0635\u0648\u06cc\u0631\/\u0627\u062a\u0627\u0642 \u0645\u0646 \u0631\u0648\u0634\u0646\u200c\u062a\u0631 \u0628\u0627\u0634\u062f\u060c \u0628\u062f\u062a\u0631 \u06a9\u0627\u0631 \u0645\u06cc\u200c\u06a9\u0646\u062f \u0648 \u062f\u0631 \u0646\u0648\u0631 \u062a\u0627\u0631\u06cc\u06a9\u200c\u062a\u0631 \u0628\u0647\u062a\u0631 \u0639\u0645\u0644 \u0645\u06cc\u200c\u06a9\u0646\u062f.<\/p>\n<p>\u0647\u0646\u06af\u0627\u0645 \u0627\u0634\u06a9\u0627\u0644 \u0632\u062f\u0627\u06cc\u06cc \u0642\u0627\u0628\u0644\u06cc\u062a \u0647\u0627\u06cc \u0631\u062f\u06cc\u0627\u0628\u06cc \u0686\u0634\u0645 (WebGazer \u062f\u0627\u0631\u0627\u06cc \u0648\u06cc\u0698\u06af\u06cc \u0647\u0627\u06cc \u0628\u0633\u06cc\u0627\u0631 \u062e\u0648\u0628\u06cc \u0627\u0633\u062a <code>.setPredictionPoints<\/code> \u062a\u0645\u0627\u0633\u06cc \u06a9\u0647 \u06cc\u06a9 \u0646\u0642\u0637\u0647 \u0642\u0631\u0645\u0632 \u0631\u0627 \u0631\u0648\u06cc \u0635\u0641\u062d\u0647 \u0646\u0645\u0627\u06cc\u0634 \u0645\u06cc \u062f\u0647\u062f \u062a\u0627 \u062c\u0627\u06cc\u06cc \u06a9\u0647 \u0634\u0645\u0627 \u0628\u0647 \u0622\u0646 \u0646\u06af\u0627\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u062f \u062a\u062c\u0633\u0645 \u06a9\u0646\u06cc\u062f)\u060c \u0645\u062a\u0648\u062c\u0647 \u0634\u062f\u0645 \u06a9\u0647 \u0631\u062f\u06cc\u0627\u0628\u06cc \u062e\u06cc\u0644\u06cc \u062f\u0642\u06cc\u0642 \u0646\u06cc\u0633\u062a. <em>\u0645\u06af\u0631 \u0627\u06cc\u0646\u06a9\u0647 \u0622\u0646 \u0631\u0627 \u06a9\u0627\u0644\u06cc\u0628\u0631\u0647 \u06a9\u0646\u06cc\u062f<\/em> \u06a9\u0627\u0631\u06cc \u06a9\u0647 \u067e\u0631\u0648\u0698\u0647 \u0627\u0632 \u0634\u0645\u0627 \u0645\u06cc \u062e\u0648\u0627\u0647\u062f \u0642\u0628\u0644 \u0627\u0632 \u067e\u06cc\u0648\u0633\u062a\u0646 \u0628\u0647 \u0647\u0631 \u0627\u062a\u0627\u0642\u06cc \u0627\u0646\u062c\u0627\u0645 \u062f\u0647\u06cc\u062f.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"kd\">const<\/span> <span class=\"nx\">startCalibration<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">useCallback<\/span><span class=\"p\">(()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"na\">points<\/span><span class=\"p\">:<\/span> <span class=\"nx\">CalibrationPoint<\/span><span class=\"p\">[]<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span>\n      <span class=\"p\">{<\/span> <span class=\"na\">x<\/span><span class=\"p\">:<\/span> <span class=\"mf\">0.1<\/span><span class=\"p\">,<\/span> <span class=\"na\">y<\/span><span class=\"p\">:<\/span> <span class=\"mf\">0.1<\/span> <span class=\"p\">},<\/span>\n      <span class=\"p\">{<\/span> <span class=\"na\">x<\/span><span class=\"p\">:<\/span> <span class=\"mf\">0.9<\/span><span class=\"p\">,<\/span> <span class=\"na\">y<\/span><span class=\"p\">:<\/span> <span class=\"mf\">0.1<\/span> <span class=\"p\">},<\/span>\n      <span class=\"p\">{<\/span> <span class=\"na\">x<\/span><span class=\"p\">:<\/span> <span class=\"mf\">0.5<\/span><span class=\"p\">,<\/span> <span class=\"na\">y<\/span><span class=\"p\">:<\/span> <span class=\"mf\">0.5<\/span> <span class=\"p\">},<\/span>\n      <span class=\"p\">{<\/span> <span class=\"na\">x<\/span><span class=\"p\">:<\/span> <span class=\"mf\">0.1<\/span><span class=\"p\">,<\/span> <span class=\"na\">y<\/span><span class=\"p\">:<\/span> <span class=\"mf\">0.9<\/span> <span class=\"p\">},<\/span>\n      <span class=\"p\">{<\/span> <span class=\"na\">x<\/span><span class=\"p\">:<\/span> <span class=\"mf\">0.9<\/span><span class=\"p\">,<\/span> <span class=\"na\">y<\/span><span class=\"p\">:<\/span> <span class=\"mf\">0.9<\/span> <span class=\"p\">},<\/span>\n    <span class=\"p\">]<\/span>\n    <span class=\"nf\">setCalibrationPoints<\/span><span class=\"p\">(<\/span><span class=\"nx\">points<\/span><span class=\"p\">)<\/span>\n    <span class=\"nf\">setCurrentPoint<\/span><span class=\"p\">(<\/span><span class=\"mi\">0<\/span><span class=\"p\">)<\/span>\n    <span class=\"nf\">setIsCalibrating<\/span><span class=\"p\">(<\/span><span class=\"kc\">true<\/span><span class=\"p\">)<\/span>\n\n    <span class=\"nb\">window<\/span><span class=\"p\">.<\/span><span class=\"nx\">webgazer<\/span><span class=\"p\">.<\/span><span class=\"nf\">clearData<\/span><span class=\"p\">()<\/span>\n  <span class=\"p\">},<\/span> <span class=\"p\">[])<\/span>\n\n  <span class=\"kd\">const<\/span> <span class=\"nx\">handleCalibrationClick<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">useCallback<\/span><span class=\"p\">((<\/span><span class=\"nx\">event<\/span><span class=\"p\">:<\/span> <span class=\"nx\">React<\/span><span class=\"p\">.<\/span><span class=\"nx\">MouseEvent<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"o\">!<\/span><span class=\"nx\">isCalibrating<\/span><span class=\"p\">)<\/span> <span class=\"k\">return<\/span>\n\n    <span class=\"c1\">\/\/ Record click location for calibration<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"nx\">x<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">event<\/span><span class=\"p\">.<\/span><span class=\"nx\">clientX<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"nx\">y<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">event<\/span><span class=\"p\">.<\/span><span class=\"nx\">clientY<\/span>\n    <span class=\"nb\">window<\/span><span class=\"p\">.<\/span><span class=\"nx\">webgazer<\/span><span class=\"p\">.<\/span><span class=\"nf\">recordScreenPosition<\/span><span class=\"p\">(<\/span><span class=\"nx\">x<\/span><span class=\"p\">,<\/span> <span class=\"nx\">y<\/span><span class=\"p\">,<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">click<\/span><span class=\"dl\">'<\/span><span class=\"p\">)<\/span>\n\n    <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">currentPoint<\/span> <span class=\"o\">&lt;<\/span> <span class=\"nx\">calibrationPoints<\/span><span class=\"p\">.<\/span><span class=\"nx\">length<\/span> <span class=\"o\">-<\/span> <span class=\"mi\">1<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n      <span class=\"nf\">setCurrentPoint<\/span><span class=\"p\">(<\/span><span class=\"nx\">prev<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nx\">prev<\/span> <span class=\"o\">+<\/span> <span class=\"mi\">1<\/span><span class=\"p\">)<\/span>\n    <span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span>\n      <span class=\"nf\">setIsCalibrating<\/span><span class=\"p\">(<\/span><span class=\"kc\">false<\/span><span class=\"p\">)<\/span>\n      <span class=\"nf\">setHasCalibrated<\/span><span class=\"p\">(<\/span><span class=\"kc\">true<\/span><span class=\"p\">)<\/span>\n    <span class=\"p\">}<\/span>\n  <span class=\"p\">},<\/span> <span class=\"p\">[<\/span><span class=\"nx\">isCalibrating<\/span><span class=\"p\">,<\/span> <span class=\"nx\">currentPoint<\/span><span class=\"p\">,<\/span> <span class=\"nx\">calibrationPoints<\/span><span class=\"p\">.<\/span><span class=\"nx\">length<\/span><span class=\"p\">])<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>          <div classname=\"fixed inset-0 bg-black\/50 flex items-center justify-center z-50\">\n            {calibrationPoints.map((point, index) =&gt; (\n              \n            ))}\n            <p>\n              Click the red dot to calibrate ({currentPoint + 1}\/{calibrationPoints.length})\n            <\/p>\n          <\/div>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u0633\u0627\u0633\u0627\u064b \u0645\u0627 5 \u0646\u0642\u0637\u0647 \u0631\u0627 \u0631\u0648\u06cc \u0635\u0641\u062d\u0647 \u0646\u0645\u0627\u06cc\u0634 \u0645\u06cc\u200c\u062f\u0647\u06cc\u0645: \u06cc\u06a9\u06cc \u062f\u0631 \u0647\u0631 \u06af\u0648\u0634\u0647 \u0648 \u062f\u06cc\u06af\u0631\u06cc \u062f\u0631 \u0645\u0631\u06a9\u0632. \u0628\u0627 \u06a9\u0644\u06cc\u06a9 \u06a9\u0631\u062f\u0646 \u0631\u0648\u06cc \u0622\u0646\u0647\u0627 \u0645\u0648\u0642\u0639\u06cc\u062a \u0635\u0641\u062d\u0647 \u062f\u0631 WebGazer \u062b\u0628\u062a \u0645\u06cc \u0634\u0648\u062f \u062a\u0627 \u0628\u062a\u0648\u0627\u0646\u062f \u0645\u062f\u0644 \u0631\u0627 \u06a9\u0645\u06cc \u0628\u0647\u062a\u0631 \u062a\u0646\u0638\u06cc\u0645 \u06a9\u0646\u062f \u062a\u0627 \u062c\u0627\u06cc\u06cc \u06a9\u0647 \u0628\u0647 \u062f\u0646\u0628\u0627\u0644 \u0622\u0646 \u0647\u0633\u062a\u06cc\u062f \u0631\u0627 \u067e\u06cc\u0634 \u0628\u06cc\u0646\u06cc \u06a9\u0646\u062f. \u0645\u0645\u06a9\u0646 \u0627\u0633\u062a \u062a\u0639\u062c\u0628 \u06a9\u0646\u06cc\u062f \u06a9\u0647 \u0627\u06cc\u0646 \u06a9\u0644\u06cc\u06a9 \u062f\u0631 \u0648\u0627\u0642\u0639 \u0686\u0647 \u06a9\u0627\u0631\u06cc \u0627\u0646\u062c\u0627\u0645 \u0645\u06cc \u062f\u0647\u062f \u0648 \u0642\u0633\u0645\u062a \u062e\u0646\u062f\u0647 \u062f\u0627\u0631 \u0627\u06cc\u0646 \u0627\u0633\u062a \u06a9\u0647 \u0634\u0645\u0627 \u062f\u0631 \u0648\u0627\u0642\u0639 \u0628\u0647 \u062c\u0627\u06cc\u06cc \u06a9\u0647 \u06a9\u0644\u06cc\u06a9 \u0645\u06cc \u06a9\u0646\u06cc\u062f \u0646\u06af\u0627\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u062f\u060c \u062f\u0631\u0633\u062a \u0627\u0633\u062a\u061f \u0648 \u0628\u0627 \u0627\u0646\u062c\u0627\u0645 \u0627\u06cc\u0646 \u06a9\u0627\u0631\u060c WebGazer \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u062d\u0631\u06a9\u0627\u062a \u0686\u0634\u0645 \u0634\u0645\u0627 \u0631\u0627 \u06a9\u0645\u06cc \u0628\u0647\u062a\u0631 \u067e\u0631\u062f\u0627\u0632\u0634 \u06a9\u0646\u062f \u0648 \u0646\u062a\u0627\u06cc\u062c \u062f\u0642\u06cc\u0642 \u062a\u0631\u06cc \u0627\u0631\u0627\u0626\u0647 \u062f\u0647\u062f. \u062e\u06cc\u0644\u06cc \u0628\u0627\u062d\u0627\u0644\u0647<\/p>\n<h2><span class=\"ez-toc-section\" id=\"%DA%86%D8%B4%D9%85\"><\/span>\n<p>  \u0686\u0634\u0645<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0645\u0646 \u0642\u0628\u0644\u0627\u064b \u06cc\u06a9 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc SVG \u0633\u0627\u062f\u0647 \u0628\u0631\u0627\u06cc \u0686\u0634\u0645 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u0647 \u0628\u0648\u062f\u0645 \u0648 \u0622\u0646 \u0631\u0627 \u0628\u0647 \u0631\u062f\u06cc\u0627\u0628\u06cc \u0645\u062a\u0635\u0644 \u06a9\u0631\u062f\u0647 \u0628\u0648\u062f\u0645\u060c \u0628\u0627 \u0627\u06cc\u0646 \u062d\u0627\u0644 \u0628\u0627\u06cc\u062f \u06a9\u0645\u06cc \u0628\u06cc\u0634\u062a\u0631 \u062a\u0644\u0637\u06cc\u0641 \u0634\u0648\u062f. \u062f\u0631 \u0632\u06cc\u0631 \u06a9\u0645\u06cc \u0646\u062d\u0648\u0647 \u0638\u0627\u0647\u0631 \u0622\u0646 \u0631\u0627 \u0645\u0634\u0627\u0647\u062f\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u062f. \u0627\u0644\u0647\u0627\u0645 \u0628\u062e\u0634 Alucard Eyes \u062a\u0648\u0633\u0637 MIKELopez \u0628\u0648\u062f.<\/p>\n<p><\/p>\n<p>\u0627\u06cc\u0646 \u06cc\u06a9 \u0646\u0633\u062e\u0647 \u0642\u0628\u0644\u06cc \u0627\u0632 \u0686\u0634\u0645 \u0627\u0633\u062a\u060c \u0627\u0645\u0627 \u062a\u0642\u0631\u06cc\u0628\u0627\u064b 95\u066a \u062f\u0631 \u0622\u0646\u062c\u0627 \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f. \u0645\u0646 \u0627\u06cc\u0646 \u0648\u06cc\u062f\u06cc\u0648 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0632\u0648\u062c \u062f\u0648\u0633\u062a\u0627\u0646\u0645 \u0641\u0631\u0633\u062a\u0627\u062f\u0645 \u0648 \u0622\u0646\u0647\u0627 \u0641\u06a9\u0631 \u06a9\u0631\u062f\u0646\u062f \u0628\u0633\u06cc\u0627\u0631 \u062c\u0627\u0644\u0628 \u0627\u0633\u062a\u060c \u0628\u0647 \u062e\u0635\u0648\u0635 \u0648\u0642\u062a\u06cc \u0645\u06cc \u062f\u0627\u0646\u0633\u062a\u0646\u062f \u06a9\u0647 \u062f\u0631 \u0648\u0627\u0642\u0639 \u062d\u0631\u06a9\u0627\u062a \u0686\u0634\u0645 \u0634\u0645\u0627 \u0631\u0627 \u062f\u0646\u0628\u0627\u0644 \u0645\u06cc \u06a9\u0646\u062f! \u0647\u0645\u0686\u0646\u06cc\u0646 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0646\u0642\u0637\u0647 \u067e\u06cc\u0634\u200c\u0628\u06cc\u0646\u06cc WebGazer \u0631\u0627 \u062f\u0631 \u062d\u0627\u0644 \u062d\u0631\u06a9\u062a \u0631\u0648\u06cc \u0635\u0641\u062d\u0647 \u0645\u0634\u0627\u0647\u062f\u0647 \u06a9\u0646\u06cc\u062f.<\/p>\n<p>\u06a9\u0627\u0645\u067e\u0648\u0646\u0646\u062a \u0686\u0634\u0645 \u062e\u0648\u062f \u06cc\u06a9 SVG \u0628\u0627 \u062a\u0639\u062f\u0627\u062f\u06cc \u0627\u0646\u06cc\u0645\u06cc\u0634\u0646 \u0645\u0633\u06cc\u0631 \u0627\u0632 \u0637\u0631\u06cc\u0642 Motion \u0627\u0633\u062a.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight tsx\"><code>      <span class=\"p\">&lt;<\/span><span class=\"nt\">svg<\/span>\n        <span class=\"na\">className<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"s2\">`w-full h-full self-<\/span><span class=\"p\">${<\/span><span class=\"nx\">alignment<\/span><span class=\"p\">}<\/span><span class=\"s2\"> max-w-[350px] max-h-[235px]`<\/span><span class=\"si\">}<\/span>\n        <span class=\"na\">viewBox<\/span><span class=\"p\">=<\/span><span class=\"s\">\"-50 0 350 235\"<\/span>\n        <span class=\"na\">preserveAspectRatio<\/span><span class=\"p\">=<\/span><span class=\"s\">\"xMidYMid meet\"<\/span>\n      <span class=\"p\">&gt;<\/span>\n        <span class=\"si\">{<\/span><span class=\"cm\">\/* Definitions for gradients and filters *\/<\/span><span class=\"si\">}<\/span>\n        <span class=\"p\">&lt;<\/span><span class=\"nt\">defs<\/span><span class=\"p\">&gt;<\/span>\n          <span class=\"p\">&lt;<\/span><span class=\"nt\">filter<\/span> <span class=\"na\">id<\/span><span class=\"p\">=<\/span><span class=\"s\">\"pupil-blur\"<\/span><span class=\"p\">&gt;<\/span>\n            <span class=\"p\">&lt;<\/span><span class=\"nt\">feGaussianBlur<\/span> <span class=\"na\">stdDeviation<\/span><span class=\"p\">=<\/span><span class=\"s\">\"0.75\"<\/span> <span class=\"p\">\/&gt;<\/span>\n          <span class=\"p\"\/><span class=\"nt\">filter<\/span><span class=\"p\">&gt;<\/span>\n          <span class=\"p\">&lt;<\/span><span class=\"nt\">radialGradient<\/span> <span class=\"na\">id<\/span><span class=\"p\">=<\/span><span class=\"s\">\"eyeball-gradient\"<\/span><span class=\"p\">&gt;<\/span>\n            <span class=\"p\">&lt;<\/span><span class=\"nt\">stop<\/span> <span class=\"na\">offset<\/span><span class=\"p\">=<\/span><span class=\"s\">\"60%\"<\/span> <span class=\"na\">stopColor<\/span><span class=\"p\">=<\/span><span class=\"s\">\"#dcdae0\"<\/span> <span class=\"p\">\/&gt;<\/span>\n            <span class=\"p\">&lt;<\/span><span class=\"nt\">stop<\/span> <span class=\"na\">offset<\/span><span class=\"p\">=<\/span><span class=\"s\">\"100%\"<\/span> <span class=\"na\">stopColor<\/span><span class=\"p\">=<\/span><span class=\"s\">\"#a8a7ad\"<\/span> <span class=\"p\">\/&gt;<\/span>\n          <span class=\"p\"\/><span class=\"nt\">radialGradient<\/span><span class=\"p\">&gt;<\/span>\n          <span class=\"p\">&lt;<\/span><span class=\"nt\">radialGradient<\/span> \n            <span class=\"na\">id<\/span><span class=\"p\">=<\/span><span class=\"s\">\"pupil-gradient\"<\/span>\n            <span class=\"na\">cx<\/span><span class=\"p\">=<\/span><span class=\"s\">\"0.35\"<\/span>\n            <span class=\"na\">cy<\/span><span class=\"p\">=<\/span><span class=\"s\">\"0.35\"<\/span>\n            <span class=\"na\">r<\/span><span class=\"p\">=<\/span><span class=\"s\">\"0.65\"<\/span>\n          <span class=\"p\">&gt;<\/span>\n            <span class=\"p\">&lt;<\/span><span class=\"nt\">stop<\/span> <span class=\"na\">offset<\/span><span class=\"p\">=<\/span><span class=\"s\">\"0%\"<\/span> <span class=\"na\">stopColor<\/span><span class=\"p\">=<\/span><span class=\"s\">\"#444\"<\/span> <span class=\"p\">\/&gt;<\/span>\n            <span class=\"p\">&lt;<\/span><span class=\"nt\">stop<\/span> <span class=\"na\">offset<\/span><span class=\"p\">=<\/span><span class=\"s\">\"75%\"<\/span> <span class=\"na\">stopColor<\/span><span class=\"p\">=<\/span><span class=\"s\">\"#000\"<\/span> <span class=\"p\">\/&gt;<\/span>\n            <span class=\"p\">&lt;<\/span><span class=\"nt\">stop<\/span> <span class=\"na\">offset<\/span><span class=\"p\">=<\/span><span class=\"s\">\"100%\"<\/span> <span class=\"na\">stopColor<\/span><span class=\"p\">=<\/span><span class=\"s\">\"#000\"<\/span> <span class=\"p\">\/&gt;<\/span>\n          <span class=\"p\"\/><span class=\"nt\">radialGradient<\/span><span class=\"p\">&gt;<\/span>\n          <span class=\"p\">&lt;<\/span><span class=\"nt\">radialGradient<\/span> \n            <span class=\"na\">id<\/span><span class=\"p\">=<\/span><span class=\"s\">\"corner-gradient-left\"<\/span>\n            <span class=\"na\">cx<\/span><span class=\"p\">=<\/span><span class=\"s\">\"0.3\"<\/span>\n            <span class=\"na\">cy<\/span><span class=\"p\">=<\/span><span class=\"s\">\"0.5\"<\/span>\n            <span class=\"na\">r<\/span><span class=\"p\">=<\/span><span class=\"s\">\"0.25\"<\/span>\n            <span class=\"na\">gradientUnits<\/span><span class=\"p\">=<\/span><span class=\"s\">\"objectBoundingBox\"<\/span>\n          <span class=\"p\">&gt;<\/span>\n            <span class=\"p\">&lt;<\/span><span class=\"nt\">stop<\/span> <span class=\"na\">offset<\/span><span class=\"p\">=<\/span><span class=\"s\">\"0%\"<\/span> <span class=\"na\">stopColor<\/span><span class=\"p\">=<\/span><span class=\"s\">\"rgba(0,0,0,0.75)\"<\/span> <span class=\"p\">\/&gt;<\/span>\n            <span class=\"p\">&lt;<\/span><span class=\"nt\">stop<\/span> <span class=\"na\">offset<\/span><span class=\"p\">=<\/span><span class=\"s\">\"100%\"<\/span> <span class=\"na\">stopColor<\/span><span class=\"p\">=<\/span><span class=\"s\">\"rgba(0,0,0,0)\"<\/span> <span class=\"p\">\/&gt;<\/span>\n          <span class=\"p\"\/><span class=\"nt\">radialGradient<\/span><span class=\"p\">&gt;<\/span>\n\n          <span class=\"p\">&lt;<\/span><span class=\"nt\">radialGradient<\/span> \n            <span class=\"na\">id<\/span><span class=\"p\">=<\/span><span class=\"s\">\"corner-gradient-right\"<\/span>\n            <span class=\"na\">cx<\/span><span class=\"p\">=<\/span><span class=\"s\">\"0.7\"<\/span>\n            <span class=\"na\">cy<\/span><span class=\"p\">=<\/span><span class=\"s\">\"0.5\"<\/span>\n            <span class=\"na\">r<\/span><span class=\"p\">=<\/span><span class=\"s\">\"0.25\"<\/span>\n            <span class=\"na\">gradientUnits<\/span><span class=\"p\">=<\/span><span class=\"s\">\"objectBoundingBox\"<\/span>\n          <span class=\"p\">&gt;<\/span>\n            <span class=\"p\">&lt;<\/span><span class=\"nt\">stop<\/span> <span class=\"na\">offset<\/span><span class=\"p\">=<\/span><span class=\"s\">\"0%\"<\/span> <span class=\"na\">stopColor<\/span><span class=\"p\">=<\/span><span class=\"s\">\"rgba(0,0,0,0.75)\"<\/span> <span class=\"p\">\/&gt;<\/span>\n            <span class=\"p\">&lt;<\/span><span class=\"nt\">stop<\/span> <span class=\"na\">offset<\/span><span class=\"p\">=<\/span><span class=\"s\">\"100%\"<\/span> <span class=\"na\">stopColor<\/span><span class=\"p\">=<\/span><span class=\"s\">\"rgba(0,0,0,0)\"<\/span> <span class=\"p\">\/&gt;<\/span>\n          <span class=\"p\"\/><span class=\"nt\">radialGradient<\/span><span class=\"p\">&gt;<\/span>\n\n          <span class=\"p\">&lt;<\/span><span class=\"nt\">filter<\/span> <span class=\"na\">id<\/span><span class=\"p\">=<\/span><span class=\"s\">\"filter0_f_302_14\"<\/span> <span class=\"na\">x<\/span><span class=\"p\">=<\/span><span class=\"s\">\"-25\"<\/span> <span class=\"na\">y<\/span><span class=\"p\">=<\/span><span class=\"s\">\"0\"<\/span> <span class=\"na\">width<\/span><span class=\"p\">=<\/span><span class=\"s\">\"320\"<\/span> <span class=\"na\">height<\/span><span class=\"p\">=<\/span><span class=\"s\">\"150\"<\/span> <span class=\"na\">filterUnits<\/span><span class=\"p\">=<\/span><span class=\"s\">\"userSpaceOnUse\"<\/span> <span class=\"na\">colorInterpolationFilters<\/span><span class=\"p\">=<\/span><span class=\"s\">\"sRGB\"<\/span><span class=\"p\">&gt;<\/span>\n            <span class=\"p\">&lt;<\/span><span class=\"nt\">feGaussianBlur<\/span> <span class=\"na\">stdDeviation<\/span><span class=\"p\">=<\/span><span class=\"s\">\"4.1\"<\/span> <span class=\"na\">result<\/span><span class=\"p\">=<\/span><span class=\"s\">\"effect1_foregroundBlur_302_14\"<\/span><span class=\"p\">\/&gt;<\/span>\n          <span class=\"p\"\/><span class=\"nt\">filter<\/span><span class=\"p\">&gt;<\/span>\n          <span class=\"p\">&lt;<\/span><span class=\"nt\">filter<\/span> <span class=\"na\">id<\/span><span class=\"p\">=<\/span><span class=\"s\">\"filter1_f_302_14\"<\/span> <span class=\"na\">x<\/span><span class=\"p\">=<\/span><span class=\"s\">\"-25\"<\/span> <span class=\"na\">y<\/span><span class=\"p\">=<\/span><span class=\"s\">\"85\"<\/span> <span class=\"na\">width<\/span><span class=\"p\">=<\/span><span class=\"s\">\"320\"<\/span> <span class=\"na\">height<\/span><span class=\"p\">=<\/span><span class=\"s\">\"150\"<\/span> <span class=\"na\">filterUnits<\/span><span class=\"p\">=<\/span><span class=\"s\">\"userSpaceOnUse\"<\/span> <span class=\"na\">colorInterpolationFilters<\/span><span class=\"p\">=<\/span><span class=\"s\">\"sRGB\"<\/span><span class=\"p\">&gt;<\/span>\n            <span class=\"p\">&lt;<\/span><span class=\"nt\">feGaussianBlur<\/span> <span class=\"na\">stdDeviation<\/span><span class=\"p\">=<\/span><span class=\"s\">\"4.1\"<\/span> <span class=\"na\">result<\/span><span class=\"p\">=<\/span><span class=\"s\">\"effect1_foregroundBlur_302_14\"<\/span><span class=\"p\">\/&gt;<\/span>\n          <span class=\"p\"\/><span class=\"nt\">filter<\/span><span class=\"p\">&gt;<\/span>\n          <span class=\"p\">&lt;<\/span><span class=\"nt\">filter<\/span> <span class=\"na\">id<\/span><span class=\"p\">=<\/span><span class=\"s\">\"filter2_f_302_14\"<\/span> <span class=\"na\">x<\/span><span class=\"p\">=<\/span><span class=\"s\">\"-50\"<\/span> <span class=\"na\">y<\/span><span class=\"p\">=<\/span><span class=\"s\">\"-30\"<\/span> <span class=\"na\">width<\/span><span class=\"p\">=<\/span><span class=\"s\">\"400\"<\/span> <span class=\"na\">height<\/span><span class=\"p\">=<\/span><span class=\"s\">\"170\"<\/span> <span class=\"na\">filterUnits<\/span><span class=\"p\">=<\/span><span class=\"s\">\"userSpaceOnUse\"<\/span> <span class=\"na\">colorInterpolationFilters<\/span><span class=\"p\">=<\/span><span class=\"s\">\"sRGB\"<\/span><span class=\"p\">&gt;<\/span>\n            <span class=\"p\">&lt;<\/span><span class=\"nt\">feGaussianBlur<\/span> <span class=\"na\">stdDeviation<\/span><span class=\"p\">=<\/span><span class=\"s\">\"7.6\"<\/span> <span class=\"na\">result<\/span><span class=\"p\">=<\/span><span class=\"s\">\"effect1_foregroundBlur_302_14\"<\/span><span class=\"p\">\/&gt;<\/span>\n          <span class=\"p\"\/><span class=\"nt\">filter<\/span><span class=\"p\">&gt;<\/span>\n          <span class=\"p\">&lt;<\/span><span class=\"nt\">filter<\/span> <span class=\"na\">id<\/span><span class=\"p\">=<\/span><span class=\"s\">\"filter3_f_302_14\"<\/span> <span class=\"na\">x<\/span><span class=\"p\">=<\/span><span class=\"s\">\"-50\"<\/span> <span class=\"na\">y<\/span><span class=\"p\">=<\/span><span class=\"s\">\"95\"<\/span> <span class=\"na\">width<\/span><span class=\"p\">=<\/span><span class=\"s\">\"400\"<\/span> <span class=\"na\">height<\/span><span class=\"p\">=<\/span><span class=\"s\">\"170\"<\/span> <span class=\"na\">filterUnits<\/span><span class=\"p\">=<\/span><span class=\"s\">\"userSpaceOnUse\"<\/span> <span class=\"na\">colorInterpolationFilters<\/span><span class=\"p\">=<\/span><span class=\"s\">\"sRGB\"<\/span><span class=\"p\">&gt;<\/span>\n            <span class=\"p\">&lt;<\/span><span class=\"nt\">feGaussianBlur<\/span> <span class=\"na\">stdDeviation<\/span><span class=\"p\">=<\/span><span class=\"s\">\"7.6\"<\/span> <span class=\"na\">result<\/span><span class=\"p\">=<\/span><span class=\"s\">\"effect1_foregroundBlur_302_14\"<\/span><span class=\"p\">\/&gt;<\/span>\n          <span class=\"p\"\/><span class=\"nt\">filter<\/span><span class=\"p\">&gt;<\/span>\n          <span class=\"p\">&lt;<\/span><span class=\"nt\">filter<\/span> <span class=\"na\">id<\/span><span class=\"p\">=<\/span><span class=\"s\">\"filter4_f_302_14\"<\/span> <span class=\"na\">x<\/span><span class=\"p\">=<\/span><span class=\"s\">\"0\"<\/span> <span class=\"na\">y<\/span><span class=\"p\">=<\/span><span class=\"s\">\"-20\"<\/span> <span class=\"na\">width<\/span><span class=\"p\">=<\/span><span class=\"s\">\"260\"<\/span> <span class=\"na\">height<\/span><span class=\"p\">=<\/span><span class=\"s\">\"150\"<\/span> <span class=\"na\">filterUnits<\/span><span class=\"p\">=<\/span><span class=\"s\">\"userSpaceOnUse\"<\/span> <span class=\"na\">colorInterpolationFilters<\/span><span class=\"p\">=<\/span><span class=\"s\">\"sRGB\"<\/span><span class=\"p\">&gt;<\/span>\n            <span class=\"p\">&lt;<\/span><span class=\"nt\">feGaussianBlur<\/span> <span class=\"na\">stdDeviation<\/span><span class=\"p\">=<\/span><span class=\"s\">\"3.35\"<\/span> <span class=\"na\">result<\/span><span class=\"p\">=<\/span><span class=\"s\">\"effect1_foregroundBlur_302_14\"<\/span><span class=\"p\">\/&gt;<\/span>\n          <span class=\"p\"\/><span class=\"nt\">filter<\/span><span class=\"p\">&gt;<\/span>\n          <span class=\"p\">&lt;<\/span><span class=\"nt\">filter<\/span> <span class=\"na\">id<\/span><span class=\"p\">=<\/span><span class=\"s\">\"filter5_f_302_14\"<\/span> <span class=\"na\">x<\/span><span class=\"p\">=<\/span><span class=\"s\">\"0\"<\/span> <span class=\"na\">y<\/span><span class=\"p\">=<\/span><span class=\"s\">\"105\"<\/span> <span class=\"na\">width<\/span><span class=\"p\">=<\/span><span class=\"s\">\"260\"<\/span> <span class=\"na\">height<\/span><span class=\"p\">=<\/span><span class=\"s\">\"150\"<\/span> <span class=\"na\">filterUnits<\/span><span class=\"p\">=<\/span><span class=\"s\">\"userSpaceOnUse\"<\/span> <span class=\"na\">colorInterpolationFilters<\/span><span class=\"p\">=<\/span><span class=\"s\">\"sRGB\"<\/span><span class=\"p\">&gt;<\/span>\n            <span class=\"p\">&lt;<\/span><span class=\"nt\">feGaussianBlur<\/span> <span class=\"na\">stdDeviation<\/span><span class=\"p\">=<\/span><span class=\"s\">\"3.35\"<\/span> <span class=\"na\">result<\/span><span class=\"p\">=<\/span><span class=\"s\">\"effect1_foregroundBlur_302_14\"<\/span><span class=\"p\">\/&gt;<\/span>\n          <span class=\"p\"\/><span class=\"nt\">filter<\/span><span class=\"p\">&gt;<\/span>\n        <span class=\"p\"\/><span class=\"nt\">defs<\/span><span class=\"p\">&gt;<\/span>\n\n        <span class=\"si\">{<\/span><span class=\"cm\">\/* Eyeball *\/<\/span><span class=\"si\">}<\/span>\n        <span class=\"p\">&lt;<\/span><span class=\"nt\">ellipse<\/span>\n          <span class=\"na\">cx<\/span><span class=\"p\">=<\/span><span class=\"s\">\"131\"<\/span>\n          <span class=\"na\">cy<\/span><span class=\"p\">=<\/span><span class=\"s\">\"117.5\"<\/span>\n          <span class=\"na\">rx<\/span><span class=\"p\">=<\/span><span class=\"s\">\"100\"<\/span>\n          <span class=\"na\">ry<\/span><span class=\"p\">=<\/span><span class=\"s\">\"65\"<\/span>\n          <span class=\"na\">fill<\/span><span class=\"p\">=<\/span><span class=\"s\">\"url(#eyeball-gradient)\"<\/span>\n        <span class=\"p\">\/&gt;<\/span>\n\n        <span class=\"si\">{<\/span><span class=\"cm\">\/* After the main eyeball ellipse but before the eyelids, add the corner shadows *\/<\/span><span class=\"si\">}<\/span>\n        <span class=\"p\">&lt;<\/span><span class=\"nt\">ellipse<\/span>\n          <span class=\"na\">cx<\/span><span class=\"p\">=<\/span><span class=\"s\">\"50\"<\/span>\n          <span class=\"na\">cy<\/span><span class=\"p\">=<\/span><span class=\"s\">\"117.5\"<\/span>\n          <span class=\"na\">rx<\/span><span class=\"p\">=<\/span><span class=\"s\">\"50\"<\/span>\n          <span class=\"na\">ry<\/span><span class=\"p\">=<\/span><span class=\"s\">\"90\"<\/span>\n          <span class=\"na\">fill<\/span><span class=\"p\">=<\/span><span class=\"s\">\"url(#corner-gradient-left)\"<\/span>\n        <span class=\"p\">\/&gt;<\/span>\n\n        <span class=\"p\">&lt;<\/span><span class=\"nt\">ellipse<\/span>\n          <span class=\"na\">cx<\/span><span class=\"p\">=<\/span><span class=\"s\">\"205\"<\/span>\n          <span class=\"na\">cy<\/span><span class=\"p\">=<\/span><span class=\"s\">\"117.5\"<\/span>\n          <span class=\"na\">rx<\/span><span class=\"p\">=<\/span><span class=\"s\">\"50\"<\/span>\n          <span class=\"na\">ry<\/span><span class=\"p\">=<\/span><span class=\"s\">\"90\"<\/span>\n          <span class=\"na\">fill<\/span><span class=\"p\">=<\/span><span class=\"s\">\"url(#corner-gradient-right)\"<\/span>\n        <span class=\"p\">\/&gt;<\/span>\n\n        <span class=\"si\">{<\/span><span class=\"cm\">\/* Corner reflections - repositioned diagonally *\/<\/span><span class=\"si\">}<\/span>\n        <span class=\"p\">&lt;<\/span><span class=\"nt\">circle<\/span>\n          <span class=\"na\">cx<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"mi\">45<\/span><span class=\"si\">}<\/span>\n          <span class=\"na\">cy<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"mi\">135<\/span><span class=\"si\">}<\/span>\n          <span class=\"na\">r<\/span><span class=\"p\">=<\/span><span class=\"s\">\"1.5\"<\/span>\n          <span class=\"na\">fill<\/span><span class=\"p\">=<\/span><span class=\"s\">\"white\"<\/span>\n          <span class=\"na\">className<\/span><span class=\"p\">=<\/span><span class=\"s\">\"opacity-60\"<\/span>\n        <span class=\"p\">\/&gt;<\/span>\n        <span class=\"p\">&lt;<\/span><span class=\"nt\">circle<\/span>\n          <span class=\"na\">cx<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"mi\">215<\/span><span class=\"si\">}<\/span>\n          <span class=\"na\">cy<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"mi\">100<\/span><span class=\"si\">}<\/span>\n          <span class=\"na\">r<\/span><span class=\"p\">=<\/span><span class=\"s\">\"2\"<\/span>\n          <span class=\"na\">fill<\/span><span class=\"p\">=<\/span><span class=\"s\">\"white\"<\/span>\n          <span class=\"na\">className<\/span><span class=\"p\">=<\/span><span class=\"s\">\"opacity-60\"<\/span>\n        <span class=\"p\">\/&gt;<\/span>\n\n        <span class=\"si\">{<\/span><span class=\"cm\">\/* Smaller companion reflections - repositioned diagonally *\/<\/span><span class=\"si\">}<\/span>\n        <span class=\"p\">&lt;<\/span><span class=\"nt\">circle<\/span>\n          <span class=\"na\">cx<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"mi\">35<\/span><span class=\"si\">}<\/span>\n          <span class=\"na\">cy<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"mi\">120<\/span><span class=\"si\">}<\/span>\n          <span class=\"na\">r<\/span><span class=\"p\">=<\/span><span class=\"s\">\"1\"<\/span>\n          <span class=\"na\">fill<\/span><span class=\"p\">=<\/span><span class=\"s\">\"white\"<\/span>\n          <span class=\"na\">className<\/span><span class=\"p\">=<\/span><span class=\"s\">\"opacity-40\"<\/span>\n        <span class=\"p\">\/&gt;<\/span>\n        <span class=\"p\">&lt;<\/span><span class=\"nt\">circle<\/span>\n          <span class=\"na\">cx<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"mi\">222<\/span><span class=\"si\">}<\/span>\n          <span class=\"na\">cy<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"mi\">110<\/span><span class=\"si\">}<\/span>\n          <span class=\"na\">r<\/span><span class=\"p\">=<\/span><span class=\"s\">\"1.5\"<\/span>\n          <span class=\"na\">fill<\/span><span class=\"p\">=<\/span><span class=\"s\">\"white\"<\/span>\n          <span class=\"na\">className<\/span><span class=\"p\">=<\/span><span class=\"s\">\"opacity-40\"<\/span>\n        <span class=\"p\">\/&gt;<\/span>\n\n        <span class=\"si\">{<\/span><span class=\"cm\">\/* Pupil group with animations *\/<\/span><span class=\"si\">}<\/span>\n        <span class=\"p\">&lt;<\/span><span class=\"nt\">motion<\/span><span class=\"p\">.<\/span><span class=\"nt\">g<\/span>\n          <span class=\"na\">variants<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">pupilVariants<\/span><span class=\"si\">}<\/span>\n          <span class=\"na\">animate<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">isBlinking<\/span> <span class=\"p\">?<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">hidden<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">visible<\/span><span class=\"dl\">\"<\/span><span class=\"si\">}<\/span>\n        <span class=\"p\">&gt;<\/span>\n          <span class=\"si\">{<\/span><span class=\"cm\">\/* Pupil *\/<\/span><span class=\"si\">}<\/span>\n          <span class=\"p\">&lt;<\/span><span class=\"nt\">motion<\/span><span class=\"p\">.<\/span><span class=\"nt\">ellipse<\/span>\n            <span class=\"na\">cx<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"mi\">131<\/span><span class=\"si\">}<\/span>\n            <span class=\"na\">cy<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"mf\">117.5<\/span><span class=\"si\">}<\/span>\n            <span class=\"na\">rx<\/span><span class=\"p\">=<\/span><span class=\"s\">\"50\"<\/span>\n            <span class=\"na\">ry<\/span><span class=\"p\">=<\/span><span class=\"s\">\"50\"<\/span>\n            <span class=\"na\">fill<\/span><span class=\"p\">=<\/span><span class=\"s\">\"url(#pupil-gradient)\"<\/span>\n            <span class=\"na\">filter<\/span><span class=\"p\">=<\/span><span class=\"s\">\"url(#pupil-blur)\"<\/span>\n            <span class=\"na\">animate<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"p\">{<\/span>\n              <span class=\"na\">cx<\/span><span class=\"p\">:<\/span> <span class=\"mi\">131<\/span> <span class=\"o\">+<\/span> <span class=\"nx\">pupilOffsetX<\/span><span class=\"p\">,<\/span>\n              <span class=\"na\">cy<\/span><span class=\"p\">:<\/span> <span class=\"mf\">117.5<\/span> <span class=\"o\">+<\/span> <span class=\"nx\">pupilOffsetY<\/span>\n            <span class=\"p\">}<\/span><span class=\"si\">}<\/span>\n            <span class=\"na\">transition<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"p\">{<\/span>\n              <span class=\"na\">type<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">spring<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n              <span class=\"na\">stiffness<\/span><span class=\"p\">:<\/span> <span class=\"mi\">400<\/span><span class=\"p\">,<\/span>\n              <span class=\"na\">damping<\/span><span class=\"p\">:<\/span> <span class=\"mi\">30<\/span>\n            <span class=\"p\">}<\/span><span class=\"si\">}<\/span>\n          <span class=\"p\">\/&gt;<\/span>\n\n          <span class=\"si\">{<\/span><span class=\"cm\">\/* Light reflections *\/<\/span><span class=\"si\">}<\/span>\n          <span class=\"p\">&lt;<\/span><span class=\"nt\">motion<\/span><span class=\"p\">.<\/span><span class=\"nt\">circle<\/span>\n            <span class=\"na\">cx<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"mi\">111<\/span><span class=\"si\">}<\/span>\n            <span class=\"na\">cy<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"mf\">102.5<\/span><span class=\"si\">}<\/span>\n            <span class=\"na\">r<\/span><span class=\"p\">=<\/span><span class=\"s\">\"5\"<\/span>\n            <span class=\"na\">fill<\/span><span class=\"p\">=<\/span><span class=\"s\">\"white\"<\/span>\n            <span class=\"na\">animate<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"p\">{<\/span>\n              <span class=\"na\">cx<\/span><span class=\"p\">:<\/span> <span class=\"mi\">111<\/span> <span class=\"o\">+<\/span> <span class=\"nx\">pupilOffsetX<\/span><span class=\"p\">,<\/span>\n              <span class=\"na\">cy<\/span><span class=\"p\">:<\/span> <span class=\"mf\">102.5<\/span> <span class=\"o\">+<\/span> <span class=\"nx\">pupilOffsetY<\/span>\n            <span class=\"p\">}<\/span><span class=\"si\">}<\/span>\n            <span class=\"na\">transition<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"p\">{<\/span>\n              <span class=\"na\">type<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">spring<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n              <span class=\"na\">stiffness<\/span><span class=\"p\">:<\/span> <span class=\"mi\">400<\/span><span class=\"p\">,<\/span>\n              <span class=\"na\">damping<\/span><span class=\"p\">:<\/span> <span class=\"mi\">30<\/span>\n            <span class=\"p\">}<\/span><span class=\"si\">}<\/span>\n          <span class=\"p\">\/&gt;<\/span>\n          <span class=\"p\">&lt;<\/span><span class=\"nt\">motion<\/span><span class=\"p\">.<\/span><span class=\"nt\">circle<\/span>\n            <span class=\"na\">cx<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"mi\">124<\/span><span class=\"si\">}<\/span>\n            <span class=\"na\">cy<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"mf\">102.5<\/span><span class=\"si\">}<\/span>\n            <span class=\"na\">r<\/span><span class=\"p\">=<\/span><span class=\"s\">\"3\"<\/span>\n            <span class=\"na\">fill<\/span><span class=\"p\">=<\/span><span class=\"s\">\"white\"<\/span>\n            <span class=\"na\">animate<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"p\">{<\/span>\n              <span class=\"na\">cx<\/span><span class=\"p\">:<\/span> <span class=\"mi\">124<\/span> <span class=\"o\">+<\/span> <span class=\"nx\">pupilOffsetX<\/span><span class=\"p\">,<\/span>\n              <span class=\"na\">cy<\/span><span class=\"p\">:<\/span> <span class=\"mf\">102.5<\/span> <span class=\"o\">+<\/span> <span class=\"nx\">pupilOffsetY<\/span>\n            <span class=\"p\">}<\/span><span class=\"si\">}<\/span>\n            <span class=\"na\">transition<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"p\">{<\/span>\n              <span class=\"na\">type<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">spring<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n              <span class=\"na\">stiffness<\/span><span class=\"p\">:<\/span> <span class=\"mi\">400<\/span><span class=\"p\">,<\/span>\n              <span class=\"na\">damping<\/span><span class=\"p\">:<\/span> <span class=\"mi\">30<\/span>\n            <span class=\"p\">}<\/span><span class=\"si\">}<\/span>\n          <span class=\"p\">\/&gt;<\/span>\n        <span class=\"p\"\/><span class=\"nt\">motion<\/span><span class=\"p\">.<\/span><span class=\"nt\">g<\/span><span class=\"p\">&gt;<\/span>\n\n        <span class=\"si\">{<\/span><span class=\"cm\">\/* Upper eyelid *\/<\/span><span class=\"si\">}<\/span>\n        <span class=\"p\">&lt;<\/span><span class=\"nt\">motion<\/span><span class=\"p\">.<\/span><span class=\"nt\">path<\/span> \n          <span class=\"na\">custom<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"kc\">true<\/span><span class=\"si\">}<\/span>\n          <span class=\"na\">variants<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">eyelidVariants<\/span><span class=\"si\">}<\/span>\n          <span class=\"na\">animate<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">isBlinking<\/span> <span class=\"p\">?<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">closed<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">open<\/span><span class=\"dl\">\"<\/span><span class=\"si\">}<\/span>\n          <span class=\"na\">fill<\/span><span class=\"p\">=<\/span><span class=\"s\">\"#000\"<\/span>\n        <span class=\"p\">\/&gt;<\/span>\n\n        <span class=\"si\">{<\/span><span class=\"cm\">\/* Lower eyelid *\/<\/span><span class=\"si\">}<\/span>\n        <span class=\"p\">&lt;<\/span><span class=\"nt\">motion<\/span><span class=\"p\">.<\/span><span class=\"nt\">path<\/span> \n          <span class=\"na\">custom<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"kc\">false<\/span><span class=\"si\">}<\/span>\n          <span class=\"na\">variants<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">eyelidVariants<\/span><span class=\"si\">}<\/span>\n          <span class=\"na\">animate<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">isBlinking<\/span> <span class=\"p\">?<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">closed<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">open<\/span><span class=\"dl\">\"<\/span><span class=\"si\">}<\/span>\n          <span class=\"na\">fill<\/span><span class=\"p\">=<\/span><span class=\"s\">\"#000\"<\/span>\n        <span class=\"p\">\/&gt;<\/span>\n\n        <span class=\"si\">{<\/span><span class=\"cm\">\/* Top blurred lines *\/<\/span><span class=\"si\">}<\/span>\n        <span class=\"p\">&lt;<\/span><span class=\"nt\">g<\/span> <span class=\"na\">filter<\/span><span class=\"p\">=<\/span><span class=\"s\">\"url(#filter0_f_302_14)\"<\/span><span class=\"p\">&gt;<\/span>\n          <span class=\"p\">&lt;<\/span><span class=\"nt\">motion<\/span><span class=\"p\">.<\/span><span class=\"nt\">path<\/span>\n            <span class=\"na\">custom<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"kc\">true<\/span><span class=\"si\">}<\/span>\n            <span class=\"na\">variants<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">blurredLineVariants<\/span><span class=\"si\">}<\/span>\n            <span class=\"na\">animate<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">isBlinking<\/span> <span class=\"p\">?<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">closed<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">open<\/span><span class=\"dl\">\"<\/span><span class=\"si\">}<\/span>\n            <span class=\"na\">stroke<\/span><span class=\"p\">=<\/span><span class=\"s\">\"#2A2A2A\"<\/span>\n            <span class=\"na\">strokeWidth<\/span><span class=\"p\">=<\/span><span class=\"s\">\"5\"<\/span>\n            <span class=\"na\">strokeLinecap<\/span><span class=\"p\">=<\/span><span class=\"s\">\"round\"<\/span>\n          <span class=\"p\">\/&gt;<\/span>\n        <span class=\"p\"\/><span class=\"nt\">g<\/span><span class=\"p\">&gt;<\/span>\n        <span class=\"p\">&lt;<\/span><span class=\"nt\">g<\/span> <span class=\"na\">filter<\/span><span class=\"p\">=<\/span><span class=\"s\">\"url(#filter2_f_302_14)\"<\/span><span class=\"p\">&gt;<\/span>\n          <span class=\"p\">&lt;<\/span><span class=\"nt\">motion<\/span><span class=\"p\">.<\/span><span class=\"nt\">path<\/span>\n            <span class=\"na\">custom<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"kc\">true<\/span><span class=\"si\">}<\/span>\n            <span class=\"na\">variants<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">outerBlurredLineVariants<\/span><span class=\"si\">}<\/span>\n            <span class=\"na\">animate<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">isBlinking<\/span> <span class=\"p\">?<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">closed<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">open<\/span><span class=\"dl\">\"<\/span><span class=\"si\">}<\/span>\n            <span class=\"na\">stroke<\/span><span class=\"p\">=<\/span><span class=\"s\">\"#777777\"<\/span>\n            <span class=\"na\">strokeWidth<\/span><span class=\"p\">=<\/span><span class=\"s\">\"5\"<\/span>\n            <span class=\"na\">strokeLinecap<\/span><span class=\"p\">=<\/span><span class=\"s\">\"round\"<\/span>\n          <span class=\"p\">\/&gt;<\/span>\n        <span class=\"p\"\/><span class=\"nt\">g<\/span><span class=\"p\">&gt;<\/span>\n        <span class=\"p\">&lt;<\/span><span class=\"nt\">g<\/span> <span class=\"na\">filter<\/span><span class=\"p\">=<\/span><span class=\"s\">\"url(#filter4_f_302_14)\"<\/span><span class=\"p\">&gt;<\/span>\n          <span class=\"p\">&lt;<\/span><span class=\"nt\">motion<\/span><span class=\"p\">.<\/span><span class=\"nt\">path<\/span>\n            <span class=\"na\">custom<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"kc\">true<\/span><span class=\"si\">}<\/span>\n            <span class=\"na\">variants<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">arcLineVariants<\/span><span class=\"si\">}<\/span>\n            <span class=\"na\">animate<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">isBlinking<\/span> <span class=\"p\">?<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">closed<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">open<\/span><span class=\"dl\">\"<\/span><span class=\"si\">}<\/span>\n            <span class=\"na\">stroke<\/span><span class=\"p\">=<\/span><span class=\"s\">\"#838383\"<\/span>\n            <span class=\"na\">strokeWidth<\/span><span class=\"p\">=<\/span><span class=\"s\">\"5\"<\/span>\n            <span class=\"na\">strokeLinecap<\/span><span class=\"p\">=<\/span><span class=\"s\">\"round\"<\/span>\n          <span class=\"p\">\/&gt;<\/span>\n        <span class=\"p\"\/><span class=\"nt\">g<\/span><span class=\"p\">&gt;<\/span>\n\n        <span class=\"si\">{<\/span><span class=\"cm\">\/* Bottom blurred lines *\/<\/span><span class=\"si\">}<\/span>\n        <span class=\"p\">&lt;<\/span><span class=\"nt\">g<\/span> <span class=\"na\">filter<\/span><span class=\"p\">=<\/span><span class=\"s\">\"url(#filter1_f_302_14)\"<\/span><span class=\"p\">&gt;<\/span>\n          <span class=\"p\">&lt;<\/span><span class=\"nt\">motion<\/span><span class=\"p\">.<\/span><span class=\"nt\">path<\/span>\n            <span class=\"na\">variants<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">bottomBlurredLineVariants<\/span><span class=\"si\">}<\/span>\n            <span class=\"na\">animate<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">isBlinking<\/span> <span class=\"p\">?<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">closed<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">open<\/span><span class=\"dl\">\"<\/span><span class=\"si\">}<\/span>\n            <span class=\"na\">stroke<\/span><span class=\"p\">=<\/span><span class=\"s\">\"#2A2A2A\"<\/span>\n            <span class=\"na\">strokeWidth<\/span><span class=\"p\">=<\/span><span class=\"s\">\"5\"<\/span>\n            <span class=\"na\">strokeLinecap<\/span><span class=\"p\">=<\/span><span class=\"s\">\"round\"<\/span>\n          <span class=\"p\">\/&gt;<\/span>\n        <span class=\"p\"\/><span class=\"nt\">g<\/span><span class=\"p\">&gt;<\/span>\n        <span class=\"p\">&lt;<\/span><span class=\"nt\">g<\/span> <span class=\"na\">filter<\/span><span class=\"p\">=<\/span><span class=\"s\">\"url(#filter3_f_302_14)\"<\/span><span class=\"p\">&gt;<\/span>\n          <span class=\"p\">&lt;<\/span><span class=\"nt\">motion<\/span><span class=\"p\">.<\/span><span class=\"nt\">path<\/span>\n            <span class=\"na\">variants<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">bottomOuterBlurredLineVariants<\/span><span class=\"si\">}<\/span>\n            <span class=\"na\">animate<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">isBlinking<\/span> <span class=\"p\">?<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">closed<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">open<\/span><span class=\"dl\">\"<\/span><span class=\"si\">}<\/span>\n            <span class=\"na\">stroke<\/span><span class=\"p\">=<\/span><span class=\"s\">\"#777777\"<\/span>\n            <span class=\"na\">strokeWidth<\/span><span class=\"p\">=<\/span><span class=\"s\">\"5\"<\/span>\n            <span class=\"na\">strokeLinecap<\/span><span class=\"p\">=<\/span><span class=\"s\">\"round\"<\/span>\n          <span class=\"p\">\/&gt;<\/span>\n        <span class=\"p\"\/><span class=\"nt\">g<\/span><span class=\"p\">&gt;<\/span>\n        <span class=\"p\">&lt;<\/span><span class=\"nt\">g<\/span> <span class=\"na\">filter<\/span><span class=\"p\">=<\/span><span class=\"s\">\"url(#filter5_f_302_14)\"<\/span><span class=\"p\">&gt;<\/span>\n          <span class=\"p\">&lt;<\/span><span class=\"nt\">motion<\/span><span class=\"p\">.<\/span><span class=\"nt\">path<\/span>\n            <span class=\"na\">variants<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">bottomArcLineVariants<\/span><span class=\"si\">}<\/span>\n            <span class=\"na\">animate<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">isBlinking<\/span> <span class=\"p\">?<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">closed<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">open<\/span><span class=\"dl\">\"<\/span><span class=\"si\">}<\/span>\n            <span class=\"na\">stroke<\/span><span class=\"p\">=<\/span><span class=\"s\">\"#838383\"<\/span>\n            <span class=\"na\">strokeWidth<\/span><span class=\"p\">=<\/span><span class=\"s\">\"5\"<\/span>\n            <span class=\"na\">strokeLinecap<\/span><span class=\"p\">=<\/span><span class=\"s\">\"round\"<\/span>\n          <span class=\"p\">\/&gt;<\/span>\n        <span class=\"p\"\/><span class=\"nt\">g<\/span><span class=\"p\">&gt;<\/span>\n      <span class=\"p\"\/><span class=\"nt\">svg<\/span><span class=\"p\">&gt;<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0645\u06a9\u0627\u0646 \u0646\u0645\u0627 \u0628\u0647 \u0637\u0631\u0632 \u0634\u06af\u0641\u062a \u0627\u0646\u06af\u06cc\u0632\u06cc \u0628\u0627 \u0645\u0633\u06cc\u0631\u0647\u0627\u06cc SVG \u06a9\u0627\u0631 \u0645\u06cc \u06a9\u0646\u062f. \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0645\u062b\u0627\u0644\u060c \u0627\u0646\u06cc\u0645\u06cc\u0634\u0646 \u0628\u0633\u062a\u0646 \u067e\u0644\u06a9 \u0627\u0633\u0627\u0633\u0627\u064b \u0628\u0627 \u0635\u0627\u0641 \u06a9\u0631\u062f\u0646 \u06cc\u06a9 \u0645\u0633\u06cc\u0631 \u0645\u0646\u062d\u0646\u06cc \u0627\u0646\u062c\u0627\u0645 \u0645\u06cc \u0634\u0648\u062f. \u0645\u0646 \u0628\u0647 \u062a\u0627\u0632\u06af\u06cc \u0645\u0633\u06cc\u0631 \u0631\u0627 \u062f\u0631 \u0648\u06cc\u0631\u0627\u06cc\u0634\u06af\u0631 \u0647\u0627\u06cc\u0644\u0627\u06cc\u062a \u06a9\u0631\u062f\u0647 \u0628\u0648\u062f\u0645\u060c \u0622\u0646 \u0631\u0627 \u062f\u0631 Composer \u0686\u0633\u0628\u0627\u0646\u062f\u0647 \u0628\u0648\u062f\u0645 \u0648 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0631\u062f\u0645 \u0627\u0646\u06cc\u0645\u06cc\u0634\u0646\u06cc \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u0645 \u06a9\u0647 \u0646\u0642\u0627\u0637 \u0631\u0627 \u0635\u0627\u0641 \u06a9\u0646\u062f \u062a\u0627 \u0686\u0634\u0645 \u062f\u0631 \u062d\u0627\u0644 \u0628\u0633\u062a\u0647 \u0634\u062f\u0646\/\u067e\u0644\u06a9 \u0632\u062f\u0646 \u0628\u0647 \u0646\u0638\u0631 \u0628\u0631\u0633\u062f. <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwyg6zojykhl131ol5rc9.png\" alt=\"\u062a\u0648\u0636\u06cc\u062d\u0627\u062a \u062a\u0635\u0648\u06cc\u0631\" loading=\"lazy\" width=\"563\" height=\"363\" title=\"\"><\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code>  <span class=\"c1\">\/\/ Define the open and closed states for both eyelids<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nx\">upperLidOpen<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">M128.5 53.5C59.3 55.5 33 99.6667 28.5 121.5H0V0L261.5 0V121.5H227.5C214.7 65.1 156.167 52.6667 128.5 53.5Z<\/span><span class=\"dl\">\"<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nx\">upperLidClosed<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">M128.5 117.5C59.3 117.5 33 117.5 28.5 117.5H0V0L261.5 0V117.5H227.5C214.7 117.5 156.167 117.5 128.5 117.5Z<\/span><span class=\"dl\">\"<\/span>\n\n  <span class=\"kd\">const<\/span> <span class=\"nx\">lowerLidOpen<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">M128.5 181C59.3 179 33 134.833 28.5 113H0V234.5H261.5V113H227.5C214.7 169.4 156.167 181.833 128.5 181Z<\/span><span class=\"dl\">\"<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nx\">lowerLidClosed<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">M128.5 117.5C59.3 117.5 33 117.5 28.5 117.5H0V234.5H261.5V117.5H227.5C214.7 117.5 156.167 117.5 128.5 117.5Z<\/span><span class=\"dl\">\"<\/span>\n\n  <span class=\"c1\">\/\/ Animation variants for the eyelids<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nx\">eyelidVariants<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\n    <span class=\"na\">open<\/span><span class=\"p\">:<\/span> <span class=\"p\">(<\/span><span class=\"na\">isUpper<\/span><span class=\"p\">:<\/span> <span class=\"nx\">boolean<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">({<\/span>\n      <span class=\"na\">d<\/span><span class=\"p\">:<\/span> <span class=\"nx\">isUpper<\/span> <span class=\"p\">?<\/span> <span class=\"nx\">upperLidOpen<\/span> <span class=\"p\">:<\/span> <span class=\"nx\">lowerLidOpen<\/span><span class=\"p\">,<\/span>\n      <span class=\"na\">transition<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n        <span class=\"na\">duration<\/span><span class=\"p\">:<\/span> <span class=\"mf\">0.4<\/span><span class=\"p\">,<\/span>\n        <span class=\"na\">ease<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">easeOut<\/span><span class=\"dl\">\"<\/span>\n      <span class=\"p\">}<\/span>\n    <span class=\"p\">}),<\/span>\n    <span class=\"na\">closed<\/span><span class=\"p\">:<\/span> <span class=\"p\">(<\/span><span class=\"na\">isUpper<\/span><span class=\"p\">:<\/span> <span class=\"nx\">boolean<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">({<\/span>\n      <span class=\"na\">d<\/span><span class=\"p\">:<\/span> <span class=\"nx\">isUpper<\/span> <span class=\"p\">?<\/span> <span class=\"nx\">upperLidClosed<\/span> <span class=\"p\">:<\/span> <span class=\"nx\">lowerLidClosed<\/span><span class=\"p\">,<\/span>\n      <span class=\"na\">transition<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n        <span class=\"na\">duration<\/span><span class=\"p\">:<\/span> <span class=\"mf\">0.15<\/span><span class=\"p\">,<\/span>\n        <span class=\"na\">ease<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">easeIn<\/span><span class=\"dl\">\"<\/span>\n      <span class=\"p\">}<\/span>\n    <span class=\"p\">})<\/span>\n  <span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u062f\u06cc\u062f\u0646 \u0627\u06cc\u0646 \u062f\u0631 \u0639\u0645\u0644 \u062a\u062c\u0631\u0628\u0647 \u0628\u0633\u06cc\u0627\u0631 \u062c\u0627\u0644\u0628\u06cc \u0628\u0648\u062f! \u0645\u0646 \u0647\u0645\u06cc\u0646 \u0631\u0648\u06cc\u06a9\u0631\u062f \u0631\u0627 \u0628\u0631\u0627\u06cc \u062e\u0637\u0648\u0637 \u0627\u0637\u0631\u0627\u0641 \u0627\u0639\u0645\u0627\u0644 \u06a9\u0631\u062f\u0645 \u0648 \u0628\u0647 \u0645\u06a9\u0627\u0646\u200c\u0646\u0645\u0627 \u062f\u0633\u062a\u0648\u0631 \u062f\u0627\u062f\u0645 \u06a9\u0647 \u0622\u0646\u0647\u0627 \u0631\u0627 \u0628\u0647 \u0633\u0645\u062a \u0645\u0631\u06a9\u0632 &#8220;\u062c\u0645\u0639 \u06a9\u0646\u062f&#8221;: \u06a9\u0647 \u062a\u0642\u0631\u06cc\u0628\u0627\u064b \u0628\u0627 \u06cc\u06a9 \u062d\u0631\u06a9\u062a \u0627\u0646\u062c\u0627\u0645 \u0634\u062f!<\/p>\n<p>\u0633\u067e\u0633 \u0686\u0634\u0645\u200c\u0647\u0627 \u062f\u0631 \u06cc\u06a9 \u0634\u0628\u06a9\u0647 CSS \u0633\u0627\u062f\u0647 \u0628\u0627 \u0633\u0644\u0648\u0644\u200c\u0647\u0627\u06cc \u062a\u0631\u0627\u0632 \u0634\u062f\u0647 \u0628\u0647\u200c\u06af\u0648\u0646\u0647\u200c\u0627\u06cc \u0646\u0645\u0627\u06cc\u0634 \u062f\u0627\u062f\u0647 \u0645\u06cc\u200c\u0634\u0648\u0646\u062f \u06a9\u0647 \u06cc\u06a9 \u0627\u062a\u0627\u0642 \u06a9\u0627\u0645\u0644 \u0634\u0628\u06cc\u0647 \u06cc\u06a9 \u0686\u0634\u0645 \u0628\u0632\u0631\u06af \u0628\u0647 \u0646\u0638\u0631 \u0628\u0631\u0633\u062f.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"o\">&lt;<\/span><span class=\"nx\">div<\/span> <span class=\"nx\">className<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">fixed inset-0 grid grid-cols-3 grid-rows-3 gap-4 p-8 md:gap-2 md:p-4 lg:max-w-6xl lg:mx-auto<\/span><span class=\"dl\">\"<\/span><span class=\"o\">&gt;<\/span>\n          <span class=\"p\">{<\/span><span class=\"nb\">Object<\/span><span class=\"p\">.<\/span><span class=\"nf\">entries<\/span><span class=\"p\">(<\/span><span class=\"nx\">roomState<\/span><span class=\"p\">.<\/span><span class=\"nx\">participants<\/span><span class=\"p\">).<\/span><span class=\"nf\">map<\/span><span class=\"p\">(([<\/span><span class=\"nx\">key<\/span><span class=\"p\">,<\/span> <span class=\"nx\">presences<\/span><span class=\"p\">])<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n            <span class=\"kd\">const<\/span> <span class=\"nx\">participant<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">presences<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]<\/span>\n            <span class=\"kd\">const<\/span> <span class=\"nx\">eyeData<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">eyeTrackingState<\/span><span class=\"p\">[<\/span><span class=\"nx\">key<\/span><span class=\"p\">]<\/span>\n            <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">key<\/span> <span class=\"o\">===<\/span> <span class=\"nx\">userId<\/span><span class=\"p\">.<\/span><span class=\"nx\">current<\/span><span class=\"p\">)<\/span> <span class=\"k\">return<\/span> <span class=\"kc\">null<\/span>\n\n            <span class=\"k\">return <\/span><span class=\"p\">(<\/span>\n              <span class=\"o\">&lt;<\/span><span class=\"nx\">div<\/span> \n                <span class=\"nx\">key<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">key<\/span><span class=\"p\">}<\/span>\n                <span class=\"nx\">className<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"s2\">`flex items-center justify-center <\/span><span class=\"p\">${<\/span><span class=\"nf\">getGridClass<\/span><span class=\"p\">(<\/span><span class=\"nx\">participant<\/span><span class=\"p\">.<\/span><span class=\"nx\">position<\/span><span class=\"p\">)}<\/span><span class=\"s2\">`<\/span><span class=\"p\">}<\/span>\n              <span class=\"o\">&gt;<\/span>\n                <span class=\"o\">&lt;<\/span><span class=\"nx\">Eyes<\/span>\n                  <span class=\"nx\">isBlinking<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">eyeData<\/span><span class=\"p\">?.<\/span><span class=\"nx\">isBlinking<\/span> <span class=\"o\">??<\/span> <span class=\"kc\">false<\/span><span class=\"p\">}<\/span>\n                  <span class=\"nx\">gazeX<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">eyeData<\/span><span class=\"p\">?.<\/span><span class=\"nx\">gazeX<\/span> <span class=\"o\">??<\/span> <span class=\"mf\">0.5<\/span><span class=\"p\">}<\/span>\n                  <span class=\"nx\">gazeY<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">eyeData<\/span><span class=\"p\">?.<\/span><span class=\"nx\">gazeY<\/span> <span class=\"o\">??<\/span> <span class=\"mf\">0.5<\/span><span class=\"p\">}<\/span>\n                  <span class=\"nx\">alignment<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nf\">getEyeAlignment<\/span><span class=\"p\">(<\/span><span class=\"nx\">participant<\/span><span class=\"p\">.<\/span><span class=\"nx\">position<\/span><span class=\"p\">)}<\/span>\n                <span class=\"sr\">\/<\/span><span class=\"err\">&gt;\n<\/span>              <span class=\"o\">&lt;<\/span><span class=\"sr\">\/div<\/span><span class=\"err\">&gt;\n<\/span>            <span class=\"p\">)<\/span>\n          <span class=\"p\">})}<\/span>\n        <span class=\"o\">&lt;<\/span><span class=\"sr\">\/div<\/span><span class=\"err\">&gt;\n<\/span>\n<span class=\"c1\">\/\/ Helper function to convert position to Tailwind grid classes<\/span>\n<span class=\"kd\">function<\/span> <span class=\"nf\">getGridClass<\/span><span class=\"p\">(<\/span><span class=\"nx\">position<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">):<\/span> <span class=\"kr\">string<\/span> <span class=\"p\">{<\/span>\n  <span class=\"k\">switch <\/span><span class=\"p\">(<\/span><span class=\"nx\">position<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">case<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">center<\/span><span class=\"dl\">'<\/span><span class=\"p\">:<\/span> <span class=\"k\">return<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">col-start-2 row-start-2<\/span><span class=\"dl\">'<\/span>\n    <span class=\"k\">case<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">middleLeft<\/span><span class=\"dl\">'<\/span><span class=\"p\">:<\/span> <span class=\"k\">return<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">col-start-1 row-start-2<\/span><span class=\"dl\">'<\/span>\n    <span class=\"k\">case<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">middleRight<\/span><span class=\"dl\">'<\/span><span class=\"p\">:<\/span> <span class=\"k\">return<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">col-start-3 row-start-2<\/span><span class=\"dl\">'<\/span>\n    <span class=\"k\">case<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">topCenter<\/span><span class=\"dl\">'<\/span><span class=\"p\">:<\/span> <span class=\"k\">return<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">col-start-2 row-start-1<\/span><span class=\"dl\">'<\/span>\n    <span class=\"k\">case<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">bottomCenter<\/span><span class=\"dl\">'<\/span><span class=\"p\">:<\/span> <span class=\"k\">return<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">col-start-2 row-start-3<\/span><span class=\"dl\">'<\/span>\n    <span class=\"k\">case<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">topLeft<\/span><span class=\"dl\">'<\/span><span class=\"p\">:<\/span> <span class=\"k\">return<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">col-start-1 row-start-1<\/span><span class=\"dl\">'<\/span>\n    <span class=\"k\">case<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">topRight<\/span><span class=\"dl\">'<\/span><span class=\"p\">:<\/span> <span class=\"k\">return<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">col-start-3 row-start-1<\/span><span class=\"dl\">'<\/span>\n    <span class=\"k\">case<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">bottomLeft<\/span><span class=\"dl\">'<\/span><span class=\"p\">:<\/span> <span class=\"k\">return<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">col-start-1 row-start-3<\/span><span class=\"dl\">'<\/span>\n    <span class=\"k\">case<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">bottomRight<\/span><span class=\"dl\">'<\/span><span class=\"p\">:<\/span> <span class=\"k\">return<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">col-start-3 row-start-3<\/span><span class=\"dl\">'<\/span>\n    <span class=\"k\">default<\/span><span class=\"p\">:<\/span> <span class=\"k\">return<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">col-start-2 row-start-2<\/span><span class=\"dl\">'<\/span>\n  <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"kd\">function<\/span> <span class=\"nf\">getEyeAlignment<\/span><span class=\"p\">(<\/span><span class=\"nx\">position<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">):<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">start<\/span><span class=\"dl\">'<\/span> <span class=\"o\">|<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">center<\/span><span class=\"dl\">'<\/span> <span class=\"o\">|<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">end<\/span><span class=\"dl\">'<\/span> <span class=\"p\">{<\/span>\n  <span class=\"k\">switch <\/span><span class=\"p\">(<\/span><span class=\"nx\">position<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">case<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">topLeft<\/span><span class=\"dl\">'<\/span><span class=\"p\">:<\/span>\n    <span class=\"k\">case<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">topRight<\/span><span class=\"dl\">'<\/span><span class=\"p\">:<\/span>\n      <span class=\"k\">return<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">end<\/span><span class=\"dl\">'<\/span>\n    <span class=\"k\">case<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">bottomLeft<\/span><span class=\"dl\">'<\/span><span class=\"p\">:<\/span>\n    <span class=\"k\">case<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">bottomRight<\/span><span class=\"dl\">'<\/span><span class=\"p\">:<\/span>\n      <span class=\"k\">return<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">start<\/span><span class=\"dl\">'<\/span>\n    <span class=\"k\">default<\/span><span class=\"p\">:<\/span>\n      <span class=\"k\">return<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">center<\/span><span class=\"dl\">'<\/span>\n  <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"%D9%84%D9%85%D8%B3_%D9%87%D8%A7%DB%8C_%D9%86%D9%87%D8%A7%DB%8C%DB%8C\"><\/span>\n<p>  \u0644\u0645\u0633 \u0647\u0627\u06cc \u0646\u0647\u0627\u06cc\u06cc<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0633\u067e\u0633 \u0686\u0646\u062f \u0635\u0641\u062d\u0647 \u0646\u0645\u0627\u06cc\u0634 \u0645\u0642\u062f\u0645\u0627\u062a\u06cc \u0632\u06cc\u0628\u0627 \u0648 \u0645\u0648\u0633\u06cc\u0642\u06cc \u067e\u0633\u200c\u0632\u0645\u06cc\u0646\u0647 \u0628\u0632\u0646\u06cc\u062f \u0648 \u067e\u0631\u0648\u0698\u0647 \u062e\u0648\u0628 \u0627\u0633\u062a!<\/p>\n<p>\u0647\u0646\u06af\u0627\u0645\u06cc \u06a9\u0647 \u0634\u0645\u0627 \u0631\u0648\u06cc \u0686\u06cc\u0632\u0647\u0627\u06cc\u06cc \u0645\u0627\u0646\u0646\u062f \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0645\u06cc \u06a9\u0646\u06cc\u062f\u060c \u0635\u062f\u0627 \u0647\u0645\u06cc\u0634\u0647 \u062a\u062c\u0631\u0628\u0647 \u0631\u0627 \u0628\u0647\u0628\u0648\u062f \u0645\u06cc \u0628\u062e\u0634\u062f\u060c \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0645\u0646 \u0627\u0632 Stable Audio \u0628\u0631\u0627\u06cc \u062a\u0648\u0644\u06cc\u062f \u0645\u0648\u0633\u06cc\u0642\u06cc \u067e\u0633 \u0632\u0645\u06cc\u0646\u0647 \u0632\u0645\u0627\u0646\u06cc \u06a9\u0647 \u06a9\u0627\u0631\u0628\u0631 &#8220;\u0648\u0627\u0631\u062f \u067e\u0631\u062a\u06af\u0627\u0647&#8221; \u0645\u06cc \u0634\u0648\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0631\u062f\u0645. \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u06cc \u06a9\u0647 \u0628\u0631\u0627\u06cc \u0645\u0648\u0633\u06cc\u0642\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0631\u062f\u0645 \u0627\u06cc\u0646 \u0628\u0648\u062f:<\/p>\n<blockquote>\n<p>\u0645\u062d\u06cc\u0637\u060c \u062e\u0632\u0646\u062f\u0647\u060c \u0645\u0648\u0633\u06cc\u0642\u06cc \u067e\u0633\u200c\u0632\u0645\u06cc\u0646\u0647\u060c \u0635\u062f\u0627\u0647\u0627\u06cc \u0632\u0645\u0632\u0645\u0647\u200c\u06a9\u0646\u0646\u062f\u0647\u060c \u0628\u0627\u062f\u0647\u0627\u060c \u0633\u0631\u0639\u062a \u0622\u0647\u0633\u062a\u0647\u060c \u0648\u0647\u0645\u200c\u0622\u0648\u0631\u060c \u067e\u0631\u062a\u06af\u0627\u0647<\/p>\n<\/blockquote>\n<p>\u0645\u0646 \u0647\u0645\u0686\u0646\u06cc\u0646 \u0641\u06a9\u0631 \u0645\u06cc \u06a9\u0631\u062f\u0645 \u06a9\u0647 \u0641\u0642\u0637 \u0635\u0641\u062d\u0647 \u0633\u06cc\u0627\u0647 \u0648 \u0633\u0641\u06cc\u062f \u0633\u0627\u062f\u0647 \u06a9\u0645\u06cc \u062e\u0633\u062a\u0647 \u06a9\u0646\u0646\u062f\u0647 \u0627\u0633\u062a\u060c \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0686\u0646\u062f \u0641\u06cc\u0644\u062a\u0631 SVG \u0645\u062a\u062d\u0631\u06a9 \u0631\u0627 \u062f\u0631 \u067e\u0633 \u0632\u0645\u06cc\u0646\u0647 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u0645. \u0639\u0644\u0627\u0648\u0647 \u0628\u0631 \u0627\u06cc\u0646\u060c \u06cc\u06a9 \u062f\u0627\u06cc\u0631\u0647 \u062a\u06cc\u0631\u0647 \u0648 \u062a\u0627\u0631 \u062f\u0631 \u0645\u0631\u06a9\u0632 \u0635\u0641\u062d\u0647 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u0645 \u062a\u0627 \u062c\u0644\u0648\u0647 \u0645\u062d\u0648 \u0634\u062f\u0646 \u062e\u0648\u0628\u06cc \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u062f. \u0627\u062d\u062a\u0645\u0627\u0644\u0627\u064b \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u0633\u062a\u0645 \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0631\u0627 \u0628\u0627 \u0641\u06cc\u0644\u062a\u0631\u0647\u0627\u06cc SVG \u0627\u0646\u062c\u0627\u0645 \u062f\u0647\u0645\u060c \u0627\u0645\u0627 \u0646\u0645\u06cc\u200c\u062e\u0648\u0627\u0633\u062a\u0645 \u0632\u0645\u0627\u0646 \u0632\u06cc\u0627\u062f\u06cc \u0631\u0627 \u0628\u0631\u0627\u06cc \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0635\u0631\u0641 \u06a9\u0646\u0645. \u0633\u067e\u0633 \u0628\u0631\u0627\u06cc \u062f\u0627\u0634\u062a\u0646 \u0645\u0642\u062f\u0627\u0631\u06cc \u062d\u0631\u06a9\u062a \u0628\u06cc\u0634\u062a\u0631\u060c \u067e\u0633\u200c\u0632\u0645\u06cc\u0646\u0647 \u0631\u0627 \u0631\u0648\u06cc \u0645\u062d\u0648\u0631 \u062e\u0648\u062f \u0645\u06cc\u200c\u0686\u0631\u062e\u0627\u0646\u0645. \u06af\u0627\u0647\u06cc \u0627\u0648\u0642\u0627\u062a \u0627\u0646\u062c\u0627\u0645 \u0627\u0646\u06cc\u0645\u06cc\u0634\u0646 \u0628\u0627 \u0641\u06cc\u0644\u062a\u0631\u0647\u0627\u06cc SVG \u06a9\u0645\u06cc \u0628\u062f \u0627\u0633\u062a\u060c \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u062a\u0635\u0645\u06cc\u0645 \u06af\u0631\u0641\u062a\u0645 \u0628\u0647 \u062c\u0627\u06cc \u0622\u0646 \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0631\u0627 \u0627\u0646\u062c\u0627\u0645 \u062f\u0647\u0645.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code>    <span class=\"o\">&lt;<\/span><span class=\"nx\">div<\/span> <span class=\"nx\">style<\/span><span class=\"o\">=<\/span><span class=\"p\">{{<\/span> <span class=\"na\">width<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">100vw<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"na\">height<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">100vh<\/span><span class=\"dl\">'<\/span> <span class=\"p\">}}<\/span><span class=\"o\">&gt;<\/span>\n      <span class=\"p\">{<\/span><span class=\"cm\">\/* Background Elements *\/<\/span><span class=\"p\">}<\/span>\n      <span class=\"o\">&lt;<\/span><span class=\"nx\">svg<\/span> <span class=\"nx\">className<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">fixed inset-0 w-full h-full -z-10<\/span><span class=\"dl\">\"<\/span><span class=\"o\">&gt;<\/span>\n        <span class=\"o\">&lt;<\/span><span class=\"nx\">defs<\/span><span class=\"o\">&gt;<\/span>\n          <span class=\"o\">&lt;<\/span><span class=\"nx\">filter<\/span> <span class=\"nx\">id<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">noise<\/span><span class=\"dl\">\"<\/span><span class=\"o\">&gt;<\/span>\n            <span class=\"o\">&lt;<\/span><span class=\"nx\">feTurbulence<\/span> \n              <span class=\"nx\">id<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">turbFreq<\/span><span class=\"dl\">\"<\/span>\n              <span class=\"kd\">type<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">fractalNoise<\/span><span class=\"dl\">\"<\/span> \n              <span class=\"nx\">baseFrequency<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">0.01<\/span><span class=\"dl\">\"<\/span>\n              <span class=\"nx\">seed<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">5<\/span><span class=\"dl\">\"<\/span>\n              <span class=\"nx\">numOctaves<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">1<\/span><span class=\"dl\">\"<\/span>\n            <span class=\"o\">&gt;<\/span>\n            <span class=\"o\">&lt;<\/span><span class=\"sr\">\/feTurbulence<\/span><span class=\"err\">&gt;\n<\/span>            <span class=\"o\">&lt;<\/span><span class=\"nx\">feGaussianBlur<\/span> <span class=\"nx\">stdDeviation<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">10<\/span><span class=\"dl\">\"<\/span><span class=\"o\">&gt;<\/span>\n              <span class=\"o\">&lt;<\/span><span class=\"nx\">animate<\/span>\n                <span class=\"nx\">attributeName<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">stdDeviation<\/span><span class=\"dl\">\"<\/span>\n                <span class=\"nx\">values<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">10;50;10<\/span><span class=\"dl\">\"<\/span>\n                <span class=\"nx\">dur<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">20s<\/span><span class=\"dl\">\"<\/span>\n                <span class=\"nx\">repeatCount<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">indefinite<\/span><span class=\"dl\">\"<\/span>\n              <span class=\"o\">\/&gt;<\/span>\n            <span class=\"o\">&lt;<\/span><span class=\"sr\">\/feGaussianBlur<\/span><span class=\"err\">&gt;\n<\/span>            <span class=\"o\">&lt;<\/span><span class=\"nx\">feColorMatrix<\/span>\n              <span class=\"kd\">type<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">matrix<\/span><span class=\"dl\">\"<\/span>\n              <span class=\"nx\">values<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">1 0 0 0 1\n                      0 1 0 0 1\n                      0 0 1 0 1\n                      0 0 0 25 -13<\/span><span class=\"dl\">\"<\/span>\n            <span class=\"o\">\/&gt;<\/span>\n          <span class=\"o\">&lt;<\/span><span class=\"sr\">\/filter<\/span><span class=\"err\">&gt;\n<\/span>        <span class=\"o\">&lt;<\/span><span class=\"sr\">\/defs<\/span><span class=\"err\">&gt;\n<\/span>        <span class=\"o\">&lt;<\/span><span class=\"nx\">rect<\/span> <span class=\"nx\">width<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">200%<\/span><span class=\"dl\">\"<\/span> <span class=\"nx\">height<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">200%<\/span><span class=\"dl\">\"<\/span> <span class=\"nx\">filter<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">url(#noise)<\/span><span class=\"dl\">\"<\/span> <span class=\"nx\">className<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">rotation-animation<\/span><span class=\"dl\">\"<\/span> <span class=\"o\">\/&gt;<\/span>\n      <span class=\"o\">&lt;<\/span><span class=\"sr\">\/svg<\/span><span class=\"err\">&gt;\n<\/span>      <span class=\"o\">&lt;<\/span><span class=\"nx\">div<\/span> <span class=\"nx\">className<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">fixed inset-0 w-[95vw] h-[95vh] bg-black rounded-full blur-[128px] m-auto<\/span><span class=\"dl\">\"<\/span> <span class=\"o\">\/&gt;<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0634\u0645\u0627 \u0622\u0646 \u0631\u0627 \u062f\u0627\u0631\u06cc\u062f: \u0646\u0633\u0628\u062a\u0627\u064b \u0645\u0633\u062a\u0642\u06cc\u0645 \u0628\u0647 \u0646\u062d\u0648\u0647 \u0627\u062c\u0631\u0627\u06cc \u06cc\u06a9 \u0631\u062f\u06cc\u0627\u0628\u06cc \u0686\u0634\u0645 \u0633\u0628\u06a9 \u0628\u0627 \u0642\u0627\u0628\u0644\u06cc\u062a \u0647\u0627\u06cc \u0628\u0644\u0627\u062f\u0631\u0646\u06af Supabase \u0646\u06af\u0627\u0647 \u06a9\u0646\u06cc\u062f. \u0634\u062e\u0635\u0627\u064b \u0627\u06cc\u0646 \u0622\u0632\u0645\u0627\u06cc\u0634 \u0628\u0633\u06cc\u0627\u0631 \u062c\u0627\u0644\u0628\u06cc \u0628\u0648\u062f \u0648 \u062f\u0631 \u062d\u06cc\u0646 \u06a9\u0627\u0631 \u0628\u0631 \u0631\u0648\u06cc \u0622\u0646 \u0645\u0634\u06a9\u0644 \u0632\u06cc\u0627\u062f\u06cc \u0646\u062f\u0627\u0634\u062a\u0645. \u0648 \u0628\u0627 \u06a9\u0645\u0627\u0644 \u062a\u0639\u062c\u0628 \u0645\u0646 \u0645\u062c\u0628\u0648\u0631 \u0646\u0628\u0648\u062f\u0645 \u0634\u0628 \u0622\u062e\u0631 \u0642\u0628\u0644 \u0627\u0632 \u0627\u0631\u0633\u0627\u0644 \u067e\u0631\u0648\u0698\u0647 \u06cc\u06a9 \u0634\u0628 \u06a9\u0627\u0645\u0644 \u0627\u0646\u062c\u0627\u0645 \u062f\u0647\u0645!<\/p>\n<p>\u0628\u0647 \u0631\u0627\u062d\u062a\u06cc \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u067e\u0631\u0648\u0698\u0647 \u06cc\u0627 \u0648\u06cc\u062f\u0626\u0648\u06cc \u0646\u0645\u0627\u06cc\u0634\u06cc \u0631\u0627 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u062f \u06a9\u0647 \u0686\u06af\u0648\u0646\u0647 \u0628\u0647 \u0646\u062a\u06cc\u062c\u0647 \u0631\u0633\u06cc\u062f\u0647 \u0627\u0633\u062a. \u0627\u06af\u0631 \u062a\u0639\u062f\u0627\u062f \u0632\u06cc\u0627\u062f\u06cc \u0627\u0632 \u0627\u0641\u0631\u0627\u062f \u0647\u0645\u0632\u0645\u0627\u0646 \u0627\u0632 \u0622\u0646 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u0646\u062f \u0645\u0645\u06a9\u0646 \u0627\u0633\u062a \u0645\u0634\u06a9\u0644\u0627\u062a\u06cc \u0648\u062c\u0648\u062f \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u062f (\u0622\u0632\u0645\u0627\u06cc\u0634 \u0622\u0646 \u0628\u0633\u06cc\u0627\u0631 \u0633\u062e\u062a \u0627\u0633\u062a \u0632\u06cc\u0631\u0627 \u0628\u0631\u0627\u06cc \u0627\u0646\u062c\u0627\u0645 \u062f\u0631\u0633\u062a \u0622\u0646 \u0628\u0647 \u0686\u0646\u062f\u06cc\u0646 \u062f\u0633\u062a\u06af\u0627\u0647 \u0648 \u0648\u0628 \u06a9\u0645 \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u062f)\u060c \u0627\u0645\u0627 \u062d\u062f\u0633 \u0645\u06cc\u200c\u0632\u0646\u0645 \u06a9\u0647 \u0627\u06cc\u0646 \u062f\u0631 \u0645\u062f \u067e\u0631\u0648\u0698\u0647\u200c\u0647\u0627\u06cc \u0647\u06a9\u0627\u062a\u0648\u0646 \u0628\u0627\u0634\u062f\u061f \u0648 \u0627\u06af\u0631 \u0622\u0646 \u0631\u0627 \u0622\u0632\u0645\u0627\u06cc\u0634 \u06a9\u0631\u062f\u06cc\u062f\u060c \u0628\u0647 \u06cc\u0627\u062f \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f \u06a9\u0647 \u0627\u06af\u0631 \u06cc\u06a9 \u0686\u0634\u0645 \u062f\u06cc\u062f\u06cc\u062f\u060c \u0622\u0646 \u0634\u062e\u0635 \u062f\u06cc\u06af\u0631\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0634\u0645\u0627 \u0631\u0627 \u062f\u0631 \u062c\u0627\u06cc\u06cc \u0627\u0632 \u0637\u0631\u06cc\u0642 \u0627\u06cc\u0646\u062a\u0631\u0646\u062a \u062a\u0645\u0627\u0634\u0627 \u0645\u06cc \u06a9\u0646\u062f!<\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Summarize this content to 400 words in Persian Lang TL;DR: \u0633\u0627\u062e\u062a\u0647 \u0634\u062f\u0647 \u0628\u0627 Supabase\u060c React\u060c WebGazer.js\u060c Motion One\u060c anime.js\u060c \u0635\u062f\u0627\u06cc \u067e\u0627\u06cc\u062f\u0627\u0631 \u0627\u0632 Supabase Realtime Presence &#038; Broadcast \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u062f (\u0627\u0635\u0644\u0627\u064b \u0627\u0632 \u062c\u062f\u0627\u0648\u0644 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0646\u0645\u06cc \u0634\u0648\u062f!) \u0645\u062e\u0632\u0646 GitHub \u0648\u0628 \u0633\u0627\u06cc\u062a \u0648\u06cc\u062f\u0626\u0648\u06cc \u0646\u0645\u0627\u06cc\u0634\u06cc \u06cc\u06a9\u06cc \u062f\u06cc\u06af\u0631 \u0627\u0632 \u0647\u06a9\u0627\u062a\u0648\u0646 \u0647\u0627\u06cc \u0647\u0641\u062a\u0647 \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc Supabase \u0648 \u06cc\u06a9 &hellip;<\/p>\n","protected":false},"author":2,"featured_media":88704,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"","fifu_image_alt":"","footnotes":""},"categories":[339],"tags":[],"class_list":["post-88703","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev"],"_links":{"self":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/88703","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/comments?post=88703"}],"version-history":[{"count":0,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/88703\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media\/88704"}],"wp:attachment":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media?parent=88703"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/categories?post=88703"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/tags?post=88703"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}