@legendapp/spark 0.0.1-next.2

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 (669) hide show
  1. package/README.md +21 -0
  2. package/app.ts +1 -0
  3. package/audio.ts +1 -0
  4. package/auth-session.ts +1 -0
  5. package/bin/spark.cjs +5 -0
  6. package/clipboard.ts +1 -0
  7. package/config-plugin.cjs +1 -0
  8. package/config.cjs +1 -0
  9. package/config.d.cts +1 -0
  10. package/context-menu.ts +1 -0
  11. package/dialogs.ts +2 -0
  12. package/drag-drop.ts +1 -0
  13. package/expo-config.cjs +1 -0
  14. package/expo-metro.cjs +1 -0
  15. package/files.ts +1 -0
  16. package/global-shortcuts.ts +1 -0
  17. package/init-template.cjs +2 -0
  18. package/links.ts +1 -0
  19. package/menus.ts +1 -0
  20. package/message-dialog.ts +1 -0
  21. package/metro-gate.cjs +1 -0
  22. package/metro.cjs +1 -0
  23. package/native.cjs +1 -0
  24. package/notifications.ts +1 -0
  25. package/package.json +161 -0
  26. package/processes.ts +1 -0
  27. package/runtime-entry.cjs +1 -0
  28. package/schema.json +305 -0
  29. package/secure-storage.ts +1 -0
  30. package/settings.ts +1 -0
  31. package/shortcuts.ts +1 -0
  32. package/sqlite.ts +1 -0
  33. package/system.ts +1 -0
  34. package/tray.ts +1 -0
  35. package/ui-uniwind.ts +1 -0
  36. package/ui.ts +1 -0
  37. package/universal.cjs +1 -0
  38. package/updates.ts +1 -0
  39. package/vendor/node_modules/@legendapp/spark-audio/RNSparkAudio.podspec +18 -0
  40. package/vendor/node_modules/@legendapp/spark-audio/macos/RNSparkAudio.h +4 -0
  41. package/vendor/node_modules/@legendapp/spark-audio/macos/RNSparkAudio.mm +154 -0
  42. package/vendor/node_modules/@legendapp/spark-audio/package.json +49 -0
  43. package/vendor/node_modules/@legendapp/spark-audio/src/NativeSparkAudio.ts +3 -0
  44. package/vendor/node_modules/@legendapp/spark-audio/src/desktop.ts +39 -0
  45. package/vendor/node_modules/@legendapp/spark-audio/src/index.android.ts +1 -0
  46. package/vendor/node_modules/@legendapp/spark-audio/src/index.ios.ts +1 -0
  47. package/vendor/node_modules/@legendapp/spark-audio/src/index.ts +1 -0
  48. package/vendor/node_modules/@legendapp/spark-audio/src/index.web.ts +42 -0
  49. package/vendor/node_modules/@legendapp/spark-audio/src/index.windows.ts +1 -0
  50. package/vendor/node_modules/@legendapp/spark-audio/src/media-session-unavailable.ts +5 -0
  51. package/vendor/node_modules/@legendapp/spark-audio/src/media-session.ts +25 -0
  52. package/vendor/node_modules/@legendapp/spark-audio/src/media-session.web.ts +35 -0
  53. package/vendor/node_modules/@legendapp/spark-audio/src/media-types.ts +32 -0
  54. package/vendor/node_modules/@legendapp/spark-audio/src/mobile.ts +38 -0
  55. package/vendor/node_modules/@legendapp/spark-audio/src/status-listeners.ts +22 -0
  56. package/vendor/node_modules/@legendapp/spark-audio/src/types.ts +21 -0
  57. package/vendor/node_modules/@legendapp/spark-audio/windows/ExperimentalFeatures.props +33 -0
  58. package/vendor/node_modules/@legendapp/spark-audio/windows/LICENSE +25 -0
  59. package/vendor/node_modules/@legendapp/spark-audio/windows/SparkAudio/ReactPackageProvider.cpp +20 -0
  60. package/vendor/node_modules/@legendapp/spark-audio/windows/SparkAudio/ReactPackageProvider.h +24 -0
  61. package/vendor/node_modules/@legendapp/spark-audio/windows/SparkAudio/ReactPackageProvider.idl +9 -0
  62. package/vendor/node_modules/@legendapp/spark-audio/windows/SparkAudio/SparkAudio.cpp +2 -0
  63. package/vendor/node_modules/@legendapp/spark-audio/windows/SparkAudio/SparkAudio.def +3 -0
  64. package/vendor/node_modules/@legendapp/spark-audio/windows/SparkAudio/SparkAudio.h +146 -0
  65. package/vendor/node_modules/@legendapp/spark-audio/windows/SparkAudio/SparkAudio.rc +0 -0
  66. package/vendor/node_modules/@legendapp/spark-audio/windows/SparkAudio/SparkAudio.vcxproj +143 -0
  67. package/vendor/node_modules/@legendapp/spark-audio/windows/SparkAudio/SparkAudio.vcxproj.filters +44 -0
  68. package/vendor/node_modules/@legendapp/spark-audio/windows/SparkAudio/pch.cpp +1 -0
  69. package/vendor/node_modules/@legendapp/spark-audio/windows/SparkAudio/pch.h +30 -0
  70. package/vendor/node_modules/@legendapp/spark-audio/windows/SparkAudio/resource.h +5 -0
  71. package/vendor/node_modules/@legendapp/spark-audio/windows/SparkAudio/targetver.h +8 -0
  72. package/vendor/node_modules/@legendapp/spark-audio/windows/SparkAudio.sln +43 -0
  73. package/vendor/node_modules/@legendapp/spark-auth-session/package.json +41 -0
  74. package/vendor/node_modules/@legendapp/spark-auth-session/src/core.ts +68 -0
  75. package/vendor/node_modules/@legendapp/spark-auth-session/src/index.android.ts +1 -0
  76. package/vendor/node_modules/@legendapp/spark-auth-session/src/index.ios.ts +1 -0
  77. package/vendor/node_modules/@legendapp/spark-auth-session/src/index.ts +22 -0
  78. package/vendor/node_modules/@legendapp/spark-auth-session/src/index.web.ts +1 -0
  79. package/vendor/node_modules/@legendapp/spark-auth-session/src/mobile.ts +52 -0
  80. package/vendor/node_modules/@legendapp/spark-auth-session/src/types.ts +38 -0
  81. package/vendor/node_modules/@legendapp/spark-cli/dist/add-desktop.js +164 -0
  82. package/vendor/node_modules/@legendapp/spark-cli/dist/build-mode.js +7 -0
  83. package/vendor/node_modules/@legendapp/spark-cli/dist/build.js +278 -0
  84. package/vendor/node_modules/@legendapp/spark-cli/dist/commands.js +107 -0
  85. package/vendor/node_modules/@legendapp/spark-cli/dist/create.js +99 -0
  86. package/vendor/node_modules/@legendapp/spark-cli/dist/credentials.js +69 -0
  87. package/vendor/node_modules/@legendapp/spark-cli/dist/dev-command.js +81 -0
  88. package/vendor/node_modules/@legendapp/spark-cli/dist/dev.js +408 -0
  89. package/vendor/node_modules/@legendapp/spark-cli/dist/examples.js +43 -0
  90. package/vendor/node_modules/@legendapp/spark-cli/dist/executable.js +19 -0
  91. package/vendor/node_modules/@legendapp/spark-cli/dist/expo-dev-extension.cjs +51 -0
  92. package/vendor/node_modules/@legendapp/spark-cli/dist/expo-dev-patch.cjs +38 -0
  93. package/vendor/node_modules/@legendapp/spark-cli/dist/expo-dev-preload.cjs +19 -0
  94. package/vendor/node_modules/@legendapp/spark-cli/dist/expo-metro.cjs +41 -0
  95. package/vendor/node_modules/@legendapp/spark-cli/dist/expo-native.cjs +10 -0
  96. package/vendor/node_modules/@legendapp/spark-cli/dist/expo-node.js +21 -0
  97. package/vendor/node_modules/@legendapp/spark-cli/dist/go-profile.js +20 -0
  98. package/vendor/node_modules/@legendapp/spark-cli/dist/helpers.js +79 -0
  99. package/vendor/node_modules/@legendapp/spark-cli/dist/index.js +263 -0
  100. package/vendor/node_modules/@legendapp/spark-cli/dist/init-template.cjs +25 -0
  101. package/vendor/node_modules/@legendapp/spark-cli/dist/local.js +124 -0
  102. package/vendor/node_modules/@legendapp/spark-cli/dist/macos-release.js +7 -0
  103. package/vendor/node_modules/@legendapp/spark-cli/dist/metro-gate.cjs +33 -0
  104. package/vendor/node_modules/@legendapp/spark-cli/dist/metro.cjs +63 -0
  105. package/vendor/node_modules/@legendapp/spark-cli/dist/metro.js +25 -0
  106. package/vendor/node_modules/@legendapp/spark-cli/dist/npm-bin/npm +6 -0
  107. package/vendor/node_modules/@legendapp/spark-cli/dist/npm-bin/npm.cmd +1 -0
  108. package/vendor/node_modules/@legendapp/spark-cli/dist/pack-archive.js +23 -0
  109. package/vendor/node_modules/@legendapp/spark-cli/dist/package-manager.js +45 -0
  110. package/vendor/node_modules/@legendapp/spark-cli/dist/package.js +199 -0
  111. package/vendor/node_modules/@legendapp/spark-cli/dist/platform.js +34 -0
  112. package/vendor/node_modules/@legendapp/spark-cli/dist/process.js +57 -0
  113. package/vendor/node_modules/@legendapp/spark-cli/dist/project.js +324 -0
  114. package/vendor/node_modules/@legendapp/spark-cli/dist/release.js +42 -0
  115. package/vendor/node_modules/@legendapp/spark-cli/dist/release.json +37 -0
  116. package/vendor/node_modules/@legendapp/spark-cli/dist/runner-install.js +138 -0
  117. package/vendor/node_modules/@legendapp/spark-cli/dist/runtime-entry.cjs +1 -0
  118. package/vendor/node_modules/@legendapp/spark-cli/dist/sdk-install.js +66 -0
  119. package/vendor/node_modules/@legendapp/spark-cli/dist/sdk-transfer.js +113 -0
  120. package/vendor/node_modules/@legendapp/spark-cli/dist/session-status.js +22 -0
  121. package/vendor/node_modules/@legendapp/spark-cli/dist/signing.js +175 -0
  122. package/vendor/node_modules/@legendapp/spark-cli/dist/universal.cjs +28 -0
  123. package/vendor/node_modules/@legendapp/spark-cli/dist/updates.js +110 -0
  124. package/vendor/node_modules/@legendapp/spark-cli/dist/windows-associations.js +45 -0
  125. package/vendor/node_modules/@legendapp/spark-cli/dist/windows-associations.ps1 +57 -0
  126. package/vendor/node_modules/@legendapp/spark-cli/dist/windows-geometry.js +33 -0
  127. package/vendor/node_modules/@legendapp/spark-cli/dist/windows-metro.js +112 -0
  128. package/vendor/node_modules/@legendapp/spark-cli/dist/windows.js +141 -0
  129. package/vendor/node_modules/@legendapp/spark-cli/package.json +22 -0
  130. package/vendor/node_modules/@legendapp/spark-cli/templates/blank-typescript/App.tsx +29 -0
  131. package/vendor/node_modules/@legendapp/spark-cli/templates/blank-typescript/app.json +11 -0
  132. package/vendor/node_modules/@legendapp/spark-cli/templates/blank-typescript/assets/icon.png +0 -0
  133. package/vendor/node_modules/@legendapp/spark-cli/templates/blank-typescript/desktop.config.json +19 -0
  134. package/vendor/node_modules/@legendapp/spark-cli/templates/blank-typescript/gitignore +8 -0
  135. package/vendor/node_modules/@legendapp/spark-cli/templates/blank-typescript/index.ts +5 -0
  136. package/vendor/node_modules/@legendapp/spark-cli/templates/blank-typescript/metro.config.js +3 -0
  137. package/vendor/node_modules/@legendapp/spark-cli/templates/blank-typescript/package.json +55 -0
  138. package/vendor/node_modules/@legendapp/spark-cli/templates/blank-typescript/tsconfig.json +10 -0
  139. package/vendor/node_modules/@legendapp/spark-cli/templates/diff-lite/App.tsx +34 -0
  140. package/vendor/node_modules/@legendapp/spark-cli/templates/diff-lite/Git.macos.tsx +13 -0
  141. package/vendor/node_modules/@legendapp/spark-cli/templates/diff-lite/Git.tsx +1 -0
  142. package/vendor/node_modules/@legendapp/spark-cli/templates/diff-lite/compare.ts +12 -0
  143. package/vendor/node_modules/@legendapp/spark-cli/templates/document-editor/App.tsx +34 -0
  144. package/vendor/node_modules/@legendapp/spark-cli/templates/document-editor/Integration.macos.tsx +57 -0
  145. package/vendor/node_modules/@legendapp/spark-cli/templates/document-editor/Integration.tsx +13 -0
  146. package/vendor/node_modules/@legendapp/spark-cli/templates/document-editor/Integration.web.tsx +14 -0
  147. package/vendor/node_modules/@legendapp/spark-cli/templates/document-editor/Integration.windows.tsx +57 -0
  148. package/vendor/node_modules/@legendapp/spark-cli/templates/document-editor/document.ts +58 -0
  149. package/vendor/node_modules/@legendapp/spark-cli/templates/document-editor/io.desktop.ts +24 -0
  150. package/vendor/node_modules/@legendapp/spark-cli/templates/document-editor/io.macos.ts +7 -0
  151. package/vendor/node_modules/@legendapp/spark-cli/templates/document-editor/io.ts +31 -0
  152. package/vendor/node_modules/@legendapp/spark-cli/templates/document-editor/io.web.ts +21 -0
  153. package/vendor/node_modules/@legendapp/spark-cli/templates/document-editor/io.windows.ts +1 -0
  154. package/vendor/node_modules/@legendapp/spark-cli/templates/document-editor/sessions.ts +8 -0
  155. package/vendor/node_modules/@legendapp/spark-cli/templates/document-editor/useDocument.ts +6 -0
  156. package/vendor/node_modules/@legendapp/spark-cli/templates/example-shared/Lifecycle.desktop.tsx +31 -0
  157. package/vendor/node_modules/@legendapp/spark-cli/templates/example-shared/Lifecycle.macos.tsx +1 -0
  158. package/vendor/node_modules/@legendapp/spark-cli/templates/example-shared/Lifecycle.tsx +14 -0
  159. package/vendor/node_modules/@legendapp/spark-cli/templates/example-shared/Lifecycle.web.tsx +20 -0
  160. package/vendor/node_modules/@legendapp/spark-cli/templates/example-shared/Lifecycle.windows.tsx +1 -0
  161. package/vendor/node_modules/@legendapp/spark-cli/templates/example-shared/OpenFiles.desktop.tsx +28 -0
  162. package/vendor/node_modules/@legendapp/spark-cli/templates/example-shared/OpenFiles.macos.tsx +1 -0
  163. package/vendor/node_modules/@legendapp/spark-cli/templates/example-shared/OpenFiles.tsx +2 -0
  164. package/vendor/node_modules/@legendapp/spark-cli/templates/example-shared/OpenFiles.windows.tsx +1 -0
  165. package/vendor/node_modules/@legendapp/spark-cli/templates/example-shared/document.ts +58 -0
  166. package/vendor/node_modules/@legendapp/spark-cli/templates/example-shared/io.desktop.ts +24 -0
  167. package/vendor/node_modules/@legendapp/spark-cli/templates/example-shared/io.macos.ts +7 -0
  168. package/vendor/node_modules/@legendapp/spark-cli/templates/example-shared/io.ts +31 -0
  169. package/vendor/node_modules/@legendapp/spark-cli/templates/example-shared/io.web.ts +21 -0
  170. package/vendor/node_modules/@legendapp/spark-cli/templates/example-shared/io.windows.ts +1 -0
  171. package/vendor/node_modules/@legendapp/spark-cli/templates/example-shared/lifecycle-types.ts +10 -0
  172. package/vendor/node_modules/@legendapp/spark-cli/templates/example-shared/lifetime.ts +23 -0
  173. package/vendor/node_modules/@legendapp/spark-cli/templates/example-shared/records.ts +51 -0
  174. package/vendor/node_modules/@legendapp/spark-cli/templates/example-shared/storage.ts +6 -0
  175. package/vendor/node_modules/@legendapp/spark-cli/templates/example-shared/useModel.ts +6 -0
  176. package/vendor/node_modules/@legendapp/spark-cli/templates/music-lite/Activation.desktop.tsx +4 -0
  177. package/vendor/node_modules/@legendapp/spark-cli/templates/music-lite/Activation.macos.tsx +1 -0
  178. package/vendor/node_modules/@legendapp/spark-cli/templates/music-lite/Activation.tsx +1 -0
  179. package/vendor/node_modules/@legendapp/spark-cli/templates/music-lite/Activation.windows.tsx +1 -0
  180. package/vendor/node_modules/@legendapp/spark-cli/templates/music-lite/App.tsx +38 -0
  181. package/vendor/node_modules/@legendapp/spark-cli/templates/music-lite/assets.desktop.ts +7 -0
  182. package/vendor/node_modules/@legendapp/spark-cli/templates/music-lite/assets.macos.ts +1 -0
  183. package/vendor/node_modules/@legendapp/spark-cli/templates/music-lite/assets.ts +18 -0
  184. package/vendor/node_modules/@legendapp/spark-cli/templates/music-lite/assets.web.ts +37 -0
  185. package/vendor/node_modules/@legendapp/spark-cli/templates/music-lite/assets.windows.ts +1 -0
  186. package/vendor/node_modules/@legendapp/spark-cli/templates/music-lite/model.ts +91 -0
  187. package/vendor/node_modules/@legendapp/spark-cli/templates/music-lite/store.ts +10 -0
  188. package/vendor/node_modules/@legendapp/spark-cli/templates/notes-lite/Activation.desktop.tsx +5 -0
  189. package/vendor/node_modules/@legendapp/spark-cli/templates/notes-lite/Activation.macos.tsx +1 -0
  190. package/vendor/node_modules/@legendapp/spark-cli/templates/notes-lite/Activation.tsx +1 -0
  191. package/vendor/node_modules/@legendapp/spark-cli/templates/notes-lite/Activation.windows.tsx +1 -0
  192. package/vendor/node_modules/@legendapp/spark-cli/templates/notes-lite/App.tsx +92 -0
  193. package/vendor/node_modules/@legendapp/spark-cli/templates/notes-lite/Desktop.desktop.ts +25 -0
  194. package/vendor/node_modules/@legendapp/spark-cli/templates/notes-lite/Desktop.macos.ts +1 -0
  195. package/vendor/node_modules/@legendapp/spark-cli/templates/notes-lite/Desktop.ts +7 -0
  196. package/vendor/node_modules/@legendapp/spark-cli/templates/notes-lite/Desktop.windows.ts +1 -0
  197. package/vendor/node_modules/@legendapp/spark-cli/templates/notes-lite/Theme.tsx +17 -0
  198. package/vendor/node_modules/@legendapp/spark-cli/templates/notes-lite/model.ts +61 -0
  199. package/vendor/node_modules/@legendapp/spark-cli/templates/notes-lite/search.ts +3 -0
  200. package/vendor/node_modules/@legendapp/spark-cli/templates/notes-lite/session.ts +16 -0
  201. package/vendor/node_modules/@legendapp/spark-cli/templates/notes-lite/store.ts +4 -0
  202. package/vendor/node_modules/@legendapp/spark-cli/templates/notes-lite/window-session.ts +62 -0
  203. package/vendor/node_modules/@legendapp/spark-cli/templates/universal/App.tsx +57 -0
  204. package/vendor/node_modules/@legendapp/spark-cli/templates/universal/app.json +15 -0
  205. package/vendor/node_modules/@legendapp/spark-cli/templates/universal/assets/icon.png +0 -0
  206. package/vendor/node_modules/@legendapp/spark-cli/templates/universal/desktop.config.json +62 -0
  207. package/vendor/node_modules/@legendapp/spark-cli/templates/universal/gitignore +10 -0
  208. package/vendor/node_modules/@legendapp/spark-cli/templates/universal/global.css +31 -0
  209. package/vendor/node_modules/@legendapp/spark-cli/templates/universal/index.ts +4 -0
  210. package/vendor/node_modules/@legendapp/spark-cli/templates/universal/metro.config.js +7 -0
  211. package/vendor/node_modules/@legendapp/spark-cli/templates/universal/package.json +70 -0
  212. package/vendor/node_modules/@legendapp/spark-cli/templates/universal/react-native.config.js +2 -0
  213. package/vendor/node_modules/@legendapp/spark-cli/templates/universal/tsconfig.json +10 -0
  214. package/vendor/node_modules/@legendapp/spark-cli/templates/universal/uniwind-types.d.ts +10 -0
  215. package/vendor/node_modules/@legendapp/spark-cli/templates/windows/App.tsx +16 -0
  216. package/vendor/node_modules/@legendapp/spark-cli/templates/windows/app.json +11 -0
  217. package/vendor/node_modules/@legendapp/spark-cli/templates/windows/assets/icon.png +0 -0
  218. package/vendor/node_modules/@legendapp/spark-cli/templates/windows/desktop.config.json +10 -0
  219. package/vendor/node_modules/@legendapp/spark-cli/templates/windows/gitignore +8 -0
  220. package/vendor/node_modules/@legendapp/spark-cli/templates/windows/index.ts +3 -0
  221. package/vendor/node_modules/@legendapp/spark-cli/templates/windows/metro.config.js +3 -0
  222. package/vendor/node_modules/@legendapp/spark-cli/templates/windows/package.json +56 -0
  223. package/vendor/node_modules/@legendapp/spark-cli/templates/windows/react-native.config.js +2 -0
  224. package/vendor/node_modules/@legendapp/spark-cli/templates/windows/tsconfig.json +10 -0
  225. package/vendor/node_modules/@legendapp/spark-clipboard/RNDesktopClipboard.podspec +16 -0
  226. package/vendor/node_modules/@legendapp/spark-clipboard/macos/RNDesktopClipboard.h +4 -0
  227. package/vendor/node_modules/@legendapp/spark-clipboard/macos/RNDesktopClipboard.mm +87 -0
  228. package/vendor/node_modules/@legendapp/spark-clipboard/package.json +52 -0
  229. package/vendor/node_modules/@legendapp/spark-clipboard/react-native.config.js +6 -0
  230. package/vendor/node_modules/@legendapp/spark-clipboard/src/NativeDesktopClipboard.ts +6 -0
  231. package/vendor/node_modules/@legendapp/spark-clipboard/src/desktop.ts +39 -0
  232. package/vendor/node_modules/@legendapp/spark-clipboard/src/expo.ts +12 -0
  233. package/vendor/node_modules/@legendapp/spark-clipboard/src/formats.ts +1 -0
  234. package/vendor/node_modules/@legendapp/spark-clipboard/src/index.android.ts +1 -0
  235. package/vendor/node_modules/@legendapp/spark-clipboard/src/index.ios.ts +1 -0
  236. package/vendor/node_modules/@legendapp/spark-clipboard/src/index.ts +1 -0
  237. package/vendor/node_modules/@legendapp/spark-clipboard/src/index.web.ts +1 -0
  238. package/vendor/node_modules/@legendapp/spark-clipboard/src/index.windows.ts +1 -0
  239. package/vendor/node_modules/@legendapp/spark-clipboard/windows/ExperimentalFeatures.props +33 -0
  240. package/vendor/node_modules/@legendapp/spark-clipboard/windows/LICENSE +25 -0
  241. package/vendor/node_modules/@legendapp/spark-clipboard/windows/SparkClipboard/ReactPackageProvider.cpp +20 -0
  242. package/vendor/node_modules/@legendapp/spark-clipboard/windows/SparkClipboard/ReactPackageProvider.h +24 -0
  243. package/vendor/node_modules/@legendapp/spark-clipboard/windows/SparkClipboard/ReactPackageProvider.idl +9 -0
  244. package/vendor/node_modules/@legendapp/spark-clipboard/windows/SparkClipboard/SparkClipboard.cpp +2 -0
  245. package/vendor/node_modules/@legendapp/spark-clipboard/windows/SparkClipboard/SparkClipboard.def +3 -0
  246. package/vendor/node_modules/@legendapp/spark-clipboard/windows/SparkClipboard/SparkClipboard.h +119 -0
  247. package/vendor/node_modules/@legendapp/spark-clipboard/windows/SparkClipboard/SparkClipboard.rc +0 -0
  248. package/vendor/node_modules/@legendapp/spark-clipboard/windows/SparkClipboard/SparkClipboard.vcxproj +143 -0
  249. package/vendor/node_modules/@legendapp/spark-clipboard/windows/SparkClipboard/SparkClipboard.vcxproj.filters +44 -0
  250. package/vendor/node_modules/@legendapp/spark-clipboard/windows/SparkClipboard/pch.cpp +1 -0
  251. package/vendor/node_modules/@legendapp/spark-clipboard/windows/SparkClipboard/pch.h +30 -0
  252. package/vendor/node_modules/@legendapp/spark-clipboard/windows/SparkClipboard/resource.h +5 -0
  253. package/vendor/node_modules/@legendapp/spark-clipboard/windows/SparkClipboard/targetver.h +8 -0
  254. package/vendor/node_modules/@legendapp/spark-clipboard/windows/SparkClipboard.sln +43 -0
  255. package/vendor/node_modules/@legendapp/spark-context-menu/RNContextMenu.podspec +16 -0
  256. package/vendor/node_modules/@legendapp/spark-context-menu/macos/RNContextMenu.h +9 -0
  257. package/vendor/node_modules/@legendapp/spark-context-menu/macos/RNContextMenu.mm +160 -0
  258. package/vendor/node_modules/@legendapp/spark-context-menu/package.json +46 -0
  259. package/vendor/node_modules/@legendapp/spark-context-menu/react-native.config.js +6 -0
  260. package/vendor/node_modules/@legendapp/spark-context-menu/src/NativeContextMenu.ts +8 -0
  261. package/vendor/node_modules/@legendapp/spark-context-menu/src/index.ts +29 -0
  262. package/vendor/node_modules/@legendapp/spark-context-menu/windows/ExperimentalFeatures.props +33 -0
  263. package/vendor/node_modules/@legendapp/spark-context-menu/windows/LICENSE +25 -0
  264. package/vendor/node_modules/@legendapp/spark-context-menu/windows/SparkContextMenu/ReactPackageProvider.cpp +20 -0
  265. package/vendor/node_modules/@legendapp/spark-context-menu/windows/SparkContextMenu/ReactPackageProvider.h +24 -0
  266. package/vendor/node_modules/@legendapp/spark-context-menu/windows/SparkContextMenu/ReactPackageProvider.idl +9 -0
  267. package/vendor/node_modules/@legendapp/spark-context-menu/windows/SparkContextMenu/SparkContextMenu.cpp +2 -0
  268. package/vendor/node_modules/@legendapp/spark-context-menu/windows/SparkContextMenu/SparkContextMenu.def +3 -0
  269. package/vendor/node_modules/@legendapp/spark-context-menu/windows/SparkContextMenu/SparkContextMenu.h +112 -0
  270. package/vendor/node_modules/@legendapp/spark-context-menu/windows/SparkContextMenu/SparkContextMenu.rc +0 -0
  271. package/vendor/node_modules/@legendapp/spark-context-menu/windows/SparkContextMenu/SparkContextMenu.vcxproj +143 -0
  272. package/vendor/node_modules/@legendapp/spark-context-menu/windows/SparkContextMenu/SparkContextMenu.vcxproj.filters +44 -0
  273. package/vendor/node_modules/@legendapp/spark-context-menu/windows/SparkContextMenu/pch.cpp +1 -0
  274. package/vendor/node_modules/@legendapp/spark-context-menu/windows/SparkContextMenu/pch.h +30 -0
  275. package/vendor/node_modules/@legendapp/spark-context-menu/windows/SparkContextMenu/resource.h +5 -0
  276. package/vendor/node_modules/@legendapp/spark-context-menu/windows/SparkContextMenu/targetver.h +8 -0
  277. package/vendor/node_modules/@legendapp/spark-context-menu/windows/SparkContextMenu.sln +43 -0
  278. package/vendor/node_modules/@legendapp/spark-desktop-app/RNDesktopApp.podspec +15 -0
  279. package/vendor/node_modules/@legendapp/spark-desktop-app/macos/RNDesktopApp.h +4 -0
  280. package/vendor/node_modules/@legendapp/spark-desktop-app/macos/RNDesktopApp.mm +34 -0
  281. package/vendor/node_modules/@legendapp/spark-desktop-app/macos/SparkDesktop.h +23 -0
  282. package/vendor/node_modules/@legendapp/spark-desktop-app/macos/SparkDesktop.mm +135 -0
  283. package/vendor/node_modules/@legendapp/spark-desktop-app/macos/SparkWindow.mm +81 -0
  284. package/vendor/node_modules/@legendapp/spark-desktop-app/package.json +39 -0
  285. package/vendor/node_modules/@legendapp/spark-desktop-app/react-native.config.js +6 -0
  286. package/vendor/node_modules/@legendapp/spark-desktop-app/src/NativeDesktopApp.ts +8 -0
  287. package/vendor/node_modules/@legendapp/spark-desktop-app/src/api.ts +42 -0
  288. package/vendor/node_modules/@legendapp/spark-desktop-app/src/index.ts +1 -0
  289. package/vendor/node_modules/@legendapp/spark-desktop-app/src/index.windows.ts +1 -0
  290. package/vendor/node_modules/@legendapp/spark-desktop-config/app.plugin.cjs +75 -0
  291. package/vendor/node_modules/@legendapp/spark-desktop-config/config.cjs +161 -0
  292. package/vendor/node_modules/@legendapp/spark-desktop-config/config.d.cts +13 -0
  293. package/vendor/node_modules/@legendapp/spark-desktop-config/entitlements.cjs +23 -0
  294. package/vendor/node_modules/@legendapp/spark-desktop-config/expo.cjs +26 -0
  295. package/vendor/node_modules/@legendapp/spark-desktop-config/fabric-lifecycle.cjs +125 -0
  296. package/vendor/node_modules/@legendapp/spark-desktop-config/helpers.cjs +20 -0
  297. package/vendor/node_modules/@legendapp/spark-desktop-config/identity.cjs +28 -0
  298. package/vendor/node_modules/@legendapp/spark-desktop-config/keyboard-events.cjs +44 -0
  299. package/vendor/node_modules/@legendapp/spark-desktop-config/package.json +19 -0
  300. package/vendor/node_modules/@legendapp/spark-desktop-config/schema.json +305 -0
  301. package/vendor/node_modules/@legendapp/spark-desktop-config/updates.cjs +24 -0
  302. package/vendor/node_modules/@legendapp/spark-desktop-config/windows.plugin.cjs +72 -0
  303. package/vendor/node_modules/@legendapp/spark-desktop-host/AppDelegate.mm +79 -0
  304. package/vendor/node_modules/@legendapp/spark-desktop-host/package.json +13 -0
  305. package/vendor/node_modules/@legendapp/spark-desktop-host/windows/SparkComponentGeometry.h +9 -0
  306. package/vendor/node_modules/@legendapp/spark-desktop-host/windows/application.inc +647 -0
  307. package/vendor/node_modules/@legendapp/spark-desktop-host/windows/notifications.inc +60 -0
  308. package/vendor/node_modules/@legendapp/spark-desktop-host/windows/runtime.inc +63 -0
  309. package/vendor/node_modules/@legendapp/spark-desktop-host/windows/runtimes.inc +162 -0
  310. package/vendor/node_modules/@legendapp/spark-desktop-links/RNDesktopLinks.podspec +17 -0
  311. package/vendor/node_modules/@legendapp/spark-desktop-links/common/AuthLoopback.h +121 -0
  312. package/vendor/node_modules/@legendapp/spark-desktop-links/macos/RNDesktopLinks.h +4 -0
  313. package/vendor/node_modules/@legendapp/spark-desktop-links/macos/RNDesktopLinks.mm +79 -0
  314. package/vendor/node_modules/@legendapp/spark-desktop-links/package.json +53 -0
  315. package/vendor/node_modules/@legendapp/spark-desktop-links/react-native.config.js +6 -0
  316. package/vendor/node_modules/@legendapp/spark-desktop-links/src/NativeDesktopLinks.ts +6 -0
  317. package/vendor/node_modules/@legendapp/spark-desktop-links/src/api.ts +37 -0
  318. package/vendor/node_modules/@legendapp/spark-desktop-links/src/expo.ts +5 -0
  319. package/vendor/node_modules/@legendapp/spark-desktop-links/src/index.android.ts +1 -0
  320. package/vendor/node_modules/@legendapp/spark-desktop-links/src/index.ios.ts +1 -0
  321. package/vendor/node_modules/@legendapp/spark-desktop-links/src/index.ts +1 -0
  322. package/vendor/node_modules/@legendapp/spark-desktop-links/src/index.web.ts +1 -0
  323. package/vendor/node_modules/@legendapp/spark-desktop-links/src/index.windows.ts +1 -0
  324. package/vendor/node_modules/@legendapp/spark-desktop-links/windows/ExperimentalFeatures.props +33 -0
  325. package/vendor/node_modules/@legendapp/spark-desktop-links/windows/LICENSE +25 -0
  326. package/vendor/node_modules/@legendapp/spark-desktop-links/windows/SparkLinks/ReactPackageProvider.cpp +20 -0
  327. package/vendor/node_modules/@legendapp/spark-desktop-links/windows/SparkLinks/ReactPackageProvider.h +24 -0
  328. package/vendor/node_modules/@legendapp/spark-desktop-links/windows/SparkLinks/ReactPackageProvider.idl +9 -0
  329. package/vendor/node_modules/@legendapp/spark-desktop-links/windows/SparkLinks/SparkLinks.cpp +2 -0
  330. package/vendor/node_modules/@legendapp/spark-desktop-links/windows/SparkLinks/SparkLinks.def +3 -0
  331. package/vendor/node_modules/@legendapp/spark-desktop-links/windows/SparkLinks/SparkLinks.h +128 -0
  332. package/vendor/node_modules/@legendapp/spark-desktop-links/windows/SparkLinks/SparkLinks.rc +0 -0
  333. package/vendor/node_modules/@legendapp/spark-desktop-links/windows/SparkLinks/SparkLinks.vcxproj +143 -0
  334. package/vendor/node_modules/@legendapp/spark-desktop-links/windows/SparkLinks/SparkLinks.vcxproj.filters +44 -0
  335. package/vendor/node_modules/@legendapp/spark-desktop-links/windows/SparkLinks/pch.cpp +1 -0
  336. package/vendor/node_modules/@legendapp/spark-desktop-links/windows/SparkLinks/pch.h +30 -0
  337. package/vendor/node_modules/@legendapp/spark-desktop-links/windows/SparkLinks/resource.h +5 -0
  338. package/vendor/node_modules/@legendapp/spark-desktop-links/windows/SparkLinks/targetver.h +8 -0
  339. package/vendor/node_modules/@legendapp/spark-desktop-links/windows/SparkLinks.sln +43 -0
  340. package/vendor/node_modules/@legendapp/spark-desktop-shortcuts/RNDesktopShortcuts.podspec +16 -0
  341. package/vendor/node_modules/@legendapp/spark-desktop-shortcuts/macos/RNDesktopShortcuts.h +4 -0
  342. package/vendor/node_modules/@legendapp/spark-desktop-shortcuts/macos/RNDesktopShortcuts.mm +56 -0
  343. package/vendor/node_modules/@legendapp/spark-desktop-shortcuts/package.json +43 -0
  344. package/vendor/node_modules/@legendapp/spark-desktop-shortcuts/src/NativeDesktopShortcuts.ts +8 -0
  345. package/vendor/node_modules/@legendapp/spark-desktop-shortcuts/src/accelerator.ts +22 -0
  346. package/vendor/node_modules/@legendapp/spark-desktop-shortcuts/src/api.ts +20 -0
  347. package/vendor/node_modules/@legendapp/spark-desktop-shortcuts/src/index.ts +1 -0
  348. package/vendor/node_modules/@legendapp/spark-desktop-shortcuts/src/index.windows.ts +1 -0
  349. package/vendor/node_modules/@legendapp/spark-desktop-windows/RNDesktopWindows.podspec +17 -0
  350. package/vendor/node_modules/@legendapp/spark-desktop-windows/macos/RNDesktopWindows.h +4 -0
  351. package/vendor/node_modules/@legendapp/spark-desktop-windows/macos/RNDesktopWindows.mm +210 -0
  352. package/vendor/node_modules/@legendapp/spark-desktop-windows/package.json +44 -0
  353. package/vendor/node_modules/@legendapp/spark-desktop-windows/src/NativeDesktopWindowManager.ts +6 -0
  354. package/vendor/node_modules/@legendapp/spark-desktop-windows/src/api.ts +79 -0
  355. package/vendor/node_modules/@legendapp/spark-desktop-windows/src/index.ts +1 -0
  356. package/vendor/node_modules/@legendapp/spark-desktop-windows/src/index.windows.ts +1 -0
  357. package/vendor/node_modules/@legendapp/spark-desktop-windows/src/windows-options.ts +11 -0
  358. package/vendor/node_modules/@legendapp/spark-drag-drop/RNDesktopDrag.podspec +20 -0
  359. package/vendor/node_modules/@legendapp/spark-drag-drop/macos/RNDesktopDragView.h +4 -0
  360. package/vendor/node_modules/@legendapp/spark-drag-drop/macos/RNDesktopDragView.mm +94 -0
  361. package/vendor/node_modules/@legendapp/spark-drag-drop/package.json +44 -0
  362. package/vendor/node_modules/@legendapp/spark-drag-drop/react-native.config.js +6 -0
  363. package/vendor/node_modules/@legendapp/spark-drag-drop/src/DesktopDragViewNativeComponent.ts +16 -0
  364. package/vendor/node_modules/@legendapp/spark-drag-drop/src/contracts.ts +28 -0
  365. package/vendor/node_modules/@legendapp/spark-drag-drop/src/index.tsx +17 -0
  366. package/vendor/node_modules/@legendapp/spark-drag-drop/windows/ExperimentalFeatures.props +33 -0
  367. package/vendor/node_modules/@legendapp/spark-drag-drop/windows/LICENSE +25 -0
  368. package/vendor/node_modules/@legendapp/spark-drag-drop/windows/SparkDragDrop/ReactPackageProvider.cpp +21 -0
  369. package/vendor/node_modules/@legendapp/spark-drag-drop/windows/SparkDragDrop/ReactPackageProvider.h +24 -0
  370. package/vendor/node_modules/@legendapp/spark-drag-drop/windows/SparkDragDrop/ReactPackageProvider.idl +9 -0
  371. package/vendor/node_modules/@legendapp/spark-drag-drop/windows/SparkDragDrop/SparkDragDrop.cpp +2 -0
  372. package/vendor/node_modules/@legendapp/spark-drag-drop/windows/SparkDragDrop/SparkDragDrop.def +3 -0
  373. package/vendor/node_modules/@legendapp/spark-drag-drop/windows/SparkDragDrop/SparkDragDrop.h +209 -0
  374. package/vendor/node_modules/@legendapp/spark-drag-drop/windows/SparkDragDrop/SparkDragDrop.rc +0 -0
  375. package/vendor/node_modules/@legendapp/spark-drag-drop/windows/SparkDragDrop/SparkDragDrop.vcxproj +143 -0
  376. package/vendor/node_modules/@legendapp/spark-drag-drop/windows/SparkDragDrop/SparkDragDrop.vcxproj.filters +44 -0
  377. package/vendor/node_modules/@legendapp/spark-drag-drop/windows/SparkDragDrop/pch.cpp +1 -0
  378. package/vendor/node_modules/@legendapp/spark-drag-drop/windows/SparkDragDrop/pch.h +30 -0
  379. package/vendor/node_modules/@legendapp/spark-drag-drop/windows/SparkDragDrop/resource.h +5 -0
  380. package/vendor/node_modules/@legendapp/spark-drag-drop/windows/SparkDragDrop/targetver.h +8 -0
  381. package/vendor/node_modules/@legendapp/spark-drag-drop/windows/SparkDragDrop.sln +43 -0
  382. package/vendor/node_modules/@legendapp/spark-file-dialog/RNFileDialog.podspec +17 -0
  383. package/vendor/node_modules/@legendapp/spark-file-dialog/ios/RNFileDialog.h +9 -0
  384. package/vendor/node_modules/@legendapp/spark-file-dialog/ios/RNFileDialog.mm +259 -0
  385. package/vendor/node_modules/@legendapp/spark-file-dialog/package.json +43 -0
  386. package/vendor/node_modules/@legendapp/spark-file-dialog/src/NativeFileDialog.ts +13 -0
  387. package/vendor/node_modules/@legendapp/spark-file-dialog/src/index.ts +89 -0
  388. package/vendor/node_modules/@legendapp/spark-file-dialog/src/index.windows.ts +15 -0
  389. package/vendor/node_modules/@legendapp/spark-file-dialog/src/options.ts +16 -0
  390. package/vendor/node_modules/@legendapp/spark-file-dialog/windows/ExperimentalFeatures.props +33 -0
  391. package/vendor/node_modules/@legendapp/spark-file-dialog/windows/LICENSE +25 -0
  392. package/vendor/node_modules/@legendapp/spark-file-dialog/windows/SparkFileDialog/ReactPackageProvider.cpp +20 -0
  393. package/vendor/node_modules/@legendapp/spark-file-dialog/windows/SparkFileDialog/ReactPackageProvider.h +24 -0
  394. package/vendor/node_modules/@legendapp/spark-file-dialog/windows/SparkFileDialog/ReactPackageProvider.idl +9 -0
  395. package/vendor/node_modules/@legendapp/spark-file-dialog/windows/SparkFileDialog/SparkFileDialog.cpp +2 -0
  396. package/vendor/node_modules/@legendapp/spark-file-dialog/windows/SparkFileDialog/SparkFileDialog.def +3 -0
  397. package/vendor/node_modules/@legendapp/spark-file-dialog/windows/SparkFileDialog/SparkFileDialog.h +128 -0
  398. package/vendor/node_modules/@legendapp/spark-file-dialog/windows/SparkFileDialog/SparkFileDialog.rc +0 -0
  399. package/vendor/node_modules/@legendapp/spark-file-dialog/windows/SparkFileDialog/SparkFileDialog.vcxproj +143 -0
  400. package/vendor/node_modules/@legendapp/spark-file-dialog/windows/SparkFileDialog/SparkFileDialog.vcxproj.filters +44 -0
  401. package/vendor/node_modules/@legendapp/spark-file-dialog/windows/SparkFileDialog/pch.cpp +1 -0
  402. package/vendor/node_modules/@legendapp/spark-file-dialog/windows/SparkFileDialog/pch.h +30 -0
  403. package/vendor/node_modules/@legendapp/spark-file-dialog/windows/SparkFileDialog/resource.h +5 -0
  404. package/vendor/node_modules/@legendapp/spark-file-dialog/windows/SparkFileDialog/targetver.h +8 -0
  405. package/vendor/node_modules/@legendapp/spark-file-dialog/windows/SparkFileDialog.sln +43 -0
  406. package/vendor/node_modules/@legendapp/spark-file-system/RNDesktopFileSystem.podspec +17 -0
  407. package/vendor/node_modules/@legendapp/spark-file-system/macos/RNDesktopFileSystem.h +4 -0
  408. package/vendor/node_modules/@legendapp/spark-file-system/macos/RNDesktopFileSystem.mm +211 -0
  409. package/vendor/node_modules/@legendapp/spark-file-system/package.json +47 -0
  410. package/vendor/node_modules/@legendapp/spark-file-system/react-native.config.js +6 -0
  411. package/vendor/node_modules/@legendapp/spark-file-system/src/NativeDesktopFileSystem.ts +8 -0
  412. package/vendor/node_modules/@legendapp/spark-file-system/src/handles.ts +45 -0
  413. package/vendor/node_modules/@legendapp/spark-file-system/src/index.ts +61 -0
  414. package/vendor/node_modules/@legendapp/spark-file-system/src/path.ts +9 -0
  415. package/vendor/node_modules/@legendapp/spark-file-system/windows/ExperimentalFeatures.props +33 -0
  416. package/vendor/node_modules/@legendapp/spark-file-system/windows/LICENSE +25 -0
  417. package/vendor/node_modules/@legendapp/spark-file-system/windows/SparkFileSystem/ReactPackageProvider.cpp +20 -0
  418. package/vendor/node_modules/@legendapp/spark-file-system/windows/SparkFileSystem/ReactPackageProvider.h +24 -0
  419. package/vendor/node_modules/@legendapp/spark-file-system/windows/SparkFileSystem/ReactPackageProvider.idl +9 -0
  420. package/vendor/node_modules/@legendapp/spark-file-system/windows/SparkFileSystem/SparkFileSystem.cpp +2 -0
  421. package/vendor/node_modules/@legendapp/spark-file-system/windows/SparkFileSystem/SparkFileSystem.def +3 -0
  422. package/vendor/node_modules/@legendapp/spark-file-system/windows/SparkFileSystem/SparkFileSystem.h +295 -0
  423. package/vendor/node_modules/@legendapp/spark-file-system/windows/SparkFileSystem/SparkFileSystem.rc +0 -0
  424. package/vendor/node_modules/@legendapp/spark-file-system/windows/SparkFileSystem/SparkFileSystem.vcxproj +144 -0
  425. package/vendor/node_modules/@legendapp/spark-file-system/windows/SparkFileSystem/SparkFileSystem.vcxproj.filters +45 -0
  426. package/vendor/node_modules/@legendapp/spark-file-system/windows/SparkFileSystem/Trash.h +52 -0
  427. package/vendor/node_modules/@legendapp/spark-file-system/windows/SparkFileSystem/pch.cpp +1 -0
  428. package/vendor/node_modules/@legendapp/spark-file-system/windows/SparkFileSystem/pch.h +30 -0
  429. package/vendor/node_modules/@legendapp/spark-file-system/windows/SparkFileSystem/resource.h +5 -0
  430. package/vendor/node_modules/@legendapp/spark-file-system/windows/SparkFileSystem/targetver.h +8 -0
  431. package/vendor/node_modules/@legendapp/spark-file-system/windows/SparkFileSystem.sln +43 -0
  432. package/vendor/node_modules/@legendapp/spark-global-shortcuts/RNDesktopGlobalShortcuts.podspec +17 -0
  433. package/vendor/node_modules/@legendapp/spark-global-shortcuts/macos/RNDesktopGlobalShortcuts.h +3 -0
  434. package/vendor/node_modules/@legendapp/spark-global-shortcuts/macos/RNDesktopGlobalShortcuts.mm +65 -0
  435. package/vendor/node_modules/@legendapp/spark-global-shortcuts/package.json +46 -0
  436. package/vendor/node_modules/@legendapp/spark-global-shortcuts/react-native.config.js +6 -0
  437. package/vendor/node_modules/@legendapp/spark-global-shortcuts/src/NativeDesktopGlobalShortcuts.ts +3 -0
  438. package/vendor/node_modules/@legendapp/spark-global-shortcuts/src/accelerator.ts +22 -0
  439. package/vendor/node_modules/@legendapp/spark-global-shortcuts/src/index.ts +16 -0
  440. package/vendor/node_modules/@legendapp/spark-global-shortcuts/windows/ExperimentalFeatures.props +33 -0
  441. package/vendor/node_modules/@legendapp/spark-global-shortcuts/windows/LICENSE +25 -0
  442. package/vendor/node_modules/@legendapp/spark-global-shortcuts/windows/SparkGlobalShortcuts/ReactPackageProvider.cpp +20 -0
  443. package/vendor/node_modules/@legendapp/spark-global-shortcuts/windows/SparkGlobalShortcuts/ReactPackageProvider.h +24 -0
  444. package/vendor/node_modules/@legendapp/spark-global-shortcuts/windows/SparkGlobalShortcuts/ReactPackageProvider.idl +9 -0
  445. package/vendor/node_modules/@legendapp/spark-global-shortcuts/windows/SparkGlobalShortcuts/SparkGlobalShortcuts.cpp +2 -0
  446. package/vendor/node_modules/@legendapp/spark-global-shortcuts/windows/SparkGlobalShortcuts/SparkGlobalShortcuts.def +3 -0
  447. package/vendor/node_modules/@legendapp/spark-global-shortcuts/windows/SparkGlobalShortcuts/SparkGlobalShortcuts.h +80 -0
  448. package/vendor/node_modules/@legendapp/spark-global-shortcuts/windows/SparkGlobalShortcuts/SparkGlobalShortcuts.rc +0 -0
  449. package/vendor/node_modules/@legendapp/spark-global-shortcuts/windows/SparkGlobalShortcuts/SparkGlobalShortcuts.vcxproj +143 -0
  450. package/vendor/node_modules/@legendapp/spark-global-shortcuts/windows/SparkGlobalShortcuts/SparkGlobalShortcuts.vcxproj.filters +44 -0
  451. package/vendor/node_modules/@legendapp/spark-global-shortcuts/windows/SparkGlobalShortcuts/pch.cpp +1 -0
  452. package/vendor/node_modules/@legendapp/spark-global-shortcuts/windows/SparkGlobalShortcuts/pch.h +30 -0
  453. package/vendor/node_modules/@legendapp/spark-global-shortcuts/windows/SparkGlobalShortcuts/resource.h +5 -0
  454. package/vendor/node_modules/@legendapp/spark-global-shortcuts/windows/SparkGlobalShortcuts/targetver.h +8 -0
  455. package/vendor/node_modules/@legendapp/spark-global-shortcuts/windows/SparkGlobalShortcuts.sln +43 -0
  456. package/vendor/node_modules/@legendapp/spark-message-dialog/RNDesktopMessageDialog.podspec +17 -0
  457. package/vendor/node_modules/@legendapp/spark-message-dialog/macos/RNDesktopMessageDialog.h +3 -0
  458. package/vendor/node_modules/@legendapp/spark-message-dialog/macos/RNDesktopMessageDialog.mm +36 -0
  459. package/vendor/node_modules/@legendapp/spark-message-dialog/package.json +46 -0
  460. package/vendor/node_modules/@legendapp/spark-message-dialog/react-native.config.js +6 -0
  461. package/vendor/node_modules/@legendapp/spark-message-dialog/src/NativeDesktopMessageDialog.ts +3 -0
  462. package/vendor/node_modules/@legendapp/spark-message-dialog/src/index.ts +13 -0
  463. package/vendor/node_modules/@legendapp/spark-message-dialog/windows/ExperimentalFeatures.props +33 -0
  464. package/vendor/node_modules/@legendapp/spark-message-dialog/windows/LICENSE +25 -0
  465. package/vendor/node_modules/@legendapp/spark-message-dialog/windows/SparkMessageDialog/ReactPackageProvider.cpp +20 -0
  466. package/vendor/node_modules/@legendapp/spark-message-dialog/windows/SparkMessageDialog/ReactPackageProvider.h +24 -0
  467. package/vendor/node_modules/@legendapp/spark-message-dialog/windows/SparkMessageDialog/ReactPackageProvider.idl +9 -0
  468. package/vendor/node_modules/@legendapp/spark-message-dialog/windows/SparkMessageDialog/SparkMessageDialog.cpp +2 -0
  469. package/vendor/node_modules/@legendapp/spark-message-dialog/windows/SparkMessageDialog/SparkMessageDialog.def +3 -0
  470. package/vendor/node_modules/@legendapp/spark-message-dialog/windows/SparkMessageDialog/SparkMessageDialog.h +145 -0
  471. package/vendor/node_modules/@legendapp/spark-message-dialog/windows/SparkMessageDialog/SparkMessageDialog.rc +0 -0
  472. package/vendor/node_modules/@legendapp/spark-message-dialog/windows/SparkMessageDialog/SparkMessageDialog.vcxproj +143 -0
  473. package/vendor/node_modules/@legendapp/spark-message-dialog/windows/SparkMessageDialog/SparkMessageDialog.vcxproj.filters +44 -0
  474. package/vendor/node_modules/@legendapp/spark-message-dialog/windows/SparkMessageDialog/pch.cpp +1 -0
  475. package/vendor/node_modules/@legendapp/spark-message-dialog/windows/SparkMessageDialog/pch.h +30 -0
  476. package/vendor/node_modules/@legendapp/spark-message-dialog/windows/SparkMessageDialog/resource.h +5 -0
  477. package/vendor/node_modules/@legendapp/spark-message-dialog/windows/SparkMessageDialog/targetver.h +8 -0
  478. package/vendor/node_modules/@legendapp/spark-message-dialog/windows/SparkMessageDialog.sln +43 -0
  479. package/vendor/node_modules/@legendapp/spark-native-menu/RNNativeMenu.podspec +17 -0
  480. package/vendor/node_modules/@legendapp/spark-native-menu/ios/RNNativeMenu.h +10 -0
  481. package/vendor/node_modules/@legendapp/spark-native-menu/ios/RNNativeMenu.mm +632 -0
  482. package/vendor/node_modules/@legendapp/spark-native-menu/package.json +41 -0
  483. package/vendor/node_modules/@legendapp/spark-native-menu/src/NativeMenu.ts +13 -0
  484. package/vendor/node_modules/@legendapp/spark-native-menu/src/api.ts +128 -0
  485. package/vendor/node_modules/@legendapp/spark-native-menu/src/index.ts +1 -0
  486. package/vendor/node_modules/@legendapp/spark-native-menu/src/index.windows.ts +1 -0
  487. package/vendor/node_modules/@legendapp/spark-native-menu/src/windows-menus.ts +43 -0
  488. package/vendor/node_modules/@legendapp/spark-notifications/RNDesktopNotifications.podspec +17 -0
  489. package/vendor/node_modules/@legendapp/spark-notifications/macos/RNDesktopNotifications.h +4 -0
  490. package/vendor/node_modules/@legendapp/spark-notifications/macos/RNDesktopNotifications.mm +111 -0
  491. package/vendor/node_modules/@legendapp/spark-notifications/package.json +46 -0
  492. package/vendor/node_modules/@legendapp/spark-notifications/react-native.config.js +6 -0
  493. package/vendor/node_modules/@legendapp/spark-notifications/src/NativeDesktopNotifications.ts +4 -0
  494. package/vendor/node_modules/@legendapp/spark-notifications/src/index.ts +53 -0
  495. package/vendor/node_modules/@legendapp/spark-notifications/windows/ExperimentalFeatures.props +33 -0
  496. package/vendor/node_modules/@legendapp/spark-notifications/windows/LICENSE +25 -0
  497. package/vendor/node_modules/@legendapp/spark-notifications/windows/SparkNotifications/ReactPackageProvider.cpp +20 -0
  498. package/vendor/node_modules/@legendapp/spark-notifications/windows/SparkNotifications/ReactPackageProvider.h +24 -0
  499. package/vendor/node_modules/@legendapp/spark-notifications/windows/SparkNotifications/ReactPackageProvider.idl +9 -0
  500. package/vendor/node_modules/@legendapp/spark-notifications/windows/SparkNotifications/SparkNotifications.cpp +2 -0
  501. package/vendor/node_modules/@legendapp/spark-notifications/windows/SparkNotifications/SparkNotifications.def +3 -0
  502. package/vendor/node_modules/@legendapp/spark-notifications/windows/SparkNotifications/SparkNotifications.h +132 -0
  503. package/vendor/node_modules/@legendapp/spark-notifications/windows/SparkNotifications/SparkNotifications.rc +0 -0
  504. package/vendor/node_modules/@legendapp/spark-notifications/windows/SparkNotifications/SparkNotifications.vcxproj +143 -0
  505. package/vendor/node_modules/@legendapp/spark-notifications/windows/SparkNotifications/SparkNotifications.vcxproj.filters +44 -0
  506. package/vendor/node_modules/@legendapp/spark-notifications/windows/SparkNotifications/pch.cpp +1 -0
  507. package/vendor/node_modules/@legendapp/spark-notifications/windows/SparkNotifications/pch.h +30 -0
  508. package/vendor/node_modules/@legendapp/spark-notifications/windows/SparkNotifications/resource.h +5 -0
  509. package/vendor/node_modules/@legendapp/spark-notifications/windows/SparkNotifications/targetver.h +8 -0
  510. package/vendor/node_modules/@legendapp/spark-notifications/windows/SparkNotifications.sln +43 -0
  511. package/vendor/node_modules/@legendapp/spark-processes/RNDesktopProcesses.podspec +17 -0
  512. package/vendor/node_modules/@legendapp/spark-processes/macos/RNDesktopProcesses.h +3 -0
  513. package/vendor/node_modules/@legendapp/spark-processes/macos/RNDesktopProcesses.mm +153 -0
  514. package/vendor/node_modules/@legendapp/spark-processes/package.json +46 -0
  515. package/vendor/node_modules/@legendapp/spark-processes/react-native.config.js +6 -0
  516. package/vendor/node_modules/@legendapp/spark-processes/src/NativeDesktopProcesses.ts +3 -0
  517. package/vendor/node_modules/@legendapp/spark-processes/src/index.ts +39 -0
  518. package/vendor/node_modules/@legendapp/spark-processes/windows/ExperimentalFeatures.props +33 -0
  519. package/vendor/node_modules/@legendapp/spark-processes/windows/LICENSE +25 -0
  520. package/vendor/node_modules/@legendapp/spark-processes/windows/SparkProcesses/ReactPackageProvider.cpp +20 -0
  521. package/vendor/node_modules/@legendapp/spark-processes/windows/SparkProcesses/ReactPackageProvider.h +24 -0
  522. package/vendor/node_modules/@legendapp/spark-processes/windows/SparkProcesses/ReactPackageProvider.idl +9 -0
  523. package/vendor/node_modules/@legendapp/spark-processes/windows/SparkProcesses/SparkProcesses.cpp +2 -0
  524. package/vendor/node_modules/@legendapp/spark-processes/windows/SparkProcesses/SparkProcesses.def +3 -0
  525. package/vendor/node_modules/@legendapp/spark-processes/windows/SparkProcesses/SparkProcesses.h +171 -0
  526. package/vendor/node_modules/@legendapp/spark-processes/windows/SparkProcesses/SparkProcesses.rc +0 -0
  527. package/vendor/node_modules/@legendapp/spark-processes/windows/SparkProcesses/SparkProcesses.vcxproj +143 -0
  528. package/vendor/node_modules/@legendapp/spark-processes/windows/SparkProcesses/SparkProcesses.vcxproj.filters +44 -0
  529. package/vendor/node_modules/@legendapp/spark-processes/windows/SparkProcesses/pch.cpp +1 -0
  530. package/vendor/node_modules/@legendapp/spark-processes/windows/SparkProcesses/pch.h +30 -0
  531. package/vendor/node_modules/@legendapp/spark-processes/windows/SparkProcesses/resource.h +5 -0
  532. package/vendor/node_modules/@legendapp/spark-processes/windows/SparkProcesses/targetver.h +8 -0
  533. package/vendor/node_modules/@legendapp/spark-processes/windows/SparkProcesses.sln +43 -0
  534. package/vendor/node_modules/@legendapp/spark-secure-storage/RNDesktopSecureStorage.podspec +17 -0
  535. package/vendor/node_modules/@legendapp/spark-secure-storage/macos/RNDesktopSecureStorage.h +4 -0
  536. package/vendor/node_modules/@legendapp/spark-secure-storage/macos/RNDesktopSecureStorage.mm +53 -0
  537. package/vendor/node_modules/@legendapp/spark-secure-storage/package.json +52 -0
  538. package/vendor/node_modules/@legendapp/spark-secure-storage/react-native.config.js +6 -0
  539. package/vendor/node_modules/@legendapp/spark-secure-storage/src/NativeDesktopSecureStorage.ts +6 -0
  540. package/vendor/node_modules/@legendapp/spark-secure-storage/src/desktop.ts +24 -0
  541. package/vendor/node_modules/@legendapp/spark-secure-storage/src/expo.ts +14 -0
  542. package/vendor/node_modules/@legendapp/spark-secure-storage/src/index.android.ts +1 -0
  543. package/vendor/node_modules/@legendapp/spark-secure-storage/src/index.ios.ts +1 -0
  544. package/vendor/node_modules/@legendapp/spark-secure-storage/src/index.ts +1 -0
  545. package/vendor/node_modules/@legendapp/spark-secure-storage/src/index.web.ts +1 -0
  546. package/vendor/node_modules/@legendapp/spark-secure-storage/src/index.windows.ts +2 -0
  547. package/vendor/node_modules/@legendapp/spark-secure-storage/src/options.ts +6 -0
  548. package/vendor/node_modules/@legendapp/spark-secure-storage/src/unavailable.ts +5 -0
  549. package/vendor/node_modules/@legendapp/spark-secure-storage/windows/ExperimentalFeatures.props +33 -0
  550. package/vendor/node_modules/@legendapp/spark-secure-storage/windows/LICENSE +25 -0
  551. package/vendor/node_modules/@legendapp/spark-secure-storage/windows/SparkSecureStorage/ReactPackageProvider.cpp +20 -0
  552. package/vendor/node_modules/@legendapp/spark-secure-storage/windows/SparkSecureStorage/ReactPackageProvider.h +24 -0
  553. package/vendor/node_modules/@legendapp/spark-secure-storage/windows/SparkSecureStorage/ReactPackageProvider.idl +9 -0
  554. package/vendor/node_modules/@legendapp/spark-secure-storage/windows/SparkSecureStorage/SparkSecureStorage.cpp +2 -0
  555. package/vendor/node_modules/@legendapp/spark-secure-storage/windows/SparkSecureStorage/SparkSecureStorage.def +3 -0
  556. package/vendor/node_modules/@legendapp/spark-secure-storage/windows/SparkSecureStorage/SparkSecureStorage.h +48 -0
  557. package/vendor/node_modules/@legendapp/spark-secure-storage/windows/SparkSecureStorage/SparkSecureStorage.rc +0 -0
  558. package/vendor/node_modules/@legendapp/spark-secure-storage/windows/SparkSecureStorage/SparkSecureStorage.vcxproj +143 -0
  559. package/vendor/node_modules/@legendapp/spark-secure-storage/windows/SparkSecureStorage/SparkSecureStorage.vcxproj.filters +44 -0
  560. package/vendor/node_modules/@legendapp/spark-secure-storage/windows/SparkSecureStorage/pch.cpp +1 -0
  561. package/vendor/node_modules/@legendapp/spark-secure-storage/windows/SparkSecureStorage/pch.h +30 -0
  562. package/vendor/node_modules/@legendapp/spark-secure-storage/windows/SparkSecureStorage/resource.h +5 -0
  563. package/vendor/node_modules/@legendapp/spark-secure-storage/windows/SparkSecureStorage/targetver.h +8 -0
  564. package/vendor/node_modules/@legendapp/spark-secure-storage/windows/SparkSecureStorage.sln +43 -0
  565. package/vendor/node_modules/@legendapp/spark-settings/package.json +13 -0
  566. package/vendor/node_modules/@legendapp/spark-settings/src/filename.ts +1 -0
  567. package/vendor/node_modules/@legendapp/spark-settings/src/filename.windows.ts +9 -0
  568. package/vendor/node_modules/@legendapp/spark-settings/src/index.ts +19 -0
  569. package/vendor/node_modules/@legendapp/spark-settings/src/store.ts +37 -0
  570. package/vendor/node_modules/@legendapp/spark-sqlite/package.json +16 -0
  571. package/vendor/node_modules/@legendapp/spark-sqlite/src/index.ts +7 -0
  572. package/vendor/node_modules/@legendapp/spark-system/RNDesktopSystem.podspec +17 -0
  573. package/vendor/node_modules/@legendapp/spark-system/macos/RNDesktopSystem.h +3 -0
  574. package/vendor/node_modules/@legendapp/spark-system/macos/RNDesktopSystem.mm +108 -0
  575. package/vendor/node_modules/@legendapp/spark-system/package.json +46 -0
  576. package/vendor/node_modules/@legendapp/spark-system/react-native.config.js +6 -0
  577. package/vendor/node_modules/@legendapp/spark-system/src/NativeDesktopSystem.ts +3 -0
  578. package/vendor/node_modules/@legendapp/spark-system/src/index.ts +35 -0
  579. package/vendor/node_modules/@legendapp/spark-system/windows/ExperimentalFeatures.props +33 -0
  580. package/vendor/node_modules/@legendapp/spark-system/windows/LICENSE +25 -0
  581. package/vendor/node_modules/@legendapp/spark-system/windows/SparkSystem/ReactPackageProvider.cpp +20 -0
  582. package/vendor/node_modules/@legendapp/spark-system/windows/SparkSystem/ReactPackageProvider.h +24 -0
  583. package/vendor/node_modules/@legendapp/spark-system/windows/SparkSystem/ReactPackageProvider.idl +9 -0
  584. package/vendor/node_modules/@legendapp/spark-system/windows/SparkSystem/SparkSystem.cpp +2 -0
  585. package/vendor/node_modules/@legendapp/spark-system/windows/SparkSystem/SparkSystem.def +3 -0
  586. package/vendor/node_modules/@legendapp/spark-system/windows/SparkSystem/SparkSystem.h +154 -0
  587. package/vendor/node_modules/@legendapp/spark-system/windows/SparkSystem/SparkSystem.rc +0 -0
  588. package/vendor/node_modules/@legendapp/spark-system/windows/SparkSystem/SparkSystem.vcxproj +143 -0
  589. package/vendor/node_modules/@legendapp/spark-system/windows/SparkSystem/SparkSystem.vcxproj.filters +44 -0
  590. package/vendor/node_modules/@legendapp/spark-system/windows/SparkSystem/pch.cpp +1 -0
  591. package/vendor/node_modules/@legendapp/spark-system/windows/SparkSystem/pch.h +30 -0
  592. package/vendor/node_modules/@legendapp/spark-system/windows/SparkSystem/resource.h +5 -0
  593. package/vendor/node_modules/@legendapp/spark-system/windows/SparkSystem/targetver.h +8 -0
  594. package/vendor/node_modules/@legendapp/spark-system/windows/SparkSystem.sln +43 -0
  595. package/vendor/node_modules/@legendapp/spark-tray/RNDesktopTray.podspec +17 -0
  596. package/vendor/node_modules/@legendapp/spark-tray/macos/RNDesktopTray.h +4 -0
  597. package/vendor/node_modules/@legendapp/spark-tray/macos/RNDesktopTray.mm +63 -0
  598. package/vendor/node_modules/@legendapp/spark-tray/package.json +46 -0
  599. package/vendor/node_modules/@legendapp/spark-tray/react-native.config.js +6 -0
  600. package/vendor/node_modules/@legendapp/spark-tray/src/NativeDesktopTray.ts +4 -0
  601. package/vendor/node_modules/@legendapp/spark-tray/src/index.ts +46 -0
  602. package/vendor/node_modules/@legendapp/spark-tray/windows/ExperimentalFeatures.props +33 -0
  603. package/vendor/node_modules/@legendapp/spark-tray/windows/LICENSE +25 -0
  604. package/vendor/node_modules/@legendapp/spark-tray/windows/SparkTray/ReactPackageProvider.cpp +20 -0
  605. package/vendor/node_modules/@legendapp/spark-tray/windows/SparkTray/ReactPackageProvider.h +24 -0
  606. package/vendor/node_modules/@legendapp/spark-tray/windows/SparkTray/ReactPackageProvider.idl +9 -0
  607. package/vendor/node_modules/@legendapp/spark-tray/windows/SparkTray/SparkTray.cpp +2 -0
  608. package/vendor/node_modules/@legendapp/spark-tray/windows/SparkTray/SparkTray.def +3 -0
  609. package/vendor/node_modules/@legendapp/spark-tray/windows/SparkTray/SparkTray.h +133 -0
  610. package/vendor/node_modules/@legendapp/spark-tray/windows/SparkTray/SparkTray.rc +0 -0
  611. package/vendor/node_modules/@legendapp/spark-tray/windows/SparkTray/SparkTray.vcxproj +143 -0
  612. package/vendor/node_modules/@legendapp/spark-tray/windows/SparkTray/SparkTray.vcxproj.filters +44 -0
  613. package/vendor/node_modules/@legendapp/spark-tray/windows/SparkTray/pch.cpp +1 -0
  614. package/vendor/node_modules/@legendapp/spark-tray/windows/SparkTray/pch.h +30 -0
  615. package/vendor/node_modules/@legendapp/spark-tray/windows/SparkTray/resource.h +5 -0
  616. package/vendor/node_modules/@legendapp/spark-tray/windows/SparkTray/targetver.h +8 -0
  617. package/vendor/node_modules/@legendapp/spark-tray/windows/SparkTray.sln +43 -0
  618. package/vendor/node_modules/@legendapp/spark-ui/RNSparkUI.podspec +17 -0
  619. package/vendor/node_modules/@legendapp/spark-ui/macos/RNSparkButton.h +4 -0
  620. package/vendor/node_modules/@legendapp/spark-ui/macos/RNSparkButton.mm +51 -0
  621. package/vendor/node_modules/@legendapp/spark-ui/macos/RNSparkSelect.h +4 -0
  622. package/vendor/node_modules/@legendapp/spark-ui/macos/RNSparkSelect.mm +53 -0
  623. package/vendor/node_modules/@legendapp/spark-ui/macos/RNSparkTextInput.h +4 -0
  624. package/vendor/node_modules/@legendapp/spark-ui/macos/RNSparkTextInput.mm +45 -0
  625. package/vendor/node_modules/@legendapp/spark-ui/package.json +61 -0
  626. package/vendor/node_modules/@legendapp/spark-ui/react-native.config.js +5 -0
  627. package/vendor/node_modules/@legendapp/spark-ui/src/SparkButtonNativeComponent.ts +12 -0
  628. package/vendor/node_modules/@legendapp/spark-ui/src/SparkSelectNativeComponent.ts +10 -0
  629. package/vendor/node_modules/@legendapp/spark-ui/src/SparkTextInputNativeComponent.ts +9 -0
  630. package/vendor/node_modules/@legendapp/spark-ui/src/index.android.tsx +25 -0
  631. package/vendor/node_modules/@legendapp/spark-ui/src/index.ios.tsx +30 -0
  632. package/vendor/node_modules/@legendapp/spark-ui/src/index.tsx +27 -0
  633. package/vendor/node_modules/@legendapp/spark-ui/src/index.web.tsx +23 -0
  634. package/vendor/node_modules/@legendapp/spark-ui/src/index.windows.tsx +42 -0
  635. package/vendor/node_modules/@legendapp/spark-ui/src/select.ts +7 -0
  636. package/vendor/node_modules/@legendapp/spark-ui/src/types.ts +28 -0
  637. package/vendor/node_modules/@legendapp/spark-ui/uniwind.ts +8 -0
  638. package/vendor/node_modules/@legendapp/spark-ui/uniwind.web.ts +17 -0
  639. package/vendor/node_modules/@legendapp/spark-ui/windows/ExperimentalFeatures.props +33 -0
  640. package/vendor/node_modules/@legendapp/spark-ui/windows/LICENSE +25 -0
  641. package/vendor/node_modules/@legendapp/spark-ui/windows/SparkUI/ReactPackageProvider.cpp +21 -0
  642. package/vendor/node_modules/@legendapp/spark-ui/windows/SparkUI/ReactPackageProvider.h +24 -0
  643. package/vendor/node_modules/@legendapp/spark-ui/windows/SparkUI/ReactPackageProvider.idl +9 -0
  644. package/vendor/node_modules/@legendapp/spark-ui/windows/SparkUI/SparkAppearance.h +61 -0
  645. package/vendor/node_modules/@legendapp/spark-ui/windows/SparkUI/SparkUI.cpp +2 -0
  646. package/vendor/node_modules/@legendapp/spark-ui/windows/SparkUI/SparkUI.def +3 -0
  647. package/vendor/node_modules/@legendapp/spark-ui/windows/SparkUI/SparkUI.h +181 -0
  648. package/vendor/node_modules/@legendapp/spark-ui/windows/SparkUI/SparkUI.rc +0 -0
  649. package/vendor/node_modules/@legendapp/spark-ui/windows/SparkUI/SparkUI.vcxproj +144 -0
  650. package/vendor/node_modules/@legendapp/spark-ui/windows/SparkUI/SparkUI.vcxproj.filters +44 -0
  651. package/vendor/node_modules/@legendapp/spark-ui/windows/SparkUI/pch.cpp +1 -0
  652. package/vendor/node_modules/@legendapp/spark-ui/windows/SparkUI/pch.h +30 -0
  653. package/vendor/node_modules/@legendapp/spark-ui/windows/SparkUI/resource.h +5 -0
  654. package/vendor/node_modules/@legendapp/spark-ui/windows/SparkUI/targetver.h +8 -0
  655. package/vendor/node_modules/@legendapp/spark-ui/windows/SparkUI.sln +43 -0
  656. package/vendor/node_modules/@legendapp/spark-updates/RNDesktopUpdates.podspec +18 -0
  657. package/vendor/node_modules/@legendapp/spark-updates/Sparkle.podspec.json +39 -0
  658. package/vendor/node_modules/@legendapp/spark-updates/macos/RNDesktopUpdates.h +4 -0
  659. package/vendor/node_modules/@legendapp/spark-updates/macos/RNDesktopUpdates.mm +72 -0
  660. package/vendor/node_modules/@legendapp/spark-updates/package.json +44 -0
  661. package/vendor/node_modules/@legendapp/spark-updates/src/NativeDesktopUpdates.ts +4 -0
  662. package/vendor/node_modules/@legendapp/spark-updates/src/index.ts +23 -0
  663. package/vendor/node_modules/@legendapp/spark-webview/package.json +15 -0
  664. package/vendor/node_modules/@legendapp/spark-webview/src/index.ts +2 -0
  665. package/vendor/node_modules/@legendapp/spark-window-options/index.cjs +25 -0
  666. package/vendor/node_modules/@legendapp/spark-window-options/index.d.ts +12 -0
  667. package/vendor/node_modules/@legendapp/spark-window-options/package.json +12 -0
  668. package/webview.ts +1 -0
  669. package/windows.ts +1 -0
@@ -0,0 +1,647 @@
1
+ // Application integration for the pinned RNW Composition host. UI-thread owned.
2
+ #include <map>
3
+ #include <set>
4
+ #include <vector>
5
+ #include <algorithm>
6
+ #include <cmath>
7
+ #include <exception>
8
+ #include <shellapi.h>
9
+ #include <shellscalingapi.h>
10
+ #include <fstream>
11
+ #include <shlwapi.h>
12
+ #include <filesystem>
13
+ #include <shlobj.h>
14
+ #include <commctrl.h>
15
+ #include <dwmapi.h>
16
+ #include <winrt/Windows.UI.ViewManagement.h>
17
+ #include <winrt/Microsoft.ReactNative.Composition.h>
18
+ #pragma comment(lib, "Dwmapi.lib")
19
+ #include <winrt/Windows.ApplicationModel.Core.h>
20
+ #include <winrt/Windows.Data.Json.h>
21
+ #include <winrt/Windows.Security.Cryptography.h>
22
+ #include <winrt/Windows.Security.Cryptography.Core.h>
23
+ #pragma comment(lib, "Comctl32.lib")
24
+ #pragma comment(linker, "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
25
+ #pragma comment(lib, "Shell32.lib")
26
+ #pragma comment(lib, "Shlwapi.lib")
27
+ #pragma comment(lib, "Shcore.lib")
28
+ namespace SparkWin {
29
+ namespace RNW = winrt::Microsoft::ReactNative;
30
+ namespace Json = winrt::Windows::Data::Json;
31
+ namespace UI = winrt::Microsoft::UI::Windowing;
32
+ using winrt::to_hstring; using winrt::to_string;
33
+ struct WindowResources : winrt::implements<WindowResources, RNW::Composition::ICustomResourceLoader> {
34
+ int theme = -1;
35
+ winrt::event<winrt::Windows::Foundation::EventHandler<winrt::Windows::Foundation::IInspectable>> changed;
36
+ void GetResource(winrt::hstring const &id, RNW::Composition::ResourceType, RNW::Composition::CustomResourceResult const &result) {
37
+ if (id == L"SparkWindowTheme") result.Resource(winrt::box_value(winrt::Windows::UI::Color{static_cast<uint8_t>(theme < 0 ? 0 : 255), static_cast<uint8_t>(theme == 1 ? 255 : 0), 0, 0}));
38
+ }
39
+ winrt::event_token ResourcesChanged(winrt::Windows::Foundation::EventHandler<winrt::Windows::Foundation::IInspectable> const &handler) { return changed.add(handler); }
40
+ void ResourcesChanged(winrt::event_token const &token) noexcept { changed.remove(token); }
41
+ void SetTheme(int value) { theme = value; changed(*this, nullptr); }
42
+ };
43
+ struct Window { RNW::ReactNativeWindow view{nullptr}; UI::AppWindow app{nullptr}; UI::OverlappedPresenter normal{nullptr}; int32_t minWidth = 100, minHeight = 100, maxWidth = 20000, maxHeight = 20000; std::string parentId; bool modal = false; bool overlay = false; bool transparent = false; bool shadow = true; bool disabledByModal = false; bool enabledBeforeModal = false; bool guard = false; bool pending = false; bool allow = false; uint64_t request = 0; HMONITOR monitor = nullptr; bool fullscreen = false; bool closable = true; bool restoreFrame = false; int theme = -1; winrt::com_ptr<WindowResources> resources; winrt::Microsoft::UI::Composition::SpriteVisual background{nullptr}; };
44
+ static std::map<std::string, Window> windows;
45
+ static RNW::ReactNativeHost host{nullptr};
46
+ static winrt::Microsoft::UI::Composition::Compositor compositor{nullptr};
47
+ static RNW::ReactContext context;
48
+ static void InitializeToastActivation();
49
+ static void QueueNotificationResponse(std::string const &);
50
+ static std::string NotificationResponses();
51
+ static void EmitNotificationEvents();
52
+ static void SetNotificationWindow(HWND);
53
+ static bool quitGuard = false, quitPending = false;
54
+ static uint64_t generation = 0, quitRequest = 0;
55
+ static Json::JsonArray pendingURLs{nullptr};
56
+ static std::string initialURL;
57
+ static Json::JsonArray launchArguments{nullptr};
58
+ static bool appActive = false;
59
+ static std::set<std::string> hiddenByApp;
60
+ static std::string hiddenFocus;
61
+ static std::filesystem::path dataDirectory;
62
+ struct Shortcut { std::string id, windowId; UINT key; int modifiers; bool repeat; };
63
+ static std::map<std::string, Shortcut> shortcuts;
64
+ static HHOOK keyboardHook = nullptr;
65
+ static std::map<UINT, RNW::JSValueObject> menuActions;
66
+ static HMENU currentMenu = nullptr;
67
+ static std::string menuOwner;
68
+ static Json::JsonArray menus{nullptr};
69
+ static HACCEL acceleratorTable = nullptr;
70
+ static HWND Hwnd(Window const &window) { return winrt::Microsoft::UI::GetWindowFromWindowId(window.app.Id()); }
71
+ static void UpdateModality() {
72
+ for (auto &[id, window] : windows) {
73
+ bool blocked = false;
74
+ for (auto const &[childId, child] : windows) if (child.modal && child.parentId == id && IsWindowVisible(Hwnd(child))) { blocked = true; break; }
75
+ if (blocked && !window.disabledByModal) { window.enabledBeforeModal = IsWindowEnabled(Hwnd(window)); window.disabledByModal = true; EnableWindow(Hwnd(window), FALSE); }
76
+ else if (!blocked && window.disabledByModal) { window.disabledByModal = false; if (window.enabledBeforeModal) EnableWindow(Hwnd(window), TRUE); }
77
+ }
78
+ }
79
+ static std::string Id(HWND hwnd) { auto root = GetAncestor(hwnd, GA_ROOT); for (auto const &[id, window] : windows) if (Hwnd(window) == root) return id; return ""; }
80
+ static void Emit(RNW::JSValueObject value) { if (context) context.EmitJSEvent(L"RCTDeviceEventEmitter", L"desktop", std::move(value)); }
81
+ static void WindowTransitions(std::string const &id) {
82
+ auto found = windows.find(id); if (found == windows.end()) return;
83
+ auto &window = found->second;
84
+ auto monitor = MonitorFromWindow(Hwnd(window), MONITOR_DEFAULTTONEAREST);
85
+ if (monitor != window.monitor) { window.monitor = monitor; Emit({{"type", "screenChanged"}, {"windowId", id}}); }
86
+ bool fullscreen = window.app.Presenter().Kind() == UI::AppWindowPresenterKind::FullScreen;
87
+ if (fullscreen != window.fullscreen) { window.fullscreen = fullscreen; Emit({{"type", fullscreen ? "enterFullscreen" : "leaveFullscreen"}, {"windowId", id}}); }
88
+ }
89
+ static void HideApplication() {
90
+ hiddenFocus = Id(GetForegroundWindow());
91
+ for (auto &[id, window] : windows) if (IsWindowVisible(Hwnd(window))) { hiddenByApp.insert(id); window.app.Hide(); }
92
+ UpdateModality();
93
+ }
94
+ static void ActivateApplication() {
95
+ for (auto const &id : hiddenByApp) if (windows.count(id)) windows.at(id).app.Show(!windows.at(id).overlay);
96
+ hiddenByApp.clear();
97
+ auto id = windows.count(hiddenFocus) ? hiddenFocus : "main";
98
+ auto &window = windows.at(id);
99
+ ShowWindow(Hwnd(window), IsIconic(Hwnd(window)) ? SW_RESTORE : SW_SHOW);
100
+ UpdateModality();
101
+ // An owned modal window, when present, must receive activation instead.
102
+ HWND target = GetLastActivePopup(Hwnd(window));
103
+ SetForegroundWindow(IsWindowVisible(target) && IsWindowEnabled(target) ? target : Hwnd(window));
104
+ }
105
+ static void WriteJson(RNW::IJSValueWriter const &writer, Json::IJsonValue const &value) {
106
+ switch (value.ValueType()) {
107
+ case Json::JsonValueType::Object: writer.WriteObjectBegin(); for (auto const &pair : value.GetObject()) { writer.WritePropertyName(pair.Key()); WriteJson(writer, pair.Value()); } writer.WriteObjectEnd(); break;
108
+ case Json::JsonValueType::Array: writer.WriteArrayBegin(); for (auto const &item : value.GetArray()) WriteJson(writer, item); writer.WriteArrayEnd(); break;
109
+ case Json::JsonValueType::String: writer.WriteString(value.GetString()); break;
110
+ case Json::JsonValueType::Number: writer.WriteDouble(value.GetNumber()); break;
111
+ case Json::JsonValueType::Boolean: writer.WriteBoolean(value.GetBoolean()); break;
112
+ default: writer.WriteNull();
113
+ }
114
+ }
115
+ static Json::JsonObject Info(std::string const &id) {
116
+ auto &window = windows.at(id); auto hwnd = Hwnd(window); RECT frame{}; GetWindowRect(hwnd, &frame);
117
+ Json::JsonObject result, rect;
118
+ result.SetNamedValue(L"id", Json::JsonValue::CreateStringValue(to_hstring(id))); result.SetNamedValue(L"title", Json::JsonValue::CreateStringValue(window.app.Title()));
119
+ result.SetNamedValue(L"kind", Json::JsonValue::CreateStringValue(window.overlay ? L"overlay" : L"window"));
120
+ result.SetNamedValue(L"visible", Json::JsonValue::CreateBooleanValue(IsWindowVisible(hwnd))); result.SetNamedValue(L"focused", Json::JsonValue::CreateBooleanValue(GetForegroundWindow() == hwnd));
121
+ result.SetNamedValue(L"minimized", Json::JsonValue::CreateBooleanValue(IsIconic(hwnd)));
122
+ result.SetNamedValue(L"resizable", Json::JsonValue::CreateBooleanValue((GetWindowLongPtrW(hwnd, GWL_STYLE) & WS_THICKFRAME) != 0));
123
+ result.SetNamedValue(L"alwaysOnTop", Json::JsonValue::CreateBooleanValue((GetWindowLongPtrW(hwnd, GWL_EXSTYLE) & WS_EX_TOPMOST) != 0));
124
+ result.SetNamedValue(L"fullscreen", Json::JsonValue::CreateBooleanValue(window.app.Presenter().Kind() == UI::AppWindowPresenterKind::FullScreen));
125
+ result.SetNamedValue(L"minWidth", Json::JsonValue::CreateNumberValue(window.minWidth)); result.SetNamedValue(L"maxWidth", Json::JsonValue::CreateNumberValue(window.maxWidth));
126
+ rect.SetNamedValue(L"x", Json::JsonValue::CreateNumberValue(frame.left)); rect.SetNamedValue(L"y", Json::JsonValue::CreateNumberValue(frame.top)); rect.SetNamedValue(L"width", Json::JsonValue::CreateNumberValue(frame.right-frame.left)); rect.SetNamedValue(L"height", Json::JsonValue::CreateNumberValue(frame.bottom-frame.top)); result.SetNamedValue(L"frame", rect); return result;
127
+ }
128
+ static Json::JsonObject Rect(RECT const &frame) {
129
+ Json::JsonObject result;
130
+ result.SetNamedValue(L"x", Json::JsonValue::CreateNumberValue(frame.left));
131
+ result.SetNamedValue(L"y", Json::JsonValue::CreateNumberValue(frame.top));
132
+ result.SetNamedValue(L"width", Json::JsonValue::CreateNumberValue(frame.right - frame.left));
133
+ result.SetNamedValue(L"height", Json::JsonValue::CreateNumberValue(frame.bottom - frame.top));
134
+ return result;
135
+ }
136
+ static Json::JsonArray Displays() {
137
+ struct State { Json::JsonArray result; std::exception_ptr error; } state;
138
+ const auto enumerated = EnumDisplayMonitors(nullptr, nullptr, [](HMONITOR monitor, HDC, LPRECT, LPARAM param) -> BOOL {
139
+ auto &state = *reinterpret_cast<State *>(param);
140
+ try {
141
+ MONITORINFOEXW info{}; info.cbSize = sizeof(info);
142
+ if (!GetMonitorInfoW(monitor, reinterpret_cast<MONITORINFO *>(&info))) winrt::throw_last_error();
143
+ UINT dpiX = 96, dpiY = 96; winrt::check_hresult(GetDpiForMonitor(monitor, MDT_EFFECTIVE_DPI, &dpiX, &dpiY));
144
+ DISPLAY_DEVICEW device{}; device.cb = sizeof(device); EnumDisplayDevicesW(info.szDevice, 0, &device, 0);
145
+ Json::JsonObject display;
146
+ display.SetNamedValue(L"id", Json::JsonValue::CreateStringValue(info.szDevice));
147
+ display.SetNamedValue(L"name", Json::JsonValue::CreateStringValue(device.DeviceString[0] ? device.DeviceString : info.szDevice));
148
+ display.SetNamedValue(L"frame", Rect(info.rcMonitor)); display.SetNamedValue(L"workArea", Rect(info.rcWork));
149
+ display.SetNamedValue(L"scale", Json::JsonValue::CreateNumberValue(dpiX / 96.0)); state.result.Append(display);
150
+ return TRUE;
151
+ } catch (...) { state.error = std::current_exception(); return FALSE; }
152
+ }, reinterpret_cast<LPARAM>(&state));
153
+ if (state.error) std::rethrow_exception(state.error);
154
+ if (!enumerated) winrt::throw_last_error();
155
+ return state.result;
156
+ }
157
+ static int32_t Dimension(Json::JsonObject const &args, wchar_t const *key, int32_t fallback) {
158
+ const auto value = args.GetNamedNumber(key, fallback);
159
+ if (!std::isfinite(value) || value < 100 || value > 20000) throw winrt::hresult_invalid_argument(L"Invalid window dimension");
160
+ return static_cast<int32_t>(value);
161
+ }
162
+ static void ApplyAppearance(Window &window) {
163
+ auto foreground = winrt::Windows::UI::ViewManagement::UISettings().GetColorValue(winrt::Windows::UI::ViewManagement::UIColorType::Foreground);
164
+ BOOL dark = window.theme < 0 ? (5 * foreground.G + 2 * foreground.R + foreground.B) > 8 * 128 : window.theme == 1;
165
+ // Windows 10/11 titlebar appearance; unsupported OS chrome does not block content.
166
+ DwmSetWindowAttribute(Hwnd(window), 20 /* DWMWA_USE_IMMERSIVE_DARK_MODE */, &dark, sizeof(dark));
167
+ if (!window.resources) { window.resources = winrt::make_self<WindowResources>(); window.view.ReactNativeIsland().Resources(window.resources.as<RNW::Composition::ICustomResourceLoader>()); }
168
+ window.resources->SetTheme(window.theme);
169
+ }
170
+ static std::filesystem::path SparkFile(std::string const &id) {
171
+ return dataDirectory / (id == "main" ? L"window.json" : L"window-" + std::wstring(to_hstring(id)) + L".json");
172
+ }
173
+ static void RestoreFrame(std::string const &id) {
174
+ auto &window = windows.at(id); if (!window.restoreFrame) return;
175
+ try {
176
+ std::ifstream stream(SparkFile(id)); std::string text((std::istreambuf_iterator<char>(stream)), std::istreambuf_iterator<char>());
177
+ auto frame = Json::JsonObject::Parse(to_hstring(text));
178
+ double x = frame.GetNamedNumber(L"x"), y = frame.GetNamedNumber(L"y");
179
+ if (!std::isfinite(x) || !std::isfinite(y) || std::abs(x) > INT32_MAX / 2 || std::abs(y) > INT32_MAX / 2) return;
180
+ auto width = Dimension(frame, L"width", 640), height = Dimension(frame, L"height", 480);
181
+ width = std::clamp(width, window.minWidth, window.maxWidth); height = std::clamp(height, window.minHeight, window.maxHeight);
182
+ RECT rect{static_cast<LONG>(x), static_cast<LONG>(y), static_cast<LONG>(x) + width, static_cast<LONG>(y) + height};
183
+ if (MonitorFromRect(&rect, MONITOR_DEFAULTTONULL)) window.app.MoveAndResize({rect.left, rect.top, width, height});
184
+ } catch (...) { /* Missing or invalid saved geometry uses configured defaults. */ }
185
+ }
186
+ static void ApplyOptions(Window &window, Json::JsonObject const &options) {
187
+ static const std::set<std::wstring> supported{L"title", L"width", L"height", L"minWidth", L"minHeight", L"maxWidth", L"maxHeight", L"resizable", L"minimizable", L"alwaysOnTop", L"closable", L"appearance", L"backgroundColor", L"restoreFrame", L"titleBarStyle", L"transparent", L"hasShadow"};
188
+ for (auto const &pair : options) if (!supported.count(std::wstring(pair.Key()))) throw winrt::hresult_invalid_argument(L"Unsupported Windows window option");
189
+ const auto minWidth = Dimension(options, L"minWidth", window.minWidth), minHeight = Dimension(options, L"minHeight", window.minHeight);
190
+ const auto maxWidth = Dimension(options, L"maxWidth", window.maxWidth), maxHeight = Dimension(options, L"maxHeight", window.maxHeight);
191
+ if (minWidth > maxWidth || minHeight > maxHeight) throw winrt::hresult_invalid_argument(L"Invalid window constraints");
192
+ auto size = window.app.Size();
193
+ const auto width = Dimension(options, L"width", std::clamp(size.Width, minWidth, maxWidth));
194
+ const auto height = Dimension(options, L"height", std::clamp(size.Height, minHeight, maxHeight));
195
+ if (width < minWidth || width > maxWidth || height < minHeight || height > maxHeight) throw winrt::hresult_invalid_argument(L"Window size is outside its constraints");
196
+ window.minWidth = minWidth; window.minHeight = minHeight; window.maxWidth = maxWidth; window.maxHeight = maxHeight;
197
+ if (options.HasKey(L"titleBarStyle")) {
198
+ auto style = options.GetNamedString(L"titleBarStyle");
199
+ if (style != L"default" && style != L"hidden" && style != L"borderless") throw winrt::hresult_invalid_argument(L"Unsupported Windows titlebar style");
200
+ window.normal.SetBorderAndTitleBar(style != L"borderless", style == L"default");
201
+ }
202
+ if (options.HasKey(L"transparent")) window.transparent = options.GetNamedBoolean(L"transparent");
203
+ if (options.HasKey(L"hasShadow")) window.shadow = options.GetNamedBoolean(L"hasShadow");
204
+ if (options.HasKey(L"transparent") || options.HasKey(L"hasShadow")) {
205
+ auto hwnd = Hwnd(window); auto style = GetWindowLongPtrW(hwnd, GWL_EXSTYLE);
206
+ // Composition supplies the client pixels; don't retain an opaque GDI surface.
207
+ SetWindowLongPtrW(hwnd, GWL_EXSTYLE, window.transparent ? style | WS_EX_NOREDIRECTIONBITMAP : style & ~WS_EX_NOREDIRECTIONBITMAP);
208
+ MARGINS margins = window.transparent ? MARGINS{-1, -1, -1, -1} : MARGINS{0, 0, 0, 0};
209
+ winrt::check_hresult(DwmExtendFrameIntoClientArea(hwnd, &margins));
210
+ DWMNCRENDERINGPOLICY policy = window.shadow ? DWMNCRP_ENABLED : DWMNCRP_DISABLED;
211
+ winrt::check_hresult(DwmSetWindowAttribute(hwnd, DWMWA_NCRENDERING_POLICY, &policy, sizeof(policy)));
212
+ SetWindowPos(hwnd, nullptr, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED);
213
+ }
214
+ if (options.HasKey(L"title")) window.app.Title(options.GetNamedString(L"title"));
215
+ if (options.HasKey(L"resizable")) { window.normal.IsResizable(options.GetNamedBoolean(L"resizable")); window.normal.IsMaximizable(options.GetNamedBoolean(L"resizable")); }
216
+ if (options.HasKey(L"minimizable")) window.normal.IsMinimizable(options.GetNamedBoolean(L"minimizable"));
217
+ if (options.HasKey(L"alwaysOnTop")) window.normal.IsAlwaysOnTop(options.GetNamedBoolean(L"alwaysOnTop"));
218
+ if (options.HasKey(L"closable")) {
219
+ window.closable = options.GetNamedBoolean(L"closable");
220
+ EnableMenuItem(GetSystemMenu(Hwnd(window), FALSE), SC_CLOSE, MF_BYCOMMAND | (window.closable ? MF_ENABLED : MF_GRAYED));
221
+ }
222
+ if (options.HasKey(L"restoreFrame")) window.restoreFrame = options.GetNamedBoolean(L"restoreFrame");
223
+ if (options.HasKey(L"appearance")) {
224
+ auto theme = options.GetNamedString(L"appearance");
225
+ window.theme = theme == L"dark" ? 1 : theme == L"light" ? 0 : -1; ApplyAppearance(window);
226
+ }
227
+ if (options.HasKey(L"backgroundColor") || options.HasKey(L"transparent")) {
228
+ auto color = to_string(options.GetNamedString(L"backgroundColor", window.transparent ? L"#00000000" : L"#FFFFFFFF"));
229
+ if ((color.size() != 7 && color.size() != 9) || color[0] != '#' || color.find_first_not_of("0123456789abcdefABCDEF", 1) != std::string::npos) throw winrt::hresult_invalid_argument(L"Invalid background color");
230
+ auto rgba = std::stoul(color.substr(1), nullptr, 16); if (color.size() == 7) rgba = (rgba << 8) | 255;
231
+ if (!window.background) {
232
+ // RNW's root is a SpriteVisual. Paint its brush beneath all React children
233
+ // instead of inserting a child that could obscure a later-mounted surface.
234
+ window.background = window.view.ReactNativeIsland().RootVisual().as<winrt::Microsoft::UI::Composition::SpriteVisual>();
235
+ }
236
+ window.background.Brush(compositor.CreateColorBrush(winrt::Windows::UI::Color{static_cast<uint8_t>(rgba & 255), static_cast<uint8_t>((rgba >> 24) & 255), static_cast<uint8_t>((rgba >> 16) & 255), static_cast<uint8_t>((rgba >> 8) & 255)}));
237
+ }
238
+ if (window.app.Presenter().Kind() != UI::AppWindowPresenterKind::FullScreen) window.app.Resize({width, height});
239
+ }
240
+ static void QueueLaunch(std::wstring const &commandLine, bool initial) {
241
+ int count = 0; auto argv = CommandLineToArgvW(commandLine.c_str(), &count);
242
+ if (!argv) return;
243
+ if (initial) for (int i = 0; i < count; ++i) launchArguments.Append(Json::JsonValue::CreateStringValue(argv[i]));
244
+ else Emit({{"type", "secondInstance"}});
245
+ for (int i = 1; i < count; ++i) {
246
+ std::wstring candidate(argv[i]);
247
+ if (candidate.rfind(L"--spark-dock-action=", 0) == 0) {
248
+ auto payload = candidate.substr(21); auto separator = payload.find(L':');
249
+ if (separator != std::wstring::npos) try { Emit({{"type", "dockAction"}, {"owner", to_string(winrt::Windows::Foundation::Uri::UnescapeComponent(payload.substr(0, separator)))}, {"id", to_string(winrt::Windows::Foundation::Uri::UnescapeComponent(payload.substr(separator + 1)))}}); } catch (...) {}
250
+ continue;
251
+ }
252
+ if (candidate.empty() || candidate[0] == L'-') continue;
253
+ bool file = std::filesystem::path(candidate).is_absolute();
254
+ if (file) { wchar_t uri[32768]; DWORD length = 32768; if (FAILED(UrlCreateFromPathW(candidate.c_str(), uri, &length, 0))) continue; candidate = uri; }
255
+ else { auto colon = candidate.find(L':'); if (colon == std::wstring::npos || colon < 2) continue; }
256
+ auto url = to_string(candidate); auto eventId = std::to_string(++generation);
257
+ Json::JsonObject item; item.SetNamedValue(L"type", Json::JsonValue::CreateStringValue(file ? L"openFile" : L"openURL")); item.SetNamedValue(L"url", Json::JsonValue::CreateStringValue(candidate)); item.SetNamedValue(L"id", Json::JsonValue::CreateStringValue(to_hstring(eventId)));
258
+ pendingURLs.Append(item); if (pendingURLs.Size() > 200) pendingURLs.RemoveAt(0); if (initial && initialURL.empty()) initialURL = url;
259
+ Emit({{"type", file ? "openFile" : "openURL"}, {"id", eventId}, {"url", url}, {"initial", initial}});
260
+ }
261
+ LocalFree(argv);
262
+ }
263
+ // Retained for the process lifetime. An abandoned owner can be replaced after a
264
+ // crash; a slow/hung owner must never cause us to start a second notebook writer.
265
+ static winrt::handle instanceMutex;
266
+ static std::wstring ProjectKey() {
267
+ auto identity = SparkWindowsEnv(L"SPARK_PROJECT_ID");
268
+ if (identity.empty()) throw winrt::hresult_invalid_argument(L"Missing Spark project identity");
269
+ auto algorithm = winrt::Windows::Security::Cryptography::Core::HashAlgorithmProvider::OpenAlgorithm(winrt::Windows::Security::Cryptography::Core::HashAlgorithmNames::Sha256());
270
+ auto bytes = winrt::Windows::Security::Cryptography::CryptographicBuffer::ConvertStringToBinary(identity, winrt::Windows::Security::Cryptography::BinaryStringEncoding::Utf8);
271
+ return std::wstring(winrt::Windows::Security::Cryptography::CryptographicBuffer::EncodeToHexString(algorithm.HashData(bytes)));
272
+ }
273
+ static bool ForwardLaunch() {
274
+ auto key = L"Spark.Project." + ProjectKey();
275
+ instanceMutex.attach(CreateMutexW(nullptr, FALSE, (L"Local\\" + key).c_str()));
276
+ if (!instanceMutex) winrt::throw_last_error();
277
+ const auto deadline = GetTickCount64() + 60000;
278
+ for (;;) {
279
+ const auto wait = WaitForSingleObject(instanceMutex.get(), 0);
280
+ if (wait == WAIT_OBJECT_0 || wait == WAIT_ABANDONED) return false;
281
+ if (wait == WAIT_FAILED) winrt::throw_last_error();
282
+ struct Search { std::wstring key; HWND target = nullptr; } search{key};
283
+ EnumWindows([](HWND hwnd, LPARAM param) -> BOOL { auto data = reinterpret_cast<Search *>(param); if (GetPropW(hwnd, data->key.c_str())) { data->target = hwnd; return FALSE; } return TRUE; }, reinterpret_cast<LPARAM>(&search));
284
+ if (search.target) {
285
+ DWORD process = 0; GetWindowThreadProcessId(search.target, &process); AllowSetForegroundWindow(process);
286
+ auto text = GetCommandLineW(); COPYDATASTRUCT data{0x4C47, static_cast<DWORD>((wcslen(text) + 1) * sizeof(wchar_t)), text}; DWORD_PTR result = 0;
287
+ if (!SendMessageTimeoutW(search.target, WM_COPYDATA, 0, reinterpret_cast<LPARAM>(&data), SMTO_ABORTIFHUNG | SMTO_BLOCK, 5000, &result) || !result)
288
+ throw winrt::hresult_error(HRESULT_FROM_WIN32(ERROR_TIMEOUT), L"The existing Spark app did not accept this launch. Close it before retrying.");
289
+ return true;
290
+ }
291
+ if (GetTickCount64() >= deadline)
292
+ throw winrt::hresult_error(HRESULT_FROM_WIN32(ERROR_TIMEOUT), L"The existing Spark app is still starting. A second instance was not opened.");
293
+ // Waiting for the main window also covers simultaneous first launches.
294
+ Sleep(50);
295
+ }
296
+ }
297
+ static void SaveFrame(std::string const &id, HWND hwnd) {
298
+ if (dataDirectory.empty() || !windows.at(id).restoreFrame || IsIconic(hwnd) || IsZoomed(hwnd) || windows.at(id).fullscreen) return;
299
+ auto file = SparkFile(id), temporary = file; temporary += L".pending";
300
+ auto text = to_string(Info(id).GetNamedObject(L"frame").Stringify()); std::ofstream stream(temporary, std::ios::binary | std::ios::trunc); stream << text; stream.close();
301
+ if (stream) MoveFileExW(temporary.c_str(), file.c_str(), MOVEFILE_REPLACE_EXISTING | MOVEFILE_WRITE_THROUGH);
302
+ }
303
+ static void RequestQuit() {
304
+ if (quitPending) return;
305
+ if (!quitGuard) { windows.at("main").allow = true; windows.at("main").app.Destroy(); return; }
306
+ quitPending = true; auto request = quitRequest = ++generation;
307
+ Emit({{"type", "beforeQuit"}, {"requestId", static_cast<int64_t>(request)}});
308
+ SetTimer(Hwnd(windows.at("main")), 0x4C47, 30000, nullptr);
309
+ }
310
+ static LRESULT CALLBACK WindowProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam, UINT_PTR, DWORD_PTR) {
311
+ auto id = Id(hwnd);
312
+ if (!id.empty()) {
313
+ if (message == WM_MOUSEACTIVATE && windows.at(id).overlay) return MA_NOACTIVATE;
314
+ if (message == WM_ERASEBKGND && windows.at(id).transparent) return 1;
315
+ if (message == WM_APP + 19) { EmitNotificationEvents(); return 0; }
316
+ if (message == WM_COPYDATA) {
317
+ auto notification = reinterpret_cast<COPYDATASTRUCT *>(lParam);
318
+ if (notification && notification->dwData == 0x4C4E) {
319
+ if (!notification->lpData || notification->cbData < sizeof(wchar_t) || notification->cbData > 65536 || notification->cbData % sizeof(wchar_t)) return FALSE;
320
+ auto text = static_cast<wchar_t const *>(notification->lpData); if (text[notification->cbData / sizeof(wchar_t) - 1]) return FALSE;
321
+ try { QueueNotificationResponse(to_string(text)); return TRUE; } catch (...) { return FALSE; }
322
+ }
323
+ auto data = reinterpret_cast<COPYDATASTRUCT *>(lParam); if (data && data->dwData == 0x4C47 && data->cbData >= sizeof(wchar_t) && data->cbData <= 65536 && data->cbData % sizeof(wchar_t) == 0) { auto text = static_cast<wchar_t *>(data->lpData); if (text && text[data->cbData / sizeof(wchar_t) - 1] == 0) { QueueLaunch(text, false); Emit({{"type", "reopen"}}); ActivateApplication(); return TRUE; } } return FALSE; }
324
+ if (message == WM_GETMINMAXINFO) {
325
+ auto limits = reinterpret_cast<MINMAXINFO *>(lParam); auto const &window = windows.at(id);
326
+ limits->ptMinTrackSize = {window.minWidth, window.minHeight}; limits->ptMaxTrackSize = {window.maxWidth, window.maxHeight}; return 0;
327
+ }
328
+ if (message == WM_SHOWWINDOW) PostMessageW(hwnd, WM_APP + 18, 0, 0);
329
+ if (message == WM_APP + 18) { UpdateModality(); return 0; }
330
+ if (message == WM_SETTINGCHANGE || message == WM_THEMECHANGED) ApplyAppearance(windows.at(id));
331
+ if (message == WM_SYSCOMMAND && (wParam & 0xfff0) == SC_CLOSE && !windows.at(id).closable) return 0;
332
+ if (message == WM_EXITSIZEMOVE) SaveFrame(id, hwnd);
333
+ if (message == WM_ACTIVATEAPP) {
334
+ const bool active = wParam != 0;
335
+ if (active != appActive) { appActive = active; Emit({{"type", active ? "activate" : "deactivate"}}); }
336
+ }
337
+ if (message == WM_MOVE || message == WM_SIZE || message == WM_DPICHANGED) WindowTransitions(id);
338
+ if (message == WM_MOVE) Emit({{"type", "move"}, {"windowId", id}});
339
+ if (message == WM_SIZE) Emit({{"type", "resize"}, {"windowId", id}});
340
+ if (message == WM_NCDESTROY && id == "main") SetNotificationWindow(nullptr);
341
+ if (message == WM_NCDESTROY && currentMenu && GetMenu(hwnd) == currentMenu) { currentMenu = nullptr; menuActions.clear(); }
342
+ if (message == WM_ACTIVATE && LOWORD(wParam) != WA_INACTIVE && currentMenu && GetMenu(hwnd) != currentMenu) {
343
+ for (auto const &[name, other] : windows) { auto otherHwnd = Hwnd(other); if (GetMenu(otherHwnd) == currentMenu) { SetMenu(otherHwnd, nullptr); DrawMenuBar(otherHwnd); } }
344
+ SetMenu(hwnd, currentMenu); DrawMenuBar(hwnd);
345
+ }
346
+ if (message == WM_ACTIVATE) Emit({{"type", LOWORD(wParam) == WA_INACTIVE ? "blur" : "focus"}, {"windowId", id}});
347
+ if (message == WM_COMMAND && (HIWORD(wParam) == 0 || HIWORD(wParam) == 1)) {
348
+ auto found = menuActions.find(LOWORD(wParam)); if (found != menuActions.end() && context) { context.EmitJSEvent(L"RCTDeviceEventEmitter", L"NativeMenuAction", found->second.Copy()); return 0; }
349
+ }
350
+ if (message == WM_TIMER && wParam == 0x4C47) { if (id == "main") quitPending = false; windows.at(id).pending = false; KillTimer(hwnd, 0x4C47); return 0; }
351
+ }
352
+ return DefSubclassProc(hwnd, message, wParam, lParam);
353
+ }
354
+ static void Attach(std::string id, RNW::ReactNativeWindow view) {
355
+ Window window; window.view = view; window.app = view.AppWindow(); window.normal = window.app.Presenter().as<UI::OverlappedPresenter>(); window.monitor = MonitorFromWindow(Hwnd(window), MONITOR_DEFAULTTONEAREST); windows.emplace(id, window);
356
+ SetPropW(Hwnd(window), (L"Spark.Window." + std::wstring(to_hstring(id))).c_str(), reinterpret_cast<HANDLE>(1));
357
+ SetPropW(Hwnd(window), L"Spark.ReactWindow", reinterpret_cast<HANDLE>(1));
358
+ if (id == "main") SetNotificationWindow(Hwnd(window));
359
+ auto app = window.app;
360
+ app.Changed([id](auto const &, auto const &) { WindowTransitions(id); });
361
+ SetWindowSubclass(Hwnd(window), WindowProc, 0x4C47, 0);
362
+ app.Closing([id](auto const &, UI::AppWindowClosingEventArgs const &args) {
363
+ auto found = windows.find(id); if (found == windows.end() || found->second.allow) return;
364
+ auto &window = found->second;
365
+ SaveFrame(id, Hwnd(window));
366
+ if (window.guard) {
367
+ args.Cancel(true); if (window.pending) return;
368
+ window.pending = true; window.request = ++generation;
369
+ SetTimer(Hwnd(window), 0x4C47, 30000, nullptr);
370
+ Emit({{"type", "beforeClose"}, {"windowId", id}, {"requestId", static_cast<int64_t>(window.request)}});
371
+ } else if (id == "main" && quitGuard) { args.Cancel(true); RequestQuit(); }
372
+ });
373
+ app.Destroying([id](auto const &, auto const &) {
374
+ Emit({{"type", "closed"}, {"windowId", id}});
375
+ if (id != "main") {
376
+ // A menu attached to a destroyed HWND is otherwise destroyed by Windows.
377
+ auto closing = windows.find(id);
378
+ if (currentMenu && closing != windows.end() && GetMenu(Hwnd(closing->second)) == currentMenu) {
379
+ SetMenu(Hwnd(closing->second), nullptr);
380
+ auto main = Hwnd(windows.at("main")); SetMenu(main, currentMenu); DrawMenuBar(main);
381
+ }
382
+ const bool overlay = windows.at(id).overlay;
383
+ const auto parent = windows.at(id).parentId;
384
+ windows.erase(id); UpdateModality();
385
+ if (!overlay && !parent.empty() && windows.count(parent) && IsWindowEnabled(Hwnd(windows.at(parent)))) SetForegroundWindow(Hwnd(windows.at(parent)));
386
+ }
387
+ });
388
+ }
389
+ static LRESULT CALLBACK Keyboard(int code, WPARAM remove, LPARAM param) {
390
+ if (code >= 0 && remove == PM_REMOVE) {
391
+ auto message = reinterpret_cast<MSG *>(param);
392
+ auto target = GetAncestor(message->hwnd, GA_ROOT);
393
+ if (acceleratorTable && !Id(target).empty() && IsWindowEnabled(target) && TranslateAcceleratorW(target, acceleratorTable, message)) { message->message = WM_NULL; return CallNextHookEx(keyboardHook, code, remove, param); }
394
+ if (message->message == WM_KEYDOWN || message->message == WM_SYSKEYDOWN) {
395
+ auto id = Id(message->hwnd); int modifiers = 0;
396
+ if (GetKeyState(VK_CONTROL) < 0) modifiers |= 1 << 18;
397
+ if (GetKeyState(VK_MENU) < 0) modifiers |= 1 << 19;
398
+ if (GetKeyState(VK_SHIFT) < 0) modifiers |= 1 << 17;
399
+ if (GetKeyState(VK_LWIN) < 0 || GetKeyState(VK_RWIN) < 0) modifiers |= 1 << 20;
400
+ for (auto const &[key, shortcut] : shortcuts) if (!id.empty() && (shortcut.windowId.empty() || shortcut.windowId == id) && shortcut.key == message->wParam && shortcut.modifiers == modifiers) {
401
+ if (shortcut.repeat || !(message->lParam & (1LL << 30))) context.EmitJSEvent(L"RCTDeviceEventEmitter", L"shortcut", RNW::JSValueObject{{"id", key}});
402
+ message->message = WM_NULL; break;
403
+ }
404
+ }
405
+ }
406
+ return CallNextHookEx(keyboardHook, code, remove, param);
407
+ }
408
+ static RNW::JSValue Value(Json::IJsonValue const &value) {
409
+ switch (value.ValueType()) {
410
+ case Json::JsonValueType::Object: { RNW::JSValueObject result; for (auto const &entry : value.GetObject()) result.emplace(to_string(entry.Key()), Value(entry.Value())); return result; }
411
+ case Json::JsonValueType::Array: { RNW::JSValueArray result; for (auto const &entry : value.GetArray()) result.push_back(Value(entry)); return result; }
412
+ case Json::JsonValueType::String: return to_string(value.GetString());
413
+ case Json::JsonValueType::Number: return value.GetNumber();
414
+ case Json::JsonValueType::Boolean: return value.GetBoolean();
415
+ default: return nullptr;
416
+ }
417
+ }
418
+ static std::wstring MenuTitle(winrt::hstring const &title) {
419
+ std::wstring result; for (auto c : title) { result += c; if (c == L'&') result += c; } return result;
420
+ }
421
+ static void RebuildMenus() {
422
+ auto next = CreateMenu(); std::map<UINT, RNW::JSValueObject> actions; std::vector<ACCEL> accelerators; UINT command = 0x5000;
423
+ for (auto const &value : menus) {
424
+ auto menu = value.GetObject(); auto popup = CreatePopupMenu();
425
+ for (auto const &entry : menu.GetNamedArray(L"items")) {
426
+ auto item = entry.GetObject(); if (item.GetNamedBoolean(L"hidden", false)) continue;
427
+ if (item.GetNamedBoolean(L"separator", false)) { AppendMenuW(popup, MF_SEPARATOR, 0, nullptr); continue; }
428
+ auto flags = MF_STRING | (item.GetNamedBoolean(L"enabled", true) ? MF_ENABLED : MF_GRAYED) | (item.GetNamedBoolean(L"checked", false) ? MF_CHECKED : 0);
429
+ auto title = MenuTitle(item.GetNamedString(L"title", L""));
430
+ if (item.HasKey(L"shortcut") && item.GetNamedValue(L"shortcut").ValueType() == Json::JsonValueType::Object) {
431
+ auto shortcut = item.GetNamedObject(L"shortcut"); auto key = shortcut.GetNamedString(L"key", L"");
432
+ if (key.size() == 1 && command <= 0xffff) {
433
+ const auto bits = static_cast<int>(shortcut.GetNamedNumber(L"modifiers", 0));
434
+ BYTE modifiers = FVIRTKEY; if (bits & ((1 << 18) | (1 << 20))) modifiers |= FCONTROL;
435
+ if (bits & (1 << 19)) modifiers |= FALT; if (bits & (1 << 17)) modifiers |= FSHIFT;
436
+ wchar_t c = key[0]; WORD code = 0;
437
+ if (c >= 0xf704 && c <= 0xf717) code = VK_F1 + c - 0xf704;
438
+ else if (c == 0xf700) code = VK_UP; else if (c == 0xf701) code = VK_DOWN; else if (c == 0xf702) code = VK_LEFT; else if (c == 0xf703) code = VK_RIGHT;
439
+ else if (c == 0xf728) code = VK_DELETE; else if (c == 0x7f) code = VK_BACK;
440
+ else { auto scan = VkKeyScanW(c); if (scan != -1) { code = LOBYTE(scan); if (HIBYTE(scan) & 1) modifiers |= FSHIFT; if (HIBYTE(scan) & 2) modifiers |= FCONTROL; if (HIBYTE(scan) & 4) modifiers |= FALT; } }
441
+ if (code) {
442
+ if (item.GetNamedBoolean(L"enabled", true)) accelerators.push_back({modifiers, code, static_cast<WORD>(command)});
443
+ title += L"\t"; if (modifiers & FCONTROL) title += L"Ctrl+"; if (modifiers & FALT) title += L"Alt+"; if (modifiers & FSHIFT) title += L"Shift+";
444
+ wchar_t label[80]{}; auto scan = MapVirtualKeyW(code, MAPVK_VK_TO_VSC); if (code == VK_LEFT || code == VK_RIGHT || code == VK_UP || code == VK_DOWN || code == VK_DELETE) scan |= 0x100;
445
+ GetKeyNameTextW(static_cast<LONG>(scan << 16), label, 80); title += label;
446
+ }
447
+ }
448
+ }
449
+ AppendMenuW(popup, flags, command, title.c_str());
450
+ actions.emplace(command++, RNW::JSValueObject{{"ownerId", to_string(item.GetNamedString(L"_sparkOwner", to_hstring(menuOwner)))}, {"menuId", to_string(item.GetNamedString(L"_sparkMenu", menu.GetNamedString(L"id")))}, {"itemId", to_string(item.GetNamedString(L"id"))}, {"payload", Value(item.GetNamedObject(L"payload", Json::JsonObject()))}});
451
+ }
452
+ AppendMenuW(next, MF_POPUP, reinterpret_cast<UINT_PTR>(popup), MenuTitle(menu.GetNamedString(L"title")).c_str());
453
+ }
454
+ for (auto const &[id, window] : windows) SetMenu(Hwnd(window), nullptr);
455
+ auto target = GetForegroundWindow(); if (Id(target).empty()) target = Hwnd(windows.at("main")); SetMenu(target, next); DrawMenuBar(target);
456
+ auto old = currentMenu; currentMenu = next; menuActions = std::move(actions); if (old) DestroyMenu(old);
457
+ if (acceleratorTable) DestroyAcceleratorTable(acceleratorTable);
458
+ acceleratorTable = accelerators.empty() ? nullptr : CreateAcceleratorTableW(accelerators.data(), static_cast<int>(accelerators.size()));
459
+ }
460
+ static void Initialize(RNW::ReactNativeWin32App const &app) {
461
+ // WinRT activation must follow init_apartment, never static initialization.
462
+ pendingURLs = Json::JsonArray(); launchArguments = Json::JsonArray(); menus = Json::JsonArray();
463
+ host = app.ReactNativeHost(); compositor = app.ReactNativeWindow().ReactNativeIsland().Compositor(); Attach("main", app.ReactNativeWindow());
464
+ keyboardHook = SetWindowsHookExW(WH_GETMESSAGE, Keyboard, nullptr, GetCurrentThreadId());
465
+ // AsyncStorage's documented override supports unpackaged Win32 applications.
466
+ PWSTR raw = nullptr; winrt::check_hresult(SHGetKnownFolderPath(FOLDERID_LocalAppData, 0, nullptr, &raw));
467
+ std::filesystem::path directory(raw); CoTaskMemFree(raw);
468
+ auto identity = SparkWindowsEnv(L"SPARK_PROJECT_ID"); if (identity.empty()) throw winrt::hresult_invalid_argument(L"Missing Spark project identity");
469
+ auto algorithm = winrt::Windows::Security::Cryptography::Core::HashAlgorithmProvider::OpenAlgorithm(winrt::Windows::Security::Cryptography::Core::HashAlgorithmNames::Sha256());
470
+ auto bytes = winrt::Windows::Security::Cryptography::CryptographicBuffer::ConvertStringToBinary(identity, winrt::Windows::Security::Cryptography::BinaryStringEncoding::Utf8);
471
+ auto safe = winrt::Windows::Security::Cryptography::CryptographicBuffer::EncodeToHexString(algorithm.HashData(bytes));
472
+ directory /= L"Spark"; directory /= std::wstring(safe); std::filesystem::create_directories(directory); dataDirectory = directory;
473
+ SetPropW(Hwnd(windows.at("main")), (L"Spark.Project." + ProjectKey()).c_str(), reinterpret_cast<HANDLE>(1));
474
+ winrt::check_hresult(SetCurrentProcessExplicitAppUserModelID((L"Spark." + ProjectKey()).c_str()));
475
+ QueueLaunch(GetCommandLineW(), true);
476
+ auto config = Json::JsonObject::Parse(winrt::hstring(SparkWindowsEnv(L"SPARK_WINDOW_CONFIG").empty() ? L"{}" : SparkWindowsEnv(L"SPARK_WINDOW_CONFIG")));
477
+ auto appWindow = windows.at("main").app;
478
+ Json::JsonObject style;
479
+ style.SetNamedValue(L"width", Json::JsonValue::CreateNumberValue(config.GetNamedNumber(L"width", 1000)));
480
+ style.SetNamedValue(L"height", Json::JsonValue::CreateNumberValue(config.GetNamedNumber(L"height", 700)));
481
+ for (auto key : {L"minWidth", L"minHeight", L"maxWidth", L"maxHeight", L"resizable", L"minimizable", L"alwaysOnTop", L"closable", L"appearance", L"backgroundColor", L"restoreFrame", L"titleBarStyle", L"transparent", L"hasShadow"})
482
+ if (config.HasKey(key)) style.SetNamedValue(key, config.GetNamedValue(key));
483
+ ApplyOptions(windows.at("main"), style);
484
+ RestoreFrame("main");
485
+
486
+ winrt::Windows::ApplicationModel::Core::CoreApplication::Properties().Insert(L"React-Native-Community-Async-Storage-Database-Path", winrt::box_value(winrt::hstring((directory / L"AsyncStorage.db").wstring())));
487
+ }
488
+ }
489
+ REACT_MODULE(SparkDesktopApp, L"NativeDesktopApp")
490
+ struct SparkDesktopApp {
491
+ REACT_INIT(Initialize)
492
+ void Initialize(winrt::Microsoft::ReactNative::ReactContext const &context) noexcept { if (context.Properties().Get(winrt::Microsoft::ReactNative::ReactPropertyId<bool>{L"Spark", L"SecondaryRuntime"}).value_or(false)) return; SparkWin::context = context; SparkWin::quitGuard = false; SparkWin::quitPending = false; SparkWin::shortcuts.clear(); for (auto &[id, window] : SparkWin::windows) { window.guard = false; window.pending = false; } }
493
+ REACT_METHOD(addListener) void addListener(std::string) noexcept {}
494
+ REACT_METHOD(removeListeners) void removeListeners(double) noexcept {}
495
+ REACT_METHOD(call)
496
+ void call(std::string method, std::string encoded, winrt::Microsoft::ReactNative::ReactPromise<std::string> promise) noexcept {
497
+ SparkWin::context.UIDispatcher().Post([method, encoded, promise]() {
498
+ using namespace SparkWin;
499
+ try {
500
+ auto args = Json::JsonObject::Parse(to_hstring(encoded));
501
+ if (method == "notificationResponses") { promise.Resolve(NotificationResponses()); return; }
502
+ if (method == "quitGuard") quitGuard = args.GetNamedBoolean(L"enabled");
503
+ else if (method == "quit") RequestQuit();
504
+ else if (method == "replyQuit") {
505
+ if (quitPending && args.GetNamedNumber(L"requestId") == quitRequest) { quitPending = false; KillTimer(Hwnd(windows.at("main")), 0x4C47); if (args.GetNamedBoolean(L"allow")) { windows.at("main").allow = true; windows.at("main").app.Destroy(); } }
506
+ } else if (method == "hide") HideApplication();
507
+ else if (method == "activate") ActivateApplication();
508
+ else if (method == "context") {
509
+ Json::JsonObject result; result.SetNamedValue(L"projectId", Json::JsonValue::CreateStringValue(SparkWindowsEnv(L"SPARK_PROJECT_ID"))); result.SetNamedValue(L"name", Json::JsonValue::CreateStringValue(SparkWindowsEnv(L"SPARK_PROJECT_NAME"))); result.SetNamedValue(L"version", Json::JsonValue::CreateStringValue(SparkWindowsEnv(L"SPARK_PROJECT_VERSION"))); result.SetNamedValue(L"runtime", Json::JsonObject::Parse(to_hstring(NativeSparkRuntime{}.describe()))); result.SetNamedValue(L"launchArguments", launchArguments); promise.Resolve(to_string(result.Stringify())); return;
510
+ } else if (method == "pendingURLs") { promise.Resolve(to_string(pendingURLs.Stringify())); return; }
511
+ else if (method == "initialURL") { promise.Resolve(initialURL.empty() ? "null" : to_string(Json::JsonValue::CreateStringValue(to_hstring(initialURL)).Stringify())); return; }
512
+ else throw winrt::hresult_invalid_argument(L"Unsupported application operation");
513
+ promise.Resolve("null");
514
+ } catch (winrt::hresult_error const &error) { promise.Reject(RNW::ReactError{"E_APP", to_string(error.message())}); }
515
+ });
516
+ }
517
+ };
518
+ REACT_MODULE(SparkDesktopWindows, L"NativeDesktopWindowManager")
519
+ struct SparkDesktopWindows {
520
+ REACT_INIT(Initialize) void Initialize(winrt::Microsoft::ReactNative::ReactContext const &context) noexcept { if (context.Properties().Get(winrt::Microsoft::ReactNative::ReactPropertyId<bool>{L"Spark", L"SecondaryRuntime"}).value_or(false)) return; SparkWin::context = context; }
521
+ REACT_METHOD(call)
522
+ void call(std::string method, std::string encoded, winrt::Microsoft::ReactNative::ReactPromise<std::string> promise) noexcept {
523
+ SparkWin::context.UIDispatcher().Post([method, encoded, promise]() {
524
+ using namespace SparkWin;
525
+ try {
526
+ auto args = Json::JsonObject::Parse(to_hstring(encoded)); auto id = to_string(args.GetNamedString(L"id", L"main"));
527
+ if (method == "open") {
528
+ if (windows.count(id)) {
529
+ auto &existing = windows.at(id); auto hwnd = Hwnd(existing); ShowWindow(hwnd, existing.overlay ? SW_SHOWNOACTIVATE : IsIconic(hwnd) ? SW_RESTORE : SW_SHOW); UpdateModality(); if (!existing.overlay) SetForegroundWindow(hwnd);
530
+ promise.Resolve(to_string(Info(id).Stringify())); return;
531
+ }
532
+ const auto parentId = to_string(args.GetNamedString(L"parentId", L""));
533
+ const auto kind = args.GetNamedString(L"kind", L"window");
534
+ if (kind != L"window" && kind != L"overlay") throw winrt::hresult_invalid_argument(L"Invalid window kind");
535
+ const bool overlay = kind == L"overlay";
536
+ const bool modal = args.GetNamedBoolean(L"modal", false);
537
+ if (modal && overlay) throw winrt::hresult_invalid_argument(L"An overlay cannot be modal");
538
+ if ((modal && parentId.empty()) || parentId == id) throw winrt::hresult_invalid_argument(L"Modal windows need a distinct parent");
539
+ if (!parentId.empty() && !windows.count(parentId)) { promise.Reject(RNW::ReactError{"E_NOT_FOUND", "Parent window not found"}); return; }
540
+ if (modal) for (auto const &[childId, child] : windows) if (child.parentId == parentId && child.modal) { promise.Reject(RNW::ReactError{"E_BUSY", "Parent already has a modal window"}); return; }
541
+ auto view = RNW::ReactNativeWindow::CreateFromCompositor(compositor); auto app = view.AppWindow();
542
+ app.Title(args.GetNamedString(L"title", SparkWindowsEnv(L"SPARK_PROJECT_NAME"))); app.Resize({static_cast<int32_t>(args.GetNamedNumber(L"width", 640)), static_cast<int32_t>(args.GetNamedNumber(L"height", 480))});
543
+ RNW::ReactViewOptions options; options.ComponentName(L"main");
544
+ Json::JsonObject props; props.SetNamedValue(L"windowId", Json::JsonValue::CreateStringValue(to_hstring(id))); props.SetNamedValue(L"windowProps", args.GetNamedObject(L"props", Json::JsonObject()));
545
+ // Write JSON props through the public JSValue writer contract.
546
+ auto propsJson = to_string(props.Stringify());
547
+ options.InitialProps([propsJson](RNW::IJSValueWriter const &writer) { WriteJson(writer, Json::JsonObject::Parse(to_hstring(propsJson))); });
548
+ // Validate all options before attaching/showing a new React root.
549
+ Json::JsonObject style;
550
+ for (auto const &pair : args) if (pair.Key() != L"id" && pair.Key() != L"props" && pair.Key() != L"parentId" && pair.Key() != L"modal" && pair.Key() != L"kind") style.SetNamedValue(pair.Key(), pair.Value());
551
+ Window pending; pending.overlay = overlay; pending.view = view; pending.app = app; pending.normal = app.Presenter().as<UI::OverlappedPresenter>();
552
+ try { ApplyOptions(pending, style); } catch (...) { app.Destroy(); throw; }
553
+ if (overlay) {
554
+ auto hwnd = Hwnd(pending);
555
+ SetWindowLongPtrW(hwnd, GWL_EXSTYLE, (GetWindowLongPtrW(hwnd, GWL_EXSTYLE) | WS_EX_NOACTIVATE | WS_EX_TOOLWINDOW) & ~WS_EX_APPWINDOW);
556
+ }
557
+ Attach(id, view);
558
+ auto &attached = windows.at(id); attached.parentId = parentId; attached.modal = modal; attached.overlay = overlay; attached.transparent = pending.transparent; attached.shadow = pending.shadow;
559
+ if (!parentId.empty()) {
560
+ SetLastError(0); SetWindowLongPtrW(Hwnd(attached), GWLP_HWNDPARENT, reinterpret_cast<LONG_PTR>(Hwnd(windows.at(parentId))));
561
+ if (GetLastError()) { app.Destroy(); throw winrt::hresult_error(HRESULT_FROM_WIN32(GetLastError())); }
562
+ }
563
+ attached.minWidth = pending.minWidth; attached.minHeight = pending.minHeight; attached.maxWidth = pending.maxWidth; attached.maxHeight = pending.maxHeight; attached.closable = pending.closable; attached.restoreFrame = pending.restoreFrame; attached.theme = pending.theme; attached.resources = pending.resources; attached.background = pending.background;
564
+ view.ReactNativeIsland().ReactViewHost(RNW::ReactCoreInjection::MakeViewHost(host, options)); RestoreFrame(id); ApplyAppearance(attached); app.Show(!overlay); UpdateModality(); Emit({{"type", "opened"}, {"windowId", id}});
565
+ promise.Resolve(to_string(Info(id).Stringify())); return;
566
+ }
567
+ if (method == "displays") { promise.Resolve(to_string(Displays().Stringify())); return; }
568
+ if (method == "list") { Json::JsonArray result; for (auto const &[name, window] : windows) result.Append(Info(name)); promise.Resolve(to_string(result.Stringify())); return; }
569
+ auto found = windows.find(id); if (found == windows.end()) { promise.Reject(RNW::ReactError{"E_NOT_FOUND", "Window not found"}); return; }
570
+ auto &window = found->second; auto hwnd = Hwnd(window);
571
+ if (method == "info") { promise.Resolve(to_string(Info(id).Stringify())); return; }
572
+ if (method == "options") ApplyOptions(window, args.GetNamedObject(L"options"));
573
+ else if (method == "center") {
574
+ MONITORINFO monitor{}; monitor.cbSize = sizeof(monitor);
575
+ if (!GetMonitorInfoW(MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST), &monitor)) winrt::throw_last_error();
576
+ auto size = window.app.Size();
577
+ window.app.Move({monitor.rcWork.left + (monitor.rcWork.right - monitor.rcWork.left - size.Width) / 2, monitor.rcWork.top + (monitor.rcWork.bottom - monitor.rcWork.top - size.Height) / 2});
578
+ } else if (method == "frame") {
579
+ auto frame = args.GetNamedObject(L"frame"); const auto x = frame.GetNamedNumber(L"x"), y = frame.GetNamedNumber(L"y");
580
+ if (!std::isfinite(x) || !std::isfinite(y) || x < INT32_MIN || x > INT32_MAX || y < INT32_MIN || y > INT32_MAX) throw winrt::hresult_invalid_argument(L"Invalid frame origin");
581
+ auto width = Dimension(frame, L"width", window.app.Size().Width), height = Dimension(frame, L"height", window.app.Size().Height);
582
+ if (width < window.minWidth || width > window.maxWidth || height < window.minHeight || height > window.maxHeight) throw winrt::hresult_invalid_argument(L"Frame is outside window constraints");
583
+ window.app.MoveAndResize({static_cast<int32_t>(x), static_cast<int32_t>(y), width, height});
584
+ } else if (method == "fullscreen") {
585
+ if (args.GetNamedBoolean(L"enabled")) window.app.SetPresenter(UI::AppWindowPresenterKind::FullScreen);
586
+ else window.app.SetPresenter(window.normal);
587
+ WindowTransitions(id);
588
+ } else if (method == "title") window.app.Title(args.GetNamedString(L"title"));
589
+ else if (method == "closeGuard") { window.guard = args.GetNamedBoolean(L"enabled"); window.pending = false; window.request = ++generation; KillTimer(hwnd, 0x4C47); }
590
+ else if (method == "replyClose") {
591
+ if (window.pending && args.GetNamedNumber(L"requestId", 0) == window.request) { window.pending = false; KillTimer(hwnd, 0x4C47); if (args.GetNamedBoolean(L"allow")) { if (id == "main") RequestQuit(); else { window.allow = true; window.app.Destroy(); } } }
592
+ } else if (method == "close") PostMessageW(hwnd, WM_CLOSE, 0, 0);
593
+ else if (method == "show") { ShowWindow(hwnd, window.overlay ? SW_SHOWNOACTIVATE : IsIconic(hwnd) ? SW_RESTORE : SW_SHOW); UpdateModality(); if (!window.overlay) SetForegroundWindow(hwnd); }
594
+ else if (method == "hide") { window.app.Hide(); UpdateModality(); }
595
+ else if (method == "minimize") ShowWindow(hwnd, SW_MINIMIZE);
596
+ else if (method == "maximize") ShowWindow(hwnd, SW_MAXIMIZE);
597
+ else if (method == "unmaximize") ShowWindow(hwnd, SW_RESTORE);
598
+ else throw winrt::hresult_invalid_argument(L"Unsupported window operation");
599
+ promise.Resolve("null");
600
+ } catch (winrt::hresult_error const &error) { promise.Reject(RNW::ReactError{"E_WINDOW", to_string(error.message())}); }
601
+ });
602
+ }
603
+ };
604
+ REACT_MODULE(SparkDesktopShortcuts, L"NativeDesktopShortcuts")
605
+ struct SparkDesktopShortcuts {
606
+ REACT_INIT(Initialize) void Initialize(winrt::Microsoft::ReactNative::ReactContext const &context) noexcept { if (context.Properties().Get(winrt::Microsoft::ReactNative::ReactPropertyId<bool>{L"Spark", L"SecondaryRuntime"}).value_or(false)) return; SparkWin::context = context; }
607
+ REACT_METHOD(addListener) void addListener(std::string) noexcept {}
608
+ REACT_METHOD(removeListeners) void removeListeners(double) noexcept {}
609
+ REACT_METHOD(call)
610
+ void call(std::string method, std::string encoded, winrt::Microsoft::ReactNative::ReactPromise<std::string> promise) noexcept {
611
+ SparkWin::context.UIDispatcher().Post([method, encoded, promise]() {
612
+ using namespace SparkWin;
613
+ try { auto args = Json::JsonObject::Parse(to_hstring(encoded)); auto id = to_string(args.GetNamedString(L"id"));
614
+ if (method == "remove") shortcuts.erase(id);
615
+ else if (method == "register") {
616
+ auto text = args.GetNamedString(L"key"); if (text.size() != 1) throw winrt::hresult_invalid_argument(L"Invalid shortcut");
617
+ wchar_t key = text[0]; UINT code = key >= 0xf704 && key <= 0xf717 ? VK_F1 + key - 0xf704 : key == 0xf700 ? VK_UP : key == 0xf701 ? VK_DOWN : key == 0xf702 ? VK_LEFT : key == 0xf703 ? VK_RIGHT : key == 0xf728 ? VK_DELETE : key == 0x7f ? VK_BACK : static_cast<UINT>(towupper(key));
618
+ shortcuts[id] = {id, to_string(args.GetNamedString(L"windowId", L"")), code, static_cast<int>(args.GetNamedNumber(L"modifiers")), args.GetNamedBoolean(L"repeat", false)};
619
+ } else throw winrt::hresult_invalid_argument(L"Unknown shortcut operation"); promise.Resolve("null");
620
+ } catch (winrt::hresult_error const &error) { promise.Reject(RNW::ReactError{"E_SHORTCUT", to_string(error.message())}); }
621
+ });
622
+ }
623
+ };
624
+ REACT_MODULE(SparkNativeMenu, L"NativeMenu")
625
+ struct SparkNativeMenu {
626
+ REACT_INIT(Initialize) void Initialize(winrt::Microsoft::ReactNative::ReactContext const &context) noexcept { if (context.Properties().Get(winrt::Microsoft::ReactNative::ReactPropertyId<bool>{L"Spark", L"SecondaryRuntime"}).value_or(false)) return; SparkWin::context = context; }
627
+ REACT_METHOD(addListener) void addListener(std::string) noexcept {}
628
+ REACT_METHOD(removeListeners) void removeListeners(double) noexcept {}
629
+ REACT_METHOD(configureMenus) void configureMenus(std::string owner, std::string json) noexcept { SparkWin::context.UIDispatcher().Post([owner, json]() { SparkWin::menuOwner = owner; SparkWin::menus = SparkWin::Json::JsonArray::Parse(winrt::to_hstring(json)); SparkWin::RebuildMenus(); }); }
630
+ REACT_METHOD(clearMenus) void clearMenus(std::string owner) noexcept { SparkWin::context.UIDispatcher().Post([owner]() { if (owner == SparkWin::menuOwner) { SparkWin::menus.Clear(); SparkWin::RebuildMenus(); } }); }
631
+ REACT_METHOD(clearAllMenus) void clearAllMenus() noexcept { clearMenus(SparkWin::menuOwner); }
632
+ REACT_METHOD(updateMenuItems) void updateMenuItems(std::string owner, std::string json) noexcept { SparkWin::context.UIDispatcher().Post([owner, json]() {
633
+ if (owner != SparkWin::menuOwner) return; auto patches = SparkWin::Json::JsonArray::Parse(winrt::to_hstring(json));
634
+ for (auto const &menu : SparkWin::menus) for (auto const &value : menu.GetObject().GetNamedArray(L"items")) for (auto const &patchValue : patches) { auto item = value.GetObject(), patch = patchValue.GetObject(); if (item.GetNamedString(L"id") == patch.GetNamedString(L"id")) for (auto const &pair : patch) item.SetNamedValue(pair.Key(), pair.Value()); }
635
+ SparkWin::RebuildMenus();
636
+ }); }
637
+ };
638
+
639
+ // Development clients never update themselves. Match the macOS development API
640
+ // without implying Windows standalone distribution is implemented.
641
+ REACT_MODULE(SparkDesktopUpdates, L"NativeDesktopUpdates")
642
+ struct SparkDesktopUpdates {
643
+ REACT_METHOD(call) void call(std::string method, std::string, winrt::Microsoft::ReactNative::ReactPromise<std::string> promise) noexcept {
644
+ if (method == "status") promise.Resolve(std::string("{\"available\":false,\"started\":false,\"canCheck\":false,\"automaticallyChecks\":false,\"reason\":\"") + (SparkWindowsEnv(L"SPARK_RUNTIME_MODE") == L"go" ? "go" : "development") + "\"}");
645
+ else promise.Reject(winrt::Microsoft::ReactNative::ReactError{"E_UPDATES_UNAVAILABLE", "Updates are unavailable in a development runtime"});
646
+ }
647
+ };