تقارير وأبحاث حول شوبيفاي والتجارة الإلكترونية
بانر Hero في Horizon يحمل 36 إعدادًا على مستوى القسم و8 أنواع من البلوكات تحمل 104 إعدادات إضافية، وقائمة الارتفاع المنسدلة فيه تنتقل من rem إلى svh مع اتساع الشاشة. مقروء من المصدر الخاص بالثيم عند الـ commit رقم 8b42ace.
Horizon هو الثيم الذي يوفره Shopify للمتاجر الجديدة، وقسم Hero فيه هو أول ما يلمسه معظم التجار. يعرض لك محرر الثيم قائمة منسدلة للارتفاع بستة خيارات وخانة لصورة. لكنه لا يخبرك أن ثلاثة من هذه الخيارات تغيّر وحدة قياسها بحسب عرض الشاشة، ولا أن “Large” هنا تعني شيئًا مختلفًا تمامًا عن “Large” في Dawn.
كيف حصلنا على هذه الأرقام. في 1 سبتمبر 2026 قرأنا مستودع Shopify/horizon العام عند الـ commit رقم 8b42ace (2026-08-31) — فـ Horizon لا يصدر إصدارات ولا وسوم، لذا فإن الـ commit هو النسخة. أخذنا مخطط الإعدادات وسلالم srcset من sections/hero.liquid، وهو 1496 سطرًا؛ ومتغيّرات الارتفاع من snippets/theme-styles-variables.liquid؛ وقواعد القسم من assets/base.css. أما أوصاف البلوكات فقد استُخلصت من مكتبة blocks/ المشتركة في الثيم، لأن مخطط hero يسمّيها فقط. كل رقم هنا استُخرج من تلك الملفات بواسطة سكربت.
هذا هو الجزء الذي يفاجئ الناس. Horizon لا يمتلك ارتفاعًا واحدًا لكل خيار — بل ثلاثة، عبر نقطتي انقطاع، والوحدة تتبدّل:
| الإعداد | الموبايل | ≥40em | ≥60em |
|---|---|---|---|
| Small | 15rem = 240px | 40svh | 50svh |
| Medium | 25rem = 400px | 55svh | 65svh |
| Large | 35rem = 560px | 70svh | 80svh |
تحت 40em تكون الارتفاعات ثابتة بوحدة rem. وفوقها تصبح svh، وهي وحدة ارتفاع إطار العرض الصغير — أي نسبة مئوية من الشاشة المرئية. لذا فإن hero بحجم Large على الهاتف يكون بارتفاع ثابت 560px، وعلى سطح مكتب عريض يكون 80% من أي ارتفاع تكون عليه نافذة الزائر.
وهناك ارتفاعان آخران يتجاوزان الجدول تمامًا. full-screen يضبط 100svh. وcustom يُظهر شريط تمرير، section_height_custom، يمتد من 0 إلى 100% بقيمة افتراضية 50 — وهذه القيمة تُكتب أيضًا مباشرةً بوحدة svh، لا بالبكسل.
كلا الثيمين يوفر hero بحجم Large. لكنهما غير قابلين للمقارنة، لسببين منفصلين.
أساس rem مختلف. بحثنا في كل ملف من ملفات الثيم: Horizon لا يتجاوز مطلقًا حجم الخط الجذري، لذا فإن 1rem هي الحجم الافتراضي للمتصفح، 16px. أما Dawn فيضبط font-size: calc(var(--font-body-scale) * 62.5%)، وهو ما يجعل 1rem تساوي 10px. القيمة نفسها 35rem تعني 560px في Horizon و350px في Dawn.
الوحدة مختلفة فوق نقطة الانقطاع. Large في Dawn ارتفاع ثابت 720px على سطح المكتب، وهو نفسه على كل شاشة. أما Large في Horizon فهي 80svh، فتنمو مع الشاشة: نحو 720px على نافذة بارتفاع 900px، ونحو 1152px على نافذة بارتفاع 1440px.
إذا كنت تنقل تصميمًا بين الثيمين، فهذا هو الإعداد الأكثر احتمالًا لأن يفسده.
يبني Horizon قيمة srcset من سلّمين مكتوبين بشكل ثابت في الكود، في السطرين 103 و105 من القسم:
| السلّم | المدى | الخطوات | العروض المطلوبة |
|---|---|---|---|
| وسائط بعرض كامل | 832–3840px | 6 | 832, 1200, 1600, 1920, 2560, 3840 |
| وسائط مقسّمة | 416–1600px | 5 | 416, 600, 800, 1200, 1600 |
ارفع صورة بعرض 3840px إذا كان الـ hero يمتد على عرض الصفحة. أما السلّم الأضيق فينتهي عند 1600px لأن كل صورة هناك لا تشغل إلا جزءًا من العرض.
لاحظ الدرجة الأدنى: Horizon يبدأ من 832px حيث يبدأ Dawn من 375px. Horizon لا يقدّم ببساطة نسخة بمقاس الهاتف من صورة hero بعرض كامل، وهذا أمر يجدر معرفته إذا كانت زياراتك في معظمها من الموبايل وعلى اتصالات بطيئة.
Dawn يصف بلوكاته داخل مخطط القسم. أما Horizon فيسمّيها ويحفظ الأوصاف في مكتبة مشتركة، لذا فإن قراءة sections/hero.liquid وحده لا تخبرك بشيء عن قدرات البلوك. وبعد استخلاصها، تحمل الأنواع الثمانية 104 إعدادات بينها:
| النوع | الاسم | الإعدادات | مُعرَّف في |
|---|---|---|---|
@theme | — | 0 | wildcard |
text | نص | 19 | blocks/text.liquid |
button | زر | 12 | blocks/button.liquid |
logo | شعار | 15 | blocks/logo.liquid |
jumbo-text | نص عملاق | 9 | blocks/jumbo-text.liquid |
spacer | مباعد | 7 | blocks/spacer.liquid |
group | مجموعة | 36 | blocks/group.liquid |
_marquee | شريط متحرك | 6 | blocks/_marquee.liquid |
@theme هو محرف بدل: يقبل أي بلوك من بلوكات الثيم، ولهذا لا يمتلك إعدادات خاصة به. أما group فهو الأثقل بـ 36 إعدادًا، لأنه حاوية تخطيط تكرّر معظم ضوابط المحاذاة والتباعد الخاصة بالقسم نفسه على مستوى أدنى.
للمقارنة: بانر الصورة في Dawn يقدّم 3 أنواع من البلوكات تحمل 12 إعدادًا في المجموع. أما Hero في Horizon فيقدّم 8 أنواع تحمل 104. هذا هو الفرق الحقيقي بين الثيمين، وهو غير مرئي في أي مكان داخل محرر الثيم.
36 إعدادًا، كما تظهر في المحرر:
| المعرّف في الكود | التسمية في المحرر | النوع | الافتراضي | المدى / الخيارات |
|---|---|---|---|---|
media_type_1 | النوع | select | image | 2 خيارات |
image_1 | الصورة | image_picker | — | — |
video_1 | الفيديو | video | — | — |
media_type_2 | النوع | select | image | 2 خيارات |
image_2 | الصورة | image_picker | — | — |
video_2 | الفيديو | video | — | — |
stack_media_on_mobile | تجميع الوسائط عموديًا | checkbox | false | — |
custom_mobile_media | إظهار وسائط مختلفة على الموبايل | checkbox | false | — |
media_type_1_mobile | النوع | select | image | 2 خيارات |
image_1_mobile | الصورة | image_picker | — | — |
video_1_mobile | الفيديو | video | — | — |
media_type_2_mobile | النوع | select | image | 2 خيارات |
image_2_mobile | الصورة | image_picker | — | — |
video_2_mobile | الفيديو | video | — | — |
link | الرابط | url | — | — |
open_in_new_tab | فتح الرابط في تبويب جديد | checkbox | false | — |
content_direction | الاتجاه | select | column | 2 خيارات |
vertical_on_mobile | عمودي على الموبايل | checkbox | true | — |
horizontal_alignment | المحاذاة | select | flex-start | 4 خيارات |
vertical_alignment | الموضع | select | center | 3 خيارات |
align_baseline | محاذاة خط أساس النص | checkbox | false | — |
horizontal_alignment_flex_direction_column | المحاذاة | select | flex-start | 3 خيارات |
vertical_alignment_flex_direction_column | الموضع | select | center | 4 خيارات |
gap | المسافة البينية | range | 12 | 0–100px، بخطوة 1 |
section_width | العرض | select | page-width | 2 خيارات |
section_height | الارتفاع | select | medium | 6 خيارات |
section_height_custom | ارتفاع مخصص | range | 50 | 0–100%، بخطوة 1 |
background_color | لون الخلفية | color | — | — |
toggle_overlay | طبقة تغطية الوسائط | checkbox | — | — |
overlay_color | لون طبقة التغطية | color | #00000026 | — |
overlay_style | نمط طبقة التغطية | select | solid | 2 خيارات |
gradient_direction | اتجاه التدرج | select | to top | 2 خيارات |
blurred_reflection | انعكاس ضبابي | checkbox | false | — |
reflection_opacity | شفافية الانعكاس | range | 75 | 0–100%، بخطوة 1 |
padding-block-start | أعلى | range | 0 | 0–100px، بخطوة 1 |
padding-block-end | أسفل | range | 0 | 0–100px، بخطوة 1 |
مما يجدر الإشارة إليه:
أربعة إعدادات محاذاة منفصلة. horizontal_alignment وvertical_alignment تنطبقان عندما يتدفق المحتوى في صف؛ أما horizontal_alignment_flex_direction_column وvertical_alignment_flex_direction_column فتنطبقان عندما يتراكم عموديًا. غيّر أحدها ويبقى الآخر على قيمته القديمة، وهذا هو السبب المعتاد في أن يبدو الـ hero صحيحًا على سطح المكتب وخاطئًا على الموبايل.
reflection_opacity — شريط تمرير من 0 إلى 100%، افتراضيًا 75، مقترن بـ blurred_reflection. ولا يوجد ما يعادله في Dawn.
أربع خانات للصور وأربع خانات للفيديو. الـ hero يأخذ الوسائط مرتين — واحدة لسطح المكتب ومجموعة موبايل منفصلة خلف custom_mobile_media، وقيمته الافتراضية false.
افتح sections/hero.liquid واقرأ بلوك {% schema %} في الأسفل للوقوف على الإعدادات. أما الارتفاعات فهي في الأسطر 143 إلى 157 من snippets/theme-styles-variables.liquid. وأوصاف البلوكات موجودة في blocks/ — ملف واحد لكل نوع، مسمّى تمامًا كما في عمود type أعلاه.
Horizon لا يمتلك إصدارات، لذا لا يوجد رقم نسخة يمكن الاستناد إليه. هذه الصفحة تذكر بدلًا من ذلك الـ commit الذي قُرئت منه؛ وإذا تغيّر الثيم، فإن هذه الأرقام تتغيّر معه.
3840px عرضًا لبانر hero بعرض كامل. يطلب Horizon 6 عروض تبدأ من 832px وتصل إلى 3840px. أما في حالة الوسائط المقسّمة فهو يستخدم سلّمًا ثانيًا من 5 عروض ينتهي عند 1600px، لذا فإن 1600px تكفي هناك.
على الموبايل تكون الخيارات الثابتة 240px و400px و560px. فوق 40em تصبح 40svh و55svh و70svh، وفوق 60em تصبح 50svh و65svh و80svh. خيار الشاشة الكاملة هو 100svh، وخيار Custom هو شريط تمرير يُقرأ مباشرةً كـ svh.
لسببين. Horizon لا يتجاوز مطلقًا حجم الخط الجذري، لذا فإن 1rem تساوي الحجم الافتراضي للمتصفح أي 16px، في حين أن Dawn يضبطه على 62.5% فيحصل على 10px. وفوق نقطة الانقطاع يقيس Horizon بوحدة svh، وهي نسبة مئوية من النافذة، بينما يبقى Dawn على قيمة ثابتة.
36 إعدادًا على القسم نفسه، إضافة إلى 8 أنواع من البلوكات تحمل 104 إعدادات بينها. إعدادات البلوكات ليست في ملف القسم — فـ Horizon يحفظها في مكتبة blocks/ مشتركة.
في ملف واحد لكل نوع بلوك تحت blocks/ داخل الثيم. مخطط hero يسرد أسماء الأنواع فقط، لذا فإن قراءة القسم وحده تُظهر بلوكات بلا أي إعدادات على الإطلاق. أما المدخل @theme فهو محرف بدل يقبل أي بلوك من بلوكات الثيم.