Boxによるレイアウト

セル単位のFlexboxで、トップバー、サイドバー、カードを備えたダッシュボードの外枠を作成します。

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

この章の内容

  • トップバー
  • サイドバーとカード
  • 標準でレスポンシブ対応

コンソールはセルのグリッドです。Text.jsはReact Nativeと同じFlexboxエンジンのYogaでレイアウトするため、<Box> はCSSのflexboxルールに従います。単位はセルで、p-1 は横1列、縦1行のパディングです。

トップバー

多くの画面は縦方向の構成で、1行のバーの下に残りの要素が並びます。h-1 でバーの高さを固定し、grow でコンテンツに残りの領域を使わせます。

app/page.tsx+8-4tsx
削除:import { Box, Text, useInput } from "@textjs/app";追加:import { Box, Spacer, Text, useInput } from "@textjs/app";export default function Page() {  return (削除:    <Box className="flex-col border rounded px-2 py-1">削除:      <Text bold>▼ Acme Deploys</Text>削除:      <Text color="muted">Hello, console.</Text>追加:    <Box className="flex-col grow">追加:      <Box className="flex-row h-1 px-1 gap-2 shrink-0">追加:        <Text bold>▼ Acme</Text>追加:        <Text color="subtle">acme.local</Text>追加:        <Spacer />追加:      </Box>追加:      <Box className="flex-row grow">{/* sidebar + cards */}</Box>    </Box>  );}

<Spacer> は伸長するボックスで、その後ろにある要素を右端へ押し出します。

右側に罫線を持つ固定幅のサイドバーと、残りの幅を分け合う3枚のカードを追加します。basis-0 と grow を組み合わせると、内容に関係なく各カードに均等な幅が割り当てられます。

app/page.tsx+31-1tsx
追加:const NAV = ["Overview", "Deployments", "Settings"];追加:追加:function Card({ title, value }: { title: string; value: string }) {追加:  return (追加:    <Box className="flex-col border rounded px-1 grow shrink basis-0" minWidth={14} minHeight={4}>追加:      <Text color="subtle">{title}</Text>追加:      <Text bold>{value}</Text>追加:    </Box>追加:  );追加:}追加:export default function Page() {追加:  const [sidebar, setSidebar] = useState(true);追加:  const [stacked, setStacked] = useState(false);追加:追加:  useInput((e) => {追加:    if (e.input === "s") setSidebar((v) => !v);追加:    if (e.input === "d") setStacked((v) => !v);追加:  });追加:  return (    <Box className="flex-col grow">      {/* top bar */}削除:      <Box className="flex-row grow">{/* sidebar + cards */}</Box>追加:      <Box className="flex-row grow">追加:        {sidebar && (追加:          <Box className="flex-col w-18 shrink-0 border-r px-1 pt-1">追加:            {NAV.map((item) => <Text key={item}>{item}</Text>)}追加:          </Box>追加:        )}追加:        <Box className={stacked ? "flex-col grow gap-1 p-1" : "flex-row grow items-start gap-1 p-1"}>追加:          <Card title="Production" value="acme-web" />追加:          <Card title="Deployments" value="6 today" />追加:          <Card title="Build time" value="38s p50" />追加:        </Box>追加:      </Box>    </Box>  );}

コンソールで s と d を押します。Yogaがレイアウトを再計算し、変更された行のみを再描画するため、サイドバーの切り替えに必要なのは1回の console.log です。

標準でレスポンシブ対応

グリッドはドッキングされたDevToolsパネルに追従します。ドラッグしてコンソールの幅や高さを広げると、カードが再配置されます。ブレークポイントが必要な場合は、useBreakpoint() が現在のブレークポイントをセル単位で返します。

試す

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

▼ 02 · Boxによるレイアウト

コンソールを開く

⌘⌥J
CtrlShiftJ
⌘⌥K
CtrlShiftK
⌘⌥C

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

デスクトップで開く

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

クイズ

2問

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

classNameユーティリティーのp-1は何を意味しますか?

 

ボックスが残りの領域を埋めるクラスはどれですか?