@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,423 +1,509 @@
1
+ import { CategoryPalette } from "./categoryPalette.js";
2
+ //#region src/react/utils/index.ts
3
+ /**
4
+ * @zendir/ui - Enterprise Utility Functions
5
+ *
6
+ * Shared utilities for null-safety, formatting, and defensive coding.
7
+ * These utilities ensure components never crash due to undefined data.
8
+ */
9
+ /**
10
+ * Safely access a value with a fallback for null/undefined
11
+ * @example withNullSafety(data?.temperature, 0) // Returns 0 if undefined
12
+ */
1
13
  function withNullSafety(value, fallback) {
2
- return value ?? fallback;
14
+ return value ?? fallback;
3
15
  }
16
+ /**
17
+ * Safely format a number, returning '--' if undefined
18
+ * @example safeNumber(data?.value, 2) // "123.45" or "--"
19
+ */
4
20
  function safeNumber(value, decimals = 2, fallback = "--") {
5
- if (value === null || value === void 0 || !Number.isFinite(value)) {
6
- return fallback;
7
- }
8
- return value.toFixed(decimals);
21
+ if (value === null || value === void 0 || !Number.isFinite(value)) return fallback;
22
+ return value.toFixed(decimals);
9
23
  }
24
+ /**
25
+ * Check if value is a valid finite number
26
+ */
10
27
  function isValidNumber(value) {
11
- return typeof value === "number" && Number.isFinite(value);
28
+ return typeof value === "number" && Number.isFinite(value);
12
29
  }
30
+ /**
31
+ * Format a number with locale-aware formatting and optional unit
32
+ * @example formatNumber(1234567, { notation: 'compact' }) // "1.2M"
33
+ */
13
34
  function formatNumber(value, options = {}) {
14
- if (value === null || value === void 0 || !Number.isFinite(value)) {
15
- return "--";
16
- }
17
- const {
18
- decimals = 2,
19
- locale = "en-US",
20
- notation = "standard",
21
- unit,
22
- signDisplay = "auto"
23
- } = options;
24
- try {
25
- const formatted = new Intl.NumberFormat(locale, {
26
- notation,
27
- minimumFractionDigits: notation === "compact" ? 0 : decimals,
28
- maximumFractionDigits: decimals,
29
- signDisplay
30
- }).format(value);
31
- return unit ? `${formatted} ${unit}` : formatted;
32
- } catch {
33
- return value.toFixed(decimals);
34
- }
35
- }
35
+ if (value === null || value === void 0 || !Number.isFinite(value)) return "--";
36
+ const { decimals = 2, locale = "en-US", notation = "standard", unit, signDisplay = "auto" } = options;
37
+ try {
38
+ const formatted = new Intl.NumberFormat(locale, {
39
+ notation,
40
+ minimumFractionDigits: notation === "compact" ? 0 : decimals,
41
+ maximumFractionDigits: decimals,
42
+ signDisplay
43
+ }).format(value);
44
+ return unit ? `${formatted} ${unit}` : formatted;
45
+ } catch {
46
+ return value.toFixed(decimals);
47
+ }
48
+ }
49
+ /**
50
+ * Format a number with tabular (monospace) digits for alignment
51
+ * Uses font-feature-settings: 'tnum' 1
52
+ */
36
53
  function formatTabular(value, decimals = 2) {
37
- return safeNumber(value, decimals);
54
+ return safeNumber(value, decimals);
38
55
  }
56
+ /**
57
+ * Format temperature with unit conversion
58
+ * @example formatTemperature(25) // "25.0°C"
59
+ * @example formatTemperature(25, 'fahrenheit') // "77.0°F"
60
+ */
39
61
  function formatTemperature(celsius, unit = "celsius", decimals = 1) {
40
- if (celsius === null || celsius === void 0 || !Number.isFinite(celsius)) {
41
- return "--°C";
42
- }
43
- switch (unit) {
44
- case "fahrenheit":
45
- return `${(celsius * 9 / 5 + 32).toFixed(decimals)}°F`;
46
- case "kelvin":
47
- return `${(celsius + 273.15).toFixed(decimals)}K`;
48
- default:
49
- return `${celsius.toFixed(decimals)}°C`;
50
- }
51
- }
62
+ if (celsius === null || celsius === void 0 || !Number.isFinite(celsius)) return "--°C";
63
+ switch (unit) {
64
+ case "fahrenheit": return `${(celsius * 9 / 5 + 32).toFixed(decimals)}°F`;
65
+ case "kelvin": return `${(celsius + 273.15).toFixed(decimals)}K`;
66
+ default: return `${celsius.toFixed(decimals)}°C`;
67
+ }
68
+ }
69
+ /**
70
+ * Format data rate with automatic unit scaling
71
+ * @example formatDataRate(1500000) // "1.50 Mbps"
72
+ */
52
73
  function formatDataRate(bitsPerSecond) {
53
- if (bitsPerSecond === null || bitsPerSecond === void 0 || !Number.isFinite(bitsPerSecond)) {
54
- return "-- bps";
55
- }
56
- const units = ["bps", "Kbps", "Mbps", "Gbps", "Tbps"];
57
- let unitIndex = 0;
58
- let value = bitsPerSecond;
59
- while (value >= 1e3 && unitIndex < units.length - 1) {
60
- value /= 1e3;
61
- unitIndex++;
62
- }
63
- return `${value.toFixed(2)} ${units[unitIndex]}`;
64
- }
74
+ if (bitsPerSecond === null || bitsPerSecond === void 0 || !Number.isFinite(bitsPerSecond)) return "-- bps";
75
+ const units = [
76
+ "bps",
77
+ "Kbps",
78
+ "Mbps",
79
+ "Gbps",
80
+ "Tbps"
81
+ ];
82
+ let unitIndex = 0;
83
+ let value = bitsPerSecond;
84
+ while (value >= 1e3 && unitIndex < units.length - 1) {
85
+ value /= 1e3;
86
+ unitIndex++;
87
+ }
88
+ return `${value.toFixed(2)} ${units[unitIndex]}`;
89
+ }
90
+ /**
91
+ * Format distance with automatic unit scaling
92
+ * @example formatDistance(1500) // "1.50 km"
93
+ */
65
94
  function formatDistance(meters) {
66
- if (meters === null || meters === void 0 || !Number.isFinite(meters)) {
67
- return "-- m";
68
- }
69
- if (meters >= 1e6) {
70
- return `${(meters / 1e6).toFixed(2)} Mm`;
71
- } else if (meters >= 1e3) {
72
- return `${(meters / 1e3).toFixed(2)} km`;
73
- } else if (meters < 1) {
74
- return `${(meters * 100).toFixed(1)} cm`;
75
- }
76
- return `${meters.toFixed(1)} m`;
77
- }
95
+ if (meters === null || meters === void 0 || !Number.isFinite(meters)) return "-- m";
96
+ if (meters >= 1e6) return `${(meters / 1e6).toFixed(2)} Mm`;
97
+ else if (meters >= 1e3) return `${(meters / 1e3).toFixed(2)} km`;
98
+ else if (meters < 1) return `${(meters * 100).toFixed(1)} cm`;
99
+ return `${meters.toFixed(1)} m`;
100
+ }
101
+ /**
102
+ * Format altitude (always in km for space ops)
103
+ * @example formatAltitude(418.2) // "418.2 km"
104
+ */
78
105
  function formatAltitude(km) {
79
- if (km === null || km === void 0 || !Number.isFinite(km)) {
80
- return "-- km";
81
- }
82
- return `${km.toFixed(1)} km`;
106
+ if (km === null || km === void 0 || !Number.isFinite(km)) return "-- km";
107
+ return `${km.toFixed(1)} km`;
83
108
  }
109
+ /**
110
+ * Format velocity
111
+ * @example formatVelocity(7.66) // "7.66 km/s"
112
+ */
84
113
  function formatVelocity(kmPerSec) {
85
- if (kmPerSec === null || kmPerSec === void 0 || !Number.isFinite(kmPerSec)) {
86
- return "-- km/s";
87
- }
88
- return `${kmPerSec.toFixed(2)} km/s`;
89
- }
114
+ if (kmPerSec === null || kmPerSec === void 0 || !Number.isFinite(kmPerSec)) return "-- km/s";
115
+ return `${kmPerSec.toFixed(2)} km/s`;
116
+ }
117
+ /**
118
+ * Format percentage with bounds checking
119
+ * @example formatPercentage(0.856) // "85.6%"
120
+ * @example formatPercentage(85.6, false) // "85.6%" (already percentage)
121
+ */
90
122
  function formatPercentage(value, isDecimal = false, decimals = 1) {
91
- if (value === null || value === void 0 || !Number.isFinite(value)) {
92
- return "--%";
93
- }
94
- const percentage = isDecimal ? value * 100 : value;
95
- return `${percentage.toFixed(decimals)}%`;
123
+ if (value === null || value === void 0 || !Number.isFinite(value)) return "--%";
124
+ return `${(isDecimal ? value * 100 : value).toFixed(decimals)}%`;
96
125
  }
126
+ /**
127
+ * Format power (watts) with auto-scaling
128
+ * @example formatPower(1500) // "1.50 kW"
129
+ */
97
130
  function formatPower(watts) {
98
- if (watts === null || watts === void 0 || !Number.isFinite(watts)) {
99
- return "-- W";
100
- }
101
- if (Math.abs(watts) >= 1e6) {
102
- return `${(watts / 1e6).toFixed(2)} MW`;
103
- } else if (Math.abs(watts) >= 1e3) {
104
- return `${(watts / 1e3).toFixed(2)} kW`;
105
- } else if (Math.abs(watts) < 1) {
106
- return `${(watts * 1e3).toFixed(1)} mW`;
107
- }
108
- return `${watts.toFixed(1)} W`;
109
- }
131
+ if (watts === null || watts === void 0 || !Number.isFinite(watts)) return "-- W";
132
+ if (Math.abs(watts) >= 1e6) return `${(watts / 1e6).toFixed(2)} MW`;
133
+ else if (Math.abs(watts) >= 1e3) return `${(watts / 1e3).toFixed(2)} kW`;
134
+ else if (Math.abs(watts) < 1) return `${(watts * 1e3).toFixed(1)} mW`;
135
+ return `${watts.toFixed(1)} W`;
136
+ }
137
+ /**
138
+ * Format frequency (Hz) with auto-scaling
139
+ * @example formatFrequency(2400000000) // "2.40 GHz"
140
+ */
110
141
  function formatFrequency(hz) {
111
- if (hz === null || hz === void 0 || !Number.isFinite(hz)) {
112
- return "-- Hz";
113
- }
114
- if (hz >= 1e9) {
115
- return `${(hz / 1e9).toFixed(2)} GHz`;
116
- } else if (hz >= 1e6) {
117
- return `${(hz / 1e6).toFixed(2)} MHz`;
118
- } else if (hz >= 1e3) {
119
- return `${(hz / 1e3).toFixed(2)} kHz`;
120
- }
121
- return `${hz.toFixed(0)} Hz`;
122
- }
142
+ if (hz === null || hz === void 0 || !Number.isFinite(hz)) return "-- Hz";
143
+ if (hz >= 1e9) return `${(hz / 1e9).toFixed(2)} GHz`;
144
+ else if (hz >= 1e6) return `${(hz / 1e6).toFixed(2)} MHz`;
145
+ else if (hz >= 1e3) return `${(hz / 1e3).toFixed(2)} kHz`;
146
+ return `${hz.toFixed(0)} Hz`;
147
+ }
148
+ /**
149
+ * Format duration in human-readable form
150
+ * @example formatDuration(3661) // "1h 1m 1s"
151
+ */
123
152
  function formatDuration(seconds) {
124
- if (seconds === null || seconds === void 0 || !Number.isFinite(seconds)) {
125
- return "--:--";
126
- }
127
- const absSeconds = Math.abs(seconds);
128
- const sign = seconds < 0 ? "-" : "";
129
- if (absSeconds < 60) {
130
- return `${sign}${absSeconds.toFixed(0)}s`;
131
- } else if (absSeconds < 3600) {
132
- const mins = Math.floor(absSeconds / 60);
133
- const secs = Math.floor(absSeconds % 60);
134
- return `${sign}${mins}m ${secs}s`;
135
- } else if (absSeconds < 86400) {
136
- const hours = Math.floor(absSeconds / 3600);
137
- const mins = Math.floor(absSeconds % 3600 / 60);
138
- return `${sign}${hours}h ${mins}m`;
139
- } else {
140
- const days = Math.floor(absSeconds / 86400);
141
- const hours = Math.floor(absSeconds % 86400 / 3600);
142
- return `${sign}${days}d ${hours}h`;
143
- }
144
- }
153
+ if (seconds === null || seconds === void 0 || !Number.isFinite(seconds)) return "--:--";
154
+ const absSeconds = Math.abs(seconds);
155
+ const sign = seconds < 0 ? "-" : "";
156
+ if (absSeconds < 60) return `${sign}${absSeconds.toFixed(0)}s`;
157
+ else if (absSeconds < 3600) return `${sign}${Math.floor(absSeconds / 60)}m ${Math.floor(absSeconds % 60)}s`;
158
+ else if (absSeconds < 86400) return `${sign}${Math.floor(absSeconds / 3600)}h ${Math.floor(absSeconds % 3600 / 60)}m`;
159
+ else return `${sign}${Math.floor(absSeconds / 86400)}d ${Math.floor(absSeconds % 86400 / 3600)}h`;
160
+ }
161
+ /**
162
+ * Format countdown timer (supports negative values for past events)
163
+ * @example formatCountdown(125) // "T-02:05"
164
+ * @example formatCountdown(-60) // "T+01:00"
165
+ */
145
166
  function formatCountdown(seconds) {
146
- if (seconds === null || seconds === void 0 || !Number.isFinite(seconds)) {
147
- return "T--:--";
148
- }
149
- const prefix = seconds >= 0 ? "T-" : "T+";
150
- const absSeconds = Math.abs(seconds);
151
- if (absSeconds >= 3600) {
152
- const hours = Math.floor(absSeconds / 3600);
153
- const mins2 = Math.floor(absSeconds % 3600 / 60);
154
- const secs2 = Math.floor(absSeconds % 60);
155
- return `${prefix}${hours}:${mins2.toString().padStart(2, "0")}:${secs2.toString().padStart(2, "0")}`;
156
- }
157
- const mins = Math.floor(absSeconds / 60);
158
- const secs = Math.floor(absSeconds % 60);
159
- return `${prefix}${mins.toString().padStart(2, "0")}:${secs.toString().padStart(2, "0")}`;
160
- }
167
+ if (seconds === null || seconds === void 0 || !Number.isFinite(seconds)) return "T--:--";
168
+ const prefix = seconds >= 0 ? "T-" : "T+";
169
+ const absSeconds = Math.abs(seconds);
170
+ if (absSeconds >= 3600) {
171
+ const hours = Math.floor(absSeconds / 3600);
172
+ const mins = Math.floor(absSeconds % 3600 / 60);
173
+ const secs = Math.floor(absSeconds % 60);
174
+ return `${prefix}${hours}:${mins.toString().padStart(2, "0")}:${secs.toString().padStart(2, "0")}`;
175
+ }
176
+ const mins = Math.floor(absSeconds / 60);
177
+ const secs = Math.floor(absSeconds % 60);
178
+ return `${prefix}${mins.toString().padStart(2, "0")}:${secs.toString().padStart(2, "0")}`;
179
+ }
180
+ /**
181
+ * Format UTC timestamp
182
+ * @example formatUTC(new Date()) // "2026-01-27 14:30:00Z"
183
+ */
161
184
  function formatUTC(date) {
162
- if (!date) return "--:--:-- UTC";
163
- try {
164
- const d = typeof date === "string" ? new Date(date) : date;
165
- if (isNaN(d.getTime())) return "--:--:-- UTC";
166
- return d.toISOString().replace("T", " ").slice(0, 19) + "Z";
167
- } catch {
168
- return "--:--:-- UTC";
169
- }
170
- }
185
+ if (!date) return "--:--:-- UTC";
186
+ try {
187
+ const d = typeof date === "string" ? new Date(date) : date;
188
+ if (isNaN(d.getTime())) return "--:--:-- UTC";
189
+ return d.toISOString().replace("T", " ").slice(0, 19) + "Z";
190
+ } catch {
191
+ return "--:--:-- UTC";
192
+ }
193
+ }
194
+ /**
195
+ * Format time only (HH:MM:SS)
196
+ * @example formatTime(new Date()) // "14:30:00"
197
+ */
171
198
  function formatTime(date, includeSeconds = true) {
172
- if (!date) return includeSeconds ? "--:--:--" : "--:--";
173
- try {
174
- const d = typeof date === "string" ? new Date(date) : date;
175
- if (isNaN(d.getTime())) return includeSeconds ? "--:--:--" : "--:--";
176
- const hours = d.getUTCHours().toString().padStart(2, "0");
177
- const mins = d.getUTCMinutes().toString().padStart(2, "0");
178
- const secs = d.getUTCSeconds().toString().padStart(2, "0");
179
- return includeSeconds ? `${hours}:${mins}:${secs}` : `${hours}:${mins}`;
180
- } catch {
181
- return includeSeconds ? "--:--:--" : "--:--";
182
- }
183
- }
199
+ if (!date) return includeSeconds ? "--:--:--" : "--:--";
200
+ try {
201
+ const d = typeof date === "string" ? new Date(date) : date;
202
+ if (isNaN(d.getTime())) return includeSeconds ? "--:--:--" : "--:--";
203
+ const hours = d.getUTCHours().toString().padStart(2, "0");
204
+ const mins = d.getUTCMinutes().toString().padStart(2, "0");
205
+ const secs = d.getUTCSeconds().toString().padStart(2, "0");
206
+ return includeSeconds ? `${hours}:${mins}:${secs}` : `${hours}:${mins}`;
207
+ } catch {
208
+ return includeSeconds ? "--:--:--" : "--:--";
209
+ }
210
+ }
211
+ /**
212
+ * Format latitude/longitude
213
+ * @example formatCoordinate(32.4, 'lat') // "32.40° N"
214
+ * @example formatCoordinate(-117.2, 'lon') // "117.20° W"
215
+ */
184
216
  function formatCoordinate(value, type) {
185
- if (value === null || value === void 0 || !Number.isFinite(value)) {
186
- return "--°";
187
- }
188
- const absValue = Math.abs(value);
189
- let direction;
190
- if (type === "lat") {
191
- direction = value >= 0 ? "N" : "S";
192
- } else {
193
- direction = value >= 0 ? "E" : "W";
194
- }
195
- return `${absValue.toFixed(2)}° ${direction}`;
196
- }
217
+ if (value === null || value === void 0 || !Number.isFinite(value)) return "--°";
218
+ const absValue = Math.abs(value);
219
+ let direction;
220
+ if (type === "lat") direction = value >= 0 ? "N" : "S";
221
+ else direction = value >= 0 ? "E" : "W";
222
+ return `${absValue.toFixed(2) ${direction}`;
223
+ }
224
+ /**
225
+ * Format lat/lon pair
226
+ * @example formatLatLon(32.4, -117.2) // "32.40° N, 117.20° W"
227
+ */
197
228
  function formatLatLon(lat, lon) {
198
- return `${formatCoordinate(lat, "lat")}, ${formatCoordinate(lon, "lon")}`;
229
+ return `${formatCoordinate(lat, "lat")}, ${formatCoordinate(lon, "lon")}`;
199
230
  }
231
+ /**
232
+ * Format angle in degrees
233
+ * @example formatDegrees(45.5) // "45.5°"
234
+ */
200
235
  function formatDegrees(value, decimals = 1) {
201
- if (value === null || value === void 0 || !Number.isFinite(value)) {
202
- return "--°";
203
- }
204
- return `${value.toFixed(decimals)}°`;
236
+ if (value === null || value === void 0 || !Number.isFinite(value)) return "--°";
237
+ return `${value.toFixed(decimals)}°`;
205
238
  }
239
+ /**
240
+ * Format decibels
241
+ * @example formatDecibels(3.5) // "3.5 dB"
242
+ */
206
243
  function formatDecibels(value, decimals = 1) {
207
- if (value === null || value === void 0 || !Number.isFinite(value)) {
208
- return "-- dB";
209
- }
210
- return `${value.toFixed(decimals)} dB`;
244
+ if (value === null || value === void 0 || !Number.isFinite(value)) return "-- dB";
245
+ return `${value.toFixed(decimals)} dB`;
211
246
  }
247
+ /**
248
+ * Clamp a value between min and max
249
+ * @example clamp(150, 0, 100) // 100
250
+ */
212
251
  function clamp(value, min, max) {
213
- return Math.min(Math.max(value, min), max);
252
+ return Math.min(Math.max(value, min), max);
214
253
  }
254
+ /**
255
+ * Linear interpolation
256
+ * @example lerp(0, 100, 0.5) // 50
257
+ */
215
258
  function lerp(start, end, t) {
216
- return start + (end - start) * clamp(t, 0, 1);
259
+ return start + (end - start) * clamp(t, 0, 1);
217
260
  }
261
+ /**
262
+ * Map a value from one range to another
263
+ * @example mapRange(50, 0, 100, 0, 1) // 0.5
264
+ */
218
265
  function mapRange(value, inMin, inMax, outMin, outMax) {
219
- const t = (value - inMin) / (inMax - inMin);
220
- return lerp(outMin, outMax, t);
221
- }
222
- const STATUS_COLORS = {
223
- off: "#a4abb6",
224
- standby: "#2dccff",
225
- normal: "#56f000",
226
- caution: "#fce83a",
227
- serious: "#ffb302",
228
- critical: "#ff3838"
266
+ return lerp(outMin, outMax, (value - inMin) / (inMax - inMin));
267
+ }
268
+ /**
269
+ * Astro UX Design System status colors
270
+ * These match the official Astro status semantics
271
+ */
272
+ var STATUS_COLORS = {
273
+ off: "#a4abb6",
274
+ standby: "#2dccff",
275
+ normal: "#56f000",
276
+ caution: "#fce83a",
277
+ serious: "#ffb302",
278
+ critical: "#ff3838"
229
279
  };
280
+ /**
281
+ * Get status color from level
282
+ * @example getStatusColor('normal') // '#56f000'
283
+ */
230
284
  function getStatusColor(status) {
231
- return STATUS_COLORS[status ?? "off"];
285
+ return STATUS_COLORS[status ?? "off"];
232
286
  }
287
+ /**
288
+ * Derive status for battery specifically (low is bad)
289
+ * @example deriveBatteryStatus(25) // 'caution'
290
+ */
233
291
  function deriveBatteryStatus(level) {
234
- if (level === void 0 || level === null) return "off";
235
- if (level <= 10) return "critical";
236
- if (level <= 20) return "serious";
237
- if (level <= 30) return "caution";
238
- return "normal";
239
- }
292
+ if (level === void 0 || level === null) return "off";
293
+ if (level <= 10) return "critical";
294
+ if (level <= 20) return "serious";
295
+ if (level <= 30) return "caution";
296
+ return "normal";
297
+ }
298
+ /**
299
+ * Determine status level from a value and thresholds
300
+ * @example getStatusFromValue(85, { critical: 20, serious: 40, caution: 60, normal: 80 }) // 'normal'
301
+ */
240
302
  function getStatusFromValue(value, thresholds, higherIsBetter = true) {
241
- if (value === null || value === void 0 || !Number.isFinite(value)) {
242
- return "off";
243
- }
244
- const { critical = 10, serious = 25, caution = 50, normal = 75 } = thresholds;
245
- if (higherIsBetter) {
246
- if (value <= critical) return "critical";
247
- if (value <= serious) return "serious";
248
- if (value <= caution) return "caution";
249
- if (value <= normal) return "standby";
250
- return "normal";
251
- } else {
252
- if (value >= critical) return "critical";
253
- if (value >= serious) return "serious";
254
- if (value >= caution) return "caution";
255
- if (value >= normal) return "standby";
256
- return "normal";
257
- }
258
- }
259
- const STATUS_MAPPING = {
260
- // → 'off'
261
- "off": "off",
262
- "disabled": "off",
263
- "inactive": "off",
264
- "offline": "off",
265
- "unknown": "off",
266
- "null": "off",
267
- "none": "off",
268
- // → 'standby'
269
- "standby": "standby",
270
- "idle": "standby",
271
- "waiting": "standby",
272
- "ready": "standby",
273
- "pending": "standby",
274
- "queued": "standby",
275
- // → 'normal'
276
- "normal": "normal",
277
- "nominal": "normal",
278
- "healthy": "normal",
279
- "ok": "normal",
280
- "good": "normal",
281
- "success": "normal",
282
- "operational": "normal",
283
- "active": "normal",
284
- "online": "normal",
285
- "connected": "normal",
286
- "stable": "normal",
287
- "transmitting": "normal",
288
- "receiving": "normal",
289
- // → 'caution'
290
- "caution": "caution",
291
- "warning": "caution",
292
- "degraded": "caution",
293
- "elevated": "caution",
294
- "alert": "caution",
295
- "attention": "caution",
296
- "limited": "caution",
297
- // → 'serious'
298
- "serious": "serious",
299
- "unstable": "serious",
300
- "danger": "serious",
301
- "severe": "serious",
302
- // → 'critical'
303
- "critical": "critical",
304
- "error": "critical",
305
- "failed": "critical",
306
- "failure": "critical",
307
- "emergency": "critical",
308
- "fault": "critical",
309
- "alarm": "critical"
303
+ if (value === null || value === void 0 || !Number.isFinite(value)) return "off";
304
+ const { critical = 10, serious = 25, caution = 50, normal = 75 } = thresholds;
305
+ if (higherIsBetter) {
306
+ if (value <= critical) return "critical";
307
+ if (value <= serious) return "serious";
308
+ if (value <= caution) return "caution";
309
+ if (value <= normal) return "standby";
310
+ return "normal";
311
+ } else {
312
+ if (value >= critical) return "critical";
313
+ if (value >= serious) return "serious";
314
+ if (value >= caution) return "caution";
315
+ if (value >= normal) return "standby";
316
+ return "normal";
317
+ }
318
+ }
319
+ /**
320
+ * Domain status terms that map to UI StatusLevel
321
+ * This handles common backend/sensor terminology
322
+ */
323
+ var STATUS_MAPPING = {
324
+ off: "off",
325
+ disabled: "off",
326
+ inactive: "off",
327
+ offline: "off",
328
+ unknown: "off",
329
+ null: "off",
330
+ none: "off",
331
+ standby: "standby",
332
+ idle: "standby",
333
+ waiting: "standby",
334
+ ready: "standby",
335
+ pending: "standby",
336
+ queued: "standby",
337
+ normal: "normal",
338
+ nominal: "normal",
339
+ healthy: "normal",
340
+ ok: "normal",
341
+ good: "normal",
342
+ success: "normal",
343
+ operational: "normal",
344
+ active: "normal",
345
+ online: "normal",
346
+ connected: "normal",
347
+ stable: "normal",
348
+ transmitting: "normal",
349
+ receiving: "normal",
350
+ caution: "caution",
351
+ warning: "caution",
352
+ degraded: "caution",
353
+ elevated: "caution",
354
+ alert: "caution",
355
+ attention: "caution",
356
+ limited: "caution",
357
+ serious: "serious",
358
+ unstable: "serious",
359
+ danger: "serious",
360
+ severe: "serious",
361
+ critical: "critical",
362
+ error: "critical",
363
+ failed: "critical",
364
+ failure: "critical",
365
+ emergency: "critical",
366
+ fault: "critical",
367
+ alarm: "critical"
310
368
  };
369
+ /**
370
+ * Normalize any status string to the 6-level StatusLevel system
371
+ *
372
+ * @param status - Any status string from domain/backend
373
+ * @param defaultStatus - Fallback if status is not recognized (default: 'off')
374
+ * @returns StatusLevel
375
+ *
376
+ * @example
377
+ * ```typescript
378
+ * normalizeStatus('degraded') // 'caution'
379
+ * normalizeStatus('nominal') // 'normal'
380
+ * normalizeStatus('transmitting') // 'normal'
381
+ * normalizeStatus('warning') // 'caution'
382
+ * normalizeStatus('error') // 'critical'
383
+ * normalizeStatus(undefined) // 'off'
384
+ * ```
385
+ */
311
386
  function normalizeStatus(status, defaultStatus = "off") {
312
- if (!status) return defaultStatus;
313
- const normalized = status.toLowerCase().trim();
314
- return STATUS_MAPPING[normalized] ?? defaultStatus;
387
+ if (!status) return defaultStatus;
388
+ return STATUS_MAPPING[status.toLowerCase().trim()] ?? defaultStatus;
315
389
  }
390
+ /**
391
+ * Check if a string is a valid StatusLevel
392
+ */
316
393
  function isStatusLevel(value) {
317
- return ["off", "standby", "normal", "caution", "serious", "critical"].includes(value);
318
- }
394
+ return [
395
+ "off",
396
+ "standby",
397
+ "normal",
398
+ "caution",
399
+ "serious",
400
+ "critical"
401
+ ].includes(value);
402
+ }
403
+ /**
404
+ * Get the severity order of a status (higher = more severe)
405
+ * Useful for sorting or finding worst status
406
+ */
319
407
  function getStatusSeverity(status) {
320
- const order = {
321
- off: 0,
322
- standby: 1,
323
- normal: 2,
324
- caution: 3,
325
- serious: 4,
326
- critical: 5
327
- };
328
- return order[status];
329
- }
408
+ return {
409
+ off: 0,
410
+ standby: 1,
411
+ normal: 2,
412
+ caution: 3,
413
+ serious: 4,
414
+ critical: 5
415
+ }[status];
416
+ }
417
+ /**
418
+ * Get the worst (most severe) status from an array
419
+ *
420
+ * @example
421
+ * ```typescript
422
+ * getWorstStatus(['normal', 'caution', 'normal']) // 'caution'
423
+ * getWorstStatus(['normal', 'critical', 'caution']) // 'critical'
424
+ * ```
425
+ */
330
426
  function getWorstStatus(statuses) {
331
- if (statuses.length === 0) return "off";
332
- return statuses.reduce(
333
- (worst, current) => getStatusSeverity(current) > getStatusSeverity(worst) ? current : worst
334
- );
335
- }
427
+ if (statuses.length === 0) return "off";
428
+ return statuses.reduce((worst, current) => getStatusSeverity(current) > getStatusSeverity(worst) ? current : worst);
429
+ }
430
+ /**
431
+ * Safely add alpha to any CSS color string.
432
+ * Handles hex (#RRGGBB → #RRGGBBAA), rgb(), and rgba() formats.
433
+ *
434
+ * Avoids the common bug of appending a hex alpha string to an rgba() color,
435
+ * which produces invalid CSS (e.g. "rgba(15, 20, 35, 0.85)80").
436
+ *
437
+ * @param color - CSS color string (hex, rgb, or rgba)
438
+ * @param alpha - Alpha value 0–1
439
+ * @returns Valid CSS color string with alpha applied
440
+ *
441
+ * @example
442
+ * addAlpha('#1b2d3e', 0.5) // '#1b2d3e80'
443
+ * addAlpha('rgba(15, 20, 35, 0.85)', 0.5) // 'rgba(15, 20, 35, 0.5)'
444
+ * addAlpha('rgb(15, 20, 35)', 0.031) // 'rgba(15, 20, 35, 0.031)'
445
+ */
336
446
  function addAlpha(color, alpha) {
337
- if (!color) return color;
338
- const a = Math.max(0, Math.min(1, alpha));
339
- if (color.startsWith("rgba(")) {
340
- return color.replace(/,\s*[\d.]+\)\s*$/, `, ${a})`);
341
- }
342
- if (color.startsWith("rgb(")) {
343
- return color.replace(/^rgb\(/, "rgba(").replace(/\)\s*$/, `, ${a})`);
344
- }
345
- if (color.startsWith("#")) {
346
- const hexA = Math.round(a * 255).toString(16).padStart(2, "0");
347
- return `${color}${hexA}`;
348
- }
349
- return color;
350
- }
447
+ if (!color) return color;
448
+ const a = Math.max(0, Math.min(1, alpha));
449
+ if (color.startsWith("rgba(")) return color.replace(/,\s*[\d.]+\)\s*$/, `, ${a})`);
450
+ if (color.startsWith("rgb(")) return color.replace(/^rgb\(/, "rgba(").replace(/\)\s*$/, `, ${a})`);
451
+ if (color.startsWith("#")) return `${color}${Math.round(a * 255).toString(16).padStart(2, "0")}`;
452
+ return color;
453
+ }
454
+ /**
455
+ * Merge class names, filtering out falsy values
456
+ * @example classNames('base', isActive && 'active', className) // "base active custom"
457
+ */
351
458
  function classNames(...classes) {
352
- return classes.filter(Boolean).join(" ");
353
- }
354
- const tabularNumsStyle = {
355
- fontVariantNumeric: "tabular-nums",
356
- fontFeatureSettings: '"tnum" 1'
459
+ return classes.filter(Boolean).join(" ");
460
+ }
461
+ /**
462
+ * Generate CSS for tabular numbers (monospace digits)
463
+ */
464
+ var tabularNumsStyle = {
465
+ fontVariantNumeric: "tabular-nums",
466
+ fontFeatureSettings: "\"tnum\" 1"
357
467
  };
358
- const transitions = {
359
- fast: "all 150ms ease-out",
360
- normal: "all 250ms ease-out",
361
- slow: "all 400ms ease-out",
362
- spring: "all 300ms cubic-bezier(0.34, 1.56, 0.64, 1)"
468
+ /**
469
+ * CSS transition presets
470
+ */
471
+ var transitions = {
472
+ fast: "all 150ms ease-out",
473
+ normal: "all 250ms ease-out",
474
+ slow: "all 400ms ease-out",
475
+ spring: "all 300ms cubic-bezier(0.34, 1.56, 0.64, 1)"
363
476
  };
364
- const focusRingStyle = {
365
- outline: "2px solid #4dc3ff",
366
- outlineOffset: "2px"
477
+ /**
478
+ * Focus ring styles for accessibility
479
+ */
480
+ var focusRingStyle = {
481
+ outline: "2px solid #4dc3ff",
482
+ outlineOffset: "2px"
367
483
  };
484
+ /**
485
+ * Compute a WCAG AA safe version of an accent color for use as foreground text
486
+ * on dark backgrounds. If the accent already passes 4.5:1 contrast on typical
487
+ * dark surfaces (L ≈ 0.01), returns it unchanged. Otherwise lightens toward
488
+ * white until the minimum contrast is met.
489
+ *
490
+ * @example safeAccentText('#8b5cf6') // '#a885f8' — lightened to pass 4.5:1
491
+ */
368
492
  function safeAccentText(accent) {
369
- const hex = accent.replace("#", "");
370
- if (hex.length < 6) return accent;
371
- const r = parseInt(hex.slice(0, 2), 16) / 255;
372
- const g = parseInt(hex.slice(2, 4), 16) / 255;
373
- const b = parseInt(hex.slice(4, 6), 16) / 255;
374
- const toLinear = (c) => c <= 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
375
- const L = 0.2126 * toLinear(r) + 0.7152 * toLinear(g) + 0.0722 * toLinear(b);
376
- if (L >= 0.22) return accent;
377
- const mix = 0.25;
378
- const lr = Math.min(255, Math.round((r + (1 - r) * mix) * 255));
379
- const lg = Math.min(255, Math.round((g + (1 - g) * mix) * 255));
380
- const lb = Math.min(255, Math.round((b + (1 - b) * mix) * 255));
381
- return `#${lr.toString(16).padStart(2, "0")}${lg.toString(16).padStart(2, "0")}${lb.toString(16).padStart(2, "0")}`;
382
- }
383
- export {
384
- STATUS_COLORS,
385
- addAlpha,
386
- clamp,
387
- classNames,
388
- deriveBatteryStatus,
389
- focusRingStyle,
390
- formatAltitude,
391
- formatCoordinate,
392
- formatCountdown,
393
- formatDataRate,
394
- formatDecibels,
395
- formatDegrees,
396
- formatDistance,
397
- formatDuration,
398
- formatFrequency,
399
- formatLatLon,
400
- formatNumber,
401
- formatPercentage,
402
- formatPower,
403
- formatTabular,
404
- formatTemperature,
405
- formatTime,
406
- formatUTC,
407
- formatVelocity,
408
- getStatusColor,
409
- getStatusFromValue,
410
- getStatusSeverity,
411
- getWorstStatus,
412
- isStatusLevel,
413
- isValidNumber,
414
- lerp,
415
- mapRange,
416
- normalizeStatus,
417
- safeAccentText,
418
- safeNumber,
419
- tabularNumsStyle,
420
- transitions,
421
- withNullSafety
422
- };
423
- //# sourceMappingURL=index.js.map
493
+ const hex = accent.replace("#", "");
494
+ if (hex.length < 6) return accent;
495
+ const r = parseInt(hex.slice(0, 2), 16) / 255;
496
+ const g = parseInt(hex.slice(2, 4), 16) / 255;
497
+ const b = parseInt(hex.slice(4, 6), 16) / 255;
498
+ const toLinear = (c) => c <= .03928 ? c / 12.92 : Math.pow((c + .055) / 1.055, 2.4);
499
+ if (.2126 * toLinear(r) + .7152 * toLinear(g) + .0722 * toLinear(b) >= .22) return accent;
500
+ const mix = .25;
501
+ const lr = Math.min(255, Math.round((r + (1 - r) * mix) * 255));
502
+ const lg = Math.min(255, Math.round((g + (1 - g) * mix) * 255));
503
+ const lb = Math.min(255, Math.round((b + (1 - b) * mix) * 255));
504
+ return `#${lr.toString(16).padStart(2, "0")}${lg.toString(16).padStart(2, "0")}${lb.toString(16).padStart(2, "0")}`;
505
+ }
506
+ //#endregion
507
+ export { CategoryPalette, STATUS_COLORS, addAlpha, clamp, classNames, deriveBatteryStatus, focusRingStyle, formatAltitude, formatCoordinate, formatCountdown, formatDataRate, formatDecibels, formatDegrees, formatDistance, formatDuration, formatFrequency, formatLatLon, formatNumber, formatPercentage, formatPower, formatTabular, formatTemperature, formatTime, formatUTC, formatVelocity, getStatusColor, getStatusFromValue, getStatusSeverity, getWorstStatus, isStatusLevel, isValidNumber, lerp, mapRange, normalizeStatus, safeAccentText, safeNumber, tabularNumsStyle, transitions, withNullSafety };
508
+
509
+ //# sourceMappingURL=index.js.map