← بلاگ

⁦Text.js 0.1⁩

⁦Text.js 0.1⁩، DevTools کونسول میں رینڈر ہونے والی ایپس کے لیے ⁦React 19⁩ ریکنسائلر، Yoga لے آؤٹ اور فائل سسٹم ⁦App Router⁩ لاتا ہے۔

Adam

⁦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 موجودہ روٹ کے لنک کو اسٹائل کرتا ہے:

app/layout.tsxtsx
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 میں کچھ شامل کیے بغیر فائلوں کو منظم کرتے ہیں۔

app/deployments/[id]/page.tsxtsx
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 فنکشن ملتا ہے:

app/deployments/error.tsxtsx
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 لوٹاتے ہیں:

app/api/metrics/route.tsts
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 پر چلتا ہے۔

مکمل فہرست تبدیلیوں کے ریکارڈ میں ہے۔