@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,817 @@
1
+ import { jsxs, jsx, Fragment } from "react/jsx-runtime";
2
+ import React, { memo, useState, useRef, useEffect, useMemo } from "react";
3
+ import { useDisplaySettingsOptional } from "../context/DisplaySettingsContext.js";
4
+ import { classNames, safeAccentText } from "../utils/index.js";
5
+ import { AstroIcon } from "./AstroIcon.js";
6
+ import { ColorPickerPanel } from "./ColorPickerPanel.js";
7
+ import { Tooltip } from "./Tooltip.js";
8
+ import { useBreakpoint } from "./layout/useBreakpoint.js";
9
+ import { useTheme } from "../theme/ThemeProvider.js";
10
+ const THEME_VARIANTS = [
11
+ { key: "hybrid", label: "Zen (Hybrid)", tooltip: "Default theme - Astro status colors with purple accents" },
12
+ { key: "purple-hue", label: "Zen (Purple Hue)", tooltip: "Purple accent theme - vibrant purple tones" },
13
+ { key: "astro", label: "Astro", tooltip: "Astro UX Design System theme - dark blue tones" },
14
+ { key: "transparent", label: "Glass", tooltip: "Glassmorphism theme - transparent with blur effects" },
15
+ { key: "transparent-bold", label: "Bold", tooltip: "Bold glass theme - stronger transparency effects" },
16
+ { key: "transparent-minimal", label: "Minimal", tooltip: "Minimal glass theme - ultra-subtle borders, clean surfaces" }
17
+ ];
18
+ const ModeToggle = memo(function ModeToggle2({ mode, onToggle, tokens }) {
19
+ const isDark = mode === "dark";
20
+ const tooltipText = isDark ? "Switch to Light Mode" : "Switch to Dark Mode";
21
+ return /* @__PURE__ */ jsx(Tooltip, { content: tooltipText, placement: "bottom", children: /* @__PURE__ */ jsx(
22
+ "button",
23
+ {
24
+ onClick: onToggle,
25
+ "aria-label": tooltipText,
26
+ style: {
27
+ display: "flex",
28
+ alignItems: "center",
29
+ justifyContent: "center",
30
+ width: 32,
31
+ height: 32,
32
+ padding: 0,
33
+ border: "none",
34
+ borderRadius: tokens.borderRadius.md,
35
+ backgroundColor: "rgba(255,255,255,0.08)",
36
+ color: tokens.colors.text.primary,
37
+ cursor: "pointer",
38
+ transition: "all 0.15s ease"
39
+ },
40
+ onMouseEnter: (e) => {
41
+ e.currentTarget.style.backgroundColor = "rgba(255,255,255,0.15)";
42
+ },
43
+ onMouseLeave: (e) => {
44
+ e.currentTarget.style.backgroundColor = "rgba(255,255,255,0.08)";
45
+ },
46
+ children: /* @__PURE__ */ jsx(
47
+ AstroIcon,
48
+ {
49
+ name: isDark ? "brightness-3" : "brightness-high",
50
+ size: 16,
51
+ color: tokens.colors.text.primary
52
+ }
53
+ )
54
+ }
55
+ ) });
56
+ });
57
+ const CompactToggle = memo(function CompactToggle2({ isCompact, onToggle, tokens }) {
58
+ const tooltipText = isCompact ? "Switch to Expanded View" : "Switch to Compact View";
59
+ return /* @__PURE__ */ jsx(Tooltip, { content: tooltipText, placement: "bottom", children: /* @__PURE__ */ jsx(
60
+ "button",
61
+ {
62
+ onClick: onToggle,
63
+ "aria-label": tooltipText,
64
+ style: {
65
+ display: "flex",
66
+ alignItems: "center",
67
+ justifyContent: "center",
68
+ width: 32,
69
+ height: 32,
70
+ padding: 0,
71
+ border: "none",
72
+ borderRadius: tokens.borderRadius.md,
73
+ backgroundColor: isCompact ? "rgba(139, 92, 246, 0.25)" : "rgba(255,255,255,0.08)",
74
+ color: isCompact ? "#a78bfa" : tokens.colors.text.primary,
75
+ cursor: "pointer",
76
+ transition: "all 0.15s ease"
77
+ },
78
+ onMouseEnter: (e) => {
79
+ e.currentTarget.style.backgroundColor = isCompact ? "rgba(139, 92, 246, 0.35)" : "rgba(255,255,255,0.15)";
80
+ },
81
+ onMouseLeave: (e) => {
82
+ e.currentTarget.style.backgroundColor = isCompact ? "rgba(139, 92, 246, 0.25)" : "rgba(255,255,255,0.08)";
83
+ },
84
+ children: /* @__PURE__ */ jsx(
85
+ AstroIcon,
86
+ {
87
+ name: isCompact ? "view-comfy" : "view-module",
88
+ size: 16,
89
+ color: isCompact ? "#a78bfa" : tokens.colors.text.primary
90
+ }
91
+ )
92
+ }
93
+ ) });
94
+ });
95
+ const ThemeSelector = memo(function ThemeSelector2({ currentTheme, onSelect, tokens }) {
96
+ const safeAccentBg = useMemo(() => {
97
+ const hex = tokens.colors.accent.primary.replace("#", "");
98
+ if (hex.length < 6) return tokens.colors.accent.primary;
99
+ const toLinear = (c) => c <= 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
100
+ const r = parseInt(hex.slice(0, 2), 16) / 255;
101
+ const g = parseInt(hex.slice(2, 4), 16) / 255;
102
+ const b = parseInt(hex.slice(4, 6), 16) / 255;
103
+ const L = 0.2126 * toLinear(r) + 0.7152 * toLinear(g) + 0.0722 * toLinear(b);
104
+ if (1.05 / (L + 0.05) >= 4.5) return tokens.colors.accent.primary;
105
+ const factor = 0.88;
106
+ const dr = Math.min(255, Math.round(r * 255 * factor));
107
+ const dg = Math.min(255, Math.round(g * 255 * factor));
108
+ const db = Math.min(255, Math.round(b * 255 * factor));
109
+ return `#${dr.toString(16).padStart(2, "0")}${dg.toString(16).padStart(2, "0")}${db.toString(16).padStart(2, "0")}`;
110
+ }, [tokens.colors.accent.primary]);
111
+ const coreThemes = THEME_VARIANTS.filter((t) => !t.key.startsWith("transparent"));
112
+ const glassThemes = THEME_VARIANTS.filter((t) => t.key.startsWith("transparent"));
113
+ return /* @__PURE__ */ jsxs(
114
+ "div",
115
+ {
116
+ style: {
117
+ display: "flex",
118
+ alignItems: "center",
119
+ gap: 4,
120
+ padding: 2,
121
+ backgroundColor: "rgba(255,255,255,0.05)",
122
+ borderRadius: tokens.borderRadius.md
123
+ },
124
+ role: "group",
125
+ "aria-label": "Theme selector",
126
+ children: [
127
+ coreThemes.map(({ key, label, tooltip }) => /* @__PURE__ */ jsx(Tooltip, { content: tooltip, placement: "bottom", children: /* @__PURE__ */ jsx(
128
+ "button",
129
+ {
130
+ onClick: () => onSelect(key),
131
+ "aria-label": `Select ${label} theme`,
132
+ style: {
133
+ padding: "4px 10px",
134
+ border: "none",
135
+ borderRadius: tokens.borderRadius.sm,
136
+ backgroundColor: currentTheme === key ? safeAccentBg : "transparent",
137
+ color: currentTheme === key ? "#ffffff" : tokens.colors.text.secondary,
138
+ fontSize: "0.6875rem",
139
+ // 11px in rem
140
+ fontWeight: currentTheme === key ? 500 : 400,
141
+ // AstroUXDS: 500 (medium) not 600
142
+ cursor: "pointer",
143
+ transition: "all 0.15s ease",
144
+ whiteSpace: "nowrap"
145
+ },
146
+ onMouseEnter: (e) => {
147
+ if (currentTheme !== key) {
148
+ e.currentTarget.style.backgroundColor = "rgba(255,255,255,0.1)";
149
+ }
150
+ },
151
+ onMouseLeave: (e) => {
152
+ e.currentTarget.style.backgroundColor = currentTheme === key ? safeAccentBg : "transparent";
153
+ },
154
+ children: label
155
+ }
156
+ ) }, key)),
157
+ /* @__PURE__ */ jsx("div", { style: { width: 1, height: 16, backgroundColor: "rgba(255,255,255,0.15)", margin: "0 2px" } }),
158
+ glassThemes.map(({ key, label, tooltip }) => /* @__PURE__ */ jsx(Tooltip, { content: tooltip, placement: "bottom", children: /* @__PURE__ */ jsx(
159
+ "button",
160
+ {
161
+ onClick: () => onSelect(key),
162
+ "aria-label": `Select ${label} theme`,
163
+ style: {
164
+ padding: "4px 10px",
165
+ border: "none",
166
+ borderRadius: tokens.borderRadius.sm,
167
+ backgroundColor: currentTheme === key ? safeAccentBg : "transparent",
168
+ color: currentTheme === key ? "#ffffff" : tokens.colors.text.secondary,
169
+ fontSize: "0.6875rem",
170
+ // 11px in rem
171
+ fontWeight: currentTheme === key ? 500 : 400,
172
+ // AstroUXDS: 500 (medium) not 600
173
+ cursor: "pointer",
174
+ transition: "all 0.15s ease",
175
+ whiteSpace: "nowrap"
176
+ },
177
+ onMouseEnter: (e) => {
178
+ if (currentTheme !== key) {
179
+ e.currentTarget.style.backgroundColor = "rgba(255,255,255,0.1)";
180
+ }
181
+ },
182
+ onMouseLeave: (e) => {
183
+ e.currentTarget.style.backgroundColor = currentTheme === key ? safeAccentBg : "transparent";
184
+ },
185
+ children: label
186
+ }
187
+ ) }, key))
188
+ ]
189
+ }
190
+ );
191
+ });
192
+ const AccentBordersToggle = memo(function AccentBordersToggle2({ enabled, onToggle, tokens }) {
193
+ return /* @__PURE__ */ jsx(Tooltip, { content: enabled ? "Accent borders enabled - Click to disable" : "Accent borders disabled - Click to enable", placement: "bottom", children: /* @__PURE__ */ jsxs(
194
+ "button",
195
+ {
196
+ onClick: onToggle,
197
+ "aria-label": enabled ? "Disable accent borders" : "Enable accent borders",
198
+ style: {
199
+ display: "flex",
200
+ alignItems: "center",
201
+ justifyContent: "center",
202
+ gap: 4,
203
+ padding: "4px 8px",
204
+ border: "none",
205
+ borderRadius: tokens.borderRadius.sm,
206
+ backgroundColor: enabled ? `${tokens.colors.accent.primary}30` : "rgba(255,255,255,0.05)",
207
+ color: enabled ? safeAccentText(tokens.colors.accent.primary) : tokens.colors.text.tertiary,
208
+ fontSize: "0.625rem",
209
+ // 10px in rem
210
+ fontWeight: 500,
211
+ cursor: "pointer",
212
+ transition: "all 0.15s ease",
213
+ whiteSpace: "nowrap"
214
+ },
215
+ onMouseEnter: (e) => {
216
+ e.currentTarget.style.backgroundColor = enabled ? `${tokens.colors.accent.primary}40` : "rgba(255,255,255,0.1)";
217
+ },
218
+ onMouseLeave: (e) => {
219
+ e.currentTarget.style.backgroundColor = enabled ? `${tokens.colors.accent.primary}30` : "rgba(255,255,255,0.05)";
220
+ },
221
+ children: [
222
+ /* @__PURE__ */ jsx("span", { style: {
223
+ width: 8,
224
+ height: 8,
225
+ borderRadius: 2,
226
+ border: `2px solid ${enabled ? tokens.colors.accent.primary : tokens.colors.text.tertiary}`,
227
+ backgroundColor: "transparent"
228
+ } }),
229
+ /* @__PURE__ */ jsx("span", { children: "Borders" })
230
+ ]
231
+ }
232
+ ) });
233
+ });
234
+ const ThemeControlsDropdown = memo(function ThemeControlsDropdown2({
235
+ currentTheme,
236
+ mode,
237
+ onThemeSelect,
238
+ onModeToggle,
239
+ accentBordersEnabled = true,
240
+ onAccentBordersToggle,
241
+ showAccentBorders = false,
242
+ tokens
243
+ }) {
244
+ var _a;
245
+ const [isOpen, setIsOpen] = useState(false);
246
+ const dropdownRef = useRef(null);
247
+ useEffect(() => {
248
+ const handleClickOutside = (event) => {
249
+ if (dropdownRef.current && !dropdownRef.current.contains(event.target)) {
250
+ setIsOpen(false);
251
+ }
252
+ };
253
+ if (isOpen) {
254
+ document.addEventListener("mousedown", handleClickOutside);
255
+ return () => document.removeEventListener("mousedown", handleClickOutside);
256
+ }
257
+ }, [isOpen]);
258
+ const currentLabel = ((_a = THEME_VARIANTS.find((t) => t.key === currentTheme)) == null ? void 0 : _a.label) || "Theme";
259
+ const coreThemes = THEME_VARIANTS.filter((t) => !t.key.startsWith("transparent"));
260
+ const glassThemes = THEME_VARIANTS.filter((t) => t.key.startsWith("transparent"));
261
+ return /* @__PURE__ */ jsxs("div", { ref: dropdownRef, style: { position: "relative" }, children: [
262
+ /* @__PURE__ */ jsx(Tooltip, { content: "Theme settings", placement: "bottom", children: /* @__PURE__ */ jsxs(
263
+ "button",
264
+ {
265
+ onClick: () => setIsOpen(!isOpen),
266
+ "aria-label": "Theme settings",
267
+ "aria-expanded": isOpen,
268
+ style: {
269
+ display: "flex",
270
+ alignItems: "center",
271
+ gap: 6,
272
+ padding: "6px 10px",
273
+ border: `1px solid ${tokens.colors.border.muted}`,
274
+ borderRadius: tokens.borderRadius.md,
275
+ backgroundColor: isOpen ? tokens.colors.background.elevated : "transparent",
276
+ color: tokens.colors.text.secondary,
277
+ fontSize: "0.6875rem",
278
+ // 11px in rem
279
+ fontWeight: 500,
280
+ cursor: "pointer",
281
+ transition: "all 0.15s ease"
282
+ },
283
+ onMouseEnter: (e) => {
284
+ if (!isOpen) {
285
+ e.currentTarget.style.backgroundColor = tokens.colors.background.elevated;
286
+ }
287
+ },
288
+ onMouseLeave: (e) => {
289
+ if (!isOpen) {
290
+ e.currentTarget.style.backgroundColor = "transparent";
291
+ }
292
+ },
293
+ children: [
294
+ /* @__PURE__ */ jsx(AstroIcon, { name: "settings", size: 14, color: tokens.colors.text.secondary }),
295
+ /* @__PURE__ */ jsx("span", { children: currentLabel }),
296
+ /* @__PURE__ */ jsx(
297
+ AstroIcon,
298
+ {
299
+ name: isOpen ? "arrow-up" : "arrow-down",
300
+ size: 10,
301
+ color: tokens.colors.text.tertiary
302
+ }
303
+ )
304
+ ]
305
+ }
306
+ ) }),
307
+ isOpen && /* @__PURE__ */ jsxs(
308
+ "div",
309
+ {
310
+ style: {
311
+ position: "absolute",
312
+ top: "100%",
313
+ right: 0,
314
+ marginTop: 4,
315
+ minWidth: 220,
316
+ padding: tokens.spacing.sm,
317
+ backgroundColor: tokens.colors.background.surface,
318
+ border: `1px solid ${tokens.colors.border.muted}`,
319
+ borderRadius: tokens.borderRadius.lg,
320
+ boxShadow: "0 8px 32px rgba(0,0,0,0.3)",
321
+ zIndex: 1e3
322
+ },
323
+ children: [
324
+ /* @__PURE__ */ jsxs("div", { style: { marginBottom: tokens.spacing.sm }, children: [
325
+ /* @__PURE__ */ jsx("div", { style: {
326
+ fontSize: "0.625rem",
327
+ // 10px in rem
328
+ color: tokens.colors.text.muted,
329
+ textTransform: "uppercase",
330
+ letterSpacing: "0.05em",
331
+ marginBottom: 8,
332
+ paddingLeft: 4
333
+ }, children: "Theme" }),
334
+ /* @__PURE__ */ jsx("div", { style: { display: "flex", flexDirection: "column", gap: 2 }, children: coreThemes.map(({ key, label }) => /* @__PURE__ */ jsxs(
335
+ "button",
336
+ {
337
+ onClick: () => {
338
+ onThemeSelect(key);
339
+ setIsOpen(false);
340
+ },
341
+ style: {
342
+ display: "flex",
343
+ alignItems: "center",
344
+ gap: 8,
345
+ padding: "8px 12px",
346
+ border: "none",
347
+ borderRadius: tokens.borderRadius.sm,
348
+ backgroundColor: currentTheme === key ? `${tokens.colors.accent.primary}20` : "transparent",
349
+ color: currentTheme === key ? tokens.colors.accent.primary : tokens.colors.text.primary,
350
+ fontSize: "0.75rem",
351
+ // 12px in rem
352
+ fontWeight: currentTheme === key ? 600 : 400,
353
+ cursor: "pointer",
354
+ textAlign: "left",
355
+ transition: "all 0.1s ease"
356
+ },
357
+ onMouseEnter: (e) => {
358
+ if (currentTheme !== key) {
359
+ e.currentTarget.style.backgroundColor = tokens.colors.background.elevated;
360
+ }
361
+ },
362
+ onMouseLeave: (e) => {
363
+ e.currentTarget.style.backgroundColor = currentTheme === key ? `${tokens.colors.accent.primary}20` : "transparent";
364
+ },
365
+ children: [
366
+ currentTheme === key && /* @__PURE__ */ jsx(AstroIcon, { name: "check", size: 12, color: tokens.colors.accent.primary }),
367
+ /* @__PURE__ */ jsx("span", { style: { marginLeft: currentTheme === key ? 0 : 20 }, children: label })
368
+ ]
369
+ },
370
+ key
371
+ )) }),
372
+ /* @__PURE__ */ jsx("div", { style: {
373
+ height: 1,
374
+ backgroundColor: tokens.colors.border.muted,
375
+ margin: `${tokens.spacing.xs} 0`
376
+ } }),
377
+ /* @__PURE__ */ jsx("div", { style: {
378
+ fontSize: "0.625rem",
379
+ // 10px in rem
380
+ color: tokens.colors.text.muted,
381
+ textTransform: "uppercase",
382
+ letterSpacing: "0.05em",
383
+ marginBottom: 6,
384
+ paddingLeft: 4
385
+ }, children: "Glass" }),
386
+ /* @__PURE__ */ jsx("div", { style: { display: "flex", flexDirection: "column", gap: 2 }, children: glassThemes.map(({ key, label }) => /* @__PURE__ */ jsxs(
387
+ "button",
388
+ {
389
+ onClick: () => {
390
+ onThemeSelect(key);
391
+ setIsOpen(false);
392
+ },
393
+ style: {
394
+ display: "flex",
395
+ alignItems: "center",
396
+ gap: 8,
397
+ padding: "8px 12px",
398
+ border: "none",
399
+ borderRadius: tokens.borderRadius.sm,
400
+ backgroundColor: currentTheme === key ? `${tokens.colors.accent.primary}20` : "transparent",
401
+ color: currentTheme === key ? tokens.colors.accent.primary : tokens.colors.text.primary,
402
+ fontSize: "0.75rem",
403
+ // 12px in rem
404
+ fontWeight: currentTheme === key ? 600 : 400,
405
+ cursor: "pointer",
406
+ textAlign: "left",
407
+ transition: "all 0.1s ease"
408
+ },
409
+ onMouseEnter: (e) => {
410
+ if (currentTheme !== key) {
411
+ e.currentTarget.style.backgroundColor = tokens.colors.background.elevated;
412
+ }
413
+ },
414
+ onMouseLeave: (e) => {
415
+ e.currentTarget.style.backgroundColor = currentTheme === key ? `${tokens.colors.accent.primary}20` : "transparent";
416
+ },
417
+ children: [
418
+ currentTheme === key && /* @__PURE__ */ jsx(AstroIcon, { name: "check", size: 12, color: tokens.colors.accent.primary }),
419
+ /* @__PURE__ */ jsx("span", { style: { marginLeft: currentTheme === key ? 0 : 20 }, children: label })
420
+ ]
421
+ },
422
+ key
423
+ )) })
424
+ ] }),
425
+ /* @__PURE__ */ jsx("div", { style: {
426
+ height: 1,
427
+ backgroundColor: tokens.colors.border.muted,
428
+ margin: `${tokens.spacing.sm} 0`
429
+ } }),
430
+ /* @__PURE__ */ jsxs("div", { style: { display: "flex", flexDirection: "column", gap: 4 }, children: [
431
+ /* @__PURE__ */ jsxs(
432
+ "button",
433
+ {
434
+ onClick: () => {
435
+ onModeToggle();
436
+ },
437
+ style: {
438
+ display: "flex",
439
+ alignItems: "center",
440
+ justifyContent: "space-between",
441
+ padding: "8px 12px",
442
+ border: "none",
443
+ borderRadius: tokens.borderRadius.sm,
444
+ backgroundColor: "transparent",
445
+ color: tokens.colors.text.primary,
446
+ fontSize: "0.75rem",
447
+ // 12px in rem
448
+ cursor: "pointer",
449
+ transition: "all 0.1s ease"
450
+ },
451
+ onMouseEnter: (e) => {
452
+ e.currentTarget.style.backgroundColor = tokens.colors.background.elevated;
453
+ },
454
+ onMouseLeave: (e) => {
455
+ e.currentTarget.style.backgroundColor = "transparent";
456
+ },
457
+ children: [
458
+ /* @__PURE__ */ jsxs("span", { style: { display: "flex", alignItems: "center", gap: 8 }, children: [
459
+ /* @__PURE__ */ jsx(
460
+ AstroIcon,
461
+ {
462
+ name: mode === "dark" ? "brightness-high" : "brightness-low",
463
+ size: 14,
464
+ color: tokens.colors.text.secondary
465
+ }
466
+ ),
467
+ mode === "dark" ? "Dark Mode" : "Light Mode"
468
+ ] }),
469
+ /* @__PURE__ */ jsx("div", { style: {
470
+ width: 32,
471
+ height: 18,
472
+ borderRadius: 9,
473
+ backgroundColor: mode === "dark" ? tokens.colors.accent.primary : tokens.colors.border.default,
474
+ padding: 2,
475
+ transition: "all 0.15s ease"
476
+ }, children: /* @__PURE__ */ jsx("div", { style: {
477
+ width: 14,
478
+ height: 14,
479
+ borderRadius: "50%",
480
+ backgroundColor: "#fff",
481
+ transition: "all 0.15s ease",
482
+ transform: mode === "dark" ? "translateX(14px)" : "translateX(0)"
483
+ } }) })
484
+ ]
485
+ }
486
+ ),
487
+ showAccentBorders && onAccentBordersToggle && /* @__PURE__ */ jsx(
488
+ "button",
489
+ {
490
+ onClick: onAccentBordersToggle,
491
+ style: {
492
+ display: "flex",
493
+ alignItems: "center",
494
+ justifyContent: "space-between",
495
+ padding: "8px 12px",
496
+ border: "none",
497
+ borderRadius: tokens.borderRadius.sm,
498
+ backgroundColor: "transparent",
499
+ color: tokens.colors.text.primary,
500
+ fontSize: "0.75rem",
501
+ // 12px in rem
502
+ cursor: "pointer",
503
+ transition: "all 0.1s ease"
504
+ },
505
+ onMouseEnter: (e) => {
506
+ e.currentTarget.style.backgroundColor = tokens.colors.background.elevated;
507
+ },
508
+ onMouseLeave: (e) => {
509
+ e.currentTarget.style.backgroundColor = "transparent";
510
+ },
511
+ children: /* @__PURE__ */ jsxs("span", { style: { display: "flex", alignItems: "center", gap: 8 }, children: [
512
+ /* @__PURE__ */ jsx("span", { style: {
513
+ width: 14,
514
+ height: 14,
515
+ borderRadius: 3,
516
+ border: `2px solid ${tokens.colors.text.secondary}`,
517
+ display: "flex",
518
+ alignItems: "center",
519
+ justifyContent: "center"
520
+ }, children: accentBordersEnabled && /* @__PURE__ */ jsx(AstroIcon, { name: "check", size: 10, color: tokens.colors.text.secondary }) }),
521
+ "Accent Borders"
522
+ ] })
523
+ }
524
+ )
525
+ ] })
526
+ ]
527
+ }
528
+ )
529
+ ] });
530
+ });
531
+ const SectionHeader = memo(function SectionHeader2({ title, tokens }) {
532
+ var _a, _b;
533
+ return /* @__PURE__ */ jsxs("div", { style: { textAlign: "center", marginBottom: tokens.spacing.xs }, children: [
534
+ /* @__PURE__ */ jsx("span", { style: {
535
+ fontSize: tokens.typography.fontSize.xxs,
536
+ fontFamily: tokens.typography.fontFamily.primary,
537
+ color: ((_a = tokens.colors.interactive) == null ? void 0 : _a.default) ?? tokens.colors.text.secondary,
538
+ fontWeight: tokens.typography.fontWeight.bold
539
+ }, children: title }),
540
+ /* @__PURE__ */ jsx("div", { style: {
541
+ width: "100%",
542
+ height: tokens.borders.width.thin,
543
+ background: ((_b = tokens.colors.interactive) == null ? void 0 : _b.default) ?? tokens.colors.text.secondary,
544
+ opacity: 0.5,
545
+ marginTop: tokens.spacing.xs
546
+ } })
547
+ ] });
548
+ });
549
+ const AppBar = memo(function AppBar2({
550
+ appName = "Zendir",
551
+ appDomain,
552
+ appVersion,
553
+ branding,
554
+ showThemeControls = true,
555
+ showCompactToggle = true,
556
+ showColorPicker = true,
557
+ showThemeSelector = true,
558
+ showModeOnly = false,
559
+ compactThemeControls = false,
560
+ defaultTheme,
561
+ defaultMode,
562
+ defaultCompactMode,
563
+ leftSlot,
564
+ centerSlot,
565
+ rightSlot,
566
+ rightSectionTitle,
567
+ showBranding = true,
568
+ centerGrow = false,
569
+ variant = "default",
570
+ onThemeChange,
571
+ onModeChange,
572
+ onCompactModeChange,
573
+ className = "",
574
+ height = 52,
575
+ sticky = true
576
+ }) {
577
+ const { tokens, theme, mode, setTheme, setMode, toggleMode } = useTheme();
578
+ const { isMobile } = useBreakpoint();
579
+ const displaySettings = useDisplaySettingsOptional();
580
+ const isTransparentTheme = theme === "transparent" || theme === "transparent-bold" || theme === "transparent-minimal";
581
+ const compactMode = (displaySettings == null ? void 0 : displaySettings.compactMode) ?? defaultCompactMode ?? false;
582
+ React.useEffect(() => {
583
+ if (defaultTheme && theme !== defaultTheme) {
584
+ setTheme(defaultTheme);
585
+ onThemeChange == null ? void 0 : onThemeChange(defaultTheme);
586
+ }
587
+ if (defaultMode && mode !== defaultMode) {
588
+ setMode(defaultMode);
589
+ onModeChange == null ? void 0 : onModeChange(defaultMode);
590
+ }
591
+ }, []);
592
+ const handleModeToggle = () => {
593
+ toggleMode();
594
+ onModeChange == null ? void 0 : onModeChange(mode === "dark" ? "light" : "dark");
595
+ };
596
+ const handleThemeChange = (newTheme) => {
597
+ setTheme(newTheme);
598
+ onThemeChange == null ? void 0 : onThemeChange(newTheme);
599
+ };
600
+ const handleCompactToggle = () => {
601
+ if (displaySettings) {
602
+ displaySettings.toggleCompactMode();
603
+ onCompactModeChange == null ? void 0 : onCompactModeChange(!compactMode);
604
+ } else {
605
+ onCompactModeChange == null ? void 0 : onCompactModeChange(!compactMode);
606
+ }
607
+ };
608
+ const isDense = variant === "dense";
609
+ const effectiveHeight = height ?? (isDense ? 44 : 52);
610
+ const paddingH = isDense ? isMobile ? tokens.spacing.xs : tokens.spacing.sm : isMobile ? tokens.spacing.md : tokens.spacing.lg;
611
+ const paddingV = isDense ? tokens.spacing.xs : 0;
612
+ const gap = isDense ? isMobile ? tokens.spacing.sm : tokens.spacing.md : tokens.spacing.sm;
613
+ const minHeight = isDense && isMobile ? 44 : void 0;
614
+ const renderBranding = () => {
615
+ if (branding == null ? void 0 : branding.logo) {
616
+ const content = branding.logo;
617
+ if (branding.href) {
618
+ return /* @__PURE__ */ jsx("a", { href: branding.href, style: { display: "flex", alignItems: "center", textDecoration: "none" }, children: content });
619
+ }
620
+ return /* @__PURE__ */ jsx(Fragment, { children: content });
621
+ }
622
+ if (branding == null ? void 0 : branding.logoUrl) {
623
+ const img = /* @__PURE__ */ jsx(
624
+ "img",
625
+ {
626
+ src: branding.logoUrl,
627
+ alt: branding.logoAlt || appName,
628
+ style: {
629
+ height: branding.logoHeight || 28,
630
+ width: "auto",
631
+ objectFit: "contain"
632
+ }
633
+ }
634
+ );
635
+ if (branding.href) {
636
+ return /* @__PURE__ */ jsx("a", { href: branding.href, style: { display: "flex", alignItems: "center", textDecoration: "none" }, children: img });
637
+ }
638
+ return img;
639
+ }
640
+ return /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "baseline", gap: tokens.spacing.sm }, children: [
641
+ appDomain && /* @__PURE__ */ jsx("span", { style: {
642
+ fontSize: tokens.typography.fontSize.sm,
643
+ fontWeight: 400,
644
+ color: tokens.colors.text.secondary,
645
+ textTransform: "uppercase",
646
+ letterSpacing: "0.05em"
647
+ }, children: appDomain }),
648
+ /* @__PURE__ */ jsx("span", { style: {
649
+ fontSize: tokens.typography.fontSize.lg,
650
+ fontWeight: 500,
651
+ // AstroUXDS medium for app title
652
+ color: tokens.colors.text.primary
653
+ }, children: appName }),
654
+ appVersion && /* @__PURE__ */ jsxs("span", { style: {
655
+ fontSize: tokens.typography.fontSize.xs,
656
+ color: tokens.colors.text.tertiary
657
+ }, children: [
658
+ "v",
659
+ appVersion.replace(/^v/, "")
660
+ ] })
661
+ ] });
662
+ };
663
+ return /* @__PURE__ */ jsxs(
664
+ "header",
665
+ {
666
+ className: classNames("zendir-app-bar", className),
667
+ role: "banner",
668
+ style: {
669
+ display: "flex",
670
+ alignItems: "center",
671
+ justifyContent: "space-between",
672
+ height: effectiveHeight,
673
+ padding: paddingV ? `${paddingV} ${paddingH}` : `0 ${paddingH}`,
674
+ backgroundColor: isTransparentTheme ? "rgba(0,0,0,0.4)" : tokens.colors.background.surface,
675
+ ...isTransparentTheme && {
676
+ backdropFilter: "blur(16px)",
677
+ WebkitBackdropFilter: "blur(16px)"
678
+ },
679
+ borderBottom: tokens.borders.divider,
680
+ color: tokens.colors.text.primary,
681
+ fontFamily: tokens.typography.fontFamily.primary,
682
+ gap,
683
+ ...minHeight && { minHeight },
684
+ ...sticky && {
685
+ position: "sticky",
686
+ top: 0,
687
+ zIndex: 100
688
+ }
689
+ },
690
+ children: [
691
+ /* @__PURE__ */ jsxs(
692
+ "div",
693
+ {
694
+ style: {
695
+ display: "flex",
696
+ alignItems: "center",
697
+ gap: isDense ? gap : isMobile ? tokens.spacing.md : tokens.spacing.lg,
698
+ flex: "1 1 0",
699
+ minWidth: 0
700
+ },
701
+ children: [
702
+ showBranding && renderBranding(),
703
+ leftSlot
704
+ ]
705
+ }
706
+ ),
707
+ centerSlot && /* @__PURE__ */ jsx(
708
+ "div",
709
+ {
710
+ style: {
711
+ display: "flex",
712
+ alignItems: "center",
713
+ justifyContent: "center",
714
+ flex: centerGrow ? "1 1 0" : "0 0 auto",
715
+ minWidth: 0
716
+ },
717
+ children: centerSlot
718
+ }
719
+ ),
720
+ /* @__PURE__ */ jsxs(
721
+ "div",
722
+ {
723
+ style: {
724
+ display: "flex",
725
+ alignItems: "center",
726
+ justifyContent: "flex-end",
727
+ gap: tokens.spacing.sm,
728
+ flex: "1 1 0",
729
+ minWidth: 0
730
+ },
731
+ children: [
732
+ rightSectionTitle != null && rightSectionTitle !== "" ? /* @__PURE__ */ jsxs("div", { style: { display: "flex", flexDirection: "column", alignItems: "center", flexShrink: 0 }, children: [
733
+ /* @__PURE__ */ jsx(SectionHeader, { title: rightSectionTitle, tokens }),
734
+ rightSlot
735
+ ] }) : rightSlot,
736
+ showThemeControls && /* @__PURE__ */ jsx(
737
+ "div",
738
+ {
739
+ style: {
740
+ display: "flex",
741
+ alignItems: "center",
742
+ gap: isMobile ? 6 : 8,
743
+ marginLeft: isMobile ? tokens.spacing.xs : tokens.spacing.sm,
744
+ minWidth: 0
745
+ },
746
+ children: compactThemeControls ? /* @__PURE__ */ jsx(
747
+ ThemeControlsDropdown,
748
+ {
749
+ currentTheme: theme,
750
+ mode,
751
+ onThemeSelect: handleThemeChange,
752
+ onModeToggle: handleModeToggle,
753
+ accentBordersEnabled: (displaySettings == null ? void 0 : displaySettings.accentBorders) ?? true,
754
+ onAccentBordersToggle: displaySettings == null ? void 0 : displaySettings.toggleAccentBorders,
755
+ showAccentBorders: isTransparentTheme && !!displaySettings,
756
+ tokens
757
+ }
758
+ ) : /* @__PURE__ */ jsxs(Fragment, { children: [
759
+ showThemeSelector && !showModeOnly && /* @__PURE__ */ jsx(
760
+ ThemeSelector,
761
+ {
762
+ currentTheme: theme,
763
+ onSelect: handleThemeChange,
764
+ tokens
765
+ }
766
+ ),
767
+ !showModeOnly && isTransparentTheme && displaySettings && /* @__PURE__ */ jsx(
768
+ AccentBordersToggle,
769
+ {
770
+ enabled: displaySettings.accentBorders,
771
+ onToggle: displaySettings.toggleAccentBorders,
772
+ tokens
773
+ }
774
+ ),
775
+ showColorPicker && !showModeOnly && isTransparentTheme && displaySettings && /* @__PURE__ */ jsx(
776
+ ColorPickerPanel,
777
+ {
778
+ accentColor: displaySettings.accentColor,
779
+ glassTint: displaySettings.glassTint,
780
+ colorTarget: displaySettings.colorTarget,
781
+ onAccentChange: displaySettings.setAccentColor,
782
+ onGlassTintChange: displaySettings.setGlassTint,
783
+ onTargetChange: displaySettings.setColorTarget,
784
+ onColorSelect: displaySettings.setColor,
785
+ compact: true
786
+ }
787
+ ),
788
+ /* @__PURE__ */ jsx(
789
+ ModeToggle,
790
+ {
791
+ mode,
792
+ onToggle: handleModeToggle,
793
+ tokens
794
+ }
795
+ )
796
+ ] })
797
+ }
798
+ ),
799
+ showCompactToggle && /* @__PURE__ */ jsx(
800
+ CompactToggle,
801
+ {
802
+ isCompact: compactMode,
803
+ onToggle: handleCompactToggle,
804
+ tokens
805
+ }
806
+ )
807
+ ]
808
+ }
809
+ )
810
+ ]
811
+ }
812
+ );
813
+ });
814
+ export {
815
+ AppBar
816
+ };
817
+ //# sourceMappingURL=AppBar.js.map