@uniai-fe/uds-templates 0.1.18 → 0.1.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/styles.css +56 -7
- package/package.json +1 -1
- package/src/asset-url.ts +7 -0
- package/src/auth/common/container/header/StageHeader.tsx +2 -2
- package/src/index.scss +0 -2
- package/src/page-frame/desktop/components/header/util/Logout.tsx +1 -1
- package/src/page-frame/desktop/components/header/util/setting/Button.tsx +3 -1
- package/src/page-frame/desktop/img/logout-v2.svg +5 -0
- package/src/page-frame/desktop/img/setting-v2.svg +4 -0
- package/src/page-frame/desktop/index.tsx +4 -1
- package/src/page-frame/index.tsx +8 -2
- package/src/page-frame/mobile/{header/PageFrameMobileHeader.tsx → components/header/Header.tsx} +6 -6
- package/src/page-frame/mobile/components/header/index.ts +9 -0
- package/src/page-frame/mobile/components/index.tsx +14 -0
- package/src/page-frame/{navigation/PageFrameNavigation.tsx → mobile/components/navigation/Navigation.tsx} +3 -3
- package/src/page-frame/mobile/components/navigation/index.tsx +8 -0
- package/src/page-frame/mobile/components/page/Container.tsx +29 -0
- package/src/page-frame/mobile/{PageFrameMobile.tsx → components/page/Frame.tsx} +12 -9
- package/src/page-frame/mobile/components/page/index.tsx +11 -0
- package/src/page-frame/mobile/index.scss +3 -17
- package/src/page-frame/mobile/index.tsx +5 -2
- package/src/page-frame/{container/index.scss → mobile/styles/mobile.scss} +25 -7
- package/src/page-frame/mobile/types/index.ts +1 -0
- package/src/page-frame/mobile/types/page.ts +16 -0
- package/src/weather/components/icon/Address.tsx +1 -1
- package/src/weather/components/icon/Weather.tsx +1 -1
- package/src/page-frame/container/PageFrameContainer.tsx +0 -24
- package/src/page-frame/container/index.tsx +0 -4
- package/src/page-frame/container/types.ts +0 -11
- package/src/page-frame/mobile/header/index.ts +0 -4
- package/src/page-frame/mobile/types.ts +0 -6
- package/src/page-frame/navigation/index.tsx +0 -4
- /package/src/page-frame/mobile/{header/page-frame-mobile-header.scss → styles/header.scss} +0 -0
- /package/src/page-frame/{navigation/index.scss → mobile/styles/navigation.scss} +0 -0
package/dist/styles.css
CHANGED
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
/* namespace 충돌을 막기 위해 모든 @use 경로에 고유 alias를 부여한다. */
|
|
51
51
|
|
|
52
52
|
|
|
53
|
-
.page-frame-
|
|
53
|
+
.page-frame-mobile-shell {
|
|
54
54
|
display: grid;
|
|
55
55
|
grid-template-rows: auto 1fr auto;
|
|
56
56
|
width: min(100%, var(--uds-page-frame-max-width));
|
|
@@ -60,22 +60,22 @@
|
|
|
60
60
|
color: inherit;
|
|
61
61
|
}
|
|
62
62
|
|
|
63
|
-
.page-frame-header,
|
|
64
|
-
.page-frame-body,
|
|
65
|
-
.page-frame-footer {
|
|
63
|
+
.page-frame-mobile-shell-header,
|
|
64
|
+
.page-frame-mobile-shell-body,
|
|
65
|
+
.page-frame-mobile-shell-footer {
|
|
66
66
|
width: 100%;
|
|
67
67
|
}
|
|
68
68
|
|
|
69
|
-
.page-frame-header {
|
|
69
|
+
.page-frame-mobile-shell-header {
|
|
70
70
|
padding-top: var(--uds-page-frame-header-padding-top);
|
|
71
71
|
}
|
|
72
72
|
|
|
73
|
-
.page-frame-body {
|
|
73
|
+
.page-frame-mobile-shell-body {
|
|
74
74
|
min-height: 0;
|
|
75
75
|
overflow-y: auto;
|
|
76
76
|
}
|
|
77
77
|
|
|
78
|
-
.page-frame-footer {
|
|
78
|
+
.page-frame-mobile-shell-footer {
|
|
79
79
|
padding-bottom: var(--uds-page-frame-footer-safe-area);
|
|
80
80
|
}
|
|
81
81
|
|
|
@@ -97,6 +97,55 @@
|
|
|
97
97
|
background-color: inherit;
|
|
98
98
|
}
|
|
99
99
|
|
|
100
|
+
.page-frame-mobile-header {
|
|
101
|
+
position: relative;
|
|
102
|
+
display: flex;
|
|
103
|
+
align-items: center;
|
|
104
|
+
justify-content: space-between;
|
|
105
|
+
gap: var(--spacing-padding-2, 8px);
|
|
106
|
+
min-height: 40px;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
.page-frame-mobile-header__left,
|
|
110
|
+
.page-frame-mobile-header__right {
|
|
111
|
+
width: 64px;
|
|
112
|
+
height: 40px;
|
|
113
|
+
display: inline-flex;
|
|
114
|
+
align-items: center;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
.page-frame-mobile-header__back {
|
|
118
|
+
border: none;
|
|
119
|
+
background: none;
|
|
120
|
+
display: inline-flex;
|
|
121
|
+
align-items: center;
|
|
122
|
+
gap: var(--spacing-padding-1, 4px);
|
|
123
|
+
padding: var(--spacing-padding-1, 4px);
|
|
124
|
+
font-size: 14px;
|
|
125
|
+
color: var(--color-label-standard);
|
|
126
|
+
cursor: pointer;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
.page-frame-mobile-header__back-icon {
|
|
130
|
+
font-size: 18px;
|
|
131
|
+
line-height: 1;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
.page-frame-mobile-header__back-placeholder {
|
|
135
|
+
width: 100%;
|
|
136
|
+
height: 100%;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
.page-frame-mobile-header__title {
|
|
140
|
+
position: absolute;
|
|
141
|
+
left: 50%;
|
|
142
|
+
transform: translateX(-50%);
|
|
143
|
+
margin: 0;
|
|
144
|
+
font-size: 16px;
|
|
145
|
+
font-weight: 600;
|
|
146
|
+
color: var(--color-label-standard);
|
|
147
|
+
}
|
|
148
|
+
|
|
100
149
|
.page-frame-navigation {
|
|
101
150
|
width: 100%;
|
|
102
151
|
}
|
package/package.json
CHANGED
package/src/asset-url.ts
ADDED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import clsx from "clsx";
|
|
2
2
|
import type { ReactNode } from "react";
|
|
3
3
|
import { PaginationCarousel } from "@uniai-fe/uds-primitives";
|
|
4
|
-
import {
|
|
4
|
+
import { MobileFrameHeader } from "../../../../page-frame/mobile/components/header";
|
|
5
5
|
|
|
6
6
|
import "./stage-header.scss";
|
|
7
7
|
|
|
@@ -35,7 +35,7 @@ export function AuthStageHeader({
|
|
|
35
35
|
}: StageHeaderProps) {
|
|
36
36
|
return (
|
|
37
37
|
<div className={clsx("auth-stage-header", className)}>
|
|
38
|
-
<
|
|
38
|
+
<MobileFrameHeader
|
|
39
39
|
title={navigationTitle}
|
|
40
40
|
backIcon={backIcon}
|
|
41
41
|
onBack={onBack}
|
package/src/index.scss
CHANGED
|
@@ -3,9 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
/* 템플릿 레벨 스타일을 통합해 서비스 앱이 단일 엔트리만 import하도록 구성한다. */
|
|
5
5
|
/* namespace 충돌을 막기 위해 모든 @use 경로에 고유 alias를 부여한다. */
|
|
6
|
-
@use "./page-frame/container/index.scss" as pageFrameContainer;
|
|
7
6
|
@use "./page-frame/mobile/index.scss" as pageFrameMobile;
|
|
8
|
-
@use "./page-frame/navigation/index.scss" as pageFrameNavigation;
|
|
9
7
|
@use "./modal/index.scss" as modalStyles;
|
|
10
8
|
|
|
11
9
|
@use "./auth/common/container/index.scss" as authCommonContainer;
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import Image from "next/image";
|
|
4
4
|
import Link from "next/link";
|
|
5
|
-
import assetsUrl from "
|
|
5
|
+
import assetsUrl from "../../../../../asset-url";
|
|
6
6
|
import PageHeaderUtilityItem from "./Item";
|
|
7
7
|
import PageHeaderUtilityButton from "./Button";
|
|
8
8
|
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<path d="M10 4H6C4.89543 4 4 4.89543 4 6V18C4 19.1046 4.89543 20 6 20H10" stroke="#313235" stroke-width="1.6" stroke-linecap="round"/>
|
|
3
|
+
<path d="M14.9497 7L19.8995 11.9497L14.9497 16.8995" stroke="#313235" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/>
|
|
4
|
+
<path d="M9 12H19" stroke="#313235" stroke-width="1.6" stroke-linecap="round"/>
|
|
5
|
+
</svg>
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<path d="M12.9999 4C13.5522 4 13.9999 4.44772 13.9999 5V5.63462C13.9999 6.05844 14.2711 6.42889 14.651 6.61671C14.8879 6.73384 15.116 6.86621 15.3339 7.01246C15.6856 7.24844 16.1416 7.29814 16.5086 7.08669L17.0624 6.76758C17.5406 6.4917 18.1525 6.65561 18.4286 7.13379L19.4286 8.86621C19.7045 9.34446 19.5406 9.95634 19.0624 10.2324L18.5102 10.5504C18.1429 10.7619 17.9575 11.1816 17.9864 11.6045C17.9953 11.7352 17.9999 11.8671 17.9999 12C17.9999 12.1327 17.9952 12.2643 17.9863 12.3948C17.9574 12.817 18.1422 13.2361 18.5087 13.4478L19.0624 13.7676C19.5406 14.0437 19.7045 14.6555 19.4286 15.1338L18.4286 16.8662C18.1525 17.3444 17.5407 17.5083 17.0624 17.2324L16.51 16.9134C16.1429 16.7014 15.6863 16.751 15.3341 16.987C15.1161 17.1332 14.888 17.2654 14.651 17.3825C14.271 17.5701 13.9999 17.9406 13.9999 18.3644V19C13.9999 19.5523 13.5522 20 12.9999 20H10.9999C10.4477 19.9999 9.9999 19.5522 9.9999 19V18.3633C9.9999 17.9396 9.72883 17.5691 9.34871 17.3818C9.11159 17.265 8.88333 17.133 8.66518 16.987C8.31266 16.7512 7.85583 16.7016 7.48861 16.9138L6.9374 17.2324C6.45928 17.5081 5.8483 17.3441 5.57217 16.8662L4.57217 15.1338C4.29606 14.6555 4.45923 14.0438 4.9374 13.7676L5.4905 13.4479C5.8568 13.2361 6.04167 12.8171 6.01324 12.395C6.00445 12.2644 5.9999 12.1327 5.9999 12C5.9999 11.867 6.00442 11.7351 6.01319 11.6043C6.04153 11.1815 5.8561 10.7619 5.48903 10.5503L4.9374 10.2324C4.45925 9.95623 4.29606 9.34444 4.57217 8.86621L5.57217 7.13379C5.8483 6.65589 6.45928 6.49189 6.9374 6.76758L7.49003 7.08628C7.85707 7.29795 8.31333 7.24825 8.66538 7.01247C8.88347 6.86641 9.11168 6.7343 9.34873 6.61736C9.72879 6.42989 9.9999 6.05945 9.9999 5.63567V5C9.9999 4.44776 10.4477 4.00008 10.9999 4H12.9999Z" stroke="#313235" stroke-width="1.6"/>
|
|
3
|
+
<circle cx="12" cy="12" r="3" stroke="#313235" stroke-width="1.6"/>
|
|
4
|
+
</svg>
|
package/src/page-frame/index.tsx
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
import { DesktopFrame } from "./desktop";
|
|
2
|
+
import { MobileFrame } from "./mobile";
|
|
3
|
+
|
|
2
4
|
export * from "./mobile";
|
|
3
|
-
export * from "./navigation";
|
|
4
5
|
export * from "./types";
|
|
5
6
|
export * from "./desktop";
|
|
7
|
+
|
|
8
|
+
export const Frame = Object.assign({}, DesktopFrame, {
|
|
9
|
+
Desktop: DesktopFrame,
|
|
10
|
+
Mobile: MobileFrame,
|
|
11
|
+
});
|
package/src/page-frame/mobile/{header/PageFrameMobileHeader.tsx → components/header/Header.tsx}
RENAMED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import clsx from "clsx";
|
|
2
2
|
import type { ReactNode } from "react";
|
|
3
3
|
|
|
4
|
-
import
|
|
5
|
-
import "
|
|
4
|
+
import IconBackward from "../../img/chevron-backward.svg";
|
|
5
|
+
import "../../styles/header.scss";
|
|
6
6
|
|
|
7
|
-
export interface
|
|
7
|
+
export interface MobileFrameHeaderProps {
|
|
8
8
|
className?: string;
|
|
9
9
|
title: ReactNode;
|
|
10
10
|
backIcon?: ReactNode;
|
|
@@ -17,14 +17,14 @@ export interface PageFrameMobileHeaderProps {
|
|
|
17
17
|
* 모바일 서비스 공통 page header; 뒤로가기 버튼 + 타이틀을 노출한다.
|
|
18
18
|
* @component
|
|
19
19
|
*/
|
|
20
|
-
export function
|
|
20
|
+
export function MobileFrameHeader({
|
|
21
21
|
className,
|
|
22
22
|
title,
|
|
23
23
|
backIcon,
|
|
24
24
|
onBack,
|
|
25
25
|
leftSlot,
|
|
26
26
|
rightSlot,
|
|
27
|
-
}:
|
|
27
|
+
}: MobileFrameHeaderProps) {
|
|
28
28
|
return (
|
|
29
29
|
<header className={clsx("page-frame-mobile-header", className)}>
|
|
30
30
|
<div className="page-frame-mobile-header__left">
|
|
@@ -38,7 +38,7 @@ export function PageFrameMobileHeader({
|
|
|
38
38
|
>
|
|
39
39
|
<span className="page-frame-mobile-header__back-icon">
|
|
40
40
|
{backIcon ?? (
|
|
41
|
-
<
|
|
41
|
+
<IconBackward width={24} height={24} alt="뒤로가기" />
|
|
42
42
|
)}
|
|
43
43
|
</span>
|
|
44
44
|
</button>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import Page from "./page";
|
|
2
|
+
import Header from "./header";
|
|
3
|
+
import Navigation from "./navigation";
|
|
4
|
+
|
|
5
|
+
const Frame = {
|
|
6
|
+
Page,
|
|
7
|
+
Header,
|
|
8
|
+
Navigation,
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
export default Frame;
|
|
12
|
+
export * from "./page";
|
|
13
|
+
export * from "./header";
|
|
14
|
+
export * from "./navigation";
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
type BottomNavigationProps,
|
|
5
5
|
} from "@uniai-fe/uds-primitives";
|
|
6
6
|
|
|
7
|
-
export type
|
|
7
|
+
export type MobileFrameNavigationProps = BottomNavigationProps;
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
10
|
* Page Frame 전용 navigation 래퍼.
|
|
@@ -12,10 +12,10 @@ export type PageFrameNavigationProps = BottomNavigationProps;
|
|
|
12
12
|
* @component
|
|
13
13
|
* @param {PageFrameNavigationProps} props
|
|
14
14
|
*/
|
|
15
|
-
export function
|
|
15
|
+
export function MobileFrameNavigation({
|
|
16
16
|
className,
|
|
17
17
|
...rest
|
|
18
|
-
}:
|
|
18
|
+
}: MobileFrameNavigationProps) {
|
|
19
19
|
return (
|
|
20
20
|
<BottomNavigation
|
|
21
21
|
{...rest}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import "../../styles/navigation.scss";
|
|
2
|
+
import { MobileFrameNavigation } from "./Navigation";
|
|
3
|
+
|
|
4
|
+
const Navigation = MobileFrameNavigation;
|
|
5
|
+
|
|
6
|
+
export default Navigation;
|
|
7
|
+
export { MobileFrameNavigation };
|
|
8
|
+
export type { MobileFrameNavigationProps } from "./Navigation";
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import clsx from "clsx";
|
|
2
|
+
import type { MobileFrameContainerProps } from "../../types";
|
|
3
|
+
|
|
4
|
+
const SHELL_CLASS = "page-frame-mobile-shell";
|
|
5
|
+
const SHELL_HEADER_CLASS = `${SHELL_CLASS}-header`;
|
|
6
|
+
const SHELL_BODY_CLASS = `${SHELL_CLASS}-body`;
|
|
7
|
+
const SHELL_FOOTER_CLASS = `${SHELL_CLASS}-footer`;
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* 모바일 전용 페이지 컨테이너; header/body/footer 영역을 순서대로 배치한다.
|
|
11
|
+
* @component
|
|
12
|
+
*/
|
|
13
|
+
export function MobileFrameContainer({
|
|
14
|
+
className,
|
|
15
|
+
header,
|
|
16
|
+
headerClassName,
|
|
17
|
+
bodyClassName,
|
|
18
|
+
footer,
|
|
19
|
+
footerClassName,
|
|
20
|
+
children,
|
|
21
|
+
}: MobileFrameContainerProps) {
|
|
22
|
+
return (
|
|
23
|
+
<div className={clsx(SHELL_CLASS, className)}>
|
|
24
|
+
<div className={clsx(SHELL_HEADER_CLASS, headerClassName)}>{header}</div>
|
|
25
|
+
<div className={clsx(SHELL_BODY_CLASS, bodyClassName)}>{children}</div>
|
|
26
|
+
<div className={clsx(SHELL_FOOTER_CLASS, footerClassName)}>{footer}</div>
|
|
27
|
+
</div>
|
|
28
|
+
);
|
|
29
|
+
}
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
|
|
3
3
|
import clsx from "clsx";
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import type {
|
|
4
|
+
import { MobileFrameContainer } from "./Container";
|
|
5
|
+
import { MobileFrameNavigation } from "../navigation";
|
|
6
|
+
import type { MobileFrameProps } from "../../types";
|
|
7
7
|
import React, { useCallback } from "react";
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
10
|
* 모바일 전용 Page Frame 래퍼; 공통 컨테이너 위에 모바일 클래스/스타일을 덧입힌다.
|
|
11
11
|
* @component
|
|
12
|
-
* @param {
|
|
12
|
+
* @param {MobileFrameProps} props
|
|
13
13
|
*/
|
|
14
|
-
export function
|
|
14
|
+
export function MobileFrame({
|
|
15
15
|
className,
|
|
16
16
|
header,
|
|
17
17
|
headerClassName,
|
|
@@ -19,17 +19,18 @@ export function PageFrameMobile({
|
|
|
19
19
|
footer,
|
|
20
20
|
footerClassName,
|
|
21
21
|
navigationProps,
|
|
22
|
+
children,
|
|
22
23
|
...rest
|
|
23
|
-
}:
|
|
24
|
+
}: MobileFrameProps) {
|
|
24
25
|
const Footer = useCallback(
|
|
25
26
|
(): React.ReactNode =>
|
|
26
27
|
footer ??
|
|
27
|
-
(navigationProps ? <
|
|
28
|
+
(navigationProps ? <MobileFrameNavigation {...navigationProps} /> : null),
|
|
28
29
|
[footer, navigationProps],
|
|
29
30
|
);
|
|
30
31
|
|
|
31
32
|
return (
|
|
32
|
-
<
|
|
33
|
+
<MobileFrameContainer
|
|
33
34
|
{...rest}
|
|
34
35
|
className={clsx("page-frame-mobile", className)}
|
|
35
36
|
header={header}
|
|
@@ -37,6 +38,8 @@ export function PageFrameMobile({
|
|
|
37
38
|
bodyClassName={clsx("page-frame-mobile-body", bodyClassName)}
|
|
38
39
|
footer={<Footer />}
|
|
39
40
|
footerClassName={clsx("page-frame-mobile-footer", footerClassName)}
|
|
40
|
-
|
|
41
|
+
>
|
|
42
|
+
{children}
|
|
43
|
+
</MobileFrameContainer>
|
|
41
44
|
);
|
|
42
45
|
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { MobileFrameContainer } from "./Container";
|
|
2
|
+
import { MobileFrame } from "./Frame";
|
|
3
|
+
|
|
4
|
+
const Page = {
|
|
5
|
+
Frame: MobileFrame,
|
|
6
|
+
Container: MobileFrameContainer,
|
|
7
|
+
Shell: MobileFrameContainer,
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
export default Page;
|
|
11
|
+
export { MobileFrameContainer, MobileFrame };
|
|
@@ -1,17 +1,3 @@
|
|
|
1
|
-
.
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
min-height: var(--uds-page-frame-height, var(--frame-device-height, 812px));
|
|
5
|
-
max-height: 100dvh;
|
|
6
|
-
background-color: var(--color-common-100, #ffffff);
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
.page-frame-mobile-header,
|
|
10
|
-
.page-frame-mobile-body,
|
|
11
|
-
.page-frame-mobile-footer {
|
|
12
|
-
width: 100%;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
.page-frame-mobile-body {
|
|
16
|
-
background-color: inherit;
|
|
17
|
-
}
|
|
1
|
+
@use "./styles/mobile.scss";
|
|
2
|
+
@use "./styles/header.scss";
|
|
3
|
+
@use "./styles/navigation.scss";
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import "./index.scss";
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
import { MobileFrame } from "./components/page/Frame";
|
|
4
|
+
|
|
5
|
+
export type { MobileFrameProps } from "./types";
|
|
6
|
+
export * from "./components";
|
|
7
|
+
export { MobileFrame };
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
); // PC에선 지정 폭으로 중앙 정렬하고, 모바일에선 100%를 유지
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
-
.page-frame-
|
|
19
|
+
.page-frame-mobile-shell {
|
|
20
20
|
display: grid;
|
|
21
21
|
grid-template-rows: auto 1fr auto;
|
|
22
22
|
width: min(100%, var(--uds-page-frame-max-width));
|
|
@@ -28,21 +28,39 @@
|
|
|
28
28
|
color: inherit;
|
|
29
29
|
}
|
|
30
30
|
|
|
31
|
-
.page-frame-header,
|
|
32
|
-
.page-frame-body,
|
|
33
|
-
.page-frame-footer {
|
|
31
|
+
.page-frame-mobile-shell-header,
|
|
32
|
+
.page-frame-mobile-shell-body,
|
|
33
|
+
.page-frame-mobile-shell-footer {
|
|
34
34
|
width: 100%;
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
-
.page-frame-header {
|
|
37
|
+
.page-frame-mobile-shell-header {
|
|
38
38
|
padding-top: var(--uds-page-frame-header-padding-top);
|
|
39
39
|
}
|
|
40
40
|
|
|
41
|
-
.page-frame-body {
|
|
41
|
+
.page-frame-mobile-shell-body {
|
|
42
42
|
min-height: 0;
|
|
43
43
|
overflow-y: auto;
|
|
44
44
|
}
|
|
45
45
|
|
|
46
|
-
.page-frame-footer {
|
|
46
|
+
.page-frame-mobile-shell-footer {
|
|
47
47
|
padding-bottom: var(--uds-page-frame-footer-safe-area);
|
|
48
48
|
}
|
|
49
|
+
|
|
50
|
+
.page-frame-mobile {
|
|
51
|
+
width: 100%;
|
|
52
|
+
height: 100%;
|
|
53
|
+
min-height: var(--uds-page-frame-height, var(--frame-device-height, 812px));
|
|
54
|
+
max-height: 100dvh;
|
|
55
|
+
background-color: var(--color-common-100, #ffffff);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.page-frame-mobile-header,
|
|
59
|
+
.page-frame-mobile-body,
|
|
60
|
+
.page-frame-mobile-footer {
|
|
61
|
+
width: 100%;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
.page-frame-mobile-body {
|
|
65
|
+
background-color: inherit;
|
|
66
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./page";
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
import type { MobileFrameNavigationProps } from "../components/navigation";
|
|
3
|
+
|
|
4
|
+
export type MobileFrameContainerProps = {
|
|
5
|
+
className?: string;
|
|
6
|
+
header?: ReactNode;
|
|
7
|
+
headerClassName?: string;
|
|
8
|
+
bodyClassName?: string;
|
|
9
|
+
footer?: ReactNode;
|
|
10
|
+
footerClassName?: string;
|
|
11
|
+
children: ReactNode;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export interface MobileFrameProps extends MobileFrameContainerProps {
|
|
15
|
+
navigationProps?: MobileFrameNavigationProps;
|
|
16
|
+
}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import clsx from "clsx";
|
|
2
|
-
import type { PageFrameContainerProps } from "./types";
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* 페이지 공통 컨테이너; header/body/footer 영역을 순서대로 배치한다.
|
|
6
|
-
* @component
|
|
7
|
-
*/
|
|
8
|
-
export function PageFrameContainer({
|
|
9
|
-
className,
|
|
10
|
-
header,
|
|
11
|
-
headerClassName,
|
|
12
|
-
bodyClassName,
|
|
13
|
-
footer,
|
|
14
|
-
footerClassName,
|
|
15
|
-
children,
|
|
16
|
-
}: PageFrameContainerProps) {
|
|
17
|
-
return (
|
|
18
|
-
<div className={clsx("page-frame-container", className)}>
|
|
19
|
-
<div className={clsx("page-frame-header", headerClassName)}>{header}</div>
|
|
20
|
-
<div className={clsx("page-frame-body", bodyClassName)}>{children}</div>
|
|
21
|
-
<div className={clsx("page-frame-footer", footerClassName)}>{footer}</div>
|
|
22
|
-
</div>
|
|
23
|
-
);
|
|
24
|
-
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import type { ReactNode } from "react";
|
|
2
|
-
|
|
3
|
-
export type PageFrameContainerProps = {
|
|
4
|
-
className?: string;
|
|
5
|
-
header?: ReactNode;
|
|
6
|
-
headerClassName?: string;
|
|
7
|
-
bodyClassName?: string;
|
|
8
|
-
footer?: ReactNode;
|
|
9
|
-
footerClassName?: string;
|
|
10
|
-
children: ReactNode;
|
|
11
|
-
};
|
|
File without changes
|
|
File without changes
|