Skip to content

تخصيص السمات ​

توفّر lh-ui-plus نظامًا متكاملًا للسمات يعتمد متغيرات CSS، مع قدرات تخصيص غنية تشمل ألوان النمط الصيني، والوضع الداكن، وخلفيات الأنماط، والتبديل وقت التشغيل.

ترغب في ضبط الألوان بصريًا وتصدير ملف scss مباشرة؟ انظر استوديو السمات.

نظام ألوان النمط الصيني ​

تستلهم المكتبة تصميمها من ألوان الحبر التقليدية، وتُعرّف 8 ألوانًا صينية الأساسية:

اللونالدلالةاللون الأساسيhoverالاستخدام
النيليأزرق الخزف 青花瓷#2B4C7C#3D649Eالأزرار الرئيسية، والروابط، وحالة التركيز
أخضر الصنوبر 松花绿خضرة ظلال الخيزران#5B8C5A#6FA36Eحالة النجاح
الأصفر العشبي 藤黄ذهبي أوراق الخريف#C4A35A#D4B76Fحالة التحذير
الزنجفر 朱砂 (خطر)أحمر أختام الحبر#B23A3A#C45050حالة الخطر/الخطأ (--lh-danger-*)
الداكن الرماديألوان الحبر الخفيفة#7A7A7A#8F8F8Fحالة المعلومات
الذهبيسحر عتيق فاخر#B8860B#D4A843لمسات زخرفية (--lh-gold-*)
الزنجفر الأحمر 朱砂红 (تأكيد)صيغة تأكيد مائلة إلى الحمرة من الزنجفر#C43A31#E85D4Aلون التأكيد (--lh-vermilion-*)
اليشمأناقة الخيزران الأخضر#5B8C5A#7AAE7Aالنجاح/الزخرفة (نفس قيمة أخضر الصنوبر)

يتضمن كل لون عادةً 4 مستويات (الأساسي/hover/active/خلفية فاتحة light)، ويوفّر اللون الأساسي واللون الذهبي إضافيًا لون حد lighter (*-color-border) لضمان تباين مناسب في السيناريوهات المختلفة.

نظام سمات متغيرات CSS ​

تتحقّق جميع ألوان السمة عبر خصائص CSS المخصّصة (--lh-*)، بإجمالي أكثر من 88 متغيرًا تغطّي الفئات التالية:

متغيرات الألوان ​

بادئة المتغيرالوصفمثال
--lh-primary-colorالقيمة الأساسية للون الأساسي#2B4C7C
--lh-primary-color-hoverحالة hover للون الأساسي#3D649E
--lh-primary-color-activeحالة active للون الأساسي#1F3A5F
--lh-primary-color-bgالخلفية الفاتحة للون الأساسي#E8EDF3
--lh-success-colorلون النجاح#5B8C5A
--lh-warning-colorلون التحذير#C4A35A
--lh-danger-colorلون الخطر#B23A3A
--lh-info-colorلون المعلومات#7A7A7A

متغيرات النص ​

اسم المتغيرالوصفالقيمة الافتراضية
--lh-text-primaryالنص الرئيسي#2C2C2C
--lh-text-regularالنص الاعتيادي#5A5A5A
--lh-text-secondaryالنص الثانوي#8A8A8A
--lh-text-placeholderالعنصر النائب#B0B0B0
--lh-text-disabledالنص المعطّل#C8C8C8

متغيرات الحدود ​

اسم المتغيرالوصفالقيمة الافتراضية
--lh-border-color-baseالحدود الافتراضية#D8D3CC
--lh-border-color-lightحدود خفيفة#E5E0D8
--lh-border-radius-baseنصف القطر الأساسي2px
--lh-border-radius-roundنصف قطر الكبسولة20px

متغيرات الخلفية ​

اسم المتغيرالوصفالقيمة الافتراضية
--lh-bg-colorخلفية المكوّن#FAF6F0 (لون ورق الأرز 宣纸白)
--lh-bg-color-pageخلفية الصفحة#F5F0EB
--lh-bg-color-overlayخلفية الغطاءrgba(26, 26, 26, 0.4)

متغيرات الظل ​

اسم المتغيرالوصف
--lh-box-shadow-baseالظل الافتراضي
--lh-box-shadow-lightظل خفيف
--lh-box-shadow-lighterظل خفيف جدًا

متغيرات الخط ​

اسم المتغيرالوصفالقيمة الافتراضية
--lh-font-familyعائلة الخطNoto Serif SC, STSong, SimSun...
--lh-font-size-baseالحجم الأساسي14px
--lh-font-size-smallالحجم الصغير13px
--lh-font-weight-primaryسمك الخط الاعتيادي400
--lh-font-line-height-primaryارتفاع السطر1.8

متغيرات المسافات ​

اسم المتغيرالقيمةالاستخدام
--lh-spacing-xs4pxمسافة صغيرة جدًا
--lh-spacing-sm8pxمسافة صغيرة
--lh-spacing-md12pxمسافة متوسطة
--lh-spacing-base16pxالمسافة الأساسية
--lh-spacing-lg20pxمسافة كبيرة
--lh-spacing-xl24pxمسافة كبيرة جدًا

متغيرات Z-Index ​

اسم المتغيرالقيمةالاستخدام
--lh-z-index-dropdown1000القوائم المنسدلة
--lh-z-index-modal1050الصناديق المشروطة (modal)
--lh-z-index-tooltip2000صناديق التلميحات

متغيرات الانتقال ​

اسم المتغيرالقيمةالوصف
--lh-transition-duration-fast0.25sانتقال سريع
--lh-transition-duration-base0.3sانتقال افتراضي
--lh-transition-duration-slow0.4sانتقال بطيء

السمة الداكنة ​

تتضمّن المكتبة تنسيقات السمة الداكنة مدمجة، وتبدّل جميع متغيرات CSS تلقائيًا إلى قيم ملائمة في الوضع الداكن.

الطريقة الأولى: الدالة التركيبية useLhTheme ​

Composition API ​

vue
<script setup lang="ts">
import { useLhTheme } from '@lh-ui/vue3'

const { theme, toggleTheme, setTheme } = useLhTheme()
</script>

<template>
  <div>
    <LhButton @click="toggleTheme">
      {{ theme === 'dark' ? 'تبديل إلى الفاتح' : 'تبديل إلى الداكن' }}
    </LhButton>
    <LhButton @click="() => setTheme('light')">فاتح</LhButton>
    <LhButton @click="() => setTheme('dark')">داكن</LhButton>
  </div>
</template>

Options API ​

vue
<script>
import { useLhTheme } from '@lh-ui/vue3'

export default {
  setup() {
    const { theme, toggleTheme, setTheme } = useLhTheme()
    return { theme, toggleTheme, setTheme }
  },
}
</script>

<template>
  <div>
    <LhButton @click="toggleTheme">
      {{ theme === 'dark' ? 'تبديل إلى الفاتح' : 'تبديل إلى الداكن' }}
    </LhButton>
  </div>
</template>

يحفظ useLhTheme حالة السمة تلقائيًا في localStorage (المفتاح: lh-ui-theme)، فلا تفقد السمة بعد تحديث الصفحة.

الطريقة الثانية: التبديل عبر خاصية HTML ​

يُكتفى بضبط data-theme="dark" على العنصر الجذري لتفعيل الوضع الداكن عموميًا:

html
<!DOCTYPE html>
<html lang="zh-CN" data-theme="dark">
  <!-- ... -->
</html>

ألوان سمات مخصصة (الخزف الأزرق 青花瓷 / أخضر الصنوبر 松花绿 / الزنجفر الأحمر 朱砂红) ​

بالإضافة إلى السمتين الفاتحة والداكنة المدمجتين، تدعم المكتبة تخصيص أي مجموعة ألوان عبر themeVars لتحقيق سمة شخصية.

المثال أدناه عرض لـ كتابة متغيرات مخصصة يدويًا، وقد عُدِّلت قيمه لأغراض الشرح، وهو لا يتطابق تمامًا مع السمات المسبقة المدمجة في السمات المسبقة (cerblue / songhua / zhusha). ولاستخدام سمة مسبقة مدمجة مباشرة، استخدم useLhPresetTheme أو getThemeVars(name).

سمة الخزف الأزرق 青花瓷 ​

تعتمد النيلي الداكن لونًا أساسيًا، مستوحاة من الخزف الأزرق التقليدي.

Composition API ​

vue
<script setup lang="ts">
const cerblueTheme = {
  'primary-color': '#2B4C7C',
  'primary-color-hover': '#3D649E',
  'primary-color-active': '#1F3A5F',
  'primary-color-bg': '#E8EDF3',
  'bg-color': '#F0F4F8',
  'border-color-base': '#C8D6E5',
}
</script>

<template>
  <LhConfigProvider :theme-vars="cerblueTheme">
    <LhButton type="primary">زر الخزف الأزرق</LhButton>
    <LhInput placeholder="حقل إدخال الخزف الأزرق" />
  </LhConfigProvider>
</template>

Options API ​

vue
<script>
import { LhConfigProvider, LhButton, LhInput } from '@lh-ui/vue3'

export default {
  components: { LhConfigProvider, LhButton, LhInput },
  data() {
    return {
      cerblueTheme: {
        'primary-color': '#2B4C7C',
        'primary-color-hover': '#3D649E',
        'primary-color-bg': '#E8EDF3',
        'bg-color': '#F0F4F8',
      },
    }
  },
}
</script>

<template>
  <LhConfigProvider :theme-vars="cerblueTheme">
    <LhButton type="primary">زر الخزف الأزرق</LhButton>
  </LhConfigProvider>
</template>

سمة أخضر الصنوبر 松花绿 ​

تعتمد أخضر الخيزران لمسةً لخلق أسلوب منعش وطبيعي.

vue
<script setup lang="ts">
const bambooTheme = {
  'primary-color': '#5B8C5A',
  'primary-color-hover': '#6FA36E',
  'primary-color-bg': '#EDF5EC',
  'success-color': '#5B8C5A',
  'bg-color': '#F6FAF5',
}
</script>

<template>
  <LhConfigProvider :theme-vars="bambooTheme">
    <LhButton type="primary">درب الخيزران</LhButton>
    <LhTag type="success">أوراق جديدة</LhTag>
  </LhConfigProvider>
</template>

سمة الزنجفر الأحمر 朱砂红 ​

تعتمد أحمر أختام الحبر لونًا أساسيًا، لتبريز أجواء فاخرة وأنيقة.

vue
<script setup lang="ts">
const vermilionTheme = {
  'primary-color': '#C43A31',
  'primary-color-hover': '#E85D4A',
  'primary-color-bg': '#FDF0EE',
  'bg-color': '#FFFBF9',
  'border-color-base': '#F0D5CF',
}
</script>

<template>
  <LhConfigProvider :theme-vars="vermilionTheme">
    <LhButton type="primary">ميثاق مختوم</LhButton>
  </LhConfigProvider>
</template>

نظام خلفيات الأنماط ​

توفّر المكتبة نظام خلفيات بأنماط صينية شاعرية يدعم 6 أنماط مسبقة، مع تحديد دقيق لنطاق التطبيق عبر القائمة البيضاء patternComponents.

الأنماط المسبقة ​

اسم النمطمتغير CSSالوصف
أوراق الصفصاف 柳叶var(--lh-pattern-willow)أوراق صفصاف نحيلة بتوزيع متناغم
السحابة الميمونة 祥云var(--lh-pattern-cloud)سُحُب متدفّقة بانحناءات لولبية
تموّجات الماء 水波var(--lh-pattern-water)تموّجات خفيفة تتكرر طبقات
ندفات الثلج 雪花var(--lh-pattern-snow)بلورات ثلج سداسية بفروع دقيقة
أزهار البرقوق 梅花var(--lh-pattern-plum)بتلات خمس ممتدة وقلب البتلة واضح
أوراق الخيزران 竹叶var(--lh-pattern-bamboo)أوراق خيزران رمحية متناثرة بانتظام

الإعداد العام للنمط ​

Composition API ​

vue
<script setup lang="ts">
const config = {
  themeVars: {
    'bg-pattern': 'var(--lh-pattern-cloud)',
    'bg-pattern-opacity': '0.15',
  },
  patternComponents: ['button', 'input'] as const,
}
</script>

<template>
  <LhConfigProvider
    :theme-vars="config.themeVars"
    :pattern-components="config.patternComponents"
  >
    <!-- يُطبَّق النمط على الزر وحقل الإدخال، وليس على Dialog -->
    <LhButton>زر بنمط</LhButton>
    <LhInput placeholder="حقل إدخال بنمط" />
  </LhConfigProvider>
</template>

Options API ​

vue
<script>
export default {
  data() {
    return {
      config: {
        themeVars: {
          'bg-pattern': 'var(--lh-pattern-cloud)',
          'bg-pattern-opacity': '0.15',
        },
        patternComponents: ['button', 'input'],
      },
    }
  },
}
</script>

<template>
  <LhConfigProvider
    :theme-vars="config.themeVars"
    :pattern-components="config.patternComponents"
  >
    <LhButton>زر بنمط</LhButton>
  </LhConfigProvider>
</template>

مرجع متغيرات النمط ​

اسم المتغيرالوصفالقيمة الافتراضية
--lh-bg-patternعنوان نمط الخلفيةnone
--lh-bg-pattern-repeatنمط التكرارrepeat
--lh-bg-pattern-sizeحجم النمط40px
--lh-bg-pattern-opacityشفافية النمط0.15
--lh-bg-pattern-colorلون النمطvar(--lh-decoration-color, rgba(184, 134, 11, 0.12))
--lh-bg-pattern-blendوضع المزجsoft-light

مثال إعداد كامل ​

يعرض ما يلي الاستخدام الكامل لإعدادات ConfigProvider، بدمج جميع قدرات السمة واللغة والحجم والنمط.

Composition API ​

vue
<script setup lang="ts">
import { zhCN } from '@lh-ui/vue3'

const configProvider = {
  size: 'medium' as const,
  locale: zhCN,
  themeVars: {
    'primary-color': '#2B4C7C',
    'bg-pattern': 'var(--lh-pattern-cloud)',
    'bg-pattern-opacity': '0.15',
  },
  patternComponents: ['button', 'input', 'dialog'],
}
</script>

<template>
  <LhConfigProvider
    :size="configProvider.size"
    :locale="configProvider.locale"
    :theme-vars="configProvider.themeVars"
    :pattern-components="configProvider.patternComponents"
  >
    <slot />
  </LhConfigProvider>
</template>

Options API ​

vue
<script>
import { zhCN } from '@lh-ui/vue3'

export default {
  data() {
    return {
      configProvider: {
        size: 'medium',
        locale: zhCN,
        themeVars: {
          'primary-color': '#2B4C7C',
          'bg-pattern': 'var(--lh-pattern-cloud)',
        },
        patternComponents: ['button', 'input', 'dialog'],
      },
    }
  },
}
</script>

<template>
  <LhConfigProvider
    :size="configProvider.size"
    :locale="configProvider.locale"
    :theme-vars="configProvider.themeVars"
    :pattern-components="configProvider.patternComponents"
  >
    <slot />
  </LhConfigProvider>
</template>

أولوية متغيرات السمة ​

تُدمج متغيرات CSS النهائية للمكوّن وفق الأولويات التالية (كلٌّ يليه يتجاوز سابقه):

  1. themeVars العام في ConfigProvider (الأولوية الأدنى)
  2. componentTheme[اسم المكوّن] لكل مكوّن في ConfigProvider
  3. خاصية themeVars الخاصة بالمكوّن
  4. خاصية bgPattern الخاصة بالمكوّن (الأولوية الأعلى)

بالنسبة إلى متغير bg-pattern، يخضع إضافيًا لقيد القائمة البيضاء patternComponents: لا تُطبَّق قيمة bg-pattern المُعدَّة عامةً سوى على المكوّنات المدرجة في القائمة البيضاء.

التخطيط السريع عبر sx ​

توفّر خاصية sx أسلوبًا تصريحيًا للتخطيط المضمّن، يتيح ضبط المسافات والأحجام دون كتابة CSS. وهي مدعومة حاليًا في المكوّنات التالية: Button وInput وDialog وTooltip وAlert وCard وEmpty وBreadcrumb وPagination وSteps وTabs وSkeleton.

المبدأ ​

يعتمد sx شبكة أساسها 8px، إذ يُضرب الرقم في 8 للحصول على قيمة البكسل الفعلية. فمثلًا يكافئ mt: 2 القيمة marginTop: 16px.

الخصائص المدعومة ​

المسافات ​

الخاصيةالوصفمثالCSS المكافئ
mمسافة خارجية من الجهات الأربعm: 2margin: 16px
mxمسافة خارجية أفقيةmx: 1marginLeft: 8px; marginRight: 8px
myمسافة خارجية عموديةmy: 1marginTop: 8px; marginBottom: 8px
mt, mr, mb, mlمسافة خارجية أحادية الجهةmt: 2marginTop: 16px
pمسافة داخلية من الجهات الأربعp: 3padding: 24px
pxمسافة داخلية أفقيةpx: 2paddingLeft: 16px; paddingRight: 16px
pyمسافة داخلية عموديةpy: 1paddingTop: 8px; paddingBottom: 8px
pt, pr, pb, plمسافة داخلية أحادية الجهةpt: 2paddingTop: 16px

الأحجام ​

الخاصيةالوصفمثال
wالعرض (الرقم يمثّل px، والسلسلة النصية قيمتها)w: 200 أو w: '100%'
hالارتفاعh: 100 أو h: 'auto'

تخطيط Flex ​

الخاصيةالوصفمثال
displayنوع العرضdisplay: 'flex'
flexاختصار flexflex: '1 1 0%'
flexDirectionاتجاه المحور الرئيسيflexDirection: 'column'
alignItemsمحاذاة المحور المتقاطعalignItems: 'center'
justifyContentمحاذاة المحور الرئيسيjustifyContent: 'flex-end'

أمثلة الاستخدام ​

vue
<script setup lang="ts">
import { ref } from 'vue'

const visible = ref(false)
</script>

<template>
  <!-- مسافات الزر -->
  <LhButton type="primary" :sx="{ mt: 2, mx: 1 }">زر بمسافات</LhButton>

  <!-- المسافة الخارجية لحقل الإدخال -->
  <LhInput placeholder="مسافات حقل الإدخال العمودية" :sx="{ my: 1 }" />

  <!-- عرض Dialog: لا يدعم sx سوى w/h والخصائص الشبيهة بالمسافات -->
  <LhDialog v-model="visible" title="مثال" :sx="{ w: 480 }">
    <p>مربع حوار بعرض ثابت</p>
  </LhDialog>
</template>
vue
<script>
export default {
  data() {
    return { visible: false }
  },
}
</script>

<template>
  <LhButton type="primary" :sx="{ mt: 2, mx: 1 }">زر بمسافات</LhButton>
</template>

جمال التقاليد، أساس الكود