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