Skip to content
واجهاتُ SadUIيعملُ بحدودٍ مُعلَنةكلُّ المجالات

المخارجُ ونوعُ كلٍّ منها

مرجعٌ يُنظَرُ فيه. والعمودُ الحاسمُ هو النوعولماذا.

المخارجُ الستّة

المخرَجالنوعالحالنقطةُ الدخولِ من صالناتج
سطحُ المكتب (SDL2)مُصيِّرٌ حيّliveتشغيل_تطبيق(الجذر)نافذةٌ وحلقةُ أحداث
بلا نظامِ تشغيلمُصيِّرٌ حيّliveتشغيل_تطبيق(الجذر)رسمٌ على ذاكرةِ الإطارِ مباشرةً
HTMLمولِّدُ مصدرliveتوليد_ويب(الجذر، عنوان؟)نصُّ صفحةِ HTML/CSS
Jetpack Composeمولِّدُ مصدرliveتوليد_أندرويد(الجذر، اسم؟)نصُّ Kotlin
SwiftUIمولِّدُ مصدرliveتوليد_آي_أو_إس(الجذر، اسم؟)نصُّ Swift
AppKitمولِّدُ مصدرdeferredتوليد_ماك(الجذر، اسم؟)— مؤجَّل

ما يعنيه كلُّ نوع

مُصيِّرٌ حيّمولِّدُ مصدر
يرسمُ بكسلًا
يملكُ حلقةَ أحداث
يستدعي معالِجاتِك
القيمةُ المُرجَعة— (لا يرجعُ حتّى تُغلَقَ النافذة)نص (مقيس)
مَن يبني بعدَهلا أحدأدواتُ تلك المنصّة (Gradle · Xcode · متصفّح)
مَن يُصيِّرالمُصيِّرُ نفسُهمحرِّكُ تلك المنصّة

توقيعاتُ المولِّدات

كلُّها مُعلَنةٌ في UICore مستقرّة، والمعامِلُ الثاني اختياريّ:

sad
متغير الجذر = عمود(نص_عنصر("مرحبًا")، زر("انقرني"))

متغير صفحة = توليد_ويب(الجذر، "تجربة")        # عنوانُ الصفحة
متغير كوتلن = توليد_أندرويد(الجذر، "شاشتي")   # اسمُ دالّةِ @Composable
متغير سويفت = توليد_آي_أو_إس(الجذر، "شاشتي")  # اسمُ بنيةِ View

اطبع_سطر("نوعُ الناتج: " + نوع(صفحة))

نوعُ الناتج: نص — مقيس. والقيمةُ لا تُكتَبُ إلى ملفٍّ من تلقاءِ نفسِها: اطبَعْها أو اكتُبْها أنتَ.

عيّناتٌ مقيسةٌ من الناتج

توليد_أندرويد على الشجرةِ أعلاه:

kotlin
@Composable
fun شاشتي() {
    Column(modifier = Modifier) {
        Text(text = "مرحبًا", modifier = Modifier)
        Button(onClick = {}, ...) { Text("انقرني") }
    }
}

توليد_آي_أو_إس على الشجرةِ نفسِها:

swift
struct شاشتي: View {
    var body: some View {
        VStack {
            Text("مرحبًا")
            Button(action: {}) { Text("انقرني") }
        }
        .environment(\.layoutDirection, .rightToLeft)

وتوليد_ويب يُخرِجُ مستندًا كاملًا يبدأُ بـ<!DOCTYPE html> وفيه <html dir="rtl" lang="ar">.

⚠️ ولاحِظْ onClick = {} وaction: {}فارغانِ. البنيةُ تُنقَلُ والمنطقُ لا يُنقَل.

خلفيّاتُ التصييرِ كما تُعلَنُ في ui_nodes.yaml

المعرّفenabledصدقُ الإعلانِ مقيس؟
desktop_sdl2true✅ — نافذةٌ فُتِحَت مقيسةً بتشغيلِ ثنائيّ
freestandingtrue❌ لم يُقَسْ ههنا
webtrue❌ لم يُقَسْ
androidtrue❌ لم يُقَسْ
iostrue❌ لم يُقَسْ
macos_appkitfalseالسببُ مكتوبٌ في الملفّ: تستدعي طبقةَ تفاعلٍ لا تصرّحُ بها ترويستُها فلا تُترجَمُ كما هي

لا تُشتَقَّ قدرةٌ من هذا العمود

enabled يصفُ نيّةَ الشفرةِ لا نتيجةَ بناء. وماك برهانُ ذلك: مُعلَنٌ في الملفِّ نفسِه وبسببٍ مكتوبٍ أنّه لا يُترجَم.

دعمُ الخلفيّاتِ في المترجِّم

backend_support في ui_nodes.yaml:

الخلفيّةتدعمُ الواجهة
llvm✅ — المسارُ المدعومُ للبرامجِ المُترجَمةِ ذاتِ الواجهة
native (ELF مباشرٌ بلا LLVM)❌ — يفشلُ التخفيضُ صراحةً بوسمِ kUiRequiresLlvm فلا يُنتَجُ ثنائيٌّ يُنشئُ عناصرَ ثمّ لا يعرضُ شيئًا

سطحُ الواجهةِ بالأرقام

مقيسٌ من language-truth/builtins/ — المستقرُّ من المُعلَن:

فضاءُ الأسماءمستقرّ / مُعلَنما يقدّم
UICore٢٥ / ٢٦التشغيلُ والتنقّلُ والثيمُ والمولِّدات
UIWidgets٦٤ / ١١٢مصانعُ العناصر
CompilerUi٢٤ / ٢٩بناءُ الشجرةِ وضبطُ الخصائص
UIPlatform٢ / ٤٣ارسم_خط · ارسم_مستطيل فقط
UIDevice٠ / ١٨كلُّه مؤجَّل
UIIO · UIStorage٠ / ٧ لكلٍّكلُّه مؤجَّل
UICrypto٠ / ٦كلُّه مؤجَّل
UIAudio٠ / ٥كلُّه مؤجَّل
UIDialog · UINetwork٠ / ٤ لكلٍّكلُّه مؤجَّل
UITimer٠ / ٣كلُّه مؤجَّل

والمؤجَّلُ لا يُستعمَل: وسمُ intent: مؤجَّل يعني مُعلَنًا غيرَ موصولٍ بالمترجِّم.

جردُ الشجرةِ المشتركة

الملفّما يُعلِنالعدد
ui_nodes.yamlأنواعُ العُقَد١١٠
↳ منها أوّليّاتُ المحلِّلتُكتَبُ في واجهة … نهاية١٥
↳ منها حاوياتٌ تقبلُ أبناءًعمود · صف · رصة · شبكة · عمود_كسول · حاوية · عرض_تمرير٧
ui_props.yamlمفاتيحُ الخصائص٩٤
ui_events.yamlأنواعُ الأحداث٣٢ + مخصص
ui_modifiers.yamlمعدّلاتٌ ذاتُ دلالةٍ خاصّة٩
ui_propagation.yamlأطوارُ الانتشار٤
ui_animations.yamlأنواعُ الحركة٢٧
ui_easings.yamlمنحنياتُ التسارع٧
ui_colors.yamlألوانٌ مسمّاة٣٤

فجوةُ التصييرِ المُعلَنة

render_exemptions في ui_nodes.yaml فارغةٌ عمدًا: لا فجوةَ تصييرٍ مُعلَنةً واحدة — كلُّ عقدةٍ في الجردِ تُصيَّرُ في كلِّ هدف. والقائمةُ باقيةٌ لأنّها المتنفَّسُ الشرعيُّ الوحيد: فجوةٌ جديدةٌ تُعلَنُ فيها بسببٍ مكتوب ولا تمرُّ صامتة.

مُرخَّص بموجب رخصة MIT