חזרה למאמרים

Web Design

ווידג'טים ל-AI ב-2026: מנהלים מצבי UI עם CSS Custom State Pseudo-Classes

איך לבנות רכיבי UI חכמים ומגיבים לממשקי AI בעזרת CSS Custom State (:state()) ו-Web Components, ללא ספריות ניהול מצב מורכבות או זיהום מחלקות ב-DOM.

3 דקות קריאהCSS · Web Components · AI UI · Frontend · 2026

TL;DR

מנועי AI דורשים ממשק שמגיב בזמן אמת למצבים מורכבים כמו "חושב", "מזרים תשובה" או "ממתין לפרומפט". בעזרת :state() ב-Web Components, אפשר לנהל את כל העיצוב הדינמי ישר ב-CSS native, בלי לקרוע את ה-DOM עם מחלקות מיותרות ובלי Redux.

לפני חודשיים ישבתי עם מתכנת ראשי בסטארטאפ משדרות רוטשילד. הם בנו צ'אט AI חכם, והקוד שלהם נראה כמו שדה קרב. כל פעם שהמודל החליט לחשוב, להזרים טקסט, או להציע כפתורי המשך, הם הדביקו עוד class ל-div הראשי.

התוצאה? קוד CSS באורך 800 שורות מלא ב-.chat-box.is-thinking.is-streaming:not(.has-error).

זה היה סיוט לתחזוקה.

לפני: ניהול מצבים מורכב וזיהום DOM

במשך שנים, כשבנינו רכיבים מורכבים ברשת, היינו חייבים למצוא מעקפים כדי לסמן מתי רכיב נמצא במצב מסוים.

הדרך הנפוצה הייתה זיהום מחלקות (Class Pollution). הייתם רואים אלמנטים ב-DOM שנראים ככה:

<ai-chat-box class="thinking streaming context-full dark-mode">

כל שינוי קטן ב-JavaScript דרש מאיתנו להוסיף או להסיר מחלקות ידנית. אם שכחת מניפולציה אחת ב-DOM — העיצוב נשבר, הרכיב נתקע במצב "טוען", והמשתמשים פשוט נטשו את העמוד.

אחרי: קפסולציה נקייה עם CSS Custom State

ב-2026, הדפדפנים מציעים לנו דרך הרבה יותר אלגנטית ומהירה. במקום להילחם ב-classes, אנחנו משתמשים ב-Custom State Pseudo-Classes.

הרכיב שומר על הסטייט הפנימי שלו, וה-CSS מבחוץ או מבפנים מגיב לזה בצורה טבעית. שום class מלאכותי לא מופיע ב-HTML.

הגדרה · CSS Custom State Pseudo-Class

טכנולוגיית Web Components שמציגה את המצב הפנימי של Custom Element ל-CSS באמצעות הסלקטור :state(), ללא צורך במחלקות DOM או מאפייני data-*.

הקוד הופך להיות נקי וקריא לחלוטין:

ai-chat-box:state(thinking) {
  opacity: 0.8;
  border-color: var(--purple-pulse);
}

ai-chat-box:state(streaming) {
  box-shadow: 0 0 15px rgba(0, 255, 150, 0.3);
}

אפס מחלקות ב-HTML.

איך זה עובד מתחת למכסה המנוע?

כדי להשתמש בזה, אנחנו פונים למנגנון ה-ElementInternals שקיים בכל Web Component מודרני. קצר ולעניין.

בתוך מחלקת ה-JavaScript של הרכיב, אנחנו מגדירים את ה-states:

class AIChatBox extends HTMLElement {
  constructor() {
    super();
    this._internals = this.attachInternals();
  }

  set status(val) {
    if (val === 'thinking') {
      this._internals.states.add('thinking');
      this._internals.states.delete('streaming');
    } else if (val === 'streaming') {
      this._internals.states.delete('thinking');
      this._internals.states.add('streaming');
    }
  }
}
customElements.define('ai-chat-box', AIChatBox);

מהרגע שהוספנו את המצב ל-this._internals.states, מנוע ה-CSS של הדפדפן מזהה את זה באופן מיידי. משהו כמו :hover או :focus, רק עם שם שאתם המצאתם.

0ms

זמן השהיה בעדכון העיצוב לעומת שינויי מחלקות ב-DOM

מקור: Chrome DevTools, 2026

3 מצבי AI שחובה לנהל בווידג'טים מתקדמים

כשעובדים עם מודלים של בינה מלאכותית (כמו ChatGPT, Claude או Gemini), הרכיב עובר דרך שלבים ייחודיים שלא היו קיימים בטפסים קלאסיים.

  • מצב הרהור (thinking): המודל מעבד את הפרומפט. כאן נציג אנימציית שלד או עממום קל.
  • מצב הזרמה (streaming): התקבל ה-Token הראשון והטקסט מתחיל להיכתב. נפעיל אינדיקטור פעיל בקצה הרכיב.
  • מצב זיכרון מלא (context-full): השיחה הגיעה למגבלת ה-Context Window. העיצוב יזהיר את המשתמש מראש.

אפשר לשלב כמה מצבים במקביל! הסלקטור :state(streaming):state(context-full) יאפשר לכם להחיל סטייל מיוחד דווקא כשהתשובה זורמת אך הזיכרון כמעט מלא.

השוואה: שיטה ישנה מול CSS Custom State

מדדמחלקות HTML מסורתיותCSS Custom State (:state())
נקיון ה-DOMזיהום של מחלקות בתוך ה-HTMLDOM נקי לחלוטין
קפסולציהנמוכה, מחלקות עשויות לדלוף לרכיבי אבמלאה בתוך Shadow DOM
ביצועיםדורש חישוב מחדש בגלל שינויי Classמותאם מנוע CSS native
תחזוקת קודמסורבלת ברכיבים גדליםקלה, בדיוק כמו :disabled

💡

בניית רכיבי UI לממשקי AI לא דורשת עוד ספריות. היא דורשת שימוש נכון ביכולות ה-Native שהדפדפן מציע לנו ב-2026.

שורת הסיכום

ממשקי AI שונים מטפסים רגילים. הקצב שלהם דינמי, חיווי המצב קריטי, והמשתמשים מצפים לתגובה מיידית.

אם אתם עדיין מנהלים עשרות מחלקות CSS בשביל להראות שהרכיב שלכם מקבל מידע מ-LLM, הגיע הזמן להתקדם. :state() נותן לכם רכיבים נקיים, מהירים ומהודקים שכיף לתחזק.

שאלות נפוצות

כל מה שעוד רצית לדעת

מה זה בעצם :state() ואיך זה שונה מ-:hover או :disabled?
אלו pseudo-classes מותאמות אישית שאתם מגדירים בעצמכם בתוך Web Component. בשונה מ-:disabled שהוא מצב מובנה בדפדפן, :state(thinking) הוא מצב עסקי שאתם יוצרים ומנהלים ב-JavaScript.
האם כל הדפדפנים תומכים ב-CSS Custom State ב-2026?
כן. כל הדפדפנים המודרניים (Chrome, Safari, Firefox, Edge) תומכים באופן מלא ב-ElementInternals.states ובסלקטור :state().
למה לא להשתמש ב-dataset או attribute רגיל כמו data-state="thinking"?
כי :state() מוטמע ישירות ב-Shadow DOM, מונע זיהום של ה-DOM בסימונים חיצוניים, ומאפשר קריאות גבוהה וביצועים מותאמים במנוע ה-CSS.
AB

כתב

אדיר בן יעקב · Adir Ben Yaakov

מקים JustBetterSite, סוכנות בניית אתרים ושיווק דיגיטלי בתל אביב. מתמחה ב-GEO (Generative Engine Optimization) — בנייה של אתרים שמופיעים בתשובות של ChatGPT, Claude, Perplexity ו-Gemini, לא רק בגוגל.

עוד עליי →

להמשך הקריאה

מאמרים קשורים