@uniai-fe/uds-templates 0.1.36 → 0.1.38

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 CHANGED
@@ -1,5 +1,26 @@
1
1
  @charset "UTF-8";
2
2
  :root {
3
+ --uds-page-frame-background: var(--color-common-100);
4
+ --uds-page-header-height: 7.2rem;
5
+ --uds-page-header-border: var(--color-border-standard-cool-gray);
6
+ --uds-page-header-padding-horizontal: var(--spacing-padding-9, 2.8rem);
7
+ --uds-page-header-padding-vertical: var(--spacing-padding-5, 1.2rem);
8
+ --uds-page-header-background: var(--uds-page-frame-background);
9
+ --uds-page-header-item-gap: var(--spacing-padding-5, 1.2rem);
10
+ --uds-page-nav-width: 7.2rem;
11
+ --uds-page-nav-border: var(--color-border-standard-cool-gray);
12
+ --uds-page-nav-background: var(--uds-page-frame-background);
13
+ --uds-page-nav-logo-height: var(--uds-page-header-height, 7.2rem);
14
+ --uds-page-nav-list-padding-horizontal: 0rem;
15
+ --uds-page-nav-list-padding-vertical: var(--spacing-padding-9, 2.4rem);
16
+ --uds-page-nav-item-height: var(--theme-size-meduum-2, 4.8rem);
17
+ --uds-page-nav-item-gap: var(--spacing-gap-6, 1.6rem);
18
+ --uds-page-nav-item-color-default: var(--color-label-standard);
19
+ --uds-page-nav-item-color-active: var(--color-primary-default);
20
+ --uds-page-nav-icon-size: var(--theme-size-small-2, 2.4rem);
21
+ --uds-page-body-background: var(--uds-page-frame-background);
22
+ --uds-page-body-padding-horizontal: var(--spacing-padding-9, 2.8rem);
23
+ --uds-page-body-padding-vertical: var(--spacing-padding-9, 2.8rem);
3
24
  --frame-device-height: 812px;
4
25
  --frame-device-width: 480px;
5
26
  --frame-safe-area-top: env(safe-area-inset-top, 0px);
@@ -79,6 +100,256 @@
79
100
  /* namespace 충돌을 막기 위해 모든 @use 경로에 고유 alias를 부여한다. */
80
101
 
81
102
 
103
+ .page-frame-container {
104
+ width: 100%;
105
+ min-height: 100vh;
106
+ background-color: var(--uds-page-frame-background);
107
+ }
108
+
109
+ .page-frame-service-frame {
110
+ width: 100%;
111
+ min-height: 100vh;
112
+ display: flex;
113
+ }
114
+
115
+ .page-frame-service-main {
116
+ width: calc(100% - var(--uds-page-nav-width));
117
+ min-height: 100vh;
118
+ display: flex;
119
+ flex-direction: column;
120
+ }
121
+
122
+ .page-frame-service-main-wrapper {
123
+ width: 100%;
124
+ height: calc(100% - var(--uds-page-header-height));
125
+ padding: var(--uds-page-body-padding-vertical) var(--uds-page-body-padding-horizontal);
126
+ background-color: var(--uds-page-body-background);
127
+ position: relative;
128
+ z-index: 0;
129
+ }
130
+ .page-frame-service-main-wrapper.no-padding {
131
+ --uds-page-body-background: var(--color-bg-standard-neutral);
132
+ padding: 0px;
133
+ }
134
+
135
+ .page-frame-header {
136
+ width: 100%;
137
+ height: var(--uds-page-header-height);
138
+ padding: var(--uds-page-header-padding-vertical) var(--uds-page-header-padding-horizontal);
139
+ background: var(--uds-page-header-background);
140
+ border-bottom: 1px solid var(--uds-page-header-border);
141
+ display: flex;
142
+ align-items: center;
143
+ justify-content: space-between;
144
+ gap: var(--uds-page-header-item-gap);
145
+ position: relative;
146
+ z-index: 500;
147
+ }
148
+
149
+ .page-frame-header-section {
150
+ display: flex;
151
+ align-items: center;
152
+ gap: var(--uds-page-header-item-gap);
153
+ }
154
+
155
+ .page-header-util-container {
156
+ display: flex;
157
+ align-items: center;
158
+ margin-left: auto;
159
+ gap: var(--uds-page-nav-item-gap, 0);
160
+ padding: 0;
161
+ margin-block: 0;
162
+ list-style: none;
163
+ }
164
+
165
+ .page-header-util-item {
166
+ display: flex;
167
+ align-items: center;
168
+ list-style: none;
169
+ }
170
+
171
+ .page-header-util-button {
172
+ padding: 0px;
173
+ }
174
+
175
+ .page-header-setting-button {
176
+ font-size: 0;
177
+ }
178
+ .page-header-setting-button figure {
179
+ width: 2.4rem;
180
+ height: 2.4rem;
181
+ }
182
+
183
+ .page-header-logout-button {
184
+ font-size: 0;
185
+ }
186
+ .page-header-logout-button figure {
187
+ width: 2.4rem;
188
+ height: 2.4rem;
189
+ }
190
+
191
+ .page-frame-nav {
192
+ width: var(--uds-page-nav-width);
193
+ border-right: 1px solid var(--uds-page-nav-border);
194
+ background-color: var(--uds-page-nav-background);
195
+ position: relative;
196
+ z-index: 500;
197
+ }
198
+
199
+ .page-frame-nav-logo {
200
+ width: 100%;
201
+ height: var(--uds-page-nav-logo-height);
202
+ display: flex;
203
+ align-items: center;
204
+ justify-content: center;
205
+ }
206
+ .page-frame-nav-logo a {
207
+ display: flex;
208
+ align-items: center;
209
+ justify-content: center;
210
+ font-size: 0;
211
+ }
212
+
213
+ .page-frame-nav-list {
214
+ width: 100%;
215
+ padding: var(--uds-page-nav-list-padding-vertical) var(--uds-page-nav-list-padding-horizontal);
216
+ }
217
+
218
+ .page-frame-nav-item {
219
+ width: 100%;
220
+ margin-bottom: var(--uds-page-nav-item-gap);
221
+ position: relative;
222
+ }
223
+
224
+ .page-frame-nav-category {
225
+ width: 100%;
226
+ height: var(--uds-page-nav-item-height);
227
+ text-decoration: none;
228
+ color: var(--uds-page-nav-item-color-default);
229
+ transition: color 0.2s, fill 0.2s;
230
+ display: flex;
231
+ align-items: center;
232
+ justify-content: center;
233
+ flex-direction: column;
234
+ gap: 0.2rem;
235
+ }
236
+ .page-frame-nav-category.icon-only {
237
+ width: auto;
238
+ padding: 0.4rem;
239
+ }
240
+
241
+ .page-frame-nav-category-icon {
242
+ width: var(--uds-page-nav-icon-size);
243
+ height: var(--uds-page-nav-icon-size);
244
+ display: flex;
245
+ align-items: center;
246
+ justify-content: center;
247
+ }
248
+ .page-frame-nav-category-icon svg,
249
+ .page-frame-nav-category-icon img {
250
+ width: 100%;
251
+ height: 100%;
252
+ object-fit: contain;
253
+ }
254
+ .page-frame-nav-category-icon svg path {
255
+ fill: var(--uds-page-nav-item-color-default);
256
+ }
257
+
258
+ .page-frame-nav-category-label {
259
+ font-size: 1.2rem;
260
+ line-height: 1.4rem;
261
+ color: inherit;
262
+ }
263
+
264
+ .page-frame-nav-item.is-selected .page-frame-nav-category,
265
+ .page-frame-nav-item:hover .page-frame-nav-category {
266
+ color: var(--uds-page-nav-item-color-active);
267
+ }
268
+
269
+ .page-frame-nav-item.is-selected .page-frame-nav-category-icon svg path,
270
+ .page-frame-nav-item:hover .page-frame-nav-category-icon svg path {
271
+ fill: var(--uds-page-nav-item-color-active);
272
+ }
273
+
274
+ .page-frame-nav-depth {
275
+ display: none;
276
+ width: fit-content;
277
+ min-height: 100%;
278
+ padding: 1.1rem 1.6rem;
279
+ background: var(--uds-page-nav-bg-active);
280
+ position: absolute;
281
+ top: 0;
282
+ left: calc(100% - 0.8rem);
283
+ z-index: 1000;
284
+ flex-direction: column;
285
+ justify-content: center;
286
+ border-radius: 1.2rem;
287
+ box-shadow: 0 0.6rem 1.2rem rgba(0, 0, 0, 0.15);
288
+ }
289
+
290
+ .page-frame-nav-depth-item {
291
+ display: flex;
292
+ align-items: center;
293
+ width: 100%;
294
+ min-height: 2.4rem;
295
+ text-decoration: none;
296
+ }
297
+ .page-frame-nav-depth-item span {
298
+ font-size: 1.2rem;
299
+ color: var(--uds-page-nav-depth-color, var(--uds-page-nav-item-color-active));
300
+ white-space: nowrap;
301
+ }
302
+
303
+ .page-frame-nav-item:hover .page-frame-nav-depth {
304
+ display: flex;
305
+ }
306
+
307
+ .popup-container {
308
+ width: 100%;
309
+ height: 100%;
310
+ background: var(--color-cool-gray-99);
311
+ }
312
+
313
+ .popup-frame-container {
314
+ width: 100%;
315
+ height: 100%;
316
+ min-width: var(--popup-frame-min-width, 1280px);
317
+ }
318
+
319
+ .popup-frame-header {
320
+ width: 100%;
321
+ position: relative;
322
+ z-index: 500;
323
+ }
324
+
325
+ .popup-frame-header-title-container {
326
+ width: 100%;
327
+ height: var(--popup-title-height);
328
+ border-bottom: 1px solid var(--color-cool-gray-90);
329
+ padding: 0 var(--spacing-padding-9);
330
+ background: var(--color-cool-gray-99);
331
+ display: flex;
332
+ align-items: center;
333
+ }
334
+
335
+ .popup-frame-header-title {
336
+ font-size: 2rem;
337
+ color: var(--color-cool-gray-10);
338
+ font-weight: 600;
339
+ }
340
+
341
+ .popup-frame-header-util {
342
+ margin-left: auto;
343
+ }
344
+
345
+ .popup-frame-body {
346
+ width: 100%;
347
+ height: 100%;
348
+ padding: var(--spacing-padding-9);
349
+ }
350
+
351
+
352
+
82
353
  .page-frame-mobile-shell {
83
354
  display: grid;
84
355
  grid-template-rows: auto 1fr auto;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@uniai-fe/uds-templates",
3
- "version": "0.1.36",
3
+ "version": "0.1.38",
4
4
  "description": "UNIAI Design System; UI Templates Package",
5
5
  "type": "module",
6
6
  "private": false,
@@ -1,3 +1,5 @@
1
+ "use client";
2
+
1
3
  import { useQuery, type UseQueryResult } from "@tanstack/react-query";
2
4
  import type {
3
5
  API_Req_CctvRtcToken,
@@ -1,3 +1,5 @@
1
+ "use client";
2
+
1
3
  import clsx from "clsx";
2
4
  import CCTVPaginationListItem from "./Item";
3
5
  import type { CctvCompanyCameraList } from "../../../types";
@@ -5,5 +5,6 @@ export * from "./data";
5
5
  export * from "./components";
6
6
  export * from "./hooks";
7
7
  export * from "./jotai";
8
+ export * from "./utils";
8
9
 
9
10
  export type * from "./types";
@@ -0,0 +1,3 @@
1
+ export * from "./data";
2
+ export * from "./select";
3
+ export * from "./video-state";
package/src/index.scss CHANGED
@@ -3,6 +3,7 @@
3
3
 
4
4
  /* 템플릿 레벨 스타일을 통합해 서비스 앱이 단일 엔트리만 import하도록 구성한다. */
5
5
  /* namespace 충돌을 막기 위해 모든 @use 경로에 고유 alias를 부여한다. */
6
+ @use "./page-frame/desktop/index.scss" as pageFrameDesktop;
6
7
  @use "./page-frame/mobile/index.scss" as pageFrameMobile;
7
8
  @use "./modal/index.scss" as modalStyles;
8
9
 
@@ -12,8 +12,8 @@ const Header = {
12
12
  Item: PageHeaderUtilityItem,
13
13
  Button: PageHeaderUtilityButton,
14
14
  },
15
- Setting: PageHeaderSettingButton,
16
- Logout: PageHeaderLogoutButton,
15
+ Setting: { Button: PageHeaderSettingButton },
16
+ Logout: { Button: PageHeaderLogoutButton },
17
17
  };
18
18
 
19
19
  export default Header;
@@ -5,21 +5,33 @@ import Link from "next/link";
5
5
  import assetsUrl from "../../../../../asset-url";
6
6
  import PageHeaderUtilityItem from "./Item";
7
7
  import PageHeaderUtilityButton from "./Button";
8
+ import clsx from "clsx";
8
9
 
9
10
  export default function PageHeaderLogoutButton({
11
+ className,
10
12
  path = "/logout",
11
13
  }: {
14
+ className?: string;
12
15
  path?: string;
13
16
  }) {
14
17
  return (
15
- <PageHeaderUtilityItem>
16
- <PageHeaderUtilityButton href={path} as={Link}>
17
- <Image
18
- src={`${assetsUrl}/img/page-header/logout-v2.svg`}
19
- alt="로그아웃"
20
- width={24}
21
- height={24}
22
- />
18
+ <PageHeaderUtilityItem
19
+ className={clsx("page-header-util-logout", className)}
20
+ >
21
+ <PageHeaderUtilityButton
22
+ href={path}
23
+ as={Link}
24
+ className="page-header-logout-button"
25
+ >
26
+ <figure>
27
+ <Image
28
+ src={`${assetsUrl}/img/page-header/logout-v2.svg`}
29
+ alt="로그아웃"
30
+ // width={24}
31
+ // height={24}
32
+ fill
33
+ />
34
+ </figure>
23
35
  </PageHeaderUtilityButton>
24
36
  </PageHeaderUtilityItem>
25
37
  );
@@ -4,6 +4,7 @@ import Image from "next/image";
4
4
  import assetUrl from "../../../../../../asset-url";
5
5
  import PageHeaderUtilityItem from "../Item";
6
6
  import PageHeaderUtilityButton from "../Button";
7
+ import clsx from "clsx";
7
8
 
8
9
  /**
9
10
  * 페이지 header; 환경설정 버튼 컴포넌트
@@ -25,14 +26,20 @@ export default function PageHeaderSettingButton({
25
26
  onOpen: () => void;
26
27
  }) {
27
28
  return (
28
- <PageHeaderUtilityItem>
29
- <PageHeaderUtilityButton className={className} onClick={onOpen}>
29
+ <PageHeaderUtilityItem
30
+ className={clsx("page-header-util-setting", className)}
31
+ >
32
+ <PageHeaderUtilityButton
33
+ className="page-header-setting-button"
34
+ onClick={onOpen}
35
+ >
30
36
  <figure>
31
37
  <Image
32
38
  src={`${assetUrl}/img/page-header/setting-v2.svg`}
33
39
  alt="설정"
34
- width={24}
35
- height={24}
40
+ // width={24}
41
+ // height={24}
42
+ fill
36
43
  />
37
44
  </figure>
38
45
  </PageHeaderUtilityButton>
@@ -27,7 +27,7 @@
27
27
  padding: var(--uds-page-body-padding-vertical)
28
28
  var(--uds-page-body-padding-horizontal);
29
29
  background-color: var(--uds-page-body-background);
30
- overflow-y: auto;
30
+ // overflow-y: auto;
31
31
 
32
32
  position: relative;
33
33
  z-index: 0;
@@ -44,6 +44,18 @@
44
44
  padding: 0px;
45
45
  }
46
46
 
47
- .page-header-util-logout {
47
+ .page-header-setting-button {
48
48
  font-size: 0;
49
+ figure {
50
+ width: 2.4rem;
51
+ height: 2.4rem;
52
+ }
53
+ }
54
+
55
+ .page-header-logout-button {
56
+ font-size: 0;
57
+ figure {
58
+ width: 2.4rem;
59
+ height: 2.4rem;
60
+ }
49
61
  }
@@ -1,7 +1,7 @@
1
1
  .popup-container {
2
2
  width: 100%;
3
3
  height: 100%;
4
- overflow: hidden;
4
+ // overflow: hidden;
5
5
  background: var(--color-cool-gray-99);
6
6
  }
7
7
 
@@ -9,7 +9,7 @@
9
9
  width: 100%;
10
10
  height: 100%;
11
11
  min-width: var(--popup-frame-min-width, 1280px);
12
- overflow: hidden;
12
+ // overflow: hidden;
13
13
  }
14
14
 
15
15
  .popup-frame-header {
@@ -1,18 +0,0 @@
1
- import clsx from "clsx";
2
-
3
- /**
4
- * Viewer Placeholder
5
- * @desc
6
- * - 데이터가 없거나 로딩 중일 때 사용자에게 상황을 전달한다.
7
- */
8
- export default function CCTVViewerDesktopPlaceholder({
9
- className,
10
- message,
11
- }: {
12
- className?: string;
13
- message: string;
14
- }) {
15
- return (
16
- <div className={clsx("cctv-viewer-placeholder", className)}>{message}</div>
17
- );
18
- }