النص والتنسيق

نسّق بطاقة نشر بالألوان وسمات النص ورموز السمة.

يعمل تطبيق هذا الفصل في وحدة التحكم. افتحها باستخدام ⌘⌥JCtrl+Shift+J⌘⌥KCtrl+Shift+K⌘⌥C (فعّل ميزات المطوّرين أولًا)، ثم جرّبه.
مشاهدة الفصل3:24

في هذا الفصل

  • سمات النص
  • رموز السمة
  • بطاقة نشر
  • السمات

لكل خلية محرف ولون أمامي وخلفية ومجموعة من السمات. يحوّل Text.js هذه الخصائص إلى عناصر span بتنسيق CSS باستخدام %c، فتعرض وحدة التحكم ألوانًا فعلية ونصوصًا عريضة ومائلة.

سمات النص

يقبل <Text> الخصائص bold و dim و italic و underline و strikethrough. تتحول عناصر <Text> المتداخلة إلى عناصر span منسّقة داخل سطر واحد.

<Text>  Deployed <Text bold>acme-web</Text> to <Text color="accent">iad1</Text></Text>

رموز السمة

تقبل الخاصية color قيمًا سداسية عشرية وأسماء ألوان عادية (emerald) ورموز السمة؛ وتُستخدم درجات لوحة ألوان Tailwind عبر الأصناف (text-emerald-400). تتبع الرموز السمة النشطة، لذا فضّلها لكل ما يحمل دلالة. أضف مكوّن حالة:

app/status.tsx+15tsx
المضاف: import { Text } from "@textjs/app";المضاف: المضاف: export type DeployStatus = "ready" | "building" | "error" | "queued";المضاف: المضاف: export const STATUS = {المضاف:   ready: { label: "Ready", color: "success" },المضاف:   building: { label: "Building", color: "warning" },المضاف:   error: { label: "Error", color: "danger" },المضاف:   queued: { label: "Queued", color: "subtle" },المضاف: } as const;المضاف: المضاف: export function Status({ status }: { status: DeployStatus }) {المضاف:   const s = STATUS[status];المضاف:   return <Text color={s.color} wrap="nowrap">{`● ${s.label}`}</Text>;المضاف: }

بطاقة نشر

يُبرز bg-surface البطاقة عن الخلفية. يأخذ معرّف النشر لون الحالة، ويظهر بخط مائل أثناء البناء وبخط يتوسطه عند حدوث خطأ.

app/page.tsx+23-1tsx
المحذوف: import { Box, Spacer, Text, useInput } from "@textjs/app";المضاف: import { Box, Spacer, Text, useAppTheme, useInput } from "@textjs/app";المضاف: import { Status, STATUS, type DeployStatus } from "./status";المضاف: المضاف: const ORDER: DeployStatus[] = ["ready", "building", "error", "queued"];المضاف: export default function Page() {المضاف:   const { theme, cycleTheme } = useAppTheme();المضاف:   const [status, setStatus] = useState<DeployStatus>("ready");المضاف: المضاف:   useInput((e) => {المضاف:     if (e.input === "t") cycleTheme();المضاف:     if (e.input === "s") setStatus((s) => ORDER[(ORDER.indexOf(s) + 1) % ORDER.length]);المضاف:   });المضاف:   return (    <Box className="flex-col grow">      {/* top bar, now with the theme name on the right */}المضاف:       <Box className="flex-col border rounded px-2 py-1 bg-surface">المضاف:         <Box className="flex-row gap-2 h-1">المضاف:           <Text bold>acme-web</Text>المضاف:           <Status status={status} />المضاف:         </Box>المضاف:         <Text color="muted" wrap="truncate-end">feat: stream cells downward</Text>المضاف:         <Text color={STATUS[status].color} italic={status === "building"} strikethrough={status === "error"}>المضاف:           dpl_8fK2المضاف:         </Text>المضاف:       </Box>    </Box>  );}

يُنهي wrap="truncate-end" رسائل الإيداع الطويلة بعلامة … بدلًا من التفافها إلى صف ثانٍ.

السمات

يتضمن Text.js خمس سمات: ⁦Geist Dark⁩ و ⁦OpenCode Dark⁩ و ⁦Tokyo Night⁩ و ⁦Amber CRT⁩ و ⁦Geist Light⁩. اضغط t في وحدة التحكم للتنقل بينها. يُعاد رسم الإطار بأكمله بلوحة الألوان الجديدة، لأن كل لون أعلاه رمز.

جرّبه

هذا تطبيق Acme Deploys في نهاية الفصل، يعمل في DevTools. انقر اللوحة، ثم استخدم المفاتيح أدناه.

▼ 03 · النص والتنسيق

فتح وحدة التحكم

⌘⌥J
CtrlShiftJ
⌘⌥K
CtrlShiftK
⌘⌥C

يُعرض التطبيق في DevTools.فعّل أولًا «إظهار الميزات لمطوري الويب» في إعدادات Safari → متقدم. ثم انقر هنا واضغط t.

الفتح على حاسوب مكتبي

يُعرض هذا التطبيق في وحدة تحكم DevTools، التي تتطلب متصفحًا على حاسوب مكتبي.

اختبار

2 سؤالان

أجب عن كل سؤال لإكمال الفصل.

Why use color="success" instead of a hex value?

 

What does wrap="truncate-end" do?