Text.js 0.1
Text.js 0.1، DevTools کونسول میں رینڈر ہونے والی ایپس کے لیے React 19 ریکنسائلر، Yoga لے آؤٹ اور فائل سسٹم App Router لاتا ہے۔
Text.js 0.1 کو ٹیگ کر دیا گیا ہے۔ یہ تینوں تہوں والا پہلا ورژن ہے: @textjs/core کونسول میں فریم بناتا ہے، @textjs/react ان فریموں میں React 19 رینڈر کرتا ہے، اور textjs ایک App Router اور CLI شامل کرتا ہے۔
App Router
روٹس app/ میں فولڈر ہوتے ہیں اور Next.js App Router کے اصولوں کی پیروی کرتے ہیں۔ یہ create-text-app کا dashboard ٹیمپلیٹ ہے:
app/├── layout.tsx├── page.tsx├── not-found.tsx├── deployments/│ └── [id]/│ └── page.tsx└── api/ └── metrics/ └── route.tsلے آؤٹ اپنے نیچے ہر صفحے کو گھیرتا ہے اور نیویگیشن کے دوران اپنی اسٹیٹ برقرار رکھتا ہے۔ <Link> ایک shortcut لیتا ہے، اس لیے ایک کی دبانے سے لنک کھل جاتا ہے، اور activeClassName موجودہ روٹ کے لنک کو اسٹائل کرتا ہے:
import type { ReactNode } from "react";import { Box, KeyHint, Text, useTheme, type Metadata } from "textjs";import Link from "textjs/link";export const metadata: Metadata = { title: { default: "Acme", template: "%s · Acme" } };export default function RootLayout({ children }: { children?: ReactNode }): ReactNode { const theme = useTheme(); return ( <Box className="flex-col w-full h-full"> <Box className="flex-row h-1 px-1 gap-3 bg-surface shrink-0"> <Text bold color={theme.fg} wrap="nowrap"> ▼ Acme </Text> <Link href="/" shortcut="1" className="text-muted no-underline" activeClassName="text-fg bold"> 1 Metrics </Link> <Link href="/deployments/dpl_a1" shortcut="2" className="text-muted no-underline" activeClassName="text-fg bold"> 2 Latest deploy </Link> </Box> <Box className="grow flex-col px-2 pt-1">{children}</Box> <Box className="flex-row h-1 gap-2 pl-6 shrink-0 bg-surface"> <KeyHint keys="1-2" label="navigate" /> <KeyHint keys="tab" label="focus" /> <KeyHint keys="F2" label="devtools" /> </Box> </Box> );}ڈائنامک سیگمنٹ Next.js کی طرح کام کرتے ہیں۔ [id] ایک پیرامیٹر بن جاتا ہے، [...slug] باقی پاتھ کو پکڑتا ہے اور [[...slug]] پیرنٹ سے بھی میچ کرتا ہے۔ اسٹیٹک سیگمنٹ کو ڈائنامک سیگمنٹ پر ترجیح ملتی ہے، اور (marketing) جیسے روٹ گروپ URL میں کچھ شامل کیے بغیر فائلوں کو منظم کرتے ہیں۔
import { Box, Text, useInput } from "textjs";import { notFound, useParams, useRouter } from "textjs/navigation";import { DEPLOYMENTS } from "../../../lib/data";export default function DeploymentPage() { const router = useRouter(); const { id } = useParams<{ id: string }>(); const deployment = DEPLOYMENTS.find((d) => d.id === id); useInput((e) => { if (e.key === "escape") router.back(); }); if (!deployment) notFound(); return ( <Box className="flex-col gap-1"> <Text bold>{deployment.id}</Text> <Text>{deployment.branch}</Text> </Box> );}loading.tsx اور error.tsx ایک سیگمنٹ کو Suspense باؤنڈری اور ایرر باؤنڈری میں گھیرتے ہیں۔ ایرر کمپوننٹ کو ایرر اور ایک reset فنکشن ملتا ہے:
import { Box, Text, useInput, type ErrorComponentProps } from "textjs";export default function DeploymentsError({ error, reset }: ErrorComponentProps) { useInput((e) => { if (e.key === "r") reset(); }); return ( <Box className="flex-col grow items-center justify-center gap-1"> <Text bold>Something went wrong loading deployments.</Text> <Text>{error.message}</Text> </Box> );}روٹ ہینڈلر app/api میں ہوتے ہیں اور ایک معیاری Response لوٹاتے ہیں:
export function GET(): Response { return Response.json({ cpu: Math.random(), memory: Math.random(), at: new Date().toISOString() });}راؤٹر history.pushState سے window.location کو ہم آہنگ رکھتا ہے، اس لیے پیچھے، آگے اور ڈیپ لنکس کام کرتے ہیں، اور metadata.title کو document.title میں لکھا جاتا ہے۔ ایپ کونسول میں ڈرا کرتی ہے، اور صفحے پر ایک فوکس پیڈ ہوتا ہے جو ان پٹ جمع کرتا ہے۔
CLI
text devکمانڈ React Fast Refresh کے ساتھ Vite شروع کرتی ہے۔ فائل محفوظ کرنے سے کونسول اپنی جگہ اپ ڈیٹ ہوتا ہے۔text buildکمانڈ ایپ اور اس کے روٹ ہینڈلرز کا پروڈکشن بلڈ لکھتی ہے۔text startکمانڈ بلڈ اور روٹ ہینڈلرز کو سرو کرتی ہے۔
create-text-app کمانڈ starter یا dashboard ٹیمپلیٹ سے پروجیکٹ کا ابتدائی ڈھانچا بناتی ہے۔
انسپیکٹر
چلتی ہوئی ایپ میں Ctrl+` یا F2 دبائیں تاکہ کونسول کے اندر [▼] انسپیکٹر کھلے۔ یہ میچ ہونے والا روٹ اور اس کے پیرامیٹر، فریم کا سائز، span کی تعداد اور مرحلوں کے اوقات، اور ڈرٹی گیٹ کے چھوڑے ہوئے فریموں کی تعداد دکھاتا ہے۔ W کی Yoga لے آؤٹ کو وائر فریم کی صورت میں بناتی ہے۔
0.1 میں مزید
@textjs/react میں PascalCase کمپوننٹس (Box، Text، ScrollBox، Input، Textarea، Select، Tabs، Code، Markdown، Diff، Modal، Spinner)، سیل میں کام کرنے والی Tailwind طرز کی className یوٹیلٹیز، اور تھیمز شامل ہیں۔ لے آؤٹ WebAssembly میں Yoga پر چلتا ہے۔
مکمل فہرست تبدیلیوں کے ریکارڈ میں ہے۔