@vlian/framework 1.2.1 → 1.2.16

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 (428) hide show
  1. package/dist/analytics/index.cjs +24 -0
  2. package/dist/analytics/index.cjs.map +1 -0
  3. package/dist/analytics/index.d.ts +2 -0
  4. package/dist/analytics/index.js +3 -0
  5. package/dist/analytics/index.js.map +1 -0
  6. package/dist/analytics.umd.js +2406 -0
  7. package/dist/analytics.umd.js.map +1 -0
  8. package/dist/components/LocaleSwitch.cjs +118 -0
  9. package/dist/components/LocaleSwitch.cjs.map +1 -0
  10. package/dist/components/LocaleSwitch.d.ts +21 -0
  11. package/dist/components/LocaleSwitch.js +103 -0
  12. package/dist/components/LocaleSwitch.js.map +1 -0
  13. package/dist/components/ThemeSwitch.cjs +117 -0
  14. package/dist/components/ThemeSwitch.cjs.map +1 -0
  15. package/dist/components/ThemeSwitch.d.ts +20 -0
  16. package/dist/components/ThemeSwitch.js +102 -0
  17. package/dist/components/ThemeSwitch.js.map +1 -0
  18. package/dist/components/index.cjs +16 -0
  19. package/dist/components/index.cjs.map +1 -1
  20. package/dist/components/index.d.ts +5 -2
  21. package/dist/components/index.js +2 -1
  22. package/dist/components/index.js.map +1 -1
  23. package/dist/components/persistence.cjs +60 -0
  24. package/dist/components/persistence.cjs.map +1 -0
  25. package/dist/components/persistence.d.ts +12 -0
  26. package/dist/components/persistence.js +39 -0
  27. package/dist/components/persistence.js.map +1 -0
  28. package/dist/core/Test.d.ts +0 -1
  29. package/dist/core/app/AppContext.cjs +36 -30
  30. package/dist/core/app/AppContext.cjs.map +1 -1
  31. package/dist/core/app/AppContext.d.ts +9 -6
  32. package/dist/core/app/AppContext.js +36 -30
  33. package/dist/core/app/AppContext.js.map +1 -1
  34. package/dist/core/app/AppContext.types.d.ts +9 -10
  35. package/dist/core/app/AppContext.types.js.map +1 -1
  36. package/dist/core/app/BasicLayout.cjs +57 -22
  37. package/dist/core/app/BasicLayout.cjs.map +1 -1
  38. package/dist/core/app/BasicLayout.d.ts +7 -5
  39. package/dist/core/app/BasicLayout.js +57 -22
  40. package/dist/core/app/BasicLayout.js.map +1 -1
  41. package/dist/core/app/DefaultApp.cjs +104 -153
  42. package/dist/core/app/DefaultApp.cjs.map +1 -1
  43. package/dist/core/app/DefaultApp.d.ts +0 -21
  44. package/dist/core/app/DefaultApp.js +104 -153
  45. package/dist/core/app/DefaultApp.js.map +1 -1
  46. package/dist/core/app/index.d.ts +0 -1
  47. package/dist/core/config/AppConfig.cjs.map +1 -1
  48. package/dist/core/config/AppConfig.d.ts +3 -4
  49. package/dist/core/config/AppConfig.js.map +1 -1
  50. package/dist/core/config/ConfigLoader.d.ts +0 -1
  51. package/dist/core/config/ConfigValidator.d.ts +0 -1
  52. package/dist/core/config/index.d.ts +0 -1
  53. package/dist/core/dev/DevTools.cjs +141 -287
  54. package/dist/core/dev/DevTools.cjs.map +1 -1
  55. package/dist/core/dev/DevTools.d.ts +1 -32
  56. package/dist/core/dev/DevTools.js +143 -296
  57. package/dist/core/dev/DevTools.js.map +1 -1
  58. package/dist/core/error/ErrorBoundary.cjs +72 -14
  59. package/dist/core/error/ErrorBoundary.cjs.map +1 -1
  60. package/dist/core/error/ErrorBoundary.d.ts +7 -9
  61. package/dist/core/error/ErrorBoundary.js +73 -15
  62. package/dist/core/error/ErrorBoundary.js.map +1 -1
  63. package/dist/core/error/ErrorHandler.d.ts +0 -1
  64. package/dist/core/error/index.d.ts +0 -1
  65. package/dist/core/event/AppEventBus.d.ts +0 -1
  66. package/dist/core/event/frameworkEvents.d.ts +0 -1
  67. package/dist/core/event/hooks.d.ts +0 -1
  68. package/dist/core/event/index.d.ts +0 -1
  69. package/dist/core/event/types.d.ts +0 -1
  70. package/dist/core/event/useEventBus.d.ts +0 -1
  71. package/dist/core/index.cjs +2 -0
  72. package/dist/core/index.cjs.map +1 -1
  73. package/dist/core/index.d.ts +2 -1
  74. package/dist/core/index.js +2 -0
  75. package/dist/core/index.js.map +1 -1
  76. package/dist/core/initialization/InitializationErrorThrower.d.ts +0 -1
  77. package/dist/core/initialization/index.d.ts +0 -1
  78. package/dist/core/initialization/initialization.d.ts +0 -1
  79. package/dist/core/initialization/initializationErrorState.d.ts +0 -1
  80. package/dist/core/kernel/defaultAdapters.cjs +185 -0
  81. package/dist/core/kernel/defaultAdapters.cjs.map +1 -0
  82. package/dist/core/kernel/defaultAdapters.d.ts +2 -0
  83. package/dist/core/kernel/defaultAdapters.js +175 -0
  84. package/dist/core/kernel/defaultAdapters.js.map +1 -0
  85. package/dist/core/kernel/errors.cjs +71 -0
  86. package/dist/core/kernel/errors.cjs.map +1 -0
  87. package/dist/core/kernel/errors.d.ts +18 -0
  88. package/dist/core/kernel/errors.js +53 -0
  89. package/dist/core/kernel/errors.js.map +1 -0
  90. package/dist/core/kernel/index.cjs +22 -0
  91. package/dist/core/kernel/index.cjs.map +1 -0
  92. package/dist/core/kernel/index.d.ts +3 -0
  93. package/dist/core/kernel/index.js +4 -0
  94. package/dist/core/kernel/index.js.map +1 -0
  95. package/dist/core/kernel/startKernel.cjs +203 -0
  96. package/dist/core/kernel/startKernel.cjs.map +1 -0
  97. package/dist/core/kernel/startKernel.d.ts +2 -0
  98. package/dist/core/kernel/startKernel.js +193 -0
  99. package/dist/core/kernel/startKernel.js.map +1 -0
  100. package/dist/core/kernel/types.cjs +6 -0
  101. package/dist/core/kernel/types.cjs.map +1 -0
  102. package/dist/core/kernel/types.d.ts +114 -0
  103. package/dist/core/kernel/types.js +3 -0
  104. package/dist/core/kernel/types.js.map +1 -0
  105. package/dist/core/middleware.d.ts +0 -1
  106. package/dist/core/plugin/PluginEventBus.d.ts +0 -1
  107. package/dist/core/plugin/PluginSandbox.d.ts +0 -1
  108. package/dist/core/plugin.cjs +1 -1
  109. package/dist/core/plugin.cjs.map +1 -1
  110. package/dist/core/plugin.d.ts +0 -1
  111. package/dist/core/plugin.js +1 -1
  112. package/dist/core/plugin.js.map +1 -1
  113. package/dist/core/router/RouterManager.d.ts +0 -1
  114. package/dist/core/router/adapter/AdapterManager.d.ts +0 -1
  115. package/dist/core/router/adapter/index.d.ts +0 -1
  116. package/dist/core/router/adapter/react-router/ReactRouterAdapter.d.ts +0 -1
  117. package/dist/core/router/adapter/react-router/index.d.ts +0 -1
  118. package/dist/core/router/adapter/types.cjs.map +1 -1
  119. package/dist/core/router/adapter/types.d.ts +1 -2
  120. package/dist/core/router/adapter/types.js.map +1 -1
  121. package/dist/core/router/dev/RouterDevTools.cjs +148 -296
  122. package/dist/core/router/dev/RouterDevTools.cjs.map +1 -1
  123. package/dist/core/router/dev/RouterDevTools.d.ts +1 -6
  124. package/dist/core/router/dev/RouterDevTools.js +149 -301
  125. package/dist/core/router/dev/RouterDevTools.js.map +1 -1
  126. package/dist/core/router/dev/index.d.ts +0 -1
  127. package/dist/core/router/dynamic/DynamicRouteManager.d.ts +0 -1
  128. package/dist/core/router/dynamic/index.d.ts +0 -1
  129. package/dist/core/router/errors/RouterError.d.ts +0 -1
  130. package/dist/core/router/errors/index.d.ts +0 -1
  131. package/dist/core/router/index.d.ts +0 -1
  132. package/dist/core/router/lifecycle/RouterLifecycleManager.d.ts +0 -1
  133. package/dist/core/router/lifecycle/index.d.ts +0 -1
  134. package/dist/core/router/middleware/RouterMiddlewareManager.d.ts +0 -1
  135. package/dist/core/router/middleware/auth.d.ts +0 -1
  136. package/dist/core/router/middleware/index.d.ts +0 -1
  137. package/dist/core/router/middleware/types.d.ts +0 -1
  138. package/dist/core/router/monitoring/RouterMonitoring.d.ts +0 -1
  139. package/dist/core/router/monitoring/index.d.ts +0 -1
  140. package/dist/core/router/navigation/RouterNavigation.d.ts +0 -1
  141. package/dist/core/router/navigation/index.d.ts +0 -1
  142. package/dist/core/router/performance/RouteCache.d.ts +0 -1
  143. package/dist/core/router/performance/RoutePreloader.d.ts +0 -1
  144. package/dist/core/router/performance/index.d.ts +0 -1
  145. package/dist/core/router/plugin/RouterPluginManager.d.ts +0 -1
  146. package/dist/core/router/plugin/index.d.ts +0 -1
  147. package/dist/core/router/plugin/types.d.ts +0 -1
  148. package/dist/core/router/types.d.ts +1 -2
  149. package/dist/core/router/types.js.map +1 -1
  150. package/dist/core/router/utils/adapters/react-router/RouteErrorBoundary.cjs +90 -103
  151. package/dist/core/router/utils/adapters/react-router/RouteErrorBoundary.cjs.map +1 -1
  152. package/dist/core/router/utils/adapters/react-router/RouteErrorBoundary.d.ts +0 -1
  153. package/dist/core/router/utils/adapters/react-router/RouteErrorBoundary.js +91 -104
  154. package/dist/core/router/utils/adapters/react-router/RouteErrorBoundary.js.map +1 -1
  155. package/dist/core/router/utils/adapters/react-router/transform.cjs +13 -4
  156. package/dist/core/router/utils/adapters/react-router/transform.cjs.map +1 -1
  157. package/dist/core/router/utils/adapters/react-router/transform.d.ts +0 -1
  158. package/dist/core/router/utils/adapters/react-router/transform.js +13 -4
  159. package/dist/core/router/utils/adapters/react-router/transform.js.map +1 -1
  160. package/dist/core/router/utils/transform.cjs +1 -1
  161. package/dist/core/router/utils/transform.cjs.map +1 -1
  162. package/dist/core/router/utils/transform.d.ts +0 -1
  163. package/dist/core/router/utils/transform.js +1 -1
  164. package/dist/core/router/utils/transform.js.map +1 -1
  165. package/dist/core/router/validation/RouterConfigValidator.d.ts +0 -1
  166. package/dist/core/router/validation/index.d.ts +0 -1
  167. package/dist/core/router/validation/schema.d.ts +0 -1
  168. package/dist/core/router/version/RouteVersionManager.d.ts +0 -1
  169. package/dist/core/router/version/index.d.ts +0 -1
  170. package/dist/core/splash/SplashScreen.cjs +101 -15
  171. package/dist/core/splash/SplashScreen.cjs.map +1 -1
  172. package/dist/core/splash/SplashScreen.d.ts +0 -1
  173. package/dist/core/splash/SplashScreen.js +101 -15
  174. package/dist/core/splash/SplashScreen.js.map +1 -1
  175. package/dist/core/splash/index.d.ts +0 -1
  176. package/dist/core/splash/splashScreenUtils.d.ts +0 -1
  177. package/dist/core/startup/AppInstance.d.ts +0 -1
  178. package/dist/core/startup/environment.d.ts +0 -1
  179. package/dist/core/startup/index.d.ts +0 -1
  180. package/dist/core/startup/initializeServices.d.ts +0 -1
  181. package/dist/core/startup/performanceTracker.d.ts +0 -1
  182. package/dist/core/startup/renderApp.cjs +12 -10
  183. package/dist/core/startup/renderApp.cjs.map +1 -1
  184. package/dist/core/startup/renderApp.d.ts +0 -1
  185. package/dist/core/startup/renderApp.js +12 -10
  186. package/dist/core/startup/renderApp.js.map +1 -1
  187. package/dist/core/startup/startApp.cjs +118 -13
  188. package/dist/core/startup/startApp.cjs.map +1 -1
  189. package/dist/core/startup/startApp.d.ts +0 -1
  190. package/dist/core/startup/startApp.js +118 -13
  191. package/dist/core/startup/startApp.js.map +1 -1
  192. package/dist/core/types.d.ts +34 -21
  193. package/dist/core/types.js.map +1 -1
  194. package/dist/core/ui-adapter/adapters.cjs +45 -0
  195. package/dist/core/ui-adapter/adapters.cjs.map +1 -0
  196. package/dist/core/ui-adapter/adapters.d.ts +4 -0
  197. package/dist/core/ui-adapter/adapters.js +27 -0
  198. package/dist/core/ui-adapter/adapters.js.map +1 -0
  199. package/dist/core/ui-adapter/index.cjs +21 -0
  200. package/dist/core/ui-adapter/index.cjs.map +1 -0
  201. package/dist/core/ui-adapter/index.d.ts +2 -0
  202. package/dist/core/ui-adapter/index.js +3 -0
  203. package/dist/core/ui-adapter/index.js.map +1 -0
  204. package/dist/core/ui-adapter/types.cjs +6 -0
  205. package/dist/core/ui-adapter/types.cjs.map +1 -0
  206. package/dist/core/ui-adapter/types.d.ts +24 -0
  207. package/dist/core/ui-adapter/types.js +3 -0
  208. package/dist/core/ui-adapter/types.js.map +1 -0
  209. package/dist/index.cjs +1 -0
  210. package/dist/index.cjs.map +1 -1
  211. package/dist/index.d.ts +1 -1
  212. package/dist/index.js +1 -0
  213. package/dist/index.js.map +1 -1
  214. package/dist/index.umd.d.ts +0 -1
  215. package/dist/index.umd.js +7315 -5936
  216. package/dist/index.umd.js.map +1 -1
  217. package/dist/library/index.d.ts +0 -1
  218. package/dist/library/locale/index.d.ts +0 -1
  219. package/dist/library/locale/langs/en-us/index.d.ts +0 -1
  220. package/dist/library/locale/langs/zh-cn/index.d.ts +0 -1
  221. package/dist/library/locale/types.d.ts +0 -1
  222. package/dist/library/storage/cache.d.ts +0 -1
  223. package/dist/library/storage/encryption.d.ts +0 -1
  224. package/dist/library/storage/index.d.ts +0 -1
  225. package/dist/request/adapter/RequestAdapter.d.ts +0 -1
  226. package/dist/request/adapter/axiosAdapter.d.ts +0 -1
  227. package/dist/request/adapter/fetchAdapter.d.ts +0 -1
  228. package/dist/request/adapter/index.d.ts +0 -1
  229. package/dist/request/adapter/kyAdapter.d.ts +0 -1
  230. package/dist/request/adapter/undiciAdapter.d.ts +0 -1
  231. package/dist/request/core/RequestClient.d.ts +0 -1
  232. package/dist/request/core/index.d.ts +0 -1
  233. package/dist/request/index.d.ts +0 -1
  234. package/dist/request/plugin/RequestPlugin.d.ts +0 -1
  235. package/dist/request/plugin/cache.d.ts +0 -1
  236. package/dist/request/plugin/csrfPlugin.d.ts +0 -1
  237. package/dist/request/plugin/index.d.ts +0 -1
  238. package/dist/request/plugin/monitoring.d.ts +0 -1
  239. package/dist/request/plugin/queue.d.ts +0 -1
  240. package/dist/request/plugin/retry.d.ts +0 -1
  241. package/dist/request/plugin/validation.d.ts +0 -1
  242. package/dist/request/runtime/RequestContext.d.ts +0 -1
  243. package/dist/request/runtime/index.d.ts +0 -1
  244. package/dist/request/types.d.ts +0 -1
  245. package/dist/request/utils/RequestQueueManager.d.ts +0 -1
  246. package/dist/request/utils/dependencyCheck.d.ts +0 -1
  247. package/dist/request/utils/index.d.ts +0 -1
  248. package/dist/request.umd.js +5392 -0
  249. package/dist/request.umd.js.map +1 -0
  250. package/dist/state/StateManager.d.ts +0 -1
  251. package/dist/state/adapters/AdapterFactory.d.ts +0 -1
  252. package/dist/state/adapters/DefaultAdapter.d.ts +0 -1
  253. package/dist/state/adapters/ReduxAdapter.d.ts +0 -1
  254. package/dist/state/adapters/ZustandAdapter.d.ts +0 -1
  255. package/dist/state/adapters/index.d.ts +0 -1
  256. package/dist/state/adapters/types.d.ts +0 -1
  257. package/dist/state/core/DerivedStateInstance.d.ts +0 -1
  258. package/dist/state/core/StateInstance.d.ts +0 -1
  259. package/dist/state/core/StateRegistry.d.ts +0 -1
  260. package/dist/state/core/StateScope.d.ts +0 -1
  261. package/dist/state/core/index.d.ts +0 -1
  262. package/dist/state/index.d.ts +0 -1
  263. package/dist/state/types.d.ts +0 -1
  264. package/dist/state.umd.js +1414 -0
  265. package/dist/state.umd.js.map +1 -0
  266. package/dist/types.d.ts +0 -1
  267. package/dist/utils/analytics.d.ts +0 -1
  268. package/dist/utils/configSecurity.d.ts +0 -1
  269. package/dist/utils/csrf.d.ts +0 -1
  270. package/dist/utils/errors/ErrorCodes.d.ts +0 -1
  271. package/dist/utils/errors.cjs +44 -1
  272. package/dist/utils/errors.cjs.map +1 -1
  273. package/dist/utils/errors.d.ts +5 -1
  274. package/dist/utils/errors.js +44 -1
  275. package/dist/utils/errors.js.map +1 -1
  276. package/dist/utils/index.d.ts +0 -1
  277. package/dist/utils/logger.d.ts +0 -1
  278. package/dist/utils/logger.types.d.ts +0 -1
  279. package/dist/utils/monitoring.d.ts +0 -1
  280. package/dist/utils/performance.d.ts +0 -1
  281. package/dist/utils/resourceLoader.d.ts +0 -1
  282. package/dist/utils/runtimeSecurity.d.ts +0 -1
  283. package/dist/utils/security.d.ts +0 -1
  284. package/dist/utils/traceId.d.ts +0 -1
  285. package/dist/utils/validation.d.ts +0 -1
  286. package/package.json +24 -9
  287. package/dist/components/index.d.ts.map +0 -1
  288. package/dist/core/Test.d.ts.map +0 -1
  289. package/dist/core/app/AppContext.d.ts.map +0 -1
  290. package/dist/core/app/AppContext.types.d.ts.map +0 -1
  291. package/dist/core/app/BasicLayout.d.ts.map +0 -1
  292. package/dist/core/app/DefaultApp.d.ts.map +0 -1
  293. package/dist/core/app/index.d.ts.map +0 -1
  294. package/dist/core/config/AppConfig.d.ts.map +0 -1
  295. package/dist/core/config/ConfigLoader.d.ts.map +0 -1
  296. package/dist/core/config/ConfigValidator.d.ts.map +0 -1
  297. package/dist/core/config/index.d.ts.map +0 -1
  298. package/dist/core/dev/DevTools.d.ts.map +0 -1
  299. package/dist/core/error/ErrorBoundary.d.ts.map +0 -1
  300. package/dist/core/error/ErrorHandler.d.ts.map +0 -1
  301. package/dist/core/error/index.d.ts.map +0 -1
  302. package/dist/core/event/AppEventBus.d.ts.map +0 -1
  303. package/dist/core/event/frameworkEvents.d.ts.map +0 -1
  304. package/dist/core/event/hooks.d.ts.map +0 -1
  305. package/dist/core/event/index.d.ts.map +0 -1
  306. package/dist/core/event/types.d.ts.map +0 -1
  307. package/dist/core/event/useEventBus.d.ts.map +0 -1
  308. package/dist/core/index.d.ts.map +0 -1
  309. package/dist/core/initialization/InitializationErrorThrower.d.ts.map +0 -1
  310. package/dist/core/initialization/index.d.ts.map +0 -1
  311. package/dist/core/initialization/initialization.d.ts.map +0 -1
  312. package/dist/core/initialization/initializationErrorState.d.ts.map +0 -1
  313. package/dist/core/middleware.d.ts.map +0 -1
  314. package/dist/core/plugin/PluginEventBus.d.ts.map +0 -1
  315. package/dist/core/plugin/PluginSandbox.d.ts.map +0 -1
  316. package/dist/core/plugin.d.ts.map +0 -1
  317. package/dist/core/router/RouterManager.d.ts.map +0 -1
  318. package/dist/core/router/adapter/AdapterManager.d.ts.map +0 -1
  319. package/dist/core/router/adapter/index.d.ts.map +0 -1
  320. package/dist/core/router/adapter/react-router/ReactRouterAdapter.d.ts.map +0 -1
  321. package/dist/core/router/adapter/react-router/index.d.ts.map +0 -1
  322. package/dist/core/router/adapter/types.d.ts.map +0 -1
  323. package/dist/core/router/dev/RouterDevTools.d.ts.map +0 -1
  324. package/dist/core/router/dev/index.d.ts.map +0 -1
  325. package/dist/core/router/dynamic/DynamicRouteManager.d.ts.map +0 -1
  326. package/dist/core/router/dynamic/index.d.ts.map +0 -1
  327. package/dist/core/router/errors/RouterError.d.ts.map +0 -1
  328. package/dist/core/router/errors/index.d.ts.map +0 -1
  329. package/dist/core/router/index.d.ts.map +0 -1
  330. package/dist/core/router/lifecycle/RouterLifecycleManager.d.ts.map +0 -1
  331. package/dist/core/router/lifecycle/index.d.ts.map +0 -1
  332. package/dist/core/router/middleware/RouterMiddlewareManager.d.ts.map +0 -1
  333. package/dist/core/router/middleware/auth.d.ts.map +0 -1
  334. package/dist/core/router/middleware/index.d.ts.map +0 -1
  335. package/dist/core/router/middleware/types.d.ts.map +0 -1
  336. package/dist/core/router/monitoring/RouterMonitoring.d.ts.map +0 -1
  337. package/dist/core/router/monitoring/index.d.ts.map +0 -1
  338. package/dist/core/router/navigation/RouterNavigation.d.ts.map +0 -1
  339. package/dist/core/router/navigation/index.d.ts.map +0 -1
  340. package/dist/core/router/performance/RouteCache.d.ts.map +0 -1
  341. package/dist/core/router/performance/RoutePreloader.d.ts.map +0 -1
  342. package/dist/core/router/performance/index.d.ts.map +0 -1
  343. package/dist/core/router/plugin/RouterPluginManager.d.ts.map +0 -1
  344. package/dist/core/router/plugin/index.d.ts.map +0 -1
  345. package/dist/core/router/plugin/types.d.ts.map +0 -1
  346. package/dist/core/router/types.d.ts.map +0 -1
  347. package/dist/core/router/utils/adapters/react-router/RouteErrorBoundary.d.ts.map +0 -1
  348. package/dist/core/router/utils/adapters/react-router/transform.d.ts.map +0 -1
  349. package/dist/core/router/utils/transform.d.ts.map +0 -1
  350. package/dist/core/router/validation/RouterConfigValidator.d.ts.map +0 -1
  351. package/dist/core/router/validation/index.d.ts.map +0 -1
  352. package/dist/core/router/validation/schema.d.ts.map +0 -1
  353. package/dist/core/router/version/RouteVersionManager.d.ts.map +0 -1
  354. package/dist/core/router/version/index.d.ts.map +0 -1
  355. package/dist/core/splash/SplashScreen.d.ts.map +0 -1
  356. package/dist/core/splash/index.d.ts.map +0 -1
  357. package/dist/core/splash/splashScreenUtils.d.ts.map +0 -1
  358. package/dist/core/startup/AppInstance.d.ts.map +0 -1
  359. package/dist/core/startup/environment.d.ts.map +0 -1
  360. package/dist/core/startup/index.d.ts.map +0 -1
  361. package/dist/core/startup/initializeServices.d.ts.map +0 -1
  362. package/dist/core/startup/performanceTracker.d.ts.map +0 -1
  363. package/dist/core/startup/renderApp.d.ts.map +0 -1
  364. package/dist/core/startup/startApp.d.ts.map +0 -1
  365. package/dist/core/types.d.ts.map +0 -1
  366. package/dist/index.d.ts.map +0 -1
  367. package/dist/index.umd.d.ts.map +0 -1
  368. package/dist/library/index.d.ts.map +0 -1
  369. package/dist/library/locale/index.d.ts.map +0 -1
  370. package/dist/library/locale/langs/en-us/index.d.ts.map +0 -1
  371. package/dist/library/locale/langs/zh-cn/index.d.ts.map +0 -1
  372. package/dist/library/locale/types.d.ts.map +0 -1
  373. package/dist/library/storage/cache.d.ts.map +0 -1
  374. package/dist/library/storage/encryption.d.ts.map +0 -1
  375. package/dist/library/storage/index.d.ts.map +0 -1
  376. package/dist/request/adapter/RequestAdapter.d.ts.map +0 -1
  377. package/dist/request/adapter/axiosAdapter.d.ts.map +0 -1
  378. package/dist/request/adapter/fetchAdapter.d.ts.map +0 -1
  379. package/dist/request/adapter/index.d.ts.map +0 -1
  380. package/dist/request/adapter/kyAdapter.d.ts.map +0 -1
  381. package/dist/request/adapter/undiciAdapter.d.ts.map +0 -1
  382. package/dist/request/core/RequestClient.d.ts.map +0 -1
  383. package/dist/request/core/index.d.ts.map +0 -1
  384. package/dist/request/index.d.ts.map +0 -1
  385. package/dist/request/plugin/RequestPlugin.d.ts.map +0 -1
  386. package/dist/request/plugin/cache.d.ts.map +0 -1
  387. package/dist/request/plugin/csrfPlugin.d.ts.map +0 -1
  388. package/dist/request/plugin/index.d.ts.map +0 -1
  389. package/dist/request/plugin/monitoring.d.ts.map +0 -1
  390. package/dist/request/plugin/queue.d.ts.map +0 -1
  391. package/dist/request/plugin/retry.d.ts.map +0 -1
  392. package/dist/request/plugin/validation.d.ts.map +0 -1
  393. package/dist/request/runtime/RequestContext.d.ts.map +0 -1
  394. package/dist/request/runtime/index.d.ts.map +0 -1
  395. package/dist/request/types.d.ts.map +0 -1
  396. package/dist/request/utils/RequestQueueManager.d.ts.map +0 -1
  397. package/dist/request/utils/dependencyCheck.d.ts.map +0 -1
  398. package/dist/request/utils/index.d.ts.map +0 -1
  399. package/dist/state/StateManager.d.ts.map +0 -1
  400. package/dist/state/adapters/AdapterFactory.d.ts.map +0 -1
  401. package/dist/state/adapters/DefaultAdapter.d.ts.map +0 -1
  402. package/dist/state/adapters/ReduxAdapter.d.ts.map +0 -1
  403. package/dist/state/adapters/ZustandAdapter.d.ts.map +0 -1
  404. package/dist/state/adapters/index.d.ts.map +0 -1
  405. package/dist/state/adapters/types.d.ts.map +0 -1
  406. package/dist/state/core/DerivedStateInstance.d.ts.map +0 -1
  407. package/dist/state/core/StateInstance.d.ts.map +0 -1
  408. package/dist/state/core/StateRegistry.d.ts.map +0 -1
  409. package/dist/state/core/StateScope.d.ts.map +0 -1
  410. package/dist/state/core/index.d.ts.map +0 -1
  411. package/dist/state/index.d.ts.map +0 -1
  412. package/dist/state/types.d.ts.map +0 -1
  413. package/dist/types.d.ts.map +0 -1
  414. package/dist/utils/analytics.d.ts.map +0 -1
  415. package/dist/utils/configSecurity.d.ts.map +0 -1
  416. package/dist/utils/csrf.d.ts.map +0 -1
  417. package/dist/utils/errors/ErrorCodes.d.ts.map +0 -1
  418. package/dist/utils/errors.d.ts.map +0 -1
  419. package/dist/utils/index.d.ts.map +0 -1
  420. package/dist/utils/logger.d.ts.map +0 -1
  421. package/dist/utils/logger.types.d.ts.map +0 -1
  422. package/dist/utils/monitoring.d.ts.map +0 -1
  423. package/dist/utils/performance.d.ts.map +0 -1
  424. package/dist/utils/resourceLoader.d.ts.map +0 -1
  425. package/dist/utils/runtimeSecurity.d.ts.map +0 -1
  426. package/dist/utils/security.d.ts.map +0 -1
  427. package/dist/utils/traceId.d.ts.map +0 -1
  428. package/dist/utils/validation.d.ts.map +0 -1
@@ -0,0 +1,21 @@
1
+ import React from 'react';
2
+ import type { CSSProperties, ReactNode } from 'react';
3
+ import type { LangType } from '../library/locale/types';
4
+ import { type PersistenceOptions } from './persistence';
5
+ export interface LocaleSwitchRenderContext {
6
+ locale: LangType;
7
+ isChanging: boolean;
8
+ setLocale: (locale: LangType) => void;
9
+ locales: LangType[];
10
+ labels: Record<LangType, string>;
11
+ }
12
+ export interface LocaleSwitchProps {
13
+ locales?: LangType[];
14
+ labels?: Partial<Record<LangType, string>>;
15
+ persistence?: PersistenceOptions;
16
+ className?: string;
17
+ style?: CSSProperties;
18
+ onChange?: (locale: LangType) => void;
19
+ render?: (context: LocaleSwitchRenderContext) => ReactNode;
20
+ }
21
+ export declare const LocaleSwitch: React.FC<LocaleSwitchProps>;
@@ -0,0 +1,103 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React from "react";
3
+ import { useLocale } from "../core";
4
+ import { readPersistedValue, writePersistedValue } from "./persistence";
5
+ const DEFAULT_LOCALE_STORAGE_KEY = 'vlian:locale';
6
+ const DEFAULT_LOCALES = [
7
+ 'zh-CN',
8
+ 'en-US'
9
+ ];
10
+ const DEFAULT_PERSISTENCE = {
11
+ enabled: true
12
+ };
13
+ const DEFAULT_LABELS = {
14
+ 'zh-CN': '中文',
15
+ 'en-US': 'English'
16
+ };
17
+ function isLocale(value) {
18
+ return value === 'zh-CN' || value === 'en-US';
19
+ }
20
+ export const LocaleSwitch = ({ locales = DEFAULT_LOCALES, labels = DEFAULT_LABELS, persistence, className, style, onChange, render })=>{
21
+ const { locale, setLocale, isChanging } = useLocale();
22
+ const persistenceOptions = persistence || DEFAULT_PERSISTENCE;
23
+ const hydratedRef = React.useRef(false);
24
+ const lastWrittenLocaleRef = React.useRef(undefined);
25
+ const mergedLabels = React.useMemo(()=>({
26
+ ...DEFAULT_LABELS,
27
+ ...labels
28
+ }), [
29
+ labels
30
+ ]);
31
+ React.useEffect(()=>{
32
+ if (hydratedRef.current) {
33
+ return;
34
+ }
35
+ hydratedRef.current = true;
36
+ const persistedLocale = readPersistedValue(persistenceOptions, DEFAULT_LOCALE_STORAGE_KEY);
37
+ if (!persistedLocale || !isLocale(persistedLocale) || !locales.includes(persistedLocale)) {
38
+ return;
39
+ }
40
+ if (persistedLocale !== locale) {
41
+ setLocale(persistedLocale);
42
+ }
43
+ }, [
44
+ locale,
45
+ locales,
46
+ persistenceOptions,
47
+ setLocale
48
+ ]);
49
+ React.useEffect(()=>{
50
+ if (lastWrittenLocaleRef.current === locale) {
51
+ return;
52
+ }
53
+ writePersistedValue(locale, persistenceOptions, DEFAULT_LOCALE_STORAGE_KEY);
54
+ lastWrittenLocaleRef.current = locale;
55
+ }, [
56
+ locale,
57
+ persistenceOptions
58
+ ]);
59
+ const handleSetLocale = React.useCallback((nextLocale)=>{
60
+ if (nextLocale === locale) {
61
+ return;
62
+ }
63
+ setLocale(nextLocale);
64
+ onChange?.(nextLocale);
65
+ }, [
66
+ locale,
67
+ onChange,
68
+ setLocale
69
+ ]);
70
+ if (render) {
71
+ return render({
72
+ locale,
73
+ isChanging: Boolean(isChanging),
74
+ setLocale: handleSetLocale,
75
+ locales,
76
+ labels: mergedLabels
77
+ });
78
+ }
79
+ return /*#__PURE__*/ _jsxs("label", {
80
+ className: className,
81
+ style: style,
82
+ children: [
83
+ /*#__PURE__*/ _jsx("span", {
84
+ style: {
85
+ display: 'none'
86
+ },
87
+ children: "Language Switch"
88
+ }),
89
+ /*#__PURE__*/ _jsx("select", {
90
+ "aria-label": "Language Switch",
91
+ value: locale,
92
+ onChange: (event)=>handleSetLocale(event.target.value),
93
+ disabled: Boolean(isChanging),
94
+ children: locales.map((item)=>/*#__PURE__*/ _jsx("option", {
95
+ value: item,
96
+ children: mergedLabels[item]
97
+ }, item))
98
+ })
99
+ ]
100
+ });
101
+ };
102
+
103
+ //# sourceMappingURL=LocaleSwitch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/LocaleSwitch.tsx"],"sourcesContent":["import React from 'react';\nimport type { CSSProperties, ReactNode } from 'react';\nimport { useLocale } from '../core';\nimport type { LangType } from '../library/locale/types';\nimport {\n type PersistenceOptions,\n readPersistedValue,\n writePersistedValue,\n} from './persistence';\n\nconst DEFAULT_LOCALE_STORAGE_KEY = 'vlian:locale';\nconst DEFAULT_LOCALES: LangType[] = ['zh-CN', 'en-US'];\nconst DEFAULT_PERSISTENCE: PersistenceOptions = { enabled: true };\n\nconst DEFAULT_LABELS: Record<LangType, string> = {\n 'zh-CN': '中文',\n 'en-US': 'English',\n};\n\nexport interface LocaleSwitchRenderContext {\n locale: LangType;\n isChanging: boolean;\n setLocale: (locale: LangType) => void;\n locales: LangType[];\n labels: Record<LangType, string>;\n}\n\nexport interface LocaleSwitchProps {\n locales?: LangType[];\n labels?: Partial<Record<LangType, string>>;\n persistence?: PersistenceOptions;\n className?: string;\n style?: CSSProperties;\n onChange?: (locale: LangType) => void;\n render?: (context: LocaleSwitchRenderContext) => ReactNode;\n}\n\nfunction isLocale(value: string): value is LangType {\n return value === 'zh-CN' || value === 'en-US';\n}\n\nexport const LocaleSwitch: React.FC<LocaleSwitchProps> = ({\n locales = DEFAULT_LOCALES,\n labels = DEFAULT_LABELS,\n persistence,\n className,\n style,\n onChange,\n render,\n}) => {\n const { locale, setLocale, isChanging } = useLocale();\n const persistenceOptions = persistence || DEFAULT_PERSISTENCE;\n const hydratedRef = React.useRef(false);\n const lastWrittenLocaleRef = React.useRef<LangType | undefined>(undefined);\n\n const mergedLabels = React.useMemo<Record<LangType, string>>(\n () => ({\n ...DEFAULT_LABELS,\n ...labels,\n }),\n [labels]\n );\n\n React.useEffect(() => {\n if (hydratedRef.current) {\n return;\n }\n hydratedRef.current = true;\n\n const persistedLocale = readPersistedValue(persistenceOptions, DEFAULT_LOCALE_STORAGE_KEY);\n if (!persistedLocale || !isLocale(persistedLocale) || !locales.includes(persistedLocale)) {\n return;\n }\n\n if (persistedLocale !== locale) {\n setLocale(persistedLocale);\n }\n }, [locale, locales, persistenceOptions, setLocale]);\n\n React.useEffect(() => {\n if (lastWrittenLocaleRef.current === locale) {\n return;\n }\n\n writePersistedValue(locale, persistenceOptions, DEFAULT_LOCALE_STORAGE_KEY);\n lastWrittenLocaleRef.current = locale;\n }, [locale, persistenceOptions]);\n\n const handleSetLocale = React.useCallback(\n (nextLocale: LangType) => {\n if (nextLocale === locale) {\n return;\n }\n setLocale(nextLocale);\n onChange?.(nextLocale);\n },\n [locale, onChange, setLocale]\n );\n\n if (render) {\n return render({\n locale,\n isChanging: Boolean(isChanging),\n setLocale: handleSetLocale,\n locales,\n labels: mergedLabels,\n });\n }\n\n return (\n <label className={className} style={style}>\n <span style={{ display: 'none' }}>Language Switch</span>\n <select\n aria-label=\"Language Switch\"\n value={locale}\n onChange={(event) => handleSetLocale(event.target.value as LangType)}\n disabled={Boolean(isChanging)}\n >\n {locales.map((item) => (\n <option key={item} value={item}>\n {mergedLabels[item]}\n </option>\n ))}\n </select>\n </label>\n );\n};\n"],"names":["React","useLocale","readPersistedValue","writePersistedValue","DEFAULT_LOCALE_STORAGE_KEY","DEFAULT_LOCALES","DEFAULT_PERSISTENCE","enabled","DEFAULT_LABELS","isLocale","value","LocaleSwitch","locales","labels","persistence","className","style","onChange","render","locale","setLocale","isChanging","persistenceOptions","hydratedRef","useRef","lastWrittenLocaleRef","undefined","mergedLabels","useMemo","useEffect","current","persistedLocale","includes","handleSetLocale","useCallback","nextLocale","Boolean","label","span","display","select","aria-label","event","target","disabled","map","item","option"],"mappings":";AAAA,OAAOA,WAAW,QAAQ;AAE1B,SAASC,SAAS,QAAQ,UAAU;AAEpC,SAEEC,kBAAkB,EAClBC,mBAAmB,QACd,gBAAgB;AAEvB,MAAMC,6BAA6B;AACnC,MAAMC,kBAA8B;IAAC;IAAS;CAAQ;AACtD,MAAMC,sBAA0C;IAAEC,SAAS;AAAK;AAEhE,MAAMC,iBAA2C;IAC/C,SAAS;IACT,SAAS;AACX;AAoBA,SAASC,SAASC,KAAa;IAC7B,OAAOA,UAAU,WAAWA,UAAU;AACxC;AAEA,OAAO,MAAMC,eAA4C,CAAC,EACxDC,UAAUP,eAAe,EACzBQ,SAASL,cAAc,EACvBM,WAAW,EACXC,SAAS,EACTC,KAAK,EACLC,QAAQ,EACRC,MAAM,EACP;IACC,MAAM,EAAEC,MAAM,EAAEC,SAAS,EAAEC,UAAU,EAAE,GAAGpB;IAC1C,MAAMqB,qBAAqBR,eAAeR;IAC1C,MAAMiB,cAAcvB,MAAMwB,MAAM,CAAC;IACjC,MAAMC,uBAAuBzB,MAAMwB,MAAM,CAAuBE;IAEhE,MAAMC,eAAe3B,MAAM4B,OAAO,CAChC,IAAO,CAAA;YACL,GAAGpB,cAAc;YACjB,GAAGK,MAAM;QACX,CAAA,GACA;QAACA;KAAO;IAGVb,MAAM6B,SAAS,CAAC;QACd,IAAIN,YAAYO,OAAO,EAAE;YACvB;QACF;QACAP,YAAYO,OAAO,GAAG;QAEtB,MAAMC,kBAAkB7B,mBAAmBoB,oBAAoBlB;QAC/D,IAAI,CAAC2B,mBAAmB,CAACtB,SAASsB,oBAAoB,CAACnB,QAAQoB,QAAQ,CAACD,kBAAkB;YACxF;QACF;QAEA,IAAIA,oBAAoBZ,QAAQ;YAC9BC,UAAUW;QACZ;IACF,GAAG;QAACZ;QAAQP;QAASU;QAAoBF;KAAU;IAEnDpB,MAAM6B,SAAS,CAAC;QACd,IAAIJ,qBAAqBK,OAAO,KAAKX,QAAQ;YAC3C;QACF;QAEAhB,oBAAoBgB,QAAQG,oBAAoBlB;QAChDqB,qBAAqBK,OAAO,GAAGX;IACjC,GAAG;QAACA;QAAQG;KAAmB;IAE/B,MAAMW,kBAAkBjC,MAAMkC,WAAW,CACvC,CAACC;QACC,IAAIA,eAAehB,QAAQ;YACzB;QACF;QACAC,UAAUe;QACVlB,WAAWkB;IACb,GACA;QAAChB;QAAQF;QAAUG;KAAU;IAG/B,IAAIF,QAAQ;QACV,OAAOA,OAAO;YACZC;YACAE,YAAYe,QAAQf;YACpBD,WAAWa;YACXrB;YACAC,QAAQc;QACV;IACF;IAEA,qBACE,MAACU;QAAMtB,WAAWA;QAAWC,OAAOA;;0BAClC,KAACsB;gBAAKtB,OAAO;oBAAEuB,SAAS;gBAAO;0BAAG;;0BAClC,KAACC;gBACCC,cAAW;gBACX/B,OAAOS;gBACPF,UAAU,CAACyB,QAAUT,gBAAgBS,MAAMC,MAAM,CAACjC,KAAK;gBACvDkC,UAAUR,QAAQf;0BAEjBT,QAAQiC,GAAG,CAAC,CAACC,qBACZ,KAACC;wBAAkBrC,OAAOoC;kCACvBnB,YAAY,CAACmB,KAAK;uBADRA;;;;AAOvB,EAAE"}
@@ -0,0 +1,117 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "ThemeSwitch", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return ThemeSwitch;
9
+ }
10
+ });
11
+ const _jsxruntime = require("react/jsx-runtime");
12
+ const _react = /*#__PURE__*/ _interop_require_default(require("react"));
13
+ const _core = require("../core");
14
+ const _persistence = require("./persistence");
15
+ function _interop_require_default(obj) {
16
+ return obj && obj.__esModule ? obj : {
17
+ default: obj
18
+ };
19
+ }
20
+ const DEFAULT_THEME_STORAGE_KEY = 'vlian:theme-mode';
21
+ const DEFAULT_MODES = [
22
+ 'light',
23
+ 'dark',
24
+ 'system'
25
+ ];
26
+ const DEFAULT_PERSISTENCE = {
27
+ enabled: true
28
+ };
29
+ const DEFAULT_LABELS = {
30
+ light: '浅色',
31
+ dark: '深色',
32
+ system: '跟随系统'
33
+ };
34
+ function isThemeMode(value) {
35
+ return value === 'light' || value === 'dark' || value === 'system';
36
+ }
37
+ const ThemeSwitch = ({ modes = DEFAULT_MODES, labels = DEFAULT_LABELS, persistence, className, style, onChange, render })=>{
38
+ const { theme, setTheme } = (0, _core.useTheme)();
39
+ const persistenceOptions = persistence || DEFAULT_PERSISTENCE;
40
+ const hydratedRef = _react.default.useRef(false);
41
+ const lastWrittenModeRef = _react.default.useRef(undefined);
42
+ const mergedLabels = _react.default.useMemo(()=>({
43
+ ...DEFAULT_LABELS,
44
+ ...labels
45
+ }), [
46
+ labels
47
+ ]);
48
+ _react.default.useEffect(()=>{
49
+ if (hydratedRef.current) {
50
+ return;
51
+ }
52
+ hydratedRef.current = true;
53
+ const persistedMode = (0, _persistence.readPersistedValue)(persistenceOptions, DEFAULT_THEME_STORAGE_KEY);
54
+ if (!persistedMode || !isThemeMode(persistedMode) || !modes.includes(persistedMode)) {
55
+ return;
56
+ }
57
+ if (persistedMode !== theme.mode) {
58
+ setTheme((prev)=>({
59
+ ...prev,
60
+ mode: persistedMode
61
+ }));
62
+ }
63
+ }, [
64
+ modes,
65
+ persistenceOptions,
66
+ setTheme,
67
+ theme.mode
68
+ ]);
69
+ _react.default.useEffect(()=>{
70
+ const mode = theme.mode;
71
+ if (!mode || lastWrittenModeRef.current === mode) {
72
+ return;
73
+ }
74
+ (0, _persistence.writePersistedValue)(mode, persistenceOptions, DEFAULT_THEME_STORAGE_KEY);
75
+ lastWrittenModeRef.current = mode;
76
+ }, [
77
+ persistenceOptions,
78
+ theme.mode
79
+ ]);
80
+ const currentMode = theme.mode || 'light';
81
+ const setMode = _react.default.useCallback((mode)=>{
82
+ if (mode === currentMode) {
83
+ return;
84
+ }
85
+ setTheme((prev)=>({
86
+ ...prev,
87
+ mode
88
+ }));
89
+ onChange?.(mode);
90
+ }, [
91
+ currentMode,
92
+ onChange,
93
+ setTheme
94
+ ]);
95
+ if (render) {
96
+ return render({
97
+ mode: currentMode,
98
+ setMode,
99
+ modes,
100
+ labels: mergedLabels
101
+ });
102
+ }
103
+ return /*#__PURE__*/ (0, _jsxruntime.jsx)("div", {
104
+ className: className,
105
+ style: style,
106
+ role: "group",
107
+ "aria-label": "Theme Switch",
108
+ children: modes.map((mode)=>/*#__PURE__*/ (0, _jsxruntime.jsx)("button", {
109
+ type: "button",
110
+ onClick: ()=>setMode(mode),
111
+ "aria-pressed": currentMode === mode,
112
+ children: mergedLabels[mode]
113
+ }, mode))
114
+ });
115
+ };
116
+
117
+ //# sourceMappingURL=ThemeSwitch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/ThemeSwitch.tsx"],"sourcesContent":["import React from 'react';\nimport type { CSSProperties, ReactNode } from 'react';\nimport { useTheme } from '../core';\nimport type { ThemeMode } from '../core/kernel';\nimport {\n type PersistenceOptions,\n readPersistedValue,\n writePersistedValue,\n} from './persistence';\n\nconst DEFAULT_THEME_STORAGE_KEY = 'vlian:theme-mode';\nconst DEFAULT_MODES: ThemeMode[] = ['light', 'dark', 'system'];\nconst DEFAULT_PERSISTENCE: PersistenceOptions = { enabled: true };\n\nconst DEFAULT_LABELS: Record<ThemeMode, string> = {\n light: '浅色',\n dark: '深色',\n system: '跟随系统',\n};\n\nexport interface ThemeSwitchRenderContext {\n mode: ThemeMode;\n setMode: (mode: ThemeMode) => void;\n modes: ThemeMode[];\n labels: Record<ThemeMode, string>;\n}\n\nexport interface ThemeSwitchProps {\n modes?: ThemeMode[];\n labels?: Partial<Record<ThemeMode, string>>;\n persistence?: PersistenceOptions;\n className?: string;\n style?: CSSProperties;\n onChange?: (mode: ThemeMode) => void;\n render?: (context: ThemeSwitchRenderContext) => ReactNode;\n}\n\nfunction isThemeMode(value: string): value is ThemeMode {\n return value === 'light' || value === 'dark' || value === 'system';\n}\n\nexport const ThemeSwitch: React.FC<ThemeSwitchProps> = ({\n modes = DEFAULT_MODES,\n labels = DEFAULT_LABELS,\n persistence,\n className,\n style,\n onChange,\n render,\n}) => {\n const { theme, setTheme } = useTheme();\n const persistenceOptions = persistence || DEFAULT_PERSISTENCE;\n const hydratedRef = React.useRef(false);\n const lastWrittenModeRef = React.useRef<ThemeMode | undefined>(undefined);\n\n const mergedLabels = React.useMemo<Record<ThemeMode, string>>(\n () => ({\n ...DEFAULT_LABELS,\n ...labels,\n }),\n [labels]\n );\n\n React.useEffect(() => {\n if (hydratedRef.current) {\n return;\n }\n hydratedRef.current = true;\n\n const persistedMode = readPersistedValue(persistenceOptions, DEFAULT_THEME_STORAGE_KEY);\n if (!persistedMode || !isThemeMode(persistedMode) || !modes.includes(persistedMode)) {\n return;\n }\n\n if (persistedMode !== theme.mode) {\n setTheme((prev) => ({\n ...prev,\n mode: persistedMode,\n }));\n }\n }, [modes, persistenceOptions, setTheme, theme.mode]);\n\n React.useEffect(() => {\n const mode = theme.mode;\n if (!mode || lastWrittenModeRef.current === mode) {\n return;\n }\n\n writePersistedValue(mode, persistenceOptions, DEFAULT_THEME_STORAGE_KEY);\n lastWrittenModeRef.current = mode;\n }, [persistenceOptions, theme.mode]);\n\n const currentMode: ThemeMode = (theme.mode || 'light') as ThemeMode;\n\n const setMode = React.useCallback(\n (mode: ThemeMode) => {\n if (mode === currentMode) {\n return;\n }\n setTheme((prev) => ({\n ...prev,\n mode,\n }));\n onChange?.(mode);\n },\n [currentMode, onChange, setTheme]\n );\n\n if (render) {\n return render({\n mode: currentMode,\n setMode,\n modes,\n labels: mergedLabels,\n });\n }\n\n return (\n <div className={className} style={style} role=\"group\" aria-label=\"Theme Switch\">\n {modes.map((mode) => (\n <button\n key={mode}\n type=\"button\"\n onClick={() => setMode(mode)}\n aria-pressed={currentMode === mode}\n >\n {mergedLabels[mode]}\n </button>\n ))}\n </div>\n );\n};\n"],"names":["ThemeSwitch","DEFAULT_THEME_STORAGE_KEY","DEFAULT_MODES","DEFAULT_PERSISTENCE","enabled","DEFAULT_LABELS","light","dark","system","isThemeMode","value","modes","labels","persistence","className","style","onChange","render","theme","setTheme","useTheme","persistenceOptions","hydratedRef","React","useRef","lastWrittenModeRef","undefined","mergedLabels","useMemo","useEffect","current","persistedMode","readPersistedValue","includes","mode","prev","writePersistedValue","currentMode","setMode","useCallback","div","role","aria-label","map","button","type","onClick","aria-pressed"],"mappings":";;;;+BAyCaA;;;eAAAA;;;;8DAzCK;sBAEO;6BAMlB;;;;;;AAEP,MAAMC,4BAA4B;AAClC,MAAMC,gBAA6B;IAAC;IAAS;IAAQ;CAAS;AAC9D,MAAMC,sBAA0C;IAAEC,SAAS;AAAK;AAEhE,MAAMC,iBAA4C;IAChDC,OAAO;IACPC,MAAM;IACNC,QAAQ;AACV;AAmBA,SAASC,YAAYC,KAAa;IAChC,OAAOA,UAAU,WAAWA,UAAU,UAAUA,UAAU;AAC5D;AAEO,MAAMV,cAA0C,CAAC,EACtDW,QAAQT,aAAa,EACrBU,SAASP,cAAc,EACvBQ,WAAW,EACXC,SAAS,EACTC,KAAK,EACLC,QAAQ,EACRC,MAAM,EACP;IACC,MAAM,EAAEC,KAAK,EAAEC,QAAQ,EAAE,GAAGC,IAAAA,cAAQ;IACpC,MAAMC,qBAAqBR,eAAeV;IAC1C,MAAMmB,cAAcC,cAAK,CAACC,MAAM,CAAC;IACjC,MAAMC,qBAAqBF,cAAK,CAACC,MAAM,CAAwBE;IAE/D,MAAMC,eAAeJ,cAAK,CAACK,OAAO,CAChC,IAAO,CAAA;YACL,GAAGvB,cAAc;YACjB,GAAGO,MAAM;QACX,CAAA,GACA;QAACA;KAAO;IAGVW,cAAK,CAACM,SAAS,CAAC;QACd,IAAIP,YAAYQ,OAAO,EAAE;YACvB;QACF;QACAR,YAAYQ,OAAO,GAAG;QAEtB,MAAMC,gBAAgBC,IAAAA,+BAAkB,EAACX,oBAAoBpB;QAC7D,IAAI,CAAC8B,iBAAiB,CAACtB,YAAYsB,kBAAkB,CAACpB,MAAMsB,QAAQ,CAACF,gBAAgB;YACnF;QACF;QAEA,IAAIA,kBAAkBb,MAAMgB,IAAI,EAAE;YAChCf,SAAS,CAACgB,OAAU,CAAA;oBAClB,GAAGA,IAAI;oBACPD,MAAMH;gBACR,CAAA;QACF;IACF,GAAG;QAACpB;QAAOU;QAAoBF;QAAUD,MAAMgB,IAAI;KAAC;IAEpDX,cAAK,CAACM,SAAS,CAAC;QACd,MAAMK,OAAOhB,MAAMgB,IAAI;QACvB,IAAI,CAACA,QAAQT,mBAAmBK,OAAO,KAAKI,MAAM;YAChD;QACF;QAEAE,IAAAA,gCAAmB,EAACF,MAAMb,oBAAoBpB;QAC9CwB,mBAAmBK,OAAO,GAAGI;IAC/B,GAAG;QAACb;QAAoBH,MAAMgB,IAAI;KAAC;IAEnC,MAAMG,cAA0BnB,MAAMgB,IAAI,IAAI;IAE9C,MAAMI,UAAUf,cAAK,CAACgB,WAAW,CAC/B,CAACL;QACC,IAAIA,SAASG,aAAa;YACxB;QACF;QACAlB,SAAS,CAACgB,OAAU,CAAA;gBAClB,GAAGA,IAAI;gBACPD;YACF,CAAA;QACAlB,WAAWkB;IACb,GACA;QAACG;QAAarB;QAAUG;KAAS;IAGnC,IAAIF,QAAQ;QACV,OAAOA,OAAO;YACZiB,MAAMG;YACNC;YACA3B;YACAC,QAAQe;QACV;IACF;IAEA,qBACE,qBAACa;QAAI1B,WAAWA;QAAWC,OAAOA;QAAO0B,MAAK;QAAQC,cAAW;kBAC9D/B,MAAMgC,GAAG,CAAC,CAACT,qBACV,qBAACU;gBAECC,MAAK;gBACLC,SAAS,IAAMR,QAAQJ;gBACvBa,gBAAcV,gBAAgBH;0BAE7BP,YAAY,CAACO,KAAK;eALdA;;AAUf"}
@@ -0,0 +1,20 @@
1
+ import React from 'react';
2
+ import type { CSSProperties, ReactNode } from 'react';
3
+ import type { ThemeMode } from '../core/kernel';
4
+ import { type PersistenceOptions } from './persistence';
5
+ export interface ThemeSwitchRenderContext {
6
+ mode: ThemeMode;
7
+ setMode: (mode: ThemeMode) => void;
8
+ modes: ThemeMode[];
9
+ labels: Record<ThemeMode, string>;
10
+ }
11
+ export interface ThemeSwitchProps {
12
+ modes?: ThemeMode[];
13
+ labels?: Partial<Record<ThemeMode, string>>;
14
+ persistence?: PersistenceOptions;
15
+ className?: string;
16
+ style?: CSSProperties;
17
+ onChange?: (mode: ThemeMode) => void;
18
+ render?: (context: ThemeSwitchRenderContext) => ReactNode;
19
+ }
20
+ export declare const ThemeSwitch: React.FC<ThemeSwitchProps>;
@@ -0,0 +1,102 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import React from "react";
3
+ import { useTheme } from "../core";
4
+ import { readPersistedValue, writePersistedValue } from "./persistence";
5
+ const DEFAULT_THEME_STORAGE_KEY = 'vlian:theme-mode';
6
+ const DEFAULT_MODES = [
7
+ 'light',
8
+ 'dark',
9
+ 'system'
10
+ ];
11
+ const DEFAULT_PERSISTENCE = {
12
+ enabled: true
13
+ };
14
+ const DEFAULT_LABELS = {
15
+ light: '浅色',
16
+ dark: '深色',
17
+ system: '跟随系统'
18
+ };
19
+ function isThemeMode(value) {
20
+ return value === 'light' || value === 'dark' || value === 'system';
21
+ }
22
+ export const ThemeSwitch = ({ modes = DEFAULT_MODES, labels = DEFAULT_LABELS, persistence, className, style, onChange, render })=>{
23
+ const { theme, setTheme } = useTheme();
24
+ const persistenceOptions = persistence || DEFAULT_PERSISTENCE;
25
+ const hydratedRef = React.useRef(false);
26
+ const lastWrittenModeRef = React.useRef(undefined);
27
+ const mergedLabels = React.useMemo(()=>({
28
+ ...DEFAULT_LABELS,
29
+ ...labels
30
+ }), [
31
+ labels
32
+ ]);
33
+ React.useEffect(()=>{
34
+ if (hydratedRef.current) {
35
+ return;
36
+ }
37
+ hydratedRef.current = true;
38
+ const persistedMode = readPersistedValue(persistenceOptions, DEFAULT_THEME_STORAGE_KEY);
39
+ if (!persistedMode || !isThemeMode(persistedMode) || !modes.includes(persistedMode)) {
40
+ return;
41
+ }
42
+ if (persistedMode !== theme.mode) {
43
+ setTheme((prev)=>({
44
+ ...prev,
45
+ mode: persistedMode
46
+ }));
47
+ }
48
+ }, [
49
+ modes,
50
+ persistenceOptions,
51
+ setTheme,
52
+ theme.mode
53
+ ]);
54
+ React.useEffect(()=>{
55
+ const mode = theme.mode;
56
+ if (!mode || lastWrittenModeRef.current === mode) {
57
+ return;
58
+ }
59
+ writePersistedValue(mode, persistenceOptions, DEFAULT_THEME_STORAGE_KEY);
60
+ lastWrittenModeRef.current = mode;
61
+ }, [
62
+ persistenceOptions,
63
+ theme.mode
64
+ ]);
65
+ const currentMode = theme.mode || 'light';
66
+ const setMode = React.useCallback((mode)=>{
67
+ if (mode === currentMode) {
68
+ return;
69
+ }
70
+ setTheme((prev)=>({
71
+ ...prev,
72
+ mode
73
+ }));
74
+ onChange?.(mode);
75
+ }, [
76
+ currentMode,
77
+ onChange,
78
+ setTheme
79
+ ]);
80
+ if (render) {
81
+ return render({
82
+ mode: currentMode,
83
+ setMode,
84
+ modes,
85
+ labels: mergedLabels
86
+ });
87
+ }
88
+ return /*#__PURE__*/ _jsx("div", {
89
+ className: className,
90
+ style: style,
91
+ role: "group",
92
+ "aria-label": "Theme Switch",
93
+ children: modes.map((mode)=>/*#__PURE__*/ _jsx("button", {
94
+ type: "button",
95
+ onClick: ()=>setMode(mode),
96
+ "aria-pressed": currentMode === mode,
97
+ children: mergedLabels[mode]
98
+ }, mode))
99
+ });
100
+ };
101
+
102
+ //# sourceMappingURL=ThemeSwitch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/ThemeSwitch.tsx"],"sourcesContent":["import React from 'react';\nimport type { CSSProperties, ReactNode } from 'react';\nimport { useTheme } from '../core';\nimport type { ThemeMode } from '../core/kernel';\nimport {\n type PersistenceOptions,\n readPersistedValue,\n writePersistedValue,\n} from './persistence';\n\nconst DEFAULT_THEME_STORAGE_KEY = 'vlian:theme-mode';\nconst DEFAULT_MODES: ThemeMode[] = ['light', 'dark', 'system'];\nconst DEFAULT_PERSISTENCE: PersistenceOptions = { enabled: true };\n\nconst DEFAULT_LABELS: Record<ThemeMode, string> = {\n light: '浅色',\n dark: '深色',\n system: '跟随系统',\n};\n\nexport interface ThemeSwitchRenderContext {\n mode: ThemeMode;\n setMode: (mode: ThemeMode) => void;\n modes: ThemeMode[];\n labels: Record<ThemeMode, string>;\n}\n\nexport interface ThemeSwitchProps {\n modes?: ThemeMode[];\n labels?: Partial<Record<ThemeMode, string>>;\n persistence?: PersistenceOptions;\n className?: string;\n style?: CSSProperties;\n onChange?: (mode: ThemeMode) => void;\n render?: (context: ThemeSwitchRenderContext) => ReactNode;\n}\n\nfunction isThemeMode(value: string): value is ThemeMode {\n return value === 'light' || value === 'dark' || value === 'system';\n}\n\nexport const ThemeSwitch: React.FC<ThemeSwitchProps> = ({\n modes = DEFAULT_MODES,\n labels = DEFAULT_LABELS,\n persistence,\n className,\n style,\n onChange,\n render,\n}) => {\n const { theme, setTheme } = useTheme();\n const persistenceOptions = persistence || DEFAULT_PERSISTENCE;\n const hydratedRef = React.useRef(false);\n const lastWrittenModeRef = React.useRef<ThemeMode | undefined>(undefined);\n\n const mergedLabels = React.useMemo<Record<ThemeMode, string>>(\n () => ({\n ...DEFAULT_LABELS,\n ...labels,\n }),\n [labels]\n );\n\n React.useEffect(() => {\n if (hydratedRef.current) {\n return;\n }\n hydratedRef.current = true;\n\n const persistedMode = readPersistedValue(persistenceOptions, DEFAULT_THEME_STORAGE_KEY);\n if (!persistedMode || !isThemeMode(persistedMode) || !modes.includes(persistedMode)) {\n return;\n }\n\n if (persistedMode !== theme.mode) {\n setTheme((prev) => ({\n ...prev,\n mode: persistedMode,\n }));\n }\n }, [modes, persistenceOptions, setTheme, theme.mode]);\n\n React.useEffect(() => {\n const mode = theme.mode;\n if (!mode || lastWrittenModeRef.current === mode) {\n return;\n }\n\n writePersistedValue(mode, persistenceOptions, DEFAULT_THEME_STORAGE_KEY);\n lastWrittenModeRef.current = mode;\n }, [persistenceOptions, theme.mode]);\n\n const currentMode: ThemeMode = (theme.mode || 'light') as ThemeMode;\n\n const setMode = React.useCallback(\n (mode: ThemeMode) => {\n if (mode === currentMode) {\n return;\n }\n setTheme((prev) => ({\n ...prev,\n mode,\n }));\n onChange?.(mode);\n },\n [currentMode, onChange, setTheme]\n );\n\n if (render) {\n return render({\n mode: currentMode,\n setMode,\n modes,\n labels: mergedLabels,\n });\n }\n\n return (\n <div className={className} style={style} role=\"group\" aria-label=\"Theme Switch\">\n {modes.map((mode) => (\n <button\n key={mode}\n type=\"button\"\n onClick={() => setMode(mode)}\n aria-pressed={currentMode === mode}\n >\n {mergedLabels[mode]}\n </button>\n ))}\n </div>\n );\n};\n"],"names":["React","useTheme","readPersistedValue","writePersistedValue","DEFAULT_THEME_STORAGE_KEY","DEFAULT_MODES","DEFAULT_PERSISTENCE","enabled","DEFAULT_LABELS","light","dark","system","isThemeMode","value","ThemeSwitch","modes","labels","persistence","className","style","onChange","render","theme","setTheme","persistenceOptions","hydratedRef","useRef","lastWrittenModeRef","undefined","mergedLabels","useMemo","useEffect","current","persistedMode","includes","mode","prev","currentMode","setMode","useCallback","div","role","aria-label","map","button","type","onClick","aria-pressed"],"mappings":";AAAA,OAAOA,WAAW,QAAQ;AAE1B,SAASC,QAAQ,QAAQ,UAAU;AAEnC,SAEEC,kBAAkB,EAClBC,mBAAmB,QACd,gBAAgB;AAEvB,MAAMC,4BAA4B;AAClC,MAAMC,gBAA6B;IAAC;IAAS;IAAQ;CAAS;AAC9D,MAAMC,sBAA0C;IAAEC,SAAS;AAAK;AAEhE,MAAMC,iBAA4C;IAChDC,OAAO;IACPC,MAAM;IACNC,QAAQ;AACV;AAmBA,SAASC,YAAYC,KAAa;IAChC,OAAOA,UAAU,WAAWA,UAAU,UAAUA,UAAU;AAC5D;AAEA,OAAO,MAAMC,cAA0C,CAAC,EACtDC,QAAQV,aAAa,EACrBW,SAASR,cAAc,EACvBS,WAAW,EACXC,SAAS,EACTC,KAAK,EACLC,QAAQ,EACRC,MAAM,EACP;IACC,MAAM,EAAEC,KAAK,EAAEC,QAAQ,EAAE,GAAGtB;IAC5B,MAAMuB,qBAAqBP,eAAeX;IAC1C,MAAMmB,cAAczB,MAAM0B,MAAM,CAAC;IACjC,MAAMC,qBAAqB3B,MAAM0B,MAAM,CAAwBE;IAE/D,MAAMC,eAAe7B,MAAM8B,OAAO,CAChC,IAAO,CAAA;YACL,GAAGtB,cAAc;YACjB,GAAGQ,MAAM;QACX,CAAA,GACA;QAACA;KAAO;IAGVhB,MAAM+B,SAAS,CAAC;QACd,IAAIN,YAAYO,OAAO,EAAE;YACvB;QACF;QACAP,YAAYO,OAAO,GAAG;QAEtB,MAAMC,gBAAgB/B,mBAAmBsB,oBAAoBpB;QAC7D,IAAI,CAAC6B,iBAAiB,CAACrB,YAAYqB,kBAAkB,CAAClB,MAAMmB,QAAQ,CAACD,gBAAgB;YACnF;QACF;QAEA,IAAIA,kBAAkBX,MAAMa,IAAI,EAAE;YAChCZ,SAAS,CAACa,OAAU,CAAA;oBAClB,GAAGA,IAAI;oBACPD,MAAMF;gBACR,CAAA;QACF;IACF,GAAG;QAAClB;QAAOS;QAAoBD;QAAUD,MAAMa,IAAI;KAAC;IAEpDnC,MAAM+B,SAAS,CAAC;QACd,MAAMI,OAAOb,MAAMa,IAAI;QACvB,IAAI,CAACA,QAAQR,mBAAmBK,OAAO,KAAKG,MAAM;YAChD;QACF;QAEAhC,oBAAoBgC,MAAMX,oBAAoBpB;QAC9CuB,mBAAmBK,OAAO,GAAGG;IAC/B,GAAG;QAACX;QAAoBF,MAAMa,IAAI;KAAC;IAEnC,MAAME,cAA0Bf,MAAMa,IAAI,IAAI;IAE9C,MAAMG,UAAUtC,MAAMuC,WAAW,CAC/B,CAACJ;QACC,IAAIA,SAASE,aAAa;YACxB;QACF;QACAd,SAAS,CAACa,OAAU,CAAA;gBAClB,GAAGA,IAAI;gBACPD;YACF,CAAA;QACAf,WAAWe;IACb,GACA;QAACE;QAAajB;QAAUG;KAAS;IAGnC,IAAIF,QAAQ;QACV,OAAOA,OAAO;YACZc,MAAME;YACNC;YACAvB;YACAC,QAAQa;QACV;IACF;IAEA,qBACE,KAACW;QAAItB,WAAWA;QAAWC,OAAOA;QAAOsB,MAAK;QAAQC,cAAW;kBAC9D3B,MAAM4B,GAAG,CAAC,CAACR,qBACV,KAACS;gBAECC,MAAK;gBACLC,SAAS,IAAMR,QAAQH;gBACvBY,gBAAcV,gBAAgBF;0BAE7BN,YAAY,CAACM,KAAK;eALdA;;AAUf,EAAE"}
@@ -2,5 +2,21 @@
2
2
  Object.defineProperty(exports, "__esModule", {
3
3
  value: true
4
4
  });
5
+ function _export(target, all) {
6
+ for(var name in all)Object.defineProperty(target, name, {
7
+ enumerable: true,
8
+ get: Object.getOwnPropertyDescriptor(all, name).get
9
+ });
10
+ }
11
+ _export(exports, {
12
+ get LocaleSwitch () {
13
+ return _LocaleSwitch.LocaleSwitch;
14
+ },
15
+ get ThemeSwitch () {
16
+ return _ThemeSwitch.ThemeSwitch;
17
+ }
18
+ });
19
+ const _ThemeSwitch = require("./ThemeSwitch");
20
+ const _LocaleSwitch = require("./LocaleSwitch");
5
21
 
6
22
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/index.ts"],"names":[],"mappings":""}
1
+ {"version":3,"sources":["../../src/components/index.ts"],"sourcesContent":["export { ThemeSwitch } from './ThemeSwitch';\nexport type { ThemeSwitchProps, ThemeSwitchRenderContext } from './ThemeSwitch';\n\nexport { LocaleSwitch } from './LocaleSwitch';\nexport type { LocaleSwitchProps, LocaleSwitchRenderContext } from './LocaleSwitch';\n\nexport type { PersistenceOptions, StorageLike } from './persistence';\n"],"names":["LocaleSwitch","ThemeSwitch"],"mappings":";;;;;;;;;;;QAGSA;eAAAA,0BAAY;;QAHZC;eAAAA,wBAAW;;;6BAAQ;8BAGC"}
@@ -1,2 +1,5 @@
1
- export {};
2
- //# sourceMappingURL=index.d.ts.map
1
+ export { ThemeSwitch } from './ThemeSwitch';
2
+ export type { ThemeSwitchProps, ThemeSwitchRenderContext } from './ThemeSwitch';
3
+ export { LocaleSwitch } from './LocaleSwitch';
4
+ export type { LocaleSwitchProps, LocaleSwitchRenderContext } from './LocaleSwitch';
5
+ export type { PersistenceOptions, StorageLike } from './persistence';
@@ -1,3 +1,4 @@
1
- export { };
1
+ export { ThemeSwitch } from "./ThemeSwitch";
2
+ export { LocaleSwitch } from "./LocaleSwitch";
2
3
 
3
4
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/index.ts"],"sourcesContent":["export {};"],"names":[],"mappings":"AAAA,WAAU"}
1
+ {"version":3,"sources":["../../src/components/index.ts"],"sourcesContent":["export { ThemeSwitch } from './ThemeSwitch';\nexport type { ThemeSwitchProps, ThemeSwitchRenderContext } from './ThemeSwitch';\n\nexport { LocaleSwitch } from './LocaleSwitch';\nexport type { LocaleSwitchProps, LocaleSwitchRenderContext } from './LocaleSwitch';\n\nexport type { PersistenceOptions, StorageLike } from './persistence';\n"],"names":["ThemeSwitch","LocaleSwitch"],"mappings":"AAAA,SAASA,WAAW,QAAQ,gBAAgB;AAG5C,SAASC,YAAY,QAAQ,iBAAiB"}
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ function _export(target, all) {
6
+ for(var name in all)Object.defineProperty(target, name, {
7
+ enumerable: true,
8
+ get: Object.getOwnPropertyDescriptor(all, name).get
9
+ });
10
+ }
11
+ _export(exports, {
12
+ get readPersistedValue () {
13
+ return readPersistedValue;
14
+ },
15
+ get resolveStorage () {
16
+ return resolveStorage;
17
+ },
18
+ get writePersistedValue () {
19
+ return writePersistedValue;
20
+ }
21
+ });
22
+ function resolveStorage(storage) {
23
+ if (storage) {
24
+ return storage;
25
+ }
26
+ if (typeof window === 'undefined' || !window.localStorage) {
27
+ return null;
28
+ }
29
+ return window.localStorage;
30
+ }
31
+ function readPersistedValue(options, defaultKey) {
32
+ if (options.enabled === false) {
33
+ return null;
34
+ }
35
+ const targetStorage = resolveStorage(options.storage);
36
+ if (!targetStorage) {
37
+ return null;
38
+ }
39
+ try {
40
+ return targetStorage.getItem(options.key || defaultKey);
41
+ } catch {
42
+ return null;
43
+ }
44
+ }
45
+ function writePersistedValue(value, options, defaultKey) {
46
+ if (options.enabled === false || !value) {
47
+ return;
48
+ }
49
+ const targetStorage = resolveStorage(options.storage);
50
+ if (!targetStorage) {
51
+ return;
52
+ }
53
+ try {
54
+ targetStorage.setItem(options.key || defaultKey, value);
55
+ } catch {
56
+ // Ignore storage write failures (private mode / quota / disabled storage).
57
+ }
58
+ }
59
+
60
+ //# sourceMappingURL=persistence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/persistence.ts"],"sourcesContent":["export interface StorageLike {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n}\n\nexport interface PersistenceOptions {\n enabled?: boolean;\n key?: string;\n storage?: StorageLike;\n}\n\nexport function resolveStorage(storage?: StorageLike): StorageLike | null {\n if (storage) {\n return storage;\n }\n\n if (typeof window === 'undefined' || !window.localStorage) {\n return null;\n }\n\n return window.localStorage;\n}\n\nexport function readPersistedValue(\n options: PersistenceOptions,\n defaultKey: string\n): string | null {\n if (options.enabled === false) {\n return null;\n }\n\n const targetStorage = resolveStorage(options.storage);\n if (!targetStorage) {\n return null;\n }\n\n try {\n return targetStorage.getItem(options.key || defaultKey);\n } catch {\n return null;\n }\n}\n\nexport function writePersistedValue(\n value: string | undefined,\n options: PersistenceOptions,\n defaultKey: string\n): void {\n if (options.enabled === false || !value) {\n return;\n }\n\n const targetStorage = resolveStorage(options.storage);\n if (!targetStorage) {\n return;\n }\n\n try {\n targetStorage.setItem(options.key || defaultKey, value);\n } catch {\n // Ignore storage write failures (private mode / quota / disabled storage).\n }\n}\n"],"names":["readPersistedValue","resolveStorage","writePersistedValue","storage","window","localStorage","options","defaultKey","enabled","targetStorage","getItem","key","value","setItem"],"mappings":";;;;;;;;;;;QAuBgBA;eAAAA;;QAZAC;eAAAA;;QAgCAC;eAAAA;;;AAhCT,SAASD,eAAeE,OAAqB;IAClD,IAAIA,SAAS;QACX,OAAOA;IACT;IAEA,IAAI,OAAOC,WAAW,eAAe,CAACA,OAAOC,YAAY,EAAE;QACzD,OAAO;IACT;IAEA,OAAOD,OAAOC,YAAY;AAC5B;AAEO,SAASL,mBACdM,OAA2B,EAC3BC,UAAkB;IAElB,IAAID,QAAQE,OAAO,KAAK,OAAO;QAC7B,OAAO;IACT;IAEA,MAAMC,gBAAgBR,eAAeK,QAAQH,OAAO;IACpD,IAAI,CAACM,eAAe;QAClB,OAAO;IACT;IAEA,IAAI;QACF,OAAOA,cAAcC,OAAO,CAACJ,QAAQK,GAAG,IAAIJ;IAC9C,EAAE,OAAM;QACN,OAAO;IACT;AACF;AAEO,SAASL,oBACdU,KAAyB,EACzBN,OAA2B,EAC3BC,UAAkB;IAElB,IAAID,QAAQE,OAAO,KAAK,SAAS,CAACI,OAAO;QACvC;IACF;IAEA,MAAMH,gBAAgBR,eAAeK,QAAQH,OAAO;IACpD,IAAI,CAACM,eAAe;QAClB;IACF;IAEA,IAAI;QACFA,cAAcI,OAAO,CAACP,QAAQK,GAAG,IAAIJ,YAAYK;IACnD,EAAE,OAAM;IACN,2EAA2E;IAC7E;AACF"}
@@ -0,0 +1,12 @@
1
+ export interface StorageLike {
2
+ getItem(key: string): string | null;
3
+ setItem(key: string, value: string): void;
4
+ }
5
+ export interface PersistenceOptions {
6
+ enabled?: boolean;
7
+ key?: string;
8
+ storage?: StorageLike;
9
+ }
10
+ export declare function resolveStorage(storage?: StorageLike): StorageLike | null;
11
+ export declare function readPersistedValue(options: PersistenceOptions, defaultKey: string): string | null;
12
+ export declare function writePersistedValue(value: string | undefined, options: PersistenceOptions, defaultKey: string): void;
@@ -0,0 +1,39 @@
1
+ export function resolveStorage(storage) {
2
+ if (storage) {
3
+ return storage;
4
+ }
5
+ if (typeof window === 'undefined' || !window.localStorage) {
6
+ return null;
7
+ }
8
+ return window.localStorage;
9
+ }
10
+ export function readPersistedValue(options, defaultKey) {
11
+ if (options.enabled === false) {
12
+ return null;
13
+ }
14
+ const targetStorage = resolveStorage(options.storage);
15
+ if (!targetStorage) {
16
+ return null;
17
+ }
18
+ try {
19
+ return targetStorage.getItem(options.key || defaultKey);
20
+ } catch {
21
+ return null;
22
+ }
23
+ }
24
+ export function writePersistedValue(value, options, defaultKey) {
25
+ if (options.enabled === false || !value) {
26
+ return;
27
+ }
28
+ const targetStorage = resolveStorage(options.storage);
29
+ if (!targetStorage) {
30
+ return;
31
+ }
32
+ try {
33
+ targetStorage.setItem(options.key || defaultKey, value);
34
+ } catch {
35
+ // Ignore storage write failures (private mode / quota / disabled storage).
36
+ }
37
+ }
38
+
39
+ //# sourceMappingURL=persistence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/persistence.ts"],"sourcesContent":["export interface StorageLike {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n}\n\nexport interface PersistenceOptions {\n enabled?: boolean;\n key?: string;\n storage?: StorageLike;\n}\n\nexport function resolveStorage(storage?: StorageLike): StorageLike | null {\n if (storage) {\n return storage;\n }\n\n if (typeof window === 'undefined' || !window.localStorage) {\n return null;\n }\n\n return window.localStorage;\n}\n\nexport function readPersistedValue(\n options: PersistenceOptions,\n defaultKey: string\n): string | null {\n if (options.enabled === false) {\n return null;\n }\n\n const targetStorage = resolveStorage(options.storage);\n if (!targetStorage) {\n return null;\n }\n\n try {\n return targetStorage.getItem(options.key || defaultKey);\n } catch {\n return null;\n }\n}\n\nexport function writePersistedValue(\n value: string | undefined,\n options: PersistenceOptions,\n defaultKey: string\n): void {\n if (options.enabled === false || !value) {\n return;\n }\n\n const targetStorage = resolveStorage(options.storage);\n if (!targetStorage) {\n return;\n }\n\n try {\n targetStorage.setItem(options.key || defaultKey, value);\n } catch {\n // Ignore storage write failures (private mode / quota / disabled storage).\n }\n}\n"],"names":["resolveStorage","storage","window","localStorage","readPersistedValue","options","defaultKey","enabled","targetStorage","getItem","key","writePersistedValue","value","setItem"],"mappings":"AAWA,OAAO,SAASA,eAAeC,OAAqB;IAClD,IAAIA,SAAS;QACX,OAAOA;IACT;IAEA,IAAI,OAAOC,WAAW,eAAe,CAACA,OAAOC,YAAY,EAAE;QACzD,OAAO;IACT;IAEA,OAAOD,OAAOC,YAAY;AAC5B;AAEA,OAAO,SAASC,mBACdC,OAA2B,EAC3BC,UAAkB;IAElB,IAAID,QAAQE,OAAO,KAAK,OAAO;QAC7B,OAAO;IACT;IAEA,MAAMC,gBAAgBR,eAAeK,QAAQJ,OAAO;IACpD,IAAI,CAACO,eAAe;QAClB,OAAO;IACT;IAEA,IAAI;QACF,OAAOA,cAAcC,OAAO,CAACJ,QAAQK,GAAG,IAAIJ;IAC9C,EAAE,OAAM;QACN,OAAO;IACT;AACF;AAEA,OAAO,SAASK,oBACdC,KAAyB,EACzBP,OAA2B,EAC3BC,UAAkB;IAElB,IAAID,QAAQE,OAAO,KAAK,SAAS,CAACK,OAAO;QACvC;IACF;IAEA,MAAMJ,gBAAgBR,eAAeK,QAAQJ,OAAO;IACpD,IAAI,CAACO,eAAe;QAClB;IACF;IAEA,IAAI;QACFA,cAAcK,OAAO,CAACR,QAAQK,GAAG,IAAIJ,YAAYM;IACnD,EAAE,OAAM;IACN,2EAA2E;IAC7E;AACF"}
@@ -3,4 +3,3 @@ declare const App: React.FC<{
3
3
  onComplete: () => void;
4
4
  }>;
5
5
  export default App;
6
- //# sourceMappingURL=Test.d.ts.map