متابعةً للنقاش من Styling Discourse with variables: Show & Tell:
لقد أضفنا مؤخرًا العديد من متغيرات CSS إلى Discourse. تجعل هذه المتغيرات تخصيص السمات وتخصيص جوانب واجهة المستخدم أسهل بكثير. للعديد من التغييرات، لن تحتاج بعد الآن إلى استهداف عناصر محددة جدًا في HTML، وبدلاً من ذلك قم بتغيير متغير واحد فقط.
أنا أقدر تمامًا الجهد المبذول لتحسين تجربة تخصيص سمات Discourse! ومع ذلك، لست مقتنعًا تمامًا بأن نهج إضافة الكثير من متغيرات CSS كما هو مشترك في الموضوع أعلاه هو الحل الأمثل. أردت مشاركة بعض الأفكار حول السبب.
لقد كنت أجرب هذا النهج بنفسي من خلال Canvas Theme Template، والذي يوفر في الأساس مجموعة من المتغيرات القابلة للتعديل لبناء سمات أساسية:
:root {
/* Layout */
--d-max-width: 1110px;
--canvas-nav-space: 0.75rem;
--canvas-content-padding: 1.5rem;
--canvas-topic-list-padding: 0.8em;
/* Base Styles */
--canvas-background: var(--secondary);
--canvas-surface: var(--secondary);
--canvas-border: 1px solid var(--primary-500);
--canvas-border-light: 1px solid var(--primary-200);
/* Border Radius */
--d-border-radius: 2px;
--d-border-radius-large: 2px;
--d-button-border-radius: 2px;
--d-input-border-radius: var(--d-button-border-radius);
--d-nav-pill-border-radius: var(--d-button-border-radius);
/* Button Styles */
--canvas-button-padding: 0.5em 0.65em;
--canvas-button-primary-padding: 0.5em 0.65em;
/* Header */
--canvas-header-height: 4rem;
--canvas-header-background: var(--header_background);
--canvas-header-border: none;
--canvas-header-shadow: var(--shadow-header);
/* Sidebar */
--d-sidebar-width: 17em;
--d-sidebar-background: var(--secondary);
--canvas-sidebar-border: 1px solid var(--primary-low);
--canvas-sidebar-scrollbar: var(--scrollbarWidth);
--d-sidebar-row-height: 2.2em;
--d-sidebar-highlight-background: var(--primary-low);
/* And several more... */
}
بينما يعمل هذا بشكل جيد للتعديلات البسيطة، فقد واجهت عدة قيود عند محاولة توسيع هذا النهج:
الحمل المعرفي وقابلية الاكتشاف
تتطلب قائمة المتغيرات الواسعة في الأساس جدول بحث. هذا يبدو منفصلاً عن كيفية عملك عادةً في إطار عمل قائم على المكونات، حيث أتوقع فعليًا تنسيق المكونات. وربما هذا أنا فقط، لكنني أشعر أنه يحول النموذج الذهني من “أريد تنسيق هذا المكون” إلى “أحتاج إلى العثور على اسم المتغير الصحيح”.
نقص منطق التتالي
يقوم التنفيذ الحالي بتعيين قيم ثابتة مباشرة للمتغيرات دون إنشاء تسلسل هرمي مناسب للتتالي:
--d-sidebar-link-color: var(--primary-high);
--d-nav-background-color--active: transparent;
--table-border-width: 1px;
هذا يعني عدم وجود وراثة من متغيرات أكثر عمومية مثل --link-color أو --border-width. إذا كنت أرغب في إجراء تغييرات منهجية، فأنا بحاجة إلى تحديث متغيرات محددة متعددة بدلاً من تغيير قيمة تأسيسية واحدة.
فجوة التصميم والتطوير
أعتقد أن النهج يخلق احتكاكًا عند العمل بين أدوات التصميم (مثل Figma) والتنفيذ. تستخدم أنظمة التصميم عادةً متغيرات دلالية لا تتطابق واحدًا لواحد مع هذه المتغيرات المحددة جدًا للتنفيذ.
نهج بديل يحتضن بنية المكون
أعتقد أنه يمكننا تحقيق نفس الهدف بشكل طبيعي أكثر من خلال الجمع بين المتغيرات الدلالية الأساسية مع استهداف المكونات الموثوقة. بدلاً من وجود قائمة طويلة من المتغيرات المحددة، ماذا لو كان بإمكاننا الاعتماد على فئات مكونات فريدة ومسماة باستمرار في جميع أنحاء Discourse؟ أشياء مثل .d-sidebar و .d-topic-list و .d-header.
ثم قم بإقران ذلك بمجموعة أصغر من المتغيرات التأسيسية التي تتتالي بالفعل بالطريقة التي من المفترض أن تعمل بها CSS:
/* Set the design foundation */
:root {
--d-border-width: 2px;
--d-surface-color: #3498db;
--d-space-1: 1rem;
}
/* Override at the component level when you need to */
.d-topic-list,
.d-sidebar {
--d-border-width: 1px;
}
بالنسبة لي، يبدو هذا أقرب إلى كيفية عمل CSS بشكل طبيعي. أقوم بتعيين أنماطي العامة، ثم أقوم بتحسينها عند الحاجة. عندما أرغب في تغيير شكل الحدود في التطبيق، أقوم بتغيير متغير واحد. عندما أرغب في أن تكون الشريط الجانبي مختلفًا، أقوم باستهداف الشريط الجانبي بشكل خاص.

