melta-app 0.4.1 → 0.4.3

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.
@@ -21,18 +21,32 @@ import { defineTheme, isDev, resolveMode } from "./define-theme.js";
21
21
  import { jsx as _jsx } from "react/jsx-runtime";
22
22
  const ThemeContext = /*#__PURE__*/createContext(null);
23
23
 
24
- /** 既定 theme。melta-contracts 由来の codegen 結果を注入経路と同じ形に通す(自分でも dogfood する)。 */
24
+ /**
25
+ * 既定 theme。melta-contracts 由来の codegen 結果を注入経路と同じ形に通す(自分でも dogfood する)。
26
+ * 副作用として dev では `nativeTheme` の入れ子オブジェクト(トークン群)も freeze される
27
+ * — 生成物のトークンを実行時に書き換える経路は元々無いので、意図した副作用として許容する。
28
+ */
25
29
  const DEFAULT_THEME = defineTheme({
26
30
  ...nativeTheme,
27
31
  id: "melta"
28
32
  });
29
33
 
30
- /** 同じ矛盾を毎レンダー報告しないためのラッチ(StrictMode の二重 render も1回に畳む)。 */
31
- const reportedViolations = new Set();
32
- function reportViolation(themeId, violation) {
33
- const key = `${themeId ?? "(id 未設定)"}:${violation.requested}`;
34
- if (reportedViolations.has(key)) return;
35
- reportedViolations.add(key);
34
+ /**
35
+ * 同じ矛盾を毎レンダー報告しないためのラッチ(StrictMode の二重 render も1回に畳む)。
36
+ *
37
+ * キーは **theme の参照**。id 文字列にすると、id 未設定の theme 同士や同じ id を持つ別 theme が
38
+ * 互いの警告を打ち消してしまう(報告されるべき矛盾が黙る)。WeakMap なので theme が捨てられれば
39
+ * エントリも消える=動的に theme を作るアプリでも溜まらない。
40
+ */
41
+ const reportedViolations = new WeakMap();
42
+ function reportViolation(theme, violation) {
43
+ let reported = reportedViolations.get(theme);
44
+ if (reported === undefined) {
45
+ reported = new Set();
46
+ reportedViolations.set(theme, reported);
47
+ }
48
+ if (reported.has(violation.requested)) return;
49
+ reported.add(violation.requested);
36
50
  console.error(`melta: forcedMode="${violation.requested}" が指定されたが、この theme は ` + `colorScheme=${violation.colorScheme} なので "${violation.resolved}" で描画する。` + `useTheme().capabilities.colorScheme を見て、対応していない mode は UI 側で出さないこと。`);
37
51
  }
38
52
  export function ThemeProvider({
@@ -46,7 +60,7 @@ export function ThemeProvider({
46
60
  mode,
47
61
  violation
48
62
  } = resolveMode(activeTheme.capabilities.colorScheme, forcedMode, system === "dark" ? "dark" : "light");
49
- if (isDev && violation) reportViolation(activeTheme.id, violation);
63
+ if (isDev && violation) reportViolation(activeTheme, violation);
50
64
  const value = useMemo(() => {
51
65
  const colors = activeTheme.color.semantic[mode];
52
66
  if (!colors) {
@@ -1 +1 @@
1
- {"version":3,"names":["createContext","useContext","useMemo","useColorScheme","nativeTheme","defineTheme","isDev","resolveMode","jsx","_jsx","ThemeContext","DEFAULT_THEME","id","reportedViolations","Set","reportViolation","themeId","violation","key","requested","has","add","console","error","colorScheme","resolved","ThemeProvider","children","forcedMode","theme","system","activeTheme","mode","capabilities","value","colors","color","semantic","Error","Provider","useTheme","ctx"],"sourceRoot":"../../../src","sources":["theme/ThemeProvider.tsx"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,aAAa,EAAEC,UAAU,EAAEC,OAAO,QAAwB,OAAO;AAC1E,SAASC,cAAc,QAAQ,cAAc;AAC7C,SAASC,WAAW,QAAQ,mBAAgB;AAC5C,SAASC,WAAW,EAAEC,KAAK,EAAEC,WAAW,QAAsF,mBAAgB;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAsB/I,MAAMC,YAAY,gBAAGV,aAAa,CAA2B,IAAI,CAAC;;AAElE;AACA,MAAMW,aAAkC,GAAGN,WAAW,CAAC;EAAE,GAAGD,WAAW;EAAEQ,EAAE,EAAE;AAAQ,CAAC,CAAC;;AAEvF;AACA,MAAMC,kBAAkB,GAAG,IAAIC,GAAG,CAAS,CAAC;AAE5C,SAASC,eAAeA,CAACC,OAA2B,EAAEC,SAA6B,EAAQ;EACzF,MAAMC,GAAG,GAAG,GAAGF,OAAO,IAAI,UAAU,IAAIC,SAAS,CAACE,SAAS,EAAE;EAC7D,IAAIN,kBAAkB,CAACO,GAAG,CAACF,GAAG,CAAC,EAAE;EACjCL,kBAAkB,CAACQ,GAAG,CAACH,GAAG,CAAC;EAC3BI,OAAO,CAACC,KAAK,CACX,sBAAsBN,SAAS,CAACE,SAAS,uBAAuB,GAC9D,eAAeF,SAAS,CAACO,WAAW,SAASP,SAAS,CAACQ,QAAQ,UAAU,GACzE,qEACJ,CAAC;AACH;AAoBA,OAAO,SAASC,aAAaA,CAAC;EAAEC,QAAQ;EAAEC,UAAU;EAAEC;AAA0B,CAAC,EAAE;EACjF,MAAMC,MAAM,GAAG3B,cAAc,CAAC,CAAC;EAC/B,MAAM4B,WAAW,GAAGF,KAAK,IAAIlB,aAAa;EAE1C,MAAM;IAAEqB,IAAI;IAAEf;EAAU,CAAC,GAAGV,WAAW,CACrCwB,WAAW,CAACE,YAAY,CAACT,WAAW,EACpCI,UAAU,EACVE,MAAM,KAAK,MAAM,GAAG,MAAM,GAAG,OAC/B,CAAC;EACD,IAAIxB,KAAK,IAAIW,SAAS,EAAEF,eAAe,CAACgB,WAAW,CAACnB,EAAE,EAAEK,SAAS,CAAC;EAElE,MAAMiB,KAAK,GAAGhC,OAAO,CAAoB,MAAM;IAC7C,MAAMiC,MAAM,GAAGJ,WAAW,CAACK,KAAK,CAACC,QAAQ,CAACL,IAAI,CAAC;IAC/C,IAAI,CAACG,MAAM,EAAE;MACX;MACA;MACA,MAAM,IAAIG,KAAK,CACb,iBAAiBP,WAAW,CAACnB,EAAE,IAAI,UAAU,aAAaoB,IAAI,oBAChE,CAAC;IACH;IACA,OAAO;MACL;MACA;MACA;MACA;MACAH,KAAK,EAAEE,WAAqC;MAC5CC,IAAI;MACJG,MAAM;MACNF,YAAY,EAAEF,WAAW,CAACE;IAC5B,CAAC;EACH,CAAC,EAAE,CAACF,WAAW,EAAEC,IAAI,CAAC,CAAC;EAEvB,oBAAOvB,IAAA,CAACC,YAAY,CAAC6B,QAAQ;IAACL,KAAK,EAAEA,KAAM;IAAAP,QAAA,EAAEA;EAAQ,CAAwB,CAAC;AAChF;AAEA,OAAO,SAASa,QAAQA,CAAA,EAAsB;EAC5C,MAAMC,GAAG,GAAGxC,UAAU,CAACS,YAAY,CAAC;EACpC,IAAI,CAAC+B,GAAG,EAAE;IACR,MAAM,IAAIH,KAAK,CAAC,yCAAyC,CAAC;EAC5D;EACA,OAAOG,GAAG;AACZ","ignoreList":[]}
1
+ {"version":3,"names":["createContext","useContext","useMemo","useColorScheme","nativeTheme","defineTheme","isDev","resolveMode","jsx","_jsx","ThemeContext","DEFAULT_THEME","id","reportedViolations","WeakMap","reportViolation","theme","violation","reported","get","undefined","Set","set","has","requested","add","console","error","colorScheme","resolved","ThemeProvider","children","forcedMode","system","activeTheme","mode","capabilities","value","colors","color","semantic","Error","Provider","useTheme","ctx"],"sourceRoot":"../../../src","sources":["theme/ThemeProvider.tsx"],"mappings":"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","ignoreList":[]}
@@ -160,9 +160,17 @@ const FONT_WEIGHT_KEYS = keysOf({
160
160
  // capability の導出
161
161
  // ---------------------------------------------------------------------------
162
162
 
163
- /** theme が実際に値を持っている mode(enumerable なキーのみ = dev getter を踏まない)。 */
163
+ /**
164
+ * theme が実際に値を持っている mode。
165
+ *
166
+ * **enumerable な own key だけを見る**こと。`hasOwnProperty` は non-enumerable な own
167
+ * プロパティにも true を返すので、それで判定すると「持っていない mode に置いた番人の getter」を
168
+ * 値として数えてしまい、解決後の theme に対して常に light / dark 両方を返す(0.4.0 の不具合)。
169
+ * 入力(素のデータプロパティ)と解決後(番人つき)のどちらに対しても正しく答える必要がある。
170
+ */
164
171
  export function declaredModes(semantic) {
165
- return MODES.filter(mode => Object.prototype.hasOwnProperty.call(semantic, mode));
172
+ const withValue = new Set(Object.keys(semantic));
173
+ return MODES.filter(mode => withValue.has(mode));
166
174
  }
167
175
 
168
176
  /** colorScheme capability を `color.semantic` のキー集合から導出する。 */
@@ -174,11 +182,27 @@ export function deriveColorScheme(semantic) {
174
182
  throw new Error("melta: theme.color.semantic に light / dark のどちらも無い。最低1つの mode が要る。");
175
183
  }
176
184
 
177
- /** capability が実際に描ける mode。 */
185
+ /**
186
+ * capability が実際に描ける mode。
187
+ *
188
+ * 未知の値は**黙って light-dark 扱いにしない**。TypeScript を使わない消費者や、将来
189
+ * capability の値が増えたときに、誤った値が「両対応の theme」として通ってしまうと、
190
+ * 持っていない mode で描画されて初めて壊れる(=原因から遠い場所で落ちる)。
191
+ */
178
192
  export function supportedModes(colorScheme) {
179
- if (colorScheme === "single-dark") return ["dark"];
180
- if (colorScheme === "single-light") return ["light"];
181
- return ["light", "dark"];
193
+ switch (colorScheme) {
194
+ case "light-dark":
195
+ return ["light", "dark"];
196
+ case "single-dark":
197
+ return ["dark"];
198
+ case "single-light":
199
+ return ["light"];
200
+ default:
201
+ {
202
+ const unknown = colorScheme;
203
+ throw new Error(`melta: 未知の colorScheme capability "${String(unknown)}"。`);
204
+ }
205
+ }
182
206
  }
183
207
 
184
208
  // ---------------------------------------------------------------------------
@@ -198,6 +222,10 @@ export function supportedModes(colorScheme) {
198
222
  export function resolveMode(colorScheme, forcedMode, systemMode) {
199
223
  const supported = supportedModes(colorScheme);
200
224
  const requested = forcedMode ?? systemMode;
225
+ // 未知の mode を supported[0] へ黙って倒すと、typo が「正常な light 表示」に化ける。
226
+ if (!MODES.includes(requested)) {
227
+ throw new Error(`melta: 未知の mode "${String(requested)}"。light / dark のみ。`);
228
+ }
201
229
  if (supported.includes(requested)) return {
202
230
  mode: requested
203
231
  };
@@ -221,9 +249,23 @@ export function resolveMode(colorScheme, forcedMode, systemMode) {
221
249
  // validation(開発時のみ。純関数なのでテストからも直接呼べる)
222
250
  // ---------------------------------------------------------------------------
223
251
 
252
+ /**
253
+ * 欠けているキーを返す。**accessor で埋めた欄も「ある」と数える**(消費者が「まだ埋められない欄」に
254
+ * getter を置くのは正当な使い方なので、descriptor の存在だけを見る)。
255
+ *
256
+ * data property のときは値も見る(`undefined` を入れて型検査だけすり抜けた欄を拾う)。
257
+ * accessor は**呼ばない** — 呼ぶと消費者の開発用プローブが theme 構築時に全部発火し、
258
+ * 「melta が実際にどの欄を読んだか」の信号を壊してしまう。
259
+ */
224
260
  function missingKeys(target, keys) {
225
261
  if (target === null || typeof target !== "object") return [...keys].map(String);
226
- return keys.filter(key => !Object.prototype.hasOwnProperty.call(target, key)).map(String);
262
+ return keys.filter(key => {
263
+ const descriptor = Object.getOwnPropertyDescriptor(target, key);
264
+ if (descriptor === undefined) return true;
265
+ // accessor は値を読まずに「ある」とみなす
266
+ if (!("value" in descriptor)) return false;
267
+ return descriptor.value === undefined;
268
+ }).map(String);
227
269
  }
228
270
 
229
271
  /**
@@ -232,6 +274,12 @@ function missingKeys(target, keys) {
232
274
  * 「宣言した mode の色が欠けている」「as キャストでキーが抜けた」といった、型を通り抜けた欠落を拾う。
233
275
  * `defineTheme()` が dev で1回だけ呼ぶ。**render 中に呼ばないこと**(theme-ui は Provider の
234
276
  * render body で毎レンダー全色を再帰走査して性能を落とした前例がある)。
277
+ *
278
+ * ⚠️ **完全な runtime validation ではない**。キーの存在と(data property のときだけ)
279
+ * `undefined` でないことを見るだけで、値の型・範囲・accessor の戻り値までは検査しない。
280
+ * 意図的にそうしている(上の missingKeys のコメント参照)。
281
+ *
282
+ * @experimental 公開しているが安定 API ではない。検査範囲とメッセージは予告なく変わりうる。
235
283
  */
236
284
  export function validateTheme(options) {
237
285
  const problems = [];
@@ -308,13 +356,52 @@ function installMissingModeGuards(semantic, where, colorScheme) {
308
356
  }
309
357
  }
310
358
 
311
- /** dev 限定の再帰 freeze。enumerable なキーだけ辿るので上の guard getter は踏まない。 */
359
+ /** プレーンなオブジェクト(クラスインスタンスや null プロトタイプ以外の特殊物を除く)か。 */
360
+ function isPlainObject(value) {
361
+ if (typeof value !== "object" || value === null) return false;
362
+ const proto = Object.getPrototypeOf(value);
363
+ return proto === Object.prototype || proto === null;
364
+ }
365
+
366
+ /**
367
+ * トークンの木を**複製する**。melta が自分のコピーを所有するために要る。
368
+ *
369
+ * なぜ単純な spread や structuredClone でないか:
370
+ * - **accessor を呼ばない**。消費者は「まだ埋められない欄」に getter を置くことがある
371
+ * (capability が無い軸を検出する開発用プローブ)。値を読んで複製すると、theme を
372
+ * 組み立てた時点で全部発火し、「melta が実際にどの欄を読んだか」の信号が壊れる。
373
+ * descriptor をそのまま移せば、getter は getter のまま運ばれる。
374
+ * - 再帰するのは plain object / array の **data property** だけ。それ以外(関数・
375
+ * クラスインスタンス・accessor)は素通しする。
376
+ */
377
+ function cloneTokenTree(value) {
378
+ if (Array.isArray(value)) return value.map(item => cloneTokenTree(item));
379
+ if (!isPlainObject(value)) return value;
380
+ const source = Object.getOwnPropertyDescriptors(value);
381
+ const target = {};
382
+ for (const key of Reflect.ownKeys(source)) {
383
+ const descriptor = source[key];
384
+ target[key] = "value" in descriptor ? {
385
+ ...descriptor,
386
+ value: cloneTokenTree(descriptor.value)
387
+ } : descriptor;
388
+ }
389
+ return Object.defineProperties({}, target);
390
+ }
391
+
392
+ /**
393
+ * dev 限定の再帰 freeze。**accessor は呼ばずに素通りする**(cloneTokenTree と同じ理由)。
394
+ * 呼ぶ相手は cloneTokenTree で作った melta 所有のコピーだけ。消費者の入力や、公開 export の
395
+ * `nativeTheme` の入れ子は凍らせない(凍らせると `{...nativeTheme}` からの派生が dev で壊れる)。
396
+ */
312
397
  function deepFreeze(value) {
313
- if (value === null || typeof value !== "object") return;
398
+ if (!isPlainObject(value) && !Array.isArray(value)) return;
314
399
  if (Object.isFrozen(value)) return;
315
400
  Object.freeze(value);
316
- for (const key of Object.keys(value)) {
317
- deepFreeze(value[key]);
401
+ const descriptors = Object.getOwnPropertyDescriptors(value);
402
+ for (const descriptor of Object.values(descriptors)) {
403
+ // accessor は呼ばない(呼ぶと消費者の開発用プローブが発火する)
404
+ if ("value" in descriptor) deepFreeze(descriptor.value);
318
405
  }
319
406
  }
320
407
 
@@ -335,16 +422,15 @@ export function defineTheme(options) {
335
422
  throw new Error(`melta: theme の形が不正。\n- ${problems.join("\n- ")}`);
336
423
  }
337
424
  }
338
- const semantic = {
339
- ...options.color.semantic
340
- };
425
+
426
+ // 入力と参照を共有しない。共有すると (a) 呼び出し側の後からの書き換えが解決済み theme に
427
+ // 波及し(再レンダーは起きないので画面ごとに新旧が混在する)(b) dev の deepFreeze が
428
+ // 呼び出し側の入力と公開 export の nativeTheme まで凍らせて、正当な派生を壊す。
429
+ const owned = cloneTokenTree(options);
430
+ const semantic = owned.color.semantic;
341
431
  const colorScheme = deriveColorScheme(semantic);
342
432
  const theme = {
343
- ...options,
344
- color: {
345
- ...options.color,
346
- semantic
347
- },
433
+ ...owned,
348
434
  capabilities: {
349
435
  colorScheme
350
436
  },
@@ -1 +1 @@
1
- {"version":3,"names":["isDev","__DEV__","globalThis","process","env","NODE_ENV","keysOf","map","Object","keys","MODES","light","dark","SEMANTIC_KEYS","PRIMARY_KEYS","STATUS_KINDS","success","warning","danger","STATUS_COLOR_KEYS","base","subtleLight","textLight","subtleDark","textDark","SPACING_KEYS","RADIUS_KEYS","sm","md","lg","full","ELEVATION_KEYS","none","overlay","FONT_SIZE_KEYS","xxs","xs","xl","FONT_WEIGHT_KEYS","normal","medium","semibold","bold","declaredModes","semantic","filter","mode","prototype","hasOwnProperty","call","deriveColorScheme","modes","length","Error","supportedModes","colorScheme","resolveMode","forcedMode","systemMode","supported","requested","includes","resolved","undefined","violation","kind","missingKeys","target","String","key","validateTheme","options","problems","where","id","color","push","unknownModes","missing","join","groups","primary","spacing","radius","elevation","typography","fontSize","fontWeight","status","label","installMissingModeGuards","defineProperty","enumerable","configurable","get","deepFreeze","value","isFrozen","freeze","defineTheme","theme","capabilities","$$melta"],"sourceRoot":"../../../src","sources":["theme/define-theme.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["isDev","__DEV__","globalThis","process","env","NODE_ENV","keysOf","map","Object","keys","MODES","light","dark","SEMANTIC_KEYS","PRIMARY_KEYS","STATUS_KINDS","success","warning","danger","STATUS_COLOR_KEYS","base","subtleLight","textLight","subtleDark","textDark","SPACING_KEYS","RADIUS_KEYS","sm","md","lg","full","ELEVATION_KEYS","none","overlay","FONT_SIZE_KEYS","xxs","xs","xl","FONT_WEIGHT_KEYS","normal","medium","semibold","bold","declaredModes","semantic","withValue","Set","filter","mode","has","deriveColorScheme","modes","length","Error","supportedModes","colorScheme","unknown","String","resolveMode","forcedMode","systemMode","supported","requested","includes","resolved","undefined","violation","kind","missingKeys","target","key","descriptor","getOwnPropertyDescriptor","value","validateTheme","options","problems","where","id","color","push","unknownModes","missing","join","groups","primary","spacing","radius","elevation","typography","fontSize","fontWeight","status","label","prototype","hasOwnProperty","call","installMissingModeGuards","defineProperty","enumerable","configurable","get","isPlainObject","proto","getPrototypeOf","cloneTokenTree","Array","isArray","item","source","getOwnPropertyDescriptors","Reflect","ownKeys","defineProperties","deepFreeze","isFrozen","freeze","descriptors","values","defineTheme","owned","theme","capabilities","$$melta"],"sourceRoot":"../../../src","sources":["theme/define-theme.ts"],"mappings":"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","ignoreList":[]}
@@ -9,7 +9,13 @@
9
9
  export * from "./types.js";
10
10
  export { nativeTheme } from "./native-theme.js";
11
11
  export { ThemeProvider, useTheme } from "./ThemeProvider.js";
12
- export { defineTheme, validateTheme, resolveMode, supportedModes, deriveColorScheme, declaredModes } from "./define-theme.js";
12
+ export { defineTheme } from "./define-theme.js";
13
+ /**
14
+ * 以下は theme の解決規則を外から検証・再利用するためのヘルパ。
15
+ * **@experimental — 安定 API ではない。** 挙動・シグネチャ・メッセージは予告なく変わりうる。
16
+ * アプリの実行時ロジックが依存する場合は、useTheme().capabilities を使うほうが安全。
17
+ */
18
+ export { validateTheme, resolveMode, supportedModes, deriveColorScheme, declaredModes } from "./define-theme.js";
13
19
  /**
14
20
  * letterSpacingRatio(em 相当の比率)を、適用先の fontSize から RN の letterSpacing(pt) に解決する。
15
21
  * 例: resolveLetterSpacing(18, theme.typography.letterSpacingRatio.body)
@@ -1 +1 @@
1
- {"version":3,"names":["nativeTheme","ThemeProvider","useTheme","defineTheme","validateTheme","resolveMode","supportedModes","deriveColorScheme","declaredModes","resolveLetterSpacing","fontSize","ratio"],"sourceRoot":"../../../src","sources":["theme/index.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;;AAEA,cAAc,YAAS;AACvB,SAASA,WAAW,QAAQ,mBAAgB;AAC5C,SAASC,aAAa,EAAEC,QAAQ,QAAQ,oBAAiB;AAEzD,SACEC,WAAW,EACXC,aAAa,EACbC,WAAW,EACXC,cAAc,EACdC,iBAAiB,EACjBC,aAAa,QACR,mBAAgB;AASvB;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,oBAAoBA,CAACC,QAAgB,EAAEC,KAAa,EAAU;EAC5E,OAAOD,QAAQ,GAAGC,KAAK;AACzB","ignoreList":[]}
1
+ {"version":3,"names":["nativeTheme","ThemeProvider","useTheme","defineTheme","validateTheme","resolveMode","supportedModes","deriveColorScheme","declaredModes","resolveLetterSpacing","fontSize","ratio"],"sourceRoot":"../../../src","sources":["theme/index.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;;AAEA,cAAc,YAAS;AACvB,SAASA,WAAW,QAAQ,mBAAgB;AAC5C,SAASC,aAAa,EAAEC,QAAQ,QAAQ,oBAAiB;AAEzD,SAASC,WAAW,QAAQ,mBAAgB;AAC5C;AACA;AACA;AACA;AACA;AACA,SACEC,aAAa,EACbC,WAAW,EACXC,cAAc,EACdC,iBAAiB,EACjBC,aAAa,QACR,mBAAgB;AASvB;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,oBAAoBA,CAACC,QAAgB,EAAEC,KAAa,EAAU;EAC5E,OAAOD,QAAQ,GAAGC,KAAK;AACzB","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"ThemeProvider.d.ts","sourceRoot":"","sources":["../../../../src/theme/ThemeProvider.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAsC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAG3E,OAAO,EAAmC,KAAK,oBAAoB,EAAE,KAAK,mBAAmB,EAA2B,MAAM,gBAAgB,CAAC;AAC/I,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEtE,YAAY,EAAE,SAAS,EAAE,CAAC;AAE1B,MAAM,WAAW,iBAAiB;IAChC;;;;;;OAMG;IACH,KAAK,EAAE,WAAW,CAAC;IACnB,gBAAgB;IAChB,IAAI,EAAE,SAAS,CAAC;IAChB,2EAA2E;IAC3E,MAAM,EAAE,cAAc,CAAC;IACvB,mDAAmD;IACnD,YAAY,EAAE,oBAAoB,CAAC;CACpC;AAqBD,UAAU,kBAAkB;IAC1B,QAAQ,EAAE,SAAS,CAAC;IACpB;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB;;;;OAIG;IACH,KAAK,CAAC,EAAE,mBAAmB,CAAC;CAC7B;AAED,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,kBAAkB,2CAiChF;AAED,wBAAgB,QAAQ,IAAI,iBAAiB,CAM5C"}
1
+ {"version":3,"file":"ThemeProvider.d.ts","sourceRoot":"","sources":["../../../../src/theme/ThemeProvider.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAsC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAG3E,OAAO,EAAmC,KAAK,oBAAoB,EAAE,KAAK,mBAAmB,EAA2B,MAAM,gBAAgB,CAAC;AAC/I,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEtE,YAAY,EAAE,SAAS,EAAE,CAAC;AAE1B,MAAM,WAAW,iBAAiB;IAChC;;;;;;OAMG;IACH,KAAK,EAAE,WAAW,CAAC;IACnB,gBAAgB;IAChB,IAAI,EAAE,SAAS,CAAC;IAChB,2EAA2E;IAC3E,MAAM,EAAE,cAAc,CAAC;IACvB,mDAAmD;IACnD,YAAY,EAAE,oBAAoB,CAAC;CACpC;AAmCD,UAAU,kBAAkB;IAC1B,QAAQ,EAAE,SAAS,CAAC;IACpB;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB;;;;OAIG;IACH,KAAK,CAAC,EAAE,mBAAmB,CAAC;CAC7B;AAED,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,kBAAkB,2CAiChF;AAED,wBAAgB,QAAQ,IAAI,iBAAiB,CAM5C"}
@@ -71,11 +71,24 @@ export interface ThemeModeViolation {
71
71
  resolved: ThemeMode;
72
72
  colorScheme: ColorSchemeCapability;
73
73
  }
74
- /** theme が実際に値を持っている mode(enumerable なキーのみ = dev getter を踏まない)。 */
74
+ /**
75
+ * theme が実際に値を持っている mode。
76
+ *
77
+ * **enumerable な own key だけを見る**こと。`hasOwnProperty` は non-enumerable な own
78
+ * プロパティにも true を返すので、それで判定すると「持っていない mode に置いた番人の getter」を
79
+ * 値として数えてしまい、解決後の theme に対して常に light / dark 両方を返す(0.4.0 の不具合)。
80
+ * 入力(素のデータプロパティ)と解決後(番人つき)のどちらに対しても正しく答える必要がある。
81
+ */
75
82
  export declare function declaredModes(semantic: Partial<Record<ThemeMode, SemanticColors>>): ThemeMode[];
76
83
  /** colorScheme capability を `color.semantic` のキー集合から導出する。 */
77
84
  export declare function deriveColorScheme(semantic: Partial<Record<ThemeMode, SemanticColors>>): ColorSchemeCapability;
78
- /** capability が実際に描ける mode。 */
85
+ /**
86
+ * capability が実際に描ける mode。
87
+ *
88
+ * 未知の値は**黙って light-dark 扱いにしない**。TypeScript を使わない消費者や、将来
89
+ * capability の値が増えたときに、誤った値が「両対応の theme」として通ってしまうと、
90
+ * 持っていない mode で描画されて初めて壊れる(=原因から遠い場所で落ちる)。
91
+ */
79
92
  export declare function supportedModes(colorScheme: ColorSchemeCapability): ThemeMode[];
80
93
  /**
81
94
  * 表示 mode を解決する(純関数。ThemeProvider はこの結果に従うだけで判定はしない)。
@@ -97,6 +110,12 @@ export declare function resolveMode(colorScheme: ColorSchemeCapability, forcedMo
97
110
  * 「宣言した mode の色が欠けている」「as キャストでキーが抜けた」といった、型を通り抜けた欠落を拾う。
98
111
  * `defineTheme()` が dev で1回だけ呼ぶ。**render 中に呼ばないこと**(theme-ui は Provider の
99
112
  * render body で毎レンダー全色を再帰走査して性能を落とした前例がある)。
113
+ *
114
+ * ⚠️ **完全な runtime validation ではない**。キーの存在と(data property のときだけ)
115
+ * `undefined` でないことを見るだけで、値の型・範囲・accessor の戻り値までは検査しない。
116
+ * 意図的にそうしている(上の missingKeys のコメント参照)。
117
+ *
118
+ * @experimental 公開しているが安定 API ではない。検査範囲とメッセージは予告なく変わりうる。
100
119
  */
101
120
  export declare function validateTheme(options: ThemeOptions): string[];
102
121
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"define-theme.d.ts","sourceRoot":"","sources":["../../../../src/theme/define-theme.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAIV,WAAW,EAGX,cAAc,EAGd,UAAU,EACV,SAAS,EACV,MAAM,SAAS,CAAC;AAMjB;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,KAAK,EAAE,OAID,CAAC;AAMpB,4DAA4D;AAC5D,MAAM,MAAM,qBAAqB,GAAG,YAAY,GAAG,cAAc,GAAG,aAAa,CAAC;AAElF;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,qBAAqB,CAAC;CACpC;AAED;;;GAGG;AACH,MAAM,WAAW,YAAa,SAAQ,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9D,gEAAgE;IAChE,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,GAAG;QACpC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC,CAAC;KACtD,CAAC;CACH;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAoB,SAAQ,YAAY;IACvD,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC;IACvB,QAAQ,CAAC,YAAY,EAAE,oBAAoB,CAAC;CAC7C;AAED,0EAA0E;AAC1E,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,yBAAyB,CAAC;IAChC,oCAAoC;IACpC,SAAS,EAAE,SAAS,CAAC;IACrB,oBAAoB;IACpB,QAAQ,EAAE,SAAS,CAAC;IACpB,WAAW,EAAE,qBAAqB,CAAC;CACpC;AA0GD,mEAAmE;AACnE,wBAAgB,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC,GAAG,SAAS,EAAE,CAE/F;AAED,6DAA6D;AAC7D,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC,GACnD,qBAAqB,CAQvB;AAED,+BAA+B;AAC/B,wBAAgB,cAAc,CAAC,WAAW,EAAE,qBAAqB,GAAG,SAAS,EAAE,CAI9E;AAMD;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CACzB,WAAW,EAAE,qBAAqB,EAClC,UAAU,EAAE,SAAS,GAAG,SAAS,EACjC,UAAU,EAAE,SAAS,GACpB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,SAAS,CAAC,EAAE,kBAAkB,CAAA;CAAE,CAYrD;AAWD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,EAAE,CAwD7D;AAoDD;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,mBAAmB,CAyBtE"}
1
+ {"version":3,"file":"define-theme.d.ts","sourceRoot":"","sources":["../../../../src/theme/define-theme.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAIV,WAAW,EAGX,cAAc,EAGd,UAAU,EACV,SAAS,EACV,MAAM,SAAS,CAAC;AAMjB;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,KAAK,EAAE,OAID,CAAC;AAMpB,4DAA4D;AAC5D,MAAM,MAAM,qBAAqB,GAAG,YAAY,GAAG,cAAc,GAAG,aAAa,CAAC;AAElF;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,qBAAqB,CAAC;CACpC;AAED;;;GAGG;AACH,MAAM,WAAW,YAAa,SAAQ,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9D,gEAAgE;IAChE,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,GAAG;QACpC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC,CAAC;KACtD,CAAC;CACH;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAoB,SAAQ,YAAY;IACvD,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC;IACvB,QAAQ,CAAC,YAAY,EAAE,oBAAoB,CAAC;CAC7C;AAED,0EAA0E;AAC1E,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,yBAAyB,CAAC;IAChC,oCAAoC;IACpC,SAAS,EAAE,SAAS,CAAC;IACrB,oBAAoB;IACpB,QAAQ,EAAE,SAAS,CAAC;IACpB,WAAW,EAAE,qBAAqB,CAAC;CACpC;AA0GD;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC,GAAG,SAAS,EAAE,CAG/F;AAED,6DAA6D;AAC7D,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC,GACnD,qBAAqB,CAQvB;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,qBAAqB,GAAG,SAAS,EAAE,CAa9E;AAMD;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CACzB,WAAW,EAAE,qBAAqB,EAClC,UAAU,EAAE,SAAS,GAAG,SAAS,EACjC,UAAU,EAAE,SAAS,GACpB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,SAAS,CAAC,EAAE,kBAAkB,CAAA;CAAE,CAgBrD;AA2BD;;;;;;;;;;;;GAYG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,EAAE,CAwD7D;AA4FD;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,mBAAmB,CA4BtE"}
@@ -7,7 +7,13 @@ export * from "./types";
7
7
  export { nativeTheme } from "./native-theme";
8
8
  export { ThemeProvider, useTheme } from "./ThemeProvider";
9
9
  export type { ThemeContextValue, ThemeMode } from "./ThemeProvider";
10
- export { defineTheme, validateTheme, resolveMode, supportedModes, deriveColorScheme, declaredModes, } from "./define-theme";
10
+ export { defineTheme } from "./define-theme";
11
+ /**
12
+ * 以下は theme の解決規則を外から検証・再利用するためのヘルパ。
13
+ * **@experimental — 安定 API ではない。** 挙動・シグネチャ・メッセージは予告なく変わりうる。
14
+ * アプリの実行時ロジックが依存する場合は、useTheme().capabilities を使うほうが安全。
15
+ */
16
+ export { validateTheme, resolveMode, supportedModes, deriveColorScheme, declaredModes, } from "./define-theme";
11
17
  export type { ColorSchemeCapability, ResolvedCapabilities, ResolvedNativeTheme, ThemeModeViolation, ThemeOptions, } from "./define-theme";
12
18
  /**
13
19
  * letterSpacingRatio(em 相当の比率)を、適用先の fontSize から RN の letterSpacing(pt) に解決する。
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/theme/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC1D,YAAY,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACpE,OAAO,EACL,WAAW,EACX,aAAa,EACb,WAAW,EACX,cAAc,EACd,iBAAiB,EACjB,aAAa,GACd,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,qBAAqB,EACrB,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EAClB,YAAY,GACb,MAAM,gBAAgB,CAAC;AAExB;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAE5E"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/theme/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC1D,YAAY,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C;;;;GAIG;AACH,OAAO,EACL,aAAa,EACb,WAAW,EACX,cAAc,EACd,iBAAiB,EACjB,aAAa,GACd,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,qBAAqB,EACrB,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EAClB,YAAY,GACb,MAAM,gBAAgB,CAAC;AAExB;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAE5E"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "melta-app",
3
- "version": "0.4.1",
3
+ "version": "0.4.3",
4
4
  "description": "melta for APP — melta デザインシステムの React Native UI kit。melta-contracts(デザイン契約)を single source of truth に RN 実装でその契約を満たす。アプリ本体ではなくライブラリ。",
5
5
  "license": "MIT",
6
6
  "homepage": "https://app.melta.tsubotax.com",
@@ -103,6 +103,8 @@
103
103
  "lint": "eslint . --max-warnings 0",
104
104
  "check:drift": "tsx scripts/check-drift.ts",
105
105
  "check:installability": "bash scripts/check-installability.sh",
106
+ "check:build-fresh": "tsx scripts/check-build-fresh.ts",
107
+ "release": "npm run build && npm run typecheck && npm run lint && npm test && npm run test:rn && npm run check:drift && npm run check:build-fresh && npm publish",
106
108
  "build:llms": "tsx scripts/build-llms-txt.ts"
107
109
  },
108
110
  "jest": {
@@ -46,13 +46,23 @@ const ThemeContext = createContext<ThemeContextValue | null>(null);
46
46
  */
47
47
  const DEFAULT_THEME: ResolvedNativeTheme = defineTheme({ ...nativeTheme, id: "melta" });
48
48
 
49
- /** 同じ矛盾を毎レンダー報告しないためのラッチ(StrictMode の二重 render も1回に畳む)。 */
50
- const reportedViolations = new Set<string>();
49
+ /**
50
+ * 同じ矛盾を毎レンダー報告しないためのラッチ(StrictMode の二重 render も1回に畳む)。
51
+ *
52
+ * キーは **theme の参照**。id 文字列にすると、id 未設定の theme 同士や同じ id を持つ別 theme が
53
+ * 互いの警告を打ち消してしまう(報告されるべき矛盾が黙る)。WeakMap なので theme が捨てられれば
54
+ * エントリも消える=動的に theme を作るアプリでも溜まらない。
55
+ */
56
+ const reportedViolations = new WeakMap<ResolvedNativeTheme, Set<ThemeMode>>();
51
57
 
52
- function reportViolation(themeId: string | undefined, violation: ThemeModeViolation): void {
53
- const key = `${themeId ?? "(id 未設定)"}:${violation.requested}`;
54
- if (reportedViolations.has(key)) return;
55
- reportedViolations.add(key);
58
+ function reportViolation(theme: ResolvedNativeTheme, violation: ThemeModeViolation): void {
59
+ let reported = reportedViolations.get(theme);
60
+ if (reported === undefined) {
61
+ reported = new Set();
62
+ reportedViolations.set(theme, reported);
63
+ }
64
+ if (reported.has(violation.requested)) return;
65
+ reported.add(violation.requested);
56
66
  console.error(
57
67
  `melta: forcedMode="${violation.requested}" が指定されたが、この theme は ` +
58
68
  `colorScheme=${violation.colorScheme} なので "${violation.resolved}" で描画する。` +
@@ -87,7 +97,7 @@ export function ThemeProvider({ children, forcedMode, theme }: ThemeProviderProp
87
97
  forcedMode,
88
98
  system === "dark" ? "dark" : "light",
89
99
  );
90
- if (isDev && violation) reportViolation(activeTheme.id, violation);
100
+ if (isDev && violation) reportViolation(activeTheme, violation);
91
101
 
92
102
  const value = useMemo<ThemeContextValue>(() => {
93
103
  const colors = activeTheme.color.semantic[mode];
@@ -233,11 +233,26 @@ export function deriveColorScheme(
233
233
  );
234
234
  }
235
235
 
236
- /** capability が実際に描ける mode。 */
236
+ /**
237
+ * capability が実際に描ける mode。
238
+ *
239
+ * 未知の値は**黙って light-dark 扱いにしない**。TypeScript を使わない消費者や、将来
240
+ * capability の値が増えたときに、誤った値が「両対応の theme」として通ってしまうと、
241
+ * 持っていない mode で描画されて初めて壊れる(=原因から遠い場所で落ちる)。
242
+ */
237
243
  export function supportedModes(colorScheme: ColorSchemeCapability): ThemeMode[] {
238
- if (colorScheme === "single-dark") return ["dark"];
239
- if (colorScheme === "single-light") return ["light"];
240
- return ["light", "dark"];
244
+ switch (colorScheme) {
245
+ case "light-dark":
246
+ return ["light", "dark"];
247
+ case "single-dark":
248
+ return ["dark"];
249
+ case "single-light":
250
+ return ["light"];
251
+ default: {
252
+ const unknown: never = colorScheme;
253
+ throw new Error(`melta: 未知の colorScheme capability "${String(unknown)}"。`);
254
+ }
255
+ }
241
256
  }
242
257
 
243
258
  // ---------------------------------------------------------------------------
@@ -261,6 +276,10 @@ export function resolveMode(
261
276
  ): { mode: ThemeMode; violation?: ThemeModeViolation } {
262
277
  const supported = supportedModes(colorScheme);
263
278
  const requested = forcedMode ?? systemMode;
279
+ // 未知の mode を supported[0] へ黙って倒すと、typo が「正常な light 表示」に化ける。
280
+ if (!(MODES as string[]).includes(requested)) {
281
+ throw new Error(`melta: 未知の mode "${String(requested)}"。light / dark のみ。`);
282
+ }
264
283
  if (supported.includes(requested)) return { mode: requested };
265
284
 
266
285
  const resolved = supported[0];
@@ -276,9 +295,25 @@ export function resolveMode(
276
295
  // validation(開発時のみ。純関数なのでテストからも直接呼べる)
277
296
  // ---------------------------------------------------------------------------
278
297
 
298
+ /**
299
+ * 欠けているキーを返す。**accessor で埋めた欄も「ある」と数える**(消費者が「まだ埋められない欄」に
300
+ * getter を置くのは正当な使い方なので、descriptor の存在だけを見る)。
301
+ *
302
+ * data property のときは値も見る(`undefined` を入れて型検査だけすり抜けた欄を拾う)。
303
+ * accessor は**呼ばない** — 呼ぶと消費者の開発用プローブが theme 構築時に全部発火し、
304
+ * 「melta が実際にどの欄を読んだか」の信号を壊してしまう。
305
+ */
279
306
  function missingKeys(target: object | undefined, keys: readonly (string | number)[]): string[] {
280
307
  if (target === null || typeof target !== "object") return [...keys].map(String);
281
- return keys.filter((key) => !Object.prototype.hasOwnProperty.call(target, key)).map(String);
308
+ return keys
309
+ .filter((key) => {
310
+ const descriptor = Object.getOwnPropertyDescriptor(target, key);
311
+ if (descriptor === undefined) return true;
312
+ // accessor は値を読まずに「ある」とみなす
313
+ if (!("value" in descriptor)) return false;
314
+ return descriptor.value === undefined;
315
+ })
316
+ .map(String);
282
317
  }
283
318
 
284
319
  /**
@@ -287,6 +322,12 @@ function missingKeys(target: object | undefined, keys: readonly (string | number
287
322
  * 「宣言した mode の色が欠けている」「as キャストでキーが抜けた」といった、型を通り抜けた欠落を拾う。
288
323
  * `defineTheme()` が dev で1回だけ呼ぶ。**render 中に呼ばないこと**(theme-ui は Provider の
289
324
  * render body で毎レンダー全色を再帰走査して性能を落とした前例がある)。
325
+ *
326
+ * ⚠️ **完全な runtime validation ではない**。キーの存在と(data property のときだけ)
327
+ * `undefined` でないことを見るだけで、値の型・範囲・accessor の戻り値までは検査しない。
328
+ * 意図的にそうしている(上の missingKeys のコメント参照)。
329
+ *
330
+ * @experimental 公開しているが安定 API ではない。検査範囲とメッセージは予告なく変わりうる。
290
331
  */
291
332
  export function validateTheme(options: ThemeOptions): string[] {
292
333
  const problems: string[] = [];
@@ -386,13 +427,53 @@ function installMissingModeGuards(
386
427
  }
387
428
  }
388
429
 
389
- /** dev 限定の再帰 freeze。enumerable なキーだけ辿るので上の guard getter は踏まない。 */
430
+ /** プレーンなオブジェクト(クラスインスタンスや null プロトタイプ以外の特殊物を除く)か。 */
431
+ function isPlainObject(value: unknown): value is Record<PropertyKey, unknown> {
432
+ if (typeof value !== "object" || value === null) return false;
433
+ const proto: unknown = Object.getPrototypeOf(value);
434
+ return proto === Object.prototype || proto === null;
435
+ }
436
+
437
+ /**
438
+ * トークンの木を**複製する**。melta が自分のコピーを所有するために要る。
439
+ *
440
+ * なぜ単純な spread や structuredClone でないか:
441
+ * - **accessor を呼ばない**。消費者は「まだ埋められない欄」に getter を置くことがある
442
+ * (capability が無い軸を検出する開発用プローブ)。値を読んで複製すると、theme を
443
+ * 組み立てた時点で全部発火し、「melta が実際にどの欄を読んだか」の信号が壊れる。
444
+ * descriptor をそのまま移せば、getter は getter のまま運ばれる。
445
+ * - 再帰するのは plain object / array の **data property** だけ。それ以外(関数・
446
+ * クラスインスタンス・accessor)は素通しする。
447
+ */
448
+ function cloneTokenTree<T>(value: T): T {
449
+ if (Array.isArray(value)) return value.map((item: unknown) => cloneTokenTree(item)) as T;
450
+ if (!isPlainObject(value)) return value;
451
+
452
+ const source = Object.getOwnPropertyDescriptors(value);
453
+ const target: PropertyDescriptorMap = {};
454
+ for (const key of Reflect.ownKeys(source)) {
455
+ const descriptor = source[key as keyof typeof source] as PropertyDescriptor;
456
+ target[key as string] =
457
+ "value" in descriptor
458
+ ? { ...descriptor, value: cloneTokenTree(descriptor.value) }
459
+ : descriptor;
460
+ }
461
+ return Object.defineProperties({}, target) as T;
462
+ }
463
+
464
+ /**
465
+ * dev 限定の再帰 freeze。**accessor は呼ばずに素通りする**(cloneTokenTree と同じ理由)。
466
+ * 呼ぶ相手は cloneTokenTree で作った melta 所有のコピーだけ。消費者の入力や、公開 export の
467
+ * `nativeTheme` の入れ子は凍らせない(凍らせると `{...nativeTheme}` からの派生が dev で壊れる)。
468
+ */
390
469
  function deepFreeze(value: unknown): void {
391
- if (value === null || typeof value !== "object") return;
470
+ if (!isPlainObject(value) && !Array.isArray(value)) return;
392
471
  if (Object.isFrozen(value)) return;
393
472
  Object.freeze(value);
394
- for (const key of Object.keys(value)) {
395
- deepFreeze((value as Record<string, unknown>)[key]);
473
+ const descriptors = Object.getOwnPropertyDescriptors(value);
474
+ for (const descriptor of Object.values<PropertyDescriptor>(descriptors)) {
475
+ // accessor は呼ばない(呼ぶと消費者の開発用プローブが発火する)
476
+ if ("value" in descriptor) deepFreeze(descriptor.value);
396
477
  }
397
478
  }
398
479
 
@@ -414,12 +495,15 @@ export function defineTheme(options: ThemeOptions): ResolvedNativeTheme {
414
495
  }
415
496
  }
416
497
 
417
- const semantic: Partial<Record<ThemeMode, SemanticColors>> = { ...options.color.semantic };
498
+ // 入力と参照を共有しない。共有すると (a) 呼び出し側の後からの書き換えが解決済み theme
499
+ // 波及し(再レンダーは起きないので画面ごとに新旧が混在する)(b) dev の deepFreeze が
500
+ // 呼び出し側の入力と公開 export の nativeTheme まで凍らせて、正当な派生を壊す。
501
+ const owned = cloneTokenTree(options);
502
+ const semantic = owned.color.semantic;
418
503
  const colorScheme = deriveColorScheme(semantic);
419
504
 
420
505
  const theme: ResolvedNativeTheme = {
421
- ...options,
422
- color: { ...options.color, semantic },
506
+ ...owned,
423
507
  capabilities: { colorScheme },
424
508
  $$melta: true,
425
509
  };
@@ -8,8 +8,13 @@ export * from "./types";
8
8
  export { nativeTheme } from "./native-theme";
9
9
  export { ThemeProvider, useTheme } from "./ThemeProvider";
10
10
  export type { ThemeContextValue, ThemeMode } from "./ThemeProvider";
11
+ export { defineTheme } from "./define-theme";
12
+ /**
13
+ * 以下は theme の解決規則を外から検証・再利用するためのヘルパ。
14
+ * **@experimental — 安定 API ではない。** 挙動・シグネチャ・メッセージは予告なく変わりうる。
15
+ * アプリの実行時ロジックが依存する場合は、useTheme().capabilities を使うほうが安全。
16
+ */
11
17
  export {
12
- defineTheme,
13
18
  validateTheme,
14
19
  resolveMode,
15
20
  supportedModes,