@naeil/ui 0.4.0 → 0.5.0
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/CHANGELOG.md +11 -1
- package/DESIGN.md +19 -0
- package/README.md +16 -9
- package/THIRD_PARTY_NOTICES.md +4 -0
- package/dist/chunk-CE73AEJZ.js +667 -0
- package/dist/{chunk-QKVN6Q6C.js → chunk-QSTGUEEI.js} +60 -175
- package/dist/chunk-S64H3OYQ.js +1512 -0
- package/dist/components/index.d.ts +19 -5
- package/dist/components/index.js +135 -1618
- package/dist/components/naeil-header.d.ts +54 -0
- package/dist/components/naeil-header.js +14 -0
- package/dist/components/ui/index.d.ts +2 -0
- package/dist/components/ui/index.js +40 -179
- package/dist/navigation-CL10a6Eb.d.ts +48 -0
- package/dist/site-footer-B67meCDv.d.ts +21 -0
- package/dist/source/components/footer.d.ts +13 -4
- package/dist/source/components/footer.js +75 -71
- package/dist/source/components/index.d.ts +5 -3
- package/dist/source/components/locale-switcher.js +1 -1
- package/dist/source/components/naeil-header-content.d.ts +171 -0
- package/dist/source/components/naeil-header-content.js +176 -0
- package/dist/source/components/naeil-header.d.ts +52 -0
- package/dist/source/components/naeil-header.js +196 -0
- package/dist/source/components/nav.d.ts +10 -2
- package/dist/source/components/nav.js +51 -347
- package/dist/source/components/ui/index.d.ts +2 -0
- package/dist/source/components/ui/index.js +4 -0
- package/dist/source/components/ui/navigation.d.ts +48 -0
- package/dist/source/components/ui/navigation.js +347 -0
- package/dist/source/components/ui/site-footer.d.ts +21 -0
- package/dist/source/components/ui/site-footer.js +93 -0
- package/docs/components/README.md +6 -1
- package/docs/components/common.md +1 -1
- package/docs/components/naeil-header.md +50 -0
- package/docs/components/navigation.md +59 -0
- package/docs/design/public-ui-support.md +14 -1
- package/docs/design/v2-migration.md +46 -12
- package/docs/package-release.md +36 -14
- package/package.json +13 -1
- package/src/styles/components.css +292 -0
- package/src/styles/theme.css +4 -0
|
@@ -2,22 +2,25 @@
|
|
|
2
2
|
|
|
3
3
|
이 안내는 `@naeil/ui`의 기본 모양과 재사용 규칙을 설명한다. 패키지 소비와 소비 사이트 배포는 별도 작업이다.
|
|
4
4
|
|
|
5
|
-
이 안내는 **@naeil/ui 0.
|
|
5
|
+
이 안내는 **@naeil/ui 0.5.0 릴리스 후보**의 CSS·API·패키지 경계를 대상으로 한다. 최종 소스·archive 검증과 registry 게시, 새 Docs·운영 사이트 배포는 아직 완료로 기록하지 않는다. 2026-10-11에 확인한 npm 0.4.0 게시·latest와 당시 소비 앱·Docs·운영 사이트 결과는 [0.4.0 게시 기록](https://github.com/naeil-dev/naeil-ui/blob/main/docs/design/naeil-brand-0.4.0-publication.md)으로 유지한다. UI v2는 디자인 세대 이름이며 npm 2.0을 뜻하지 않는다.
|
|
6
6
|
|
|
7
7
|
## 시작하기
|
|
8
8
|
|
|
9
|
-
React 19/ReactDOM 19와 Tailwind 4 앱에서 `/ui`를 사용한다. API 키와 Next.js는 필요 없다.
|
|
9
|
+
React 19/ReactDOM 19와 Tailwind 4 앱에서 `/ui` 또는 선택적 `/naeil-header`를 사용한다. API 키와 Next.js는 필요 없다. 후보 검증 중에는 저장소에서 빌드·pack한 archive를 소비 앱에 설치한다.
|
|
10
10
|
|
|
11
11
|
```sh
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
# 이 저장소에서:
|
|
13
|
+
pnpm build:pkg
|
|
14
|
+
npm pack --ignore-scripts --pack-destination /tmp
|
|
15
|
+
# 소비 앱에서:
|
|
16
|
+
pnpm add --save-exact /tmp/naeil-ui-0.5.0.tgz
|
|
14
17
|
```
|
|
15
18
|
|
|
16
|
-
|
|
19
|
+
0.5.0 registry 게시가 실제 확인된 뒤에는 `pnpm add --save-exact @naeil/ui@0.5.0`을 사용한다. 설치 명령을 문서에 쓰는 것만으로 게시가 완료되지는 않는다. [독립 React 예제](https://github.com/naeil-dev/naeil-ui/blob/81fd395031dc5b20074c4d915a8585360ce2d28a/examples/react/README.md)와 [검증/릴리스 정책](../package-release.md)을 참고한다.
|
|
17
20
|
|
|
18
21
|
공통 UI 소비에는 Supabase, 21st 또는 다른 API 키가 필요하지 않다. React/ReactDOM 19는 소비 앱의 peer이며, Next 15/16과 next-intl 4는 호환 경로에 필요한 선택적 peer다. next-themes 0.4와 tailwind-merge 3은 공통 런타임 의존성으로 설치된다. 사이트의 Supabase·MDX·Three 의존성과 코드는 공통 소비 경계에서 제외했다.
|
|
19
22
|
|
|
20
|
-
버전을 생략한 설치는 registry의 latest 태그를 따른다. 이 안내와 동일한 경계를 사용하려면 0.
|
|
23
|
+
버전을 생략한 설치는 registry의 latest 태그를 따른다. 이 안내와 동일한 경계를 사용하려면 검증된 0.5.0 후보 archive를 사용하고, 게시 확인 후에는 0.5.0을 지정한다. 업그레이드 전에 [변경 기록](../../CHANGELOG.md)을 확인한다.
|
|
21
24
|
|
|
22
25
|
Tailwind 4를 사용하는 앱의 전역 CSS에서 공통 스타일을 한 번 불러온다.
|
|
23
26
|
|
|
@@ -55,8 +58,37 @@ Select는 값 선택, DropdownMenu는 행동 선택에 사용한다. Switch와 C
|
|
|
55
58
|
- 레이블·도움말·오류 문구는 소비 화면이 연결한다. Input의 `aria-invalid`와 `aria-describedby`를 사용하고, 로딩 중에는 Button의 `disabled`와 `aria-busy`를 함께 지정한다.
|
|
56
59
|
- 성공·경고·오류·안내에는 Badge의 `success`, `warning`, `error`, `info` variant를 사용할 수 있다. 색만으로 의미를 전달하지 않는다.
|
|
57
60
|
|
|
61
|
+
## 브라우저 탭 제목과 파비콘
|
|
62
|
+
|
|
63
|
+
2026-10-13 승인한 공통 브랜드·콘텐츠 규칙이며, 2026-10-14 사용자 요청으로 naeil.dev의 서비스명을 `.naeil`로 통일했다. 기준은 [DESIGN.md의 Browser identity](../../DESIGN.md#browser-identity--tab-title-and-favicon)이며, 브라우저 탭의 글꼴·크기는 브라우저가 결정한다.
|
|
64
|
+
|
|
65
|
+
| 화면 | 탭 제목 예시 |
|
|
66
|
+
| --- | --- |
|
|
67
|
+
| naeil.dev 홈 | `.naeil` |
|
|
68
|
+
| Home 홈/소개 화면 | `Naeil Home` |
|
|
69
|
+
| Home 대시보드 | `대시보드 — Naeil Home` |
|
|
70
|
+
| Home API 키 관리 | `API 키 — Naeil Home` |
|
|
71
|
+
| naeil.dev 프로젝트 목록 | `프로젝트 — .naeil` |
|
|
72
|
+
| Home 영문 대시보드 | `Dashboard — Naeil Home` |
|
|
73
|
+
|
|
74
|
+
- 이름이 있는 페이지는 `페이지 이름 — 서비스 이름`으로 작성한다. 구분자는 양옆 공백이 있는 em dash(` — `)이며, 서비스 이름은 한 번만 붙인다.
|
|
75
|
+
- 서비스 홈/소개 화면은 서비스 이름만 사용할 수 있다. 대시보드처럼 이름이 있는 업무 화면은 첫 진입 경로이더라도 페이지 이름을 포함한다.
|
|
76
|
+
- 서비스 이름은 naeil.dev의 경우 `.naeil`, Home의 경우 `Naeil Home`으로 고정한다. 앞의 마침표까지 공식 이름에 포함하며 로고와 탭 제목·공유 메타데이터에 같은 표기를 쓴다. 다른 서비스는 앱 설정에 공식 표기를 한 번 정의해 재사용한다.
|
|
77
|
+
- 페이지 이름은 현재 UI 언어에 맞춰 번역하고, 서비스 이름의 대소문자·띄어쓰기는 언어가 바뀌어도 유지한다. 본문 제목이나 글 제목을 사용해 현재 화면을 식별할 수 있게 한다.
|
|
78
|
+
- 같은 서비스의 페이지를 이동할 때 파비콘은 유지한다. 승인된 브랜드 자산을 사용하며 파일·메타데이터·앱 manifest와 배포는 소비 서비스가 관리한다.
|
|
79
|
+
|
|
80
|
+
Next.js 소비자는 layout의 metadata title 기본값/템플릿과 페이지별 title을 연결하고, 일반 React 앱은 라우터의 페이지 메타데이터에서 같은 규칙으로 document.title을 설정한다. 제목 조립은 한 곳에서 담당해 `API 키 — Naeil Home — Naeil Home`처럼 중복되지 않게 한다. Navigation이나 Logo 렌더링에 문서 제목 변경을 숨겨 넣지 않는다.
|
|
81
|
+
|
|
82
|
+
적용 확인은 실제 브라우저에서 홈·하위 페이지의 직접 진입, 클라이언트 경로 이동, 뒤로 가기, 언어 전환 후 제목과 파비콘을 확인한다. 제목은 현재 페이지와 일치하고 서비스 접미사가 중복되지 않아야 하며, 파비콘 파일 요청도 성공해야 한다. 이 문서 변경은 규칙 등록이며 기존 naeil.dev/Home의 메타데이터 수정·배포 완료를 의미하지 않는다.
|
|
83
|
+
|
|
58
84
|
## 앱 전체 틀과 콘텐츠 폭
|
|
59
85
|
|
|
86
|
+
실제 naeil.dev 브랜드 헤더를 이어받는 앱은 선택적 React 전용 `@naeil/ui/naeil-header`의 `NaeilHeader`를 사용한다. 전체 프로젝트 메뉴·헤더 번역·테마/선택적 언어 컨트롤·toolbar·반응형 스타일을 한 모듈에서 제공하므로 소비 앱에 다시 복사하지 않는다. 소비 앱은 기존 theme provider, 라우팅·저장 guard, 현재 언어와 실제 인증 슬롯을 연결한다. 언어 변경을 지원하지 않으면 `onLocaleChange`를 생략한다. [전체 헤더 계약](../components/naeil-header.md)을 참조한다.
|
|
87
|
+
|
|
88
|
+
이 브랜드 헤더는 고정 높이 65px, 최대 폭 1280px, 좌우 여백 24px를 사용한다. 본문·푸터의 제품별 폭과 독립적이다. 소비 앱은 main·sticky 영역과 초점/anchor 이동에 `calc(var(--ui-navigation-height) + 1px)`만큼 여유를 둔다. 다섯 장식 이미지는 공식 `https://naeil.dev/images/*.png` URL을 참조하므로 네트워크가 필요하다. 이미지 바이트는 npm에 포함하지 않으며 재배포 출처·권리 미해결 사항은 [제3자 고지](../../THIRD_PARTY_NOTICES.md)에 유지한다.
|
|
89
|
+
|
|
90
|
+
다른 제품 메뉴에는 `@naeil/ui/ui`의 범용 `Navigation`과 `SiteFooter`를 조합하고 제품 메뉴 데이터·번역·폭을 소유한다. 기존 `Nav`·`Footer`는 Next/next-intl 호환 API를 유지한다. [범용 API와 마이그레이션 안내](../components/navigation.md)를 참조한다. Naeil Home 운영 적용은 아직 완료되지 않았으며 저장소의 `docs/design/navigation-footer-integration.md`에서 추적한다.
|
|
91
|
+
|
|
60
92
|
앱의 공통 헤더·메뉴·좌우 여백과 본문의 읽기/설정/목록 폭은 별도로 관리한다. 같은 앱 틀을 사용하는 페이지는 같은 화면 크기·언어·테마에서 메뉴 위치가 유지되어야 한다. 설정 폼을 640px로 제한할 때 헤더까지 그 폭에 종속시키지 않는다. 변동하는 계정 수·상태 요약도 메뉴를 밀어내지 않도록 배치한다.
|
|
61
93
|
|
|
62
94
|
아래는 소비 앱의 구성 예이며 새 패키지 API가 아니다. `product-frame`과 최대 폭·여백은 제품에서 소유하고 정한다. 공통 숫자 토큰은 `src/tokens/*.json`을 기준으로 한다.
|
|
@@ -125,7 +157,7 @@ Storybook의 로컬 폰트 import는 예시다. 그대로 앱 전역에 모든
|
|
|
125
157
|
|
|
126
158
|
## 개별 컴포넌트 안내
|
|
127
159
|
|
|
128
|
-
[
|
|
160
|
+
[컴포넌트 사용 안내](../components/README.md)는 13개 primitive와 Navigation·SiteFooter·전체 NaeilHeader의 실제 wrapper API·기본값, 키보드, 상태, 레이블·오류 연결, 재정의 책임을 설명한다. 현재 로컬 Storybook은 UI 15개와 Brand 2개, 총 17개 Docs를 제공한다. 각 `Docs`·`Usage`와 `Brand / NaeilHeader / JapaneseApplication`에서 안내와 실행 예시를 확인한다. 이는 새 hosted Docs 배포 완료를 뜻하지 않는다. [지원 범위와 수동 점검](public-ui-support.md)은 자동 검사와 실제 보조 기술·운영체제 검증의 차이를 기록한다.
|
|
129
161
|
|
|
130
162
|
## 확인 방법
|
|
131
163
|
|
|
@@ -138,7 +170,7 @@ Storybook의 로컬 폰트 import는 예시다. 그대로 앱 전역에 모든
|
|
|
138
170
|
|
|
139
171
|
## 0.3 package boundary
|
|
140
172
|
|
|
141
|
-
`/ui` is the React core. Root imports preserve Nav, Footer, Logo, LocaleSwitcher, ThemeProvider, ThemeToggle, ThemeToggleIcon, PageTitle, SectionTitle and their class helpers, but root has static Next/next-intl dependencies. React-only apps must use `/ui`, `/utils` and appropriate shared deep modules. `next-themes` is a React runtime library; it does not require Next.js. Fonts remain consumer-owned.
|
|
173
|
+
The heading retains the original 0.3 migration anchor; the allowlist below reflects the 0.5.0 candidate additions. `/ui` is the React core. The opt-in `/naeil-header` is the canonical complete branded header, also React-only. Root imports preserve Nav, Footer, Logo, LocaleSwitcher, ThemeProvider, ThemeToggle, ThemeToggleIcon, PageTitle, SectionTitle and their class helpers, but root has static Next/next-intl dependencies. React-only apps must use `/ui`, `/utils` and appropriate shared deep modules. `next-themes` is a React runtime library; it does not require Next.js. Fonts remain consumer-owned.
|
|
142
174
|
|
|
143
175
|
Next.js `^15 || ^16` and next-intl `^4` are optional peers. Install both when using root, Nav, Footer or `i18n/routing`. This is an existing compatibility contract, not a claim that every peer combination has browser validation; the clean Next fixture checks Next 16.1.7. React/ReactDOM `^19` come from the host. Tailwind 4 is the documented styling pipeline. Explicit `className`, Radix props, Toaster options and theme-provider props remain consumer overrides.
|
|
144
176
|
|
|
@@ -155,6 +187,8 @@ components/ui/checkbox
|
|
|
155
187
|
components/ui/dialog
|
|
156
188
|
components/ui/dropdown-menu
|
|
157
189
|
components/ui/input
|
|
190
|
+
components/ui/navigation
|
|
191
|
+
components/ui/site-footer
|
|
158
192
|
components/ui/select
|
|
159
193
|
components/ui/sonner
|
|
160
194
|
components/ui/switch
|
|
@@ -173,13 +207,13 @@ i18n/config
|
|
|
173
207
|
i18n/routing
|
|
174
208
|
```
|
|
175
209
|
|
|
176
|
-
`components/index` has the same framework requirements as root. `/utils` and `lib/utils` remain aliases for `cn`. `i18n/config` preserves the compatibility locale names; products may instead own their locale list and routing. There are no open-ended component/lib/i18n export patterns. Root, `/ui`, `/utils`, `/theme.css`, `/globals.css` and `/components.css` remain public.
|
|
210
|
+
`components/index` has the same framework requirements as root. `/utils` and `lib/utils` remain aliases for `cn`. `i18n/config` preserves the compatibility locale names; products may instead own their locale list and routing. There are no open-ended component/lib/i18n export patterns. Root, `/ui`, `/utils`, `/theme.css`, `/globals.css` and `/components.css` remain public; `/naeil-header` is the explicit new opt-in entry. It is not an open-ended component export pattern.
|
|
177
211
|
|
|
178
212
|
Every excluded source path stays in this repository for the brand/example website. Move any local-source consumer use into the consumer application before upgrading:
|
|
179
213
|
|
|
180
214
|
| Previously declared source path | Ownership/migration |
|
|
181
215
|
| --- | --- |
|
|
182
|
-
| `components/nav-wrapper`, `components/nav-server-wrapper` |
|
|
216
|
+
| `components/nav-wrapper`, `components/nav-server-wrapper` | Use `/naeil-header` for the canonical whole header, or preserve Nav compatibility through your own adapter; your app loads users/sessions. |
|
|
183
217
|
| `components/footer-wrapper` | Compose preserved Footer with your app's Link. |
|
|
184
218
|
| `components/auth-slot` | App-owned account UI, logout action and avatar policy; pass it through Nav slots. |
|
|
185
219
|
| `components/hero-scene`, `components/hero-section`, `components/paraglider-cursor` | Website scene/cursor source, assets and Three dependencies stay website-owned. |
|
|
@@ -196,7 +230,7 @@ The reachable Next consumer's observed deep imports (Nav, Footer, ThemeProvider,
|
|
|
196
230
|
|
|
197
231
|
## Demand-led extension
|
|
198
232
|
|
|
199
|
-
Version 0.3.0 also adds `Tabs`, `TabsList`, `TabsTrigger`, `TabsContent` and `Textarea` to `/ui`, plus exact `components/ui/tabs` and `components/ui/textarea` deep entries. Existing root stays the brand/framework barrel. No new dependency or existing default is changed. See the [
|
|
233
|
+
Version 0.3.0 also adds `Tabs`, `TabsList`, `TabsTrigger`, `TabsContent` and `Textarea` to `/ui`, plus exact `components/ui/tabs` and `components/ui/textarea` deep entries. Existing root stays the brand/framework barrel. No new dependency or existing default is changed. See the [component index](../components/README.md), [Tabs defaults/mount responsibilities](../components/tabs.md), [native Textarea contract](../components/textarea.md), [field/native-radio composition](../components/composition.md), and [demand decision](component-demand.md). Publishing does not update consumers that use locally copied primitives.
|
|
200
234
|
|
|
201
235
|
|
|
202
236
|
## Brand Logo integration (0.4.0)
|
|
@@ -224,6 +258,6 @@ Root and `components/index` continue to export Logo; root still has the existing
|
|
|
224
258
|
- Default accessible name is naeil with role=img. Use `label={null}` for decorative use and name the enclosing link/button. `aria-label` and other standard SVG attributes remain consumer overrides.
|
|
225
259
|
- Nav now uses the horizontal wordmark at 28px; Footer uses the footer lockup at 20px. Their official visible spelling remains `.naeil`: the period marks an ending, followed by tomorrow. Nav's `brandSlot`, brandHref, external/internal links, layout frame and other slots are preserved. Check custom layouts on upgrade because the new artwork has a different width.
|
|
226
260
|
|
|
227
|
-
The independent kit lives in the repository's `brand/naeil/1.1.1/` directory with its own usage guide, SVG/PNG/icons, OFL and checksums. Copy it for non-React uses without installing @naeil/ui. It is intentionally not copied into the npm tarball. The package carries only generated React artwork and the [Lato notice](../../licenses/Lato-OFL.txt). A favicon is application-owned: Next file conventions can use the kit's favicon.ico, favicon.svg and apple-touch-icon.png; each consumer chooses its own app manifest and deployment.
|
|
261
|
+
The independent kit lives in the repository's `brand/naeil/1.1.1/` directory with its own usage guide, SVG/PNG/icons, OFL and checksums, and is available as a [verified release ZIP](https://github.com/naeil-dev/naeil-ui/releases/download/v0.4.0/naeil-brand-1.1.1.zip). Copy it for non-React uses without installing @naeil/ui. It is intentionally not copied into the npm tarball. The package carries only generated React artwork and the [Lato notice](../../licenses/Lato-OFL.txt). A favicon is application-owned: Next file conventions can use the kit's favicon.ico, favicon.svg and apple-touch-icon.png; each consumer chooses its own app manifest and deployment.
|
|
228
262
|
|
|
229
263
|
Maintainers run `pnpm build:brand` after explicitly selecting a reviewed version in `brand/current.json`, then `pnpm check:brand`. Package/Storybook builds check that generated artwork, notices and this site's icon files match that version. Shared color tokens and Pretendard do not change. In Storybook, **Brand / Logo / Docs, Usage, Application** demonstrates the actual adapter, canonical SVG comparisons and Nav/Footer composition.
|
package/docs/package-release.md
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
# Package verification and release policy
|
|
2
2
|
|
|
3
|
-
This policy covers
|
|
3
|
+
This policy covers the intended **@naeil/ui 0.5.0 release candidate**. Final source/archive verification, registry publication and new hosted deployments are pending. Verified 0.4.0 (2026-10-11) and 0.3.0 publication evidence below remains dated history. UI v2 names a design generation, not an npm major. Future breaking changes require an explicit migration and version decision. Version-scoped installation is in the [README](../README.md#use-the-ui).
|
|
4
4
|
|
|
5
5
|
## Architecture
|
|
6
6
|
|
|
7
|
-
One repository contains the shared package and the separate Next.js brand/example website. `@naeil/ui/ui`
|
|
7
|
+
One repository contains the shared package and the separate Next.js brand/example website. `@naeil/ui/ui` provides React primitives and generic Navigation/SiteFooter. The opt-in React-only `@naeil/ui/naeil-header` provides the complete actual naeil.dev branded header; see [its consumer contract](components/naeil-header.md). The legacy root is a framework compatibility entry with static Next/next-intl imports, even when selecting only Logo or a heading; React-only consumers use the documented shared deep modules. Next and next-intl are optional peers, not optional behavior inside the root. Supply them when importing that entry, Nav, Footer, or i18n/routing. Theme controls and Toaster use the framework-independent React library next-themes, retained as a runtime dependency.
|
|
8
8
|
|
|
9
|
-
Website tools remain development dependencies so maintainers can develop both products. npm tarball consumers install only component runtime dependencies and their host React/ReactDOM. Build entries, package exports and packed checks constrain the public boundary. There is no bundled website action, Supabase helper, Three/hero/cursor module, blog engine or application message catalog.
|
|
9
|
+
Website tools remain development dependencies so maintainers can develop both products. npm tarball consumers install only component runtime dependencies and their host React/ReactDOM. Build entries, package exports and packed checks constrain the public boundary. There is no bundled website action, Supabase helper, Three/hero/cursor module, blog engine or full application message catalog. The opt-in header includes only its three header dictionaries and canonical project catalog. Its five decorative images reference official `https://naeil.dev/images/*.png` URLs and require network access; no image bytes are bundled, and unresolved artwork redistribution provenance remains in [third-party notices](../THIRD_PARTY_NOTICES.md).
|
|
10
10
|
|
|
11
11
|
## Checks
|
|
12
12
|
|
|
@@ -31,6 +31,15 @@ pnpm test:browser
|
|
|
31
31
|
|
|
32
32
|
`check:package:boundary` inspects an actual `npm pack --ignore-scripts` archive for every declared export, runtime dependencies, source aliases, relative imports, required CSS/tokens/documents/notices and forbidden website payload. `check:consumers` separately installs that tarball with npm into two temporary directories. It builds the reusable React example with Vite/Tailwind, type-checks with library checks enabled, imports shared deep modules, checks SSR and CSS, and asserts Next/Supabase/Three are absent. A separate Next production build exercises root exports and the deep paths observed in the reachable Next consumer, with consumer-owned messages and no auth backend. Neither fixture uses repository dependency symlinks. Network access is needed for uncached npm dependencies; temporary installs are removed on completion or failure.
|
|
33
33
|
|
|
34
|
+
For a frozen release candidate, both archive-producing checks can enforce the reviewed SHA-256 before extraction or consumer installation:
|
|
35
|
+
|
|
36
|
+
```sh
|
|
37
|
+
# Replace the placeholder with the frozen archive's full lowercase SHA-256.
|
|
38
|
+
NAEIL_UI_EXPECTED_ARCHIVE_SHA256=FULL_LOWERCASE_SHA256 pnpm check:package
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Each check hashes its actual `npm pack` output and prints the digest. An unset expectation preserves normal development checks; a defined malformed or mismatched digest fails. Record matching boundary and clean React/Next results against the final archive, then reconcile package metadata, source revision and the consumer lock/archive identities. A provisional pack pass does not verify later documentation or archive bytes.
|
|
42
|
+
|
|
34
43
|
CI runs these checks and a separate actual Storybook/browser job. Configured browser projects run Chromium, Firefox and WebKit in CI. Local Chromium/WebKit results and the Firefox environment launch block are distinguished in the [current support matrix](design/public-ui-support.md) and [dated Stage 3 verification](design/public-ui-stage3-verification.md) and [Stage 4 extension verification](design/public-ui-stage4-verification.md); configured CI is not a recorded remote pass. Automated axe/keyboard checks are not manual screen-reader or native Safari certification. The website build checks compatibility independently from package consumption; fonts fetched through next/font may require network access. Supabase OAuth and deployed behavior remain separate checks.
|
|
35
44
|
|
|
36
45
|
At baseline `bcf99fca3467ae2b1cd29d54fa24f2569fb6001c`, both [push CI](https://github.com/naeil-dev/naeil-ui/actions/runs/36945564443) and [PR CI](https://github.com/naeil-dev/naeil-ui/actions/runs/36945943651) passed package-and-site and failed the browser job. Linux Firefox application coverage passed in those runs. The [final correction follow-up](design/public-ui-final-verification.md) preserves that baseline and the initial local freeze evidence, then records independent scoped review approval and successful [push CI](https://github.com/naeil-dev/naeil-ui/actions/runs/36948276767) and [PR CI](https://github.com/naeil-dev/naeil-ui/actions/runs/36948280881) at exact correction commit `9f90493abb4fb1186c948084026c3f4c04074013`. The PR browser job passed 209 tests with 4 expected Firefox/WebKit forced-colors skips; package-and-site and optional helper checks passed. The downloaded CI preview also passed actual Chromium/WebKit subpath navigation/font checks. This acceptance applies to that source; [merged PR checks](https://github.com/naeil-dev/naeil-ui/pull/1/checks) retain the release-preparation checks. Subsequent documentation changes require their own verification. Publication and manual platform acceptance remain separate.
|
|
@@ -39,11 +48,24 @@ The explicit font-notice regression gate copies the real React fixture config in
|
|
|
39
48
|
|
|
40
49
|
## Publication and deployment
|
|
41
50
|
|
|
42
|
-
### 0.
|
|
51
|
+
### Intended 0.5.0 release — pending
|
|
52
|
+
|
|
53
|
+
The owner authorized npm publication, reviewed main integration and naeil.dev deployment for the whole-header change. Authentication and actual execution are separate from authorization. At this documentation checkpoint no 0.5.0 registry version, tag/release, new hosted Docs, production site deployment or final archive identity is claimed. Freeze and verify the complete candidate before following the procedure below; record each external outcome independently.
|
|
54
|
+
|
|
55
|
+
### Verified 0.4.0 publication — 2026-10-11
|
|
56
|
+
|
|
57
|
+
Brand 1.1.1 is independent of npm 0.4.0. Existing imports/props/slots remain supported; Logo variants, grayscale and theme controls accompany the approved `.naeil` identity. Publication, Docs and production results are recorded in the [publication report](https://github.com/naeil-dev/naeil-ui/blob/main/docs/design/naeil-brand-0.4.0-publication.md).
|
|
58
|
+
|
|
59
|
+
- npm published `@naeil/ui@0.4.0` at `2026-10-11T05:36:58.047Z`; `latest` was verified as `0.4.0`. [Registry/consumer evidence](https://github.com/naeil-dev/naeil-ui/releases/download/v0.4.0/npm-publication-verification.json) records independent empty-cache React/Next installs, types, production builds and browser contracts.
|
|
60
|
+
- [PR #3](https://github.com/naeil-dev/naeil-ui/pull/3) merged as `e8fe5afc13788a0cac0244b72e78975812f4a2ee`; `v0.4.0` points to that source. The [GitHub Release](https://github.com/naeil-dev/naeil-ui/releases/tag/v0.4.0) was published at `2026-10-11T05:45:55Z` with 9 publicly downloadable, byte-verified assets.
|
|
61
|
+
- Frozen candidate, merged-source rebuild and registry download are byte-identical: **108 files**, **131,414 compressed bytes**, **772,862 unpacked bytes**, SHA-256 `77fe024ceb631ea76100fdc687f04ee1ae90bfcbb306629cb9dac854226c724f`.
|
|
62
|
+
- The independent [brand 1.1.1 ZIP](https://github.com/naeil-dev/naeil-ui/releases/download/v0.4.0/naeil-brand-1.1.1.zip) contains 159 files and passes CRC; SHA-256 `a922a7375b5c3be412c759c0f54b532155f260801ea2bdd9cff43eca66848144`. [Brand evidence](https://github.com/naeil-dev/naeil-ui/releases/download/v0.4.0/brand-publication-verification.json) retains the approved extraction checks.
|
|
63
|
+
- [Pages run 38114879574](https://github.com/naeil-dev/naeil-ui/actions/runs/38114879574) deployed that exact source. Actual [hosted checks](https://github.com/naeil-dev/naeil-ui/releases/download/v0.4.0/hosted-docs-verification.json) passed 28 Docs visits, 28 Docs-to-Usage transitions, 4 brand theme checks, 6 exact notices, 4 canonical SVGs, local fonts and pinned links in Chromium/WebKit.
|
|
64
|
+
- Vercel production deployment `6991225824` succeeded for the same source. [Production checks](https://github.com/naeil-dev/naeil-ui/releases/download/v0.4.0/production-verification.json) passed 24 homepage/login conditions on [naeil.dev](https://naeil.dev/) across Korean/English/Japanese, desktop/mobile and light/dark, plus 3 exact deployed icons.
|
|
43
65
|
|
|
44
|
-
|
|
66
|
+
Local unit tests passed 46 tests. [Merged-source CI](https://github.com/naeil-dev/naeil-ui/actions/runs/38113742370) passed package/site checks; both that run and the Docs workflow passed 233 browser tests with 4 expected forced-colors skips. Production page checks do not certify full OAuth authentication. Native/manual platform coverage, print/trademark certification and real-consumer adoption retain their documented limits.
|
|
45
67
|
|
|
46
|
-
|
|
68
|
+
The npm archive and release tag retain the reviewed source. These maintained documentation updates record the later publication outcome and do not replace the immutable archive or redeploy the unchanged Storybook runtime. The earlier local Supabase environment failure remains dated evidence; actual production homepage/login rendering was verified separately above.
|
|
47
69
|
|
|
48
70
|
### Verified 0.3.0 publication — 2026-10-03
|
|
49
71
|
|
|
@@ -58,15 +80,15 @@ The immutable npm archive's bundled guides are the release-preparation snapshot.
|
|
|
58
80
|
|
|
59
81
|
### Release procedure
|
|
60
82
|
|
|
61
|
-
The Storybook guide URL base
|
|
83
|
+
The deployed Storybook's component guide URL base uses the 0.3.0 publication-status documentation snapshot `04c5b8cce145a4c387763db6f28d29e62f7664c7`. Runtime/API source-authority links retain tested component snapshot `81fd395031dc5b20074c4d915a8585360ce2d28a`; those foundation links remain valid and were rechecked during 0.4.0 hosted verification. The README documentation index points to the maintained main-branch index. Verify targets at their respective revisions and preserve original sources, dated approval scope and runtime evidence. Freeze subsequent documentation changes separately from immutable release archives.
|
|
62
84
|
|
|
63
85
|
The authorized 0.3.0 release completed main merge, npm 0.3.0, a GitHub Release and hosted Docs as recorded above. The release maintainer performs external authentication and publication; documentation preparation does not itself execute those operations. The automatic verification workflow does not publish or deploy. Record native/manual observations with their actual scope and carry unrun checks as limitations; do not substitute automated WebKit/axe checks or publication authorization for human certification.
|
|
64
86
|
|
|
65
|
-
The
|
|
87
|
+
The procedure preserves the distinction between preparation and external verification. Use the intended version in place of `VERSION`; future releases require their own authorization and frozen source/archive:
|
|
66
88
|
|
|
67
89
|
1. Review the changelog, migration, dated verification and the [2026-10-02 native environment report](design/public-ui-release-validation.md). Its capability blockers leave all native/manual acceptance rows open and add no native component pass. Confirm maintained links, actual Storybook Docs/Usage and legal notices for the intended source. Record unresolved manual coverage without inventing passes.
|
|
68
|
-
2. Build and inspect a fresh archive with `npm pack --ignore-scripts --json --pack-destination /path/to/candidate`; preserve its SHA-256, file list and source revision outside the archive. Run boundary/relative-link checks and clean packed consumers
|
|
69
|
-
3. Check registry availability for `@naeil/ui@
|
|
90
|
+
2. Build and inspect a fresh archive with `npm pack --ignore-scripts --json --pack-destination /path/to/candidate`; preserve its SHA-256, file list and source revision outside the archive. Run boundary/relative-link checks and clean packed consumers with `NAEIL_UI_EXPECTED_ARCHIVE_SHA256` set to that digest; confirm both generated archives match the candidate.
|
|
91
|
+
3. Check registry availability for `@naeil/ui@VERSION` immediately before publication. Publish the verified candidate archive, then verify the registry version, integrity and dist-tag; a changelog or install command alone proves none of these.
|
|
70
92
|
4. Create the release tag/GitHub Release for the recorded source and retain version, artifact identity, validation scope and support limitations.
|
|
71
93
|
5. Publish the reviewed Storybook artifact through the manual Pages workflow below. Verify the actual hosted URL, subpath Docs-to-Usage navigation, fonts and notices over HTTP before reporting it live.
|
|
72
94
|
|
|
@@ -76,7 +98,7 @@ npm publication, GitHub Releases, main merge and hosted Docs are distinct operat
|
|
|
76
98
|
|
|
77
99
|
## Storybook preview artifact
|
|
78
100
|
|
|
79
|
-
`pnpm build:storybook` builds actual Docs pages and
|
|
101
|
+
`pnpm build:storybook` builds 17 actual Docs pages: 15 UI families (the 13 primitives plus Navigation and SiteFooter) and Brand / Logo and NaeilHeader. Interactive Usage examples include the complete branded header and its JapaneseApplication adapter. It copies generated documentation notices and approved canonical brand SVGs, bundles locally installed Pretendard/Noto Sans JP and disables Vite publicDir. The artifact check verifies real Docs/story entries, exact MIT/shadcn/font notices, brand references and absence of website public images/SVGs/HTML. It does not claim those excluded site assets have cleared rights.
|
|
80
102
|
|
|
81
103
|
CI uploads `storybook-preview` after a successful build; it is a downloadable static artifact, not a hosted deployment. Download/unzip it and serve the extracted directory (containing index.html):
|
|
82
104
|
|
|
@@ -86,11 +108,11 @@ pnpm preview:storybook
|
|
|
86
108
|
# Open http://127.0.0.1:6007 and choose UI / a family / Docs or Usage.
|
|
87
109
|
```
|
|
88
110
|
|
|
89
|
-
Run the command from this checkout after installing its dependencies. It serves the built or downloaded static artifact with persistent HTTP connections; a conventional static host works as well. Do not open iframe.html directly as a file; use HTTP. Preserve LICENSE, THIRD_PARTY_NOTICES.md and licenses/ with the artifact. The static preview needs no backend, credentials or external font server. Third-party dependency code also retains its own bundled/license notices.
|
|
111
|
+
Run the command from this checkout after installing its dependencies. It serves the built or downloaded static artifact with persistent HTTP connections; a conventional static host works as well. Do not open iframe.html directly as a file; use HTTP. Preserve LICENSE, THIRD_PARTY_NOTICES.md and licenses/ with the artifact. The static preview needs no backend, credentials or external font server. The whole-header decorative project images reference the official site and require network access; failed images retain usable text and destinations. Third-party dependency code also retains its own bundled/license notices.
|
|
90
112
|
|
|
91
113
|
### Authorized GitHub Pages publication
|
|
92
114
|
|
|
93
|
-
The public Docs destination [https://naeil-dev.github.io/naeil-ui/](https://naeil-dev.github.io/naeil-ui/)
|
|
115
|
+
The public Docs destination [https://naeil-dev.github.io/naeil-ui/](https://naeil-dev.github.io/naeil-ui/) serves source `e8fe5afc13788a0cac0244b72e78975812f4a2ee` following the 2026-10-11 [Pages run 38114879574](https://github.com/naeil-dev/naeil-ui/actions/runs/38114879574). The [0.4.0 release](https://github.com/naeil-dev/naeil-ui/releases/tag/v0.4.0) records deployed source and hosted HTTP/navigation checks; the 0.3.0 deployment above remains history. Pages uses `build_type=workflow` and a **github-pages** main-only deployment branch policy. See [Docs workflow status](https://github.com/naeil-dev/naeil-ui/actions/workflows/publish-docs-manual.yml) for subsequent deployments; preview artifact checks above establish local artifact behavior only.
|
|
94
116
|
|
|
95
117
|
`.github/workflows/publish-docs-manual.yml` is an explicit `workflow_dispatch` recipe with no PR/push trigger. Pages is configured to use **GitHub Actions**; the **github-pages** environment permits deployment from main only. Run the authorized workflow from main with the exact reviewed source SHA; configuration alone does not establish a successful deployment. The workflow file does not enable Pages itself. A default-branch merge can separately invoke the brand site's existing Vercel integration; that production deployment and its asset/font provenance require separate handling.
|
|
96
118
|
|
|
@@ -101,7 +123,7 @@ Select **Publish reviewed UI docs (manual only)** in Actions (or use the command
|
|
|
101
123
|
gh workflow run publish-docs-manual.yml -f reviewed_sha=FULL_REVIEWED_COMMIT_SHA -f confirmation=PUBLISH_REVIEWED_DOCS
|
|
102
124
|
```
|
|
103
125
|
|
|
104
|
-
After deployment, verify the manager and iframe under `/naeil-ui/`, all
|
|
126
|
+
After a 0.5.0 deployment, verify the manager and iframe under `/naeil-ui/`, all 15 UI and 2 Brand Docs pages, their Usage examples and NaeilHeader JapaneseApplication, canonical artwork and official image references, Docs links, local fonts and exact LICENSE/THIRD_PARTY_NOTICES/font notices. Retain the deployment URL, source SHA and observed HTTP/navigation results. Hosted Storybook uses simulated data and requires no Supabase project, design API key or external font server. Only the reviewed Storybook directory is uploaded; website public assets stay excluded.
|
|
105
127
|
|
|
106
128
|
Normal builds are network-independent after dependency installation. Vite collects notices for actual preview modules; checked-in manager notices conservatively cover named embedded packages and versions from Storybook 10.4.6's original source lock. `check-storybook` fails if a named embedded module lacks a full notice. Four vendored tiny modules have no embedded version in that lock/comments; their original npm notice source is explicitly marked, without an exact-version claim. The exact use-composed-ref@1.4.0 tarball/repository provides MIT metadata but no standalone notice; its metadata plus full declared terms are retained without inventing a year/holder. The client-only@0.0.1 React marker retains its exact metadata and the original React MIT notice. Other missing notices fail the build; no generic MIT fallback passes arbitrary packages.
|
|
107
129
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@naeil/ui",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"sideEffects": [
|
|
@@ -125,6 +125,18 @@
|
|
|
125
125
|
"./components/ui/textarea": {
|
|
126
126
|
"types": "./dist/source/components/ui/textarea.d.ts",
|
|
127
127
|
"import": "./dist/source/components/ui/textarea.js"
|
|
128
|
+
},
|
|
129
|
+
"./components/ui/navigation": {
|
|
130
|
+
"types": "./dist/source/components/ui/navigation.d.ts",
|
|
131
|
+
"import": "./dist/source/components/ui/navigation.js"
|
|
132
|
+
},
|
|
133
|
+
"./components/ui/site-footer": {
|
|
134
|
+
"types": "./dist/source/components/ui/site-footer.d.ts",
|
|
135
|
+
"import": "./dist/source/components/ui/site-footer.js"
|
|
136
|
+
},
|
|
137
|
+
"./naeil-header": {
|
|
138
|
+
"types": "./dist/components/naeil-header.d.ts",
|
|
139
|
+
"import": "./dist/components/naeil-header.js"
|
|
128
140
|
}
|
|
129
141
|
},
|
|
130
142
|
"scripts": {
|
|
@@ -1,4 +1,296 @@
|
|
|
1
1
|
@layer components {
|
|
2
|
+
.ui-navigation {
|
|
3
|
+
position: relative;
|
|
4
|
+
z-index: 40;
|
|
5
|
+
color: var(--foreground);
|
|
6
|
+
background: var(--background);
|
|
7
|
+
border-bottom: 1px solid var(--border);
|
|
8
|
+
}
|
|
9
|
+
/* Branded website chrome is an opt-in composition, independent of app content widths. */
|
|
10
|
+
.naeil-header {
|
|
11
|
+
position: fixed;
|
|
12
|
+
inset-block-start: 0;
|
|
13
|
+
inset-inline: 0;
|
|
14
|
+
width: 100%;
|
|
15
|
+
}
|
|
16
|
+
.naeil-header-frame {
|
|
17
|
+
max-width: 80rem;
|
|
18
|
+
}
|
|
19
|
+
.naeil-header-controls {
|
|
20
|
+
display: flex;
|
|
21
|
+
align-items: center;
|
|
22
|
+
gap: var(--spacing-2-value);
|
|
23
|
+
}
|
|
24
|
+
.ui-navigation-mobile-toolbar > .naeil-header-controls {
|
|
25
|
+
flex-wrap: wrap;
|
|
26
|
+
gap: var(--spacing-4-value);
|
|
27
|
+
}
|
|
28
|
+
.naeil-header-separator {
|
|
29
|
+
flex: none;
|
|
30
|
+
width: 1px;
|
|
31
|
+
height: var(--spacing-4-value);
|
|
32
|
+
background: var(--border);
|
|
33
|
+
}
|
|
34
|
+
.naeil-header-project-icon {
|
|
35
|
+
display: flex;
|
|
36
|
+
align-items: center;
|
|
37
|
+
justify-content: center;
|
|
38
|
+
width: var(--ui-control-height);
|
|
39
|
+
height: var(--ui-control-height);
|
|
40
|
+
border: 1px solid;
|
|
41
|
+
border-radius: var(--radius-lg-value);
|
|
42
|
+
}
|
|
43
|
+
.ui-navigation-frame,
|
|
44
|
+
.ui-site-footer-frame {
|
|
45
|
+
width: 100%;
|
|
46
|
+
margin-inline: auto;
|
|
47
|
+
padding-inline: var(--spacing-6-value);
|
|
48
|
+
}
|
|
49
|
+
.ui-navigation-frame {
|
|
50
|
+
container-type: inline-size;
|
|
51
|
+
}
|
|
52
|
+
.ui-navigation-row {
|
|
53
|
+
display: flex;
|
|
54
|
+
align-items: center;
|
|
55
|
+
gap: var(--spacing-4-value);
|
|
56
|
+
min-height: var(--ui-navigation-height);
|
|
57
|
+
padding-block: var(--spacing-2-value);
|
|
58
|
+
}
|
|
59
|
+
.ui-navigation-brand {
|
|
60
|
+
flex-shrink: 0;
|
|
61
|
+
}
|
|
62
|
+
.ui-navigation-brand a {
|
|
63
|
+
display: inline-flex;
|
|
64
|
+
align-items: center;
|
|
65
|
+
min-height: var(--ui-touch-target);
|
|
66
|
+
}
|
|
67
|
+
.ui-navigation-brand a:focus-visible {
|
|
68
|
+
outline: 2px solid var(--ring);
|
|
69
|
+
outline-offset: 3px;
|
|
70
|
+
}
|
|
71
|
+
.ui-navigation-desktop,
|
|
72
|
+
.ui-navigation-toolbar {
|
|
73
|
+
display: none;
|
|
74
|
+
align-items: center;
|
|
75
|
+
gap: var(--spacing-2-value);
|
|
76
|
+
}
|
|
77
|
+
.ui-navigation-toolbar {
|
|
78
|
+
margin-inline-start: auto;
|
|
79
|
+
}
|
|
80
|
+
.ui-navigation-link {
|
|
81
|
+
display: flex;
|
|
82
|
+
align-items: center;
|
|
83
|
+
gap: var(--spacing-2-value);
|
|
84
|
+
min-height: var(--ui-touch-target);
|
|
85
|
+
min-width: var(--ui-touch-target);
|
|
86
|
+
padding: var(--spacing-2-value) var(--spacing-3-value);
|
|
87
|
+
border-radius: var(--radius-md-value);
|
|
88
|
+
color: var(--foreground);
|
|
89
|
+
font-size: var(--text-base);
|
|
90
|
+
line-height: var(--leading-normal);
|
|
91
|
+
text-align: start;
|
|
92
|
+
text-decoration: none;
|
|
93
|
+
overflow-wrap: anywhere;
|
|
94
|
+
transition: background-color var(--ui-motion-fast);
|
|
95
|
+
}
|
|
96
|
+
.ui-navigation-link:hover {
|
|
97
|
+
background: var(--surface-subtle);
|
|
98
|
+
}
|
|
99
|
+
.ui-navigation-link[aria-current="page"],
|
|
100
|
+
.ui-navigation-link[data-active],
|
|
101
|
+
.ui-navigation-link[data-state="open"] {
|
|
102
|
+
background: var(--surface-selected);
|
|
103
|
+
}
|
|
104
|
+
.ui-navigation-link[aria-current="page"] {
|
|
105
|
+
text-decoration: underline;
|
|
106
|
+
text-underline-offset: 4px;
|
|
107
|
+
}
|
|
108
|
+
.ui-navigation-entry {
|
|
109
|
+
align-items: flex-start;
|
|
110
|
+
gap: var(--spacing-4-value);
|
|
111
|
+
min-height: var(--ui-row-height);
|
|
112
|
+
padding: var(--spacing-3-value);
|
|
113
|
+
}
|
|
114
|
+
.ui-navigation-entry[aria-current="page"] {
|
|
115
|
+
text-decoration: none;
|
|
116
|
+
}
|
|
117
|
+
.ui-navigation-entry[aria-current="page"] .ui-navigation-title {
|
|
118
|
+
font-weight: 600;
|
|
119
|
+
}
|
|
120
|
+
.ui-navigation-title {
|
|
121
|
+
display: flex;
|
|
122
|
+
align-items: center;
|
|
123
|
+
flex-wrap: wrap;
|
|
124
|
+
gap: var(--spacing-2-value);
|
|
125
|
+
font-weight: 500;
|
|
126
|
+
}
|
|
127
|
+
.ui-navigation-copy {
|
|
128
|
+
display: flex;
|
|
129
|
+
flex-direction: column;
|
|
130
|
+
min-width: 0;
|
|
131
|
+
gap: var(--spacing-1-value);
|
|
132
|
+
}
|
|
133
|
+
.ui-navigation-icon {
|
|
134
|
+
flex-shrink: 0;
|
|
135
|
+
}
|
|
136
|
+
.ui-navigation-entry .ui-navigation-icon {
|
|
137
|
+
display: flex;
|
|
138
|
+
align-items: center;
|
|
139
|
+
justify-content: center;
|
|
140
|
+
width: var(--ui-control-height);
|
|
141
|
+
min-height: var(--ui-control-height);
|
|
142
|
+
}
|
|
143
|
+
.ui-navigation-description {
|
|
144
|
+
color: var(--muted-foreground);
|
|
145
|
+
font-size: var(--text-sm);
|
|
146
|
+
}
|
|
147
|
+
.ui-navigation-toggle {
|
|
148
|
+
margin-inline-start: auto;
|
|
149
|
+
justify-content: center;
|
|
150
|
+
}
|
|
151
|
+
.ui-navigation-popover {
|
|
152
|
+
z-index: 50;
|
|
153
|
+
width: var(--ui-navigation-menu-width);
|
|
154
|
+
max-width: min(
|
|
155
|
+
var(--radix-popover-content-available-width),
|
|
156
|
+
calc(100vw - 2 * var(--spacing-4-value))
|
|
157
|
+
);
|
|
158
|
+
max-height: var(--radix-popover-content-available-height);
|
|
159
|
+
overflow-y: auto;
|
|
160
|
+
padding: var(--spacing-4-value);
|
|
161
|
+
color: var(--popover-foreground);
|
|
162
|
+
background: var(--popover);
|
|
163
|
+
border: 1px solid var(--border-strong);
|
|
164
|
+
border-radius: var(--radius-lg-value);
|
|
165
|
+
box-shadow: var(--shadow-md);
|
|
166
|
+
}
|
|
167
|
+
.ui-navigation-popover[data-columns="2"] {
|
|
168
|
+
width: var(--ui-navigation-menu-wide-width);
|
|
169
|
+
}
|
|
170
|
+
.ui-navigation-menu-grid {
|
|
171
|
+
display: grid;
|
|
172
|
+
gap: var(--spacing-2-value);
|
|
173
|
+
}
|
|
174
|
+
.ui-navigation-popover[data-columns="2"] .ui-navigation-menu-grid {
|
|
175
|
+
grid-template-columns: repeat(2, minmax(0, 1fr));
|
|
176
|
+
}
|
|
177
|
+
.ui-navigation-overlay {
|
|
178
|
+
position: fixed;
|
|
179
|
+
inset: 0;
|
|
180
|
+
z-index: 50;
|
|
181
|
+
background: rgb(0 0 0 / 0.6);
|
|
182
|
+
}
|
|
183
|
+
.ui-navigation-sheet {
|
|
184
|
+
position: fixed;
|
|
185
|
+
inset: 0 0 0 auto;
|
|
186
|
+
z-index: 50;
|
|
187
|
+
display: flex;
|
|
188
|
+
flex-direction: column;
|
|
189
|
+
gap: var(--spacing-6-value);
|
|
190
|
+
width: min(100%, var(--ui-width-short-form));
|
|
191
|
+
padding: var(--spacing-6-value);
|
|
192
|
+
overflow-y: auto;
|
|
193
|
+
overscroll-behavior: contain;
|
|
194
|
+
background: var(--background);
|
|
195
|
+
color: var(--foreground);
|
|
196
|
+
}
|
|
197
|
+
.ui-navigation-sheet-heading {
|
|
198
|
+
display: flex;
|
|
199
|
+
align-items: center;
|
|
200
|
+
justify-content: space-between;
|
|
201
|
+
gap: var(--spacing-4-value);
|
|
202
|
+
}
|
|
203
|
+
.ui-navigation-mobile-links {
|
|
204
|
+
display: grid;
|
|
205
|
+
gap: var(--spacing-4-value);
|
|
206
|
+
}
|
|
207
|
+
.ui-navigation-group-label {
|
|
208
|
+
padding: var(--spacing-2-value) var(--spacing-3-value);
|
|
209
|
+
font-size: var(--text-sm);
|
|
210
|
+
font-weight: 600;
|
|
211
|
+
}
|
|
212
|
+
.ui-navigation-mobile-toolbar {
|
|
213
|
+
display: flex;
|
|
214
|
+
flex-wrap: wrap;
|
|
215
|
+
align-items: center;
|
|
216
|
+
gap: var(--spacing-4-value);
|
|
217
|
+
border-top: 1px solid var(--border);
|
|
218
|
+
padding-top: var(--spacing-4-value);
|
|
219
|
+
}
|
|
220
|
+
.ui-navigation-mobile-footer {
|
|
221
|
+
margin-top: auto;
|
|
222
|
+
padding-top: var(--spacing-4-value);
|
|
223
|
+
}
|
|
224
|
+
@container (min-width: 48rem) {
|
|
225
|
+
.ui-navigation-brand {
|
|
226
|
+
width: var(--ui-navigation-brand-width);
|
|
227
|
+
}
|
|
228
|
+
.ui-navigation-desktop,
|
|
229
|
+
.ui-navigation-toolbar {
|
|
230
|
+
display: flex;
|
|
231
|
+
flex-wrap: wrap;
|
|
232
|
+
}
|
|
233
|
+
.ui-navigation-toggle {
|
|
234
|
+
display: none;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
.ui-site-footer {
|
|
238
|
+
border-top: 1px solid var(--border);
|
|
239
|
+
color: var(--foreground);
|
|
240
|
+
background: var(--background);
|
|
241
|
+
}
|
|
242
|
+
.ui-site-footer-frame {
|
|
243
|
+
display: flex;
|
|
244
|
+
flex-wrap: wrap;
|
|
245
|
+
align-items: flex-start;
|
|
246
|
+
gap: var(--spacing-8-value);
|
|
247
|
+
padding-block: var(--spacing-8-value);
|
|
248
|
+
}
|
|
249
|
+
.ui-site-footer-brand {
|
|
250
|
+
display: grid;
|
|
251
|
+
gap: var(--spacing-4-value);
|
|
252
|
+
margin-inline-end: auto;
|
|
253
|
+
}
|
|
254
|
+
.ui-site-footer-description {
|
|
255
|
+
max-width: var(--ui-width-short-form);
|
|
256
|
+
color: var(--muted-foreground);
|
|
257
|
+
font-size: var(--text-sm);
|
|
258
|
+
}
|
|
259
|
+
.ui-site-footer-label {
|
|
260
|
+
font-size: var(--text-sm);
|
|
261
|
+
font-weight: 600;
|
|
262
|
+
margin-bottom: var(--spacing-2-value);
|
|
263
|
+
}
|
|
264
|
+
.ui-site-footer-link {
|
|
265
|
+
display: flex;
|
|
266
|
+
align-items: center;
|
|
267
|
+
min-height: var(--ui-touch-target);
|
|
268
|
+
color: var(--muted-foreground);
|
|
269
|
+
font-size: var(--text-sm);
|
|
270
|
+
text-decoration: none;
|
|
271
|
+
}
|
|
272
|
+
.ui-site-footer-link:hover {
|
|
273
|
+
color: var(--foreground);
|
|
274
|
+
text-decoration: underline;
|
|
275
|
+
}
|
|
276
|
+
.ui-site-footer-meta {
|
|
277
|
+
width: 100%;
|
|
278
|
+
font-size: var(--text-sm);
|
|
279
|
+
color: var(--muted-foreground);
|
|
280
|
+
}
|
|
281
|
+
.ui-site-footer[data-variant="compact"] .ui-site-footer-frame {
|
|
282
|
+
align-items: center;
|
|
283
|
+
padding-block: var(--spacing-4-value);
|
|
284
|
+
gap: var(--spacing-4-value);
|
|
285
|
+
}
|
|
286
|
+
.ui-site-footer[data-variant="compact"] .ui-site-footer-meta {
|
|
287
|
+
width: auto;
|
|
288
|
+
}
|
|
289
|
+
@media (prefers-reduced-motion: reduce) {
|
|
290
|
+
.ui-navigation-link {
|
|
291
|
+
transition: none;
|
|
292
|
+
}
|
|
293
|
+
}
|
|
2
294
|
.ui-textarea {
|
|
3
295
|
min-height: var(--ui-control-height);
|
|
4
296
|
font-size: var(--text-base);
|
package/src/styles/theme.css
CHANGED
|
@@ -156,6 +156,10 @@
|
|
|
156
156
|
--ui-width-short-form: 480px;
|
|
157
157
|
--ui-motion-fast: 120ms;
|
|
158
158
|
--ui-motion-standard: 180ms;
|
|
159
|
+
--ui-navigation-height: 64px;
|
|
160
|
+
--ui-navigation-brand-width: 160px;
|
|
161
|
+
--ui-navigation-menu-width: 320px;
|
|
162
|
+
--ui-navigation-menu-wide-width: 640px;
|
|
159
163
|
--project-cc: oklch(0.704 0.140 181);
|
|
160
164
|
--project-sa: oklch(0.723 0.219 149);
|
|
161
165
|
--project-pkm: oklch(0.627 0.265 303);
|