دليل Vue

مكوّنات ملف واحد في Vue 3 بخصائص مُنمَّطة، defineModel وربط ثنائي الاتجاه، وتمرير v-bind="$attrs" .

ما الذي ستبنيه

نموذج اتصال صغير — حقل بتسمية، زر إرسال، v-model ربط، سلوك حقيقي للوحة المفاتيح وقارئ الشاشة — عاريًا أولًا ثم منسَّقًا، في نحو 10 دقائق.

قبل أن تبدأ

تحتاج إلى git وNode 22 أو أحدث وpnpm 10 أو أحدث. يصلح أي مشروع Vue 3 — Nuxt أو Vite أو Vue العادي.

الخطوة 1 — احصل على الشيفرة

git clone https://github.com/LilyDesignSystem/lily-design-system
cd lily-design-system/lily-design-system-vue-headless
pnpm install
pnpm test        # vitest + @testing-library/vue
pnpm run storybook   # browse all 571 components

المكوّنات ملفات مسطّحة في components/ — Button.vue, TextInput.vue — لكل منها اختباره وstory ووثائقه بجانبه. انسخ الملفات التي تحتاجها، أو اجلب المستودع.

الخطوة 2 — مكوّنك الأول

<script setup>
import Button from "lily-design-system-vue-headless/components/Button.vue";
</script>

<template>
  <Button @click="save">Save</Button>
</template>

يعرض <button class="button" type="button">. الخصائص تطابق الأطر الأخرى: type, disabled, pressed, label، إضافة إلى تمرير السمات لكل ما عداها.

الخطوة 3 — ركّب نموذجًا صغيرًا

<script setup>
import { ref } from "vue";
import Form from ".../components/Form.vue";
import Field from ".../components/Field.vue";
import TextInput from ".../components/TextInput.vue";
import Button from ".../components/Button.vue";

const name = ref("");
</script>

<template>
  <Form @submit="handleSubmit">
    <Field label="Full name" required>
      <TextInput id="name" label="Full name" v-model="name" required />
    </Field>
    <Button type="submit">Save</Button>
  </Form>
</template>

Field يأخذ label كخاصية خاصة به لا كمكوّن تسمية متداخل — مرّرها مرة واحدة على Fieldو TextInputالمطابق من label يوفّر الاسم القابل للوصول.

تم التحقق في 2026-08-29: كانت مسودة سابقة تضع مكوّن Label داخل Fieldفيعرض تسميتين (إحداهما فارغة) لأن Field يعرض تسميته بنفسه من المدخل label خاصية — اكتُشف بتجميع المقتطف نفسه. المسار مسار نموذج الاتصال المركّب هو النمط نفسه، جُرّب باختبارات e2e وaxe حقيقية.

TextInput يستخدم defineModel، لذا يعمل v-model العادي مباشرة.

تحقق من عملك: شغّل التطبيق فيبدو النموذج بسيطًا — تمامًا كما هو مقصود: التنسيق لا يزال قادمًا. اضغط Tab: ينتقل التركيز عبر كل عنصر تحكم، وتُعلن التسمية، ويعمل الإرسال. السلوك مكتمل؛ والمظهر لك وهو الخطوة التالية.

الخطوة 4 — نسِّقه

نسِّق خطّافات الأصناف — .button, .text-input, .label, .field — في ورقة الأنماط لديك، أو اربط سمة جاهزة في index.html / nuxt.config:

<link rel="stylesheet" href="/themes/nord.css" />

الخطوة 5 — شاهد كل شيء يعمل

تطبيق المثال Nuxt هو الفهرس الكامل منسَّقًا ومعروضًا، مع Playwright e2e وخط أساس axe-core:

git clone https://github.com/LilyDesignSystem/lily-design-system
cd lily-design-system/lily-design-system-vue-nuxt-examples
pnpm install && pnpm run dev

الخطوات التالية

أسئلة في الطريق؟ صفحة المساعدة مليئة بالإجابات — وإن أمكن توضيح خطوة أكثر، أخبرنا وسنحسّن الدليل بكل سرور.