@naeil/ui 0.10.0 → 0.11.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 CHANGED
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.11.0 — AB Storm locale registration (unpublished candidate)
4
+
5
+ - Add the exact owned `abstorm` origin and five protected UI routes to the opt-in locale runtime, with English, Korean and Japanese paths. Keep auth/API/health endpoints outside localized UI routing.
6
+ - Render localized fail-closed documents with the app’s `abstorm` identity; no favicon is declared by the current app.
7
+ - Fix generated locale declarations: JSON imports previously left variable initializers in `.d.ts` output and failed installed-consumer TypeScript checks with library checking enabled. Normalize only those declarations to ambient JSON types; runtime imports and message loading remain unchanged. Clean packed-consumer tests now import the locale API and run `tsc` without `skipLibCheck`.
8
+ - Additive public API release; existing services, default chrome/footer catalogs, messages and chrome contract 1 remain unchanged. Publish the reviewed exact archive to `next`; package publication and consumer adoption remain separate.
9
+
3
10
  ## 0.10.0 — shared language runtime (unpublished candidate)
4
11
 
5
12
  - Add opt-in `naeil-locale` root, client, server, messages, checker and chrome entries for the owned Next applications. English uses unprefixed paths; Korean/Japanese use `/ko` and `/ja`. Strict route/protocol parsing, legacy receiving aliases, selected JSON loading, ICU validation and committed-intent preference writes share one implementation.
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  React components, semantic design tokens, and shared styles for naeil products. The approved system uses a neutral light/dark palette, Pretendard, 16px controls, comfortable or compact density, purpose-specific content widths, and restrained motion. Radix supplies interaction behavior.
4
4
 
5
- **Version 0.9.0 adds the shared page-root scrollbar reservation and scroll-lock correction.** Use an exact version with verified registry publication and archive identity. At the 2026-10-29 verification, the published 0.8.0 archive matched frozen SHA-256 `6feb5a8cd50265ace584a0855432683b4127119377e08235282eaebd27081084` (139 files, source `3f708e27d05212af7f7a5be769f13f871e8d10c7`); tags were `latest=0.7.2`, `next=0.8.0`. Current publication, hosted Docs and per-service deployment have separate receipts in the [release policy](docs/package-release.md#publication-and-deployment).
5
+ **0.10.0 published and registry-verified — 2026-11-04.** This release adds the shared language runtime and preserves the page-root scrollbar reservation and scroll-lock correction. The registry archive matches frozen SHA-256 `a4a1e312f2f608358a10f9019c248af37a8172bb116d3bc506144442cb963fb4` (175 files, source/tag `455f2f9aedb108606af2f429c18281260eafd2dd`); verified tags were `latest=0.7.2`, `next=0.10.0`. See the [publication and service acceptance receipts](https://github.com/naeil-dev/naeil-ui/blob/main/docs/design/shared-language-2026-11-04/implementation-progress.md). Hosted Docs remain separately recorded. The retained [local runner](https://github.com/naeil-dev/naeil-ui/blob/main/docs/rollout/local-runner.md) supports historical **0.7.x only** and cannot deploy or recover the current 0.10.0 release.
6
6
 
7
7
  This repository also contains the **naeil.dev brand/example website** and an **optional agent reference workflow**. Choose the path you need:
8
8
 
@@ -15,13 +15,13 @@ This repository also contains the **naeil.dev brand/example website** and an **o
15
15
 
16
16
  ## Use the UI
17
17
 
18
- Use React 19 / ReactDOM 19 and Tailwind 4. UI v2 names the design generation independently of npm versioning. The installation example targets 0.9.0; run it after verifying that exact version's registry publication:
18
+ Use React 19 / ReactDOM 19 and Tailwind 4. UI v2 names the design generation independently of npm versioning. The installation example targets the verified exact 0.10.0 release:
19
19
 
20
20
  ```sh
21
- pnpm add --save-exact @naeil/ui@0.9.0
21
+ pnpm add --save-exact @naeil/ui@0.10.0
22
22
  ```
23
23
 
24
- The [npm 0.8.0 archive](https://registry.npmjs.org/@naeil/ui/-/ui-0.8.0.tgz) is byte-identical to its frozen release archive. Bundled guides record the preparation snapshot; maintained guides record later publication outcomes. For local development, `pnpm build:pkg` and `npm pack --ignore-scripts --pack-destination /tmp` produce `/tmp/naeil-ui-0.9.0.tgz` from the checked-out source. Use the exact reviewed archive for release verification; later source or guide changes require a new freeze. The [0.6.0 release record](https://github.com/naeil-dev/naeil-ui/releases/tag/v0.6.0) retains its archive, publication and deployment evidence.
24
+ The [npm 0.10.0 archive](https://registry.npmjs.org/@naeil/ui/-/ui-0.10.0.tgz) is byte-identical to its frozen release archive. Bundled guides record the preparation snapshot; maintained guides record later publication outcomes. For local development, `pnpm build:pkg` and `npm pack --ignore-scripts --pack-destination /tmp` produce `/tmp/naeil-ui-VERSION.tgz`, where `VERSION` is the checked-out `package.json` version (currently the unpublished 0.11.0 candidate). Use the exact reviewed archive for release verification; later source or guide changes require a new freeze. The [0.6.0 release record](https://github.com/naeil-dev/naeil-ui/releases/tag/v0.6.0) retains its archive, publication and deployment evidence.
25
25
 
26
26
  The preceding [0.5.0 release](https://github.com/naeil-dev/naeil-ui/releases/tag/v0.5.0) was published on 2026-10-15 and introduced the whole shared header. Version 0.6.0 adds the shared 1600px frame; existing applications must upgrade and adopt its layout composition.
27
27
 
@@ -109,7 +109,7 @@ pnpm pack --pack-destination /tmp
109
109
  | `pnpm build:pkg` / `pnpm check:package` | Build package / inspect package boundary and independently install/build packed React + Next consumers |
110
110
  | `pnpm dev` / `pnpm build` | Brand/example website development / build |
111
111
 
112
- A [reusable React consumer example](https://github.com/naeil-dev/naeil-ui/tree/main/examples/react) composes the packaged header, a settings form and footer. [Release policy](docs/package-release.md) and [changelog](CHANGELOG.md) distinguish implementation, publication and deployment. CI verifies the package and separate website/Storybook. Downloadable preview artifacts include notices and local fonts. The current Storybook source defines 17 Docs pages (15 UI families and Brand / Logo plus NaeilHeader), including Usage, JapaneseApplication, ReferenceFull, ReferenceCompact and AccountStates examples. This does not establish a new hosted deployment. [Hosted Docs](https://naeil-dev.github.io/naeil-ui/) have recorded [0.5.0 verification](https://github.com/naeil-dev/naeil-ui/releases/download/v0.5.0/hosted-docs-verification.json); subsequent deployments require their own source and HTTP checks. The same approved brand is live on [naeil.dev](https://naeil.dev/). See [preview instructions](docs/package-release.md#storybook-preview-artifact) and [support limits](docs/design/public-ui-support.md). Native/manual platform acceptance retains its documented limits; service adoption and continuous rollout have separate [dated records](https://github.com/naeil-dev/naeil-ui/tree/main/docs/rollout).
112
+ A [reusable React consumer example](https://github.com/naeil-dev/naeil-ui/tree/main/examples/react) composes the packaged header, a settings form and footer. [Release policy](docs/package-release.md) and [changelog](CHANGELOG.md) distinguish implementation, publication and deployment. CI verifies the package and separate website/Storybook. Downloadable preview artifacts include notices and local fonts. The current Storybook source defines 17 Docs pages (15 UI families and Brand / Logo plus NaeilHeader), including Usage, JapaneseApplication, ReferenceFull, ReferenceCompact and AccountStates examples. This does not establish a new hosted deployment. [Hosted Docs](https://naeil-dev.github.io/naeil-ui/) have recorded [0.5.0 verification](https://github.com/naeil-dev/naeil-ui/releases/download/v0.5.0/hosted-docs-verification.json); subsequent deployments require their own source and HTTP checks. The same approved brand is live on [naeil.dev](https://naeil.dev/). See [preview instructions](docs/package-release.md#storybook-preview-artifact) and [support limits](docs/design/public-ui-support.md). Native/manual platform acceptance retains its documented limits; service adoption and rollout have separate [dated records](https://github.com/naeil-dev/naeil-ui/tree/main/docs/rollout).
113
113
 
114
114
  Read [DESIGN.md](DESIGN.md) before shared UI changes. Numeric values live in `src/tokens/`; generated CSS is not edited by hand. Shared styles live in `src/styles/`, site-only styles in `src/app/`. Hero art, 3D scenes, cursor effects, and site content belong to the example website.
115
115
 
@@ -4,7 +4,7 @@ import {
4
4
  NaeilStandaloneMessages,
5
5
  uiRelease,
6
6
  useNaeilMessages
7
- } from "./chunk-GQO6NMXK.js";
7
+ } from "./chunk-U3IZCFM4.js";
8
8
  import {
9
9
  Badge,
10
10
  Button,
@@ -1425,7 +1425,7 @@ function NaeilStandaloneMessages({ locale, children }) {
1425
1425
  }
1426
1426
 
1427
1427
  // src/lib/ui-release.ts
1428
- var uiRelease = { version: "0.10.0", contractVersion: "1" };
1428
+ var uiRelease = { version: "0.11.0", contractVersion: "1" };
1429
1429
 
1430
1430
  export {
1431
1431
  Logo,
@@ -2,13 +2,13 @@
2
2
  import {
3
3
  NaeilHeader,
4
4
  headerLocales
5
- } from "../chunk-F7XM5HJ4.js";
5
+ } from "../chunk-KWEWR46R.js";
6
6
  import {
7
7
  Logo,
8
8
  en_default,
9
9
  ja_default,
10
10
  ko_default
11
- } from "../chunk-GQO6NMXK.js";
11
+ } from "../chunk-U3IZCFM4.js";
12
12
  import {
13
13
  SiteFooter
14
14
  } from "../chunk-HSTDPY56.js";
@@ -5,7 +5,7 @@ import {
5
5
  NaeilStandaloneMessages,
6
6
  uiRelease,
7
7
  useNaeilMessages
8
- } from "../chunk-GQO6NMXK.js";
8
+ } from "../chunk-U3IZCFM4.js";
9
9
  import {
10
10
  SiteFooter
11
11
  } from "../chunk-HSTDPY56.js";
@@ -5,8 +5,8 @@ import {
5
5
  NaeilHeaderAccountControl,
6
6
  NaeilHeaderLocaleControl,
7
7
  NaeilHeaderThemeControl
8
- } from "../chunk-F7XM5HJ4.js";
9
- import "../chunk-GQO6NMXK.js";
8
+ } from "../chunk-KWEWR46R.js";
9
+ import "../chunk-U3IZCFM4.js";
10
10
  import "../chunk-KPE4KKYM.js";
11
11
  import "../chunk-JBTDRVZ7.js";
12
12
  export {
@@ -1 +1 @@
1
- export declare const uiRelease: Readonly<{version: "0.10.0"; contractVersion: "1"}>;
1
+ export declare const uiRelease: Readonly<{version: "0.11.0"; contractVersion: "1"}>;
@@ -1 +1 @@
1
- export const uiRelease = Object.freeze({"version":"0.10.0","contractVersion":"1"});
1
+ export const uiRelease = Object.freeze({"version":"0.11.0","contractVersion":"1"});
@@ -1,4 +1,4 @@
1
- import { N as NaeilLocale, L as LocaleMessages } from './messages-BQ-fnCAJ.js';
1
+ import { N as NaeilLocale, L as LocaleMessages } from './messages-BuQvB-u2.js';
2
2
 
3
3
  interface MessageIssue {
4
4
  locale: NaeilLocale;
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  naeilLocales
3
- } from "./chunk-QWHIELL2.js";
3
+ } from "./chunk-U65OQHZY.js";
4
4
  import "./chunk-N3ETBM74.js";
5
5
 
6
6
  // src/naeil-locale/checker.ts
@@ -1886,7 +1886,7 @@ function Navigation(_a) {
1886
1886
  }
1887
1887
 
1888
1888
  // src/lib/ui-release.ts
1889
- var uiRelease = { version: "0.10.0", contractVersion: "1" };
1889
+ var uiRelease = { version: "0.11.0", contractVersion: "1" };
1890
1890
 
1891
1891
  // src/components/naeil-header-data.ts
1892
1892
  var headerLocales = ["en", "ko", "ja"];
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  assertLocale
3
- } from "./chunk-QWHIELL2.js";
3
+ } from "./chunk-U65OQHZY.js";
4
4
  import {
5
5
  __spreadValues
6
6
  } from "./chunk-N3ETBM74.js";
@@ -22,6 +22,7 @@ function assertLocale(value) {
22
22
  return value;
23
23
  }
24
24
  var origins = {
25
+ abstorm: "https://abstorm.naeil.dev",
25
26
  main: "https://naeil.dev",
26
27
  jev: "https://jev.naeil.dev",
27
28
  estimate: "https://abestimate.naeil.dev"
@@ -42,6 +43,11 @@ function defineLocaleService(service) {
42
43
  }
43
44
  var main = defineLocaleService({ id: "main", origin: origins.main, routes: ["/", "/projects", "/design", "/blog", "/blog/[slug]", "/login", { path: "/login/change-password", protected: true }] });
44
45
  var naeilServices = {
46
+ abstorm: defineLocaleService({
47
+ id: "abstorm",
48
+ origin: origins.abstorm,
49
+ routes: ["/", "/new", "/runs/[id]", "/runs/[id]/report", "/experts"].map((path) => ({ path, protected: true }))
50
+ }),
45
51
  main,
46
52
  site: main,
47
53
  jev: defineLocaleService({ id: "jev", origin: origins.jev, routes: [{ path: "/", protected: true }, "/login"] }),
@@ -4,7 +4,7 @@ import { ReactNode } from 'react';
4
4
  /** Opt-in owned-service routing. The legacy public i18n/routing entry is unchanged. */
5
5
  declare const naeilLocales: readonly ["en", "ko", "ja"];
6
6
  type NaeilLocale = (typeof naeilLocales)[number];
7
- type NaeilServiceId = "main" | "jev" | "estimate";
7
+ type NaeilServiceId = "main" | "jev" | "estimate" | "abstorm";
8
8
  interface NaeilRoute {
9
9
  path: string;
10
10
  protected?: boolean;
@@ -21,6 +21,7 @@ function assertLocale(value) {
21
21
  return value;
22
22
  }
23
23
  var origins = {
24
+ abstorm: "https://abstorm.naeil.dev",
24
25
  main: "https://naeil.dev",
25
26
  jev: "https://jev.naeil.dev",
26
27
  estimate: "https://abestimate.naeil.dev"
@@ -41,6 +42,11 @@ function defineLocaleService(service) {
41
42
  }
42
43
  var main = defineLocaleService({ id: "main", origin: origins.main, routes: ["/", "/projects", "/design", "/blog", "/blog/[slug]", "/login", { path: "/login/change-password", protected: true }] });
43
44
  var naeilServices = {
45
+ abstorm: defineLocaleService({
46
+ id: "abstorm",
47
+ origin: origins.abstorm,
48
+ routes: ["/", "/new", "/runs/[id]", "/runs/[id]/report", "/experts"].map((path) => ({ path, protected: true }))
49
+ }),
44
50
  main,
45
51
  site: main,
46
52
  jev: defineLocaleService({ id: "jev", origin: origins.jev, routes: [{ path: "/", protected: true }, "/login"] }),
@@ -1,8 +1,8 @@
1
- import { N as NaeilLocale, a as LocaleServiceInput } from './messages-BQ-fnCAJ.js';
2
- export { b as LocaleMessageLoaders, L as LocaleMessages, c as LocaleUrlResolution, d as NaeilLocaleService, e as NaeilRoute, f as NaeilServiceId, R as ResolvedLocaleRoute, S as SharedMessages, g as assertLocale, h as defaultLocale, i as defineLocaleService, j as getLocaleService, k as isNaeilLocale, l as localeHref, m as localePath, n as naeilLocales, o as naeilRouting, p as naeilServices, r as resolveLocaleUrl, s as sameLogicalRoute } from './messages-BQ-fnCAJ.js';
1
+ import { N as NaeilLocale, a as LocaleServiceInput } from './messages-BuQvB-u2.js';
2
+ export { b as LocaleMessageLoaders, L as LocaleMessages, c as LocaleUrlResolution, d as NaeilLocaleService, e as NaeilRoute, f as NaeilServiceId, R as ResolvedLocaleRoute, S as SharedMessages, g as assertLocale, h as defaultLocale, i as defineLocaleService, j as getLocaleService, k as isNaeilLocale, l as localeHref, m as localePath, n as naeilLocales, o as naeilRouting, p as naeilServices, r as resolveLocaleUrl, s as sameLogicalRoute } from './messages-BuQvB-u2.js';
3
3
 
4
- declare const localePreferenceCookie = "naeil_locale_v1";
5
- declare const developmentPreferenceCookie = "naeil_locale_dev_v1";
4
+ declare const localePreferenceCookie: string;
5
+ declare const developmentPreferenceCookie: string;
6
6
  declare function readLocalePreference(cookie: string, development?: boolean): NaeilLocale | undefined;
7
7
  declare function preferenceCookieWrites(locale: NaeilLocale, location: {
8
8
  hostname: string;
@@ -11,7 +11,7 @@ import {
11
11
  naeilServices,
12
12
  resolveLocaleUrl,
13
13
  sameLogicalRoute
14
- } from "./chunk-QWHIELL2.js";
14
+ } from "./chunk-U65OQHZY.js";
15
15
  import "./chunk-N3ETBM74.js";
16
16
 
17
17
  // src/naeil-locale/preference.ts
@@ -12,7 +12,7 @@ declare const naeilRouting: {
12
12
  };
13
13
  declare function isNaeilLocale(value: unknown): value is NaeilLocale;
14
14
  declare function assertLocale(value: unknown): NaeilLocale;
15
- type NaeilServiceId = "main" | "jev" | "estimate";
15
+ type NaeilServiceId = "main" | "jev" | "estimate" | "abstorm";
16
16
  interface NaeilRoute {
17
17
  path: string;
18
18
  protected?: boolean;
@@ -27,6 +27,7 @@ interface NaeilLocaleService {
27
27
  }
28
28
  declare function defineLocaleService(service: NaeilLocaleService): NaeilLocaleService;
29
29
  declare const naeilServices: {
30
+ readonly abstorm: NaeilLocaleService;
30
31
  readonly main: NaeilLocaleService;
31
32
  readonly site: NaeilLocaleService;
32
33
  readonly jev: NaeilLocaleService;
@@ -60,84 +61,84 @@ declare function localePath(inputService: LocaleServiceInput, unlocalizedRoute:
60
61
  declare function localeHref(service: LocaleServiceInput, unlocalizedRoute: string, locale: NaeilLocale): string;
61
62
  declare function sameLogicalRoute(service: LocaleServiceInput, left: string, right: string): boolean;
62
63
 
63
- var naeil = {
64
- header: {
65
- nav: {
66
- home: "Home",
67
- projects: "Projects",
68
- blog: "Blog",
69
- navigation: "Main navigation",
70
- menu: "Menu",
71
- closeMenu: "Close menu"
72
- },
73
- theme: {
74
- switchToLight: "Switch to light theme",
75
- switchToDark: "Switch to dark theme"
76
- },
77
- locale: {
78
- switchLabel: "Language"
79
- },
80
- projects: {
81
- cc: {
82
- name: "Content Collector",
83
- description: "Automated content collection from RSS, YouTube, Reddit + AI summarization"
84
- },
85
- pkm: {
86
- name: "PKM",
87
- description: "Personal knowledge management — document parsing, embeddings, semantic search"
88
- },
89
- naeilUi: {
90
- name: "naeil-ui",
91
- description: "Minimal design system — OKLCH tokens, Tailwind v4, shadcn"
92
- },
93
- sa: {
94
- name: "Sustainability Analyzer",
95
- description: "AI-powered ESG report analysis — PDF parsing, qualitative assessment, comparison tables"
96
- },
97
- babyAgent: {
98
- name: "Baby Agent",
99
- description: "Parenting AI agent — LINE-based Q&A, records, reminders"
100
- },
101
- status: {
102
- active: "Active",
103
- coming: "Coming Soon"
104
- }
105
- }
106
- },
107
- account: {
108
- menu: "Account menu",
109
- account: "Account",
110
- login: "Log in",
111
- logout: "Log out",
112
- busy: "Logging out…"
113
- },
114
- footer: {
115
- navigation: "Navigation",
116
- projects: "Projects",
117
- blog: "Blog",
118
- social: "Social",
119
- description: "Tomorrow starts here."
120
- },
121
- locale: {
122
- names: {
123
- en: "English",
124
- ko: "한국어",
125
- ja: "日本語"
126
- },
127
- pending: "Changing language…",
128
- failed: "The language could not be changed. Your work is still here.",
129
- retry: "Try again",
130
- errors: {
131
- badRequest: "This address is not valid.",
132
- notFound: "Page not found.",
133
- unauthenticated: "Sign in to continue.",
134
- forbidden: "You do not have access to this page.",
135
- unavailable: "The service is temporarily unavailable. Please try again."
136
- }
137
- }
64
+ declare var naeil: {
65
+ header: {
66
+ nav: {
67
+ home: string;
68
+ projects: string;
69
+ blog: string;
70
+ navigation: string;
71
+ menu: string;
72
+ closeMenu: string;
73
+ };
74
+ theme: {
75
+ switchToLight: string;
76
+ switchToDark: string;
77
+ };
78
+ locale: {
79
+ switchLabel: string;
80
+ };
81
+ projects: {
82
+ cc: {
83
+ name: string;
84
+ description: string;
85
+ };
86
+ pkm: {
87
+ name: string;
88
+ description: string;
89
+ };
90
+ naeilUi: {
91
+ name: string;
92
+ description: string;
93
+ };
94
+ sa: {
95
+ name: string;
96
+ description: string;
97
+ };
98
+ babyAgent: {
99
+ name: string;
100
+ description: string;
101
+ };
102
+ status: {
103
+ active: string;
104
+ coming: string;
105
+ };
106
+ };
107
+ };
108
+ account: {
109
+ menu: string;
110
+ account: string;
111
+ login: string;
112
+ logout: string;
113
+ busy: string;
114
+ };
115
+ footer: {
116
+ navigation: string;
117
+ projects: string;
118
+ blog: string;
119
+ social: string;
120
+ description: string;
121
+ };
122
+ locale: {
123
+ names: {
124
+ en: string;
125
+ ko: string;
126
+ ja: string;
127
+ };
128
+ pending: string;
129
+ failed: string;
130
+ retry: string;
131
+ errors: {
132
+ badRequest: string;
133
+ notFound: string;
134
+ unauthenticated: string;
135
+ forbidden: string;
136
+ unavailable: string;
137
+ };
138
+ };
138
139
  };
139
- var en = {
140
- naeil: naeil
140
+ declare var en: {
141
+ naeil: typeof naeil;
141
142
  };
142
143
 
143
144
  declare const __messages_en_json_naeil: typeof naeil;
@@ -1 +1 @@
1
- export { b as LocaleMessageLoaders, L as LocaleMessages, M as MessageModule, S as SharedMessages, q as createLocaleMessageLoader, t as loadSharedMessages, u as mergeLocaleMessages, v as recoverMissingMessages } from './messages-BQ-fnCAJ.js';
1
+ export { b as LocaleMessageLoaders, L as LocaleMessages, M as MessageModule, S as SharedMessages, q as createLocaleMessageLoader, t as loadSharedMessages, u as mergeLocaleMessages, v as recoverMissingMessages } from './messages-BuQvB-u2.js';
@@ -3,8 +3,8 @@ import {
3
3
  loadSharedMessages,
4
4
  mergeLocaleMessages,
5
5
  recoverMissingMessages
6
- } from "./chunk-D37JHNUN.js";
7
- import "./chunk-QWHIELL2.js";
6
+ } from "./chunk-4U64K4J3.js";
7
+ import "./chunk-U65OQHZY.js";
8
8
  import "./chunk-N3ETBM74.js";
9
9
  export {
10
10
  createLocaleMessageLoader,
@@ -1,11 +1,11 @@
1
1
  import * as next_intl_server from 'next-intl/server';
2
2
  import { NextResponse, NextRequest } from 'next/server';
3
- import { a as LocaleServiceInput, R as ResolvedLocaleRoute, N as NaeilLocale, b as LocaleMessageLoaders } from './messages-BQ-fnCAJ.js';
4
- export { q as createLocaleMessageLoader, o as naeilRouting } from './messages-BQ-fnCAJ.js';
3
+ import { a as LocaleServiceInput, R as ResolvedLocaleRoute, N as NaeilLocale, b as LocaleMessageLoaders } from './messages-BuQvB-u2.js';
4
+ export { q as createLocaleMessageLoader, o as naeilRouting } from './messages-BuQvB-u2.js';
5
5
 
6
- declare const localeRequestHeader = "x-naeil-locale";
7
- declare const accessRequestHeader = "x-naeil-locale-access";
8
- declare const pathRequestHeader = "x-naeil-locale-path";
6
+ declare const localeRequestHeader: string;
7
+ declare const accessRequestHeader: string;
8
+ declare const pathRequestHeader: string;
9
9
  type LocaleRequestKind = "document" | "rsc" | "action" | "other";
10
10
  declare function localeRequestKind(request: Pick<NextRequest, "method" | "headers">): LocaleRequestKind;
11
11
  /** Only read after createNaeilLocaleProxy has replaced external marker headers. */
@@ -2,7 +2,7 @@ import {
2
2
  createLocaleMessageLoader,
3
3
  loadSharedMessages,
4
4
  recoverMissingMessages
5
- } from "./chunk-D37JHNUN.js";
5
+ } from "./chunk-4U64K4J3.js";
6
6
  import {
7
7
  assertLocale,
8
8
  getLocaleService,
@@ -11,7 +11,7 @@ import {
11
11
  naeilLocales,
12
12
  naeilRouting,
13
13
  resolveLocaleUrl
14
- } from "./chunk-QWHIELL2.js";
14
+ } from "./chunk-U65OQHZY.js";
15
15
  import "./chunk-N3ETBM74.js";
16
16
 
17
17
  // src/naeil-locale/server.ts
@@ -94,7 +94,7 @@ async function invalidResponse(status, service, kind, locale = "en") {
94
94
  const copy = (await loadSharedMessages(locale)).naeil.locale;
95
95
  const message = copy.errors[status === 400 ? "badRequest" : status === 401 ? "unauthenticated" : status === 403 ? "forbidden" : status === 503 ? "unavailable" : "notFound"];
96
96
  const id = getLocaleService(service).id;
97
- const identity = { main: { name: ".naeil", icon: "/icon.svg" }, jev: { name: "Jev", icon: null }, estimate: { name: "AB Estimate", icon: "/favicon.svg" } }[id];
97
+ const identity = { abstorm: { name: "abstorm", icon: null }, main: { name: ".naeil", icon: "/icon.svg" }, jev: { name: "Jev", icon: null }, estimate: { name: "AB Estimate", icon: "/favicon.svg" } }[id];
98
98
  const links = naeilLocales.map((language) => `<li><a lang="${language}" href="${escapeHtml(localePath(service, "/", language))}">${escapeHtml(copy.names[language])}</a></li>`).join("");
99
99
  return markPrivate(new NextResponse(`<!doctype html><html lang="${locale}"><head><meta name="robots" content="noindex"><meta name="viewport" content="width=device-width,initial-scale=1">${identity.icon ? `<link rel="icon" href="${identity.icon}">` : ""}<title>${escapeHtml(message)} \u2014 ${identity.name}</title></head><body><h1>${status}</h1><p>${escapeHtml(message)}</p><ul>${links}</ul></body></html>`, { status, headers: { "Content-Type": "text/html; charset=utf-8" } }));
100
100
  }
@@ -1,5 +1,5 @@
1
1
  declare const uiRelease: {
2
- readonly version: "0.10.0";
2
+ readonly version: "0.11.0";
3
3
  readonly contractVersion: "1";
4
4
  };
5
5
 
@@ -1,4 +1,4 @@
1
- const uiRelease = { version: "0.10.0", contractVersion: "1" };
1
+ const uiRelease = { version: "0.11.0", contractVersion: "1" };
2
2
  export {
3
3
  uiRelease
4
4
  };
@@ -37,6 +37,12 @@ Render complete paths with `localePath` for same-service navigation and `localeH
37
37
 
38
38
  The canonical chrome can be imported from `/naeil-locale/chrome` under the shared provider. Existing `/naeil-header` and `/naeil-footer` remain standalone compatibility adapters and include the small three-language common dictionary. Consumer Link, auth, save guards, frame overrides, desktop/mobile account locks and project data remain consumer-owned.
39
39
 
40
+ ## AB Storm registration (0.11.0 candidate)
41
+
42
+ `service="abstorm"` binds to exactly `https://abstorm.naeil.dev`. Its protected UI inventory is `/`, `/new`, `/runs/[id]`, `/runs/[id]/report` and `/experts`; `/new?copy=<id>` uses the same registered page. All support English, Korean and Japanese paths. `/auth/session`, `/auth/logout`, `/api/*` and `/health` remain unlocalized protocol endpoints, with no UI exceptions. Unknown UI paths are rejected instead of inheriting the app’s catch-all history fallback.
43
+
44
+ The inventory was checked against AB Storm source `087e67239db26506a73c51fde7a6d246e4a0d0d9`. Generic error documents use its existing `abstorm` title and no favicon. This registration does not add a default header/footer destination or application translations. Consumer provider, routing, authentication, message loading and upgrade remain app-owned; package registration alone does not establish production adoption.
45
+
40
46
  ## Security and rollout
41
47
 
42
48
  The proxy runs exact existing protocol boundaries first, strips external private markers, strictly classifies UI paths, applies the existing app authorizer, and then runs next-intl. Protected entries without an authorizer fail closed. A marker is only a rendering hint: every protected server data read must independently authorize. RSC denial renders a valid localized access boundary and retains the root draft; it must not send login HTML or redirect an in-progress editor to another document. Keep the root beforeunload guard active during RSC failure and access recovery.
@@ -1,12 +1,16 @@
1
1
  # Package verification and release policy
2
2
 
3
- **Published exact baseline: 0.8.0** (source/tag `3f708e27d05212af7f7a5be769f13f871e8d10c7`, archive SHA-256 `6feb5a8cd50265ace584a0855432683b4127119377e08235282eaebd27081084`, 139 files). Registry download matched that frozen archive on 2026-10-29; tags were `latest=0.7.2`, `next=0.8.0`. Its Home menu/brand/status/controlled-sheet APIs and package-owned chrome typography are published. **0.9.0 is an unpublished candidate** for the adopted page-root frame rule. Contract version remains `1` only if all invariants pass. Historical releases/archives remain immutable; hosted Docs and service activation require separate receipts.
3
+ **Published exact baseline: 0.10.0 — 2026-11-04.** Source/tag `455f2f9aedb108606af2f429c18281260eafd2dd`, frozen archive SHA-256 `a4a1e312f2f608358a10f9019c248af37a8172bb116d3bc506144442cb963fb4`, 175 regular files. Registry bytes matched; verified tags were `latest=0.7.2`, `next=0.10.0`. See the [publication and three-service acceptance receipts](https://github.com/naeil-dev/naeil-ui/blob/main/docs/design/shared-language-2026-11-04/implementation-progress.md). Historical releases, archives and receipts remain immutable; hosted Docs require their own receipt. The retained [local runner](https://github.com/naeil-dev/naeil-ui/blob/main/docs/rollout/local-runner.md) is a **0.7.x-only, contract 1** release/recovery tool, outside the current 0.10.0 deployment and recovery procedure. UI v2 names a design generation, not an npm major. Version-scoped installation is in the [README](../README.md#use-the-ui).
4
+
5
+ ## 0.11.0 candidate — AB Storm locale registry
6
+
7
+ This additive API candidate registers AB Storm's five protected UI routes and error-document identity. Use the manual exact-archive procedure below, publish to `next` and preserve `latest`; the intended tag is `v0.11.0` at the frozen source. The historical 0.7.x runner transaction and chrome contract 1 remain unchanged. Package version, generated `/release` metadata and clean consumer fixture versions move together. Freeze only after all bundled documentation edits, and record source, digest, inventory and final checks outside the archive. Publication, registry verification, consumer adoption, GitHub Release and hosted Docs remain separate maintainer steps.
4
8
 
5
9
  ## Architecture
6
10
 
7
11
  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 and `NaeilHeaderAccountControl`; see [its consumer contract](components/naeil-header.md). Owned apps render that control in `authSlot` and supply session state, pending state and guarded callbacks above the header. 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
12
 
9
- Owned services use `@naeil/ui/naeil-footer` for the canonical localized destinations in full/compact variants; generic SiteFooter and legacy Footer retain their APIs. Footer navigation adapters preserve application save/flush decisions and modified-click behavior. `@naeil/ui/release` is server-safe metadata; it contains no application artifact, credential or environment. Applications compile their own allowlisted artifact/source identity. See [the footer contract](components/naeil-footer.md). Current coordinator policy, selected services, activation and recovery evidence are maintained in the [rollout records](https://github.com/naeil-dev/naeil-ui/tree/main/docs/rollout); historical disabled-policy statements describe their dated checkpoints. Publishing a package, creating an update PR or merging it never establishes complete consumer rollout. Home Console is outside the selected shared-UI rollout.
13
+ Owned services use `@naeil/ui/naeil-footer` for the canonical localized destinations in full/compact variants; generic SiteFooter and legacy Footer retain their APIs. Footer navigation adapters preserve application save/flush decisions and modified-click behavior. `@naeil/ui/release` is server-safe metadata; it contains no application artifact, credential or environment. Applications compile their own allowlisted artifact/source identity. See [the footer contract](components/naeil-footer.md). Historical 0.7.x release plans and transaction recovery use the [local rollout runner](https://github.com/naeil-dev/naeil-ui/blob/main/docs/rollout/local-runner.md); the [rollout records](https://github.com/naeil-dev/naeil-ui/tree/main/docs/rollout) preserve dated evidence and historical policies. Publishing a package, creating an update PR or merging it never establishes complete consumer rollout. Home Console is outside the selected shared-UI rollout.
10
14
 
11
15
  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 0.7.2 default catalog contains naeil-ui and references the official `https://naeil.dev/images/whale.png` URL and require network access; no image bytes are bundled, and unresolved artwork redistribution provenance remains in [third-party notices](../THIRD_PARTY_NOTICES.md).
12
16
 
@@ -61,6 +65,14 @@ The explicit font-notice regression gate copies the real React fixture config in
61
65
 
62
66
  ## Publication and deployment
63
67
 
68
+ ### Verified 0.10.0 publication and service acceptance — 2026-11-04
69
+
70
+ The [registry receipt](https://github.com/naeil-dev/naeil-ui/releases/download/v0.10.0/npm-registry-verification.json) verifies the exact frozen archive listed above, including all 175 regular members. [Release v0.10.0](https://github.com/naeil-dev/naeil-ui/releases/tag/v0.10.0) retains its assets at the frozen source. [Implementation progress](https://github.com/naeil-dev/naeil-ui/blob/main/docs/design/shared-language-2026-11-04/implementation-progress.md) and [acceptance](https://github.com/naeil-dev/naeil-ui/blob/main/docs/design/shared-language-2026-11-04/acceptance.md) record Site, Jev and Estimate separately. Those service identities and recovery procedures are outside the old 0.7.x runner; its preserved approval and transaction must not be reused for this release.
71
+
72
+ ### Historical 0.8.0 registry checkpoint — 2026-10-29
73
+
74
+ The published 0.8.0 archive matched frozen SHA-256 `6feb5a8cd50265ace584a0855432683b4127119377e08235282eaebd27081084` (139 files, source/tag `3f708e27d05212af7f7a5be769f13f871e8d10c7`). Registry tags at that dated checkpoint were `latest=0.7.2`, `next=0.8.0`. Its Home menu/brand/status/controlled-sheet APIs and package-owned chrome typography remain part of the current public API. This receipt remains historical and does not establish the current registry tags or hosted Docs source.
75
+
64
76
  ### Verified 0.7.1 registry publication and maintained Docs — 2026-10-23
65
77
 
66
78
  The published release preserves these immutable identities:
@@ -77,7 +89,7 @@ The frozen archive was published directly with scripts disabled. npm records pub
77
89
 
78
90
  The archive's bundled guides are an immutable preparation snapshot, including 0.6.0 installation copy. Release notes must point to maintained instructions. Deploy Docs from a separately reviewed commit containing current guidance, the `v0.7.1` link correction and the corrected manual workflow. Record that Docs SHA, workflow run, deployment and actual hosted checks separately; retain `v0.7.1` at the frozen package source.
79
91
 
80
- Postpublication registry checks passed on 2026-10-23. Separate fresh React/Next fixtures installed exact `@naeil/ui@0.7.1` from npmjs with independent empty caches and no repository dependency symlinks; every installed file matched the frozen 139-file inventory in both fixtures. Types, production builds, public root/deep import boundaries, release/footer/account SSR and browser checks passed, including the React fixture's absence of Next/Supabase/Three. The retained `registry-receipt.json` and successful `npm-publication-verification.json` bind these checks to the frozen source/archive; the latter records `checkedAt: 2026-10-23T01:19:50.385Z`. At the 01:19 UTC registry checkpoint, the tag had been pushed and the Release draft prepared. GitHub Release publication, hosted Docs and standing activation require separate receipts; see the release assets and [current rollout runbook](https://github.com/naeil-dev/naeil-ui/blob/main/docs/rollout/standing-rollout.md). Native/manual, real OAuth and global service-discovery evidence retain their separate scopes and limits.
92
+ Postpublication registry checks passed on 2026-10-23. Separate fresh React/Next fixtures installed exact `@naeil/ui@0.7.1` from npmjs with independent empty caches and no repository dependency symlinks; every installed file matched the frozen 139-file inventory in both fixtures. Types, production builds, public root/deep import boundaries, release/footer/account SSR and browser checks passed, including the React fixture's absence of Next/Supabase/Three. The retained `registry-receipt.json` and successful `npm-publication-verification.json` bind these checks to the frozen source/archive; the latter records `checkedAt: 2026-10-23T01:19:50.385Z`. At the 01:19 UTC registry checkpoint, the tag had been pushed and the Release draft prepared. GitHub Release publication, hosted Docs and service rollout require separate receipts; see the release assets and [historical 0.7.x rollout runbook](https://github.com/naeil-dev/naeil-ui/blob/main/docs/rollout/local-runner.md). Native/manual, real OAuth and global service-discovery evidence retain their separate scopes and limits.
81
93
 
82
94
  ### 0.6.0 release scope — 2026-10-16
83
95
 
@@ -115,7 +127,7 @@ The immutable npm archive's bundled guides are the release-preparation snapshot.
115
127
 
116
128
  ### Release procedure
117
129
 
118
- Maintained Storybook resolves relative Markdown guide links against the published `v0.7.2` source `40a3928e24cd2f0141be3e605eed0a75260938fd`. The published 0.8.0 archive and 0.9.0 candidate keep that published guide-link target until a separately reviewed Docs release. That tag is independent of the reviewed Docs deployment SHA. Hosted verification checks that the pinned links resolve; the unpublished `v0.7.0` tag is not a valid target. Historical foundation/source-authority links remain at their original revisions. Freeze subsequent documentation changes separately from immutable release archives.
130
+ Maintained Storybook resolves relative Markdown guide links against the published `v0.7.2` source `40a3928e24cd2f0141be3e605eed0a75260938fd`. Package releases keep that published guide-link target until a separately reviewed Docs release. That tag is independent of the reviewed Docs deployment SHA. Hosted verification checks that the pinned links resolve; the unpublished `v0.7.0` tag is not a valid target. Historical foundation/source-authority links remain at their original revisions. Freeze subsequent documentation changes separately from immutable release archives.
119
131
 
120
132
  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.
121
133
 
@@ -132,9 +144,11 @@ npm publication, GitHub Releases, main merge and hosted Docs are distinct operat
132
144
  `vercel.json` disables Git deployments only for `feat/public-ui-readiness`. Other branches retain Vercel's default behavior, so merging or pushing another branch requires a separate deployment decision. The automatic GitHub Actions checks are verification-only; enabling repository workflows is not evidence of a hosted site or approved release.
133
145
 
134
146
 
135
- ### Manual exact-archive preparation for 0.9.0 (following 0.8.0)
147
+ ### Historical manual exact-archive preparation for 0.9.0 (following 0.8.0)
148
+
149
+ The following preparation requirements and deployment hold describe the October 29 checkpoint. The November 4 release and accepted service state are recorded above; this historical section does not describe current service versions or pending approval.
136
150
 
137
- The standing `scripts/rollout/prepare-release.mjs` accepts consecutive stable 0.7.x releases only. Do not change rollout policy, `release.json` or the chrome contract to admit 0.9.0. Use the manual release procedure above: complete G1–G7 from the [adopted root-frame contract](https://github.com/naeil-dev/naeil-ui/blob/434b7d07235316097ca3a55265ee02c1422b0cfd/docs/superpowers/specs/2026-10-29-page-root-scrollbar-gutter.md), including the retained 0.8.0 P1–P5 regressions, freeze the exact source SHA/archive, then run boundary and clean React/Next checks with `NAEIL_UI_EXPECTED_ARCHIVE_SHA256`. The paired browser gate accepts `NAEIL_UI_CHROME_PACKAGE=/absolute/extracted/package` to exercise that exact archive, alongside SHA-512-pinned 0.7.2 and SHA-256-pinned frozen 0.8.0. Reference-only root/lock CSS adjustments are separate hashed fixture files; immutable archives stay untouched. Both classic and overlay jobs require actual probes. Viewport captures have geometry guards; all acceptance measurement precedes any terminal fullPage capture. It retains numeric differences and screenshots for human review; new renders never replace expectations automatically.
151
+ The retained `scripts/rollout/prepare-release.mjs` accepts consecutive stable 0.7.x releases only. Do not change rollout policy, `release.json` or the chrome contract to admit 0.9.0. Use the manual release procedure above: complete G1–G7 from the [adopted root-frame contract](https://github.com/naeil-dev/naeil-ui/blob/434b7d07235316097ca3a55265ee02c1422b0cfd/docs/superpowers/specs/2026-10-29-page-root-scrollbar-gutter.md), including the retained 0.8.0 P1–P5 regressions, freeze the exact source SHA/archive, then run boundary and clean React/Next checks with `NAEIL_UI_EXPECTED_ARCHIVE_SHA256`. The paired browser gate accepts `NAEIL_UI_CHROME_PACKAGE=/absolute/extracted/package` to exercise that exact archive, alongside SHA-512-pinned 0.7.2 and SHA-256-pinned frozen 0.8.0. Reference-only root/lock CSS adjustments are separate hashed fixture files; immutable archives stay untouched. Both classic and overlay jobs require actual probes. Viewport captures have geometry guards; all acceptance measurement precedes any terminal fullPage capture. It retains numeric differences and screenshots for human review; new renders never replace expectations automatically.
138
152
 
139
153
  Before npm publication, the separately approved source push must make the linked adopted contract at `434b7d07235316097ca3a55265ee02c1422b0cfd` public. Immediately after that push, verify an anonymous HTTP 200 for the exact guide URL and confirm its status says **rev 1, adopted 2026-10-29**. Local link/boundary checks do not establish public reachability. Source push may trigger Vercel deployment and retains its own approval boundary.
140
154
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@naeil/ui",
3
- "version": "0.10.0",
3
+ "version": "0.11.0",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "sideEffects": [
@@ -174,7 +174,7 @@
174
174
  "scripts": {
175
175
  "dev": "next dev",
176
176
  "build": "next build",
177
- "build:pkg": "pnpm check:messages && pnpm build:release && pnpm check:brand && tsup && tsup --config tsup.deep.config.ts && tsup --config tsup.locale.config.ts && tsx scripts/copy-locale-json.ts && tsx scripts/fix-deep-imports.ts && pnpm build:tokens && node scripts/build-release-entry.mjs && pnpm check:locale:package",
177
+ "build:pkg": "pnpm check:messages && pnpm build:release && pnpm check:brand && tsup && tsup --config tsup.deep.config.ts && tsup --config tsup.locale.config.ts && tsx scripts/fix-locale-declarations.ts && tsx scripts/copy-locale-json.ts && tsx scripts/fix-deep-imports.ts && pnpm build:tokens && node scripts/build-release-entry.mjs && pnpm check:locale:package",
178
178
  "start": "next start",
179
179
  "lint": "eslint",
180
180
  "test": "vitest run",
@@ -191,7 +191,7 @@
191
191
  "build:brand": "tsx scripts/build-brand.ts",
192
192
  "check:brand": "tsx scripts/build-brand.ts --check",
193
193
  "build:release": "node scripts/build-ui-release.mjs",
194
- "rollout": "node scripts/rollout/rollout.mjs",
194
+ "rollout": "node scripts/rollout/local-cli.mjs",
195
195
  "test:rollout": "node --test scripts/rollout/*.test.mjs scripts/verify-ui-production.test.mjs",
196
196
  "check:messages": "tsx scripts/check-locale-messages.ts",
197
197
  "check:locale:package": "tsx scripts/check-locale-package.ts"