@zendir/ui 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (359) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/LICENSE +21 -0
  3. package/README.md +589 -0
  4. package/dist/index.d.ts +8 -0
  5. package/dist/index.js +421 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/react/3d/EarthViewer.d.ts +46 -0
  8. package/dist/react/3d/EarthViewer.js +836 -0
  9. package/dist/react/3d/EarthViewer.js.map +1 -0
  10. package/dist/react/3d/SolarSystemViewer.d.ts +43 -0
  11. package/dist/react/3d/SolarSystemViewer.js +372 -0
  12. package/dist/react/3d/SolarSystemViewer.js.map +1 -0
  13. package/dist/react/3d/ZenSpace3D.d.ts +16 -0
  14. package/dist/react/3d/ZenSpace3D.js +1253 -0
  15. package/dist/react/3d/ZenSpace3D.js.map +1 -0
  16. package/dist/react/3d/ZenSpace3DCesium.d.ts +9 -0
  17. package/dist/react/3d/ZenSpace3DCesium.js +186 -0
  18. package/dist/react/3d/ZenSpace3DCesium.js.map +1 -0
  19. package/dist/react/3d/ZenSpace3DShaders.d.ts +78 -0
  20. package/dist/react/3d/ZenSpace3DShaders.js +94 -0
  21. package/dist/react/3d/ZenSpace3DShaders.js.map +1 -0
  22. package/dist/react/3d/ZenSpace3DTypes.d.ts +614 -0
  23. package/dist/react/3d/ZenSpace3DUtils.d.ts +183 -0
  24. package/dist/react/3d/ZenSpace3DUtils.js +213 -0
  25. package/dist/react/3d/ZenSpace3DUtils.js.map +1 -0
  26. package/dist/react/3d/index.d.ts +23 -0
  27. package/dist/react/3d/threeLoader.d.ts +22 -0
  28. package/dist/react/3d/threeLoader.js +18 -0
  29. package/dist/react/3d/threeLoader.js.map +1 -0
  30. package/dist/react/astro/ClassificationBanner.d.ts +25 -0
  31. package/dist/react/astro/ClassificationBanner.js +83 -0
  32. package/dist/react/astro/ClassificationBanner.js.map +1 -0
  33. package/dist/react/astro/GlobalStatusBar.d.ts +42 -0
  34. package/dist/react/astro/GlobalStatusBar.js +165 -0
  35. package/dist/react/astro/GlobalStatusBar.js.map +1 -0
  36. package/dist/react/astro/MissionClock.d.ts +169 -0
  37. package/dist/react/astro/MissionClock.js +411 -0
  38. package/dist/react/astro/MissionClock.js.map +1 -0
  39. package/dist/react/astro/MonitoringIcon.d.ts +60 -0
  40. package/dist/react/astro/MonitoringIcon.js +369 -0
  41. package/dist/react/astro/MonitoringIcon.js.map +1 -0
  42. package/dist/react/astro/Notification.d.ts +42 -0
  43. package/dist/react/astro/Notification.js +156 -0
  44. package/dist/react/astro/Notification.js.map +1 -0
  45. package/dist/react/astro/Progress.d.ts +39 -0
  46. package/dist/react/astro/Progress.js +149 -0
  47. package/dist/react/astro/Progress.js.map +1 -0
  48. package/dist/react/astro/SimulationControls.d.ts +136 -0
  49. package/dist/react/astro/SimulationControls.js +668 -0
  50. package/dist/react/astro/SimulationControls.js.map +1 -0
  51. package/dist/react/astro/StatusIndicator.d.ts +34 -0
  52. package/dist/react/astro/StatusIndicator.js +189 -0
  53. package/dist/react/astro/StatusIndicator.js.map +1 -0
  54. package/dist/react/astro/UnifiedTimeline.d.ts +106 -0
  55. package/dist/react/astro/UnifiedTimeline.js +1768 -0
  56. package/dist/react/astro/UnifiedTimeline.js.map +1 -0
  57. package/dist/react/astro/index.d.ts +63 -0
  58. package/dist/react/cards/AccessCard.d.ts +37 -0
  59. package/dist/react/cards/AccessCard.js +410 -0
  60. package/dist/react/cards/AccessCard.js.map +1 -0
  61. package/dist/react/cards/OrbitCard.d.ts +31 -0
  62. package/dist/react/cards/OrbitCard.js +372 -0
  63. package/dist/react/cards/OrbitCard.js.map +1 -0
  64. package/dist/react/cards/SpacecraftCard.d.ts +54 -0
  65. package/dist/react/cards/SpacecraftCard.js +941 -0
  66. package/dist/react/cards/SpacecraftCard.js.map +1 -0
  67. package/dist/react/cards/TelemetryCard.d.ts +40 -0
  68. package/dist/react/cards/TelemetryCard.js +742 -0
  69. package/dist/react/cards/TelemetryCard.js.map +1 -0
  70. package/dist/react/cards/TelemetryStreamCard.d.ts +59 -0
  71. package/dist/react/cards/TelemetryStreamCard.js +309 -0
  72. package/dist/react/cards/TelemetryStreamCard.js.map +1 -0
  73. package/dist/react/cards/index.d.ts +13 -0
  74. package/dist/react/charts/GroundTrackMap.d.ts +112 -0
  75. package/dist/react/charts/GroundTrackMap.js +1123 -0
  76. package/dist/react/charts/GroundTrackMap.js.map +1 -0
  77. package/dist/react/charts/GroundTrackMapLeaflet.d.ts +26 -0
  78. package/dist/react/charts/GroundTrackMapLeaflet.js +571 -0
  79. package/dist/react/charts/GroundTrackMapLeaflet.js.map +1 -0
  80. package/dist/react/charts/groundTrackMapLeafletTiles.d.ts +22 -0
  81. package/dist/react/charts/groundTrackMapLeafletTiles.js +11 -0
  82. package/dist/react/charts/groundTrackMapLeafletTiles.js.map +1 -0
  83. package/dist/react/charts/groundTrackMapLeafletUtils.d.ts +24 -0
  84. package/dist/react/charts/groundTrackMapLeafletUtils.js +109 -0
  85. package/dist/react/charts/groundTrackMapLeafletUtils.js.map +1 -0
  86. package/dist/react/charts/index.d.ts +10 -0
  87. package/dist/react/charts/unified/AstroChart.d.ts +24 -0
  88. package/dist/react/charts/unified/AstroChart.js +1405 -0
  89. package/dist/react/charts/unified/AstroChart.js.map +1 -0
  90. package/dist/react/charts/unified/PowerOverviewChart.d.ts +73 -0
  91. package/dist/react/charts/unified/PowerOverviewChart.js +488 -0
  92. package/dist/react/charts/unified/PowerOverviewChart.js.map +1 -0
  93. package/dist/react/charts/unified/domain.d.ts +845 -0
  94. package/dist/react/charts/unified/domain.js +3168 -0
  95. package/dist/react/charts/unified/domain.js.map +1 -0
  96. package/dist/react/charts/unified/generators.d.ts +276 -0
  97. package/dist/react/charts/unified/generators.js +518 -0
  98. package/dist/react/charts/unified/generators.js.map +1 -0
  99. package/dist/react/charts/unified/index.d.ts +55 -0
  100. package/dist/react/charts/unified/presets.d.ts +290 -0
  101. package/dist/react/charts/unified/presets.js +999 -0
  102. package/dist/react/charts/unified/presets.js.map +1 -0
  103. package/dist/react/charts/unified/sync.d.ts +69 -0
  104. package/dist/react/charts/unified/sync.js +219 -0
  105. package/dist/react/charts/unified/sync.js.map +1 -0
  106. package/dist/react/charts/unified/theme.d.ts +447 -0
  107. package/dist/react/charts/unified/theme.js +562 -0
  108. package/dist/react/charts/unified/theme.js.map +1 -0
  109. package/dist/react/charts/unified/types.d.ts +826 -0
  110. package/dist/react/charts/unified/useChartStream.d.ts +58 -0
  111. package/dist/react/charts/unified/useChartStream.js +226 -0
  112. package/dist/react/charts/unified/useChartStream.js.map +1 -0
  113. package/dist/react/chatgpt/AppCard.d.ts +59 -0
  114. package/dist/react/chatgpt/AppCard.js +306 -0
  115. package/dist/react/chatgpt/AppCard.js.map +1 -0
  116. package/dist/react/chatgpt/ChatGPTCard.d.ts +6 -0
  117. package/dist/react/chatgpt/index.d.ts +167 -0
  118. package/dist/react/chatgpt/index.js +166 -0
  119. package/dist/react/chatgpt/index.js.map +1 -0
  120. package/dist/react/context/DisplaySettingsContext.d.ts +107 -0
  121. package/dist/react/context/DisplaySettingsContext.js +169 -0
  122. package/dist/react/context/DisplaySettingsContext.js.map +1 -0
  123. package/dist/react/context/index.d.ts +5 -0
  124. package/dist/react/core/ActivityPlanner.d.ts +45 -0
  125. package/dist/react/core/ActivityPlanner.js +532 -0
  126. package/dist/react/core/ActivityPlanner.js.map +1 -0
  127. package/dist/react/core/AppBar.d.ts +71 -0
  128. package/dist/react/core/AppBar.js +817 -0
  129. package/dist/react/core/AppBar.js.map +1 -0
  130. package/dist/react/core/AstroIcon.d.ts +84 -0
  131. package/dist/react/core/AstroIcon.js +1243 -0
  132. package/dist/react/core/AstroIcon.js.map +1 -0
  133. package/dist/react/core/Badge.d.ts +27 -0
  134. package/dist/react/core/Badge.js +134 -0
  135. package/dist/react/core/Badge.js.map +1 -0
  136. package/dist/react/core/Button.d.ts +26 -0
  137. package/dist/react/core/Button.js +306 -0
  138. package/dist/react/core/Button.js.map +1 -0
  139. package/dist/react/core/CardHeader.d.ts +34 -0
  140. package/dist/react/core/CardHeader.js +316 -0
  141. package/dist/react/core/CardHeader.js.map +1 -0
  142. package/dist/react/core/ChatPanel.d.ts +627 -0
  143. package/dist/react/core/ChatPanel.js +1144 -0
  144. package/dist/react/core/ChatPanel.js.map +1 -0
  145. package/dist/react/core/Checkbox.d.ts +26 -0
  146. package/dist/react/core/Checkbox.js +130 -0
  147. package/dist/react/core/Checkbox.js.map +1 -0
  148. package/dist/react/core/ColorPickerPanel.d.ts +25 -0
  149. package/dist/react/core/ColorPickerPanel.js +293 -0
  150. package/dist/react/core/ColorPickerPanel.js.map +1 -0
  151. package/dist/react/core/CommandBuilder.d.ts +74 -0
  152. package/dist/react/core/CommandBuilder.js +518 -0
  153. package/dist/react/core/CommandBuilder.js.map +1 -0
  154. package/dist/react/core/ConfirmDialog.d.ts +45 -0
  155. package/dist/react/core/ConfirmDialog.js +315 -0
  156. package/dist/react/core/ConfirmDialog.js.map +1 -0
  157. package/dist/react/core/ConnectionForm.d.ts +57 -0
  158. package/dist/react/core/ConnectionForm.js +496 -0
  159. package/dist/react/core/ConnectionForm.js.map +1 -0
  160. package/dist/react/core/Container.d.ts +51 -0
  161. package/dist/react/core/Container.js +670 -0
  162. package/dist/react/core/Container.js.map +1 -0
  163. package/dist/react/core/CopyButton.d.ts +39 -0
  164. package/dist/react/core/CopyButton.js +105 -0
  165. package/dist/react/core/CopyButton.js.map +1 -0
  166. package/dist/react/core/DataTable.d.ts +113 -0
  167. package/dist/react/core/DataTable.js +446 -0
  168. package/dist/react/core/DataTable.js.map +1 -0
  169. package/dist/react/core/DataValue.d.ts +64 -0
  170. package/dist/react/core/DataValue.js +545 -0
  171. package/dist/react/core/DataValue.js.map +1 -0
  172. package/dist/react/core/Dialog.d.ts +32 -0
  173. package/dist/react/core/Dialog.js +201 -0
  174. package/dist/react/core/Dialog.js.map +1 -0
  175. package/dist/react/core/FileExplorer.d.ts +65 -0
  176. package/dist/react/core/FileExplorer.js +520 -0
  177. package/dist/react/core/FileExplorer.js.map +1 -0
  178. package/dist/react/core/GlassCard.d.ts +129 -0
  179. package/dist/react/core/GlassCard.js +375 -0
  180. package/dist/react/core/GlassCard.js.map +1 -0
  181. package/dist/react/core/HeaderIconWithStatus.d.ts +39 -0
  182. package/dist/react/core/HeaderIconWithStatus.js +157 -0
  183. package/dist/react/core/HeaderIconWithStatus.js.map +1 -0
  184. package/dist/react/core/HexViewer.d.ts +143 -0
  185. package/dist/react/core/HexViewer.js +1106 -0
  186. package/dist/react/core/HexViewer.js.map +1 -0
  187. package/dist/react/core/Icon.d.ts +32 -0
  188. package/dist/react/core/Icon.js +142 -0
  189. package/dist/react/core/Icon.js.map +1 -0
  190. package/dist/react/core/ImageGallery.d.ts +41 -0
  191. package/dist/react/core/ImageGallery.js +320 -0
  192. package/dist/react/core/ImageGallery.js.map +1 -0
  193. package/dist/react/core/Input.d.ts +38 -0
  194. package/dist/react/core/Input.js +288 -0
  195. package/dist/react/core/Input.js.map +1 -0
  196. package/dist/react/core/LimitsBar.d.ts +51 -0
  197. package/dist/react/core/LimitsBar.js +200 -0
  198. package/dist/react/core/LimitsBar.js.map +1 -0
  199. package/dist/react/core/LogViewer.d.ts +61 -0
  200. package/dist/react/core/LogViewer.js +599 -0
  201. package/dist/react/core/LogViewer.js.map +1 -0
  202. package/dist/react/core/MessageStream.d.ts +58 -0
  203. package/dist/react/core/MessageStream.js +455 -0
  204. package/dist/react/core/MessageStream.js.map +1 -0
  205. package/dist/react/core/MissionCalendar.d.ts +81 -0
  206. package/dist/react/core/MissionCalendar.js +1049 -0
  207. package/dist/react/core/MissionCalendar.js.map +1 -0
  208. package/dist/react/core/NumberInput.d.ts +85 -0
  209. package/dist/react/core/NumberInput.js +507 -0
  210. package/dist/react/core/NumberInput.js.map +1 -0
  211. package/dist/react/core/PacketViewer.d.ts +73 -0
  212. package/dist/react/core/PacketViewer.js +431 -0
  213. package/dist/react/core/PacketViewer.js.map +1 -0
  214. package/dist/react/core/Pagination.d.ts +30 -0
  215. package/dist/react/core/Pagination.js +190 -0
  216. package/dist/react/core/Pagination.js.map +1 -0
  217. package/dist/react/core/PinInput.d.ts +41 -0
  218. package/dist/react/core/PinInput.js +210 -0
  219. package/dist/react/core/PinInput.js.map +1 -0
  220. package/dist/react/core/Popover.d.ts +55 -0
  221. package/dist/react/core/Popover.js +288 -0
  222. package/dist/react/core/Popover.js.map +1 -0
  223. package/dist/react/core/Select.d.ts +42 -0
  224. package/dist/react/core/Select.js +303 -0
  225. package/dist/react/core/Select.js.map +1 -0
  226. package/dist/react/core/SideNav.d.ts +103 -0
  227. package/dist/react/core/SideNav.js +551 -0
  228. package/dist/react/core/SideNav.js.map +1 -0
  229. package/dist/react/core/SidePanel.d.ts +33 -0
  230. package/dist/react/core/SidePanel.js +199 -0
  231. package/dist/react/core/SidePanel.js.map +1 -0
  232. package/dist/react/core/Tabs.d.ts +47 -0
  233. package/dist/react/core/Tabs.js +129 -0
  234. package/dist/react/core/Tabs.js.map +1 -0
  235. package/dist/react/core/Toast.d.ts +56 -0
  236. package/dist/react/core/Toast.js +229 -0
  237. package/dist/react/core/Toast.js.map +1 -0
  238. package/dist/react/core/Toggle.d.ts +22 -0
  239. package/dist/react/core/Toggle.js +151 -0
  240. package/dist/react/core/Toggle.js.map +1 -0
  241. package/dist/react/core/Tooltip.d.ts +19 -0
  242. package/dist/react/core/Tooltip.js +179 -0
  243. package/dist/react/core/Tooltip.js.map +1 -0
  244. package/dist/react/core/Typography.d.ts +127 -0
  245. package/dist/react/core/Typography.js +187 -0
  246. package/dist/react/core/Typography.js.map +1 -0
  247. package/dist/react/core/index.d.ts +108 -0
  248. package/dist/react/core/layout/Box.d.ts +77 -0
  249. package/dist/react/core/layout/Box.js +126 -0
  250. package/dist/react/core/layout/Box.js.map +1 -0
  251. package/dist/react/core/layout/Center.d.ts +20 -0
  252. package/dist/react/core/layout/Center.js +34 -0
  253. package/dist/react/core/layout/Center.js.map +1 -0
  254. package/dist/react/core/layout/Divider.d.ts +16 -0
  255. package/dist/react/core/layout/Divider.js +108 -0
  256. package/dist/react/core/layout/Divider.js.map +1 -0
  257. package/dist/react/core/layout/Flex.d.ts +30 -0
  258. package/dist/react/core/layout/Flex.js +128 -0
  259. package/dist/react/core/layout/Flex.js.map +1 -0
  260. package/dist/react/core/layout/Grid.d.ts +36 -0
  261. package/dist/react/core/layout/Grid.js +142 -0
  262. package/dist/react/core/layout/Grid.js.map +1 -0
  263. package/dist/react/core/layout/Spacer.d.ts +8 -0
  264. package/dist/react/core/layout/Spacer.js +31 -0
  265. package/dist/react/core/layout/Spacer.js.map +1 -0
  266. package/dist/react/core/layout/Stack.d.ts +54 -0
  267. package/dist/react/core/layout/Stack.js +74 -0
  268. package/dist/react/core/layout/Stack.js.map +1 -0
  269. package/dist/react/core/layout/index.d.ts +38 -0
  270. package/dist/react/core/layout/responsive.d.ts +23 -0
  271. package/dist/react/core/layout/responsive.js +26 -0
  272. package/dist/react/core/layout/responsive.js.map +1 -0
  273. package/dist/react/core/layout/useBreakpoint.d.ts +77 -0
  274. package/dist/react/core/layout/useBreakpoint.js +73 -0
  275. package/dist/react/core/layout/useBreakpoint.js.map +1 -0
  276. package/dist/react/core/propertyConfig.d.ts +443 -0
  277. package/dist/react/core/propertyConfig.js +399 -0
  278. package/dist/react/core/propertyConfig.js.map +1 -0
  279. package/dist/react/hooks/index.d.ts +21 -0
  280. package/dist/react/hooks/useAccessWindows.d.ts +66 -0
  281. package/dist/react/hooks/useCompactMode.d.ts +82 -0
  282. package/dist/react/hooks/useCompactMode.js +62 -0
  283. package/dist/react/hooks/useCompactMode.js.map +1 -0
  284. package/dist/react/hooks/useLiveSelection.d.ts +57 -0
  285. package/dist/react/hooks/useSimulationPlayback.d.ts +97 -0
  286. package/dist/react/hooks/useSimulationTime.d.ts +61 -0
  287. package/dist/react/hooks/useSpacecraftPosition.d.ts +50 -0
  288. package/dist/react/hooks/useSpacecraftPosition.js +89 -0
  289. package/dist/react/hooks/useSpacecraftPosition.js.map +1 -0
  290. package/dist/react/hooks/useTelemetry.d.ts +55 -0
  291. package/dist/react/hooks/useTelemetry.js +73 -0
  292. package/dist/react/hooks/useTelemetry.js.map +1 -0
  293. package/dist/react/hooks/useZendirSession.d.ts +109 -0
  294. package/dist/react/hooks/useZendirSession.js +148 -0
  295. package/dist/react/hooks/useZendirSession.js.map +1 -0
  296. package/dist/react/index.d.ts +74 -0
  297. package/dist/react/shared/ErrorBoundary.d.ts +63 -0
  298. package/dist/react/shared/ErrorBoundary.js +142 -0
  299. package/dist/react/shared/ErrorBoundary.js.map +1 -0
  300. package/dist/react/shared/Skeleton.d.ts +110 -0
  301. package/dist/react/shared/Skeleton.js +324 -0
  302. package/dist/react/shared/Skeleton.js.map +1 -0
  303. package/dist/react/shared/index.d.ts +12 -0
  304. package/dist/react/theme/ThemeProvider.d.ts +385 -0
  305. package/dist/react/theme/ThemeProvider.js +1096 -0
  306. package/dist/react/theme/ThemeProvider.js.map +1 -0
  307. package/dist/react/theme/astro-tokens.d.ts +153 -0
  308. package/dist/react/theme/cardAccent.d.ts +75 -0
  309. package/dist/react/theme/cardAccent.js +137 -0
  310. package/dist/react/theme/cardAccent.js.map +1 -0
  311. package/dist/react/theme/config.d.ts +39 -0
  312. package/dist/react/theme/index.d.ts +9 -0
  313. package/dist/react/types.d.ts +360 -0
  314. package/dist/react/types.js +58 -0
  315. package/dist/react/types.js.map +1 -0
  316. package/dist/react/utils/index.d.ts +247 -0
  317. package/dist/react/utils/index.js +423 -0
  318. package/dist/react/utils/index.js.map +1 -0
  319. package/dist/react/visualizations/EclipseTimerCard.d.ts +17 -0
  320. package/dist/react/visualizations/EclipseTimerCard.js +250 -0
  321. package/dist/react/visualizations/EclipseTimerCard.js.map +1 -0
  322. package/dist/react/visualizations/LinkBudgetCard.d.ts +50 -0
  323. package/dist/react/visualizations/LinkBudgetCard.js +444 -0
  324. package/dist/react/visualizations/LinkBudgetCard.js.map +1 -0
  325. package/dist/react/visualizations/NavBallCard.d.ts +17 -0
  326. package/dist/react/visualizations/NavBallCard.js +243 -0
  327. package/dist/react/visualizations/NavBallCard.js.map +1 -0
  328. package/dist/react/visualizations/PropulsionCard.d.ts +37 -0
  329. package/dist/react/visualizations/PropulsionCard.js +298 -0
  330. package/dist/react/visualizations/PropulsionCard.js.map +1 -0
  331. package/dist/react/visualizations/SensorFootprintCard.d.ts +33 -0
  332. package/dist/react/visualizations/SensorFootprintCard.js +326 -0
  333. package/dist/react/visualizations/SensorFootprintCard.js.map +1 -0
  334. package/dist/react/visualizations/ThermalHeatmapCard.d.ts +38 -0
  335. package/dist/react/visualizations/ThermalHeatmapCard.js +372 -0
  336. package/dist/react/visualizations/ThermalHeatmapCard.js.map +1 -0
  337. package/dist/react/visualizations/index.d.ts +17 -0
  338. package/dist/react.d.ts +1 -0
  339. package/dist/react.js +421 -0
  340. package/dist/react.js.map +1 -0
  341. package/dist/shaders/atmosphere.frag.js +5 -0
  342. package/dist/shaders/atmosphere.frag.js.map +1 -0
  343. package/dist/shaders/atmosphere.vert.js +5 -0
  344. package/dist/shaders/atmosphere.vert.js.map +1 -0
  345. package/dist/shaders/stars.frag.js +5 -0
  346. package/dist/shaders/stars.frag.js.map +1 -0
  347. package/dist/shaders/stars.vert.js +5 -0
  348. package/dist/shaders/stars.vert.js.map +1 -0
  349. package/dist/style.css +143 -0
  350. package/dist/tokens/index.d.ts +296 -0
  351. package/dist/tokens/index.js +263 -0
  352. package/dist/tokens/index.js.map +1 -0
  353. package/dist/tokens/tokens.css +155 -0
  354. package/dist/types/index.d.ts +23 -0
  355. package/dist/types.d.ts +1 -0
  356. package/dist/types.js +2 -0
  357. package/dist/types.js.map +1 -0
  358. package/package.json +220 -0
  359. package/sdk-stub.js +22 -0
@@ -0,0 +1,166 @@
1
+ import { useState, useCallback, useEffect, useSyncExternalStore } from "react";
2
+ const SET_GLOBALS_EVENT_TYPE = "openai:set_globals";
3
+ function useOpenAiGlobal(key) {
4
+ const getSnapshot = useCallback(() => {
5
+ var _a;
6
+ return (_a = window.openai) == null ? void 0 : _a[key];
7
+ }, [key]);
8
+ const subscribe = useCallback((onChange) => {
9
+ const handleSetGlobal = (event) => {
10
+ var _a, _b;
11
+ const customEvent = event;
12
+ if (((_b = (_a = customEvent.detail) == null ? void 0 : _a.globals) == null ? void 0 : _b[key]) !== void 0) {
13
+ onChange();
14
+ }
15
+ };
16
+ window.addEventListener(SET_GLOBALS_EVENT_TYPE, handleSetGlobal, { passive: true });
17
+ return () => window.removeEventListener(SET_GLOBALS_EVENT_TYPE, handleSetGlobal);
18
+ }, [key]);
19
+ return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
20
+ }
21
+ function useWidgetState(defaultState) {
22
+ const widgetStateFromWindow = useOpenAiGlobal("widgetState");
23
+ const [widgetState, _setWidgetState] = useState(() => {
24
+ if (widgetStateFromWindow != null) {
25
+ return widgetStateFromWindow;
26
+ }
27
+ return typeof defaultState === "function" ? defaultState() : defaultState;
28
+ });
29
+ useEffect(() => {
30
+ if (widgetStateFromWindow != null) {
31
+ _setWidgetState(widgetStateFromWindow);
32
+ }
33
+ }, [widgetStateFromWindow]);
34
+ const setWidgetState = useCallback((state) => {
35
+ _setWidgetState((prevState) => {
36
+ var _a, _b;
37
+ const newState = typeof state === "function" ? state(prevState) : state;
38
+ (_b = (_a = window.openai) == null ? void 0 : _a.setWidgetState) == null ? void 0 : _b.call(_a, newState);
39
+ return newState;
40
+ });
41
+ }, []);
42
+ return [widgetState, setWidgetState];
43
+ }
44
+ function useToolOutput() {
45
+ return useOpenAiGlobal("toolOutput");
46
+ }
47
+ function useToolInput() {
48
+ return useOpenAiGlobal("toolInput");
49
+ }
50
+ function useChatGPTTheme() {
51
+ const theme = useOpenAiGlobal("theme") ?? "dark";
52
+ const isDark = theme === "dark";
53
+ return {
54
+ theme,
55
+ isDark,
56
+ colors: isDark ? {
57
+ background: "#09090b",
58
+ surface: "#18181b",
59
+ surfaceHover: "#27272a",
60
+ border: "#3f3f46",
61
+ text: "#fafafa",
62
+ textMuted: "#a1a1aa",
63
+ accent: "#22d3ee"
64
+ } : {
65
+ background: "#ffffff",
66
+ surface: "#f4f4f5",
67
+ surfaceHover: "#e4e4e7",
68
+ border: "#d4d4d8",
69
+ text: "#18181b",
70
+ textMuted: "#636370",
71
+ // WCAG AA: 5.90:1 on #fff, 5.39:1 on #f4f4f5, 4.66:1 on #e4e4e7 (was #71717a → 4.49:1 FAIL on surface)
72
+ accent: "#0ea5e9"
73
+ }
74
+ };
75
+ }
76
+ function useLocale() {
77
+ return useOpenAiGlobal("locale") ?? "en-US";
78
+ }
79
+ function useDisplayMode() {
80
+ const mode = useOpenAiGlobal("displayMode") ?? "inline";
81
+ const maxHeight = useOpenAiGlobal("maxHeight");
82
+ const requestMode = useCallback(async (newMode) => {
83
+ var _a, _b;
84
+ await ((_b = (_a = window.openai) == null ? void 0 : _a.requestDisplayMode) == null ? void 0 : _b.call(_a, { mode: newMode }));
85
+ }, []);
86
+ const close = useCallback(() => {
87
+ var _a, _b;
88
+ (_b = (_a = window.openai) == null ? void 0 : _a.requestClose) == null ? void 0 : _b.call(_a);
89
+ }, []);
90
+ return { mode, maxHeight, requestMode, close };
91
+ }
92
+ function useCallTool() {
93
+ const [isLoading, setIsLoading] = useState(false);
94
+ const [error, setError] = useState(null);
95
+ const callTool = useCallback(async (name, args) => {
96
+ var _a;
97
+ if (!((_a = window.openai) == null ? void 0 : _a.callTool)) {
98
+ throw new Error("window.openai.callTool not available");
99
+ }
100
+ setIsLoading(true);
101
+ setError(null);
102
+ try {
103
+ const result = await window.openai.callTool(name, args);
104
+ return result;
105
+ } catch (err) {
106
+ const error2 = err instanceof Error ? err : new Error(String(err));
107
+ setError(error2);
108
+ throw error2;
109
+ } finally {
110
+ setIsLoading(false);
111
+ }
112
+ }, []);
113
+ return { callTool, isLoading, error };
114
+ }
115
+ function useSendMessage() {
116
+ return useCallback(async (prompt) => {
117
+ var _a, _b;
118
+ await ((_b = (_a = window.openai) == null ? void 0 : _a.sendFollowUpMessage) == null ? void 0 : _b.call(_a, { prompt }));
119
+ }, []);
120
+ }
121
+ function useIntrinsicHeight(_ref) {
122
+ }
123
+ function useMaxHeight() {
124
+ const [maxHeight, setMaxHeight] = useState(
125
+ () => {
126
+ var _a;
127
+ return (_a = window.openai) == null ? void 0 : _a.maxHeight;
128
+ }
129
+ );
130
+ useEffect(() => {
131
+ const handler = (event) => {
132
+ var _a;
133
+ if (((_a = event.detail) == null ? void 0 : _a.globals) && "maxHeight" in event.detail.globals) {
134
+ setMaxHeight(event.detail.globals.maxHeight);
135
+ }
136
+ };
137
+ window.addEventListener("openai:set_globals", handler);
138
+ return () => window.removeEventListener("openai:set_globals", handler);
139
+ }, []);
140
+ return maxHeight;
141
+ }
142
+ function useOpenExternal() {
143
+ return useCallback((href) => {
144
+ var _a, _b;
145
+ (_b = (_a = window.openai) == null ? void 0 : _a.openExternal) == null ? void 0 : _b.call(_a, { href });
146
+ }, []);
147
+ }
148
+ function isInChatGPT() {
149
+ return typeof window !== "undefined" && window.openai !== void 0;
150
+ }
151
+ export {
152
+ isInChatGPT,
153
+ useCallTool,
154
+ useChatGPTTheme,
155
+ useDisplayMode,
156
+ useIntrinsicHeight,
157
+ useLocale,
158
+ useMaxHeight,
159
+ useOpenAiGlobal,
160
+ useOpenExternal,
161
+ useSendMessage,
162
+ useToolInput,
163
+ useToolOutput,
164
+ useWidgetState
165
+ };
166
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../src/react/chatgpt/index.ts"],"sourcesContent":["/**\n * ChatGPT Apps SDK Integration\n * \n * Hooks and utilities for integrating Zendir UI components with ChatGPT's\n * window.openai API. Based on: https://developers.openai.com/apps-sdk/build/chatgpt-ui/\n * \n * Key capabilities:\n * - window.openai.toolInput / toolOutput - Tool data from MCP server\n * - window.openai.widgetState / setWidgetState - Persistent UI state\n * - window.openai.callTool - Invoke other MCP tools from widget\n * - window.openai.sendFollowUpMessage - Insert user messages\n * - window.openai.theme - Light/dark theme detection\n * - window.openai.locale - Localization\n * - window.openai.requestDisplayMode - Fullscreen/PiP modes\n * - window.openai.notifyIntrinsicHeight - Dynamic height reporting\n */\n\nimport { useState, useEffect, useCallback, useSyncExternalStore } from 'react';\n\n// ============================================================================\n// Type Definitions\n// ============================================================================\n\nexport interface OpenAiGlobals {\n /** Arguments supplied when the tool was invoked */\n toolInput?: Record<string, unknown>;\n /** Your structuredContent - the model reads this */\n toolOutput?: Record<string, unknown>;\n /** Metadata payload - only widget sees it */\n toolResponseMetadata?: Record<string, unknown>;\n /** Snapshot of UI state persisted between renders */\n widgetState?: Record<string, unknown>;\n /** Current theme */\n theme?: 'light' | 'dark';\n /** Current locale (e.g., 'en-US') */\n locale?: string;\n /** Display mode */\n displayMode?: 'inline' | 'pip' | 'fullscreen';\n /** Maximum allowed height */\n maxHeight?: number;\n /** View type */\n view?: 'conversation' | 'modal';\n /** User agent info */\n userAgent?: string;\n /** Safe area insets */\n safeArea?: { top: number; bottom: number; left: number; right: number };\n \n // API Methods\n setWidgetState?: (state: Record<string, unknown>) => void;\n callTool?: (name: string, args: Record<string, unknown>) => Promise<unknown>;\n sendFollowUpMessage?: (options: { prompt: string }) => Promise<void>;\n uploadFile?: (file: File) => Promise<{ fileId: string }>;\n getFileDownloadUrl?: (options: { fileId: string }) => Promise<{ downloadUrl: string }>;\n requestDisplayMode?: (options: { mode: 'inline' | 'pip' | 'fullscreen' }) => Promise<void>;\n requestModal?: (options: unknown) => Promise<void>;\n notifyIntrinsicHeight?: (height: number) => void;\n openExternal?: (options: { href: string }) => void;\n requestClose?: () => void;\n}\n\ndeclare global {\n interface Window {\n openai?: OpenAiGlobals;\n }\n}\n\n// ============================================================================\n// Core Hook: useOpenAiGlobal\n// ============================================================================\n\nconst SET_GLOBALS_EVENT_TYPE = 'openai:set_globals';\n\ninterface SetGlobalsEvent extends CustomEvent {\n detail: { globals: Partial<OpenAiGlobals> };\n}\n\n/**\n * Subscribe to a specific window.openai global value\n */\nexport function useOpenAiGlobal<K extends keyof OpenAiGlobals>(key: K): OpenAiGlobals[K] {\n const getSnapshot = useCallback(() => {\n return window.openai?.[key];\n }, [key]);\n\n const subscribe = useCallback((onChange: () => void) => {\n const handleSetGlobal = (event: Event) => {\n const customEvent = event as SetGlobalsEvent;\n if (customEvent.detail?.globals?.[key] !== undefined) {\n onChange();\n }\n };\n\n window.addEventListener(SET_GLOBALS_EVENT_TYPE, handleSetGlobal, { passive: true });\n return () => window.removeEventListener(SET_GLOBALS_EVENT_TYPE, handleSetGlobal);\n }, [key]);\n\n return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n}\n\n// ============================================================================\n// Widget State Hook\n// ============================================================================\n\ntype SetStateAction<T> = T | ((prevState: T) => T);\n\n/**\n * Manage widget state that persists across renders via window.openai.setWidgetState\n */\nexport function useWidgetState<T extends Record<string, unknown>>(\n defaultState: T | (() => T)\n): readonly [T, (state: SetStateAction<T>) => void] {\n const widgetStateFromWindow = useOpenAiGlobal('widgetState') as T | undefined;\n\n const [widgetState, _setWidgetState] = useState<T>(() => {\n if (widgetStateFromWindow != null) {\n return widgetStateFromWindow;\n }\n return typeof defaultState === 'function' ? (defaultState as () => T)() : defaultState;\n });\n\n useEffect(() => {\n if (widgetStateFromWindow != null) {\n _setWidgetState(widgetStateFromWindow);\n }\n }, [widgetStateFromWindow]);\n\n const setWidgetState = useCallback((state: SetStateAction<T>) => {\n _setWidgetState((prevState: T) => {\n const newState = typeof state === 'function' ? (state as (p: T) => T)(prevState) : state;\n window.openai?.setWidgetState?.(newState);\n return newState;\n });\n }, []);\n\n return [widgetState, setWidgetState] as const;\n}\n\n// ============================================================================\n// Tool Output Hook\n// ============================================================================\n\n/**\n * Read the tool output (structuredContent) from the MCP server response\n */\nexport function useToolOutput<T = Record<string, unknown>>(): T | undefined {\n return useOpenAiGlobal('toolOutput') as T | undefined;\n}\n\n/**\n * Read the tool input (arguments) from the tool invocation\n */\nexport function useToolInput<T = Record<string, unknown>>(): T | undefined {\n return useOpenAiGlobal('toolInput') as T | undefined;\n}\n\n// ============================================================================\n// Theme Hook\n// ============================================================================\n\nexport type ThemeMode = 'light' | 'dark';\n\n/**\n * Get current ChatGPT theme and provide CSS-friendly values\n * Named useChatGPTTheme to avoid conflict with the core useTheme from ThemeProvider\n */\nexport function useChatGPTTheme(): {\n theme: ThemeMode;\n isDark: boolean;\n colors: {\n background: string;\n surface: string;\n surfaceHover: string;\n border: string;\n text: string;\n textMuted: string;\n accent: string;\n };\n} {\n const theme = useOpenAiGlobal('theme') ?? 'dark';\n const isDark = theme === 'dark';\n\n return {\n theme,\n isDark,\n colors: isDark ? {\n background: '#09090b',\n surface: '#18181b',\n surfaceHover: '#27272a',\n border: '#3f3f46',\n text: '#fafafa',\n textMuted: '#a1a1aa',\n accent: '#22d3ee',\n } : {\n background: '#ffffff',\n surface: '#f4f4f5',\n surfaceHover: '#e4e4e7',\n border: '#d4d4d8',\n text: '#18181b',\n textMuted: '#636370', // WCAG AA: 5.90:1 on #fff, 5.39:1 on #f4f4f5, 4.66:1 on #e4e4e7 (was #71717a → 4.49:1 FAIL on surface)\n accent: '#0ea5e9',\n },\n };\n}\n\n// ============================================================================\n// Locale Hook\n// ============================================================================\n\n/**\n * Get current locale for internationalization\n */\nexport function useLocale(): string {\n return useOpenAiGlobal('locale') ?? 'en-US';\n}\n\n// ============================================================================\n// Display Mode Hook\n// ============================================================================\n\n/**\n * Manage widget display mode (inline, PiP, fullscreen)\n */\nexport function useDisplayMode(): {\n mode: 'inline' | 'pip' | 'fullscreen';\n maxHeight?: number;\n requestMode: (mode: 'inline' | 'pip' | 'fullscreen') => Promise<void>;\n close: () => void;\n} {\n const mode = useOpenAiGlobal('displayMode') ?? 'inline';\n const maxHeight = useOpenAiGlobal('maxHeight');\n\n const requestMode = useCallback(async (newMode: 'inline' | 'pip' | 'fullscreen') => {\n await window.openai?.requestDisplayMode?.({ mode: newMode });\n }, []);\n\n const close = useCallback(() => {\n window.openai?.requestClose?.();\n }, []);\n\n return { mode, maxHeight, requestMode, close };\n}\n\n// ============================================================================\n// Tool Calling Hook\n// ============================================================================\n\n/**\n * Call another MCP tool from within a widget\n */\nexport function useCallTool(): {\n callTool: <T = unknown>(name: string, args: Record<string, unknown>) => Promise<T>;\n isLoading: boolean;\n error: Error | null;\n} {\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const callTool = useCallback(async <T = unknown>(\n name: string,\n args: Record<string, unknown>\n ): Promise<T> => {\n if (!window.openai?.callTool) {\n throw new Error('window.openai.callTool not available');\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await window.openai.callTool(name, args);\n return result as T;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n }, []);\n\n return { callTool, isLoading, error };\n}\n\n// ============================================================================\n// Follow-up Message Hook\n// ============================================================================\n\n/**\n * Send a follow-up message as if the user asked it\n */\nexport function useSendMessage(): (prompt: string) => Promise<void> {\n return useCallback(async (prompt: string) => {\n await window.openai?.sendFollowUpMessage?.({ prompt });\n }, []);\n}\n\n// ============================================================================\n// Dynamic Height Hook\n// ============================================================================\n\n/**\n * DEPRECATED: Do not use notifyIntrinsicHeight!\n * \n * According to OpenAI Apps SDK examples (via DeepWiki), the correct pattern is:\n * - The HOST provides maxHeight via window.openai.maxHeight\n * - Widgets READ this and constrain themselves\n * - Widgets NEVER report height back to the host\n * \n * Calling notifyIntrinsicHeight causes infinite resize loops in MCPJam sandbox\n * because the sandbox responds by resizing the container, which triggers another\n * resize event.\n * \n * Use useMaxHeight() instead to get the host's height constraint.\n * \n * @deprecated Use useMaxHeight() instead\n */\nexport function useIntrinsicHeight(_ref: { current: HTMLElement | null }): void {\n // NO-OP: Do not call notifyIntrinsicHeight - it causes infinite loops\n // The host provides maxHeight, widgets should not report height back\n}\n\n/**\n * Get the maximum height available for the widget from the host environment.\n * This is the CORRECT pattern per OpenAI Apps SDK examples.\n * \n * The host (ChatGPT/MCPJam) provides maxHeight, and widgets should constrain\n * themselves to this height. Widgets should NOT report their height back.\n * \n * @returns The maximum height in pixels, or undefined if not available\n */\nexport function useMaxHeight(): number | undefined {\n const [maxHeight, setMaxHeight] = useState<number | undefined>(\n () => window.openai?.maxHeight\n );\n \n useEffect(() => {\n const handler = (event: CustomEvent) => {\n if (event.detail?.globals && 'maxHeight' in event.detail.globals) {\n setMaxHeight(event.detail.globals.maxHeight);\n }\n };\n \n window.addEventListener('openai:set_globals', handler as EventListener);\n return () => window.removeEventListener('openai:set_globals', handler as EventListener);\n }, []);\n \n return maxHeight;\n}\n\n// ============================================================================\n// External Link Hook\n// ============================================================================\n\n/**\n * Open vetted external links in the user's browser\n */\nexport function useOpenExternal(): (href: string) => void {\n return useCallback((href: string) => {\n window.openai?.openExternal?.({ href });\n }, []);\n}\n\n// ============================================================================\n// Utility: Check if running in ChatGPT\n// ============================================================================\n\nexport function isInChatGPT(): boolean {\n return typeof window !== 'undefined' && window.openai !== undefined;\n}\n\n// ============================================================================\n// Re-exports (types are already exported above)\n// ============================================================================\n\n"],"names":["error"],"mappings":"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"}
@@ -0,0 +1,107 @@
1
+ import { default as React, ReactNode } from 'react';
2
+
3
+ export type ColorTarget = 'both' | 'accent' | 'glass';
4
+ export interface DisplaySettings {
5
+ /** Global compact mode - affects all cards */
6
+ compactMode: boolean;
7
+ /** Accent color for cards and UI elements */
8
+ accentColor: string;
9
+ /** Glass tint color for transparent themes */
10
+ glassTint: string;
11
+ /** Which color setting to apply: both, accent-only, or glass-only */
12
+ colorTarget: ColorTarget;
13
+ /** Enable accent-colored borders on cards (for transparent themes) */
14
+ accentBorders: boolean;
15
+ }
16
+ export interface DisplaySettingsContextValue extends DisplaySettings {
17
+ /** Set compact mode on/off */
18
+ setCompactMode: (value: boolean) => void;
19
+ /** Toggle compact mode */
20
+ toggleCompactMode: () => void;
21
+ /** Set accent color */
22
+ setAccentColor: (color: string) => void;
23
+ /** Set glass tint color */
24
+ setGlassTint: (color: string) => void;
25
+ /** Set which color setting to apply */
26
+ setColorTarget: (target: ColorTarget) => void;
27
+ /** Set a color that applies based on current target */
28
+ setColor: (color: string) => void;
29
+ /** Set accent borders on/off */
30
+ setAccentBorders: (value: boolean) => void;
31
+ /** Toggle accent borders */
32
+ toggleAccentBorders: () => void;
33
+ /** Reset all settings to defaults */
34
+ resetSettings: () => void;
35
+ }
36
+ export declare const PRESET_COLORS: {
37
+ readonly purple: "#8b5cf6";
38
+ readonly blue: "#3b82f6";
39
+ readonly cyan: "#06b6d4";
40
+ readonly teal: "#14b8a6";
41
+ readonly green: "#10b981";
42
+ readonly lime: "#84cc16";
43
+ readonly amber: "#f59e0b";
44
+ readonly orange: "#f97316";
45
+ readonly pink: "#ec4899";
46
+ readonly red: "#ef4444";
47
+ readonly slate: "#64748b";
48
+ };
49
+ export declare const GLASS_TINTS: {
50
+ readonly clear: "rgba(255,255,255,0.05)";
51
+ readonly dark: "rgba(0,0,0,0.3)";
52
+ readonly purple: "#8b5cf6";
53
+ readonly blue: "#3b82f6";
54
+ readonly cyan: "#06b6d4";
55
+ readonly teal: "#14b8a6";
56
+ readonly green: "#10b981";
57
+ readonly lime: "#84cc16";
58
+ readonly amber: "#f59e0b";
59
+ readonly orange: "#f97316";
60
+ readonly pink: "#ec4899";
61
+ readonly red: "#ef4444";
62
+ readonly slate: "#64748b";
63
+ };
64
+ export type PresetColorKey = keyof typeof PRESET_COLORS;
65
+ export type GlassTintKey = keyof typeof GLASS_TINTS;
66
+ export interface DisplaySettingsProviderProps {
67
+ children: ReactNode;
68
+ /** Initial compact mode state */
69
+ defaultCompactMode?: boolean;
70
+ /** Initial accent color */
71
+ defaultAccentColor?: string;
72
+ /** Initial glass tint color */
73
+ defaultGlassTint?: string;
74
+ /** Initial color target */
75
+ defaultColorTarget?: ColorTarget;
76
+ /** Initial accent borders state */
77
+ defaultAccentBorders?: boolean;
78
+ /** Enable localStorage persistence (default: true) */
79
+ persist?: boolean;
80
+ }
81
+ export declare function DisplaySettingsProvider({ children, defaultCompactMode, defaultAccentColor, defaultGlassTint, defaultColorTarget, defaultAccentBorders, persist, }: DisplaySettingsProviderProps): React.ReactElement;
82
+ /**
83
+ * Access display settings context
84
+ * Must be used within a DisplaySettingsProvider
85
+ */
86
+ export declare function useDisplaySettings(): DisplaySettingsContextValue;
87
+ /**
88
+ * Optional hook that returns null if not within provider
89
+ * Useful for components that should work with or without the provider
90
+ */
91
+ export declare function useDisplaySettingsOptional(): DisplaySettingsContextValue | null;
92
+ /**
93
+ * Get effective compact mode value
94
+ * Priority: explicit prop > context value > default (false)
95
+ */
96
+ export declare function getEffectiveCompactMode(propValue: boolean | undefined, contextValue: boolean | undefined): boolean;
97
+ /**
98
+ * Get effective accent borders value
99
+ * Priority: explicit prop > context value > default (true)
100
+ */
101
+ export declare function getEffectiveAccentBorders(propValue: boolean | undefined, contextValue: boolean | undefined): boolean;
102
+ /**
103
+ * Hook to get card border style based on accentBorders setting
104
+ * Returns the appropriate border style for transparent themes
105
+ */
106
+ export declare function useCardBorderStyle(tokens: any, isTransparentTheme: boolean): React.CSSProperties;
107
+ export default DisplaySettingsProvider;
@@ -0,0 +1,169 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { useState, useEffect, useCallback, useMemo, useContext, createContext } from "react";
3
+ const PRESET_COLORS = {
4
+ purple: "#8b5cf6",
5
+ blue: "#3b82f6",
6
+ cyan: "#06b6d4",
7
+ teal: "#14b8a6",
8
+ green: "#10b981",
9
+ lime: "#84cc16",
10
+ amber: "#f59e0b",
11
+ orange: "#f97316",
12
+ pink: "#ec4899",
13
+ red: "#ef4444",
14
+ slate: "#64748b"
15
+ };
16
+ const GLASS_TINTS = {
17
+ ...PRESET_COLORS,
18
+ clear: "rgba(255,255,255,0.05)",
19
+ dark: "rgba(0,0,0,0.3)"
20
+ };
21
+ const DEFAULT_SETTINGS = {
22
+ compactMode: false,
23
+ accentColor: PRESET_COLORS.purple,
24
+ glassTint: PRESET_COLORS.purple,
25
+ colorTarget: "both",
26
+ accentBorders: true
27
+ };
28
+ const STORAGE_KEY = "zendir-display-settings";
29
+ const DisplaySettingsContext = createContext(null);
30
+ function DisplaySettingsProvider({
31
+ children,
32
+ defaultCompactMode,
33
+ defaultAccentColor,
34
+ defaultGlassTint,
35
+ defaultColorTarget,
36
+ defaultAccentBorders,
37
+ persist = true
38
+ }) {
39
+ const [settings, setSettings] = useState(() => {
40
+ if (persist && typeof window !== "undefined") {
41
+ try {
42
+ const stored = localStorage.getItem(STORAGE_KEY);
43
+ if (stored) {
44
+ const parsed = JSON.parse(stored);
45
+ return {
46
+ compactMode: parsed.compactMode ?? defaultCompactMode ?? DEFAULT_SETTINGS.compactMode,
47
+ accentColor: parsed.accentColor ?? defaultAccentColor ?? DEFAULT_SETTINGS.accentColor,
48
+ glassTint: parsed.glassTint ?? defaultGlassTint ?? DEFAULT_SETTINGS.glassTint,
49
+ colorTarget: parsed.colorTarget ?? defaultColorTarget ?? DEFAULT_SETTINGS.colorTarget,
50
+ accentBorders: parsed.accentBorders ?? defaultAccentBorders ?? DEFAULT_SETTINGS.accentBorders
51
+ };
52
+ }
53
+ } catch {
54
+ }
55
+ }
56
+ return {
57
+ compactMode: defaultCompactMode ?? DEFAULT_SETTINGS.compactMode,
58
+ accentColor: defaultAccentColor ?? DEFAULT_SETTINGS.accentColor,
59
+ glassTint: defaultGlassTint ?? DEFAULT_SETTINGS.glassTint,
60
+ colorTarget: defaultColorTarget ?? DEFAULT_SETTINGS.colorTarget,
61
+ accentBorders: defaultAccentBorders ?? DEFAULT_SETTINGS.accentBorders
62
+ };
63
+ });
64
+ useEffect(() => {
65
+ if (persist && typeof window !== "undefined") {
66
+ try {
67
+ localStorage.setItem(STORAGE_KEY, JSON.stringify(settings));
68
+ } catch {
69
+ }
70
+ }
71
+ }, [settings, persist]);
72
+ const setCompactMode = useCallback((value2) => {
73
+ setSettings((prev) => ({ ...prev, compactMode: value2 }));
74
+ }, []);
75
+ const toggleCompactMode = useCallback(() => {
76
+ setSettings((prev) => ({ ...prev, compactMode: !prev.compactMode }));
77
+ }, []);
78
+ const setAccentColor = useCallback((color) => {
79
+ setSettings((prev) => ({ ...prev, accentColor: color }));
80
+ }, []);
81
+ const setGlassTint = useCallback((color) => {
82
+ setSettings((prev) => ({ ...prev, glassTint: color }));
83
+ }, []);
84
+ const setColorTarget = useCallback((target) => {
85
+ setSettings((prev) => ({ ...prev, colorTarget: target }));
86
+ }, []);
87
+ const setColor = useCallback((color) => {
88
+ setSettings((prev) => {
89
+ switch (prev.colorTarget) {
90
+ case "accent":
91
+ return { ...prev, accentColor: color };
92
+ case "glass":
93
+ return { ...prev, glassTint: color };
94
+ case "both":
95
+ default:
96
+ return { ...prev, accentColor: color, glassTint: color };
97
+ }
98
+ });
99
+ }, []);
100
+ const setAccentBorders = useCallback((value2) => {
101
+ setSettings((prev) => ({ ...prev, accentBorders: value2 }));
102
+ }, []);
103
+ const toggleAccentBorders = useCallback(() => {
104
+ setSettings((prev) => ({ ...prev, accentBorders: !prev.accentBorders }));
105
+ }, []);
106
+ const resetSettings = useCallback(() => {
107
+ setSettings(DEFAULT_SETTINGS);
108
+ }, []);
109
+ const value = useMemo(() => ({
110
+ ...settings,
111
+ setCompactMode,
112
+ toggleCompactMode,
113
+ setAccentColor,
114
+ setGlassTint,
115
+ setColorTarget,
116
+ setColor,
117
+ setAccentBorders,
118
+ toggleAccentBorders,
119
+ resetSettings
120
+ }), [
121
+ settings,
122
+ setCompactMode,
123
+ toggleCompactMode,
124
+ setAccentColor,
125
+ setGlassTint,
126
+ setColorTarget,
127
+ setColor,
128
+ setAccentBorders,
129
+ toggleAccentBorders,
130
+ resetSettings
131
+ ]);
132
+ return /* @__PURE__ */ jsx(DisplaySettingsContext.Provider, { value, children });
133
+ }
134
+ function useDisplaySettings() {
135
+ const context = useContext(DisplaySettingsContext);
136
+ if (!context) {
137
+ throw new Error("useDisplaySettings must be used within a DisplaySettingsProvider");
138
+ }
139
+ return context;
140
+ }
141
+ function useDisplaySettingsOptional() {
142
+ return useContext(DisplaySettingsContext);
143
+ }
144
+ function getEffectiveCompactMode(propValue, contextValue) {
145
+ if (propValue !== void 0) return propValue;
146
+ if (contextValue !== void 0) return contextValue;
147
+ return false;
148
+ }
149
+ function useCardBorderStyle(tokens, isTransparentTheme) {
150
+ const displaySettings = useDisplaySettingsOptional();
151
+ const accentBorders = (displaySettings == null ? void 0 : displaySettings.accentBorders) ?? true;
152
+ if (!isTransparentTheme) {
153
+ return tokens.colors.border.cardStyle ?? { border: `1px solid ${tokens.colors.border.muted}` };
154
+ }
155
+ if (accentBorders) {
156
+ return tokens.colors.border.cardStyle ?? {};
157
+ }
158
+ return { border: "1px solid rgba(255, 255, 255, 0.08)" };
159
+ }
160
+ export {
161
+ DisplaySettingsProvider,
162
+ GLASS_TINTS,
163
+ PRESET_COLORS,
164
+ getEffectiveCompactMode,
165
+ useCardBorderStyle,
166
+ useDisplaySettings,
167
+ useDisplaySettingsOptional
168
+ };
169
+ //# sourceMappingURL=DisplaySettingsContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DisplaySettingsContext.js","sources":["../../../src/react/context/DisplaySettingsContext.tsx"],"sourcesContent":["/**\n * @zendir/ui - DisplaySettingsContext\n * \n * Centralized context for app-wide display preferences.\n * Controls compact mode, accent colors, glass tint, and other display settings.\n * \n * Features:\n * - Compact mode toggle (affects all cards globally)\n * - Accent color selection (for card accents)\n * - Glass tint selection (for transparent themes)\n * - Color target control (both, accent-only, glass-only)\n * - LocalStorage persistence\n * \n * @example\n * ```tsx\n * import { DisplaySettingsProvider, useDisplaySettings } from '@zendir/ui';\n * \n * // Wrap your app\n * <DisplaySettingsProvider>\n * <App />\n * </DisplaySettingsProvider>\n * \n * // Use in components\n * function MyCard() {\n * const { compactMode, accentColor } = useDisplaySettings();\n * return <Card compact={compactMode} />;\n * }\n * ```\n */\n\nimport React, { createContext, useContext, useState, useCallback, useMemo, useEffect, type ReactNode } from 'react';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type ColorTarget = 'both' | 'accent' | 'glass';\n\nexport interface DisplaySettings {\n /** Global compact mode - affects all cards */\n compactMode: boolean;\n \n /** Accent color for cards and UI elements */\n accentColor: string;\n \n /** Glass tint color for transparent themes */\n glassTint: string;\n \n /** Which color setting to apply: both, accent-only, or glass-only */\n colorTarget: ColorTarget;\n \n /** Enable accent-colored borders on cards (for transparent themes) */\n accentBorders: boolean;\n}\n\nexport interface DisplaySettingsContextValue extends DisplaySettings {\n /** Set compact mode on/off */\n setCompactMode: (value: boolean) => void;\n \n /** Toggle compact mode */\n toggleCompactMode: () => void;\n \n /** Set accent color */\n setAccentColor: (color: string) => void;\n \n /** Set glass tint color */\n setGlassTint: (color: string) => void;\n \n /** Set which color setting to apply */\n setColorTarget: (target: ColorTarget) => void;\n \n /** Set a color that applies based on current target */\n setColor: (color: string) => void;\n \n /** Set accent borders on/off */\n setAccentBorders: (value: boolean) => void;\n \n /** Toggle accent borders */\n toggleAccentBorders: () => void;\n \n /** Reset all settings to defaults */\n resetSettings: () => void;\n}\n\n// =============================================================================\n// Preset Colors\n// =============================================================================\n\nexport const PRESET_COLORS = {\n purple: '#8b5cf6',\n blue: '#3b82f6',\n cyan: '#06b6d4',\n teal: '#14b8a6',\n green: '#10b981',\n lime: '#84cc16',\n amber: '#f59e0b',\n orange: '#f97316',\n pink: '#ec4899',\n red: '#ef4444',\n slate: '#64748b',\n} as const;\n\nexport const GLASS_TINTS = {\n ...PRESET_COLORS,\n clear: 'rgba(255,255,255,0.05)',\n dark: 'rgba(0,0,0,0.3)',\n} as const;\n\nexport type PresetColorKey = keyof typeof PRESET_COLORS;\nexport type GlassTintKey = keyof typeof GLASS_TINTS;\n\n// =============================================================================\n// Default Values\n// =============================================================================\n\nconst DEFAULT_SETTINGS: DisplaySettings = {\n compactMode: false,\n accentColor: PRESET_COLORS.purple,\n glassTint: PRESET_COLORS.purple,\n colorTarget: 'both',\n accentBorders: true,\n};\n\nconst STORAGE_KEY = 'zendir-display-settings';\n\n// =============================================================================\n// Context\n// =============================================================================\n\nconst DisplaySettingsContext = createContext<DisplaySettingsContextValue | null>(null);\n\n// =============================================================================\n// Provider Props\n// =============================================================================\n\nexport interface DisplaySettingsProviderProps {\n children: ReactNode;\n \n /** Initial compact mode state */\n defaultCompactMode?: boolean;\n \n /** Initial accent color */\n defaultAccentColor?: string;\n \n /** Initial glass tint color */\n defaultGlassTint?: string;\n \n /** Initial color target */\n defaultColorTarget?: ColorTarget;\n \n /** Initial accent borders state */\n defaultAccentBorders?: boolean;\n \n /** Enable localStorage persistence (default: true) */\n persist?: boolean;\n}\n\n// =============================================================================\n// Provider Component\n// =============================================================================\n\nexport function DisplaySettingsProvider({\n children,\n defaultCompactMode,\n defaultAccentColor,\n defaultGlassTint,\n defaultColorTarget,\n defaultAccentBorders,\n persist = true,\n}: DisplaySettingsProviderProps): React.ReactElement {\n // Initialize state from localStorage or defaults\n const [settings, setSettings] = useState<DisplaySettings>(() => {\n if (persist && typeof window !== 'undefined') {\n try {\n const stored = localStorage.getItem(STORAGE_KEY);\n if (stored) {\n const parsed = JSON.parse(stored);\n return {\n compactMode: parsed.compactMode ?? defaultCompactMode ?? DEFAULT_SETTINGS.compactMode,\n accentColor: parsed.accentColor ?? defaultAccentColor ?? DEFAULT_SETTINGS.accentColor,\n glassTint: parsed.glassTint ?? defaultGlassTint ?? DEFAULT_SETTINGS.glassTint,\n colorTarget: parsed.colorTarget ?? defaultColorTarget ?? DEFAULT_SETTINGS.colorTarget,\n accentBorders: parsed.accentBorders ?? defaultAccentBorders ?? DEFAULT_SETTINGS.accentBorders,\n };\n }\n } catch {\n // Ignore parse errors\n }\n }\n \n return {\n compactMode: defaultCompactMode ?? DEFAULT_SETTINGS.compactMode,\n accentColor: defaultAccentColor ?? DEFAULT_SETTINGS.accentColor,\n glassTint: defaultGlassTint ?? DEFAULT_SETTINGS.glassTint,\n colorTarget: defaultColorTarget ?? DEFAULT_SETTINGS.colorTarget,\n accentBorders: defaultAccentBorders ?? DEFAULT_SETTINGS.accentBorders,\n };\n });\n \n // Persist to localStorage when settings change\n useEffect(() => {\n if (persist && typeof window !== 'undefined') {\n try {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(settings));\n } catch {\n // Ignore storage errors\n }\n }\n }, [settings, persist]);\n \n // Setters\n const setCompactMode = useCallback((value: boolean) => {\n setSettings(prev => ({ ...prev, compactMode: value }));\n }, []);\n \n const toggleCompactMode = useCallback(() => {\n setSettings(prev => ({ ...prev, compactMode: !prev.compactMode }));\n }, []);\n \n const setAccentColor = useCallback((color: string) => {\n setSettings(prev => ({ ...prev, accentColor: color }));\n }, []);\n \n const setGlassTint = useCallback((color: string) => {\n setSettings(prev => ({ ...prev, glassTint: color }));\n }, []);\n \n const setColorTarget = useCallback((target: ColorTarget) => {\n setSettings(prev => ({ ...prev, colorTarget: target }));\n }, []);\n \n // Set color based on current target\n const setColor = useCallback((color: string) => {\n setSettings(prev => {\n switch (prev.colorTarget) {\n case 'accent':\n return { ...prev, accentColor: color };\n case 'glass':\n return { ...prev, glassTint: color };\n case 'both':\n default:\n return { ...prev, accentColor: color, glassTint: color };\n }\n });\n }, []);\n \n const setAccentBorders = useCallback((value: boolean) => {\n setSettings(prev => ({ ...prev, accentBorders: value }));\n }, []);\n \n const toggleAccentBorders = useCallback(() => {\n setSettings(prev => ({ ...prev, accentBorders: !prev.accentBorders }));\n }, []);\n \n const resetSettings = useCallback(() => {\n setSettings(DEFAULT_SETTINGS);\n }, []);\n \n // Memoized context value\n const value = useMemo<DisplaySettingsContextValue>(() => ({\n ...settings,\n setCompactMode,\n toggleCompactMode,\n setAccentColor,\n setGlassTint,\n setColorTarget,\n setColor,\n setAccentBorders,\n toggleAccentBorders,\n resetSettings,\n }), [\n settings,\n setCompactMode,\n toggleCompactMode,\n setAccentColor,\n setGlassTint,\n setColorTarget,\n setColor,\n setAccentBorders,\n toggleAccentBorders,\n resetSettings,\n ]);\n \n return (\n <DisplaySettingsContext.Provider value={value}>\n {children}\n </DisplaySettingsContext.Provider>\n );\n}\n\n// =============================================================================\n// Hook\n// =============================================================================\n\n/**\n * Access display settings context\n * Must be used within a DisplaySettingsProvider\n */\nexport function useDisplaySettings(): DisplaySettingsContextValue {\n const context = useContext(DisplaySettingsContext);\n \n if (!context) {\n throw new Error('useDisplaySettings must be used within a DisplaySettingsProvider');\n }\n \n return context;\n}\n\n/**\n * Optional hook that returns null if not within provider\n * Useful for components that should work with or without the provider\n */\nexport function useDisplaySettingsOptional(): DisplaySettingsContextValue | null {\n return useContext(DisplaySettingsContext);\n}\n\n// =============================================================================\n// Utility Functions\n// =============================================================================\n\n/**\n * Get effective compact mode value\n * Priority: explicit prop > context value > default (false)\n */\nexport function getEffectiveCompactMode(\n propValue: boolean | undefined,\n contextValue: boolean | undefined\n): boolean {\n if (propValue !== undefined) return propValue;\n if (contextValue !== undefined) return contextValue;\n return false;\n}\n\n/**\n * Get effective accent borders value\n * Priority: explicit prop > context value > default (true)\n */\nexport function getEffectiveAccentBorders(\n propValue: boolean | undefined,\n contextValue: boolean | undefined\n): boolean {\n if (propValue !== undefined) return propValue;\n if (contextValue !== undefined) return contextValue;\n return true;\n}\n\n/**\n * Hook to get card border style based on accentBorders setting\n * Returns the appropriate border style for transparent themes\n */\nexport function useCardBorderStyle(\n tokens: any,\n isTransparentTheme: boolean\n): React.CSSProperties {\n const displaySettings = useDisplaySettingsOptional();\n const accentBorders = displaySettings?.accentBorders ?? true;\n \n if (!isTransparentTheme) {\n return tokens.colors.border.cardStyle ?? { border: `1px solid ${tokens.colors.border.muted}` };\n }\n \n if (accentBorders) {\n return tokens.colors.border.cardStyle ?? {};\n }\n \n // Fallback to subtle neutral border when accent borders disabled\n return { border: '1px solid rgba(255, 255, 255, 0.08)' };\n}\n\nexport default DisplaySettingsProvider;\n"],"names":["value"],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * @zendir/ui - Context exports
3
+ */
4
+ export { DisplaySettingsProvider, useDisplaySettings, useDisplaySettingsOptional, getEffectiveCompactMode, PRESET_COLORS, GLASS_TINTS, } from './DisplaySettingsContext';
5
+ export type { DisplaySettings, DisplaySettingsContextValue, DisplaySettingsProviderProps, ColorTarget, PresetColorKey, GlassTintKey, } from './DisplaySettingsContext';
@@ -0,0 +1,45 @@
1
+ import { default as React } from 'react';
2
+ import { CalendarEvent, CalendarTimeline, ActivityType } from './MissionCalendar';
3
+
4
+ export interface ActivityFormData {
5
+ title: string;
6
+ type: ActivityType;
7
+ start: string;
8
+ end: string;
9
+ timeline: string;
10
+ description: string;
11
+ command: string;
12
+ script: string;
13
+ hazardous: boolean;
14
+ metadata: Record<string, string>;
15
+ }
16
+ export interface ActivityPlannerProps {
17
+ /** Activities to display */
18
+ activities: CalendarEvent[];
19
+ /** Available timelines */
20
+ timelines: CalendarTimeline[];
21
+ /** Currently selected date for scheduling */
22
+ selectedDate?: Date;
23
+ /** Height (default: 500) */
24
+ height?: number | string;
25
+ /** Title */
26
+ title?: string;
27
+ /** Read-only mode */
28
+ readOnly?: boolean;
29
+ /** Show overlap warnings */
30
+ showOverlapWarning?: boolean;
31
+ /** Called on create */
32
+ onActivityCreate?: (activity: Partial<CalendarEvent>) => void;
33
+ /** Called on update */
34
+ onActivityUpdate?: (id: string, updates: Partial<CalendarEvent>) => void;
35
+ /** Called on delete */
36
+ onActivityDelete?: (id: string) => void;
37
+ /** Called when requesting to view activity in calendar */
38
+ onViewInCalendar?: (activity: CalendarEvent) => void;
39
+ /** Called when requesting to view in timeline */
40
+ onViewInTimeline?: (activity: CalendarEvent) => void;
41
+ /** CSS class */
42
+ className?: string;
43
+ }
44
+ export declare const ActivityPlanner: React.NamedExoticComponent<ActivityPlannerProps>;
45
+ export default ActivityPlanner;