@uniai-fe/uds-templates 0.11.4 → 0.11.6

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/README.md CHANGED
@@ -1,194 +1,22 @@
1
- # @uniai-fe/uds-templates
1
+ # `@uniai-fe/uds-templates`
2
2
 
3
- `@uniai-fe/uds-foundation` 토큰과 `@uniai-fe/uds-primitives` 기초 컴포넌트를 조합해,
4
- 서비스 앱에서 자주 반복되는 **화면/플로우 템플릿**을 제공하는 패키지입니다.
3
+ Primitives를 조합한 반복 화면 구조와 UI flow를 제공한다. 공통 책임과 convention은
4
+ [`../DESIGN-SYSTEM-GUIDE.md`](../DESIGN-SYSTEM-GUIDE.md)를 따른다.
5
5
 
6
- Next.js 서비스에서 primitives와 동일한 방식으로 **Raw TypeScript** 형태로 소비되며,
7
- `pnpm transpilePackages` 설정을 통해 빌드 파이프라인에 포함됩니다.
6
+ API 호출, 비즈니스 판단, routing, i18n, 인증·권한은 Service가 소유한다.
8
7
 
9
- ## Peer Dependencies
8
+ ## 설치
10
9
 
11
- - `@uniai-fe/uds-foundation@^0.0.1` (CSS 토큰 + reset)
12
- - `@uniai-fe/uds-primitives@^0.0.2` (템플릿 내부 UI 컴포넌트)
13
- - `react` `>= 19`, `react-dom` `>= 19`
14
- - Storybook/로컬 개발과 서비스 앱 모두 style load 순서를 명시해야 합니다. 자세한 기준은 아래 "스타일 전역 주입"을 따릅니다.
15
-
16
- > 템플릿은 primitives 위에서 동작하므로, `@uniai-fe/uds-primitives`가 설치되어 있지 않으면 빌드 타임에 peer dependency 경고가 발생합니다.
17
-
18
- ## 특징
19
-
20
- - 화면 단위 템플릿:
21
- - 로그인/회원가입/아이디·비밀번호 찾기 등 `/auth/**`
22
- - 로그인 이후 화면을 위한 모바일 페이지 프레임 `/page-frame/mobile`(PC는 추후 `/page-frame/pc`)
23
- - Raw TS 배포:
24
- - `package.json` root export가 `src/index.tsx`를 가리키며, 번들 없이 root namespace에서 즉시 import 가능한 형태로 제공합니다.
25
- - 디자인시스템 일관성:
26
- - 스타일은 foundation style entry가 제공하는 CSS 변수(토큰)를 통해만 정의됩니다.
27
- - UI 요소는 모두 `@uniai-fe/uds-primitives` 컴포넌트를 조합해 구성합니다.
28
- - 역할 분리:
29
- - **templates**는 레이아웃/플로우/상태 표현까지 담당하고,
30
- - API 호출, 인증 토큰 관리, 라우팅, i18n 등 비즈니스 로직은 서비스 앱에서 구현합니다.
31
-
32
- ## Public import surface
33
-
34
- `@uniai-fe/uds-templates`의 공식 안정 public surface는 root namespace import다.
35
-
36
- ```tsx
37
- import { Auth, Modal, Frame } from "@uniai-fe/uds-templates";
38
- ```
39
-
40
- - `@uniai-fe/uds-templates/auth`, `@uniai-fe/uds-templates/modal`, `@uniai-fe/uds-templates/page-frame` 같은 category subpath는 현재 package export map에 없으므로 공식 사용 예시로 안내하지 않는다.
41
- - root에는 UI template namespace뿐 아니라 일부 API/helper/state surface도 함께 포함되어 있다. 이 책임 경계는 숨기지 않고 후속 package/API contract gate에서 정리한다.
42
- - category subpath 공개 여부는 package contract gate 후보로 남긴다.
43
-
44
- ## 확인 완료 도구 목록
45
-
46
- 아래 `/modal`, `/weather` 같은 표기는 API inventory를 묶는 카테고리 label이다. 실제 consumer import path는 현재 root namespace import를 기준으로 한다.
47
-
48
- - `/modal`
49
- - `Modal.Provider`
50
- - `Modal.StackProvider`
51
- - `Modal.RouteReset`
52
- - `Modal.useModal`
53
- - `Modal.Alert`
54
- - `Modal.Dialog`
55
- - `createAlertModal`
56
- - `createDialogModal`
57
- - `modalStackAtom`
58
- - `ModalState`
59
- - `ModalStatePatch`
60
- - `ModalProps`
61
- - `ModalFooterButton`
62
- - `AlertTemplateOptions`
63
- - `DialogTemplateOptions`
64
- - `UseModalReturn`
65
- - `/weather`
66
- - `WeatherComponents.PageHeader`
67
- - `WeatherPageHeader`
68
- - `WeatherPageHeaderContainer`
69
- - `WeatherPageHeaderAddress`
70
- - `WeatherPageHeaderToday`
71
- - `WeatherPageHeaderForecast`
72
- - `WeatherPageHeaderAlert`
73
- - `WeatherPageHeaderNextDays`
74
- - `useWeather`
75
- - `useWeatherAlert`
76
- - `weatherCoordinate`
77
- - `weatherFarmIdx`
78
- - `WeatherPageHeaderContainerProps`
79
- - `WeatherPageHeaderTexts`
80
- - `/service-inquiry`
81
- - `ServiceInquiry.Form`
82
- - `ServiceInquiry.OpenButton`
83
- - `ServiceInquiry.NavButton`
84
- - `ServiceInquiry.useOpen`
85
- - `ServiceInquiry.useProvideContext`
86
- - `ServiceInquiry.useUserContext`
87
- - `ServiceInquiry.createModal`
88
- - `ServiceInquiryFieldMode`
89
- - `ServiceInquiryFormProps`
90
- - `ServiceInquiryFormValues`
91
- - `ServiceInquiryProvidedContext`
92
- - `/cctv`
93
- - `CCTV.Provider`
94
- - `CCTV.CamList.Container`
95
- - `CCTV.Video.Container`
96
- - `CCTV.Video.Contents`
97
- - `CCTV.Video.Overlay.Container`
98
- - `CCTV.Pagination.Container`
99
- - `CCTV.Pagination.List.Container`
100
- - `CCTV.Pagination.Button.Prev`
101
- - `CCTV.Pagination.Button.Next`
102
- - `CCTV.Viewer.Desktop.Container`
103
- - `useCctvCompanyData`
104
- - `useCctvContext`
105
- - `useCctvRtcStream`
106
- - `getServerCompanyList`
107
- - `postCctvRtcToken`
108
- - `/page-frame`
109
- - `Frame`
110
- - `Frame.Mobile`
111
- - `MobileFrame`
112
- - `Frame.Desktop`
113
- - `DesktopFrame`
114
- - `MobileFrameProps`
115
- - `PageFrameDesktopNavProps`
116
- - `SitemapDataType`
117
- - `/edge-case`
118
- - `EdgeCase`
119
- - `EdgeCase.Empty`
120
- - `EdgeCase.Loading`
121
- - `EdgeCase.NotFound`
122
- - `EdgeCaseEmptyProps`
123
- - `EdgeCaseLoadingProps`
124
- - `EdgeCaseNotFoundProps`
125
-
126
- ## 현재 제공 템플릿/모듈
127
-
128
- - `/auth/**`
129
- - 로그인 화면 템플릿 (Login)
130
- - 회원가입 플로우 템플릿 (Sign Up, step 기반)
131
- - 아이디 찾기 템플릿
132
- - 비밀번호 찾기/재설정 템플릿
133
- - `/page-frame/**`
134
- - `/page-frame/mobile`: 로그인 이후 화면을 위한 모바일 프레임(header/body/footer)
135
- - `/page-frame/pc`: 추후 확장 예정
136
- - `/modal/**`
137
- - ui-legacy 스택 기반 모달 Provider/Root/Container + 템플릿(`Modal.Alert`, `Modal.Dialog`)
138
- - Storybook(`apps/design-storybook/src/stories/templates/modal`)에서 Alert/Confirm 케이스를 검증한다.
139
- - `/service-inquiry/**`
140
- - 문의 입력 전용 form, 기본 원형 `?` open button, page-frame nav button, 커스텀 trigger용 open hook, 페이지 context 등록 hook, request context 조립 hook, 네트워크 오류 수집 hook, modal preset factory를 제공한다.
141
- - 현재 form 기본 구조는 `이름`, `연락처`, `문의 유형`, `자세한 문의 내용` 4필드이며, `사진 첨부`는 구현 범위에서 제외한다.
142
- - submit transport, React Query mutation, Next.js route handler, 에러 피드백(`Modal.Alert`)은 서비스 앱이 소유한다.
143
- - 모듈 내부 Jotai registry를 사용하므로, layout 고정 버튼 1개와 페이지별 context 등록 hook 조합으로 ready-to-use 구성이 가능하다.
144
- - `stackKey`는 필요할 때만 override하고, `useOpen` 계열은 기본적으로 현재 pathname 기준 `${pathname}/inquiry`를 사용한다.
145
- - modal description은 기본으로 `"사용 중 문제가 있나요? 아래 내용을 적어 문의해 주세요."`를 사용하고 특수 문구가 필요할 때만 `dialogOptions.description`으로 덮어쓴다.
146
- - 로그인 후 `farm_name`, `contact`를 auto-fill + readonly로 보여야 할 때는 `formContextOptions.defaultValues`와 `farmNameField.mode`, `contactField.mode`를 함께 전달한다.
147
- - `/weather/**`
148
- - page-frame header utility에 결합되는 weather header 템플릿, page-header 조각 export, weather data hook/API 도구를 제공한다.
149
- - page-header는 `locale?: string`을 받으며 기본 지원값은 `ko`, `en`, `ja`다. 기본 문구 외 특수 문구는 `texts` prop으로 주입한다.
150
- - `/cctv/**`
151
- - finder/viewer/video/pagination 조합과 rtc/company-list API helper를 제공한다.
152
- - `/page-frame/**`
153
- - mobile/desktop private route frame, nav/header/popup 조합을 제공한다.
154
- - `/edge-case/**`
155
- - empty/loading/not-found 화면 상태 템플릿을 제공한다.
156
- - primitives `Alternate.Layout.*`를 조합하며, 실제 routing/history 판정은 서비스 앱이 소유한다.
157
-
158
- 각 템플릿의 상세한 범위와 의사결정은 `CONTEXT-*.md` 문서에서 관리합니다.
159
-
160
- ### Service Inquiry 도입 흐름
161
-
162
- 1. 서비스 앱이 `react-hook-form`으로 `defaultValues`와 `onSubmit`을 준비한다.
163
- 2. layout 고정 버튼은 `ServiceInquiry.useUserContext()`로 모듈 내부 registry 기반 `requestContext`를 읽는다.
164
- 3. 서비스 앱은 네트워크 오류가 발생했을 때 `ServiceInquiry.useNetworkError().reportNetworkError(...)`만 호출하고, 모듈이 이를 `user_context.network_errors`에 자동 병합한다.
165
- 4. 각 페이지/폼은 `ServiceInquiry.useProvideContext({ labels, userContext })`로 `ServiceInquiryProvidedContext`를 등록한다.
166
- 5. 비로그인 기본 버튼은 `ServiceInquiry.OpenButton`, 로그인 후 page-frame 진입 버튼은 `ServiceInquiry.NavButton`, 그 외 커스텀 버튼은 `ServiceInquiry.useOpen`으로 모달 open을 연결한다.
167
- 6. modal footer confirm이 `ServiceInquiry.Form` submit 진입을 담당한다.
168
- 7. 실제 submit은 서비스 앱의 `useMutation + Next.js route handler + Modal.Alert` 조합으로 처리한다.
169
- 8. 표시 문구는 field별 `label`/`placeholder`/`helper`/`requiredMessage`, `inquiryTypeField.options`, `dialogOptions`, `NavButton.label`, `OpenButton.ariaLabel`로 필요한 항목만 주입한다.
170
-
171
- `service-inquiry`는 구조와 request context까지만 제공하고, 네트워크 상태/재시도/성공·실패 피드백은 서비스 앱이 소유합니다.
172
-
173
- ### 회원가입 Step 구조
174
-
175
- 1. **Step1 — User Info (name + phone)**: 기본 정보 입력. PhoneInput은 인증 UI 없이 마스킹만 제공한다.
176
- 2. **Step2 — Verify & Agreement**: 약관 동의 + EmailInput(인증요청/타이머/OneTimeCode). alert/confirm는 서비스 앱이 직접 처리한다.
177
- 3. **Step3 — Generate Account**: username/password/confirm + password 조건 helper.
178
- 4. **Step4 — Complete**: 승인 대기 안내. CTA 명칭은 “Complete”만 사용한다.
179
-
180
- 세부 props/스토리 구성은 `docs/CONTEXT-SIGNUP.md`, `docs/CONTEXT-SIGNUP-FLOW.md`, `docs/STORYBOOK.md`에서 확인하고 변경 시 세 문서를 동시에 업데이트한다.
181
-
182
- ## 설치 & 기본 설정(Next.js 예시)
10
+ 현재 peer range는 `package.json`이 권위다.
183
11
 
184
12
  ```bash
185
13
  pnpm add @uniai-fe/uds-foundation @uniai-fe/uds-primitives @uniai-fe/uds-templates
186
14
  ```
187
15
 
188
- ### 1) transpilePackages 설정
16
+ Raw TypeScript package를 사용하는 Next.js 앱은 현재 package contract에 맞게
17
+ `transpilePackages`를 설정한다.
189
18
 
190
19
  ```ts
191
- // next.config.ts
192
20
  const nextConfig = {
193
21
  transpilePackages: [
194
22
  "@uniai-fe/uds-foundation",
@@ -200,185 +28,48 @@ const nextConfig = {
200
28
  export default nextConfig;
201
29
  ```
202
30
 
203
- ### 2) 스타일 전역 주입
31
+ ## Public entries
204
32
 
205
- templates style entry는 templates styles만 제공하며 foundation/primitives style을 다시 로드하지 않습니다. 서비스 앱은 app root 또는 global stylesheet에서 `foundation -> primitives -> templates` 순서로 style entry를 명시적으로 로드해야 합니다.
33
+ Template component, type와 hook은 root public entry에서 가져온다. 실제 공개 범위는
34
+ `package.json` `exports`와 public barrel이 권위다.
206
35
 
207
- CSS-only 소비:
36
+ ```tsx
37
+ import { Frame, Modal } from "@uniai-fe/uds-templates";
38
+ ```
39
+
40
+ `@uniai-fe/uds-templates/src/**`와 export map에 없는 category path는 public API가 아니다.
41
+
42
+ ## Styles
43
+
44
+ CSS consumer는 dependency order대로 각 public entry를 로드한다.
208
45
 
209
46
  ```ts
210
- // app/layout.tsx
211
47
  import "@uniai-fe/uds-foundation/css";
212
48
  import "@uniai-fe/uds-primitives/css";
213
49
  import "@uniai-fe/uds-templates/css";
214
-
215
- export default function RootLayout(props: { children: React.ReactNode }) {
216
- return (
217
- <html lang="ko">
218
- <body>{props.children}</body>
219
- </html>
220
- );
221
- }
222
50
  ```
223
51
 
224
- Sass 소비:
225
-
226
52
  ```scss
227
- /* app/globals.scss */
228
53
  @use "@uniai-fe/uds-foundation/scss";
229
54
  @use "@uniai-fe/uds-primitives/styles";
230
55
  @use "@uniai-fe/uds-templates/styles";
231
56
  ```
232
57
 
233
- ## 간단 사용 예시
58
+ Templates style entry는 Foundation/Primitives를 대신 로드하지 않는다.
234
59
 
235
- 아래는 root namespace import와 prop shape를 보여주는 개념 예시다. App Router server page에서 직접 event handler를 넘기지 말고, client wrapper 또는 서비스 앱 로그인 컨테이너에서 조합한다.
60
+ ## Package-local docs
236
61
 
237
- ```tsx
238
- "use client";
62
+ - `docs/CONTEXT-INDEX.md`: category별 append-only 작업 이력 routing
63
+ - `docs/CONTEXT-GUIDELINES.md`: 과거 전역 기록과 최신 priority delta
64
+ - `docs/DESIGN-TEMPLATES-SESSION-GUIDE.md`: 작업 세션 입력과 실행 순서
65
+ - `docs/STORYBOOK.md`: Templates Story routing
66
+ - 그 외 `docs/CONTEXT*.md`: category·issue별 근거와 시행착오
239
67
 
240
- import { Auth } from "@uniai-fe/uds-templates";
68
+ ## Commands
241
69
 
242
- export function LoginTemplateExample() {
243
- return (
244
- <Auth.Login.Container
245
- header={<img src="/logo.svg" alt="서비스 로고" />}
246
- fieldOptions={{
247
- onLogin: async (values) => {
248
- // 실제 로그인 API 호출은 서비스 앱에서 구현
249
- // await login(values);
250
- },
251
- }}
252
- linkOptions={{
253
- find: {
254
- id: "/auth/find-id",
255
- password: "/auth/find-password",
256
- },
257
- signup: "/auth/signup",
258
- }}
259
- />
260
- );
261
- }
262
- ```
263
-
264
- > 위 예시는 개념을 설명하기 위한 형태이며,
265
- > 실제 props 구조/이름은 `CONTEXT-AUTH.md`에서 확정·관리합니다.
266
-
267
- > modules 레포 내부 Storybook은 local render setup으로 `@uniai-fe/uds-foundation/css` → `@uniai-fe/uds-primitives/styles` → `@uniai-fe/uds-templates/styles`를 사용한다. 이 설정은 Storybook 렌더링 검증용이며, 외부 consumer setup은 위 CSS-only/Sass 계약을 따른다.
268
-
269
- ### 최근 업데이트
270
-
271
- - Modal CSS 변수 네임스페이스를 `--modal-*`, `--modal-alert-*`, `--modal-dialog-*` 세 축으로 통일했다. 기존 `--dialog-*` 이름을 사용하지 말고, Auth 템플릿이 Alert을 호출할 때에는 반드시 `Modal.Alert` 팩토리를 통해 렌더링한다.
272
- - Auth(회원가입/아이디 찾기/비밀번호 찾기) 템플릿은 이메일 인증 타이머 5분, alert 문구, readonly 이메일 필드, 완료 단계 헤더 제거 등 최신 플로우를 반영했다. 모듈에서 `window.alert`/`window.confirm`을 호출하지 않고, 서비스 앱이 Modal helper를 주입하는 구조를 README와 `CONTEXT-AUTH*.md`에 명시했다.
273
- - Edge Case 템플릿은 `EdgeCase.Empty`, `EdgeCase.Loading`, `EdgeCase.NotFound` namespace로 공개한다. `NotFound`는 `onPrev` 또는 `fallbackHref="/"`를 연결하지만 `router.back()`이나 service-origin 판정은 실행하지 않는다.
274
-
275
- ### 토큰 스코프 & ThemeProvider
276
-
277
- - templates CSS/styles는 templates module styles만 제공하며 upstream foundation/primitives styles를 초기화하지 않습니다.
278
- - 서비스 앱은 foundation ThemeProvider가 주입하는 `.uds-theme-root`를 루트에 유지할 수 있지만, ThemeProvider는 CSS를 import하지 않습니다.
279
- - CSS-only 소비자는 `@uniai-fe/uds-foundation/css` → `@uniai-fe/uds-primitives/css` → `@uniai-fe/uds-templates/css` 순서를 사용합니다.
280
- - Sass 소비자는 `@uniai-fe/uds-foundation/scss` → `@uniai-fe/uds-primitives/styles` → `@uniai-fe/uds-templates/styles` 순서를 사용합니다.
281
-
282
- ## Modal 모듈 사용법
283
-
284
- ui-legacy에서 사용하던 모달 스택/옵션을 templates 레이어로 옮겨왔습니다. 핵심 흐름은 다음과 같습니다.
285
-
286
- 1. **Provider 1회 장착** — 서비스 레이아웃에서 `<Modal.Provider />`를 렌더합니다.
287
- 2. **Route Reset 장착** — `<Modal.RouteReset />`을 Provider와 같은 레벨에서 렌더해 경로 변경 시 스택을 초기화합니다.
288
- 3. **훅 사용** — `const { newModal, closeModal, hasBlockingModal } = Modal.useModal();`
289
- 4. **템플릿 팩토리** — `Modal.Alert`, `Modal.Dialog`이 `ModalState` 객체를 반환하므로 `newModal(...)`에 그대로 전달합니다.
290
-
291
- ```tsx
292
- // app/layout.tsx
293
- import "@uniai-fe/uds-foundation/css";
294
- import "@uniai-fe/uds-primitives/css";
295
- import "@uniai-fe/uds-templates/css";
296
- import { Modal } from "@uniai-fe/uds-templates";
297
-
298
- export default function RootLayout({
299
- children,
300
- }: {
301
- children: React.ReactNode;
302
- }) {
303
- return (
304
- <html lang="ko">
305
- <body>
306
- <>
307
- {children}
308
- <Modal.Provider />
309
- <Modal.RouteReset />
310
- </>
311
- </body>
312
- </html>
313
- );
314
- }
315
- ```
316
-
317
- ```tsx
318
- // 예: Alert/Confirm 호출
319
- import { Modal } from "@uniai-fe/uds-templates";
320
-
321
- export function ExampleActions() {
322
- const { newModal } = Modal.useModal();
323
-
324
- const openAlert = () =>
325
- newModal(
326
- Modal.Alert({
327
- stackKey: "sample/alert",
328
- message: "필수 항목 동의에 체크해 주세요.",
329
- confirm: { label: "확인" },
330
- }),
331
- );
332
-
333
- const openConfirm = () =>
334
- newModal(
335
- Modal.Dialog({
336
- stackKey: "sample/confirm",
337
- title: "저장하시겠어요?",
338
- content: "입력한 내용이 저장되며 되돌릴 수 없습니다.",
339
- confirm: {
340
- label: "저장",
341
- onClick: () => {
342
- // 서비스 동작
343
- },
344
- },
345
- cancel: { label: "취소" },
346
- }),
347
- );
348
-
349
- return (
350
- <>
351
- <button onClick={openAlert}>Alert</button>
352
- <button onClick={openConfirm}>Confirm</button>
353
- </>
354
- );
355
- }
70
+ ```bash
71
+ pnpm format:check
72
+ pnpm lint
73
+ pnpm typecheck
74
+ pnpm check
356
75
  ```
357
-
358
- - footer 버튼은 ui-legacy와 동일하게 `stackKey`, `role`, `defaultOptions/linkOptions` 구조로 관리하며, Alert(Text)/Dialog(Solid) 규격은 templates 내부에서 보장합니다.
359
- - `closeOnOutsideClick?: boolean`으로 overlay 클릭 닫힘을 제어할 수 있습니다. 기본값은 `true`입니다.
360
- - `preventRouteChange?: boolean`은 현재 열린 modal 중 route 변경 확인이 필요한 modal이 있는지 집계할 때 사용합니다. 서비스 앱은 `hasBlockingModal`을 읽어 공통 confirm UX를 연결할 수 있습니다.
361
- - Route Reset을 누락하면 이전 라우트의 모달 스택이 그대로 남으므로, layout 수준에서 Provider와 함께 반드시 렌더합니다.
362
- - 세부 가드레일·확장 기록은 `CONTEXT-MODAL.md`를 참고하고, 새 템플릿을 추가할 때 해당 문서를 선행 업데이트합니다.
363
-
364
- ## Scripts
365
-
366
- 패키지 루트에서 실행 가능한 대표 명령:
367
-
368
- - `pnpm module:lint` — ESLint 전역 규칙 점검
369
- - `pnpm module:typecheck` — TS 타입 검사 (`tsconfig.build.json` 기준)
370
- - `pnpm module:build` — lint → typecheck 순으로 배포 전 검증
371
- - `pnpm design-templates:dev` — 타입 검사 watch 모드
372
-
373
- 모노레포 루트에서는 `pnpm --filter @uniai-fe/uds-templates <command>` 또는 `pnpm modules:build`(turbo run)으로 전체 패키지를 빌드할 수 있습니다.
374
-
375
- ## 문서
376
-
377
- - `CONTEXT.md` — templates 패키지 전체 상황/진행 현황 인덱스
378
- - `CONTEXT-GUIDELINES.md` — templates 전역 규칙(슬롯/반응형/page-frame 적용 범위 등)
379
- - `CONTEXT-AUTH.md` — `/auth/**` 템플릿 범위/디자인 근거/Figma 링크
380
- - `CONTEXT-SIGNUP.md`, `CONTEXT-SIGNUP-FLOW.md` — 회원가입 단계/훅/스토리 전략 및 Figma node 표
381
- - `CONTEXT-PAGE-FRAME.md` — `/page-frame/**` 템플릿 범위/디자인 근거
382
- - `FOUNDATION-USAGE-GUIDE.md` — 템플릿에서 design-foundation 토큰을 사용하는 규칙
383
- - `PRIMITIVES-USAGE-GUIDE.md` — 템플릿에서 design-primitives를 사용하는 규칙
384
- - `STORYBOOK.md` — templates Storybook 가이드(로그인/회원가입/페이지 프레임 시나리오)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@uniai-fe/uds-templates",
3
- "version": "0.11.4",
3
+ "version": "0.11.6",
4
4
  "description": "UNIAI Design System; UI Templates Package",
5
5
  "type": "module",
6
6
  "private": false,
@@ -37,7 +37,7 @@
37
37
  "peerDependencies": {
38
38
  "@tanstack/react-query": ">=5 <6",
39
39
  "@uniai-fe/uds-foundation": "^0.4.8 || ^0.5.0",
40
- "@uniai-fe/uds-primitives": "^0.8.0 || ^0.9.0 || ^0.10.0",
40
+ "@uniai-fe/uds-primitives": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0",
41
41
  "@uniai-fe/util-api": "^0.1.15 || ^0.2.0",
42
42
  "@uniai-fe/util-functions": "^0.3.0 || ^0.4.0",
43
43
  "@uniai-fe/util-jotai": "^0.1.9 || ^0.2.0 || ^0.3.0",
@@ -69,15 +69,15 @@
69
69
  "typescript": "6.0.3",
70
70
  "@uniai-fe/eslint-config": "0.4.2",
71
71
  "@uniai-fe/next-devkit": "0.4.0",
72
- "@uniai-fe/tsconfig": "0.2.0",
73
72
  "@uniai-fe/react-hooks": "0.3.0",
74
- "@uniai-fe/uds-primitives": "0.10.3",
73
+ "@uniai-fe/util-api": "0.2.1",
74
+ "@uniai-fe/tsconfig": "0.2.0",
75
75
  "@uniai-fe/util-functions": "0.4.3",
76
76
  "@uniai-fe/util-jotai": "0.3.0",
77
- "@uniai-fe/util-rtc": "0.2.1",
78
77
  "@uniai-fe/util-next": "0.5.0",
79
- "@uniai-fe/util-api": "0.2.1",
80
- "@uniai-fe/uds-foundation": "0.5.0"
78
+ "@uniai-fe/uds-primitives": "0.12.0",
79
+ "@uniai-fe/uds-foundation": "0.5.0",
80
+ "@uniai-fe/util-rtc": "0.2.1"
81
81
  },
82
82
  "scripts": {
83
83
  "check:pre-commit": "pnpm --dir ../../.. run check:pre-commit",
@@ -47,7 +47,8 @@ export function ModalFooterButtonElement({
47
47
 
48
48
  if (appearance === "text") {
49
49
  const textPriority =
50
- defaultOptions.priority && defaultOptions.priority !== "primary"
50
+ defaultOptions.priority === "secondary" ||
51
+ defaultOptions.priority === "tertiary"
51
52
  ? defaultOptions.priority
52
53
  : "secondary";
53
54