SPETZמערכת העיצוב של SPETZ

מערכת עיצוב מרכזית · central-systems/design · P0.5

מערכת העיצוב

מקור אמת יחיד לכל ערך עיצובי ב-SPETZ. כל צבע, גודל וקומפוננטה בעמוד הזה נקראים ישירות מתוך tokens.ts — אין ערכים שהוקלדו ידנית. Tailwind נטען מאותו מודול, ולכן utility ו-token לא יכולים להיפרד.

יסודות

המותג נלקח מ-spetz.org — לוגו וצבעים בלבד. הטיפוגרפיה היא Assistant, משפחה עברית שנטענת self-hosted דרך next/font.

לוגו

public/brand/spetz-logo.png · 615×213

לוגו SPETZ

משפחת גופנים

Assistant · עברית + לטינית

אבגדהוזחטי

Aa Bb Cc 0123

fallback: Assistant · Segoe UI · Arial Hebrew

כיוון

עברית תחילה

RTL

תחילת שורה: right · סוף שורה: left

צבע

הצבעים סמנטיים: פיצ׳ר מבקש surface.subtle או text.muted, אף פעם לא hex. שים לב לפיצול הגבולות — decorative לקווים דקורטיביים בלבד, interactive לכל פקד שהמשתמש מפעיל.

משטחים ופעולה

surface.base

#FFFFFF

surface.subtle

#F4F4F4

surface.raised

#FFFFFF

surface.inverted

#0056A7

action.primary

#1863DC

action.primaryHover

#0056A7

text.default

#212121

text.muted

#4E4B66

גבולות

border.decorative

#D0D5D2 · 1.49:1 על לבן

קווים דקורטיביים בלבד. נכשל WCAG 1.4.11 ולכן אסור לשמש כגבול של פקד.

border.interactive

#8A8798 · 3.50:1 על לבן · 3.18:1 על subtle

גבול של כל פקד: input, select, checkbox. עובר את סף 3:1.

מצבים

#0E7A3C

state.success

#8A5A00

state.warning

#B42318

state.danger

#00629E

state.info

חוזה ניגודיות

כל צמד צבעים שהמערכת מתירה, עם היחס הנמדד בזמן ריצה. אותה רשימה בדיוק נבדקת ב-contrast.test.ts, כך ששינוי token לא יכול לשבור WCAG AA בשקט.

כל 32 הצמדים עוברים WCAG 2.1 AA
טבלת יחסי ניגודיות לכל צמד צבעים סמנטי במערכת
צמדקריטריוןנדרשנמדדתוצאה
text.default on surface.baseDefault body copy on the page canvas1.4.34.5:116.10:1עובר
text.default on surface.subtleBody copy inside tinted panels1.4.34.5:114.64:1עובר
text.muted on surface.baseHelper text, captions, input descriptions1.4.34.5:18.33:1עובר
text.muted on surface.subtleHelper text inside tinted panels1.4.34.5:17.57:1עובר
text.link on surface.baseInline links, tertiary buttons1.4.34.5:15.44:1עובר
text.link on surface.subtleInline links inside tinted panels1.4.34.5:14.95:1עובר
text.linkHover on surface.baseLink hover / active state1.4.34.5:17.27:1עובר
text.onPrimary on action.primaryLabel of the primary button1.4.34.5:15.44:1עובר
text.onPrimary on action.primaryHoverLabel of the primary button while hovered/active1.4.34.5:17.27:1עובר
text.onInverted on surface.invertedCopy on inverted bands (hero, footer)1.4.34.5:17.27:1עובר
border.interactive on surface.baseInput/select/checkbox border on the page canvas1.4.113.0:13.50:1עובר
border.interactive on surface.subtleInput/select/checkbox border inside tinted panels1.4.113.0:13.18:1עובר
border.strong on surface.baseEmphasised control border (hover/filled)1.4.113.0:18.33:1עובר
border.focus on surface.baseFocus ring on the page canvas1.4.113.0:15.44:1עובר
border.focus on surface.subtleFocus ring inside tinted panels1.4.113.0:14.95:1עובר
state.success.fg on surface.baseSuccess message text1.4.34.5:15.43:1עובר
state.success.fg on state.success.softSuccess banner (tinted background)1.4.34.5:14.84:1עובר
state.warning.fg on surface.baseWarning message text1.4.34.5:15.93:1עובר
state.warning.fg on state.warning.softWarning banner (tinted background)1.4.34.5:15.39:1עובר
state.danger.fg on surface.baseField error text, destructive labels1.4.34.5:16.57:1עובר
state.danger.fg on state.danger.softError banner (tinted background)1.4.34.5:15.75:1עובר
state.danger.border on surface.baseInvalid input border1.4.113.0:16.57:1עובר
state.info.fg on surface.baseInformational message text1.4.34.5:16.48:1עובר
state.info.fg on state.info.softInfo banner (tinted background)1.4.34.5:15.64:1עובר
text.onPrimary on state.danger.fgLabel of a solid destructive button1.4.34.5:16.57:1עובר
text.onPrimary on state.danger.strongLabel of a solid destructive button while hovered/active1.4.34.5:19.21:1עובר
text.onPrimary on state.success.strongLabel on a solid success fill (hover/active)1.4.34.5:18.13:1עובר
text.onPrimary on state.warning.strongLabel on a solid warning fill (hover/active)1.4.34.5:18.40:1עובר
text.onPrimary on state.info.strongLabel on a solid info fill (hover/active)1.4.34.5:19.20:1עובר
state.success.border on surface.baseSuccess banner / valid control edge1.4.113.0:15.43:1עובר
state.warning.border on surface.baseWarning banner edge1.4.113.0:15.93:1עובר
state.info.border on surface.baseInfo banner edge1.4.113.0:16.48:1עובר

חריגים מתועדים

  • border.decorative on surface.base1.49:1

    Ornamental hairline only. Never draws the boundary of an operable control — use border.interactive for that.

טיפוגרפיה

סולם אחד לכל המערכת. גובה השורה בברירת מחדל הוא 1.6 — עברית צריכה יותר אוויר מלטינית.

ספֶּץdisplay-md · 2.75rem
כותרת ראשיתheadline-lg · 2rem
כותרת משנהheadline-sm · 1.5rem
כותרת כרטיסtitle-lg · 1.25rem
טקסט גוף מורחבbody-lg · 1.125rem
טקסט גוף רגילbody-md · 1rem
טקסט משניbody-sm · 0.875rem
תוויתlabel-md · 0.75rem

מרווח, רדיוס וצל

בסיס 4px. הרדיוסים והצללים מדורגים כדי שהיררכיית העומק תישאר עקבית בין מסכים.

מרווח

  • 1 · 0.25rem
  • 2 · 0.5rem
  • 3 · 0.75rem
  • 4 · 1rem
  • 6 · 1.5rem
  • 8 · 2rem
  • 12 · 3rem

רדיוס

  • sm · 0.25rem
  • md · 0.5rem
  • lg · 0.75rem
  • xl · 1rem
  • 2xl · 1.25rem
  • full · 9999px

צל

  • shadow-sm
  • shadow-md
  • shadow-lg

focus: 0 0 0 3px rgba(24, 99, 220, 0.35)

קומפוננטות

הסט המינימלי שדרוש כדי לבנות מסך: Button, Input, Card. לכל אחת variants ומצבי disabled / focus / error מוגדרים מראש.

Button

כל הגדלים עומדים ביעד המגע של 44px (WCAG 2.5.5 / ת"י 5568). sm מצמצם ריפוד וגודל טקסט בלבד — לא גובה.

Input

השם כפי שהוא מופיע באתר שלך

Card

default

קו דק + הרמה קלה

flat

ללא צל, לשימוש בתוך מיכל מורם

subtle

הפרדה ע״י גוון בלבד

as="a"

כרטיס-יעד — עובר לפרק הנגישות

לנגישות →

כרטיס לחיץ חייב להיות button או a אמיתי. <div role="button" tabIndex={0}> נשמע כמו כפתור לקורא מסך אבל לא מגיב ל-Enter/Space (הפרת WCAG 4.1.2 ו-2.1.1), ובנוסף מוחק את הכותרת שבתוכו מעץ הנגישות. לכן as גם משדרג אוטומטית ל-variant interactive.

כיווניות

האפליקציה עברית תחילה, אבל הכיוון הוא ערך שקוראים — לא הנחה שמקובעת בתגיות. ה-hook מתרגם מושגים לוגיים (התחלה/סוף, הבא/הקודם) לפיזיים.

מצב נוכחי

direction
rtl
start / end
right / left
flip(24)
-24
arrowStep("ArrowLeft")
1
arrowStep("ArrowRight")
-1

תכונות לוגיות

משתמשים ב-ms/me ולא ב-ml/mr, ב-text-start ולא ב-text-left

הפס הצבעוני יושב בתחילת השורה — מימין ב-RTL, משמאל ב-LTR — בלי שורת JavaScript אחת.

The same markup inside a dir="ltr" subtree flips automatically.

נגישות

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

דילוג לתוכן

WCAG 2.4.1

לחץ Tab מתחילת העמוד — הקישור נחשף בפינה העליונה וקופץ אל #main-content.

טבעת פוקוס

WCAG 2.4.7 · 1.4.11

2px בצבע border.focus עם 2px offset, דרך:focus-visible בלבד — 5.44:1 מול לבן.

טקסט לקוראי מסך

.sr-only

השורה הבאה מוסתרת חזותית אך נקראת:זהו טקסט שמיועד לקוראי מסך בלבד ואינו מוצג על המסך.

תנועה מופחתת

prefers-reduced-motion

כשההעדפה פעילה במערכת ההפעלה, כל האנימציות והמעברים מנוטרלים גלובלית ב-globals.css.