اذهب إلى المحتوى

البحث في الموقع

المحتوى عن 'كتاب'.

  • ابحث بالكلمات المفتاحية

    أضف وسومًا وافصل بينها بفواصل ","
  • ابحث باسم الكاتب

نوع المحتوى


التصنيفات

  • الإدارة والقيادة
  • التخطيط وسير العمل
  • التمويل
  • فريق العمل
  • دراسة حالات
  • التعامل مع العملاء
  • التعهيد الخارجي
  • السلوك التنظيمي في المؤسسات
  • عالم الأعمال
  • التجارة والتجارة الإلكترونية
  • نصائح وإرشادات
  • مقالات ريادة أعمال عامة

التصنيفات

  • مقالات برمجة عامة
  • مقالات برمجة متقدمة
  • PHP
    • Laravel
    • ووردبريس
  • جافاسكربت
    • لغة TypeScript
    • Node.js
    • React
    • Vue.js
    • Angular
    • jQuery
    • Cordova
  • HTML
  • CSS
    • Sass
    • إطار عمل Bootstrap
  • SQL
  • لغة C#‎
    • ‎.NET
    • منصة Xamarin
  • لغة C++‎
  • لغة C
  • بايثون
    • Flask
    • Django
  • لغة روبي
    • إطار العمل Ruby on Rails
  • لغة Go
  • لغة جافا
  • لغة Kotlin
  • لغة Rust
  • برمجة أندرويد
  • لغة R
  • الذكاء الاصطناعي
  • صناعة الألعاب
  • سير العمل
    • Git
  • الأنظمة والأنظمة المدمجة

التصنيفات

  • تصميم تجربة المستخدم UX
  • تصميم واجهة المستخدم UI
  • الرسوميات
    • إنكسكيب
    • أدوبي إليستريتور
  • التصميم الجرافيكي
    • أدوبي فوتوشوب
    • أدوبي إن ديزاين
    • جيمب GIMP
    • كريتا Krita
  • التصميم ثلاثي الأبعاد
    • 3Ds Max
    • Blender
  • نصائح وإرشادات
  • مقالات تصميم عامة

التصنيفات

  • مقالات DevOps عامة
  • خوادم
    • الويب HTTP
    • البريد الإلكتروني
    • قواعد البيانات
    • DNS
    • Samba
  • الحوسبة السحابية
    • Docker
  • إدارة الإعدادات والنشر
    • Chef
    • Puppet
    • Ansible
  • لينكس
    • ريدهات (Red Hat)
  • خواديم ويندوز
  • FreeBSD
  • حماية
    • الجدران النارية
    • VPN
    • SSH
  • شبكات
    • سيسكو (Cisco)

التصنيفات

  • التسويق بالأداء
    • أدوات تحليل الزوار
  • تهيئة محركات البحث SEO
  • الشبكات الاجتماعية
  • التسويق بالبريد الالكتروني
  • التسويق الضمني
  • استسراع النمو
  • المبيعات
  • تجارب ونصائح
  • مبادئ علم التسويق

التصنيفات

  • مقالات عمل حر عامة
  • إدارة مالية
  • الإنتاجية
  • تجارب
  • مشاريع جانبية
  • التعامل مع العملاء
  • الحفاظ على الصحة
  • التسويق الذاتي
  • العمل الحر المهني
    • العمل بالترجمة
    • العمل كمساعد افتراضي
    • العمل بكتابة المحتوى

التصنيفات

  • الإنتاجية وسير العمل
    • مايكروسوفت أوفيس
    • ليبر أوفيس
    • جوجل درايف
    • شيربوينت
    • Evernote
    • Trello
  • تطبيقات الويب
    • ووردبريس
    • ماجنتو
    • بريستاشوب
    • أوبن كارت
    • دروبال
  • الترجمة بمساعدة الحاسوب
    • omegaT
    • memoQ
    • Trados
    • Memsource
  • برامج تخطيط موارد المؤسسات ERP
    • تطبيقات أودو odoo
  • أنظمة تشغيل الحواسيب والهواتف
    • ويندوز
    • لينكس
  • مقالات عامة

التصنيفات

  • آخر التحديثات

أسئلة وأجوبة

  • الأقسام
    • أسئلة البرمجة
    • أسئلة ريادة الأعمال
    • أسئلة العمل الحر
    • أسئلة التسويق والمبيعات
    • أسئلة التصميم
    • أسئلة DevOps
    • أسئلة البرامج والتطبيقات

التصنيفات

  • كتب ريادة الأعمال
  • كتب العمل الحر
  • كتب تسويق ومبيعات
  • كتب برمجة
  • كتب تصميم
  • كتب DevOps

ابحث في

ابحث عن


تاريخ الإنشاء

  • بداية

    نهاية


آخر تحديث

  • بداية

    نهاية


رشح النتائج حسب

تاريخ الانضمام

  • بداية

    نهاية


المجموعة


النبذة الشخصية

تم العثور على 3 نتائج

  1. إذا كنتَ تحب الكتب، فيمكنك أن تحصل على كميةٍ كبيرةٍ منها بالاشتراك في النشرات الإخبارية، وهذا لأنَّ توفير تنزيل مجاني للكتب هو محفِّز للتسجيل في القوائم البريدية وهو استراتيجية ناجحة لزيادة معدّل الاشتراك في قائمتك البريدية. من المرجَّح أنَّك تستخدم هذه الاستراتيجية أو فكّرتَ باستخدامها وتريد معرفة كيفية فعل ذلك. وعلى أيّة حال، إذا لم تستعمل هذه التقنية من قبل ولا تعلم كيف توفِّر ذلك الكتاب للمشتركين الجدد وأردتَ استكشاف طرائق فعل ذلك، فهذه المقالة مناسبةٌ لك. الذي تحتاج له هو البحث عن طريقة بسيطة لإعطاء الكتاب الذي وعدتَ به دون إمكانية تنزيله من الزوار قبل أن يشتركوا، مع تفادي فهرسة صفحة تحميل الكتاب من محركات البحث. دعني أبشِّرَك أننا نملك بعض الخيارات بهذا الصدد. سننظر في هذا المقال إلى خمس طرائق التي يمكنك فيها إتاحة تنزيل ملف مجانًا. وهذه الطرائق سهلة التطبيق ومناسبة لزوار موقعك وستخفي نيتك ببناء قائمة بريدية من زوار الموقع ومن محركات البحث. الخيار الأول: استخدام التخزين السحابي هذه هي أبسط طريقة وهي الخيار الصائب لأغلبية أنواع مواقع الويب. عليك أن ترفع ملفك إلى خدمة التخزين السحابي المفضَّلة عندك مثل Google Drive أو Dropbox أو Box أو غيرها، ثم ولِّد رابط URL لمشاركة الملف مع الآخرين وضمِّن رابط التنزيل السابق في رسالة البريد الإلكتروني الترحيبية بمشتركي القائمة البريدية الجدد. هذا الحل مناسب للكثيرين، لكن ربما تكون هنالك أسباب تجعلك تنفر من التخزين السحابي، فمثلًا: ربما لا تحب فكرة استخدام التخزين السحابي، وقد يكون من الصعب إنشاء أذونات صحيحة للملفات وقد تُشكِّل عائقًا أمام مستخدميك إذا لم تفعلها بطريقة بصحيحة. أضف إلى ذلك أنَّ تخزين الملف على خدمة سحابية يعني أنَّك تضيّع على نفسك فرصة ثمينة لإبقاء المستخدمين في موقعك. وبغض النظر عن الأسباب، إذا ارتأيتَ أنَّ التخزين السحابي ليس مناسبًا لك، فما تزال لدينا أربعة خيارات أخرى يمكنك التفكير بها. الخيار الثاني: استخدام مزود خدمة القائمة البريدية خيار آخر بسيط هو توفير الملف لتنزيله عبر استخدام مزود خدمة القائمة البريدية، لكن لا تسمح جميع مزودات خدمة القوائم البريدية لك بفعل ذلك، لكن إن كان مزود الخدمة الخاص بك يسمح بذلك، مثل MailChimp أو ConvertKit، فارفع ملفك (احرص ألّا يتجاوز الحد الأقصى لحجم الملف المرفوع) ثم ضمِّنه كرابط في البريد المُرسَل لتأكيد التسجيل في موقعك. إذا لم يكن يوفِّر مزود خدمة القائمة البريدية الخاص بك هذه الميزة، فمن المرجح أنَّهم يوفرون قدرةً على الاندماج مع مزود خدمة من طرف ثالث الذي يسمح لك باستضافة وتضمين الملفات بسهولة، لكن قد تكون هنالك بعض التكاليف الإضافية إذا أردتَ استخدام خدمة من طرف ثالث. وصحيحٌ أنَّ هذا الخيار سهل التطبيق ومناسب للمشتركين، لكنه لن يدفع المشتركين إلى العودة إلى موقعك؛ وإذا كان هذا مهمًا بالنسبة إليك –وأتوقع أنَّه كذلك– فاستمر بالقراءة، فبقية الخيارات ستضع الفكرة السابقة بالحسبان. الخيار الثالث: استخدام صفحة غير قابلة للفهرسة أحد الأسباب الرئيسية لاستخدام فريق التسويق للقوائم البريدية هو محاولة حثّ المستخدمين على العودة إلى الموقع الإلكتروني. لذا لِمَ لا تفعل ذلك من الكتاب المجاني الذي توفِّره؟ - أنشِئ صفحةً لعرض معلومات عن الملف ورابط تنزيله. - ارفع الملف إلى موقعك وضع رابط التنزيل في الصفحة التي أنشأتها سابقًا. - شارك رابط الصفحة في رسالة الترحيب بعد الاشتراك بالقائمة البريدية. هذا يسمح للمشتركين الجدد بتنزيل الملف بسهولة مع تحقيق هدفك بإعادتهم إلى الموقع، وبالتالي ستستفيد من رؤيتهم للإعلانات، ولتوفِّر لهم أفضل ما في موقعك لإبقائهم لأطول فترة ممكنة. هنالك بعض الأمور العملية التي يجب أن تأخذها بالحسبان إذا شئت استخدام هذه الطريقة. يجب أن تحرص على تصعيب العثور على الصفحة التي تستضيف رابط الكتاب أو سيتمكن زوار موقعك من تحميل الكتاب دون التسجيل في قائمتك البريدية. ولفعل ذلك أنصحك باتباع الخطوات الآتية: - لا تضع رابطًا لهذه الصفحة من أي مكان في موقعك عدا رسالة الترحيب بمشتركي القائمة البريدية. - استخدم إضافة مثل Smartcrawl لإضافة خاصية noindex إلى الصفحة ولحذفها من خريطة الموقع لكي تتجاهلها محركات البحث إن وجدَتها. - راقب إحصائيات زيارة الصفحة، فلو كانت الصفحة تحصل على زوار أكثر من عدد المشتركين الجدد بالقائمة البريدية، فمن المحتمل أنَّ رابط الصفحة قد نُشِرَ في مكانٍ آخر. لذا غيّر رابط URL للصفحة واستخدم إضافة لإعادة التوجيه لإعادة توجيه الرابط القديم إلى صفحتك الرئيسية أو إلى صفحة الهبوط المناسبة. من سلبيات هذه الطريقة هي أنَّ رابط الصفحة يمكن أن يُشارك على مواقع التواصل الاجتماعي، فلو كنتَ تراقب تحليل بيانات زيارات موقعك، فستَحُسّ على ذلك بسرعة وستقدر على تغيير رابط URL، لكنني أرى أنَّ الأمر مربك في بعض الأحيان. هذا الحل مناسب لأغلبيتنا، لكن ماذا لو كان الملف الذي تريد تنزيله قيمًا ومهم جدًا ولا تريد تركه دون حماية؟ ربما تريد شيئًا أكثر حمايةً في هذه الحالة. الخيار الرابع: استخدام صفحة محمية بكلمة مرور إذا أردتَ جعل الملف الذي تريد من مشتركي موقعك تحميله أكثر أمانًا. فأحد الحلول السهولة هو حماية الصفحة بكلمة مرور وتوفير رابط الصفحة وكلمة المرور في رسالة الترحيب بالقائمة البريدية. وبهذه الطريقة سيكون الملف أكثر أمانًا، وستستفيد من عودة المشتركين إلى موقعك لتحميل الملف. ولكي يستطيع الزائر مشاركة هذه الصفحة مع البقية، فسيحتاج إلى وضع رابط الصفحة وكلمة مرور، وهذا سيجعل عملية التنزيل أكثر أمانًا، لكن في المقابل ستصبح العملية أصعب على المشتركين الجدد للوصول إلى الملف الموعود (إذ أضفتَ خطوةً جديدةً). يمكن إعادة تأمين الملف بسهولة بعد نشر أحد الزوار للرابط وكلمة المرور: حيث عليك تغيير كلمة المرور فقط، ولا حاجة إلى تغيير رابط URL. الخيار الخامس: استخدام كود التفعيل في MarketPress إذا كنتَ تستخدم MarketPress فيمكنك استخدام الملف الذي تريد من مستخدميك تنزيله للترويج لقائمتك البريدية، إذ عليك توفير كود تخفيض (أو كوبون) كمُحفِّز للاشتراك في قائمتك البريدية. ثم أعطهم كود التخفيض برسالة الترحيب بمشتركي القائمة البريدية وضع رابطًا إلى الملف على موقعك. هذا الخيار مرنٌ ومناسب لأنه يسمح لك بتوفير كود يؤدي إلى تخفيض بنسبة مئوية ثابتة لأي منتج من منتجاتك. وبفعلك لذلك، فأنت تزيد من مشتركي القائمة البريدية وفي نفس الوقت تزيد من مبيعاتك. إذا لم تستخدم أكواد التخفيض من قبل مع MarketPress، فاعلم أنَّ إعدادها سهل، ويمكنك فعل ذلك بثلاثة خطوات: سجل دخولك إلى لوحة تحكم ووردبريس. اذهب إلى صفحة Store Settings > Add Ons واحرص على أنَّ إضافة أكواد التخفيض (coupons) مفعّلة. اذهب إلى Store > Coupons وأنشِئ كود تخفيض جديد. هذا كل ما في الأمر! عليك الآن توفير كود التخفيض الذي أنشأتَه للمشتركين الجدد بالقائمة البريدية، ووضع رابط إلى متجرك. الخلاصة تحفيز زوار موقعك على الاشتراك بالقائمة البريدية عبر توفير ملف للتحميل مجانًا هي استراتيجية مجرِّبة وفعّالة، وكما رأيت، ليس من الصعب تصميم طريقة لتوصيل المحتوى مع الحفاظ على حماية الملف المعني دون تعقيد العملية على زوار الموقع. والمفتاح الرئيسي لنجاح هذه العملية هو تحديد أهدافك منها قبل اعتماد إحدى طرائق توفير الملف. إذا كان هدفك هو تبسيط الأمر ما استطعت، فأنصحك باستعمال التخزين السحابي أو خدمات مزود القائم البريدية لتوفير الملف. أما إذا رَغِبتَ بعودة المشتركين إلى موقعك، فاستخدم صفحة غير مفهرسة من محركات البحث أو صفحة محمية بكلمة مرور لتوفير رابط لتنزيل الملف. في النهاية، إذا كنتَ تستعمل MarketPress، فإنشاء أكواد تخفيض سيسمح لك باستخدام الدعم المُضمَّن في MarketPress لإنشاء «منتجات» قابلة للتحميل، مما يزيد من احتمال عودة المشتركين إلى موقعك. ترجمة –وبتصرّف– للمقال How to Give Away a Free Ebook (and Get More Subscribers) with WordPress لصاحبه Jon Penland حقوق الصورة البارزة محفوظة لـ Freepik
  2. سنقوم في هذا الدرس بتعلّم كيفية العمل على برنامج InDesign من شركة Adobe لتصميم مجلّة صغيرة بسيطة باستخدام الأدوات الأساسية فقط وذلك لتبسيط فهم آلية عمل البرنامج ومعرفة أساسياته. برنامج InDesign هو برنامج مخصص لتصميم الكتب والمجلات ومختلف المطبوعات التعليمية والإعلانية سواءً كانت مطبوعة أم إلكترونية، ويعتبر من أفضل البرامج حاليًّا في هذا المجال. سنقوم باستخدام الطرق البسيطة السهلة والأدوات الأساسية لتصميم مجلة صغيرة تتحدث عن السيارات الموجودة في لعبة Need For Speed المعروفة. من الأفضل أن يكون لديك القليل من المعرفة ببرنامج فوتوشوب وذلك للتشابه الكبير في الأدوات والتأثيرات مع برنامج InDesign. في البداية يجب أن نُوّفر متطلبات المجلة من صور السيارات والمعلومات عنها بالإضافة إلى شعار اللعبة وشعارات السيارات أيضًا. افتح برنامج InDesign وستظهر لك واجهة البرنامج وتتضمن شريط الأدوات الأساسي في الأعلى والذي يتغيّر بتغيّر الأداة المستخدمة وبحسب العنصر المحدّد للعمل عليه، وشريط الأدوات الأساسية في الجهة اليسرى ولوحات التحكم بالصفحات والطبقات وأمور أخرى في الجهة اليمنى. افتح مستندًا جديدًا من خلال القائمة: File > New > Document ستظهر لك نافذة إعدادات المستند الجديد، ضع القيم التالية: Intent : Print عدد الصفحات: سنقوم باختيار عدد قليل فقط من أجل التعلّم ولذلك سيكون العدد 8 صفحات. حجم الصفحة سيكون A4. يمكنك الاطّلاع على الصفحات والتحكم بها عبر الضغط على رمز لوحة الصفحات Pages في الشريط الأيمن، وإذا لم تكن ظاهرة فيمكنك إظهارها من القائمة: Window > Pages أو بالضغط على المفتاح F12 من لوحة المفاتيح. سنقوم بتصميم صفحة الغلاف الأمامية عبر وضع صورة إعلانية للعبة، وللحصول على دقّة ممتازة يُفضّل الحصول على صورة عالية الدقة ووضعها من خلال القائمة: File > Place ثم تحديد مكان الصورة وبعد ذلك تضعها في زاوية الصفحة. يعتمد هذا البرنامج بشكل أساسي على الإطارات Frames للتعامل مع العناصر بشكل منفصل وسهل، ولذلك عندما أضفنا الصورة تم وضعها ضمن إطار خاص بها ولتغيير التحكم بين الإطار والصورة ذاتها عليك النقر مرّة واحدة على الصورة في كل مرّة تريد تغيير العنصر الذي تريد التحكم به. يمكنك التحكّم بحجم الصورة لتغطّي كامل مساحة الصفحة من أسهم التحكم بالحجم المحيطة بالصورة، أو من خلال شريط الأدوات العلوي، ولكن يجب عليك تغيير حجم الإطار والصورة معًا، وحتى لا تقوم بالعمليّة مرتين يكفي أن تغيّر حجم الإطار ليتطابق مع حجم الصفحة، ثم انقر على الأيقونة الموجودة في الشريط العلوي، والذي سيقوم تلقائيًّا بتغيير حجم الصورة لتملأ الإطار، وبالتالي تغطّي كامل مساحة الصفحة. اسم اللعبة مكتوب أصلًا في صورة غلاف اللعبة وبما أننا نصمّم مجلةً عن هذه اللعبة سنقوم بإضافة كلمة "مجلة" فقط فوق اسم اللعبة، ولإضافة النص انقر على أيقونة أداة النص من شريط الأدوات الأيسر ثم ارسم بواسطة هذه الأداة الإطار الذي ستكتب بداخله الكلمة، ضعه فوق اسم اللعبة مباشرة. اكتب الآن كلمة "مجلة" وتأكّد من أن حجمها مناسب لحجم النص في اسم اللعبة. لاحظ كيف يتغير محتوى الشريط العلوي بحسب العنصر المحدّد والأداة المختارة، بما أننا اخترنا أداة النص ونعمل على عنصر نصّي فإن الشريط العلوي سيحتوي على أدوات تنسيق النص، ومنها يمكنك تغيير نوع الخط المستخدم، يجب عليك أن تختار خطًّا مناسبًا للخط المستخدم في كتابة اسم اللعبة، لهذا اخترت خط Emad-Diana eXtra الشبيه بنمط خط العنوان. وحتى تتناسب الكلمة أكثر مع العنوان سنقوم بتدويرها قليلًا بذات زاوية ميل نص العنوان، انقر بالزر الأيمن على كلمة "مجلة" ثم اختر القائمة: Transform > Rotate وضع القيمة 10 درجات. ولجعل الكلمة متناسقة أكثر مع نص العنوان سنقوم بإضافة تدرج لوني مشابه للتدرج المُطبّق على نص العنوان عبر تحديد الكلمة ثم النقر مطوّلًا على أيقونة اللون أسفل شريط الأدوات الأيسر واختيار الخيار Apply Gradient. سيتوجب عليك أولًا إضافة ألوان نصّ العنوان إلى لوحة الألوان Swatches ومن ثم انقر مرتين على أيقونة التدرج اللوني التي اخترتها للتو لتفتح نافذة التدرج اللوني، ثم عدّل هذا التدرج بما يتوافق مع التدرج اللوني لنص العنوان (لن اشرح هذا الأمر مطوّلًا لأنه من المفترض أن تكون لديك معلومات أساسية عن الفوتوشوب ما يسهّل فهم عملية تعديل التدرج اللوني). لاحظ أنّ نص العنوان الذي نحاول أن نطبّق تأثيراته على كلمة "مجلة" له ظل خفيف، ولذلك انقر بالزر الأيمن على الكلمة ثم اختر القائمة: Effects > Drop Shadow أو من خلال الاختصار Ctrl+Alt+M لتفتح نافذة التأثيرات وتحديدًا تأثير الظلال ثم ضع القيم التالية: Mode : Multiply Opacity : 100% Distance : 0.5 mm Angle : 135 Size : 1 mm ثم انقر OK ليتم تطبيق التأثير على الكلمة وتصبح مطابقة لنص العنوان. أخيرًا حرّك الكلمة إلى جانب العنوان بشكل ملاصق له ويتلاءم مع أسلوب كتابة العنوان لتبدو الكلمة من أصل العنوان. الآن استخدام أداة النص لكتابة عنوان العدد لهذه المجلة أسفل الصفحة بحجم كبير نسبيًّا باستخدام ذات الخط وذات الألوان. وبهذا ننتهي من صفحة الغلاف وستبدو لوحة الصفحات بهذا الشكل. سنبدأ بالصفحة الأولى. بما أن هذا العدد يتمحور حول سيارات هذه اللعبة فسوف نقوم باختيار إحدى السيارات ونضع بعض التفاصيل والصور. اخترت لهذه الصفحة سيارة BMW M4. قم بإدراج صورة للسيارة عبر الخيار Place من قائمة File ثم عدّل حجم الصورة لتتمركز أسفل الصفحة مع جعل الإطار يغطي كامل الصفحة، والتأكّد من أن لون التعبئة للإطار هو اللون الأسود وبذلك تصبح الصفحة سوداء مع صورة السيارة أسفل الصفحة. من الممكن تعديل الصور ببرنامج فوتوشوب وتجهيزها قبل الدخول بها إلى برنامج إن ديزاين ولكن البرنامج الأخير يمتلك العديد من أدوات فوتوشوب ما يغنيك عن العمل على برنامجين. في هذه الحالة أريد تطبيق تأثير تدرج ظهور صورة السيارة من الأعلى لتختفي تدريجيًّا ضمن الخلفية السوداء للصفحة. استخدم أداة Rectangle Tool وارسم مستطيلًا يغطي نصفه السفلي الجزء العلوي من صورة السيارة. انقر على المستطيل بالزر الأيمن وادخل إلى نافذة التأثيرات واختر التأثير Gradient Feather. ثم عدّل التدرج اللوني ليكون باللون الأسود مع ترك الطرف اليمين شفافًا وتأكّد من جعل الزاوية -90 درجة. أدرج الآن صورة شعار شركة BMW وعدّل حجمها وضعها في الركن العلوي الأيسر للصفحة مع الانتباه إلى حدود الهوامش. لم أتطرّق لموضوع الهوامش وحدود النزيف لتصاميم الطباعة في هذا الدرس لأنني أريد شرح الفكرة العامة للبرنامج وسأتحدّث عنها بشكل مفصّل في الدروس القادمة. أضف الآن شعار نموذج السيارة M4 ليملأ الجزء العلوي من الصفحة. أضف عنوانًا للصفحة واكتب فيه اسم ونموذج السيارة "BMW M4 F82" وفي حال واجهت مشكلة مع الأرقام وظهرت الأرقام الهندية فإنّ هذا يجعل النص غير متناسق بسببها، لذلك انقر على الأيقونة في أقصى الجهة اليمنى من الشعار العلوي ثم اختر القائمة: Digits > Arabic وبذلك تتحول الأرقام إلى الأرقام العربية وتُحَلُّ المشكلة. أضف جدولًا لنكتب بداخله مواصفات السيارة. يمكنك إضافة الجدول من القائمة: Table > Create Table أو من الاختصار Ctrl+Alt+Shift+T فتظهر لك نافذة إنشاء الجدول، حدّد عدد الأعمدة والصفوف للجدول واتجاه الجدول لليمين وأو لليسار. ثم اكتب البيانات الخاصة بمواصفات السيارة. لا تنسَ أن الجدول سيكون في إطار منفصل. ارسم إطارَ نصٍّ جديد بجانب الجدول واكتب بداخله معلومات عامة عن السيارة. عليك أن تجعل لون النص في هذا الإطار باللون الأبيض وذلك لأن الخلفية سوداء. عدّل لون النص داخل الجدول لتضيف المزيد من الحيوية على التصميم. ولتجعل الجدول أفضل وبنمط جميل حدّد خلايا الجدول ثم انقر بالزر الأيمن واختر القائمة: Cell Options > Stroke and Fills الآن اتبع الخطوات التالية: اختر التبويب Stroke and Fills في حال لم تكن مفعّلة. أزِل جميع الخطوط في النموذج في الوسط وانقر على الخط الأفقي الأوسط لتظهر جميع الخطوط الأفقية التي تقع داخل الجدول. فعّل أيضًا الخط السفلي. حدّد حجم حدود الجدول عند القيمة اختر النمط المتواصل غير المتقطّع. اختر لون هذه الحدود. اجعل قيمة Tint عند 100%. وأبقِ خلفية الخلايا بدون تعبئة. اضغط OK. هذا ما سيبدو عليه الجدول بعد هذه التعديلات. يمكنك تعديل الجدول عبر تعديل ألوان النص والخلايا وتعديل الحدود كما تشاء. وهذا ما ستبدو عليه الصفحة الأولى بعد الانتهاء من إضافة جميع العناصر المطلوبة. كرّر ذات العملية للصفحة التالية وأضف صورة السيارة أسفل الصفحة ولوّن أرضية الصفحة باللون الأسود ثم أضف المستطيل ذو التدرج اللوني من الأسود إلى الشفافية تمامًا كما فعلنا في الصفحة الأولى. أضِف صورةً أخرى للسيارة ستكون صورة مُصغّرة عن السيارة في الجزء العلوي الأيسر من الصورة. عدّل حجم وموضع الصورة مع إطارها. ولإضفاء المزيد من الحيوية والتفاعل على التصميم أضف لهذه الصورة المُصغّرة ظلالًا خفيفة كما في الشكل التالي: أضِف صورة مُصغّرة أخرى مع جعل حجمها مطابقًا للصورة المُصغّرة الأولى، ثم حرّكها مع الاستعانة بالأدلّة الذكية لتكون مصطفّة مع الصورة الأولى. لا داعي لإضافة الظلال هنا لأن الخلفية المحيطة بالصورة سوداء اللون وبهذا لن تظهر الظلال إن وضعناها. ضع الصور المتعلقة بالشركة المصنّعة ونموذج السيارة. كما تلاحظ وضعتُ هنا أربع صور متداخلة. تابع إضافة العناصر المشابهة للعناصر في الصفحة الأولى من جدول المواصفات ونبذة عن السيارة، ولكن بحجم ومواضع مختلفة عن الصفحة الأولى وبما يتناسب مع المساحات الفارغة في الصفحة. قم الآن بإضافة صفحات أخرى تتضمن سيارات من اللعبة بذات النموذج. وعندما تصل للصفحة الأخيرة اجعلها صفحة إعلان (مثلًا ستكون إعلانًا لأكاديمية حسوب) مع وضع عنوان موقع الأكاديمية ويمكنك إضافة رابط على الجملة ولكن دعونا لا نتوسع أكثر اليوم، وسيكون هناك دروس أخرى نتحدث فيها عن تقنيات مختلفة في البرنامج. ارسم صفحة الغلاف الخلفية وضع شعار اللعبة الإعلاني أعلى الصفحة ولوّن الباقي باللون الأزرق. ثم أضِف رمز QR Code الذي يدّل على رابط مباشر إلى موقع أكاديمية حسوب. يمكنك إنشاء هذا الكود عبر الذهاب إلى القائمة: Object > Generate QR Code قمت بجعل محتوى الرمز Web Hyperlink وكتابة عنوان الموقع الإلكتروني في الخانة المطلوبة. قد تُضطر إلى تعديل لون خلفية الرمز حتى تبقى واضحة. وبعد الانتهاء من تصميم جميع الأغلفة والصفحات فإن المجلة ستبدو بهذا الشكل: ولتحويل هذه المجلة إلى كتاب إلكتروني قابل للطباعة اذهب إلى القائمة: File > Export أو من خلال الاختصار Ctrl+E فيُطلب منك تحديد موقع حفظ الملف واسم الملف ثم تظهر نافذة تضم خيارات مختلفة حول تأسيس ملف PDF، اختر الدقة العالية ثم انقر موافق. يمكنكم تحميل هذه المجلة كملف PDF من هنا. أرجوا أن تكونوا قد تعلمتم وحصلتم على الفائدة المرجوة من هذا الدرس لفهم كيفية وآلية عمل برنامج InDesign وتصميم مجلة بسيطة باستخدام الأدوات الأساسية البسيطة وذلك لجعل هذا البرنامج مفهوم أكثر للمبتدئين ولتسهيل عملية التقدم في هذا البرنامج وتصميم تصاميم أكثر روعة وسحرًا وجمالًا.
  3. كما هو موضح في العنوان فإنّك في هذا الدرس سوف تتعلم كيفية إنشاء تأثير وكأنّك تتصفح كتابًا ما. وسوف نستخدم في هذا الدرس إضافة تدعى BookBlock، والفكرة من هذا الدرس هو أنّك سوف تقوم بإنشاء تأثير يُمكّن الزوار من تصفح موقع ما وكأنهم يتصفحون أحد الكتب. الفكرة هي أنّك سوف تتصفح صفحات الموقع باستخدام سهمين سوف يكونان موجودين في أعلى الصفحة أو أزرار لوحة المفاتيح أو حتى بالسحب باستخدام الفأرة وأيضًا سيكون هناك قائمة جانبية سوف تظهر عندما تقوم بالضغط على أيقونة ما. وسوف تحتوي القائمة الجانبية على روابط لصفحات الموقع وعندما تقوم بالضغط على أحد هذه الروابط فإنّها سوف تنقلك إلى الصفحة المطلوبة. سوف نستخدم أيضًا إضافة اسمها jScrollPane وذلك للحصول على شريط تمرير (scrollbar) يظهر عندما يكون المحتوى أطول من ارتفاع المتصفح. وهذه قائمة بإضافات jQuery التي سوف نستخدمها: BookBlockCustom jQuery++jScrollPanejQuery Mouse Wheel PluginCustom Mdernizerيمكنك معاينة المثال الموضح في هذا الدرس من هنا. كما يمكنك تحميل الملفات المصدرية. بنية ملف HTMLفي البداية يجب أن يكون لدينا حاوٍ رئيسي لاحتواء جميع العناصر، وداخل هذا الحاوي سوف يكون هناك عنصر <div> للقائمة الجانبية وسوف نعطيه فئة (class) بالاسم "menu-panel" وسوف يكون هناك عنصر <div> آخر يحتوي على المحتوى الرئيسي للموقع وسوف نعطيه فئة بالاسم "bb-custom-wrapper". وفي داخل كل قسم سوف يكون هناك حاوٍ للمحتوى وعنصر <div> سوف نحتاجه من أجل شريط التمرير الذي ذكرناه سابقًا. <div id="container" class="container"> <div class="menu-panel"> <h3>Table of Contents</h3> <ul id="menu-toc" class="menu-toc"> <li class="menu-toc-current"><a href="#item1">Self-destruction</a></li> <li><a href="#item2">Why we die</a></li> <li><a href="#item3">The honeymoon</a></li> <li><a href="#item4">A drawing joke</a></li> <li><a href="#item5">Commencing practice</a></li> </ul> </div> <div class="bb-custom-wrapper"> <div id="bb-bookblock" class="bb-bookblock"> <div class="bb-item" id="item1"> <div class="content"> <div class="scroller"> <h2>Self-destruction</h2> <p>...</p> </div> </div><!-- /content --> </div><!-- /bb-item --> <div class="bb-item" id="item2"><!-- ... --></div> <div class="bb-item" id="item3"><!-- ... --></div> <div class="bb-item" id="item4"><!-- ... --></div> <div class="bb-item" id="item5"><!-- ... --></div> </div><!-- /bb-bookblock --> <nav> <a id="bb-nav-prev" href="#">←</a> <a id="bb-nav-next" href="#">→</a> </nav> <span id="tblcontents" class="menu-button">Table of Contents</span> </div><!-- /bb-custom-wrapper --> </div><!-- /container -->سوف نقوم بربط عناصر القائمة الجانبية بصفحات الموقع (التي تحمل الفئة "bb-item)، وسوف نُضيف أيضًا سهمين في أعلى الصفحة من أجل التنقل بين الصفحات وزر يقوم بفتح وإغلاق القائمة الجانبية. لنقم الآن بإضافة تنسيقات CSS. تنسيقات CSSلن نتحدث هنا عن التنسيقات التي تأتي مع إضافة BookBlock لأنك سوف تجدها داخل ملف bookblock.css، وإنّما سوف نُركّز على التنسيقات الأخرى المهمة. لنبدأ التنسيقات بإضافة سطر يقوم بجلب الخط المسمى "Lato" من خدمة Google web fonts: @import url(http://fonts.googleapis.com/css?family=Lato:300,400,700);سوف نقوم بإعطاء الوسم <html> الخاصية height: 100% وذلك لأننا سوف نحتاج أن نجعل بعض العناصر تتمدد على ارتفاع المتصفح كاملًا: html { height: 100%; }سوف نستخدم أيضًا الخاصية box-sizing: border-box وذلك حتى نستخدم قيم مئوية لكل من العرض والإرتفاع أثناء استخدام padding دون القلق حول أبعاد العناصر والقيام بعمليات حسابية نحن بغنىً عنها: *, *:after, *:before { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; padding: 0; margin: 0; }لنقم الآن بتعريف الخط الذي سوف نستخدمه في الموقع (العنصر body) ونُعطيه ارتفاع بقيمة 100% (تذكّر أننا نريد ارتفاع بهذه القيمة لأنه سوف يكون هناك عناصر تتموضع بشكل مطلق (absolute positioning) وسوف تحتاج أن تتمدد على ارتفاع المتصفح كاملًا): body { font-family: 'Lato', Calibri, Arial, sans-serif; font-weight: 400; font-size: 100%; color: #333; height: 100%; }سوف نستعمل أيضًا إضافة Modernizr وسوف نُضيف الفئة "no-js" إلى وسم <html>، فإذا كانت الجافاسكربت مفعّلة فإنّ Modernizr سوف يستبدل تلك الفئة بالفئة "js". وهذا سوف يساعدنا على إعطاء خصائص CSS معينة لبعض العناصر التي لا نريدها إذا كانت الجافاسكربت معطّلة. لاحظ أيضًا أننا نحتاج أن يكون عرض الصفحة وارتفاعها بقيمة 100% فقط إذا كانت الجافاسكربت مفعّلة وعندها فقط نريد من العنصر body أن يكون له خاصية overflow: hidden: .js body { overflow: hidden; }وهذه بعض التنسيقات الخاصة بالروابط: a { color: #555; text-decoration: none; } a:hover { color: #000; }نريد من الحاوي الرئيسي أن يكون بعرض وارتفاع المتصفح كاملًا، وسوف نقوم بموضعة القائمة الجانبية خارج هذا الحاوي باستعمال الخاصية left وإعطائها قيمة سالبة تكون بنفس قيمة العرض الخاص بالقائمة الجانبية. والفكرة هي أنّه عند النقر على أيقونة القائمة الجانبية فإنّ الحاوي سوف يتحرك إلى اليمين مما يؤدي إلى ظهور القائمة الجانبية. دعونا إذًا نقوم بإعطاء الحاوي الرئيسي عرضًا وارتفاعًا بقيمة 100% وأن نُضيف الخاصية transition إلى الحاوي container: .container, .bb-custom-wrapper, .bb-bookblock { width: 100%; height: 100%; } .container { position: relative; left: 0px; transition: left 0.3s ease-in-out; }عند النقر على أيقونة القائمة الجانبية فإن فئة (class) أخرى سوف يتم إضافتها إلى الحاوي container والتي سوف تحتوي على الخاصية left: 240px (نفس العرض الخاص بالقائمة الجانبية) وبالتالي فإنّ الصفحة كاملة سوف تتحرك إلى اليمين بمقدار 240px وبالتالي ظهور القائمة الجانبية: .slideRight { left: 240px; }ولكن بدون الجافاسكربت لن نكون قادرين على القيام بما سبق لذلك سوف نقوم بإضافة الخاصية padding-left: 240px: .no-js .container { padding-left: 240px; }ونريد أن تكون القائمة الجانبية ثابتة في الجانب الأيسر بشكل افتراضي: .menu-panel { background: #f1103a; width: 240px; height: 100%; position: fixed; z-index: 1000; top: 0; left: 0; text-shadow: 0 1px 1px rgba(0,0,0,0.1); }وإذا كانت الجافاسكربت مفعلة فسوف نقوم بموضعة القائمة الجانبية بشكل مطلق وإلى اليسار بقيمة -240px: .js .menu-panel { position: absolute; left: -240px; }وهذه هي التنسيقات الخاصة بعناصر القائمة الجانبية: .menu-panel h3 { font-size: 1.8em; padding: 20px; font-weight: 300; color: #fff; box-shadow: inset 0 -1px 0 rgba(0,0,0,0.05); } .menu-toc { list-style: none; } .menu-toc li a { display: block; color: #fff; font-size: 1.1em; line-height: 3.5; padding: 0 20px; cursor: pointer; background: #f1103a; border-bottom: 1px solid #dd1338; } .menu-toc li a:hover, .menu-toc li.menu-toc-current a{ background: #dd1338; }وأمّا بالنسبة للقائمة الرئيسية التي سوف تحتوي على السهمين فإننا سوف نقوم بموضعتها بشكل مطلق وفوق جميع العناصر الأخرى: .bb-custom-wrapper nav { top: 20px; left: 60px; position: absolute; z-index: 1000; }كما أنّ روابط السهمين وزر القائمة الجانبية سوف يتموضعان بشكل مطلق (position: absolute) وسوف نعطيها الخاصية border-radius: 50% لنجعلها تظهر كالدائرة: .bb-custom-wrapper nav span, .menu-button { position: absolute; width: 32px; height: 32px; top: 0; left: 0; background: #f1103a; border-radius: 50%; color: #fff; line-height: 30px; text-align: center; speak: none; font-weight: bold; cursor: pointer; } .bb-custom-wrapper nav span:last-child { left: 40px; } .bb-custom-wrapper nav span:hover, .menu-button:hover { background: #000; }سوف يكون الزر الذي يفتح ويغلق القائمة الجانبية موجودًا في أعلى يسار الصفحة وسوف نقوم بإخفاء النص الموجود بداخله (نريد أن تظهر الأيقونة فقط): .menu-button { z-index: 1000; left: 20px; top: 20px; text-indent: -9000px; }لنقم الآن بإنشاء أيقونة بسيطة بدون استعمال أي صور وذلك باستعمال العنصر الزائف :after واستعمال الخاصية box-shadow والتي سوف تعمل على إنشاء الخطين العلوي والسفلي للأيقونة: .menu-button:after { position: absolute; content: ''; width: 50%; height: 2px; background: #fff; top: 50%; margin-top: -1px; left: 25%; box-shadow: 0 -4px #fff, 0 4px #fff; }وفي حالة كان الجافاسكربت معطلًا فإننا نريد أن نخفي هذه العناصر: .no-js .bb-custom-wrapper nav span, .no-js .menu-button { display: none; }لننتقل الآن إلى تنسيق الأجزاء الداخلية لكل قسم من أقسام الصفحة (bb-item). نريد أن يتم موضعة المحتوى (content) بشكل مطلق ونريد ان نستعمل الخاصية overflow: hidden، وهذا مهم لأننا نريد تطبيق شريط التمرير هنا ونريد أن نفعل ذلك فقط عند قلب/تغيير الصفحة. فإذا لم نستخدم الخاصية overflow: hidden فإنّك سوف ترى المحتوى يتداخل ببعضه. وأعيد وأكرر مرة أخرى بأنّ هذا سوف يحدث فقط إذا كان الجافاسكربت مفعلًا ولذلك سوف نستخدم الفئة "js": .js .content { position: absolute; top: 60px; left: 0; bottom: 50px; width: 100%; overflow: hidden; }العنصر <div class="scroller"> هو الذي سوف ينمو مع المحتوى لذلك سوف نعطيه الخاصية padding: .scroller { padding: 10px 5% 10px 5%; }لاحظ أننا استعملنا قيم مئوية للجوانب وذلك حتى نجعل الصفحة تتجاوب مع حجم الشاشة. دعونا نتخلص من الحواف الحادة عندما نقوم بالتمرير (scroll) وذلك باستخدام العناصر الزائفة إلى أعلى وأسفل عنصر المحتوى مع استخدام تدرج بين اللون الأبيض والشّفّاف: .js .content:before, .js .content:after { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 20px; z-index: 100; pointer-events: none; background: linear-gradient( to bottom, rgba(255,255,255,1) 0%, rgba(255,255,255,0) 100% ); } .js .content:after { top: auto; bottom: 0; background: linear-gradient( to top, rgba(255,255,255,1) 0%, rgba(255,255,255,0) 100% ); }هذا سوف يجعل النص يظهر بشكل باهت. لنقم الآن بتنسيق عناصر النصوص: .content h2 { font-weight: 300; font-size: 4em; padding: 0 0 10px; color: #333; margin: 0 1% 40px; text-align: left; box-shadow: 0 10px 0 rgba(0,0,0,0.02); text-shadow: 0 0 2px #fff; } .no-js .content h2 { padding: 40px 1% 20px; } .content p { font-size: 1.2em; line-height: 1.6; font-weight: 300; padding: 5px 8%; text-align: justify; }كل ما تبقى علينا الآن من تنسيقات CSS هو استخدام الـmedia queries. فإذا كانت الجافاسكربت معطلة فإننا لا نريد أن تظهر القائمة الجانبية إذا كان العرض أقل من 800px. كان هذا فقط مثالًا بسيطًا على كيفية التحكم بالعناصر تحت ظروف وشروط معينة. الـmedia query الأخيرة سوف تعمل على تكبير الخط قليلًا من أجل الأجهزة صغيرة الحجم كالهواتف. @media screen and (max-width: 800px){ .no-js .menu-panel { display: none; } .no-js .container { padding: 0; } } @media screen and (max-width: 400px){ .menu-panel, .content { font-size: 75%; } }كان هذا كل ما يتعلق بتنسيقات CSS ويتبقى علينا استخدام بعض الجافاسكربت. بعض الجافاسكربتسوف نبدأ اولًا بتخزين (caching) بعض العناصر حتى لا نضطر إلى استدعائها في كل مرة وسوف نقوم أيضًا بتهئية/مناداة إضافة BookBlock. نُريد أيضًا أن نقوم بضبط بعض الأمور بعد كل قلب/تغيير للصفحة وهذه الأمور هي رقم الصفحة الحالية والسلوك الخاص بإضافة jScrollPane. وهذا محدد في الاستدعاء الخلفي (callback) المسمى onEndFlip والممرر إلى إضافة BookBlock. var $container = $( '#container' ), // the element we will apply the BookBlock plugin to $bookBlock = $( '#bb-bookblock' ), // the BookBlock items (bb-item) $items = $bookBlock.children(), // index of the current item current = 0, // initialize the BookBlock bb = $( '#bb-bookblock' ).bookblock( { speed : 800, perspective : 2000, shadowSides : 0.8, shadowFlip : 0.4, // after each flip... onEndFlip : function(old, page, isLimit) { // update the current value current = page; // update the selected item of the table of contents (TOC) updateTOC(); // show and/or hide the navigation arrows updateNavigation( isLimit ); // initialize the jScrollPane on the content div for the new item setJSP( 'init' ); // destroy jScrollPane on the content div for the old item setJSP( 'destroy', old ); } } ), // the navigation arrows $navNext = $( '#bb-nav-next' ), $navPrev = $( '#bb-nav-prev' ).hide(), // the table of content items $menuItems = $container.find( 'ul.menu-toc > li' ), // button to open the TOC $tblcontents = $( '#tblcontents' ), transEndEventNames = { 'WebkitTransition': 'webkitTransitionEnd', 'MozTransition': 'transitionend', 'OTransition': 'oTransitionEnd', 'msTransition': 'MSTransitionEnd', 'transition': 'transitionend' }, // transition event name transEndEventName = transEndEventNames[Modernizr.prefixed('transition')], // check if transitions are supported supportTransitions = Modernizr.csstransitions;لنقم أولًا بربط الأحداث ببعض العناصر التي تم تهيئتها سابقًا، كما أننا نريد أن نقوم بتهيئة jScrollPane لأول عنصر (العنصر الحالي). function init() { // initialize jScrollPane on the content div of the first item setJSP( 'init' ); initEvents(); }بما أننا سوف نقوم بتهيئة وإعادة تهيئة وتدمير jScrollPane فلنقم بتعريف دالة لذلك: function setJSP( action, idx ) { var idx = idx === undefined ? current : idx, $content = $items.eq( idx ).children( 'div.content' ), apiJSP = $content.data( 'jsp' ); if( action === 'init' && apiJSP === undefined ) { $content.jScrollPane({verticalGutter : 0, hideFocus : true }); } else if( action === 'reinit' && apiJSP !== undefined ) { apiJSP.reinitialise(); } else if( action === 'destroy' && apiJSP !== undefined ) { apiJSP.destroy(); } }سوف نحتاج إلى ربط العديد من الأحداث كالتالي: سوف يتم استدعاء الدالتين ()next و()prev الخاصتين بإضافة BookBlock وذلك عند النقر على أزرار التنقل أو السحب باستخدام الفأرة.سوف يظهر جدول المحتويات أو يختفي عند النقر على زر القائمة (tblcontents$).سوف يتم استدعاء الدالة ()jump الخاصة بإضافة BookBlock وذلك عند النقر على أي عنصر من عناصر جدول المحتويات.سوف يتم تهيئة jScrollPane عند القيام بتغيير حجم النافذة (window resize).function initEvents() { // add navigation events $navNext.on( 'click', function() { bb.next(); return false; } ); $navPrev.on( 'click', function() { bb.prev(); return false; } ); // add swipe events $items.on( { 'swipeleft' : function( event ) { if( $container.data( 'opened' ) ) { return false; } bb.next(); return false; }, 'swiperight' : function( event ) { if( $container.data( 'opened' ) ) { return false; } bb.prev(); return false; } } ); // show TOC $tblcontents.on( 'click', toggleTOC ); // click a menu item $menuItems.on( 'click', function() { var $el = $( this ), idx = $el.index(), jump = function() { bb.jump( idx + 1 ); }; current !== idx ? closeTOC( jump ) : closeTOC(); return false; } ); // reinit jScrollPane on window resize $( window ).on( 'debouncedresize', function() { // reinitialise jScrollPane on the content div setJSP( 'reinit' ); } ); } ظهور أزرار التنقل من عدمه سوف يعتمد على الصفحة الحالية، فإذا كُنّا في الصفحة الأولى فإننا سوف نرى فقط زر "التالي" وإذا كُنّا في الصفحة الأخيرة فإننا سوف نرى فقط زر "السابق": function updateNavigation( isLastPage ) { if( current === 0 ) { $navNext.show(); $navPrev.hide(); } else if( isLastPage ) { $navNext.hide(); $navPrev.show(); } else { $navNext.show(); $navPrev.show(); } }عندما نفتح جدول المحتويات (القائمة الجانبية) فإننا نريد أن تختفي عناصر التنقل وأن تظهر مرة أخرى عندما نقوم بإغلاق القائمة الجانبية. سوف نقوم بتحريك القائمة الجانبية باستخدام خاصية transition، وإذا لم تكن هذه الخاصية مدعومة من المتصفح فإننا سوف نستخدم fallback بسيط: function toggleTOC() { var opened = $container.data( 'opened' ); opened ? closeTOC() : openTOC(); } function openTOC() { $navNext.hide(); $navPrev.hide(); $container.addClass( 'slideRight' ).data( 'opened', true ); } function closeTOC( callback ) { $navNext.show(); $navPrev.show(); $container.removeClass( 'slideRight' ).data( 'opened', false ); if( callback ) { if( supportTransitions ) { $container.on( transEndEventName, function() { $( this ).off( transEndEventName ); callback.call(); } ); } else { callback.call(); } } } خاتمةهذا كان كل شيء يخص هذا الدرس أتمنى أن يكون قد أعجبك وأن تكون قد وجدته مفيدًا. ترجمة -وبتصرّف- للدرس Fullscreen Pageflip Layout لصاحبته Mary Lou.
×
×
  • أضف...