テキストとスタイル

色、テキスト属性、テーマトークンでデプロイカードのスタイルを設定します。

この章のアプリはコンソールで動作しています。⌘⌥JCtrl+Shift+J⌘⌥KCtrl+Shift+K⌘⌥Cで開き(先に開発者向け機能を有効化)、試してください。
章の動画を見る3:24

この章の内容

  • テキスト属性
  • テーマトークン
  • デプロイカード
  • テーマ

各セルには文字、前景色、背景色、属性のセットがあります。Text.jsはこれらを %c のCSSスパンにコンパイルするため、コンソールに実際の色、太字、斜体が表示されます。

テキスト属性

<Text> は bold、dim、italic、underline、strikethrough を受け取ります。ネストした <Text> 要素は、1行内のスタイル付きスパンになります。

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

テーマトークン

color プロパティは16進数値、色名(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 はカードを背景から浮き上がらせます。デプロイIDにはステータスの色が適用され、ビルド中は斜体になり、エラー時は取り消し線が付きます。

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" は長いコミットメッセージを2行目に折り返さず、末尾を … で省略します。

テーマ

Text.jsにはGeist Dark、OpenCode Dark、Tokyo Night、Amber CRT、Geist Lightの5つのテーマが同梱されています。コンソールで t を押すと、順に切り替わります。上で使った色はすべてトークンなので、フレーム全体が新しいパレットで再描画されます。

試す

これは章の終わりに完成するAcme Deploysで、DevToolsで動作しています。パッドをクリックして、以下のキーを使います。

▼ 03 · テキストとスタイル

コンソールを開く

⌘⌥J
CtrlShiftJ
⌘⌥K
CtrlShiftK
⌘⌥C

アプリはDevToolsに描画されます。まずSafariの「設定」→「詳細」で「Webデベロッパ用の機能を表示」をオンにします。 次にここをクリックして、tを押します。

デスクトップで開く

このアプリはDevToolsのコンソールに描画されるため、デスクトップブラウザーが必要です。

クイズ

2問

すべての問題に回答すると章を完了できます。

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

 

What does wrap="truncate-end" do?