@naeil/ui 0.4.0 → 0.6.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 +19 -1
- package/DESIGN.md +24 -1
- package/README.md +25 -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-VL7FS4QM.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 +74 -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 +8 -1
- package/docs/components/application-layout.md +102 -0
- package/docs/components/common.md +2 -2
- package/docs/components/naeil-header.md +50 -0
- package/docs/components/navigation.md +57 -0
- package/docs/design/public-ui-support.md +14 -1
- package/docs/design/v2-migration.md +59 -26
- package/docs/package-release.md +40 -14
- package/package.json +13 -1
- package/src/styles/components.css +292 -0
- package/src/styles/theme.css +7 -1
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Navigation and SiteFooter
|
|
2
|
+
|
|
3
|
+
This guide targets the **@naeil/ui 0.6.0**; release identities and publication evidence are recorded in the [release record](https://github.com/naeil-dev/naeil-ui/releases/tag/v0.6.0). These are generic product-menu primitives. Applications inheriting the actual naeil.dev brand/catalog/control composition use the canonical opt-in [NaeilHeader](naeil-header.md) from `@naeil/ui/naeil-header`, with fixed positioning, a 65px height, the shared application frame and official artwork URL dependency.
|
|
4
|
+
|
|
5
|
+
`Navigation` and `SiteFooter` are React-only exports from `@naeil/ui/ui` (also `@naeil/ui/components/ui/navigation` and `@naeil/ui/components/ui/site-footer`). They require shared theme/components CSS and the normal consumer font/Tailwind setup. They do not import Next, next-intl, authentication, product routes or message dictionaries.
|
|
6
|
+
|
|
7
|
+
```tsx
|
|
8
|
+
import { Navigation, SiteFooter } from "@naeil/ui/ui";
|
|
9
|
+
|
|
10
|
+
<Navigation
|
|
11
|
+
brand={<a href="/">My product</a>}
|
|
12
|
+
labels={{ navigation: "Main navigation", menu: "Menu", close: "Close menu" }}
|
|
13
|
+
items={[{ id: "ai", label: "AI", items: [
|
|
14
|
+
{ id: "dashboard", label: "Dashboard", href: "/", description: "Usage and balance" },
|
|
15
|
+
{ id: "keys", label: "API keys", href: "/keys" },
|
|
16
|
+
] }]}
|
|
17
|
+
currentHref={pathname}
|
|
18
|
+
toolbar={<ProductControls />}
|
|
19
|
+
onNavigate={(event, item) => {
|
|
20
|
+
if (event.button !== 0 || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return;
|
|
21
|
+
event.preventDefault();
|
|
22
|
+
guardedNavigate(item.href);
|
|
23
|
+
}}
|
|
24
|
+
/>
|
|
25
|
+
<main className="ui-app-frame">
|
|
26
|
+
<section data-ui-layout="settings">{/* narrow form inside stable frame */}</section>
|
|
27
|
+
</main>
|
|
28
|
+
<SiteFooter
|
|
29
|
+
brand={<ProductBrand />}
|
|
30
|
+
variant="compact"
|
|
31
|
+
meta="Product information"
|
|
32
|
+
/>
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
These are composition snippets: `pathname`, controls, brand and `guardedNavigate` belong to the application. Keep its unsaved-change guard and modified-click behavior. Alternatively supply a `Link` adapter which forwards anchor props, `onClick`, `aria-current`, `className`, target and children. Links explicitly marked `external: true` render native anchors; an absolute URL alone does not bypass the supplied `Link`. `active` overrides exact `currentHref` matching when a route family needs custom matching.
|
|
36
|
+
|
|
37
|
+
`Navigation` accepts links and one level of labeled groups, optional description/icon/badge, `toolbar`, `mobileToolbar` and `mobileFooter`. Brand is a slot; the component does not invent a home destination or label. Groups use Radix Popover with actual links (Tab navigation, Escape and focus return); they are not action menus. Mobile uses a modal Radix Dialog with scroll locking, trapped focus and a labeled close control. The sheet closes on destination selection, currentHref changes or a return to desktop.
|
|
38
|
+
|
|
39
|
+
Desktop groups open on mouse hover without moving keyboard focus. Leaving both the trigger and panel closes the hover preview after the standard 180ms token duration, allowing travel across the portal gap. Entering the panel cancels the pending close. Mouse clicks keep the menu open while the pointer remains in the trigger/panel and do not pin it: leaving still dismisses it. Keyboard-activating a hovered trigger takes over the open menu and focuses its first link; subsequent keyboard activation, Escape, outside interaction or navigation dismisses it. A menu being used with keyboard focus remains open when the pointer leaves. Mouse dismissal preserves the previous focus; keyboard activation retains Radix focus return. Touch uses click/tap, and the mobile sheet behavior is unchanged. Reduced motion disables visual transitions while retaining pointer travel tolerance.
|
|
40
|
+
|
|
41
|
+
Container queries select desktop layout at 48rem of available header content width. Navigation, main and footer share a maximum 1600px outer frame and `clamp(16px, 2.4vw, 40px)` gutters by default. Use `ui-app-frame` on main; do not wrap Navigation or SiteFooter in another padded frame. Reading/settings sections inside main retain their 640px cap. The [application layout guide](application-layout.md) covers composition and consistent root token overrides. Header height uses `ui.navigation-height` (64px); toolbar controls should remain short, with volatile counts in the content area. Navigation itself is in document flow; `className` can make it sticky or fixed. Fixed consumers must reserve its height in page composition. A narrow form must not constrain the header. Explicit className/style remain consumer overrides.
|
|
42
|
+
|
|
43
|
+
`SiteFooter` supports `brand`, `description`, `groups: [{ id, label, links }]`, `meta`, children, `Link`, `containerClassName` and `variant="full|compact"`. Each link group is a labeled navigation landmark. Translated titles, destinations, legal/version text and social links belong to the consumer. A product may place a compact footer in its mobile sheet; a full marketing footer is not mandatory in a dashboard.
|
|
44
|
+
|
|
45
|
+
Desktop reserves `ui.navigation-brand-width` (160px) for the brand, followed by the existing 16px row gap. With matching frame, viewport and font conditions, `.naeil` and `.naeil Home` therefore start their first menu at the same position. Mobile keeps intrinsic brand width. For a larger custom brand, override `--ui-navigation-brand-width` on the header or shared product frame; use the same value across related compositions and ensure the brand fits the reserved area.
|
|
46
|
+
|
|
47
|
+
## Compatibility
|
|
48
|
+
|
|
49
|
+
Menu groups accept `columns?: 1 | 2` (default 1). The candidate sample uses 2 for the website project catalog and 1 for Home's functional menu; the mobile sheet remains one column. Menu widths use `ui.navigation-menu-width` (320px) and `ui.navigation-menu-wide-width` (640px), capped by available space. Group links share a 40px icon area, 16px icon-to-copy gap, title/description hierarchy and badges beside the title. Supply decorated brand artwork through `icon`; the shared package does not own product illustrations. Current group links use background, semibold title and a check indicator, retaining `aria-current` and keyboard focus without underlining descriptions.
|
|
50
|
+
|
|
51
|
+
Existing `Nav` and `Footer` imports and props remain. `Nav` adapts the canonical NaeilHeader, which renders this generic core; `Footer` composes SiteFooter. `Nav` retains its fixed positioning and uses the shared 1600px application frame; menus gain keyboard/focus support, an opaque shared surface, 16px labels and a 64px minimum row. Its `projects` prop replaces the old default inventory; the old naeil projects remain the fallback for existing consumers. Optional `labels`, `className` and `containerClassName` support localization and frame overrides. Remove old `max-w-7xl` or `px-6` frame overrides to adopt the new defaults.
|
|
52
|
+
|
|
53
|
+
`Footer` adds `brandSlot`, `description`, `groups`, `socialSlot`, `meta`, `variant`, `className` and `containerClassName`. Use empty groups or null description/socialSlot to omit defaults. Existing linksExternal behavior remains for the default naeil links. Custom groups define their own absolute destinations and external/target settings.
|
|
54
|
+
|
|
55
|
+
`Nav`/`Footer` continue to need Next/next-intl as documented. React-only services use this core for their own product menus or `/naeil-header` for the canonical branded composition. ThemeProvider, ThemeToggleIcon, LocaleSwitcher and Logo remain available through their existing React-safe deep imports. Reusing controls does not synchronize theme/language/authentication between origins.
|
|
56
|
+
|
|
57
|
+
Storybook: `UI/Navigation` (website, Home composition, long labels), `UI/SiteFooter` (full and compact). Naeil Home is a synthetic composition based on the inspected live menu, not proof of a deployed migration. The repository task note `docs/design/navigation-footer-integration.md` tracks rollout; it is not included in the npm package.
|
|
@@ -1,6 +1,19 @@
|
|
|
1
1
|
# Public UI support and manual acceptance
|
|
2
2
|
|
|
3
|
-
This support matrix targets published `@naeil/ui@0.
|
|
3
|
+
This support matrix targets published `@naeil/ui@0.4.0` (2026-10-11); the [release](https://github.com/naeil-dev/naeil-ui/releases/tag/v0.4.0) and [publication report](https://github.com/naeil-dev/naeil-ui/blob/main/docs/design/naeil-brand-0.4.0-publication.md) identify its source, npm archive, independent brand 1.1.1 and deployed Docs/site. Current documentation covers 13 component families plus Brand / Logo. Coverage describes the checked examples and dependency versions; native/manual acceptance remains open.
|
|
4
|
+
|
|
5
|
+
## 0.4.0 publication coverage
|
|
6
|
+
|
|
7
|
+
- Source `e8fe5afc13788a0cac0244b72e78975812f4a2ee`: 46 local unit tests passed. [Merged Linux CI](https://github.com/naeil-dev/naeil-ui/actions/runs/38113742370) passed package/site checks and 233 browser tests with 4 expected forced-colors skips; the [Docs deployment workflow](https://github.com/naeil-dev/naeil-ui/actions/runs/38114879574) also passed that browser suite.
|
|
8
|
+
- [Registry/consumer receipt](https://github.com/naeil-dev/naeil-ui/releases/download/v0.4.0/npm-publication-verification.json): fresh actual npm installs with separate empty caches passed React/Next types and production builds, SSR/deep imports, exact notices, production fonts/fallback, mixed-import ownership/StrictMode and Chromium/WebKit Tabs/Textarea contracts. The React fixture contains no Next dependency. Fixtures do not establish real-product adoption.
|
|
9
|
+
- [Hosted Docs receipt](https://github.com/naeil-dev/naeil-ui/releases/download/v0.4.0/hosted-docs-verification.json): Chromium 153.0.8010.12 and Playwright WebKit 26.6 passed 28 Docs visits, 28 actual Docs-to-Usage transitions, 4 brand light/dark checks, canonical artwork, exact notices, local fonts and pinned links at the deployed `/naeil-ui/` URL.
|
|
10
|
+
- [Production receipt](https://github.com/naeil-dev/naeil-ui/releases/download/v0.4.0/production-verification.json): the same engines passed 24 homepage/login conditions across three locales, two viewport sizes and two themes; header/footer/login logos, mobile menu and 3 deployed icons were checked. These observations cover page rendering and navigation; full OAuth authentication was not exercised.
|
|
11
|
+
|
|
12
|
+
The environment matrix below retains dated foundation coverage. The 0.4.0 checks above add evidence for their exact source and do not close the native/manual items below.
|
|
13
|
+
|
|
14
|
+
## Foundation evidence — 0.3.0
|
|
15
|
+
|
|
16
|
+
Version 0.3.0 was published on 2026-10-03; its [registry/consumer receipt](https://github.com/naeil-dev/naeil-ui/releases/download/v0.3.0/npm-publication-verification.json) and [release](https://github.com/naeil-dev/naeil-ui/releases/tag/v0.3.0) remain historical evidence. [Dated Stage 3 results](public-ui-stage3-verification.md) identify commands, source hashes and local limitations. [Stage 4 extension results](public-ui-stage4-verification.md) separately cover Tabs/Textarea and native field/choice composition.
|
|
4
17
|
|
|
5
18
|
Linux CI at `bcf99fca3467ae2b1cd29d54fa24f2569fb6001c` passed package-and-site in both the [push run](https://github.com/naeil-dev/naeil-ui/actions/runs/36945564443) and [PR run](https://github.com/naeil-dev/naeil-ui/actions/runs/36945943651). Their browser jobs failed: respectively 207 passed/4 skipped/2 failed (axe scan collision and Avatar Docs ambiguity), and 208 passed/4 skipped/1 failed (Avatar Docs ambiguity). Firefox application tests passed in both Linux runs. These failed baseline results remain historical evidence in the [final correction follow-up](public-ui-final-verification.md).
|
|
6
19
|
|
|
@@ -2,22 +2,21 @@
|
|
|
2
2
|
|
|
3
3
|
이 안내는 `@naeil/ui`의 기본 모양과 재사용 규칙을 설명한다. 패키지 소비와 소비 사이트 배포는 별도 작업이다.
|
|
4
4
|
|
|
5
|
-
이 안내는 **@naeil/ui 0.
|
|
5
|
+
이 안내는 **@naeil/ui 0.6.0**의 CSS·API·패키지 경계를 대상으로 한다. UI v2는 디자인 세대 이름이며 npm 2.0을 뜻하지 않는다. 소스·archive와 실제 게시·배포 결과는 [릴리스 기록](https://github.com/naeil-dev/naeil-ui/releases/tag/v0.6.0)에서 구분한다. 이전 0.5.0은 2026-10-15에 게시되었으며, 이번 버전에서 공통 1600px 프레임과 적용 규칙을 추가한다.
|
|
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는 필요 없다.
|
|
10
10
|
|
|
11
11
|
```sh
|
|
12
|
-
pnpm add --save-exact @naeil/ui@0.
|
|
13
|
-
# npm install --save-exact @naeil/ui@0.4.0
|
|
12
|
+
pnpm add --save-exact @naeil/ui@0.6.0
|
|
14
13
|
```
|
|
15
14
|
|
|
16
|
-
|
|
15
|
+
로컬 후보를 검증할 때는 저장소에서 `pnpm build:pkg`와 `npm pack --ignore-scripts --pack-destination /tmp`를 실행하고 `/tmp/naeil-ui-0.6.0.tgz`를 설치한다. [독립 React 예제](https://github.com/naeil-dev/naeil-ui/tree/main/examples/react)와 [검증/릴리스 정책](../package-release.md)을 참고한다.
|
|
17
16
|
|
|
18
17
|
공통 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
18
|
|
|
20
|
-
버전을 생략한 설치는 registry의 latest 태그를 따른다. 이 안내와 동일한 경계를 사용하려면 0.
|
|
19
|
+
버전을 생략한 설치는 registry의 latest 태그를 따른다. 이 안내와 동일한 경계를 사용하려면 0.6.0을 명시하거나 같은 버전의 검증된 로컬 archive를 사용한다. 업그레이드 전에 [변경 기록](../../CHANGELOG.md)을 확인한다.
|
|
21
20
|
|
|
22
21
|
Tailwind 4를 사용하는 앱의 전역 CSS에서 공통 스타일을 한 번 불러온다.
|
|
23
22
|
|
|
@@ -51,39 +50,71 @@ Select는 값 선택, DropdownMenu는 행동 선택에 사용한다. Switch와 C
|
|
|
51
50
|
- 본문·입력·버튼 16px, 보조 14px, 메타정보 13px. 작은 화면에서도 입력 글씨를 줄이지 않는다.
|
|
52
51
|
- 기본 컨트롤 높이 40px. 문서 루트에 `data-ui-density="compact"`를 주면 36px가 된다. 작은 화면과 거친 포인터에서는 최소 44px를 유지한다. 데스크톱에서 `className="h-8"` 같은 높이 재정의는 적용되며, 모바일의 44px 최소 터치 크기는 유지된다.
|
|
53
52
|
- `.light`/`.dark`는 OS 테마보다 우선한다. 기존 ThemeProvider를 사용할 수 있다.
|
|
54
|
-
-
|
|
53
|
+
- 공통 바깥 틀은 최대 1600px, 좌우 여백은 `clamp(16px, 2.4vw, 40px)`다. 본문의 `.ui-app-frame`과 공통 헤더·푸터 내부 프레임이 같은 토큰을 사용한다.
|
|
54
|
+
- `data-ui-layout="reading|settings|list|short-form|fluid"`로 내부 콘텐츠 폭을 적용한다. 각각 최대 640/640/1600/480px 또는 가용 폭이다. 목록은 바깥 틀의 여백을 제외한 공간을 사용하고, 설정·읽기 영역은 그 안에서 좁게 유지한다.
|
|
55
55
|
- 레이블·도움말·오류 문구는 소비 화면이 연결한다. Input의 `aria-invalid`와 `aria-describedby`를 사용하고, 로딩 중에는 Button의 `disabled`와 `aria-busy`를 함께 지정한다.
|
|
56
56
|
- 성공·경고·오류·안내에는 Badge의 `success`, `warning`, `error`, `info` variant를 사용할 수 있다. 색만으로 의미를 전달하지 않는다.
|
|
57
57
|
|
|
58
|
+
## 브라우저 탭 제목과 파비콘
|
|
59
|
+
|
|
60
|
+
2026-10-13 승인한 공통 브랜드·콘텐츠 규칙이며, 2026-10-14 사용자 요청으로 naeil.dev의 서비스명을 `.naeil`로 통일했다. 기준은 [DESIGN.md의 Browser identity](../../DESIGN.md#browser-identity--tab-title-and-favicon)이며, 브라우저 탭의 글꼴·크기는 브라우저가 결정한다.
|
|
61
|
+
|
|
62
|
+
| 화면 | 탭 제목 예시 |
|
|
63
|
+
| --- | --- |
|
|
64
|
+
| naeil.dev 홈 | `.naeil` |
|
|
65
|
+
| Home 홈/소개 화면 | `Naeil Home` |
|
|
66
|
+
| Home 대시보드 | `대시보드 — Naeil Home` |
|
|
67
|
+
| Home API 키 관리 | `API 키 — Naeil Home` |
|
|
68
|
+
| naeil.dev 프로젝트 목록 | `프로젝트 — .naeil` |
|
|
69
|
+
| Home 영문 대시보드 | `Dashboard — Naeil Home` |
|
|
70
|
+
|
|
71
|
+
- 이름이 있는 페이지는 `페이지 이름 — 서비스 이름`으로 작성한다. 구분자는 양옆 공백이 있는 em dash(` — `)이며, 서비스 이름은 한 번만 붙인다.
|
|
72
|
+
- 서비스 홈/소개 화면은 서비스 이름만 사용할 수 있다. 대시보드처럼 이름이 있는 업무 화면은 첫 진입 경로이더라도 페이지 이름을 포함한다.
|
|
73
|
+
- 서비스 이름은 naeil.dev의 경우 `.naeil`, Home의 경우 `Naeil Home`으로 고정한다. 앞의 마침표까지 공식 이름에 포함하며 로고와 탭 제목·공유 메타데이터에 같은 표기를 쓴다. 다른 서비스는 앱 설정에 공식 표기를 한 번 정의해 재사용한다.
|
|
74
|
+
- 페이지 이름은 현재 UI 언어에 맞춰 번역하고, 서비스 이름의 대소문자·띄어쓰기는 언어가 바뀌어도 유지한다. 본문 제목이나 글 제목을 사용해 현재 화면을 식별할 수 있게 한다.
|
|
75
|
+
- 같은 서비스의 페이지를 이동할 때 파비콘은 유지한다. 승인된 브랜드 자산을 사용하며 파일·메타데이터·앱 manifest와 배포는 소비 서비스가 관리한다.
|
|
76
|
+
|
|
77
|
+
Next.js 소비자는 layout의 metadata title 기본값/템플릿과 페이지별 title을 연결하고, 일반 React 앱은 라우터의 페이지 메타데이터에서 같은 규칙으로 document.title을 설정한다. 제목 조립은 한 곳에서 담당해 `API 키 — Naeil Home — Naeil Home`처럼 중복되지 않게 한다. Navigation이나 Logo 렌더링에 문서 제목 변경을 숨겨 넣지 않는다.
|
|
78
|
+
|
|
79
|
+
적용 확인은 실제 브라우저에서 홈·하위 페이지의 직접 진입, 클라이언트 경로 이동, 뒤로 가기, 언어 전환 후 제목과 파비콘을 확인한다. 제목은 현재 페이지와 일치하고 서비스 접미사가 중복되지 않아야 하며, 파비콘 파일 요청도 성공해야 한다. 이 문서 변경은 규칙 등록이며 기존 naeil.dev/Home의 메타데이터 수정·배포 완료를 의미하지 않는다.
|
|
80
|
+
|
|
58
81
|
## 앱 전체 틀과 콘텐츠 폭
|
|
59
82
|
|
|
83
|
+
실제 naeil.dev 브랜드 헤더를 이어받는 앱은 선택적 React 전용 `@naeil/ui/naeil-header`의 `NaeilHeader`를 사용한다. 전체 프로젝트 메뉴·헤더 번역·테마/선택적 언어 컨트롤·toolbar·반응형 스타일을 한 모듈에서 제공하므로 소비 앱에 다시 복사하지 않는다. 소비 앱은 기존 theme provider, 라우팅·저장 guard, 현재 언어와 실제 인증 슬롯을 연결한다. 언어 변경을 지원하지 않으면 `onLocaleChange`를 생략한다. [전체 헤더 계약](../components/naeil-header.md)을 참조한다.
|
|
84
|
+
|
|
85
|
+
2026-10-16 승인한 기본 프레임은 최대 1600px(여백 포함), 좌우 `clamp(16px, 2.4vw, 40px)`다. 브랜드 헤더·범용 Navigation·SiteFooter·본문 `.ui-app-frame`이 `--ui-width-frame`, `--ui-frame-gutter`를 함께 사용한다. 브랜드 헤더의 고정 높이는 65px이므로 main·sticky 영역과 초점/anchor 이동에 `calc(var(--ui-navigation-height) + 1px)`만큼 여유를 둔다. 다섯 장식 이미지는 공식 `https://naeil.dev/images/*.png` URL을 참조하므로 네트워크가 필요하다. 이미지 바이트는 npm에 포함하지 않으며 재배포 출처·권리 미해결 사항은 [제3자 고지](../../THIRD_PARTY_NOTICES.md)에 유지한다.
|
|
86
|
+
|
|
87
|
+
다른 제품 메뉴에는 `@naeil/ui/ui`의 범용 `Navigation`과 `SiteFooter`를 조합하고 제품 메뉴 데이터·번역·폭을 소유한다. 기존 `Nav`·`Footer`는 Next/next-intl 호환 API를 유지한다. [범용 API와 마이그레이션 안내](../components/navigation.md)를 참조한다. Naeil Home 운영 적용은 아직 완료되지 않았으며 저장소의 `docs/design/navigation-footer-integration.md`에서 추적한다.
|
|
88
|
+
|
|
60
89
|
앱의 공통 헤더·메뉴·좌우 여백과 본문의 읽기/설정/목록 폭은 별도로 관리한다. 같은 앱 틀을 사용하는 페이지는 같은 화면 크기·언어·테마에서 메뉴 위치가 유지되어야 한다. 설정 폼을 640px로 제한할 때 헤더까지 그 폭에 종속시키지 않는다. 변동하는 계정 수·상태 요약도 메뉴를 밀어내지 않도록 배치한다.
|
|
61
90
|
|
|
62
|
-
|
|
91
|
+
아래처럼 실제 공통 컴포넌트로 앱 틀을 구성한다. 공통 헤더·푸터는 내부에 프레임이 있으므로 다른 패딩 컨테이너로 다시 감싸지 않는다. `items`, `pathname`, `ProductControls`는 제품이 제공한다. 고정형 브랜드 헤더를 사용하는 완성 예제와 소비 앱에 복사할 `AGENTS.md` 규칙은 [Application layout](../components/application-layout.md)에 있다.
|
|
63
92
|
|
|
64
93
|
```tsx
|
|
94
|
+
import { Navigation, SiteFooter } from "@naeil/ui/ui";
|
|
95
|
+
|
|
65
96
|
<>
|
|
66
|
-
<
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
<main className="
|
|
97
|
+
<Navigation brand={<a href="/">My product</a>}
|
|
98
|
+
items={items} currentHref={pathname} toolbar={<ProductControls />}
|
|
99
|
+
labels={{ navigation: "주 메뉴", menu: "메뉴", close: "닫기" }} />
|
|
100
|
+
<main className="ui-app-frame">
|
|
70
101
|
<section data-ui-layout="settings">{/* 설정 폼 */}</section>
|
|
71
102
|
</main>
|
|
103
|
+
<SiteFooter variant="compact" meta="Product information" />
|
|
72
104
|
</>
|
|
73
105
|
```
|
|
74
106
|
|
|
75
107
|
```css
|
|
76
|
-
/*
|
|
77
|
-
.product-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
max-width: var(--product-frame-max, 100%);
|
|
81
|
-
margin-inline: auto;
|
|
82
|
-
padding-inline: var(--product-gutter, 0);
|
|
108
|
+
/* 의도적인 제품 예외는 세 영역의 공통 조상에서 재정의한다. */
|
|
109
|
+
.product-shell {
|
|
110
|
+
--ui-width-frame: 1280px;
|
|
111
|
+
--ui-frame-gutter: 24px;
|
|
83
112
|
}
|
|
84
113
|
```
|
|
85
114
|
|
|
86
|
-
|
|
115
|
+
이번 1600px는 사용자가 Naeil Home의 실제 폭을 비교한 뒤 공통 기본값으로 선택한 결정이다. 1920px 화면에서는 여백을 제외한 영역이 1520px다. 실제 과업·정보량·짧은/긴 내용으로 내부 구성을 판단한다. 내부 카드·보고서 열 수는 모니터 폭보다 실제 콘텐츠 영역 폭에 맞추며, 필요한 경우 container query를 사용한다.
|
|
116
|
+
|
|
117
|
+
이전 1280px 헤더·24px 여백과 1200px 목록 기본값이 변경된다. 새 기본값을 적용할 때 기존 `max-w-7xl`·`px-6` 프레임 재정의를 제거한다. 기존 레이아웃을 유지해야 하면 위 프레임 토큰 및 `--ui-width-list: 1200px`를 명시한다. 공개 import·props·소비자 className 재정의는 유지된다. 설치된 패키지와 CSS를 먼저 확인하고, 메뉴·모바일 시트·푸터 구현을 복사하는 대신 공통 API와 슬롯으로 연결한다.
|
|
87
118
|
|
|
88
119
|
레이아웃 수정의 검증 기준:
|
|
89
120
|
|
|
@@ -125,7 +156,7 @@ Storybook의 로컬 폰트 import는 예시다. 그대로 앱 전역에 모든
|
|
|
125
156
|
|
|
126
157
|
## 개별 컴포넌트 안내
|
|
127
158
|
|
|
128
|
-
[
|
|
159
|
+
[컴포넌트 사용 안내](../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
160
|
|
|
130
161
|
## 확인 방법
|
|
131
162
|
|
|
@@ -138,7 +169,7 @@ Storybook의 로컬 폰트 import는 예시다. 그대로 앱 전역에 모든
|
|
|
138
169
|
|
|
139
170
|
## 0.3 package boundary
|
|
140
171
|
|
|
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.
|
|
172
|
+
The heading retains the original 0.3 migration anchor; the allowlist below reflects the 0.6.0 package boundary. `/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
173
|
|
|
143
174
|
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
175
|
|
|
@@ -155,6 +186,8 @@ components/ui/checkbox
|
|
|
155
186
|
components/ui/dialog
|
|
156
187
|
components/ui/dropdown-menu
|
|
157
188
|
components/ui/input
|
|
189
|
+
components/ui/navigation
|
|
190
|
+
components/ui/site-footer
|
|
158
191
|
components/ui/select
|
|
159
192
|
components/ui/sonner
|
|
160
193
|
components/ui/switch
|
|
@@ -173,13 +206,13 @@ i18n/config
|
|
|
173
206
|
i18n/routing
|
|
174
207
|
```
|
|
175
208
|
|
|
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.
|
|
209
|
+
`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
210
|
|
|
178
211
|
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
212
|
|
|
180
213
|
| Previously declared source path | Ownership/migration |
|
|
181
214
|
| --- | --- |
|
|
182
|
-
| `components/nav-wrapper`, `components/nav-server-wrapper` |
|
|
215
|
+
| `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
216
|
| `components/footer-wrapper` | Compose preserved Footer with your app's Link. |
|
|
184
217
|
| `components/auth-slot` | App-owned account UI, logout action and avatar policy; pass it through Nav slots. |
|
|
185
218
|
| `components/hero-scene`, `components/hero-section`, `components/paraglider-cursor` | Website scene/cursor source, assets and Three dependencies stay website-owned. |
|
|
@@ -196,7 +229,7 @@ The reachable Next consumer's observed deep imports (Nav, Footer, ThemeProvider,
|
|
|
196
229
|
|
|
197
230
|
## Demand-led extension
|
|
198
231
|
|
|
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 [
|
|
232
|
+
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
233
|
|
|
201
234
|
|
|
202
235
|
## Brand Logo integration (0.4.0)
|
|
@@ -224,6 +257,6 @@ Root and `components/index` continue to export Logo; root still has the existing
|
|
|
224
257
|
- 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
258
|
- 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
259
|
|
|
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.
|
|
260
|
+
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
261
|
|
|
229
262
|
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 **@naeil/ui 0.6.0** and its shared application frame. The [release record](https://github.com/naeil-dev/naeil-ui/releases/tag/v0.6.0) records the frozen archive and actual publication/deployment outcomes. Verified 0.5.0, 0.4.0 and 0.3.0 evidence 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,28 @@ 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
|
+
### 0.6.0 release scope — 2026-10-16
|
|
52
|
+
|
|
53
|
+
The owner authorized publication and deployment of the shared 1600px frame, responsive gutters and navigation/footer adoption improvements. Use the exact reviewed source and frozen archive; record npm, GitHub Release, Pages and production results independently. Existing consumer applications need their own upgrade and composition migration. The minor increment marks the deliberate default-width change and added public frame tokens/class.
|
|
54
|
+
|
|
55
|
+
### Verified 0.5.0 publication — 2026-10-15
|
|
56
|
+
|
|
57
|
+
Registry metadata and the [0.5.0 release](https://github.com/naeil-dev/naeil-ui/releases/tag/v0.5.0) were rechecked on 2026-10-16. npm published at `2026-10-15T21:48:55.614Z`; the release points to `04229adbecac302efbf50ab2b8a3a40edb0a04bb`. Its archive SHA-256 is `8c9203192d967dc4fae65cc00ae80743244e0ae2363fee8c2c0edd9541d07cf9`. Production deployment7093004444 and Pages deployment7093190956 succeeded for that source; the release retains their detailed verification assets. Earlier pending-publication statements describe the preparation checkpoint, not current registry state.
|
|
58
|
+
|
|
59
|
+
### Verified 0.4.0 publication — 2026-10-11
|
|
60
|
+
|
|
61
|
+
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).
|
|
62
|
+
|
|
63
|
+
- 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.
|
|
64
|
+
- [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.
|
|
65
|
+
- Frozen candidate, merged-source rebuild and registry download are byte-identical: **108 files**, **131,414 compressed bytes**, **772,862 unpacked bytes**, SHA-256 `77fe024ceb631ea76100fdc687f04ee1ae90bfcbb306629cb9dac854226c724f`.
|
|
66
|
+
- 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.
|
|
67
|
+
- [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.
|
|
68
|
+
- 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
69
|
|
|
44
|
-
|
|
70
|
+
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
71
|
|
|
46
|
-
|
|
72
|
+
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
73
|
|
|
48
74
|
### Verified 0.3.0 publication — 2026-10-03
|
|
49
75
|
|
|
@@ -58,15 +84,15 @@ The immutable npm archive's bundled guides are the release-preparation snapshot.
|
|
|
58
84
|
|
|
59
85
|
### Release procedure
|
|
60
86
|
|
|
61
|
-
|
|
87
|
+
Storybook resolves relative Markdown guide links against the release's `v0.6.0` source tag. The tag must point to the reviewed release source, and hosted verification checks that guide links resolve. Historical foundation/source-authority links remain at their original revisions. Freeze subsequent documentation changes separately from immutable release archives.
|
|
62
88
|
|
|
63
89
|
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
90
|
|
|
65
|
-
The
|
|
91
|
+
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
92
|
|
|
67
93
|
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@
|
|
94
|
+
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.
|
|
95
|
+
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
96
|
4. Create the release tag/GitHub Release for the recorded source and retain version, artifact identity, validation scope and support limitations.
|
|
71
97
|
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
98
|
|
|
@@ -76,7 +102,7 @@ npm publication, GitHub Releases, main merge and hosted Docs are distinct operat
|
|
|
76
102
|
|
|
77
103
|
## Storybook preview artifact
|
|
78
104
|
|
|
79
|
-
`pnpm build:storybook` builds actual Docs pages and
|
|
105
|
+
`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
106
|
|
|
81
107
|
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
108
|
|
|
@@ -86,11 +112,11 @@ pnpm preview:storybook
|
|
|
86
112
|
# Open http://127.0.0.1:6007 and choose UI / a family / Docs or Usage.
|
|
87
113
|
```
|
|
88
114
|
|
|
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.
|
|
115
|
+
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
116
|
|
|
91
117
|
### Authorized GitHub Pages publication
|
|
92
118
|
|
|
93
|
-
The public Docs destination [https://naeil-dev.github.io/naeil-ui/](https://naeil-dev.github.io/naeil-ui/)
|
|
119
|
+
The public Docs destination [https://naeil-dev.github.io/naeil-ui/](https://naeil-dev.github.io/naeil-ui/) last completed [Pages run38737502303](https://github.com/naeil-dev/naeil-ui/actions/runs/38737502303) for0.5.0 source `04229adbecac302efbf50ab2b8a3a40edb0a04bb`, rechecked2026-10-16. Subsequent deployments belong to their release records. Pages uses `build_type=workflow` and a **github-pages** main-only deployment branch policy. See [workflow status](https://github.com/naeil-dev/naeil-ui/actions/workflows/publish-docs-manual.yml).
|
|
94
120
|
|
|
95
121
|
`.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
122
|
|
|
@@ -101,7 +127,7 @@ Select **Publish reviewed UI docs (manual only)** in Actions (or use the command
|
|
|
101
127
|
gh workflow run publish-docs-manual.yml -f reviewed_sha=FULL_REVIEWED_COMMIT_SHA -f confirmation=PUBLISH_REVIEWED_DOCS
|
|
102
128
|
```
|
|
103
129
|
|
|
104
|
-
After deployment, verify the manager and iframe under `/naeil-ui/`, all
|
|
130
|
+
After a 0.6.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
131
|
|
|
106
132
|
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
133
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@naeil/ui",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.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": {
|