@zendir/ui 0.5.0 → 0.6.1

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 +419 -386
  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 +313 -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 +26 -3
  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 +533 -155
  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 +1 @@
1
- {"version":3,"file":"GlassCard.js","sources":["../../../../src/react/core/display/GlassCard.tsx"],"sourcesContent":["/**\r\n * @zendir/ui - GlassCard Component\r\n * \r\n * Glassmorphic card component with transparent blur backgrounds,\r\n * gradient overlays, and Zendir brand color accent system.\r\n * \r\n * Inspired by AstroUXDS radar chart styling with modern glassmorphism.\r\n * \r\n * @example\r\n * ```tsx\r\n * <GlassCard title=\"Radar Chart 001\" colorOverlay=\"electric\">\r\n * <RadarChart data={data} />\r\n * </GlassCard>\r\n * \r\n * <GlassCard title=\"System Status\" colorOverlay=\"purple\" accentPosition=\"top\">\r\n * <StatusContent />\r\n * </GlassCard>\r\n * ```\r\n */\r\n\r\nimport React, { memo } from 'react';\r\nimport { useTheme } from '../../theme';\r\nimport { classNames, type StatusLevel } from '../../utils';\r\n\r\n// =============================================================================\r\n// Zendir Brand Color Palette for Glass Overlays\r\n// =============================================================================\r\n\r\nexport const GLASS_COLOR_OVERLAYS = {\r\n // Core brand colors\r\n electric: {\r\n gradient: 'linear-gradient(135deg, rgba(62, 60, 255, 0.15) 0%, rgba(62, 60, 255, 0.05) 100%)',\r\n accent: '#3E3CFF',\r\n border: 'rgba(62, 60, 255, 0.3)',\r\n glow: 'rgba(62, 60, 255, 0.4)',\r\n },\r\n purple: {\r\n gradient: 'linear-gradient(135deg, rgba(157, 112, 255, 0.15) 0%, rgba(157, 112, 255, 0.05) 100%)',\r\n accent: '#9D70FF',\r\n border: 'rgba(157, 112, 255, 0.3)',\r\n glow: 'rgba(157, 112, 255, 0.4)',\r\n },\r\n prussianBlue: {\r\n gradient: 'linear-gradient(135deg, rgba(27, 45, 160, 0.2) 0%, rgba(27, 45, 160, 0.08) 100%)',\r\n accent: '#1B2DA0',\r\n border: 'rgba(27, 45, 160, 0.4)',\r\n glow: 'rgba(27, 45, 160, 0.5)',\r\n },\r\n \r\n // Cyan/Teal (matching the reference image style)\r\n cyan: {\r\n gradient: 'linear-gradient(135deg, rgba(0, 212, 255, 0.12) 0%, rgba(0, 180, 220, 0.04) 100%)',\r\n accent: '#00D4FF',\r\n border: 'rgba(0, 212, 255, 0.35)',\r\n glow: 'rgba(0, 212, 255, 0.5)',\r\n },\r\n teal: {\r\n gradient: 'linear-gradient(135deg, rgba(45, 204, 255, 0.12) 0%, rgba(45, 204, 255, 0.04) 100%)',\r\n accent: '#2DCCFF',\r\n border: 'rgba(45, 204, 255, 0.35)',\r\n glow: 'rgba(45, 204, 255, 0.5)',\r\n },\r\n \r\n // Neutral options\r\n dark: {\r\n gradient: 'linear-gradient(135deg, rgba(0, 0, 0, 0.4) 0%, rgba(0, 0, 0, 0.2) 100%)',\r\n accent: '#1a1a2e',\r\n border: 'rgba(255, 255, 255, 0.1)',\r\n glow: 'rgba(0, 0, 0, 0.3)',\r\n },\r\n light: {\r\n gradient: 'linear-gradient(135deg, rgba(255, 255, 255, 0.15) 0%, rgba(255, 255, 255, 0.05) 100%)',\r\n accent: '#ffffff',\r\n border: 'rgba(255, 255, 255, 0.25)',\r\n glow: 'rgba(255, 255, 255, 0.3)',\r\n },\r\n white: {\r\n gradient: 'linear-gradient(135deg, rgba(255, 255, 255, 0.2) 0%, rgba(255, 255, 255, 0.08) 100%)',\r\n accent: '#ffffff',\r\n border: 'rgba(255, 255, 255, 0.3)',\r\n glow: 'rgba(255, 255, 255, 0.4)',\r\n },\r\n \r\n // Additional shades\r\n electricLight: {\r\n gradient: 'linear-gradient(135deg, rgba(107, 105, 255, 0.15) 0%, rgba(107, 105, 255, 0.05) 100%)',\r\n accent: '#6B69FF',\r\n border: 'rgba(107, 105, 255, 0.3)',\r\n glow: 'rgba(107, 105, 255, 0.4)',\r\n },\r\n purpleLight: {\r\n gradient: 'linear-gradient(135deg, rgba(180, 141, 255, 0.15) 0%, rgba(180, 141, 255, 0.05) 100%)',\r\n accent: '#B48DFF',\r\n border: 'rgba(180, 141, 255, 0.3)',\r\n glow: 'rgba(180, 141, 255, 0.4)',\r\n },\r\n \r\n // No overlay (transparent)\r\n none: {\r\n gradient: 'none',\r\n accent: 'transparent',\r\n border: 'rgba(255, 255, 255, 0.1)',\r\n glow: 'transparent',\r\n },\r\n} as const;\r\n\r\nexport type GlassColorOverlay = keyof typeof GLASS_COLOR_OVERLAYS;\r\n\r\nexport type GlassAccentPosition = 'top' | 'left' | 'right' | 'bottom' | 'none';\r\n\r\nexport interface GlassCardProps {\r\n /** Card title with optional icon */\r\n title?: React.ReactNode;\r\n /** Subtitle text */\r\n subtitle?: React.ReactNode;\r\n /** Color overlay from Zendir brand palette */\r\n colorOverlay?: GlassColorOverlay;\r\n /** Custom color overlay (hex or rgba) */\r\n customOverlay?: {\r\n gradient: string;\r\n accent: string;\r\n border: string;\r\n glow?: string;\r\n };\r\n /** \r\n * Accent color (hex) - auto-generates overlay from this color\r\n * Overrides colorOverlay if provided\r\n * Can be used with CardAccentProvider: accentColor={getAccentColor(title)}\r\n */\r\n accentColor?: string;\r\n /** Position of the accent line/glow */\r\n accentPosition?: GlassAccentPosition;\r\n /** Accent line style */\r\n accentStyle?: 'solid' | 'gradient' | 'glow' | 'dots';\r\n /** Header icon (rendered before title) */\r\n icon?: React.ReactNode;\r\n /** Header right actions (legend, buttons, etc.) */\r\n actions?: React.ReactNode;\r\n /** Legend items to display in header */\r\n legend?: Array<{ label: string; color: string }>;\r\n /** Status indicator */\r\n status?: StatusLevel;\r\n /** Blur intensity (0-20) */\r\n blur?: number;\r\n /** Background opacity (0-1) */\r\n backgroundOpacity?: number;\r\n /** Enable glow effect on hover */\r\n glowOnHover?: boolean;\r\n /** Children content */\r\n children: React.ReactNode;\r\n /** Custom className */\r\n className?: string;\r\n /** Custom style */\r\n style?: React.CSSProperties;\r\n /** Click handler */\r\n onClick?: () => void;\r\n /** Full height mode */\r\n fullHeight?: boolean;\r\n /** Padding size */\r\n padding?: 'none' | 'sm' | 'md' | 'lg';\r\n}\r\n\r\n/**\r\n * GlassCard - Glassmorphic card with Zendir brand styling\r\n * \r\n * Features:\r\n * - Transparent blur background\r\n * - Gradient color overlays\r\n * - Accent lines with glow effects\r\n * - Legend support for charts\r\n * - Customizable via props or custom overlay object\r\n */\r\n/**\r\n * Create overlay from accent color hex\r\n */\r\nfunction createOverlayFromColor(color: string) {\r\n // Extract RGB from hex\r\n const hex = color.replace('#', '');\r\n const r = parseInt(hex.substring(0, 2), 16);\r\n const g = parseInt(hex.substring(2, 4), 16);\r\n const b = parseInt(hex.substring(4, 6), 16);\r\n \r\n return {\r\n gradient: `linear-gradient(135deg, rgba(${r}, ${g}, ${b}, 0.15) 0%, rgba(${r}, ${g}, ${b}, 0.05) 100%)`,\r\n accent: color,\r\n border: `rgba(${r}, ${g}, ${b}, 0.35)`,\r\n glow: `rgba(${r}, ${g}, ${b}, 0.5)`,\r\n };\r\n}\r\n\r\nexport const GlassCard = memo(function GlassCard({\r\n title,\r\n subtitle,\r\n colorOverlay = 'cyan',\r\n customOverlay,\r\n accentColor,\r\n accentPosition = 'top',\r\n accentStyle = 'gradient',\r\n icon,\r\n actions,\r\n legend,\r\n status,\r\n blur = 12,\r\n backgroundOpacity = 0.85,\r\n glowOnHover = true,\r\n children,\r\n className = '',\r\n style,\r\n onClick,\r\n fullHeight = false,\r\n padding = 'md',\r\n}: GlassCardProps): React.ReactElement {\r\n const { tokens, mode, theme } = useTheme();\r\n const isDark = mode === 'dark';\r\n const isTransparent = theme === 'transparent' || theme === 'transparent-bold' || theme === 'transparent-minimal';\r\n const isBoldVariant = theme === 'transparent-bold';\r\n const isMinimalVariant = theme === 'transparent-minimal';\r\n \r\n // Accent styling only for Bold/Minimal themes (or when position explicitly set for non-transparent)\r\n const showAccentStyling = isBoldVariant || isMinimalVariant || !isTransparent;\r\n \r\n // For all transparent themes, default to purple (Zendir accent) instead of cyan\r\n const effectiveColorOverlay = isTransparent && colorOverlay === 'cyan' ? 'purple' : colorOverlay;\r\n \r\n // Get overlay colors (priority: accentColor > customOverlay > colorOverlay)\r\n const overlay = accentColor \r\n ? createOverlayFromColor(accentColor)\r\n : customOverlay || GLASS_COLOR_OVERLAYS[effectiveColorOverlay];\r\n \r\n // Auto-switch to light token for 'white' overlay in light mode\r\n const effectiveOverlay = mode === 'light' && colorOverlay === 'white' && !accentColor && !customOverlay\r\n ? GLASS_COLOR_OVERLAYS.dark\r\n : overlay;\r\n \r\n // Theme-aware background colors\r\n const cardBackground = isDark\r\n ? `rgba(15, 20, 35, ${backgroundOpacity})`\r\n : `rgba(255, 255, 255, ${backgroundOpacity})`;\r\n \r\n // Theme-aware border colors\r\n const baseBorderColor = isDark\r\n ? effectiveOverlay.border\r\n : `rgba(100, 116, 139, 0.25)`;\r\n \r\n const paddingConfig = {\r\n none: '0',\r\n sm: tokens.spacing.sm,\r\n md: tokens.spacing.md,\r\n lg: tokens.spacing.lg,\r\n };\r\n \r\n const isInteractive = !!onClick;\r\n \r\n // Accent line styles based on position and style\r\n // Only show accent styling for Bold/Minimal themes (or non-transparent themes)\r\n const getAccentStyles = (): React.CSSProperties => {\r\n // For normal Glass theme, use subtle muted border instead of colored accent\r\n if (isTransparent && !showAccentStyling) {\r\n return {};\r\n }\r\n \r\n if (accentPosition === 'none') return {};\r\n \r\n const accentColorValue = effectiveOverlay.accent;\r\n const glowColor = effectiveOverlay.glow || accentColorValue;\r\n \r\n const baseAccentStyle: React.CSSProperties = {};\r\n \r\n // Position-based border\r\n const positions: Record<GlassAccentPosition, string> = {\r\n top: 'borderTop',\r\n left: 'borderLeft',\r\n right: 'borderRight',\r\n bottom: 'borderBottom',\r\n none: '',\r\n };\r\n \r\n const borderProp = positions[accentPosition] as keyof React.CSSProperties;\r\n \r\n if (accentStyle === 'solid') {\r\n (baseAccentStyle as any)[borderProp] = `2px solid ${accentColorValue}`;\r\n } else if (accentStyle === 'gradient' || accentStyle === 'glow') {\r\n // Using pseudo-element for gradient, so just set position indicator\r\n (baseAccentStyle as any)[borderProp] = `2px solid ${accentColorValue}`;\r\n if (accentStyle === 'glow') {\r\n baseAccentStyle.boxShadow = `0 -2px 20px ${glowColor}, 0 -1px 8px ${glowColor}`;\r\n }\r\n } else if (accentStyle === 'dots') {\r\n (baseAccentStyle as any)[borderProp] = `2px dotted ${accentColorValue}`;\r\n }\r\n \r\n return baseAccentStyle;\r\n };\r\n \r\n // Status color\r\n const statusColor = status ? tokens.colors.status[status] : undefined;\r\n \r\n return (\r\n <div\r\n className={classNames('zendir-glass-card', `zendir-glass-card--${colorOverlay}`, className)}\r\n onClick={onClick}\r\n role={isInteractive ? 'button' : undefined}\r\n tabIndex={isInteractive ? 0 : undefined}\r\n onKeyDown={onClick ? (e: React.KeyboardEvent) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); onClick(); } } : undefined}\r\n style={{\r\n position: 'relative',\r\n borderRadius: tokens.borderRadius.lg,\r\n overflow: 'hidden',\r\n height: fullHeight ? '100%' : 'auto',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n cursor: isInteractive ? 'pointer' : 'default',\r\n \r\n // Glassmorphic base (theme-aware)\r\n background: cardBackground,\r\n backdropFilter: isTransparent ? `blur(${blur}px)` : 'none',\r\n WebkitBackdropFilter: isTransparent ? `blur(${blur}px)` : 'none',\r\n \r\n // Border with color tint (theme-aware)\r\n border: `1px solid ${baseBorderColor}`,\r\n \r\n // Accent positioning\r\n ...getAccentStyles(),\r\n \r\n // Hover glow effect\r\n transition: 'all 0.3s ease-out',\r\n boxShadow: glowOnHover ? 'none' : undefined,\r\n \r\n ...style,\r\n }}\r\n onMouseEnter={(e) => {\r\n if (glowOnHover && effectiveOverlay.glow) {\r\n e.currentTarget.style.boxShadow = `0 0 30px ${effectiveOverlay.glow}, 0 4px 20px rgba(0,0,0,0.3)`;\r\n }\r\n }}\r\n onMouseLeave={(e) => {\r\n if (glowOnHover) {\r\n e.currentTarget.style.boxShadow = 'none';\r\n }\r\n }}\r\n >\r\n {/* Gradient overlay layer */}\r\n <div\r\n style={{\r\n position: 'absolute',\r\n inset: 0,\r\n background: effectiveOverlay.gradient,\r\n pointerEvents: 'none',\r\n zIndex: 0,\r\n }}\r\n />\r\n \r\n {/* Accent glow line (top) - only for Bold/Minimal themes */}\r\n {showAccentStyling && accentPosition === 'top' && accentStyle === 'glow' && (\r\n <div\r\n style={{\r\n position: 'absolute',\r\n top: 0,\r\n left: '10%',\r\n right: '10%',\r\n height: '2px',\r\n background: `linear-gradient(90deg, transparent, ${effectiveOverlay.accent}, transparent)`,\r\n boxShadow: `0 0 15px ${effectiveOverlay.glow}, 0 0 30px ${effectiveOverlay.glow}`,\r\n zIndex: 1,\r\n }}\r\n />\r\n )}\r\n \r\n {/* Content wrapper */}\r\n <div style={{ position: 'relative', zIndex: 1, display: 'flex', flexDirection: 'column', flex: 1 }}>\r\n {/* Header */}\r\n {(title || actions || legend) && (\r\n <div\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n gap: tokens.spacing.md,\r\n padding: `${paddingConfig[padding]} ${paddingConfig[padding]} 0`,\r\n marginBottom: tokens.spacing.sm,\r\n }}\r\n >\r\n {/* Title section */}\r\n <div style={{ display: 'flex', alignItems: 'center', gap: tokens.spacing.sm }}>\r\n {/* Icon */}\r\n {icon && (\r\n <span style={{ color: effectiveOverlay.accent, display: 'flex', alignItems: 'center' }}>\r\n {icon}\r\n </span>\r\n )}\r\n \r\n {/* Status shape — Astro UX dual-coded */}\r\n {status && statusColor && (() => {\r\n const s = 10;\r\n const h = s / 2;\r\n const glow = `drop-shadow(0 0 4px ${statusColor})`;\r\n switch (status) {\r\n case 'critical':\r\n return (\r\n <svg width={s} height={s} viewBox={`0 0 ${s} ${s}`} style={{ flexShrink: 0, filter: glow }}>\r\n <polygon points={`${h},${s} 0,0 ${s},0`} fill={statusColor} />\r\n </svg>\r\n );\r\n case 'serious':\r\n return (\r\n <svg width={s} height={s} viewBox={`0 0 ${s} ${s}`} style={{ flexShrink: 0, filter: glow }}>\r\n <polygon points={`${h},0 ${s},${h} ${h},${s} 0,${h}`} fill={statusColor} />\r\n </svg>\r\n );\r\n case 'caution':\r\n return (\r\n <svg width={s} height={s} viewBox={`0 0 ${s} ${s}`} style={{ flexShrink: 0, filter: glow }}>\r\n <rect width={s} height={s} fill={statusColor} />\r\n </svg>\r\n );\r\n case 'standby':\r\n return (\r\n <svg width={s} height={s} viewBox=\"0 0 12 12\" style={{ flexShrink: 0, filter: glow }}>\r\n <circle cx=\"6\" cy=\"6\" r=\"3.5\" fill=\"none\" stroke={statusColor} strokeWidth=\"2\" />\r\n </svg>\r\n );\r\n case 'off':\r\n return (\r\n <svg width={s} height={s} viewBox=\"0 0 12 12\" style={{ flexShrink: 0, filter: glow }}>\r\n <circle cx=\"6\" cy=\"6\" r=\"3\" fill={statusColor} />\r\n </svg>\r\n );\r\n default: // normal\r\n return (\r\n <svg width={s} height={s} viewBox={`0 0 ${s} ${s}`} style={{ flexShrink: 0, filter: glow }}>\r\n <circle cx={h} cy={h} r={h} fill={statusColor} />\r\n </svg>\r\n );\r\n }\r\n })()}\r\n \r\n {/* Title text — card heading system */}\r\n <div>\r\n {title && (\r\n <h3\r\n style={{\r\n margin: 0,\r\n fontSize: tokens.layout?.card?.heading?.titleFontSize ?? '1.125rem',\r\n fontWeight: tokens.layout?.card?.heading?.titleFontWeight ?? 500,\r\n color: effectiveOverlay.accent,\r\n letterSpacing: '0.5px',\r\n textShadow: `0 0 20px ${effectiveOverlay.glow}`,\r\n }}\r\n >\r\n {title}\r\n </h3>\r\n )}\r\n {subtitle && (\r\n <p\r\n style={{\r\n margin: `${tokens.spacing.xs} 0 0`,\r\n fontSize: tokens.typography.body[3].fontSize,\r\n color: tokens.colors.text.secondary,\r\n }}\r\n >\r\n {subtitle}\r\n </p>\r\n )}\r\n </div>\r\n </div>\r\n \r\n {/* Right section: legend + actions */}\r\n <div style={{ display: 'flex', alignItems: 'center', gap: tokens.spacing.md }}>\r\n {/* Legend items */}\r\n {legend && legend.length > 0 && (\r\n <div style={{ display: 'flex', alignItems: 'center', gap: tokens.spacing.md }}>\r\n {legend.map((item, idx) => (\r\n <div\r\n key={idx}\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: tokens.spacing.xs,\r\n }}\r\n >\r\n <span\r\n style={{\r\n width: '8px',\r\n height: '8px',\r\n borderRadius: '2px',\r\n backgroundColor: item.color,\r\n }}\r\n />\r\n <span\r\n style={{\r\n fontSize: tokens.typography.body[3].fontSize,\r\n color: tokens.colors.text.secondary,\r\n }}\r\n >\r\n {item.label}\r\n </span>\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n \r\n {/* Actions */}\r\n {actions && (\r\n <div style={{ display: 'flex', gap: tokens.spacing.xs }}>\r\n {actions}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n \r\n {/* Accent line - only for Bold/Minimal themes (no decorative dashes) */}\r\n {showAccentStyling && accentPosition === 'top' && (\r\n <div\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n padding: `0 ${paddingConfig[padding]}`,\r\n marginBottom: tokens.spacing.sm,\r\n }}\r\n >\r\n {/* Clean accent line with smooth gradient */}\r\n <div\r\n style={{\r\n flex: 1,\r\n height: '2px',\r\n background: `linear-gradient(90deg, ${effectiveOverlay.accent} 0%, ${effectiveOverlay.accent}60 70%, ${effectiveOverlay.accent}20 100%)`,\r\n boxShadow: `0 0 6px ${effectiveOverlay.accent}40`,\r\n }}\r\n />\r\n </div>\r\n )}\r\n \r\n {/* Content */}\r\n <div\r\n style={{\r\n flex: 1,\r\n padding: title ? `0 ${paddingConfig[padding]} ${paddingConfig[padding]}` : paddingConfig[padding],\r\n }}\r\n >\r\n {children}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n});\r\n\r\nexport default GlassCard;\r\n"],"names":["GlassCard"],"mappings":"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"}
1
+ {"version":3,"file":"GlassCard.js","names":[],"sources":["../../../../src/react/core/display/GlassCard.tsx"],"sourcesContent":["/**\r\n * @zendir/ui - GlassCard Component\r\n *\r\n * Glassmorphic card component with transparent blur backgrounds,\r\n * gradient overlays, and Zendir brand color accent system.\r\n *\r\n * Inspired by AstroUXDS radar chart styling with modern glassmorphism.\r\n *\r\n * @example\r\n * ```tsx\r\n * <GlassCard title=\"Radar Chart 001\" colorOverlay=\"electric\">\r\n * <RadarChart data={data} />\r\n * </GlassCard>\r\n *\r\n * <GlassCard title=\"System Status\" colorOverlay=\"purple\" accentPosition=\"top\">\r\n * <StatusContent />\r\n * </GlassCard>\r\n * ```\r\n */\r\n\r\nimport React, { memo } from \"react\";\r\nimport { useTheme } from \"../../theme\";\r\nimport { classNames, type StatusLevel } from \"../../utils\";\r\n\r\n// =============================================================================\r\n// Zendir Brand Color Palette for Glass Overlays\r\n// =============================================================================\r\n\r\nexport const GLASS_COLOR_OVERLAYS = {\r\n // Core brand colors\r\n electric: {\r\n gradient:\r\n \"linear-gradient(135deg, rgba(62, 60, 255, 0.15) 0%, rgba(62, 60, 255, 0.05) 100%)\",\r\n accent: \"#3E3CFF\",\r\n border: \"rgba(62, 60, 255, 0.3)\",\r\n glow: \"rgba(62, 60, 255, 0.4)\",\r\n },\r\n purple: {\r\n gradient:\r\n \"linear-gradient(135deg, rgba(157, 112, 255, 0.15) 0%, rgba(157, 112, 255, 0.05) 100%)\",\r\n accent: \"#9D70FF\",\r\n border: \"rgba(157, 112, 255, 0.3)\",\r\n glow: \"rgba(157, 112, 255, 0.4)\",\r\n },\r\n prussianBlue: {\r\n gradient:\r\n \"linear-gradient(135deg, rgba(27, 45, 160, 0.2) 0%, rgba(27, 45, 160, 0.08) 100%)\",\r\n accent: \"#1B2DA0\",\r\n border: \"rgba(27, 45, 160, 0.4)\",\r\n glow: \"rgba(27, 45, 160, 0.5)\",\r\n },\r\n\r\n // Cyan/Teal (matching the reference image style)\r\n cyan: {\r\n gradient:\r\n \"linear-gradient(135deg, rgba(0, 212, 255, 0.12) 0%, rgba(0, 180, 220, 0.04) 100%)\",\r\n accent: \"#00D4FF\",\r\n border: \"rgba(0, 212, 255, 0.35)\",\r\n glow: \"rgba(0, 212, 255, 0.5)\",\r\n },\r\n teal: {\r\n gradient:\r\n \"linear-gradient(135deg, rgba(45, 204, 255, 0.12) 0%, rgba(45, 204, 255, 0.04) 100%)\",\r\n accent: \"#2DCCFF\",\r\n border: \"rgba(45, 204, 255, 0.35)\",\r\n glow: \"rgba(45, 204, 255, 0.5)\",\r\n },\r\n\r\n // Neutral options\r\n dark: {\r\n gradient:\r\n \"linear-gradient(135deg, rgba(0, 0, 0, 0.4) 0%, rgba(0, 0, 0, 0.2) 100%)\",\r\n accent: \"#1a1a2e\",\r\n border: \"rgba(255, 255, 255, 0.1)\",\r\n glow: \"rgba(0, 0, 0, 0.3)\",\r\n },\r\n light: {\r\n gradient:\r\n \"linear-gradient(135deg, rgba(255, 255, 255, 0.15) 0%, rgba(255, 255, 255, 0.05) 100%)\",\r\n accent: \"#ffffff\",\r\n border: \"rgba(255, 255, 255, 0.25)\",\r\n glow: \"rgba(255, 255, 255, 0.3)\",\r\n },\r\n white: {\r\n gradient:\r\n \"linear-gradient(135deg, rgba(255, 255, 255, 0.2) 0%, rgba(255, 255, 255, 0.08) 100%)\",\r\n accent: \"#ffffff\",\r\n border: \"rgba(255, 255, 255, 0.3)\",\r\n glow: \"rgba(255, 255, 255, 0.4)\",\r\n },\r\n\r\n // Additional shades\r\n electricLight: {\r\n gradient:\r\n \"linear-gradient(135deg, rgba(107, 105, 255, 0.15) 0%, rgba(107, 105, 255, 0.05) 100%)\",\r\n accent: \"#6B69FF\",\r\n border: \"rgba(107, 105, 255, 0.3)\",\r\n glow: \"rgba(107, 105, 255, 0.4)\",\r\n },\r\n purpleLight: {\r\n gradient:\r\n \"linear-gradient(135deg, rgba(180, 141, 255, 0.15) 0%, rgba(180, 141, 255, 0.05) 100%)\",\r\n accent: \"#B48DFF\",\r\n border: \"rgba(180, 141, 255, 0.3)\",\r\n glow: \"rgba(180, 141, 255, 0.4)\",\r\n },\r\n\r\n // No overlay (transparent)\r\n none: {\r\n gradient: \"none\",\r\n accent: \"transparent\",\r\n border: \"rgba(255, 255, 255, 0.1)\",\r\n glow: \"transparent\",\r\n },\r\n} as const;\r\n\r\nexport type GlassColorOverlay = keyof typeof GLASS_COLOR_OVERLAYS;\r\n\r\nexport type GlassAccentPosition = \"top\" | \"left\" | \"right\" | \"bottom\" | \"none\";\r\n\r\nexport interface GlassCardProps {\r\n /** Card title with optional icon */\r\n title?: React.ReactNode;\r\n /** Subtitle text */\r\n subtitle?: React.ReactNode;\r\n /** Color overlay from Zendir brand palette */\r\n colorOverlay?: GlassColorOverlay;\r\n /** Custom color overlay (hex or rgba) */\r\n customOverlay?: {\r\n gradient: string;\r\n accent: string;\r\n border: string;\r\n glow?: string;\r\n };\r\n /**\r\n * Accent color (hex) - auto-generates overlay from this color\r\n * Overrides colorOverlay if provided\r\n * Can be used with CardAccentProvider: accentColor={getAccentColor(title)}\r\n */\r\n accentColor?: string;\r\n /** Position of the accent line/glow */\r\n accentPosition?: GlassAccentPosition;\r\n /** Accent line style */\r\n accentStyle?: \"solid\" | \"gradient\" | \"glow\" | \"dots\";\r\n /** Header icon (rendered before title) */\r\n icon?: React.ReactNode;\r\n /** Header right actions (legend, buttons, etc.) */\r\n actions?: React.ReactNode;\r\n /** Legend items to display in header */\r\n legend?: Array<{ label: string; color: string }>;\r\n /** Status indicator */\r\n status?: StatusLevel;\r\n /** Blur intensity (0-20) */\r\n blur?: number;\r\n /** Background opacity (0-1) */\r\n backgroundOpacity?: number;\r\n /** Enable glow effect on hover */\r\n glowOnHover?: boolean;\r\n /** Children content */\r\n children: React.ReactNode;\r\n /** Custom className */\r\n className?: string;\r\n /** Custom style */\r\n style?: React.CSSProperties;\r\n /** Click handler */\r\n onClick?: () => void;\r\n /** Full height mode */\r\n fullHeight?: boolean;\r\n /** Padding size */\r\n padding?: \"none\" | \"sm\" | \"md\" | \"lg\";\r\n}\r\n\r\n/**\r\n * GlassCard - Glassmorphic card with Zendir brand styling\r\n *\r\n * Features:\r\n * - Transparent blur background\r\n * - Gradient color overlays\r\n * - Accent lines with glow effects\r\n * - Legend support for charts\r\n * - Customizable via props or custom overlay object\r\n */\r\n/**\r\n * Create overlay from accent color hex\r\n */\r\nfunction createOverlayFromColor(color: string) {\r\n // Extract RGB from hex\r\n const hex = color.replace(\"#\", \"\");\r\n const r = parseInt(hex.substring(0, 2), 16);\r\n const g = parseInt(hex.substring(2, 4), 16);\r\n const b = parseInt(hex.substring(4, 6), 16);\r\n\r\n return {\r\n gradient: `linear-gradient(135deg, rgba(${r}, ${g}, ${b}, 0.15) 0%, rgba(${r}, ${g}, ${b}, 0.05) 100%)`,\r\n accent: color,\r\n border: `rgba(${r}, ${g}, ${b}, 0.35)`,\r\n glow: `rgba(${r}, ${g}, ${b}, 0.5)`,\r\n };\r\n}\r\n\r\nexport const GlassCard = memo(function GlassCard({\r\n title,\r\n subtitle,\r\n colorOverlay = \"cyan\",\r\n customOverlay,\r\n accentColor,\r\n accentPosition = \"top\",\r\n accentStyle = \"gradient\",\r\n icon,\r\n actions,\r\n legend,\r\n status,\r\n blur = 12,\r\n backgroundOpacity = 0.85,\r\n glowOnHover = true,\r\n children,\r\n className = \"\",\r\n style,\r\n onClick,\r\n fullHeight = false,\r\n padding = \"md\",\r\n}: GlassCardProps): React.ReactElement {\r\n const { tokens, mode, theme } = useTheme();\r\n const isDark = mode === \"dark\";\r\n const isTransparent =\r\n theme === \"transparent\" ||\r\n theme === \"transparent-bold\" ||\r\n theme === \"transparent-minimal\";\r\n const isBoldVariant = theme === \"transparent-bold\";\r\n const isMinimalVariant = theme === \"transparent-minimal\";\r\n\r\n // Accent styling only for Bold/Minimal themes (or when position explicitly set for non-transparent)\r\n const showAccentStyling = isBoldVariant || isMinimalVariant || !isTransparent;\r\n\r\n // For all transparent themes, default to purple (Zendir accent) instead of cyan\r\n const effectiveColorOverlay =\r\n isTransparent && colorOverlay === \"cyan\" ? \"purple\" : colorOverlay;\r\n\r\n // Get overlay colors (priority: accentColor > customOverlay > colorOverlay)\r\n const overlay = accentColor\r\n ? createOverlayFromColor(accentColor)\r\n : customOverlay || GLASS_COLOR_OVERLAYS[effectiveColorOverlay];\r\n\r\n // Auto-switch to light token for 'white' overlay in light mode\r\n const effectiveOverlay =\r\n mode === \"light\" &&\r\n colorOverlay === \"white\" &&\r\n !accentColor &&\r\n !customOverlay\r\n ? GLASS_COLOR_OVERLAYS.dark\r\n : overlay;\r\n\r\n // Theme-aware background colors\r\n const cardBackground = isDark\r\n ? `rgba(15, 20, 35, ${backgroundOpacity})`\r\n : `rgba(255, 255, 255, ${backgroundOpacity})`;\r\n\r\n // Theme-aware border colors\r\n const baseBorderColor = isDark\r\n ? effectiveOverlay.border\r\n : `rgba(100, 116, 139, 0.25)`;\r\n\r\n const paddingConfig = {\r\n none: \"0\",\r\n sm: tokens.spacing.sm,\r\n md: tokens.spacing.md,\r\n lg: tokens.spacing.lg,\r\n };\r\n\r\n const isInteractive = !!onClick;\r\n\r\n // Accent line styles based on position and style\r\n // Only show accent styling for Bold/Minimal themes (or non-transparent themes)\r\n const getAccentStyles = (): React.CSSProperties => {\r\n // For normal Glass theme, use subtle muted border instead of colored accent\r\n if (isTransparent && !showAccentStyling) {\r\n return {};\r\n }\r\n\r\n if (accentPosition === \"none\") return {};\r\n\r\n const accentColorValue = effectiveOverlay.accent;\r\n const glowColor = effectiveOverlay.glow || accentColorValue;\r\n\r\n const baseAccentStyle: React.CSSProperties = {};\r\n\r\n // Position-based border\r\n const positions: Record<GlassAccentPosition, string> = {\r\n top: \"borderTop\",\r\n left: \"borderLeft\",\r\n right: \"borderRight\",\r\n bottom: \"borderBottom\",\r\n none: \"\",\r\n };\r\n\r\n const borderProp = positions[accentPosition] as keyof React.CSSProperties;\r\n\r\n if (accentStyle === \"solid\") {\r\n (baseAccentStyle as any)[borderProp] = `2px solid ${accentColorValue}`;\r\n } else if (accentStyle === \"gradient\" || accentStyle === \"glow\") {\r\n // Using pseudo-element for gradient, so just set position indicator\r\n (baseAccentStyle as any)[borderProp] = `2px solid ${accentColorValue}`;\r\n if (accentStyle === \"glow\") {\r\n baseAccentStyle.boxShadow = `0 -2px 20px ${glowColor}, 0 -1px 8px ${glowColor}`;\r\n }\r\n } else if (accentStyle === \"dots\") {\r\n (baseAccentStyle as any)[borderProp] = `2px dotted ${accentColorValue}`;\r\n }\r\n\r\n return baseAccentStyle;\r\n };\r\n\r\n // Status color\r\n const statusColor = status ? tokens.colors.status[status] : undefined;\r\n\r\n return (\r\n <div\r\n className={classNames(\r\n \"zendir-glass-card\",\r\n `zendir-glass-card--${colorOverlay}`,\r\n className,\r\n )}\r\n onClick={onClick}\r\n role={isInteractive ? \"button\" : undefined}\r\n tabIndex={isInteractive ? 0 : undefined}\r\n onKeyDown={\r\n onClick\r\n ? (e: React.KeyboardEvent) => {\r\n if (e.key === \"Enter\" || e.key === \" \") {\r\n e.preventDefault();\r\n onClick();\r\n }\r\n }\r\n : undefined\r\n }\r\n style={{\r\n position: \"relative\",\r\n borderRadius: tokens.borderRadius.lg,\r\n overflow: \"hidden\",\r\n height: fullHeight ? \"100%\" : \"auto\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n cursor: isInteractive ? \"pointer\" : \"default\",\r\n\r\n // Glassmorphic base (theme-aware)\r\n background: cardBackground,\r\n backdropFilter: isTransparent ? `blur(${blur}px)` : \"none\",\r\n WebkitBackdropFilter: isTransparent ? `blur(${blur}px)` : \"none\",\r\n\r\n // Border with color tint (theme-aware)\r\n border: `1px solid ${baseBorderColor}`,\r\n\r\n // Accent positioning\r\n ...getAccentStyles(),\r\n\r\n // Hover glow effect\r\n transition: \"all 0.3s ease-out\",\r\n boxShadow: glowOnHover ? \"none\" : undefined,\r\n\r\n ...style,\r\n }}\r\n onMouseEnter={(e) => {\r\n if (glowOnHover && effectiveOverlay.glow) {\r\n e.currentTarget.style.boxShadow = `0 0 30px ${effectiveOverlay.glow}, 0 4px 20px rgba(0,0,0,0.3)`;\r\n }\r\n }}\r\n onMouseLeave={(e) => {\r\n if (glowOnHover) {\r\n e.currentTarget.style.boxShadow = \"none\";\r\n }\r\n }}\r\n >\r\n {/* Gradient overlay layer */}\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n inset: 0,\r\n background: effectiveOverlay.gradient,\r\n pointerEvents: \"none\",\r\n zIndex: 0,\r\n }}\r\n />\r\n\r\n {/* Accent glow line (top) - only for Bold/Minimal themes */}\r\n {showAccentStyling &&\r\n accentPosition === \"top\" &&\r\n accentStyle === \"glow\" && (\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n top: 0,\r\n left: \"10%\",\r\n right: \"10%\",\r\n height: \"2px\",\r\n background: `linear-gradient(90deg, transparent, ${effectiveOverlay.accent}, transparent)`,\r\n boxShadow: `0 0 15px ${effectiveOverlay.glow}, 0 0 30px ${effectiveOverlay.glow}`,\r\n zIndex: 1,\r\n }}\r\n />\r\n )}\r\n\r\n {/* Content wrapper */}\r\n <div\r\n style={{\r\n position: \"relative\",\r\n zIndex: 1,\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n flex: 1,\r\n }}\r\n >\r\n {/* Header */}\r\n {(title || actions || legend) && (\r\n <div\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"space-between\",\r\n gap: tokens.spacing.md,\r\n padding: `${paddingConfig[padding]} ${paddingConfig[padding]} 0`,\r\n marginBottom: tokens.spacing.sm,\r\n }}\r\n >\r\n {/* Title section */}\r\n <div\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: tokens.spacing.sm,\r\n }}\r\n >\r\n {/* Icon */}\r\n {icon && (\r\n <span\r\n style={{\r\n color: effectiveOverlay.accent,\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n }}\r\n >\r\n {icon}\r\n </span>\r\n )}\r\n\r\n {/* Status shape — Astro UX dual-coded */}\r\n {status &&\r\n statusColor &&\r\n (() => {\r\n const s = 10;\r\n const h = s / 2;\r\n const glow = `drop-shadow(0 0 4px ${statusColor})`;\r\n switch (status) {\r\n case \"critical\":\r\n return (\r\n <svg\r\n width={s}\r\n height={s}\r\n viewBox={`0 0 ${s} ${s}`}\r\n style={{ flexShrink: 0, filter: glow }}\r\n >\r\n <polygon\r\n points={`${h},${s} 0,0 ${s},0`}\r\n fill={statusColor}\r\n />\r\n </svg>\r\n );\r\n case \"serious\":\r\n return (\r\n <svg\r\n width={s}\r\n height={s}\r\n viewBox={`0 0 ${s} ${s}`}\r\n style={{ flexShrink: 0, filter: glow }}\r\n >\r\n <polygon\r\n points={`${h},0 ${s},${h} ${h},${s} 0,${h}`}\r\n fill={statusColor}\r\n />\r\n </svg>\r\n );\r\n case \"caution\":\r\n return (\r\n <svg\r\n width={s}\r\n height={s}\r\n viewBox={`0 0 ${s} ${s}`}\r\n style={{ flexShrink: 0, filter: glow }}\r\n >\r\n <rect width={s} height={s} fill={statusColor} />\r\n </svg>\r\n );\r\n case \"standby\":\r\n return (\r\n <svg\r\n width={s}\r\n height={s}\r\n viewBox=\"0 0 12 12\"\r\n style={{ flexShrink: 0, filter: glow }}\r\n >\r\n <circle\r\n cx=\"6\"\r\n cy=\"6\"\r\n r=\"3.5\"\r\n fill=\"none\"\r\n stroke={statusColor}\r\n strokeWidth=\"2\"\r\n />\r\n </svg>\r\n );\r\n case \"off\":\r\n return (\r\n <svg\r\n width={s}\r\n height={s}\r\n viewBox=\"0 0 12 12\"\r\n style={{ flexShrink: 0, filter: glow }}\r\n >\r\n <circle cx=\"6\" cy=\"6\" r=\"3\" fill={statusColor} />\r\n </svg>\r\n );\r\n default: // normal\r\n return (\r\n <svg\r\n width={s}\r\n height={s}\r\n viewBox={`0 0 ${s} ${s}`}\r\n style={{ flexShrink: 0, filter: glow }}\r\n >\r\n <circle cx={h} cy={h} r={h} fill={statusColor} />\r\n </svg>\r\n );\r\n }\r\n })()}\r\n\r\n {/* Title text — card heading system */}\r\n <div>\r\n {title && (\r\n <h3\r\n style={{\r\n margin: 0,\r\n fontSize:\r\n tokens.layout?.card?.heading?.titleFontSize ??\r\n \"1.125rem\",\r\n fontWeight:\r\n tokens.layout?.card?.heading?.titleFontWeight ?? 500,\r\n color: effectiveOverlay.accent,\r\n letterSpacing: \"0.5px\",\r\n textShadow: `0 0 20px ${effectiveOverlay.glow}`,\r\n }}\r\n >\r\n {title}\r\n </h3>\r\n )}\r\n {subtitle && (\r\n <p\r\n style={{\r\n margin: `${tokens.spacing.xs} 0 0`,\r\n fontSize: tokens.typography.body[3].fontSize,\r\n color: tokens.colors.text.secondary,\r\n }}\r\n >\r\n {subtitle}\r\n </p>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Right section: legend + actions */}\r\n <div\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: tokens.spacing.md,\r\n }}\r\n >\r\n {/* Legend items */}\r\n {legend && legend.length > 0 && (\r\n <div\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: tokens.spacing.md,\r\n }}\r\n >\r\n {legend.map((item, idx) => (\r\n <div\r\n key={idx}\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: tokens.spacing.xs,\r\n }}\r\n >\r\n <span\r\n style={{\r\n width: \"8px\",\r\n height: \"8px\",\r\n borderRadius: \"2px\",\r\n backgroundColor: item.color,\r\n }}\r\n />\r\n <span\r\n style={{\r\n fontSize: tokens.typography.body[3].fontSize,\r\n color: tokens.colors.text.secondary,\r\n }}\r\n >\r\n {item.label}\r\n </span>\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n\r\n {/* Actions */}\r\n {actions && (\r\n <div style={{ display: \"flex\", gap: tokens.spacing.xs }}>\r\n {actions}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Accent line - only for Bold/Minimal themes (no decorative dashes) */}\r\n {showAccentStyling && accentPosition === \"top\" && (\r\n <div\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n padding: `0 ${paddingConfig[padding]}`,\r\n marginBottom: tokens.spacing.sm,\r\n }}\r\n >\r\n {/* Clean accent line with smooth gradient */}\r\n <div\r\n style={{\r\n flex: 1,\r\n height: \"2px\",\r\n background: `linear-gradient(90deg, ${effectiveOverlay.accent} 0%, ${effectiveOverlay.accent}60 70%, ${effectiveOverlay.accent}20 100%)`,\r\n boxShadow: `0 0 6px ${effectiveOverlay.accent}40`,\r\n }}\r\n />\r\n </div>\r\n )}\r\n\r\n {/* Content */}\r\n <div\r\n style={{\r\n flex: 1,\r\n padding: title\r\n ? `0 ${paddingConfig[padding]} ${paddingConfig[padding]}`\r\n : paddingConfig[padding],\r\n }}\r\n >\r\n {children}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n});\r\n\r\nexport default GlassCard;\r\n"],"mappings":"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"}
@@ -1,7 +1,6 @@
1
1
  import { default as React } from 'react';
2
2
  import { StatusLevel } from '../../utils';
3
3
  import { AstroIconName } from './AstroIcon';
4
-
5
4
  export interface HeaderIconWithStatusProps {
6
5
  /** Astro icon name */
7
6
  icon: AstroIconName | string;
@@ -1,157 +1,157 @@
1
- import { jsxs, jsx } from "react/jsx-runtime";
2
- import { memo } from "react";
3
1
  import { useTheme } from "../../theme/ThemeProvider.js";
4
2
  import { AstroIcon } from "./AstroIcon.js";
5
- const STATUS_BORDER_COLORS = {
6
- off: "#3c3e42",
7
- standby: "#285766",
8
- normal: "#005a00",
9
- caution: "#645600",
10
- serious: "#664618",
11
- critical: "#661102"
3
+ import { memo } from "react";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ //#region src/react/core/display/HeaderIconWithStatus.tsx
6
+ /**
7
+ * @zendir/ui - HeaderIconWithStatus Component
8
+ *
9
+ * Shared component for card/chart header icons with status indicator.
10
+ * Follows MonitoringIcon pattern for Astro UX compliance.
11
+ *
12
+ * Features:
13
+ * - Status indicator positioned at top-left with transform offset
14
+ * - Glow effect in dark mode for visibility
15
+ * - Border in light mode for WCAG AA compliance
16
+ * - Theme-aware colors
17
+ * - Consistent sizing across all usages
18
+ */
19
+ var STATUS_BORDER_COLORS = {
20
+ off: "#3c3e42",
21
+ standby: "#285766",
22
+ normal: "#005a00",
23
+ caution: "#645600",
24
+ serious: "#664618",
25
+ critical: "#661102"
12
26
  };
13
- const StatusShape = ({ status, size, color, borderColor, glow = true }) => {
14
- const hasBorder = !!borderColor;
15
- const strokeWidth = hasBorder ? 1 : 0;
16
- const glowFilter = glow && !hasBorder ? `drop-shadow(0 0 3px ${color})` : void 0;
17
- const renderShape = () => {
18
- switch (status) {
19
- case "off":
20
- return /* @__PURE__ */ jsx("circle", { cx: "6", cy: "6", r: hasBorder ? 2.5 : 3, fill: color, stroke: borderColor, strokeWidth });
21
- case "standby":
22
- return /* @__PURE__ */ jsx("circle", { cx: "6", cy: "6", r: "3.5", fill: "none", stroke: color, strokeWidth: "2" });
23
- case "normal":
24
- return /* @__PURE__ */ jsx(
25
- "circle",
26
- {
27
- cx: "6",
28
- cy: "6",
29
- r: hasBorder ? 4.5 : 5,
30
- fill: color,
31
- stroke: borderColor,
32
- strokeWidth
33
- }
34
- );
35
- case "caution":
36
- return /* @__PURE__ */ jsx(
37
- "rect",
38
- {
39
- x: hasBorder ? 1.5 : 1,
40
- y: hasBorder ? 1.5 : 1,
41
- width: hasBorder ? 9 : 10,
42
- height: hasBorder ? 9 : 10,
43
- fill: color,
44
- stroke: borderColor,
45
- strokeWidth
46
- }
47
- );
48
- case "serious":
49
- return /* @__PURE__ */ jsx(
50
- "polygon",
51
- {
52
- points: "6,1 11,6 6,11 1,6",
53
- fill: color,
54
- stroke: borderColor,
55
- strokeWidth
56
- }
57
- );
58
- case "critical":
59
- return /* @__PURE__ */ jsx(
60
- "polygon",
61
- {
62
- points: "6,11 1,2 11,2",
63
- fill: color,
64
- stroke: borderColor,
65
- strokeWidth
66
- }
67
- );
68
- default:
69
- return null;
70
- }
71
- };
72
- return /* @__PURE__ */ jsx(
73
- "svg",
74
- {
75
- viewBox: "0 0 12 12",
76
- width: size,
77
- height: size,
78
- style: { filter: glowFilter },
79
- children: renderShape()
80
- }
81
- );
27
+ var StatusShape = ({ status, size, color, borderColor, glow = true }) => {
28
+ const hasBorder = !!borderColor;
29
+ const strokeWidth = hasBorder ? 1 : 0;
30
+ const glowFilter = glow && !hasBorder ? `drop-shadow(0 0 3px ${color})` : void 0;
31
+ const renderShape = () => {
32
+ switch (status) {
33
+ case "off": return /* @__PURE__ */ jsx("circle", {
34
+ cx: "6",
35
+ cy: "6",
36
+ r: hasBorder ? 2.5 : 3,
37
+ fill: color,
38
+ stroke: borderColor,
39
+ strokeWidth
40
+ });
41
+ case "standby": return /* @__PURE__ */ jsx("circle", {
42
+ cx: "6",
43
+ cy: "6",
44
+ r: "3.5",
45
+ fill: "none",
46
+ stroke: color,
47
+ strokeWidth: "2"
48
+ });
49
+ case "normal": return /* @__PURE__ */ jsx("circle", {
50
+ cx: "6",
51
+ cy: "6",
52
+ r: hasBorder ? 4.5 : 5,
53
+ fill: color,
54
+ stroke: borderColor,
55
+ strokeWidth
56
+ });
57
+ case "caution": return /* @__PURE__ */ jsx("rect", {
58
+ x: hasBorder ? 1.5 : 1,
59
+ y: hasBorder ? 1.5 : 1,
60
+ width: hasBorder ? 9 : 10,
61
+ height: hasBorder ? 9 : 10,
62
+ fill: color,
63
+ stroke: borderColor,
64
+ strokeWidth
65
+ });
66
+ case "serious": return /* @__PURE__ */ jsx("polygon", {
67
+ points: "6,1 11,6 6,11 1,6",
68
+ fill: color,
69
+ stroke: borderColor,
70
+ strokeWidth
71
+ });
72
+ case "critical": return /* @__PURE__ */ jsx("polygon", {
73
+ points: "6,11 1,2 11,2",
74
+ fill: color,
75
+ stroke: borderColor,
76
+ strokeWidth
77
+ });
78
+ default: return null;
79
+ }
80
+ };
81
+ return /* @__PURE__ */ jsx("svg", {
82
+ viewBox: "0 0 12 12",
83
+ width: size,
84
+ height: size,
85
+ style: { filter: glowFilter },
86
+ children: renderShape()
87
+ });
82
88
  };
83
- const HeaderIconWithStatus = memo(function HeaderIconWithStatus2({
84
- icon,
85
- size = 24,
86
- status,
87
- statusColor: statusColorProp,
88
- isLightTheme: isLightThemeProp,
89
- className,
90
- style
91
- }) {
92
- const { tokens, mode } = useTheme();
93
- const isLightTheme = isLightThemeProp ?? mode === "light";
94
- const statusColor = statusColorProp ?? tokens.colors.status[status] ?? "#a4abb6";
95
- const borderColor = isLightTheme ? STATUS_BORDER_COLORS[status] : void 0;
96
- const badgeSize = Math.max(7, Math.min(12, Math.round(size * 0.38)));
97
- const transformOffset = "translate(-35%, -35%)";
98
- return /* @__PURE__ */ jsxs(
99
- "div",
100
- {
101
- role: "img",
102
- "aria-label": `${icon} status: ${status}`,
103
- className,
104
- style: {
105
- position: "relative",
106
- display: "flex",
107
- alignItems: "center",
108
- justifyContent: "center",
109
- width: size,
110
- height: size,
111
- flexShrink: 0,
112
- color: statusColor,
113
- ...style
114
- },
115
- children: [
116
- /* @__PURE__ */ jsx(
117
- AstroIcon,
118
- {
119
- name: icon,
120
- size,
121
- color: statusColor,
122
- "aria-hidden": "true"
123
- }
124
- ),
125
- /* @__PURE__ */ jsx(
126
- "span",
127
- {
128
- "aria-hidden": "true",
129
- style: {
130
- position: "absolute",
131
- top: 0,
132
- left: 0,
133
- transform: transformOffset,
134
- display: "flex",
135
- alignItems: "center",
136
- justifyContent: "center"
137
- },
138
- children: /* @__PURE__ */ jsx(
139
- StatusShape,
140
- {
141
- status,
142
- size: badgeSize,
143
- color: statusColor,
144
- borderColor,
145
- glow: !isLightTheme
146
- }
147
- )
148
- }
149
- )
150
- ]
151
- }
152
- );
89
+ /**
90
+ * HeaderIconWithStatus - Card/Chart header icon with status indicator
91
+ *
92
+ * Follows MonitoringIcon pattern exactly:
93
+ * - Icon colored by status
94
+ * - Status symbol at top-left with transform offset
95
+ * - Glow in dark mode, border in light mode
96
+ *
97
+ * @example
98
+ * ```tsx
99
+ * <HeaderIconWithStatus
100
+ * icon="satellite-transmit"
101
+ * status="normal"
102
+ * size={24}
103
+ * />
104
+ * ```
105
+ */
106
+ var HeaderIconWithStatus = memo(function HeaderIconWithStatus({ icon, size = 24, status, statusColor: statusColorProp, isLightTheme: isLightThemeProp, className, style }) {
107
+ const { tokens, mode } = useTheme();
108
+ const isLightTheme = isLightThemeProp ?? mode === "light";
109
+ const statusColor = statusColorProp ?? tokens.colors.status[status] ?? "#a4abb6";
110
+ const borderColor = isLightTheme ? STATUS_BORDER_COLORS[status] : void 0;
111
+ const badgeSize = Math.max(7, Math.min(12, Math.round(size * .38)));
112
+ const transformOffset = "translate(-35%, -35%)";
113
+ return /* @__PURE__ */ jsxs("div", {
114
+ role: "img",
115
+ "aria-label": `${icon} — status: ${status}`,
116
+ className,
117
+ style: {
118
+ position: "relative",
119
+ display: "flex",
120
+ alignItems: "center",
121
+ justifyContent: "center",
122
+ width: size,
123
+ height: size,
124
+ flexShrink: 0,
125
+ color: statusColor,
126
+ ...style
127
+ },
128
+ children: [/* @__PURE__ */ jsx(AstroIcon, {
129
+ name: icon,
130
+ size,
131
+ color: statusColor,
132
+ "aria-hidden": "true"
133
+ }), /* @__PURE__ */ jsx("span", {
134
+ "aria-hidden": "true",
135
+ style: {
136
+ position: "absolute",
137
+ top: 0,
138
+ left: 0,
139
+ transform: transformOffset,
140
+ display: "flex",
141
+ alignItems: "center",
142
+ justifyContent: "center"
143
+ },
144
+ children: /* @__PURE__ */ jsx(StatusShape, {
145
+ status,
146
+ size: badgeSize,
147
+ color: statusColor,
148
+ borderColor,
149
+ glow: !isLightTheme
150
+ })
151
+ })]
152
+ });
153
153
  });
154
- export {
155
- HeaderIconWithStatus
156
- };
157
- //# sourceMappingURL=HeaderIconWithStatus.js.map
154
+ //#endregion
155
+ export { HeaderIconWithStatus, HeaderIconWithStatus as default };
156
+
157
+ //# sourceMappingURL=HeaderIconWithStatus.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"HeaderIconWithStatus.js","sources":["../../../../src/react/core/display/HeaderIconWithStatus.tsx"],"sourcesContent":["/**\n * @zendir/ui - HeaderIconWithStatus Component\n * \n * Shared component for card/chart header icons with status indicator.\n * Follows MonitoringIcon pattern for Astro UX compliance.\n * \n * Features:\n * - Status indicator positioned at top-left with transform offset\n * - Glow effect in dark mode for visibility\n * - Border in light mode for WCAG AA compliance\n * - Theme-aware colors\n * - Consistent sizing across all usages\n */\n\nimport React, { memo } from 'react';\nimport { useTheme } from '../../theme';\nimport { type StatusLevel } from '../../utils';\nimport { AstroIcon, type AstroIconName } from './AstroIcon';\n\n// =============================================================================\n// Astro UX Status Border Colors - Required for light theme WCAG compliance\n// https://www.astrouxds.com/patterns/status-system/\n// =============================================================================\n\nconst STATUS_BORDER_COLORS: Record<StatusLevel, string> = {\n off: '#3c3e42',\n standby: '#285766',\n normal: '#005a00',\n caution: '#645600',\n serious: '#664618',\n critical: '#661102',\n};\n\n// =============================================================================\n// Status Shape SVG - Matches MonitoringIcon exactly\n// =============================================================================\n\ninterface StatusShapeProps {\n status: StatusLevel;\n size: number;\n color: string;\n borderColor?: string;\n glow?: boolean;\n}\n\nconst StatusShape = ({ status, size, color, borderColor, glow = true }: StatusShapeProps) => {\n const hasBorder = !!borderColor;\n const strokeWidth = hasBorder ? 1 : 0;\n const glowFilter = glow && !hasBorder ? `drop-shadow(0 0 3px ${color})` : undefined;\n \n const renderShape = () => {\n switch (status) {\n case 'off':\n return <circle cx=\"6\" cy=\"6\" r={hasBorder ? 2.5 : 3} fill={color} stroke={borderColor} strokeWidth={strokeWidth} />;\n case 'standby':\n return <circle cx=\"6\" cy=\"6\" r=\"3.5\" fill=\"none\" stroke={color} strokeWidth=\"2\" />;\n case 'normal':\n return (\n <circle\n cx=\"6\"\n cy=\"6\"\n r={hasBorder ? 4.5 : 5}\n fill={color}\n stroke={borderColor}\n strokeWidth={strokeWidth}\n />\n );\n case 'caution':\n return (\n <rect\n x={hasBorder ? 1.5 : 1}\n y={hasBorder ? 1.5 : 1}\n width={hasBorder ? 9 : 10}\n height={hasBorder ? 9 : 10}\n fill={color}\n stroke={borderColor}\n strokeWidth={strokeWidth}\n />\n );\n case 'serious':\n return (\n <polygon\n points=\"6,1 11,6 6,11 1,6\"\n fill={color}\n stroke={borderColor}\n strokeWidth={strokeWidth}\n />\n );\n case 'critical':\n return (\n <polygon\n points=\"6,11 1,2 11,2\"\n fill={color}\n stroke={borderColor}\n strokeWidth={strokeWidth}\n />\n );\n default:\n return null;\n }\n };\n \n return (\n <svg \n viewBox=\"0 0 12 12\" \n width={size} \n height={size}\n style={{ filter: glowFilter }}\n >\n {renderShape()}\n </svg>\n );\n};\n\n// =============================================================================\n// HeaderIconWithStatus Component\n// =============================================================================\n\nexport interface HeaderIconWithStatusProps {\n /** Astro icon name */\n icon: AstroIconName | string;\n /** Icon size in pixels */\n size?: number;\n /** Status level */\n status: StatusLevel;\n /** Custom status color (optional - defaults to theme status color) */\n statusColor?: string;\n /** Override light theme detection */\n isLightTheme?: boolean;\n /** Additional CSS class */\n className?: string;\n /** Additional inline styles */\n style?: React.CSSProperties;\n}\n\n/**\n * HeaderIconWithStatus - Card/Chart header icon with status indicator\n * \n * Follows MonitoringIcon pattern exactly:\n * - Icon colored by status\n * - Status symbol at top-left with transform offset\n * - Glow in dark mode, border in light mode\n * \n * @example\n * ```tsx\n * <HeaderIconWithStatus\n * icon=\"satellite-transmit\"\n * status=\"normal\"\n * size={24}\n * />\n * ```\n */\nexport const HeaderIconWithStatus = memo(function HeaderIconWithStatus({\n icon,\n size = 24,\n status,\n statusColor: statusColorProp,\n isLightTheme: isLightThemeProp,\n className,\n style,\n}: HeaderIconWithStatusProps) {\n const { tokens, mode } = useTheme();\n \n // Theme detection\n const isLightTheme = isLightThemeProp ?? mode === 'light';\n \n // Status color from theme or prop\n const statusColor = statusColorProp ?? tokens.colors.status[status] ?? '#a4abb6';\n \n // Border color for light theme (WCAG compliance)\n const borderColor = isLightTheme ? STATUS_BORDER_COLORS[status] : undefined;\n \n // ═══════════════════════════════════════════════════════════════════════════\n // SIZING CONTROLS - Adjust these to match MonitoringIcon proportions\n // ═══════════════════════════════════════════════════════════════════════════\n // Badge size: ~35% of icon size (same ratio as MonitoringIcon's 9px badge on 24px icon)\n const badgeSize = Math.max(7, Math.min(12, Math.round(size * 0.38)));\n \n // Transform offset: translate(-35%, -35%) matches MonitoringIcon exactly\n const transformOffset = 'translate(-35%, -35%)';\n \n return (\n <div\n role=\"img\"\n aria-label={`${icon} — status: ${status}`}\n className={className}\n style={{\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: size,\n height: size,\n flexShrink: 0,\n color: statusColor,\n ...style,\n }}\n >\n {/* Icon - colored by status */}\n <AstroIcon \n name={icon as AstroIconName} \n size={size} \n color={statusColor}\n aria-hidden=\"true\"\n />\n \n {/* Status symbol - top-left corner with transform offset */}\n <span\n aria-hidden=\"true\"\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n transform: transformOffset,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <StatusShape \n status={status} \n size={badgeSize} \n color={statusColor} \n borderColor={borderColor}\n glow={!isLightTheme} \n />\n </span>\n </div>\n );\n});\n\nexport default HeaderIconWithStatus;\n"],"names":["HeaderIconWithStatus"],"mappings":";;;;AAwBA,MAAM,uBAAoD;AAAA,EACxD,KAAK;AAAA,EACL,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,SAAS;AAAA,EACT,UAAU;AACZ;AAcA,MAAM,cAAc,CAAC,EAAE,QAAQ,MAAM,OAAO,aAAa,OAAO,WAA6B;AAC3F,QAAM,YAAY,CAAC,CAAC;AACpB,QAAM,cAAc,YAAY,IAAI;AACpC,QAAM,aAAa,QAAQ,CAAC,YAAY,uBAAuB,KAAK,MAAM;AAE1E,QAAM,cAAc,MAAM;AACxB,YAAQ,QAAA;AAAA,MACN,KAAK;AACH,eAAO,oBAAC,UAAA,EAAO,IAAG,KAAI,IAAG,KAAI,GAAG,YAAY,MAAM,GAAG,MAAM,OAAO,QAAQ,aAAa,aAA0B;AAAA,MACnH,KAAK;AACH,eAAO,oBAAC,UAAA,EAAO,IAAG,KAAI,IAAG,KAAI,GAAE,OAAM,MAAK,QAAO,QAAQ,OAAO,aAAY,KAAI;AAAA,MAClF,KAAK;AACH,eACE;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,IAAG;AAAA,YACH,IAAG;AAAA,YACH,GAAG,YAAY,MAAM;AAAA,YACrB,MAAM;AAAA,YACN,QAAQ;AAAA,YACR;AAAA,UAAA;AAAA,QAAA;AAAA,MAGN,KAAK;AACH,eACE;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,GAAG,YAAY,MAAM;AAAA,YACrB,GAAG,YAAY,MAAM;AAAA,YACrB,OAAO,YAAY,IAAI;AAAA,YACvB,QAAQ,YAAY,IAAI;AAAA,YACxB,MAAM;AAAA,YACN,QAAQ;AAAA,YACR;AAAA,UAAA;AAAA,QAAA;AAAA,MAGN,KAAK;AACH,eACE;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,QAAO;AAAA,YACP,MAAM;AAAA,YACN,QAAQ;AAAA,YACR;AAAA,UAAA;AAAA,QAAA;AAAA,MAGN,KAAK;AACH,eACE;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,QAAO;AAAA,YACP,MAAM;AAAA,YACN,QAAQ;AAAA,YACR;AAAA,UAAA;AAAA,QAAA;AAAA,MAGN;AACE,eAAO;AAAA,IAAA;AAAA,EAEb;AAEA,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,SAAQ;AAAA,MACR,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,OAAO,EAAE,QAAQ,WAAA;AAAA,MAEhB,UAAA,YAAA;AAAA,IAAY;AAAA,EAAA;AAGnB;AAwCO,MAAM,uBAAuB,KAAK,SAASA,sBAAqB;AAAA,EACrE;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA,aAAa;AAAA,EACb,cAAc;AAAA,EACd;AAAA,EACA;AACF,GAA8B;AAC5B,QAAM,EAAE,QAAQ,KAAA,IAAS,SAAA;AAGzB,QAAM,eAAe,oBAAoB,SAAS;AAGlD,QAAM,cAAc,mBAAmB,OAAO,OAAO,OAAO,MAAM,KAAK;AAGvE,QAAM,cAAc,eAAe,qBAAqB,MAAM,IAAI;AAMlE,QAAM,YAAY,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,MAAM,OAAO,IAAI,CAAC,CAAC;AAGnE,QAAM,kBAAkB;AAExB,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,cAAY,GAAG,IAAI,cAAc,MAAM;AAAA,MACvC;AAAA,MACA,OAAO;AAAA,QACL,UAAU;AAAA,QACV,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,gBAAgB;AAAA,QAChB,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,GAAG;AAAA,MAAA;AAAA,MAIL,UAAA;AAAA,QAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAM;AAAA,YACN;AAAA,YACA,OAAO;AAAA,YACP,eAAY;AAAA,UAAA;AAAA,QAAA;AAAA,QAId;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,eAAY;AAAA,YACZ,OAAO;AAAA,cACL,UAAU;AAAA,cACV,KAAK;AAAA,cACL,MAAM;AAAA,cACN,WAAW;AAAA,cACX,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,gBAAgB;AAAA,YAAA;AAAA,YAGlB,UAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC;AAAA,gBACA,MAAM;AAAA,gBACN,OAAO;AAAA,gBACP;AAAA,gBACA,MAAM,CAAC;AAAA,cAAA;AAAA,YAAA;AAAA,UACT;AAAA,QAAA;AAAA,MACF;AAAA,IAAA;AAAA,EAAA;AAGN,CAAC;"}
1
+ {"version":3,"file":"HeaderIconWithStatus.js","names":[],"sources":["../../../../src/react/core/display/HeaderIconWithStatus.tsx"],"sourcesContent":["/**\r\n * @zendir/ui - HeaderIconWithStatus Component\r\n *\r\n * Shared component for card/chart header icons with status indicator.\r\n * Follows MonitoringIcon pattern for Astro UX compliance.\r\n *\r\n * Features:\r\n * - Status indicator positioned at top-left with transform offset\r\n * - Glow effect in dark mode for visibility\r\n * - Border in light mode for WCAG AA compliance\r\n * - Theme-aware colors\r\n * - Consistent sizing across all usages\r\n */\r\n\r\nimport React, { memo } from \"react\";\r\nimport { useTheme } from \"../../theme\";\r\nimport { type StatusLevel } from \"../../utils\";\r\nimport { AstroIcon, type AstroIconName } from \"./AstroIcon\";\r\n\r\n// =============================================================================\r\n// Astro UX Status Border Colors - Required for light theme WCAG compliance\r\n// https://www.astrouxds.com/patterns/status-system/\r\n// =============================================================================\r\n\r\nconst STATUS_BORDER_COLORS: Record<StatusLevel, string> = {\r\n off: \"#3c3e42\",\r\n standby: \"#285766\",\r\n normal: \"#005a00\",\r\n caution: \"#645600\",\r\n serious: \"#664618\",\r\n critical: \"#661102\",\r\n};\r\n\r\n// =============================================================================\r\n// Status Shape SVG - Matches MonitoringIcon exactly\r\n// =============================================================================\r\n\r\ninterface StatusShapeProps {\r\n status: StatusLevel;\r\n size: number;\r\n color: string;\r\n borderColor?: string;\r\n glow?: boolean;\r\n}\r\n\r\nconst StatusShape = ({\r\n status,\r\n size,\r\n color,\r\n borderColor,\r\n glow = true,\r\n}: StatusShapeProps) => {\r\n const hasBorder = !!borderColor;\r\n const strokeWidth = hasBorder ? 1 : 0;\r\n const glowFilter =\r\n glow && !hasBorder ? `drop-shadow(0 0 3px ${color})` : undefined;\r\n\r\n const renderShape = () => {\r\n switch (status) {\r\n case \"off\":\r\n return (\r\n <circle\r\n cx=\"6\"\r\n cy=\"6\"\r\n r={hasBorder ? 2.5 : 3}\r\n fill={color}\r\n stroke={borderColor}\r\n strokeWidth={strokeWidth}\r\n />\r\n );\r\n case \"standby\":\r\n return (\r\n <circle\r\n cx=\"6\"\r\n cy=\"6\"\r\n r=\"3.5\"\r\n fill=\"none\"\r\n stroke={color}\r\n strokeWidth=\"2\"\r\n />\r\n );\r\n case \"normal\":\r\n return (\r\n <circle\r\n cx=\"6\"\r\n cy=\"6\"\r\n r={hasBorder ? 4.5 : 5}\r\n fill={color}\r\n stroke={borderColor}\r\n strokeWidth={strokeWidth}\r\n />\r\n );\r\n case \"caution\":\r\n return (\r\n <rect\r\n x={hasBorder ? 1.5 : 1}\r\n y={hasBorder ? 1.5 : 1}\r\n width={hasBorder ? 9 : 10}\r\n height={hasBorder ? 9 : 10}\r\n fill={color}\r\n stroke={borderColor}\r\n strokeWidth={strokeWidth}\r\n />\r\n );\r\n case \"serious\":\r\n return (\r\n <polygon\r\n points=\"6,1 11,6 6,11 1,6\"\r\n fill={color}\r\n stroke={borderColor}\r\n strokeWidth={strokeWidth}\r\n />\r\n );\r\n case \"critical\":\r\n return (\r\n <polygon\r\n points=\"6,11 1,2 11,2\"\r\n fill={color}\r\n stroke={borderColor}\r\n strokeWidth={strokeWidth}\r\n />\r\n );\r\n default:\r\n return null;\r\n }\r\n };\r\n\r\n return (\r\n <svg\r\n viewBox=\"0 0 12 12\"\r\n width={size}\r\n height={size}\r\n style={{ filter: glowFilter }}\r\n >\r\n {renderShape()}\r\n </svg>\r\n );\r\n};\r\n\r\n// =============================================================================\r\n// HeaderIconWithStatus Component\r\n// =============================================================================\r\n\r\nexport interface HeaderIconWithStatusProps {\r\n /** Astro icon name */\r\n icon: AstroIconName | string;\r\n /** Icon size in pixels */\r\n size?: number;\r\n /** Status level */\r\n status: StatusLevel;\r\n /** Custom status color (optional - defaults to theme status color) */\r\n statusColor?: string;\r\n /** Override light theme detection */\r\n isLightTheme?: boolean;\r\n /** Additional CSS class */\r\n className?: string;\r\n /** Additional inline styles */\r\n style?: React.CSSProperties;\r\n}\r\n\r\n/**\r\n * HeaderIconWithStatus - Card/Chart header icon with status indicator\r\n *\r\n * Follows MonitoringIcon pattern exactly:\r\n * - Icon colored by status\r\n * - Status symbol at top-left with transform offset\r\n * - Glow in dark mode, border in light mode\r\n *\r\n * @example\r\n * ```tsx\r\n * <HeaderIconWithStatus\r\n * icon=\"satellite-transmit\"\r\n * status=\"normal\"\r\n * size={24}\r\n * />\r\n * ```\r\n */\r\nexport const HeaderIconWithStatus = memo(function HeaderIconWithStatus({\r\n icon,\r\n size = 24,\r\n status,\r\n statusColor: statusColorProp,\r\n isLightTheme: isLightThemeProp,\r\n className,\r\n style,\r\n}: HeaderIconWithStatusProps) {\r\n const { tokens, mode } = useTheme();\r\n\r\n // Theme detection\r\n const isLightTheme = isLightThemeProp ?? mode === \"light\";\r\n\r\n // Status color from theme or prop\r\n const statusColor =\r\n statusColorProp ?? tokens.colors.status[status] ?? \"#a4abb6\";\r\n\r\n // Border color for light theme (WCAG compliance)\r\n const borderColor = isLightTheme ? STATUS_BORDER_COLORS[status] : undefined;\r\n\r\n // ═══════════════════════════════════════════════════════════════════════════\r\n // SIZING CONTROLS - Adjust these to match MonitoringIcon proportions\r\n // ═══════════════════════════════════════════════════════════════════════════\r\n // Badge size: ~35% of icon size (same ratio as MonitoringIcon's 9px badge on 24px icon)\r\n const badgeSize = Math.max(7, Math.min(12, Math.round(size * 0.38)));\r\n\r\n // Transform offset: translate(-35%, -35%) matches MonitoringIcon exactly\r\n const transformOffset = \"translate(-35%, -35%)\";\r\n\r\n return (\r\n <div\r\n role=\"img\"\r\n aria-label={`${icon} — status: ${status}`}\r\n className={className}\r\n style={{\r\n position: \"relative\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n width: size,\r\n height: size,\r\n flexShrink: 0,\r\n color: statusColor,\r\n ...style,\r\n }}\r\n >\r\n {/* Icon - colored by status */}\r\n <AstroIcon\r\n name={icon as AstroIconName}\r\n size={size}\r\n color={statusColor}\r\n aria-hidden=\"true\"\r\n />\r\n\r\n {/* Status symbol - top-left corner with transform offset */}\r\n <span\r\n aria-hidden=\"true\"\r\n style={{\r\n position: \"absolute\",\r\n top: 0,\r\n left: 0,\r\n transform: transformOffset,\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n }}\r\n >\r\n <StatusShape\r\n status={status}\r\n size={badgeSize}\r\n color={statusColor}\r\n borderColor={borderColor}\r\n glow={!isLightTheme}\r\n />\r\n </span>\r\n </div>\r\n );\r\n});\r\n\r\nexport default HeaderIconWithStatus;\r\n"],"mappings":";;;;;;;;;;;;;;;;;;AAwBA,IAAM,uBAAoD;CACxD,KAAK;CACL,SAAS;CACT,QAAQ;CACR,SAAS;CACT,SAAS;CACT,UAAU;AACZ;AAcA,IAAM,eAAe,EACnB,QACA,MACA,OACA,aACA,OAAO,WACe;CACtB,MAAM,YAAY,CAAC,CAAC;CACpB,MAAM,cAAc,YAAY,IAAI;CACpC,MAAM,aACJ,QAAQ,CAAC,YAAY,uBAAuB,MAAM,KAAK,KAAA;CAEzD,MAAM,oBAAoB;EACxB,QAAQ,QAAR;GACE,KAAK,OACH,OACE,oBAAC,UAAD;IACE,IAAG;IACH,IAAG;IACH,GAAG,YAAY,MAAM;IACrB,MAAM;IACN,QAAQ;IACK;GACd,CAAA;GAEL,KAAK,WACH,OACE,oBAAC,UAAD;IACE,IAAG;IACH,IAAG;IACH,GAAE;IACF,MAAK;IACL,QAAQ;IACR,aAAY;GACb,CAAA;GAEL,KAAK,UACH,OACE,oBAAC,UAAD;IACE,IAAG;IACH,IAAG;IACH,GAAG,YAAY,MAAM;IACrB,MAAM;IACN,QAAQ;IACK;GACd,CAAA;GAEL,KAAK,WACH,OACE,oBAAC,QAAD;IACE,GAAG,YAAY,MAAM;IACrB,GAAG,YAAY,MAAM;IACrB,OAAO,YAAY,IAAI;IACvB,QAAQ,YAAY,IAAI;IACxB,MAAM;IACN,QAAQ;IACK;GACd,CAAA;GAEL,KAAK,WACH,OACE,oBAAC,WAAD;IACE,QAAO;IACP,MAAM;IACN,QAAQ;IACK;GACd,CAAA;GAEL,KAAK,YACH,OACE,oBAAC,WAAD;IACE,QAAO;IACP,MAAM;IACN,QAAQ;IACK;GACd,CAAA;GAEL,SACE,OAAO;EACX;CACF;CAEA,OACE,oBAAC,OAAD;EACE,SAAQ;EACR,OAAO;EACP,QAAQ;EACR,OAAO,EAAE,QAAQ,WAAW;YAE3B,YAAY;CACV,CAAA;AAET;;;;;;;;;;;;;;;;;;AAwCA,IAAa,uBAAuB,KAAK,SAAS,qBAAqB,EACrE,MACA,OAAO,IACP,QACA,aAAa,iBACb,cAAc,kBACd,WACA,SAC4B;CAC5B,MAAM,EAAE,QAAQ,SAAS,SAAS;CAGlC,MAAM,eAAe,oBAAoB,SAAS;CAGlD,MAAM,cACJ,mBAAmB,OAAO,OAAO,OAAO,WAAW;CAGrD,MAAM,cAAc,eAAe,qBAAqB,UAAU,KAAA;CAMlE,MAAM,YAAY,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,MAAM,OAAO,GAAI,CAAC,CAAC;CAGnE,MAAM,kBAAkB;CAExB,OACE,qBAAC,OAAD;EACE,MAAK;EACL,cAAY,GAAG,KAAK,aAAa;EACtB;EACX,OAAO;GACL,UAAU;GACV,SAAS;GACT,YAAY;GACZ,gBAAgB;GAChB,OAAO;GACP,QAAQ;GACR,YAAY;GACZ,OAAO;GACP,GAAG;EACL;YAdF,CAiBE,oBAAC,WAAD;GACE,MAAM;GACA;GACN,OAAO;GACP,eAAY;EACb,CAAA,GAGD,oBAAC,QAAD;GACE,eAAY;GACZ,OAAO;IACL,UAAU;IACV,KAAK;IACL,MAAM;IACN,WAAW;IACX,SAAS;IACT,YAAY;IACZ,gBAAgB;GAClB;aAEA,oBAAC,aAAD;IACU;IACR,MAAM;IACN,OAAO;IACM;IACb,MAAM,CAAC;GACR,CAAA;EACG,CAAA,CACH;;AAET,CAAC"}
@@ -1,7 +1,6 @@
1
1
  import { default as React } from 'react';
2
2
  import { StatusLevel } from '../../utils';
3
-
4
- export type IconName = 'satellite' | 'satellite-transmit' | 'satellite-receive' | 'satellite-off' | 'antenna' | 'antenna-transmit' | 'antenna-receive' | 'antenna-off' | 'mission' | 'altitude' | 'solar' | 'thermal' | 'propulsion' | 'payload' | 'processor' | 'equipment' | 'netcom' | 'hardware' | 'orbit' | 'ground-station' | 'battery' | 'location' | 'rocket' | 'thermometer' | 'settings' | 'notifications' | 'notifications-off' | 'warning' | 'error' | 'info' | 'check' | 'close' | 'add' | 'remove' | 'edit' | 'delete' | 'search' | 'filter' | 'refresh' | 'sync' | 'download' | 'upload' | 'expand' | 'collapse' | 'fullscreen' | 'fullscreen-exit' | 'visibility' | 'visibility-off' | 'lock' | 'unlock' | 'arrow-up' | 'arrow-down' | 'arrow-left' | 'arrow-right' | 'chevron-up' | 'chevron-down' | 'chevron-left' | 'chevron-right' | 'menu' | 'more-vert' | 'more-horiz' | 'chart' | 'list' | 'grid' | 'timeline' | 'calendar' | 'clock' | 'play' | 'play-arrow' | 'pause' | 'stop' | 'skip-next' | 'skip-previous' | 'fast-forward' | 'fast-rewind' | 'record' | 'link' | 'link-off' | 'send' | 'message' | 'mail' | 'photo-camera' | 'images' | 'error-outline';
3
+ export type IconName = "satellite" | "satellite-transmit" | "satellite-receive" | "satellite-off" | "antenna" | "antenna-transmit" | "antenna-receive" | "antenna-off" | "mission" | "altitude" | "solar" | "thermal" | "propulsion" | "payload" | "processor" | "equipment" | "netcom" | "hardware" | "orbit" | "ground-station" | "battery" | "location" | "rocket" | "thermometer" | "settings" | "notifications" | "notifications-off" | "warning" | "error" | "info" | "check" | "close" | "add" | "remove" | "edit" | "delete" | "search" | "filter" | "refresh" | "sync" | "download" | "upload" | "expand" | "collapse" | "fullscreen" | "fullscreen-exit" | "visibility" | "visibility-off" | "lock" | "unlock" | "arrow-up" | "arrow-down" | "arrow-left" | "arrow-right" | "chevron-up" | "chevron-down" | "chevron-left" | "chevron-right" | "menu" | "more-vert" | "more-horiz" | "chart" | "list" | "grid" | "timeline" | "calendar" | "clock" | "play" | "play-arrow" | "pause" | "stop" | "skip-next" | "skip-previous" | "fast-forward" | "fast-rewind" | "record" | "link" | "link-off" | "send" | "message" | "mail" | "photo-camera" | "images" | "error-outline";
5
4
  export interface IconProps {
6
5
  /** Icon name from the library */
7
6
  name: IconName;
@@ -14,7 +13,7 @@ export interface IconProps {
14
13
  /** Custom className */
15
14
  className?: string;
16
15
  /** Accessibility label */
17
- 'aria-label'?: string;
16
+ "aria-label"?: string;
18
17
  /** Click handler */
19
18
  onClick?: () => void;
20
19
  /** Custom style */