@number10/jsx-core 5.0.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.
Files changed (340) hide show
  1. package/LICENSE +667 -0
  2. package/README.md +38 -0
  3. package/dist/animation/animated-signal.cjs +19 -0
  4. package/dist/animation/animated-signal.cjs.map +1 -0
  5. package/dist/animation/animated-signal.d.ts +35 -0
  6. package/dist/animation/animated-signal.d.ts.map +1 -0
  7. package/dist/animation/animated-signal.js +19 -0
  8. package/dist/animation/animated-signal.js.map +1 -0
  9. package/dist/animation/create-spring.cjs +80 -0
  10. package/dist/animation/create-spring.cjs.map +1 -0
  11. package/dist/animation/create-spring.d.ts +56 -0
  12. package/dist/animation/create-spring.d.ts.map +1 -0
  13. package/dist/animation/create-spring.js +80 -0
  14. package/dist/animation/create-spring.js.map +1 -0
  15. package/dist/animation/easing.cjs +76 -0
  16. package/dist/animation/easing.cjs.map +1 -0
  17. package/dist/animation/easing.d.ts +45 -0
  18. package/dist/animation/easing.d.ts.map +1 -0
  19. package/dist/animation/easing.js +76 -0
  20. package/dist/animation/easing.js.map +1 -0
  21. package/dist/animation/effect-definitions.cjs +441 -0
  22. package/dist/animation/effect-definitions.cjs.map +1 -0
  23. package/dist/animation/effect-definitions.d.ts +60 -0
  24. package/dist/animation/effect-definitions.d.ts.map +1 -0
  25. package/dist/animation/effect-definitions.js +441 -0
  26. package/dist/animation/effect-definitions.js.map +1 -0
  27. package/dist/animation/effect-engine.cjs +189 -0
  28. package/dist/animation/effect-engine.cjs.map +1 -0
  29. package/dist/animation/effect-engine.d.ts +70 -0
  30. package/dist/animation/effect-engine.d.ts.map +1 -0
  31. package/dist/animation/effect-engine.js +189 -0
  32. package/dist/animation/effect-engine.js.map +1 -0
  33. package/dist/animation/index.d.ts +24 -0
  34. package/dist/animation/index.d.ts.map +1 -0
  35. package/dist/animation/spring-physics.cjs +94 -0
  36. package/dist/animation/spring-physics.cjs.map +1 -0
  37. package/dist/animation/spring-physics.d.ts +145 -0
  38. package/dist/animation/spring-physics.d.ts.map +1 -0
  39. package/dist/animation/spring-physics.js +94 -0
  40. package/dist/animation/spring-physics.js.map +1 -0
  41. package/dist/animation/tween.cjs +67 -0
  42. package/dist/animation/tween.cjs.map +1 -0
  43. package/dist/animation/tween.d.ts +60 -0
  44. package/dist/animation/tween.d.ts.map +1 -0
  45. package/dist/animation/tween.js +67 -0
  46. package/dist/animation/tween.js.map +1 -0
  47. package/dist/animation/types.d.ts +31 -0
  48. package/dist/animation/types.d.ts.map +1 -0
  49. package/dist/animation/useSpring.cjs +152 -0
  50. package/dist/animation/useSpring.cjs.map +1 -0
  51. package/dist/animation/useSpring.d.ts +55 -0
  52. package/dist/animation/useSpring.d.ts.map +1 -0
  53. package/dist/animation/useSpring.js +149 -0
  54. package/dist/animation/useSpring.js.map +1 -0
  55. package/dist/animation/useTween.cjs +208 -0
  56. package/dist/animation/useTween.cjs.map +1 -0
  57. package/dist/animation/useTween.d.ts +116 -0
  58. package/dist/animation/useTween.d.ts.map +1 -0
  59. package/dist/animation/useTween.js +208 -0
  60. package/dist/animation/useTween.js.map +1 -0
  61. package/dist/border-geometry.cjs +447 -0
  62. package/dist/border-geometry.cjs.map +1 -0
  63. package/dist/border-geometry.d.ts +114 -0
  64. package/dist/border-geometry.d.ts.map +1 -0
  65. package/dist/border-geometry.js +447 -0
  66. package/dist/border-geometry.js.map +1 -0
  67. package/dist/colors/color-presets.cjs +236 -0
  68. package/dist/colors/color-presets.cjs.map +1 -0
  69. package/dist/colors/color-presets.d.ts +89 -0
  70. package/dist/colors/color-presets.d.ts.map +1 -0
  71. package/dist/colors/color-presets.js +236 -0
  72. package/dist/colors/color-presets.js.map +1 -0
  73. package/dist/colors/color-theme-helpers.cjs +32 -0
  74. package/dist/colors/color-theme-helpers.cjs.map +1 -0
  75. package/dist/colors/color-theme-helpers.d.ts +65 -0
  76. package/dist/colors/color-theme-helpers.d.ts.map +1 -0
  77. package/dist/colors/color-theme-helpers.js +32 -0
  78. package/dist/colors/color-theme-helpers.js.map +1 -0
  79. package/dist/colors/color-types.cjs +38 -0
  80. package/dist/colors/color-types.cjs.map +1 -0
  81. package/dist/colors/color-types.d.ts +112 -0
  82. package/dist/colors/color-types.d.ts.map +1 -0
  83. package/dist/colors/color-types.js +38 -0
  84. package/dist/colors/color-types.js.map +1 -0
  85. package/dist/colors/color-utils.cjs +197 -0
  86. package/dist/colors/color-utils.cjs.map +1 -0
  87. package/dist/colors/color-utils.d.ts +216 -0
  88. package/dist/colors/color-utils.d.ts.map +1 -0
  89. package/dist/colors/color-utils.js +197 -0
  90. package/dist/colors/color-utils.js.map +1 -0
  91. package/dist/colors/contrast-contracts.cjs +265 -0
  92. package/dist/colors/contrast-contracts.cjs.map +1 -0
  93. package/dist/colors/contrast-contracts.d.ts +289 -0
  94. package/dist/colors/contrast-contracts.d.ts.map +1 -0
  95. package/dist/colors/contrast-contracts.js +265 -0
  96. package/dist/colors/contrast-contracts.js.map +1 -0
  97. package/dist/colors/index.cjs +55 -0
  98. package/dist/colors/index.cjs.map +1 -0
  99. package/dist/colors/index.d.ts +16 -0
  100. package/dist/colors/index.d.ts.map +1 -0
  101. package/dist/colors/index.js +55 -0
  102. package/dist/colors/index.js.map +1 -0
  103. package/dist/core-props.cjs +66 -0
  104. package/dist/core-props.cjs.map +1 -0
  105. package/dist/core-props.d.ts +395 -0
  106. package/dist/core-props.d.ts.map +1 -0
  107. package/dist/core-props.js +66 -0
  108. package/dist/core-props.js.map +1 -0
  109. package/dist/design-tokens/design-token-presets.cjs +91 -0
  110. package/dist/design-tokens/design-token-presets.cjs.map +1 -0
  111. package/dist/design-tokens/design-token-presets.d.ts +34 -0
  112. package/dist/design-tokens/design-token-presets.d.ts.map +1 -0
  113. package/dist/design-tokens/design-token-presets.js +91 -0
  114. package/dist/design-tokens/design-token-presets.js.map +1 -0
  115. package/dist/design-tokens/design-token-types.d.ts +97 -0
  116. package/dist/design-tokens/design-token-types.d.ts.map +1 -0
  117. package/dist/design-tokens/index.cjs +10 -0
  118. package/dist/design-tokens/index.cjs.map +1 -0
  119. package/dist/design-tokens/index.d.ts +9 -0
  120. package/dist/design-tokens/index.d.ts.map +1 -0
  121. package/dist/design-tokens/index.js +10 -0
  122. package/dist/design-tokens/index.js.map +1 -0
  123. package/dist/dev-config.cjs +296 -0
  124. package/dist/dev-config.cjs.map +1 -0
  125. package/dist/dev-config.d.ts +238 -0
  126. package/dist/dev-config.d.ts.map +1 -0
  127. package/dist/dev-config.js +296 -0
  128. package/dist/dev-config.js.map +1 -0
  129. package/dist/effects.cjs +69 -0
  130. package/dist/effects.cjs.map +1 -0
  131. package/dist/effects.d.ts +152 -0
  132. package/dist/effects.d.ts.map +1 -0
  133. package/dist/effects.js +69 -0
  134. package/dist/effects.js.map +1 -0
  135. package/dist/global-registry.cjs +25 -0
  136. package/dist/global-registry.cjs.map +1 -0
  137. package/dist/global-registry.d.ts +19 -0
  138. package/dist/global-registry.d.ts.map +1 -0
  139. package/dist/global-registry.js +25 -0
  140. package/dist/global-registry.js.map +1 -0
  141. package/dist/hooks.cjs +378 -0
  142. package/dist/hooks.cjs.map +1 -0
  143. package/dist/hooks.d.ts +322 -0
  144. package/dist/hooks.d.ts.map +1 -0
  145. package/dist/hooks.js +378 -0
  146. package/dist/hooks.js.map +1 -0
  147. package/dist/host-adapter.d.ts +414 -0
  148. package/dist/host-adapter.d.ts.map +1 -0
  149. package/dist/index.cjs +229 -0
  150. package/dist/index.cjs.map +1 -0
  151. package/dist/index.d.ts +32 -0
  152. package/dist/index.d.ts.map +1 -0
  153. package/dist/index.js +226 -0
  154. package/dist/index.js.map +1 -0
  155. package/dist/jsx-dev-runtime.cjs +10 -0
  156. package/dist/jsx-dev-runtime.cjs.map +1 -0
  157. package/dist/jsx-dev-runtime.d.ts +5 -0
  158. package/dist/jsx-dev-runtime.d.ts.map +1 -0
  159. package/dist/jsx-dev-runtime.js +11 -0
  160. package/dist/jsx-dev-runtime.js.map +1 -0
  161. package/dist/jsx-runtime.cjs +44 -0
  162. package/dist/jsx-runtime.cjs.map +1 -0
  163. package/dist/jsx-runtime.d.ts +24 -0
  164. package/dist/jsx-runtime.d.ts.map +1 -0
  165. package/dist/jsx-runtime.js +44 -0
  166. package/dist/jsx-runtime.js.map +1 -0
  167. package/dist/jsx-types.d.ts +25 -0
  168. package/dist/jsx-types.d.ts.map +1 -0
  169. package/dist/layout/appliers/container-applier.cjs +20 -0
  170. package/dist/layout/appliers/container-applier.cjs.map +1 -0
  171. package/dist/layout/appliers/container-applier.d.ts +9 -0
  172. package/dist/layout/appliers/container-applier.d.ts.map +1 -0
  173. package/dist/layout/appliers/container-applier.js +20 -0
  174. package/dist/layout/appliers/container-applier.js.map +1 -0
  175. package/dist/layout/appliers/position-applier.cjs +31 -0
  176. package/dist/layout/appliers/position-applier.cjs.map +1 -0
  177. package/dist/layout/appliers/position-applier.d.ts +8 -0
  178. package/dist/layout/appliers/position-applier.d.ts.map +1 -0
  179. package/dist/layout/appliers/position-applier.js +31 -0
  180. package/dist/layout/appliers/position-applier.js.map +1 -0
  181. package/dist/layout/layout-engine-test-utils.d.ts +26 -0
  182. package/dist/layout/layout-engine-test-utils.d.ts.map +1 -0
  183. package/dist/layout/layout-engine.cjs +628 -0
  184. package/dist/layout/layout-engine.cjs.map +1 -0
  185. package/dist/layout/layout-engine.d.ts +140 -0
  186. package/dist/layout/layout-engine.d.ts.map +1 -0
  187. package/dist/layout/layout-engine.js +628 -0
  188. package/dist/layout/layout-engine.js.map +1 -0
  189. package/dist/layout/strategies/base-strategy.cjs +31 -0
  190. package/dist/layout/strategies/base-strategy.cjs.map +1 -0
  191. package/dist/layout/strategies/base-strategy.d.ts +59 -0
  192. package/dist/layout/strategies/base-strategy.d.ts.map +1 -0
  193. package/dist/layout/strategies/base-strategy.js +31 -0
  194. package/dist/layout/strategies/base-strategy.js.map +1 -0
  195. package/dist/layout/strategies/column-layout.cjs +145 -0
  196. package/dist/layout/strategies/column-layout.cjs.map +1 -0
  197. package/dist/layout/strategies/column-layout.d.ts +38 -0
  198. package/dist/layout/strategies/column-layout.d.ts.map +1 -0
  199. package/dist/layout/strategies/column-layout.js +145 -0
  200. package/dist/layout/strategies/column-layout.js.map +1 -0
  201. package/dist/layout/strategies/row-layout.cjs +145 -0
  202. package/dist/layout/strategies/row-layout.cjs.map +1 -0
  203. package/dist/layout/strategies/row-layout.d.ts +38 -0
  204. package/dist/layout/strategies/row-layout.d.ts.map +1 -0
  205. package/dist/layout/strategies/row-layout.js +145 -0
  206. package/dist/layout/strategies/row-layout.js.map +1 -0
  207. package/dist/layout/strategies/stack-layout.cjs +94 -0
  208. package/dist/layout/strategies/stack-layout.cjs.map +1 -0
  209. package/dist/layout/strategies/stack-layout.d.ts +30 -0
  210. package/dist/layout/strategies/stack-layout.d.ts.map +1 -0
  211. package/dist/layout/strategies/stack-layout.js +94 -0
  212. package/dist/layout/strategies/stack-layout.js.map +1 -0
  213. package/dist/layout/types.d.ts +134 -0
  214. package/dist/layout/types.d.ts.map +1 -0
  215. package/dist/layout/utils/child-utils.cjs +129 -0
  216. package/dist/layout/utils/child-utils.cjs.map +1 -0
  217. package/dist/layout/utils/child-utils.d.ts +54 -0
  218. package/dist/layout/utils/child-utils.d.ts.map +1 -0
  219. package/dist/layout/utils/child-utils.js +129 -0
  220. package/dist/layout/utils/child-utils.js.map +1 -0
  221. package/dist/layout/utils/dimension-calculator.cjs +109 -0
  222. package/dist/layout/utils/dimension-calculator.cjs.map +1 -0
  223. package/dist/layout/utils/dimension-calculator.d.ts +59 -0
  224. package/dist/layout/utils/dimension-calculator.d.ts.map +1 -0
  225. package/dist/layout/utils/dimension-calculator.js +109 -0
  226. package/dist/layout/utils/dimension-calculator.js.map +1 -0
  227. package/dist/layout/utils/flex-distributor.cjs +173 -0
  228. package/dist/layout/utils/flex-distributor.cjs.map +1 -0
  229. package/dist/layout/utils/flex-distributor.d.ts +18 -0
  230. package/dist/layout/utils/flex-distributor.d.ts.map +1 -0
  231. package/dist/layout/utils/flex-distributor.js +173 -0
  232. package/dist/layout/utils/flex-distributor.js.map +1 -0
  233. package/dist/layout/utils/size-resolver.cjs +280 -0
  234. package/dist/layout/utils/size-resolver.cjs.map +1 -0
  235. package/dist/layout/utils/size-resolver.d.ts +84 -0
  236. package/dist/layout/utils/size-resolver.d.ts.map +1 -0
  237. package/dist/layout/utils/size-resolver.js +280 -0
  238. package/dist/layout/utils/size-resolver.js.map +1 -0
  239. package/dist/layout/utils/spacing-calculator.cjs +50 -0
  240. package/dist/layout/utils/spacing-calculator.cjs.map +1 -0
  241. package/dist/layout/utils/spacing-calculator.d.ts +27 -0
  242. package/dist/layout/utils/spacing-calculator.d.ts.map +1 -0
  243. package/dist/layout/utils/spacing-calculator.js +50 -0
  244. package/dist/layout/utils/spacing-calculator.js.map +1 -0
  245. package/dist/memo.cjs +18 -0
  246. package/dist/memo.cjs.map +1 -0
  247. package/dist/memo.d.ts +29 -0
  248. package/dist/memo.d.ts.map +1 -0
  249. package/dist/memo.js +18 -0
  250. package/dist/memo.js.map +1 -0
  251. package/dist/nineslice-contract.cjs +60 -0
  252. package/dist/nineslice-contract.cjs.map +1 -0
  253. package/dist/nineslice-contract.d.ts +107 -0
  254. package/dist/nineslice-contract.d.ts.map +1 -0
  255. package/dist/nineslice-contract.js +60 -0
  256. package/dist/nineslice-contract.js.map +1 -0
  257. package/dist/placeholder.cjs +12 -0
  258. package/dist/placeholder.cjs.map +1 -0
  259. package/dist/placeholder.d.ts +44 -0
  260. package/dist/placeholder.d.ts.map +1 -0
  261. package/dist/placeholder.js +12 -0
  262. package/dist/placeholder.js.map +1 -0
  263. package/dist/portal.cjs +89 -0
  264. package/dist/portal.cjs.map +1 -0
  265. package/dist/portal.d.ts +62 -0
  266. package/dist/portal.d.ts.map +1 -0
  267. package/dist/portal.js +89 -0
  268. package/dist/portal.js.map +1 -0
  269. package/dist/primitive-contracts.cjs +12 -0
  270. package/dist/primitive-contracts.cjs.map +1 -0
  271. package/dist/primitive-contracts.d.ts +186 -0
  272. package/dist/primitive-contracts.d.ts.map +1 -0
  273. package/dist/primitive-contracts.js +12 -0
  274. package/dist/primitive-contracts.js.map +1 -0
  275. package/dist/theme.cjs +332 -0
  276. package/dist/theme.cjs.map +1 -0
  277. package/dist/theme.d.ts +204 -0
  278. package/dist/theme.d.ts.map +1 -0
  279. package/dist/theme.js +332 -0
  280. package/dist/theme.js.map +1 -0
  281. package/dist/types.d.ts +86 -0
  282. package/dist/types.d.ts.map +1 -0
  283. package/dist/vdom/create-runtime.cjs +79 -0
  284. package/dist/vdom/create-runtime.cjs.map +1 -0
  285. package/dist/vdom/create-runtime.d.ts +7 -0
  286. package/dist/vdom/create-runtime.d.ts.map +1 -0
  287. package/dist/vdom/create-runtime.js +79 -0
  288. package/dist/vdom/create-runtime.js.map +1 -0
  289. package/dist/vdom/index.cjs +8 -0
  290. package/dist/vdom/index.cjs.map +1 -0
  291. package/dist/vdom/index.d.ts +4 -0
  292. package/dist/vdom/index.d.ts.map +1 -0
  293. package/dist/vdom/index.js +8 -0
  294. package/dist/vdom/index.js.map +1 -0
  295. package/dist/vdom/mount.cjs +161 -0
  296. package/dist/vdom/mount.cjs.map +1 -0
  297. package/dist/vdom/mount.d.ts +6 -0
  298. package/dist/vdom/mount.d.ts.map +1 -0
  299. package/dist/vdom/mount.js +161 -0
  300. package/dist/vdom/mount.js.map +1 -0
  301. package/dist/vdom/patch.cjs +163 -0
  302. package/dist/vdom/patch.cjs.map +1 -0
  303. package/dist/vdom/patch.d.ts +3 -0
  304. package/dist/vdom/patch.d.ts.map +1 -0
  305. package/dist/vdom/patch.js +163 -0
  306. package/dist/vdom/patch.js.map +1 -0
  307. package/dist/vdom/registry.cjs +85 -0
  308. package/dist/vdom/registry.cjs.map +1 -0
  309. package/dist/vdom/registry.d.ts +28 -0
  310. package/dist/vdom/registry.d.ts.map +1 -0
  311. package/dist/vdom/registry.js +85 -0
  312. package/dist/vdom/registry.js.map +1 -0
  313. package/dist/vdom/runtime-helpers.cjs +23 -0
  314. package/dist/vdom/runtime-helpers.cjs.map +1 -0
  315. package/dist/vdom/runtime-helpers.d.ts +8 -0
  316. package/dist/vdom/runtime-helpers.d.ts.map +1 -0
  317. package/dist/vdom/runtime-helpers.js +23 -0
  318. package/dist/vdom/runtime-helpers.js.map +1 -0
  319. package/dist/vdom/surface.cjs +107 -0
  320. package/dist/vdom/surface.cjs.map +1 -0
  321. package/dist/vdom/surface.d.ts +9 -0
  322. package/dist/vdom/surface.d.ts.map +1 -0
  323. package/dist/vdom/surface.js +107 -0
  324. package/dist/vdom/surface.js.map +1 -0
  325. package/dist/vdom/types.d.ts +104 -0
  326. package/dist/vdom/types.d.ts.map +1 -0
  327. package/dist/vdom/utils.cjs +146 -0
  328. package/dist/vdom/utils.cjs.map +1 -0
  329. package/dist/vdom/utils.d.ts +24 -0
  330. package/dist/vdom/utils.d.ts.map +1 -0
  331. package/dist/vdom/utils.js +146 -0
  332. package/dist/vdom/utils.js.map +1 -0
  333. package/dist/vdom.d.ts +4 -0
  334. package/dist/vdom.d.ts.map +1 -0
  335. package/dist/vector-draw-context.d.ts +63 -0
  336. package/dist/vector-draw-context.d.ts.map +1 -0
  337. package/package.json +161 -0
  338. package/vdom/index.cjs +1 -0
  339. package/vdom/index.d.ts +1 -0
  340. package/vdom/index.js +1 -0
@@ -0,0 +1,204 @@
1
+ import { ColorTokens, PresetName } from './colors';
2
+ /**
3
+ * Partial theme — allows overriding specific component styles.
4
+ * Generic over the component theme map type.
5
+ *
6
+ * @example
7
+ * ```ts
8
+ * const theme: PartialTheme<PhaserComponentThemes> = {
9
+ * View: { backgroundColor: 0xff0000 },
10
+ * Text: { fontSize: 20 }
11
+ * }
12
+ * ```
13
+ */
14
+ type ComponentThemeMap<T> = {
15
+ [K in keyof T]: object;
16
+ };
17
+ /**
18
+ * Augmentable portable custom component theme map.
19
+ *
20
+ * Apps can extend this via:
21
+ * `declare module '@number10/jsx-core' { interface CustomComponentThemes { ... } }`
22
+ */
23
+ export interface CustomComponentThemes {
24
+ }
25
+ export type PartialTheme<T extends ComponentThemeMap<T> = Record<string, object>> = {
26
+ [K in keyof T]?: Partial<T[K]>;
27
+ } & {
28
+ /** Optional color preset configuration */
29
+ __colorPreset?: {
30
+ name: string;
31
+ mode?: 'light' | 'dark';
32
+ };
33
+ };
34
+ /**
35
+ * Complete theme with all component styles defined.
36
+ * Built-in components are required, custom components are optional.
37
+ *
38
+ * @param TBuiltIn - Required built-in component themes
39
+ * @param TCustom - Optional custom component themes (defaults to empty object)
40
+ */
41
+ export type Theme<TBuiltIn extends Record<string, Record<string, unknown>>, TCustom extends Record<string, Record<string, unknown>> = Record<string, never>> = {
42
+ [K in keyof TBuiltIn]: TBuiltIn[K];
43
+ } & {
44
+ [K in keyof TCustom]?: TCustom[K];
45
+ };
46
+ /**
47
+ * Type helper for nested component themes.
48
+ * Allows a component theme to include nested themes for child components.
49
+ *
50
+ * @param TComponentThemes - The full component theme map
51
+ * @param TExclude - Keys to exclude (e.g., lowercase primitives)
52
+ */
53
+ export type NestedComponentThemes<TComponentThemes extends ComponentThemeMap<TComponentThemes>, TExclude extends keyof TComponentThemes = never> = {
54
+ [K in Exclude<keyof TComponentThemes, TExclude>]?: Partial<TComponentThemes[K]>;
55
+ };
56
+ /**
57
+ * Extract nested theme keys from a props object.
58
+ * Keys that match known component names are treated as nested themes.
59
+ *
60
+ * @param props - The props object to scan
61
+ * @param knownComponents - Set of known component names
62
+ * @returns Tuple of [ownProps, nestedThemes]
63
+ */
64
+ export declare function extractNestedThemes<T extends Record<string, unknown>>(props: T, knownComponents: ReadonlySet<string>): {
65
+ ownProps: Partial<T>;
66
+ nestedThemes: PartialTheme;
67
+ };
68
+ /**
69
+ * Deep-merge two objects, only overwriting defined values (not undefined).
70
+ */
71
+ export declare function deepMergeDefined<T extends object>(base: T, override: Partial<T>): T;
72
+ /**
73
+ * Normalize primitive host-node names to their canonical theme component names.
74
+ * Non-primitive component names pass through unchanged.
75
+ */
76
+ export declare function normalizeThemeComponentName(componentName: string): string;
77
+ /**
78
+ * Merge theme objects (nested themes). Shallow merge for each component key.
79
+ */
80
+ export declare function mergeThemes(base: PartialTheme | undefined, override: PartialTheme | undefined): PartialTheme;
81
+ /**
82
+ * Options for `resolveComponentTheme`.
83
+ */
84
+ export interface ResolveComponentThemeOptions {
85
+ /** The component's name (e.g., 'Badge', 'ProgressBar', 'View') */
86
+ componentName: string;
87
+ /** The component's global theme defaults (from the theme registry) */
88
+ globalTheme?: PartialTheme | undefined;
89
+ /** The local theme context (propagated from parent or __theme) */
90
+ localTheme?: PartialTheme | undefined;
91
+ /** Explicit props passed to the component */
92
+ explicitProps?: Record<string, unknown> | undefined;
93
+ /** Set of known component names for nested theme detection */
94
+ knownComponents?: ReadonlySet<string> | undefined;
95
+ }
96
+ /**
97
+ * Resolves themed props for a portable component.
98
+ *
99
+ * Merges global theme defaults, local theme context, and explicit props
100
+ * in priority order: global < local < explicit. Only defined values overwrite.
101
+ *
102
+ * Also extracts nested component themes for propagation to children.
103
+ *
104
+ * @returns Themed props and nested theme for children.
105
+ *
106
+ * @example
107
+ * ```ts
108
+ * const { props, nestedTheme } = resolveComponentTheme({
109
+ * componentName: 'Badge',
110
+ * globalTheme: { Badge: { backgroundColor: 0xeeeeee, Icon: { size: 16 } } },
111
+ * localTheme: theme, // from useTheme()
112
+ * explicitProps: { tone: 'primary' },
113
+ * knownComponents: new Set(['View', 'Text', 'Icon', 'Badge'])
114
+ * })
115
+ * // props = { backgroundColor: 0xeeeeee, tone: 'primary' }
116
+ * // nestedTheme = { Icon: { size: 16 } }
117
+ * ```
118
+ */
119
+ export declare function resolveComponentTheme<T extends object = Record<string, unknown>>(options: ResolveComponentThemeOptions): {
120
+ props: T;
121
+ nestedTheme: PartialTheme;
122
+ };
123
+ type ThemeDefaults = Record<string, Record<string, unknown>>;
124
+ export type ComponentThemeDefaultsProvider = (colors: ColorTokens) => object;
125
+ export type ComponentThemeDefaultsInput = object | ComponentThemeDefaultsProvider;
126
+ export declare function setThemeRemountHandler(handler: (() => void) | null): void;
127
+ /**
128
+ * Set of known component names. Components register themselves here
129
+ * so resolveComponentTheme can detect nested component themes.
130
+ */
131
+ export declare const KNOWN_COMPONENTS: Set<string>;
132
+ /**
133
+ * Register preset-aware defaults for a component.
134
+ *
135
+ * Renderer-agnostic components register from @number10/jsx-components.
136
+ * Renderer packages register their own host/component defaults as side effects.
137
+ */
138
+ export declare function registerComponentThemeDefaults(componentName: string, defaults: ComponentThemeDefaultsInput): void;
139
+ /**
140
+ * Register global theme defaults for a component.
141
+ * Also adds the component name to KNOWN_COMPONENTS.
142
+ */
143
+ export declare function registerComponentDefaults(componentName: string, defaults: Record<string, unknown>): void;
144
+ /**
145
+ * Register component defaults only when no defaults exist yet.
146
+ * Useful for portable fallback themes that must not override
147
+ * renderer-provided defaults registered later in the stack.
148
+ */
149
+ export declare function registerComponentDefaultsIfMissing(componentName: string, defaults: Record<string, unknown>): void;
150
+ /**
151
+ * Create a default theme from all currently registered component defaults.
152
+ */
153
+ export declare function createDefaultTheme(presetName?: PresetName, mode?: 'light' | 'dark', colors?: ColorTokens): ThemeDefaults;
154
+ /**
155
+ * Mutable default theme cache for the default oceanBlue/light preset.
156
+ * It is updated as component packages register their defaults.
157
+ */
158
+ export declare const defaultTheme: ThemeDefaults;
159
+ declare class ThemeRegistry {
160
+ private globalTheme;
161
+ private customThemes;
162
+ private colorTokens;
163
+ private colorMode;
164
+ private currentPresetName;
165
+ private listeners;
166
+ private cachedComponentNames;
167
+ private invalidateComponentNamesCache;
168
+ getAllComponentNames(): Set<string>;
169
+ getGlobalTheme(): Readonly<PartialTheme>;
170
+ updateGlobalTheme(theme: PartialTheme): void;
171
+ setGlobalTheme(theme: PartialTheme): void;
172
+ resetGlobalTheme(): void;
173
+ registerCustomComponent<T extends Record<string, unknown>>(componentName: string, defaultStyles: T): void;
174
+ getComponentTheme<T extends object = Record<string, unknown>>(componentName: string): T;
175
+ getCustomComponentNames(): Set<string>;
176
+ setColorTokens(colors: ColorTokens | undefined): void;
177
+ getColorTokens(): ColorTokens | undefined;
178
+ getColorMode(): 'light' | 'dark';
179
+ setColorMode(mode: 'light' | 'dark'): void;
180
+ getCurrentPresetName(): string | undefined;
181
+ setCurrentPresetName(name: string | undefined, skipNotify?: boolean): void;
182
+ subscribe(listener: () => void): () => void;
183
+ notifyListeners(): void;
184
+ }
185
+ export declare const themeRegistry: ThemeRegistry;
186
+ export declare function createTheme(theme: PartialTheme, colorPreset?: {
187
+ name: string;
188
+ colors: ColorTokens;
189
+ mode?: 'light' | 'dark';
190
+ }): PartialTheme;
191
+ export declare function getThemedProps<T extends object = Record<string, unknown>>(componentName: string, localTheme: PartialTheme | undefined, explicitProps: Record<string, unknown>): {
192
+ props: T;
193
+ nestedTheme: PartialTheme;
194
+ };
195
+ export declare function setColorPreset(presetName: PresetName, colorMode?: 'light' | 'dark'): void;
196
+ export declare function getCurrentPreset(): string | undefined;
197
+ export declare function setColorMode(mode: 'light' | 'dark'): void;
198
+ export declare function getAvailablePresets(): PresetName[];
199
+ /**
200
+ * Get all registered global theme defaults as a PartialTheme-like record.
201
+ */
202
+ export declare function getGlobalThemeDefaults(): Record<string, Record<string, unknown>>;
203
+ export {};
204
+ //# sourceMappingURL=theme.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":"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"}
package/dist/theme.js ADDED
@@ -0,0 +1,332 @@
1
+ import { getPresetWithMode, presets } from "./colors/color-presets.js";
2
+ import { DebugLogger } from "./dev-config.js";
3
+ function extractNestedThemes(props, knownComponents) {
4
+ const ownProps = { ...props };
5
+ const nestedThemes = {};
6
+ for (const key of knownComponents) {
7
+ if (key in ownProps) {
8
+ nestedThemes[key] = ownProps[key];
9
+ delete ownProps[key];
10
+ }
11
+ }
12
+ return {
13
+ ownProps,
14
+ nestedThemes
15
+ };
16
+ }
17
+ function deepMergeDefined(base, override) {
18
+ const result = { ...base };
19
+ for (const key of Object.keys(override)) {
20
+ const overrideVal = override[key];
21
+ if (overrideVal === void 0) continue;
22
+ if (isPlainObject(overrideVal) && isPlainObject(result[key])) {
23
+ result[key] = deepMergeDefined(result[key], overrideVal);
24
+ } else {
25
+ result[key] = overrideVal;
26
+ }
27
+ }
28
+ return result;
29
+ }
30
+ const PRIMITIVE_THEME_COMPONENT_NAMES = {
31
+ view: "View",
32
+ text: "Text",
33
+ image: "Image",
34
+ sprite: "Sprite"
35
+ };
36
+ function normalizeThemeComponentName(componentName) {
37
+ return PRIMITIVE_THEME_COMPONENT_NAMES[componentName] ?? componentName;
38
+ }
39
+ function mergeThemes(base, override) {
40
+ if (!base) return override ?? {};
41
+ if (!override) return base;
42
+ const result = { ...base };
43
+ for (const key of Object.keys(override)) {
44
+ const overrideVal = override[key];
45
+ if (overrideVal === void 0) continue;
46
+ if (isPlainObject(overrideVal) && isPlainObject(result[key])) {
47
+ result[key] = deepMergeDefined(result[key], overrideVal);
48
+ } else {
49
+ result[key] = overrideVal;
50
+ }
51
+ }
52
+ return result;
53
+ }
54
+ function isPlainObject(value) {
55
+ return typeof value === "object" && value !== null && !Array.isArray(value);
56
+ }
57
+ function resolveThemeComponentTheme(theme, componentName) {
58
+ if (!theme) return {};
59
+ const normalizedName = normalizeThemeComponentName(componentName);
60
+ const candidates = normalizedName === componentName ? [componentName] : [normalizedName, componentName];
61
+ let merged = {};
62
+ for (const candidate of candidates) {
63
+ const entry = theme[candidate];
64
+ if (!entry) continue;
65
+ merged = deepMergeDefined(merged, entry);
66
+ }
67
+ return merged;
68
+ }
69
+ function resolveComponentTheme(options) {
70
+ const { componentName, globalTheme, localTheme, explicitProps = {}, knownComponents } = options;
71
+ const normalizedComponentName = normalizeThemeComponentName(componentName);
72
+ const componentSet = knownComponents ?? /* @__PURE__ */ new Set();
73
+ const globalComponentTheme = resolveThemeComponentTheme(globalTheme, normalizedComponentName);
74
+ const { ownProps: globalOwnProps, nestedThemes: globalNested } = extractNestedThemes(
75
+ globalComponentTheme,
76
+ componentSet
77
+ );
78
+ const localComponentTheme = resolveThemeComponentTheme(localTheme, normalizedComponentName);
79
+ const { ownProps: localOwnProps, nestedThemes: localNested } = extractNestedThemes(
80
+ localComponentTheme,
81
+ componentSet
82
+ );
83
+ const { nestedThemes: localThemeNested } = extractNestedThemes(
84
+ localTheme ?? {},
85
+ componentSet
86
+ );
87
+ const { ownProps: explicitOwnProps, nestedThemes: explicitNested } = extractNestedThemes(
88
+ explicitProps,
89
+ componentSet
90
+ );
91
+ const mergedProps = deepMergeDefined(
92
+ deepMergeDefined(globalOwnProps, localOwnProps),
93
+ explicitOwnProps
94
+ );
95
+ const mergedNested = mergeThemes(
96
+ mergeThemes(mergeThemes(globalNested, localNested), localThemeNested),
97
+ explicitNested
98
+ );
99
+ return { props: mergedProps, nestedTheme: mergedNested };
100
+ }
101
+ const _themeDefaults = {};
102
+ const _themeDefaultProviders = {};
103
+ let themeRemountHandler = null;
104
+ function assignThemeDefaults(target, source) {
105
+ for (const key of Object.keys(target)) {
106
+ delete target[key];
107
+ }
108
+ Object.assign(target, source);
109
+ return target;
110
+ }
111
+ function providerFromInput(input) {
112
+ return typeof input === "function" ? input : () => input;
113
+ }
114
+ function rebuildRegisteredDefaults(presetName = "oceanBlue", mode = "light") {
115
+ const preset = getPresetWithMode(presetName, mode);
116
+ return assignThemeDefaults(_themeDefaults, createDefaultTheme(presetName, mode, preset.colors));
117
+ }
118
+ function setThemeRemountHandler(handler) {
119
+ themeRemountHandler = handler;
120
+ }
121
+ const KNOWN_COMPONENTS = /* @__PURE__ */ new Set(["View", "Text", "Icon", "Image", "Sprite"]);
122
+ function registerComponentThemeDefaults(componentName, defaults) {
123
+ _themeDefaultProviders[componentName] = providerFromInput(defaults);
124
+ KNOWN_COMPONENTS.add(componentName);
125
+ rebuildRegisteredDefaults();
126
+ }
127
+ function registerComponentDefaults(componentName, defaults) {
128
+ registerComponentThemeDefaults(componentName, defaults);
129
+ }
130
+ function registerComponentDefaultsIfMissing(componentName, defaults) {
131
+ if (_themeDefaultProviders[componentName]) {
132
+ KNOWN_COMPONENTS.add(componentName);
133
+ return;
134
+ }
135
+ registerComponentThemeDefaults(componentName, defaults);
136
+ }
137
+ function createDefaultTheme(presetName = "oceanBlue", mode = "light", colors = getPresetWithMode(presetName, mode).colors) {
138
+ const theme = {};
139
+ for (const [componentName, provider] of Object.entries(_themeDefaultProviders)) {
140
+ theme[componentName] = provider(colors);
141
+ }
142
+ return theme;
143
+ }
144
+ const defaultTheme = _themeDefaults;
145
+ class ThemeRegistry {
146
+ globalTheme = void 0;
147
+ customThemes = /* @__PURE__ */ new Map();
148
+ colorTokens = void 0;
149
+ colorMode = "light";
150
+ currentPresetName = void 0;
151
+ listeners = /* @__PURE__ */ new Set();
152
+ cachedComponentNames = null;
153
+ invalidateComponentNamesCache() {
154
+ this.cachedComponentNames = null;
155
+ }
156
+ getAllComponentNames() {
157
+ if (this.cachedComponentNames) return this.cachedComponentNames;
158
+ const internalPrimitiveNames = /* @__PURE__ */ new Set([
159
+ "view",
160
+ "text",
161
+ "nineslice",
162
+ "sprite",
163
+ "image",
164
+ "graphics",
165
+ "vectorDraw",
166
+ "tilesprite",
167
+ "particles"
168
+ ]);
169
+ this.cachedComponentNames = new Set(
170
+ Object.keys(this.getGlobalTheme()).concat(Array.from(this.customThemes.keys())).filter((key) => key !== "__colorPreset" && !internalPrimitiveNames.has(key))
171
+ );
172
+ return this.cachedComponentNames;
173
+ }
174
+ getGlobalTheme() {
175
+ return {
176
+ ...defaultTheme,
177
+ ...this.globalTheme ?? {},
178
+ ...Object.fromEntries(this.customThemes)
179
+ };
180
+ }
181
+ updateGlobalTheme(theme) {
182
+ const nextTheme = { ...this.globalTheme ?? {} };
183
+ for (const [component, styles] of Object.entries(theme)) {
184
+ if (component === "__colorPreset") {
185
+ nextTheme[component] = styles;
186
+ continue;
187
+ }
188
+ const existing = nextTheme[component] ?? this.getGlobalTheme()[component] ?? {};
189
+ nextTheme[component] = deepMergeDefined(existing, styles ?? {});
190
+ DebugLogger.log("theme", `Updated ${component} theme:`, nextTheme[component]);
191
+ }
192
+ this.globalTheme = nextTheme;
193
+ this.notifyListeners();
194
+ this.invalidateComponentNamesCache();
195
+ }
196
+ setGlobalTheme(theme) {
197
+ this.globalTheme = { ...theme };
198
+ this.invalidateComponentNamesCache();
199
+ }
200
+ resetGlobalTheme() {
201
+ this.globalTheme = void 0;
202
+ this.customThemes.clear();
203
+ this.invalidateComponentNamesCache();
204
+ }
205
+ registerCustomComponent(componentName, defaultStyles) {
206
+ this.customThemes.set(componentName, defaultStyles);
207
+ KNOWN_COMPONENTS.add(componentName);
208
+ this.invalidateComponentNamesCache();
209
+ }
210
+ getComponentTheme(componentName) {
211
+ return this.getGlobalTheme()[componentName] ?? this.customThemes.get(componentName) ?? {};
212
+ }
213
+ getCustomComponentNames() {
214
+ return new Set(this.customThemes.keys());
215
+ }
216
+ setColorTokens(colors) {
217
+ this.colorTokens = colors;
218
+ }
219
+ getColorTokens() {
220
+ return this.colorTokens;
221
+ }
222
+ getColorMode() {
223
+ return this.colorMode;
224
+ }
225
+ setColorMode(mode) {
226
+ if (this.colorMode === mode) return;
227
+ this.colorMode = mode;
228
+ if (this.currentPresetName) {
229
+ const preset = getPresetWithMode(this.currentPresetName, mode);
230
+ this.colorTokens = preset.colors;
231
+ rebuildRegisteredDefaults(this.currentPresetName, mode);
232
+ this.setGlobalTheme(createDefaultTheme(this.currentPresetName, mode, preset.colors));
233
+ }
234
+ setTimeout(() => {
235
+ themeRemountHandler?.();
236
+ }, 0);
237
+ this.notifyListeners();
238
+ }
239
+ getCurrentPresetName() {
240
+ return this.currentPresetName;
241
+ }
242
+ setCurrentPresetName(name, skipNotify = false) {
243
+ if (this.currentPresetName === name) return;
244
+ this.currentPresetName = name;
245
+ if (!skipNotify) {
246
+ this.notifyListeners();
247
+ }
248
+ }
249
+ subscribe(listener) {
250
+ this.listeners.add(listener);
251
+ return () => {
252
+ this.listeners.delete(listener);
253
+ };
254
+ }
255
+ notifyListeners() {
256
+ this.listeners.forEach((listener) => listener());
257
+ }
258
+ }
259
+ const themeRegistry = new ThemeRegistry();
260
+ function createTheme(theme, colorPreset) {
261
+ if (colorPreset) {
262
+ themeRegistry.setColorTokens(colorPreset.colors);
263
+ return {
264
+ ...theme,
265
+ __colorPreset: {
266
+ name: colorPreset.name,
267
+ mode: colorPreset.mode ?? "light"
268
+ }
269
+ };
270
+ }
271
+ return theme;
272
+ }
273
+ function getThemedProps(componentName, localTheme, explicitProps) {
274
+ return resolveComponentTheme({
275
+ componentName: normalizeThemeComponentName(componentName),
276
+ globalTheme: themeRegistry.getGlobalTheme(),
277
+ localTheme,
278
+ explicitProps,
279
+ knownComponents: themeRegistry.getAllComponentNames()
280
+ });
281
+ }
282
+ function setColorPreset(presetName, colorMode) {
283
+ const targetMode = colorMode ?? themeRegistry.getColorMode();
284
+ const preset = getPresetWithMode(presetName, targetMode);
285
+ themeRegistry.setColorTokens(preset.colors);
286
+ rebuildRegisteredDefaults(presetName, targetMode);
287
+ themeRegistry.setGlobalTheme(createDefaultTheme(presetName, targetMode, preset.colors));
288
+ themeRegistry.setCurrentPresetName(presetName, true);
289
+ if (colorMode && themeRegistry.getColorMode() !== colorMode) {
290
+ themeRegistry.setColorMode(colorMode);
291
+ } else {
292
+ setTimeout(() => {
293
+ themeRemountHandler?.();
294
+ }, 0);
295
+ themeRegistry.notifyListeners();
296
+ }
297
+ }
298
+ function getCurrentPreset() {
299
+ return themeRegistry.getCurrentPresetName();
300
+ }
301
+ function setColorMode(mode) {
302
+ themeRegistry.setColorMode(mode);
303
+ }
304
+ function getAvailablePresets() {
305
+ return Object.keys(presets);
306
+ }
307
+ function getGlobalThemeDefaults() {
308
+ return _themeDefaults;
309
+ }
310
+ export {
311
+ KNOWN_COMPONENTS,
312
+ createDefaultTheme,
313
+ createTheme,
314
+ deepMergeDefined,
315
+ defaultTheme,
316
+ extractNestedThemes,
317
+ getAvailablePresets,
318
+ getCurrentPreset,
319
+ getGlobalThemeDefaults,
320
+ getThemedProps,
321
+ mergeThemes,
322
+ normalizeThemeComponentName,
323
+ registerComponentDefaults,
324
+ registerComponentDefaultsIfMissing,
325
+ registerComponentThemeDefaults,
326
+ resolveComponentTheme,
327
+ setColorMode,
328
+ setColorPreset,
329
+ setThemeRemountHandler,
330
+ themeRegistry
331
+ };
332
+ //# sourceMappingURL=theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.js","sources":["../src/theme.ts"],"sourcesContent":["/**\n * Theme type helpers — renderer-neutral theme system contracts.\n *\n * These generic types form the foundation of the theme system. Each renderer\n * package defines its own ComponentThemes with renderer-specific prop types.\n *\n * @migration(audit:scene-portal-mount) Phase 3D — extracted from packages/ui/src/theme-base.ts.\n * Generic type helpers live here. Component-specific theme interfaces\n * (ViewTheme, TextTheme, ...) remain in the renderer package.\n */\nimport { getPresetWithMode, presets, type ColorTokens, type PresetName } from './colors'\nimport { DebugLogger } from './dev-config'\n\n// ---------------------------------------------------------------------------\n// Generic theme types\n// ---------------------------------------------------------------------------\n\n/**\n * Partial theme — allows overriding specific component styles.\n * Generic over the component theme map type.\n *\n * @example\n * ```ts\n * const theme: PartialTheme<PhaserComponentThemes> = {\n * View: { backgroundColor: 0xff0000 },\n * Text: { fontSize: 20 }\n * }\n * ```\n */\ntype ComponentThemeMap<T> = { [K in keyof T]: object }\n\n/**\n * Augmentable portable custom component theme map.\n *\n * Apps can extend this via:\n * `declare module '@number10/jsx-core' { interface CustomComponentThemes { ... } }`\n */\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface CustomComponentThemes {}\n\nexport type PartialTheme<T extends ComponentThemeMap<T> = Record<string, object>> = {\n [K in keyof T]?: Partial<T[K]>\n} & {\n /** Optional color preset configuration */\n __colorPreset?: {\n name: string\n mode?: 'light' | 'dark'\n }\n}\n\n/**\n * Complete theme with all component styles defined.\n * Built-in components are required, custom components are optional.\n *\n * @param TBuiltIn - Required built-in component themes\n * @param TCustom - Optional custom component themes (defaults to empty object)\n */\nexport type Theme<\n TBuiltIn extends Record<string, Record<string, unknown>>,\n TCustom extends Record<string, Record<string, unknown>> = Record<string, never>,\n> = {\n [K in keyof TBuiltIn]: TBuiltIn[K]\n} & {\n [K in keyof TCustom]?: TCustom[K]\n}\n\n/**\n * Type helper for nested component themes.\n * Allows a component theme to include nested themes for child components.\n *\n * @param TComponentThemes - The full component theme map\n * @param TExclude - Keys to exclude (e.g., lowercase primitives)\n */\nexport type NestedComponentThemes<\n TComponentThemes extends ComponentThemeMap<TComponentThemes>,\n TExclude extends keyof TComponentThemes = never,\n> = {\n [K in Exclude<keyof TComponentThemes, TExclude>]?: Partial<TComponentThemes[K]>\n}\n\n// ---------------------------------------------------------------------------\n// Theme utility types\n// ---------------------------------------------------------------------------\n\n/**\n * Extract nested theme keys from a props object.\n * Keys that match known component names are treated as nested themes.\n *\n * @param props - The props object to scan\n * @param knownComponents - Set of known component names\n * @returns Tuple of [ownProps, nestedThemes]\n */\nexport function extractNestedThemes<T extends Record<string, unknown>>(\n props: T,\n knownComponents: ReadonlySet<string>\n): { ownProps: Partial<T>; nestedThemes: PartialTheme } {\n const ownProps: Record<string, unknown> = { ...props }\n const nestedThemes: Record<string, unknown> = {}\n\n for (const key of knownComponents) {\n if (key in ownProps) {\n nestedThemes[key] = ownProps[key]\n delete ownProps[key]\n }\n }\n\n return {\n ownProps: ownProps as Partial<T>,\n nestedThemes: nestedThemes as PartialTheme,\n }\n}\n\n/**\n * Deep-merge two objects, only overwriting defined values (not undefined).\n */\nexport function deepMergeDefined<T extends object>(base: T, override: Partial<T>): T {\n const result = { ...base }\n\n for (const key of Object.keys(override) as (keyof T)[]) {\n const overrideVal = override[key]\n if (overrideVal === undefined) continue\n\n if (isPlainObject(overrideVal) && isPlainObject(result[key])) {\n result[key] = deepMergeDefined(result[key] as object, overrideVal as object) as T[keyof T]\n } else {\n result[key] = overrideVal as T[keyof T]\n }\n }\n\n return result\n}\n\nconst PRIMITIVE_THEME_COMPONENT_NAMES: Record<string, string> = {\n view: 'View',\n text: 'Text',\n image: 'Image',\n sprite: 'Sprite',\n}\n\n/**\n * Normalize primitive host-node names to their canonical theme component names.\n * Non-primitive component names pass through unchanged.\n */\nexport function normalizeThemeComponentName(componentName: string): string {\n return PRIMITIVE_THEME_COMPONENT_NAMES[componentName] ?? componentName\n}\n\n/**\n * Merge theme objects (nested themes). Shallow merge for each component key.\n */\nexport function mergeThemes(\n base: PartialTheme | undefined,\n override: PartialTheme | undefined\n): PartialTheme {\n if (!base) return override ?? ({} as PartialTheme)\n if (!override) return base\n\n const result: Record<string, unknown> = { ...base }\n\n for (const key of Object.keys(override)) {\n const overrideVal = override[key]\n if (overrideVal === undefined) continue\n\n if (isPlainObject(overrideVal) && isPlainObject(result[key])) {\n result[key] = deepMergeDefined(result[key] as object, overrideVal as object)\n } else {\n result[key] = overrideVal\n }\n }\n\n return result as PartialTheme\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\n// ---------------------------------------------------------------------------\n// Portable component theme resolution\n// ---------------------------------------------------------------------------\n\n/**\n * Options for `resolveComponentTheme`.\n */\nexport interface ResolveComponentThemeOptions {\n /** The component's name (e.g., 'Badge', 'ProgressBar', 'View') */\n componentName: string\n /** The component's global theme defaults (from the theme registry) */\n globalTheme?: PartialTheme | undefined\n /** The local theme context (propagated from parent or __theme) */\n localTheme?: PartialTheme | undefined\n /** Explicit props passed to the component */\n explicitProps?: Record<string, unknown> | undefined\n /** Set of known component names for nested theme detection */\n knownComponents?: ReadonlySet<string> | undefined\n}\n\nfunction resolveThemeComponentTheme(\n theme: PartialTheme | undefined,\n componentName: string\n): Record<string, unknown> {\n if (!theme) return {}\n\n const normalizedName = normalizeThemeComponentName(componentName)\n const candidates =\n normalizedName === componentName ? [componentName] : [normalizedName, componentName]\n\n let merged: Record<string, unknown> = {}\n\n for (const candidate of candidates) {\n const entry = theme[candidate] as Record<string, unknown> | undefined\n if (!entry) continue\n merged = deepMergeDefined(merged, entry)\n }\n\n return merged\n}\n\n/**\n * Resolves themed props for a portable component.\n *\n * Merges global theme defaults, local theme context, and explicit props\n * in priority order: global < local < explicit. Only defined values overwrite.\n *\n * Also extracts nested component themes for propagation to children.\n *\n * @returns Themed props and nested theme for children.\n *\n * @example\n * ```ts\n * const { props, nestedTheme } = resolveComponentTheme({\n * componentName: 'Badge',\n * globalTheme: { Badge: { backgroundColor: 0xeeeeee, Icon: { size: 16 } } },\n * localTheme: theme, // from useTheme()\n * explicitProps: { tone: 'primary' },\n * knownComponents: new Set(['View', 'Text', 'Icon', 'Badge'])\n * })\n * // props = { backgroundColor: 0xeeeeee, tone: 'primary' }\n * // nestedTheme = { Icon: { size: 16 } }\n * ```\n */\nexport function resolveComponentTheme<T extends object = Record<string, unknown>>(\n options: ResolveComponentThemeOptions\n): {\n props: T\n nestedTheme: PartialTheme\n} {\n const { componentName, globalTheme, localTheme, explicitProps = {}, knownComponents } = options\n const normalizedComponentName = normalizeThemeComponentName(componentName)\n const componentSet = knownComponents ?? new Set()\n\n // 1. Start with global theme for this component\n const globalComponentTheme = resolveThemeComponentTheme(globalTheme, normalizedComponentName)\n const { ownProps: globalOwnProps, nestedThemes: globalNested } = extractNestedThemes(\n globalComponentTheme,\n componentSet\n )\n\n // 2. Apply local theme override\n const localComponentTheme = resolveThemeComponentTheme(localTheme, normalizedComponentName)\n const { ownProps: localOwnProps, nestedThemes: localNested } = extractNestedThemes(\n localComponentTheme,\n componentSet\n )\n\n // 3. Also extract nested themes directly from localTheme (for __theme propagation)\n const { nestedThemes: localThemeNested } = extractNestedThemes(\n (localTheme ?? {}) as Record<string, unknown>,\n componentSet\n )\n\n // 4. Extract nested themes from explicit props\n const { ownProps: explicitOwnProps, nestedThemes: explicitNested } = extractNestedThemes(\n explicitProps,\n componentSet\n )\n\n // 5. Merge: global < local < explicit\n const mergedProps = deepMergeDefined(\n deepMergeDefined(globalOwnProps as object, localOwnProps),\n explicitOwnProps\n ) as T\n\n // 6. Merge nested themes: global < localComponent < localTheme < explicit\n const mergedNested = mergeThemes(\n mergeThemes(mergeThemes(globalNested, localNested), localThemeNested),\n explicitNested\n )\n\n return { props: mergedProps, nestedTheme: mergedNested }\n}\n\n// ---------------------------------------------------------------------------\n// Global theme defaults registry\n// ---------------------------------------------------------------------------\n\ntype ThemeDefaults = Record<string, Record<string, unknown>>\nexport type ComponentThemeDefaultsProvider = (colors: ColorTokens) => object\nexport type ComponentThemeDefaultsInput = object | ComponentThemeDefaultsProvider\n\nconst _themeDefaults: ThemeDefaults = {}\nconst _themeDefaultProviders: Record<string, ComponentThemeDefaultsProvider> = {}\n\nlet themeRemountHandler: (() => void) | null = null\n\nfunction assignThemeDefaults(target: ThemeDefaults, source: ThemeDefaults): ThemeDefaults {\n for (const key of Object.keys(target)) {\n delete target[key]\n }\n\n Object.assign(target, source)\n return target\n}\n\nfunction providerFromInput(input: ComponentThemeDefaultsInput): ComponentThemeDefaultsProvider {\n return typeof input === 'function' ? (input as ComponentThemeDefaultsProvider) : () => input\n}\n\nfunction rebuildRegisteredDefaults(\n presetName: PresetName = 'oceanBlue',\n mode: 'light' | 'dark' = 'light'\n): ThemeDefaults {\n const preset = getPresetWithMode(presetName, mode)\n return assignThemeDefaults(_themeDefaults, createDefaultTheme(presetName, mode, preset.colors))\n}\n\nexport function setThemeRemountHandler(handler: (() => void) | null): void {\n themeRemountHandler = handler\n}\n\n/**\n * Set of known component names. Components register themselves here\n * so resolveComponentTheme can detect nested component themes.\n */\nexport const KNOWN_COMPONENTS = new Set<string>(['View', 'Text', 'Icon', 'Image', 'Sprite'])\n\n/**\n * Register preset-aware defaults for a component.\n *\n * Renderer-agnostic components register from @number10/jsx-components.\n * Renderer packages register their own host/component defaults as side effects.\n */\nexport function registerComponentThemeDefaults(\n componentName: string,\n defaults: ComponentThemeDefaultsInput\n): void {\n _themeDefaultProviders[componentName] = providerFromInput(defaults)\n KNOWN_COMPONENTS.add(componentName)\n rebuildRegisteredDefaults()\n}\n\n/**\n * Register global theme defaults for a component.\n * Also adds the component name to KNOWN_COMPONENTS.\n */\nexport function registerComponentDefaults(\n componentName: string,\n defaults: Record<string, unknown>\n): void {\n registerComponentThemeDefaults(componentName, defaults)\n}\n\n/**\n * Register component defaults only when no defaults exist yet.\n * Useful for portable fallback themes that must not override\n * renderer-provided defaults registered later in the stack.\n */\nexport function registerComponentDefaultsIfMissing(\n componentName: string,\n defaults: Record<string, unknown>\n): void {\n if (_themeDefaultProviders[componentName]) {\n KNOWN_COMPONENTS.add(componentName)\n return\n }\n\n registerComponentThemeDefaults(componentName, defaults)\n}\n\n/**\n * Create a default theme from all currently registered component defaults.\n */\nexport function createDefaultTheme(\n presetName: PresetName = 'oceanBlue',\n mode: 'light' | 'dark' = 'light',\n colors: ColorTokens = getPresetWithMode(presetName, mode).colors\n): ThemeDefaults {\n const theme: ThemeDefaults = {}\n\n for (const [componentName, provider] of Object.entries(_themeDefaultProviders)) {\n theme[componentName] = provider(colors) as Record<string, unknown>\n }\n\n return theme\n}\n\n/**\n * Mutable default theme cache for the default oceanBlue/light preset.\n * It is updated as component packages register their defaults.\n */\nexport const defaultTheme: ThemeDefaults = _themeDefaults\n\nclass ThemeRegistry {\n private globalTheme: PartialTheme | undefined = undefined\n private customThemes: Map<string, Record<string, unknown>> = new Map()\n private colorTokens: ColorTokens | undefined = undefined\n private colorMode: 'light' | 'dark' = 'light'\n private currentPresetName: PresetName | undefined = undefined\n private listeners: Set<() => void> = new Set()\n private cachedComponentNames: Set<string> | null = null\n\n private invalidateComponentNamesCache(): void {\n this.cachedComponentNames = null\n }\n\n getAllComponentNames(): Set<string> {\n if (this.cachedComponentNames) return this.cachedComponentNames\n\n const internalPrimitiveNames = new Set([\n 'view',\n 'text',\n 'nineslice',\n 'sprite',\n 'image',\n 'graphics',\n 'vectorDraw',\n 'tilesprite',\n 'particles',\n ])\n\n this.cachedComponentNames = new Set(\n Object.keys(this.getGlobalTheme())\n .concat(Array.from(this.customThemes.keys()))\n .filter((key) => key !== '__colorPreset' && !internalPrimitiveNames.has(key))\n )\n return this.cachedComponentNames\n }\n\n getGlobalTheme(): Readonly<PartialTheme> {\n return {\n ...defaultTheme,\n ...(this.globalTheme ?? {}),\n ...Object.fromEntries(this.customThemes),\n } as PartialTheme\n }\n\n updateGlobalTheme(theme: PartialTheme): void {\n const nextTheme = { ...(this.globalTheme ?? {}) } as Record<string, unknown>\n\n for (const [component, styles] of Object.entries(theme)) {\n if (component === '__colorPreset') {\n nextTheme[component] = styles\n continue\n }\n\n const existing =\n (nextTheme[component] as object | undefined) ??\n (this.getGlobalTheme()[component] as object | undefined) ??\n {}\n nextTheme[component] = deepMergeDefined(existing, (styles ?? {}) as object)\n DebugLogger.log('theme', `Updated ${component} theme:`, nextTheme[component])\n }\n\n this.globalTheme = nextTheme as PartialTheme\n this.notifyListeners()\n this.invalidateComponentNamesCache()\n }\n\n setGlobalTheme(theme: PartialTheme): void {\n this.globalTheme = { ...theme }\n this.invalidateComponentNamesCache()\n }\n\n resetGlobalTheme(): void {\n this.globalTheme = undefined\n this.customThemes.clear()\n this.invalidateComponentNamesCache()\n }\n\n registerCustomComponent<T extends Record<string, unknown>>(\n componentName: string,\n defaultStyles: T\n ): void {\n this.customThemes.set(componentName, defaultStyles)\n KNOWN_COMPONENTS.add(componentName)\n this.invalidateComponentNamesCache()\n }\n\n getComponentTheme<T extends object = Record<string, unknown>>(componentName: string): T {\n return ((this.getGlobalTheme()[componentName] as T | undefined) ??\n this.customThemes.get(componentName) ??\n {}) as T\n }\n\n getCustomComponentNames(): Set<string> {\n return new Set(this.customThemes.keys())\n }\n\n setColorTokens(colors: ColorTokens | undefined): void {\n this.colorTokens = colors\n }\n\n getColorTokens(): ColorTokens | undefined {\n return this.colorTokens\n }\n\n getColorMode(): 'light' | 'dark' {\n return this.colorMode\n }\n\n setColorMode(mode: 'light' | 'dark'): void {\n if (this.colorMode === mode) return\n\n this.colorMode = mode\n\n if (this.currentPresetName) {\n const preset = getPresetWithMode(this.currentPresetName, mode)\n this.colorTokens = preset.colors\n rebuildRegisteredDefaults(this.currentPresetName, mode)\n this.setGlobalTheme(createDefaultTheme(this.currentPresetName, mode, preset.colors))\n }\n\n setTimeout(() => {\n themeRemountHandler?.()\n }, 0)\n\n this.notifyListeners()\n }\n\n getCurrentPresetName(): string | undefined {\n return this.currentPresetName\n }\n\n setCurrentPresetName(name: string | undefined, skipNotify = false): void {\n if (this.currentPresetName === name) return\n\n this.currentPresetName = name as PresetName | undefined\n if (!skipNotify) {\n this.notifyListeners()\n }\n }\n\n subscribe(listener: () => void): () => void {\n this.listeners.add(listener)\n return () => {\n this.listeners.delete(listener)\n }\n }\n\n notifyListeners(): void {\n this.listeners.forEach((listener) => listener())\n }\n}\n\nexport const themeRegistry = new ThemeRegistry()\n\nexport function createTheme(\n theme: PartialTheme,\n colorPreset?: { name: string; colors: ColorTokens; mode?: 'light' | 'dark' }\n): PartialTheme {\n if (colorPreset) {\n themeRegistry.setColorTokens(colorPreset.colors)\n\n return {\n ...theme,\n __colorPreset: {\n name: colorPreset.name,\n mode: colorPreset.mode ?? 'light',\n },\n }\n }\n\n return theme\n}\n\nexport function getThemedProps<T extends object = Record<string, unknown>>(\n componentName: string,\n localTheme: PartialTheme | undefined,\n explicitProps: Record<string, unknown>\n): { props: T; nestedTheme: PartialTheme } {\n return resolveComponentTheme<T>({\n componentName: normalizeThemeComponentName(componentName),\n globalTheme: themeRegistry.getGlobalTheme(),\n localTheme,\n explicitProps,\n knownComponents: themeRegistry.getAllComponentNames(),\n })\n}\n\nexport function setColorPreset(presetName: PresetName, colorMode?: 'light' | 'dark'): void {\n const targetMode = colorMode ?? themeRegistry.getColorMode()\n const preset = getPresetWithMode(presetName, targetMode)\n\n themeRegistry.setColorTokens(preset.colors)\n rebuildRegisteredDefaults(presetName, targetMode)\n themeRegistry.setGlobalTheme(createDefaultTheme(presetName, targetMode, preset.colors))\n themeRegistry.setCurrentPresetName(presetName, true)\n\n if (colorMode && themeRegistry.getColorMode() !== colorMode) {\n themeRegistry.setColorMode(colorMode)\n } else {\n setTimeout(() => {\n themeRemountHandler?.()\n }, 0)\n themeRegistry.notifyListeners()\n }\n}\n\nexport function getCurrentPreset(): string | undefined {\n return themeRegistry.getCurrentPresetName()\n}\n\nexport function setColorMode(mode: 'light' | 'dark'): void {\n themeRegistry.setColorMode(mode)\n}\n\nexport function getAvailablePresets(): PresetName[] {\n return Object.keys(presets) as PresetName[]\n}\n\n/**\n * Get all registered global theme defaults as a PartialTheme-like record.\n */\nexport function getGlobalThemeDefaults(): Record<string, Record<string, unknown>> {\n return _themeDefaults\n}\n"],"names":[],"mappings":"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"}