الحزمة tanrei مكتوبة بلغة Dart وحدها. توفّر عناصر واجهة (widgets) و TanreiTheme موروثًا وثوابت رموز (tokens) مولَّدة، ولا تعتمد على MaterialApp ولا على CupertinoApp؛ فهي تعمل داخل أيٍّ منهما، أو داخل WidgetsApp مجرّد.
لم يُنشر بعد
tanrei غير موجودة بعدُ على pub.dev. تُنشر المنصة حين تلحق بالمواصفات الحالية، والتكامل المستمر (CI) الخاص بـ Flutter متوقف حتى ذلك الحين. يبيّن قسم «من الشيفرة المصدرية» أدناه كيف تُضاف الحزمة من chnotchy/tanrei، ويبيّن قسم «بعد نشرها» طريقة التثبيت حينها.
لا تُبنى اليوم
لم تلحق حزمة Flutter بعد بالمواصفات والرموز (tokens) الحالية: كُتبت مصادرها على إصدار سابق من شيفرة الرموز المولَّدة، ولا تُترجَم (compile) على شيفرة اليوم. والتكامل المستمر (CI) الخاص بها متوقف إلى أن تلحق، وصفحة الحالة تَسِم مكوّناتها بأنها متأخرة. الخطوات أدناه هي طريقة إضافتها إلى تطبيق، وتعمل حين تلحق الحزمة.
استنسخ المستودع بجانب تطبيقك واعتمد على الحزمة بمسارها:
flutter pub add "tanrei:{path: ../tanrei/packages/flutter}"والأمر flutter pub add "tanrei:{git: {url: https://github.com/chnotchy/tanrei, path: packages/flutter}}" يتبع المستودع بدلًا من نسخة محلية مستنسخة.
flutter pub add tanreiimport 'package:flutter/widgets.dart';
import 'package:tanrei/tanrei.dart';
class DeployButton extends StatelessWidget {
const DeployButton({super.key, required this.isDeploying, required this.onDeploy});
final bool isDeploying;
final VoidCallback onDeploy;
@override
Widget build(BuildContext context) {
return TanreiTheme(
data: TanreiThemeData.platform(context),
child: TanreiButton(
variant: TanreiButtonVariant.filled,
onPressed: isDeploying ? null : onDeploy,
child: const Text('نشر'),
),
);
}
}لا توجد راية باسم disabled. وكما في أزرار Flutter نفسها، تمرير null إلى onPressed يعطّل الزر.
يقرأ TanreiThemeData.platform(context) السطوع وراية التباين العالي من MediaQuery. لتثبيتهما، ابدأ من ثابت وانسخ منه:
TanreiTheme(
data: TanreiThemeData.dark.copyWith(contrast: TanreiContrast.high),
child: const App(),
)ضع TanreiTheme فوق المتنقِّل (navigator) حتى يراه كل مسار.
يحمل TanreiTheme.of(context).system.typescale أنماط النص الستة عشر بحسب المستوى (heading2 لعنوان قسم، و body للنص المتصل، و label لعنصر تحكم) في صورة رموز من النوع TanreiTextStyle؛ ويحوّل theme.textStyle(system.typescale.heading2) (أو token.toTextStyle()) أحدها إلى TextStyle في Flutter. أما theme.textStyle(token, emphasized: true) (ويدويًّا: token.emphasized(system.typescale.emphasis)) فهو النمط نفسه بوزنه مضافًا إليه درجة التوكيد الخاصة بفئته (typescale.emphasis)؛ فالتوكيد وزن وليس دورًا آخر. انظر الطباعة للأدوار ومقابلتها بالعناصر.