App Screen
Stackflow 네비게이션에서 개별 화면을 구성하는 컴포넌트입니다. 모바일 앱과 같은 화면 전환 경험을 제공할 때 사용됩니다.
import { IconBellFill } from "@karrotmarket/react-monochrome-icon";
import { Flex } from "@seed-design/react";
import type { ActivityComponentType } from "@stackflow/react/future";
import {
AppBar,
AppBarCloseButton,
AppBarIconButton,
AppBarLeft,
AppBarMain,
AppBarRight,
} from "seed-design/ui/app-bar";
import { AppScreen, AppScreenContent } from "seed-design/ui/app-screen";
declare module "@stackflow/config" {
interface Register {
"react/app-screen/preview": {};
}
}
const AppScreenPreviewActivity: ActivityComponentType<"react/app-screen/preview"> = () => {
return (
<AppScreen theme="cupertino">
<AppBar>
<AppBarLeft>
<AppBarCloseButton />
</AppBarLeft>
<AppBarMain>Preview</AppBarMain>
<AppBarRight>
<AppBarIconButton aria-label="Notification">
<IconBellFill />
</AppBarIconButton>
</AppBarRight>
</AppBar>
<AppScreenContent>
<Flex height="full" justify="center" align="center">
Preview
</Flex>
</AppScreenContent>
</AppScreen>
);
};
export default AppScreenPreviewActivity;Installation
npx @seed-design/cli@latest add ui:app-screenUsage
import {
AppBar,
AppBarBackButton,
AppBarCloseButton,
AppBarIconButton,
AppBarLeft,
AppBarMain,
AppBarRight,
} from "seed-design/ui/app-bar";
import { AppScreen, AppScreenContent } from "seed-design/ui/app-screen";<AppScreen theme="cupertino">
<AppBar>
<AppBarLeft>
<AppBarBackButton />
</AppBarLeft>
<AppBarMain>Title</AppBarMain>
<AppBarRight>
{/* actions */}
</AppBarRight>
</AppBar>
<AppScreenContent>
{/* content */}
</AppScreenContent>
</AppScreen>Props
App Screen
AppScreen
Prop
Type
AppScreenContent
Prop
Type
App Bar
AppBar
Prop
Type
AppBarLeft
Prop
Type
AppBarMain
Prop
Type
AppBarRight
Prop
Type
AppBarIconButton, AppBarBackButton, AppBarCloseButton
Prop
Type
Examples
Tones
AppScreen의 tone 속성을 transparent로 설정하여 투명한 배경을 사용할 수 있습니다.
AppBar의 배경이 투명해집니다.- 모바일 OS 상태바를 포함한
AppScreen상단에 그라디언트가 표시됩니다.gradient속성을false로 설정하여 숨길 수 있습니다.
import { IconBellFill } from "@karrotmarket/react-monochrome-icon";
import { Flex } from "@seed-design/react";
import type { ActivityComponentType } from "@stackflow/react/future";
import {
AppBar,
AppBarCloseButton,
AppBarIconButton,
AppBarLeft,
AppBarMain,
AppBarRight,
} from "seed-design/ui/app-bar";
import { AppScreen, AppScreenContent } from "seed-design/ui/app-screen";
declare module "@stackflow/config" {
interface Register {
"react/app-screen/transparent-bar": {};
}
}
const AppScreenTransparentBarActivity: ActivityComponentType<
"react/app-screen/transparent-bar"
> = () => {
return (
<AppScreen theme="cupertino" layerOffsetTop="none" tone="transparent">
<AppBar>
<AppBarLeft>
<AppBarCloseButton aria-label="Close" />
</AppBarLeft>
<AppBarMain>Preview</AppBarMain>
<AppBarRight>
<AppBarIconButton aria-label="Notification">
<IconBellFill />
</AppBarIconButton>
</AppBarRight>
</AppBar>
<AppScreenContent>
<Flex
height="full"
justify="center"
align="center"
bg="palette.gray800"
color="fg.neutralInverted"
>
Preview
</Flex>
</AppScreenContent>
</AppScreen>
);
};
export default AppScreenTransparentBarActivity;With Intersection Observer
Intersection Observer를 사용해 AppBar의 tone 속성을 동적으로 변경할 수 있습니다.
import { IconBellFill } from "@karrotmarket/react-monochrome-icon";
import { Flex } from "@seed-design/react";
import type { ActivityComponentType } from "@stackflow/react/future";
import { useEffect, useRef, useState } from "react";
import {
AppBar,
AppBarCloseButton,
AppBarIconButton,
AppBarLeft,
AppBarMain,
AppBarProps,
AppBarRight,
} from "seed-design/ui/app-bar";
import { AppScreen, AppScreenContent } from "seed-design/ui/app-screen";
declare module "@stackflow/config" {
interface Register {
"react/app-screen/with-intersection-observer": unknown;
}
}
const AppScreenWithIntersectionObserverActivity: ActivityComponentType<
"react/app-screen/with-intersection-observer"
> = () => {
const [tone, setTone] = useState<AppBarProps["tone"]>("transparent");
const whiteImageRef = useRef<HTMLDivElement>(null);
useEffect(() => {
const observer = new IntersectionObserver(
(entries) => {
const entry = entries[0];
if (!entry.isIntersecting) {
// 이미지 영역을 벗어나면 tone을 layer로 변경
setTone("layer");
} else {
// 이미지 영역을 포함하면 tone을 transparent로 변경
setTone("transparent");
}
},
{
threshold: [0, 0.1, 0.5, 1],
rootMargin: "0px",
},
);
if (whiteImageRef.current) {
observer.observe(whiteImageRef.current);
}
return () => {
observer.disconnect();
};
}, []);
return (
<AppScreen theme="cupertino" layerOffsetTop="none" tone={tone}>
<AppBar>
<AppBarLeft>
<AppBarCloseButton aria-label="Close" />
</AppBarLeft>
<AppBarMain>Preview</AppBarMain>
<AppBarRight>
<AppBarIconButton aria-label="Notification">
<IconBellFill />
</AppBarIconButton>
</AppBarRight>
</AppBar>
<AppScreenContent>
<Flex
ref={whiteImageRef}
justifyContent="center"
alignItems="center"
bg="palette.staticWhite"
height="400px"
width="full"
>
하얀 이미지
</Flex>
<Flex
height="1000px"
justify="center"
align="center"
bg="palette.gray800"
color="fg.neutralInverted"
>
컨텐츠 영역
</Flex>
</AppScreenContent>
</AppScreen>
);
};
export default AppScreenWithIntersectionObserverActivity;Layer Offset Top
layerOffsetTop 속성을 사용해 AppScreenContent의 상단 오프셋을 조정할 수 있습니다.
tone="transparent"와 gradient를 사용하는 경우, 일반적으로 layerOffsetTop="none"을 함께 설정하여 모바일 OS 상태바 영역까지 콘텐츠 영역을 확장합니다.
디스플레이 컷아웃 (notch) 등 safe area를 올바르게 처리하기 위해 viewport-fit=cover가 포함된 viewport 메타 태그를 사용하세요.
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />


Customizing App Bar
import { Flex, Icon } from "@seed-design/react";
import { IconBellFill } from "@karrotmarket/react-monochrome-icon";
import type { ActivityComponentType } from "@stackflow/react/future";
import { AppBar, AppBarIconButton, AppBarMain, AppBarRight } from "seed-design/ui/app-bar";
import { AppScreen, AppScreenContent } from "seed-design/ui/app-screen";
declare module "@stackflow/config" {
interface Register {
"react/app-screen/app-bar-customization": {};
}
}
const AppScreenAppBarCustomizationActivity: ActivityComponentType<
"react/app-screen/app-bar-customization"
> = () => {
return (
<AppScreen theme="android">
<AppBar>
<AppBarMain title="Preview" subtitle="This is a nice preview." />
<AppBarRight>
<AppBarIconButton aria-label="Notification">
<Icon svg={<IconBellFill />} color="fg.informative" size="x5" />
</AppBarIconButton>
</AppBarRight>
</AppBar>
<AppScreenContent>
<Flex justify="center" align="center" height="full">
Preview
</Flex>
</AppScreenContent>
</AppScreen>
);
};
export default AppScreenAppBarCustomizationActivity;Last updated on