@zendir/ui 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (391) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/README.md +640 -631
  3. package/dist/_virtual/_rolldown/runtime.js +13 -0
  4. package/dist/index.js +17 -221
  5. package/dist/react/3d/CesiumCaptureSource.d.ts +0 -1
  6. package/dist/react/3d/CesiumCaptureSource.js +364 -283
  7. package/dist/react/3d/CesiumCaptureSource.js.map +1 -1
  8. package/dist/react/3d/ZenSpace3D.d.ts +2 -3
  9. package/dist/react/3d/ZenSpace3D.js +1681 -1237
  10. package/dist/react/3d/ZenSpace3D.js.map +1 -1
  11. package/dist/react/3d/ZenSpace3DCesium.d.ts +0 -1
  12. package/dist/react/3d/ZenSpace3DCesium.js +513 -560
  13. package/dist/react/3d/ZenSpace3DCesium.js.map +1 -1
  14. package/dist/react/3d/ZenSpace3DShaders.js +61 -66
  15. package/dist/react/3d/ZenSpace3DShaders.js.map +1 -1
  16. package/dist/react/3d/ZenSpace3DTypes.d.ts +19 -20
  17. package/dist/react/3d/ZenSpace3DUtils.d.ts +0 -1
  18. package/dist/react/3d/ZenSpace3DUtils.js +37 -24
  19. package/dist/react/3d/ZenSpace3DUtils.js.map +1 -1
  20. package/dist/react/3d/capturePngAnalysis.js +42 -36
  21. package/dist/react/3d/capturePngAnalysis.js.map +1 -1
  22. package/dist/react/3d/index.d.ts +3 -3
  23. package/dist/react/3d/index.js +5 -53
  24. package/dist/react/3d/threeLoader.d.ts +1 -1
  25. package/dist/react/3d/threeLoader.js +23 -18
  26. package/dist/react/3d/threeLoader.js.map +1 -1
  27. package/dist/react/astro/ClassificationBanner.d.ts +2 -3
  28. package/dist/react/astro/ClassificationBanner.js +95 -79
  29. package/dist/react/astro/ClassificationBanner.js.map +1 -1
  30. package/dist/react/astro/GlobalStatusBar.d.ts +0 -1
  31. package/dist/react/astro/GlobalStatusBar.js +157 -163
  32. package/dist/react/astro/GlobalStatusBar.js.map +1 -1
  33. package/dist/react/astro/MissionClock.d.ts +7 -8
  34. package/dist/react/astro/MissionClock.js +377 -400
  35. package/dist/react/astro/MissionClock.js.map +1 -1
  36. package/dist/react/astro/MonitoringIcon.d.ts +1 -2
  37. package/dist/react/astro/MonitoringIcon.js +422 -358
  38. package/dist/react/astro/MonitoringIcon.js.map +1 -1
  39. package/dist/react/astro/Notification.d.ts +1 -2
  40. package/dist/react/astro/Notification.js +229 -126
  41. package/dist/react/astro/Notification.js.map +1 -1
  42. package/dist/react/astro/Progress.d.ts +0 -1
  43. package/dist/react/astro/Progress.js +199 -141
  44. package/dist/react/astro/Progress.js.map +1 -1
  45. package/dist/react/astro/SimulationControls.d.ts +3 -4
  46. package/dist/react/astro/SimulationControls.js +596 -650
  47. package/dist/react/astro/SimulationControls.js.map +1 -1
  48. package/dist/react/astro/StatusIndicator.d.ts +0 -1
  49. package/dist/react/astro/StatusIndicator.js +236 -170
  50. package/dist/react/astro/StatusIndicator.js.map +1 -1
  51. package/dist/react/astro/UnifiedTimeline.d.ts +9 -10
  52. package/dist/react/astro/UnifiedTimeline.js +2345 -2392
  53. package/dist/react/astro/UnifiedTimeline.js.map +1 -1
  54. package/dist/react/astro/index.d.ts +5 -5
  55. package/dist/react/astro/index.js +1 -25
  56. package/dist/react/cards/AccessCard.d.ts +0 -1
  57. package/dist/react/cards/AccessCard.js +471 -405
  58. package/dist/react/cards/AccessCard.js.map +1 -1
  59. package/dist/react/cards/OrbitCard.d.ts +0 -1
  60. package/dist/react/cards/OrbitCard.js +487 -364
  61. package/dist/react/cards/OrbitCard.js.map +1 -1
  62. package/dist/react/cards/SpacecraftCard.d.ts +0 -1
  63. package/dist/react/cards/SpacecraftCard.js +813 -925
  64. package/dist/react/cards/SpacecraftCard.js.map +1 -1
  65. package/dist/react/cards/TelemetryCard.d.ts +0 -1
  66. package/dist/react/cards/TelemetryCard.js +1055 -732
  67. package/dist/react/cards/TelemetryCard.js.map +1 -1
  68. package/dist/react/cards/TelemetryStreamCard.d.ts +0 -1
  69. package/dist/react/cards/TelemetryStreamCard.js +323 -297
  70. package/dist/react/cards/TelemetryStreamCard.js.map +1 -1
  71. package/dist/react/cards/index.d.ts +1 -1
  72. package/dist/react/cards/index.js +1 -8
  73. package/dist/react/charts/GroundTrackMap.d.ts +6 -7
  74. package/dist/react/charts/GroundTrackMap.js +1377 -1256
  75. package/dist/react/charts/GroundTrackMap.js.map +1 -1
  76. package/dist/react/charts/GroundTrackMapLeaflet.d.ts +1 -2
  77. package/dist/react/charts/GroundTrackMapLeaflet.js +1065 -987
  78. package/dist/react/charts/GroundTrackMapLeaflet.js.map +1 -1
  79. package/dist/react/charts/groundTrackMapLeafletTiles.js +34 -25
  80. package/dist/react/charts/groundTrackMapLeafletTiles.js.map +1 -1
  81. package/dist/react/charts/groundTrackMapLeafletUtils.js +70 -61
  82. package/dist/react/charts/groundTrackMapLeafletUtils.js.map +1 -1
  83. package/dist/react/charts/index.d.ts +1 -1
  84. package/dist/react/charts/index.js +7 -100
  85. package/dist/react/charts/unified/AstroChart.d.ts +1 -2
  86. package/dist/react/charts/unified/AstroChart.js +1331 -1411
  87. package/dist/react/charts/unified/AstroChart.js.map +1 -1
  88. package/dist/react/charts/unified/PowerOverviewChart.d.ts +3 -3
  89. package/dist/react/charts/unified/PowerOverviewChart.js +495 -478
  90. package/dist/react/charts/unified/PowerOverviewChart.js.map +1 -1
  91. package/dist/react/charts/unified/domain.d.ts +12 -13
  92. package/dist/react/charts/unified/domain.js +3999 -3145
  93. package/dist/react/charts/unified/domain.js.map +1 -1
  94. package/dist/react/charts/unified/generators.d.ts +3 -4
  95. package/dist/react/charts/unified/generators.js +561 -498
  96. package/dist/react/charts/unified/generators.js.map +1 -1
  97. package/dist/react/charts/unified/index.d.ts +1 -1
  98. package/dist/react/charts/unified/presets.d.ts +14 -15
  99. package/dist/react/charts/unified/presets.js +857 -994
  100. package/dist/react/charts/unified/presets.js.map +1 -1
  101. package/dist/react/charts/unified/sync.d.ts +2 -3
  102. package/dist/react/charts/unified/sync.js +229 -195
  103. package/dist/react/charts/unified/sync.js.map +1 -1
  104. package/dist/react/charts/unified/theme.d.ts +11 -12
  105. package/dist/react/charts/unified/theme.js +606 -642
  106. package/dist/react/charts/unified/theme.js.map +1 -1
  107. package/dist/react/charts/unified/types.d.ts +32 -33
  108. package/dist/react/charts/unified/useChartStream.d.ts +1 -2
  109. package/dist/react/charts/unified/useChartStream.js +203 -216
  110. package/dist/react/charts/unified/useChartStream.js.map +1 -1
  111. package/dist/react/chatgpt/AppCard.d.ts +1 -2
  112. package/dist/react/chatgpt/index.d.ts +7 -7
  113. package/dist/react/chatgpt/index.js +160 -139
  114. package/dist/react/chatgpt/index.js.map +1 -1
  115. package/dist/react/context/CategoryContext.d.ts +0 -1
  116. package/dist/react/context/CategoryContext.js +78 -29
  117. package/dist/react/context/CategoryContext.js.map +1 -1
  118. package/dist/react/context/DisplaySettingsContext.d.ts +1 -2
  119. package/dist/react/context/DisplaySettingsContext.js +205 -156
  120. package/dist/react/context/DisplaySettingsContext.js.map +1 -1
  121. package/dist/react/context/SpatialSelectionContext.d.ts +0 -1
  122. package/dist/react/context/SpatialSelectionContext.js +36 -7
  123. package/dist/react/context/SpatialSelectionContext.js.map +1 -1
  124. package/dist/react/core/data/DataTable.d.ts +3 -4
  125. package/dist/react/core/data/DataTable.js +473 -440
  126. package/dist/react/core/data/DataTable.js.map +1 -1
  127. package/dist/react/core/data/DataValue.d.ts +4 -5
  128. package/dist/react/core/data/DataValue.js +605 -571
  129. package/dist/react/core/data/DataValue.js.map +1 -1
  130. package/dist/react/core/data/propertyConfig.d.ts +1 -2
  131. package/dist/react/core/data/propertyConfig.js +446 -382
  132. package/dist/react/core/data/propertyConfig.js.map +1 -1
  133. package/dist/react/core/display/AstroIcon.d.ts +4 -5
  134. package/dist/react/core/display/AstroIcon.js +339 -429
  135. package/dist/react/core/display/AstroIcon.js.map +1 -1
  136. package/dist/react/core/display/Badge.d.ts +2 -3
  137. package/dist/react/core/display/Badge.js +131 -131
  138. package/dist/react/core/display/Badge.js.map +1 -1
  139. package/dist/react/core/display/CardHeader.d.ts +0 -1
  140. package/dist/react/core/display/CardHeader.js +398 -311
  141. package/dist/react/core/display/CardHeader.js.map +1 -1
  142. package/dist/react/core/display/Container.d.ts +2 -3
  143. package/dist/react/core/display/Container.js +640 -668
  144. package/dist/react/core/display/Container.js.map +1 -1
  145. package/dist/react/core/display/CopyButton.d.ts +1 -2
  146. package/dist/react/core/display/CopyButton.js +158 -101
  147. package/dist/react/core/display/CopyButton.js.map +1 -1
  148. package/dist/react/core/display/GlassCard.d.ts +3 -4
  149. package/dist/react/core/display/GlassCard.js +416 -369
  150. package/dist/react/core/display/GlassCard.js.map +1 -1
  151. package/dist/react/core/display/HeaderIconWithStatus.d.ts +0 -1
  152. package/dist/react/core/display/HeaderIconWithStatus.js +152 -152
  153. package/dist/react/core/display/HeaderIconWithStatus.js.map +1 -1
  154. package/dist/react/core/display/Icon.d.ts +2 -3
  155. package/dist/react/core/display/Icon.js +172 -143
  156. package/dist/react/core/display/Icon.js.map +1 -1
  157. package/dist/react/core/display/Typography.d.ts +24 -25
  158. package/dist/react/core/display/Typography.js +360 -178
  159. package/dist/react/core/display/Typography.js.map +1 -1
  160. package/dist/react/core/feedback/ConfirmDialog.d.ts +1 -2
  161. package/dist/react/core/feedback/ConfirmDialog.js +343 -304
  162. package/dist/react/core/feedback/ConfirmDialog.js.map +1 -1
  163. package/dist/react/core/feedback/Dialog.d.ts +2 -3
  164. package/dist/react/core/feedback/Dialog.js +189 -197
  165. package/dist/react/core/feedback/Dialog.js.map +1 -1
  166. package/dist/react/core/feedback/Toast.d.ts +2 -3
  167. package/dist/react/core/feedback/Toast.js +346 -207
  168. package/dist/react/core/feedback/Toast.js.map +1 -1
  169. package/dist/react/core/index.d.ts +26 -26
  170. package/dist/react/core/index.js +7 -119
  171. package/dist/react/core/inputs/Button.d.ts +2 -3
  172. package/dist/react/core/inputs/Button.js +281 -304
  173. package/dist/react/core/inputs/Button.js.map +1 -1
  174. package/dist/react/core/inputs/Checkbox.d.ts +2 -3
  175. package/dist/react/core/inputs/Checkbox.js +139 -127
  176. package/dist/react/core/inputs/Checkbox.js.map +1 -1
  177. package/dist/react/core/inputs/Input.d.ts +3 -4
  178. package/dist/react/core/inputs/Input.js +277 -285
  179. package/dist/react/core/inputs/Input.js.map +1 -1
  180. package/dist/react/core/inputs/LimitsBar.d.ts +1 -2
  181. package/dist/react/core/inputs/LimitsBar.js +271 -196
  182. package/dist/react/core/inputs/LimitsBar.js.map +1 -1
  183. package/dist/react/core/inputs/NumberInput.d.ts +2 -3
  184. package/dist/react/core/inputs/NumberInput.js +531 -503
  185. package/dist/react/core/inputs/NumberInput.js.map +1 -1
  186. package/dist/react/core/inputs/PinInput.d.ts +2 -3
  187. package/dist/react/core/inputs/PinInput.js +224 -207
  188. package/dist/react/core/inputs/PinInput.js.map +1 -1
  189. package/dist/react/core/inputs/Select.d.ts +1 -2
  190. package/dist/react/core/inputs/Select.js +298 -299
  191. package/dist/react/core/inputs/Select.js.map +1 -1
  192. package/dist/react/core/inputs/Toggle.d.ts +2 -3
  193. package/dist/react/core/inputs/Toggle.js +142 -148
  194. package/dist/react/core/inputs/Toggle.js.map +1 -1
  195. package/dist/react/core/layout/Box.d.ts +3 -4
  196. package/dist/react/core/layout/Box.js +118 -122
  197. package/dist/react/core/layout/Box.js.map +1 -1
  198. package/dist/react/core/layout/Center.d.ts +0 -1
  199. package/dist/react/core/layout/Center.js +45 -32
  200. package/dist/react/core/layout/Center.js.map +1 -1
  201. package/dist/react/core/layout/Divider.d.ts +1 -2
  202. package/dist/react/core/layout/Divider.js +112 -106
  203. package/dist/react/core/layout/Divider.js.map +1 -1
  204. package/dist/react/core/layout/Flex.d.ts +4 -5
  205. package/dist/react/core/layout/Flex.js +120 -124
  206. package/dist/react/core/layout/Flex.js.map +1 -1
  207. package/dist/react/core/layout/Grid.d.ts +5 -6
  208. package/dist/react/core/layout/Grid.js +131 -138
  209. package/dist/react/core/layout/Grid.js.map +1 -1
  210. package/dist/react/core/layout/Spacer.d.ts +0 -1
  211. package/dist/react/core/layout/Spacer.js +36 -29
  212. package/dist/react/core/layout/Spacer.js.map +1 -1
  213. package/dist/react/core/layout/Stack.d.ts +4 -5
  214. package/dist/react/core/layout/Stack.js +127 -70
  215. package/dist/react/core/layout/Stack.js.map +1 -1
  216. package/dist/react/core/layout/responsive.d.ts +1 -2
  217. package/dist/react/core/layout/responsive.js +25 -19
  218. package/dist/react/core/layout/responsive.js.map +1 -1
  219. package/dist/react/core/layout/useBreakpoint.d.ts +1 -1
  220. package/dist/react/core/layout/useBreakpoint.js +119 -66
  221. package/dist/react/core/layout/useBreakpoint.js.map +1 -1
  222. package/dist/react/core/navigation/AppBar.d.ts +1 -2
  223. package/dist/react/core/navigation/AppBar.js +827 -805
  224. package/dist/react/core/navigation/AppBar.js.map +1 -1
  225. package/dist/react/core/navigation/Pagination.d.ts +2 -3
  226. package/dist/react/core/navigation/Pagination.js +207 -187
  227. package/dist/react/core/navigation/Pagination.js.map +1 -1
  228. package/dist/react/core/navigation/SideNav.d.ts +5 -6
  229. package/dist/react/core/navigation/SideNav.js +855 -629
  230. package/dist/react/core/navigation/SideNav.js.map +1 -1
  231. package/dist/react/core/navigation/Tabs.d.ts +0 -1
  232. package/dist/react/core/navigation/Tabs.js +113 -119
  233. package/dist/react/core/navigation/Tabs.js.map +1 -1
  234. package/dist/react/core/overlays/Popover.d.ts +2 -3
  235. package/dist/react/core/overlays/Popover.js +303 -282
  236. package/dist/react/core/overlays/Popover.js.map +1 -1
  237. package/dist/react/core/overlays/SidePanel.d.ts +1 -2
  238. package/dist/react/core/overlays/SidePanel.js +217 -212
  239. package/dist/react/core/overlays/SidePanel.js.map +1 -1
  240. package/dist/react/core/overlays/Tooltip.d.ts +1 -2
  241. package/dist/react/core/overlays/Tooltip.js +170 -176
  242. package/dist/react/core/overlays/Tooltip.js.map +1 -1
  243. package/dist/react/core/widgets/ActivityPlanner.d.ts +0 -1
  244. package/dist/react/core/widgets/ActivityPlanner.js +855 -517
  245. package/dist/react/core/widgets/ActivityPlanner.js.map +1 -1
  246. package/dist/react/core/widgets/Capture.d.ts +2 -3
  247. package/dist/react/core/widgets/Capture.js +965 -779
  248. package/dist/react/core/widgets/Capture.js.map +1 -1
  249. package/dist/react/core/widgets/ChatPanel.d.ts +16 -17
  250. package/dist/react/core/widgets/ChatPanel.js +1734 -1034
  251. package/dist/react/core/widgets/ChatPanel.js.map +1 -1
  252. package/dist/react/core/widgets/ColorPickerPanel.d.ts +0 -1
  253. package/dist/react/core/widgets/ColorPickerPanel.js +298 -287
  254. package/dist/react/core/widgets/ColorPickerPanel.js.map +1 -1
  255. package/dist/react/core/widgets/CommandBuilder.d.ts +2 -3
  256. package/dist/react/core/widgets/CommandBuilder.js +624 -516
  257. package/dist/react/core/widgets/CommandBuilder.js.map +1 -1
  258. package/dist/react/core/widgets/ConnectionForm.d.ts +2 -3
  259. package/dist/react/core/widgets/ConnectionForm.js +528 -492
  260. package/dist/react/core/widgets/ConnectionForm.js.map +1 -1
  261. package/dist/react/core/widgets/FileExplorer.d.ts +3 -4
  262. package/dist/react/core/widgets/FileExplorer.js +617 -505
  263. package/dist/react/core/widgets/FileExplorer.js.map +1 -1
  264. package/dist/react/core/widgets/HexViewer.d.ts +2 -3
  265. package/dist/react/core/widgets/HexViewer.js +1353 -1091
  266. package/dist/react/core/widgets/HexViewer.js.map +1 -1
  267. package/dist/react/core/widgets/ImageFrame.d.ts +1 -2
  268. package/dist/react/core/widgets/ImageFrame.js +230 -193
  269. package/dist/react/core/widgets/ImageFrame.js.map +1 -1
  270. package/dist/react/core/widgets/ImageGallery.d.ts +2 -1
  271. package/dist/react/core/widgets/ImageGallery.js +380 -314
  272. package/dist/react/core/widgets/ImageGallery.js.map +1 -1
  273. package/dist/react/core/widgets/ImagePanel.d.ts +0 -1
  274. package/dist/react/core/widgets/ImagePanel.js +110 -101
  275. package/dist/react/core/widgets/ImagePanel.js.map +1 -1
  276. package/dist/react/core/widgets/LogViewer.d.ts +2 -3
  277. package/dist/react/core/widgets/LogViewer.js +711 -607
  278. package/dist/react/core/widgets/LogViewer.js.map +1 -1
  279. package/dist/react/core/widgets/MessageStream.d.ts +3 -4
  280. package/dist/react/core/widgets/MessageStream.js +514 -444
  281. package/dist/react/core/widgets/MessageStream.js.map +1 -1
  282. package/dist/react/core/widgets/MissionCalendar.d.ts +3 -4
  283. package/dist/react/core/widgets/MissionCalendar.js +1488 -1020
  284. package/dist/react/core/widgets/MissionCalendar.js.map +1 -1
  285. package/dist/react/core/widgets/PacketViewer.d.ts +2 -3
  286. package/dist/react/core/widgets/PacketViewer.js +550 -421
  287. package/dist/react/core/widgets/PacketViewer.js.map +1 -1
  288. package/dist/react/core/widgets/capture-placeholder.png.js +6 -5
  289. package/dist/react/core/widgets/capture-placeholder.png.js.map +1 -1
  290. package/dist/react/hooks/index.d.ts +5 -5
  291. package/dist/react/hooks/useAccessWindows.d.ts +0 -1
  292. package/dist/react/hooks/useCompactMode.d.ts +1 -1
  293. package/dist/react/hooks/useCompactMode.js +104 -58
  294. package/dist/react/hooks/useCompactMode.js.map +1 -1
  295. package/dist/react/hooks/useGroundTrackHistory.d.ts +0 -1
  296. package/dist/react/hooks/useSimulationScene.d.ts +1 -2
  297. package/dist/react/hooks/useSimulationScene.js +481 -374
  298. package/dist/react/hooks/useSimulationScene.js.map +1 -1
  299. package/dist/react/index.d.ts +3 -3
  300. package/dist/react/panels/LayerControlPanel.d.ts +1 -2
  301. package/dist/react/panels/LayerControlPanel.js +223 -180
  302. package/dist/react/panels/LayerControlPanel.js.map +1 -1
  303. package/dist/react/panels/ObjectInventoryPanel.d.ts +2 -3
  304. package/dist/react/panels/ObjectInventoryPanel.js +315 -250
  305. package/dist/react/panels/ObjectInventoryPanel.js.map +1 -1
  306. package/dist/react/panels/index.d.ts +1 -1
  307. package/dist/react/panels/index.js +1 -6
  308. package/dist/react/shared/ErrorBoundary.d.ts +1 -2
  309. package/dist/react/shared/ErrorBoundary.js +170 -139
  310. package/dist/react/shared/ErrorBoundary.js.map +1 -1
  311. package/dist/react/shared/Skeleton.d.ts +1 -2
  312. package/dist/react/shared/Skeleton.js +300 -301
  313. package/dist/react/shared/Skeleton.js.map +1 -1
  314. package/dist/react/theme/ThemeProvider.d.ts +2 -321
  315. package/dist/react/theme/ThemeProvider.js +312 -939
  316. package/dist/react/theme/ThemeProvider.js.map +1 -1
  317. package/dist/react/theme/cardAccent.d.ts +1 -2
  318. package/dist/react/theme/cardAccent.js +196 -126
  319. package/dist/react/theme/cardAccent.js.map +1 -1
  320. package/dist/react/theme/config.d.ts +0 -1
  321. package/dist/react/theme/config.js +47 -25
  322. package/dist/react/theme/config.js.map +1 -1
  323. package/dist/react/theme/index.d.ts +2 -2
  324. package/dist/react/theme/index.js +1 -16
  325. package/dist/react/theme/types.d.ts +332 -0
  326. package/dist/react/theme/types.js +39 -0
  327. package/dist/react/theme/types.js.map +1 -0
  328. package/dist/react/types.d.ts +8 -8
  329. package/dist/react/types.js +147 -47
  330. package/dist/react/types.js.map +1 -1
  331. package/dist/react/utils/categoryPalette.d.ts +0 -1
  332. package/dist/react/utils/categoryPalette.js +91 -102
  333. package/dist/react/utils/categoryPalette.js.map +1 -1
  334. package/dist/react/utils/index.d.ts +5 -5
  335. package/dist/react/utils/index.js +457 -371
  336. package/dist/react/utils/index.js.map +1 -1
  337. package/dist/react/visualizations/EclipseTimerCard.d.ts +0 -1
  338. package/dist/react/visualizations/LinkBudgetCard.d.ts +0 -1
  339. package/dist/react/visualizations/NavBallCard.d.ts +0 -1
  340. package/dist/react/visualizations/PropulsionCard.d.ts +1 -2
  341. package/dist/react/visualizations/SensorFootprintCard.d.ts +1 -2
  342. package/dist/react/visualizations/ThermalHeatmapCard.d.ts +0 -1
  343. package/dist/react/visualizations/index.d.ts +3 -3
  344. package/dist/react.d.ts +2 -1
  345. package/dist/react.js +17 -221
  346. package/dist/shaders/atmosphere.frag.js +6 -5
  347. package/dist/shaders/atmosphere.frag.js.map +1 -1
  348. package/dist/shaders/atmosphere.vert.js +6 -5
  349. package/dist/shaders/atmosphere.vert.js.map +1 -1
  350. package/dist/shaders/stars.frag.js +6 -5
  351. package/dist/shaders/stars.frag.js.map +1 -1
  352. package/dist/shaders/stars.vert.js +6 -5
  353. package/dist/shaders/stars.vert.js.map +1 -1
  354. package/dist/style.css +217 -194
  355. package/dist/tokens/core.d.ts +159 -0
  356. package/dist/tokens/core.js +144 -0
  357. package/dist/tokens/core.js.map +1 -0
  358. package/dist/tokens/css-vars.d.ts +213 -2
  359. package/dist/tokens/css-vars.js +590 -227
  360. package/dist/tokens/css-vars.js.map +1 -1
  361. package/dist/tokens/index.d.ts +31 -228
  362. package/dist/tokens/index.js +281 -366
  363. package/dist/tokens/index.js.map +1 -1
  364. package/dist/tokens/palettes/astro.d.ts +129 -0
  365. package/dist/tokens/palettes/astro.js +112 -0
  366. package/dist/tokens/palettes/astro.js.map +1 -0
  367. package/dist/tokens/palettes/index.d.ts +288 -0
  368. package/dist/tokens/palettes/index.js +35 -0
  369. package/dist/tokens/palettes/index.js.map +1 -0
  370. package/dist/tokens/palettes/tailwind.d.ts +324 -0
  371. package/dist/tokens/palettes/tailwind.js +201 -0
  372. package/dist/tokens/palettes/tailwind.js.map +1 -0
  373. package/dist/tokens/palettes/zendir.d.ts +126 -0
  374. package/dist/tokens/palettes/zendir.js +92 -0
  375. package/dist/tokens/palettes/zendir.js.map +1 -0
  376. package/dist/tokens/themes.d.ts +30 -0
  377. package/dist/tokens/themes.js +704 -0
  378. package/dist/tokens/themes.js.map +1 -0
  379. package/dist/tokens/tokens.css +419 -41
  380. package/dist/types/index.d.ts +2 -2
  381. package/package.json +310 -313
  382. package/dist/index.js.map +0 -1
  383. package/dist/react/3d/index.js.map +0 -1
  384. package/dist/react/astro/index.js.map +0 -1
  385. package/dist/react/cards/index.js.map +0 -1
  386. package/dist/react/charts/index.js.map +0 -1
  387. package/dist/react/core/index.js.map +0 -1
  388. package/dist/react/panels/index.js.map +0 -1
  389. package/dist/react/theme/astro-tokens.d.ts +0 -153
  390. package/dist/react/theme/index.js.map +0 -1
  391. package/dist/react.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"Input.js","sources":["../../../../src/react/core/inputs/Input.tsx"],"sourcesContent":["/**\n * @zendir/ui - Input Component\n * \n * Text input field following Astro UX Design System with Zendir purple accents.\n * \n * Astro UX Compliance:\n * - Stacked inputs left-justified\n * - Consistent spacing\n * - Help text for validation (not placeholder)\n * - Required/optional indicators\n * - States: default, hover, focus, invalid, disabled\n * \n * Zendir Enhancements:\n * - Purple focus glow\n * - Smooth transitions\n * - Modern glassmorphism effects\n * \n * @example\n * ```tsx\n * <Input label=\"Spacecraft ID\" placeholder=\"Enter ID...\" />\n * <Input label=\"Password\" type=\"password\" />\n * <Input label=\"Search\" icon={<Icon name=\"search\" />} />\n * <Input label=\"Email\" error=\"Invalid email format\" />\n * ```\n */\n\nimport React, { memo, forwardRef, useState, useId } from 'react';\nimport { useTheme } from '../../theme';\nimport { classNames, safeAccentText, type StatusLevel } from '../../utils';\nimport { useBreakpoint } from '../layout/useBreakpoint';\n\nexport type InputSize = 'small' | 'medium' | 'large';\n\n/** Label placement relative to the input field */\nexport type LabelPlacement = 'above' | 'outlined';\n\nexport interface InputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'> {\n /** Label text or ReactNode (supports rich content like tooltip icons) */\n label?: React.ReactNode;\n /** Helper text below input */\n helperText?: string;\n /** Error message (shows error state) */\n error?: string;\n /** Size variant */\n size?: InputSize;\n /** Status for styling */\n status?: StatusLevel;\n /** Icon at start of input */\n icon?: React.ReactNode;\n /** Icon at end of input */\n iconEnd?: React.ReactNode;\n /** Full width */\n fullWidth?: boolean;\n /** Required indicator */\n required?: boolean;\n /** Optional indicator (shows \"optional\" text) */\n optional?: boolean;\n /** Custom className */\n className?: string;\n /**\n * Label placement style.\n * - `'outlined'` — label sits on the input border (notched/Material-style). **Default.**\n * - `'above'` — label sits above the input with a gap (classic stack).\n */\n labelPlacement?: LabelPlacement;\n}\n\nexport const Input = memo(forwardRef<HTMLInputElement, InputProps>(function Input(\n {\n label,\n helperText,\n error,\n size = 'medium',\n status,\n icon,\n iconEnd,\n fullWidth = false,\n required,\n optional,\n disabled,\n className = '',\n id: propId,\n style,\n onFocus,\n onBlur,\n labelPlacement = 'outlined',\n type = 'text',\n autoComplete,\n inputMode,\n onPaste: onPasteUser,\n ...rest\n },\n ref\n): React.ReactElement {\n // Mobile: email keyboard when type is email (industry standard).\n const resolvedInputMode = inputMode ?? (type === 'email' ? 'email' : undefined);\n const { tokens, theme } = useTheme();\n const { isMobile } = useBreakpoint();\n const [focused, setFocused] = useState(false);\n const [hovered, setHovered] = useState(false);\n const generatedId = useId();\n const inputId = propId ?? generatedId;\n\n // Trim pasted content for password, email, and username (industry standard: avoid auth/validation failures).\n const shouldTrimOnPaste = type === 'password' || type === 'email' || autoComplete === 'email' || autoComplete === 'username';\n const handlePaste = (e: React.ClipboardEvent<HTMLInputElement>) => {\n if (shouldTrimOnPaste) {\n const pasted = e.clipboardData.getData('text');\n const trimmed = pasted.trim();\n if (trimmed !== pasted) {\n e.preventDefault();\n const input = e.currentTarget;\n const start = input.selectionStart ?? 0;\n const end = input.selectionEnd ?? 0;\n const cur = ((rest as { value?: string }).value ?? input.value) ?? '';\n const newValue = cur.slice(0, start) + trimmed + cur.slice(end);\n rest.onChange?.({ target: { ...input, value: newValue } } as React.ChangeEvent<HTMLInputElement>);\n requestAnimationFrame(() => {\n input.setSelectionRange(start + trimmed.length, start + trimmed.length);\n });\n }\n }\n onPasteUser?.(e);\n };\n\n // Trim on blur for email/username so \" user@example.com \" becomes \"user@example.com\" when leaving the field.\n const shouldTrimOnBlur = type === 'email' || autoComplete === 'email' || autoComplete === 'username';\n const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n if (shouldTrimOnBlur) {\n const input = e.currentTarget;\n const cur = input.value;\n const trimmed = cur.trim();\n if (trimmed !== cur && rest.onChange) {\n rest.onChange({ target: { ...input, value: trimmed } } as React.ChangeEvent<HTMLInputElement>);\n }\n }\n setFocused(false);\n onBlur?.(e);\n };\n \n // Transparent theme detection (purple-hue transparent bg)\n const isTransparentTheme = theme === 'transparent' || theme === 'transparent-bold' || theme === 'transparent-minimal';\n const _transparentInputBg = tokens.colors.interactive.transparentInputBg;\n \n const hasError = !!error;\n const isOutlined = labelPlacement === 'outlined';\n \n // Determine border color based on state\n const getBorder = () => {\n if (hasError) return tokens.borders.input.error;\n if (status) return `${tokens.borders.width.thin} solid ${tokens.colors.status[status]}`;\n if (focused) return tokens.borders.input.focus;\n if (hovered && !disabled) return tokens.borders.input.hover;\n return tokens.borders.input.default;\n };\n \n const sizeConfig = {\n small: {\n padding: `${tokens.spacing.xs} ${tokens.spacing.sm}`,\n fontSize: tokens.typography.fontSize.xs,\n height: tokens.elementSize.sm,\n iconSize: 14,\n labelSize: '0.6875rem',\n outlinedLabelSize: '0.625rem',\n inputPaddingLeft: 10,\n },\n medium: {\n padding: `${tokens.spacing.sm} ${tokens.spacing.smd}`,\n fontSize: tokens.typography.fontSize.sm,\n height: tokens.elementSize.md,\n iconSize: 18,\n labelSize: '0.75rem',\n outlinedLabelSize: '0.6875rem',\n inputPaddingLeft: 12,\n },\n large: {\n padding: `${tokens.spacing.smd} ${tokens.spacing.md}`,\n fontSize: tokens.typography.fontSize.base,\n height: tokens.elementSize.lg,\n iconSize: 20,\n labelSize: '0.875rem',\n outlinedLabelSize: '0.75rem',\n inputPaddingLeft: 16,\n },\n };\n \n const config = sizeConfig[size];\n const controlHeight = isMobile ? '44px' : config.height;\n \n // Focus glow effect\n const focusGlow = focused && !hasError\n ? tokens.borders.focusRing.default\n : hasError && focused\n ? `0 0 0 3px ${tokens.colors.status.critical}20`\n : 'none';\n \n // Background for the outlined label \"notch\" (must be opaque to mask the border)\n const labelBg = isTransparentTheme\n ? tokens.colors.background.base\n : tokens.colors.background.surface;\n \n // Shared label content (text + required/optional indicators)\n const labelContent = (\n <>\n {label}\n {required && (\n <span style={{ color: tokens.colors.status.critical, marginLeft: '2px' }}>*</span>\n )}\n {optional && (\n <span style={{ \n color: tokens.colors.text.tertiary, \n fontWeight: 400,\n fontStyle: 'italic',\n }}>\n {' '}(optional)\n </span>\n )}\n </>\n );\n \n return (\n <div\n className={classNames('zendir-input-wrapper', className)}\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: tokens.spacing.xs,\n width: fullWidth ? '100%' : 'auto',\n minWidth: fullWidth ? undefined : (isMobile ? '100%' : '200px'),\n ...style,\n }}\n >\n {/* Label: 'above' variant — sits above the input with gap */}\n {label && !isOutlined && (\n <label\n htmlFor={inputId}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: tokens.spacing.xs,\n fontSize: config.labelSize,\n fontWeight: 500,\n color: tokens.colors.text.secondary,\n letterSpacing: '0.01em',\n }}\n >\n {labelContent}\n </label>\n )}\n \n <div\n style={{\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n }}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n >\n {/* Label: 'outlined' variant — positioned on the input border */}\n {label && isOutlined && (\n <label\n htmlFor={inputId}\n style={{\n position: 'absolute',\n top: 0,\n left: icon ? '34px' : `${config.inputPaddingLeft - 6}px`,\n transform: 'translateY(-50%)',\n backgroundColor: labelBg,\n padding: `0 ${tokens.spacing.xs}`,\n fontSize: config.outlinedLabelSize,\n fontWeight: 500,\n color: focused\n ? (hasError ? tokens.colors.status.critical : tokens.colors.accent.primary)\n : hasError\n ? tokens.colors.status.critical\n : tokens.colors.text.secondary,\n letterSpacing: '0.01em',\n zIndex: 1,\n pointerEvents: 'none',\n transition: 'color 200ms cubic-bezier(0.4, 0, 0.2, 1)',\n lineHeight: 1.2,\n whiteSpace: 'nowrap',\n }}\n >\n {labelContent}\n </label>\n )}\n \n {icon && (\n <span\n style={{\n position: 'absolute',\n left: tokens.spacing.smd,\n display: 'flex',\n alignItems: 'center',\n color: focused ? safeAccentText(tokens.colors.accent.primary) : tokens.colors.text.tertiary,\n pointerEvents: 'none',\n transition: tokens.animation.fast,\n }}\n >\n {icon}\n </span>\n )}\n \n <input\n ref={ref}\n id={inputId}\n disabled={disabled}\n required={required}\n aria-invalid={hasError}\n aria-describedby={helperText || error ? `${inputId}-helper` : undefined}\n onFocus={(e) => {\n setFocused(true);\n onFocus?.(e);\n }}\n onBlur={handleBlur}\n onPaste={handlePaste}\n type={type}\n autoComplete={autoComplete}\n inputMode={resolvedInputMode}\n style={{\n width: '100%',\n height: controlHeight,\n padding: config.padding,\n paddingLeft: icon ? '40px' : config.padding,\n paddingRight: iconEnd ? '40px' : config.padding,\n fontSize: config.fontSize,\n fontFamily: tokens.typography.fontFamily.primary,\n color: tokens.colors.text.primary,\n backgroundColor: isTransparentTheme ? 'rgba(10, 15, 25, 0.4)' : tokens.colors.background.surface,\n border: getBorder(),\n borderRadius: tokens.borderRadius.md,\n outline: 'none',\n transition: 'all 200ms cubic-bezier(0.4, 0, 0.2, 1)',\n cursor: disabled ? 'not-allowed' : 'text',\n opacity: disabled ? 0.5 : 1,\n boxShadow: focusGlow,\n }}\n {...rest}\n />\n \n {iconEnd && (\n <span\n style={{\n position: 'absolute',\n right: tokens.spacing.smd,\n display: 'flex',\n alignItems: 'center',\n color: tokens.colors.text.tertiary,\n cursor: 'pointer',\n }}\n >\n {iconEnd}\n </span>\n )}\n </div>\n \n {(helperText || error) && (\n <span\n id={`${inputId}-helper`}\n role={hasError ? 'alert' : undefined}\n style={{\n fontSize: '0.6875rem',\n fontWeight: hasError ? 500 : 400,\n color: hasError ? tokens.colors.status.critical : tokens.colors.text.tertiary,\n display: 'flex',\n alignItems: 'center',\n gap: tokens.spacing.xs,\n }}\n >\n {hasError && (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill={tokens.colors.status.critical} aria-hidden=\"true\" focusable=\"false\">\n <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z\"/>\n </svg>\n )}\n {error || helperText}\n </span>\n )}\n </div>\n );\n}));\n\nexport default Input;\n"],"names":["Input"],"mappings":"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"}
1
+ {"version":3,"file":"Input.js","names":[],"sources":["../../../../src/react/core/inputs/Input.tsx"],"sourcesContent":["/**\n * @zendir/ui - Input Component\n *\n * Text input field following Astro UX Design System with Zendir purple accents.\n *\n * Astro UX Compliance:\n * - Stacked inputs left-justified\n * - Consistent spacing\n * - Help text for validation (not placeholder)\n * - Required/optional indicators\n * - States: default, hover, focus, invalid, disabled\n *\n * Zendir Enhancements:\n * - Purple focus glow\n * - Smooth transitions\n * - Modern glassmorphism effects\n *\n * @example\n * ```tsx\n * <Input label=\"Spacecraft ID\" placeholder=\"Enter ID...\" />\n * <Input label=\"Password\" type=\"password\" />\n * <Input label=\"Search\" icon={<Icon name=\"search\" />} />\n * <Input label=\"Email\" error=\"Invalid email format\" />\n * ```\n */\n\nimport React, { memo, forwardRef, useState, useId } from \"react\";\nimport { useTheme } from \"../../theme\";\nimport { classNames, safeAccentText, type StatusLevel } from \"../../utils\";\nimport { useBreakpoint } from \"../layout/useBreakpoint\";\n\nexport type InputSize = \"small\" | \"medium\" | \"large\";\n\n/** Label placement relative to the input field */\nexport type LabelPlacement = \"above\" | \"outlined\";\n\nexport interface InputProps extends Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n \"size\"\n> {\n /** Label text or ReactNode (supports rich content like tooltip icons) */\n label?: React.ReactNode;\n /** Helper text below input */\n helperText?: string;\n /** Error message (shows error state) */\n error?: string;\n /** Size variant */\n size?: InputSize;\n /** Status for styling */\n status?: StatusLevel;\n /** Icon at start of input */\n icon?: React.ReactNode;\n /** Icon at end of input */\n iconEnd?: React.ReactNode;\n /** Full width */\n fullWidth?: boolean;\n /** Required indicator */\n required?: boolean;\n /** Optional indicator (shows \"optional\" text) */\n optional?: boolean;\n /** Custom className */\n className?: string;\n /**\n * Label placement style.\n * - `'outlined'` — label sits on the input border (notched/Material-style). **Default.**\n * - `'above'` — label sits above the input with a gap (classic stack).\n */\n labelPlacement?: LabelPlacement;\n}\n\nexport const Input = memo(\n forwardRef<HTMLInputElement, InputProps>(function Input(\n {\n label,\n helperText,\n error,\n size = \"medium\",\n status,\n icon,\n iconEnd,\n fullWidth = false,\n required,\n optional,\n disabled,\n className = \"\",\n id: propId,\n style,\n onFocus,\n onBlur,\n labelPlacement = \"outlined\",\n type = \"text\",\n autoComplete,\n inputMode,\n onPaste: onPasteUser,\n ...rest\n },\n ref,\n ): React.ReactElement {\n // Mobile: email keyboard when type is email (industry standard).\n const resolvedInputMode =\n inputMode ?? (type === \"email\" ? \"email\" : undefined);\n const { tokens, theme } = useTheme();\n const { isMobile } = useBreakpoint();\n const [focused, setFocused] = useState(false);\n const [hovered, setHovered] = useState(false);\n const generatedId = useId();\n const inputId = propId ?? generatedId;\n\n // Trim pasted content for password, email, and username (industry standard: avoid auth/validation failures).\n const shouldTrimOnPaste =\n type === \"password\" ||\n type === \"email\" ||\n autoComplete === \"email\" ||\n autoComplete === \"username\";\n const handlePaste = (e: React.ClipboardEvent<HTMLInputElement>) => {\n if (shouldTrimOnPaste) {\n const pasted = e.clipboardData.getData(\"text\");\n const trimmed = pasted.trim();\n if (trimmed !== pasted) {\n e.preventDefault();\n const input = e.currentTarget;\n const start = input.selectionStart ?? 0;\n const end = input.selectionEnd ?? 0;\n const cur = (rest as { value?: string }).value ?? input.value ?? \"\";\n const newValue = cur.slice(0, start) + trimmed + cur.slice(end);\n rest.onChange?.({\n target: { ...input, value: newValue },\n } as React.ChangeEvent<HTMLInputElement>);\n requestAnimationFrame(() => {\n input.setSelectionRange(\n start + trimmed.length,\n start + trimmed.length,\n );\n });\n }\n }\n onPasteUser?.(e);\n };\n\n // Trim on blur for email/username so \" user@example.com \" becomes \"user@example.com\" when leaving the field.\n const shouldTrimOnBlur =\n type === \"email\" ||\n autoComplete === \"email\" ||\n autoComplete === \"username\";\n const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n if (shouldTrimOnBlur) {\n const input = e.currentTarget;\n const cur = input.value;\n const trimmed = cur.trim();\n if (trimmed !== cur && rest.onChange) {\n rest.onChange({\n target: { ...input, value: trimmed },\n } as React.ChangeEvent<HTMLInputElement>);\n }\n }\n setFocused(false);\n onBlur?.(e);\n };\n\n // Transparent theme detection (purple-hue transparent bg)\n const isTransparentTheme =\n theme === \"transparent\" ||\n theme === \"transparent-bold\" ||\n theme === \"transparent-minimal\";\n const _transparentInputBg = tokens.colors.interactive.transparentInputBg;\n\n const hasError = !!error;\n const isOutlined = labelPlacement === \"outlined\";\n\n // Determine border color based on state\n const getBorder = () => {\n if (hasError) return tokens.borders.input.error;\n if (status)\n return `${tokens.borders.width.thin} solid ${tokens.colors.status[status]}`;\n if (focused) return tokens.borders.input.focus;\n if (hovered && !disabled) return tokens.borders.input.hover;\n return tokens.borders.input.default;\n };\n\n const sizeConfig = {\n small: {\n padding: `${tokens.spacing.xs} ${tokens.spacing.sm}`,\n fontSize: tokens.typography.fontSize.xs,\n height: tokens.elementSize.sm,\n iconSize: 14,\n labelSize: \"0.6875rem\",\n outlinedLabelSize: \"0.625rem\",\n inputPaddingLeft: 10,\n },\n medium: {\n padding: `${tokens.spacing.sm} ${tokens.spacing.smd}`,\n fontSize: tokens.typography.fontSize.sm,\n height: tokens.elementSize.md,\n iconSize: 18,\n labelSize: \"0.75rem\",\n outlinedLabelSize: \"0.6875rem\",\n inputPaddingLeft: 12,\n },\n large: {\n padding: `${tokens.spacing.smd} ${tokens.spacing.md}`,\n fontSize: tokens.typography.fontSize.base,\n height: tokens.elementSize.lg,\n iconSize: 20,\n labelSize: \"0.875rem\",\n outlinedLabelSize: \"0.75rem\",\n inputPaddingLeft: 16,\n },\n };\n\n const config = sizeConfig[size];\n const controlHeight = isMobile ? \"44px\" : config.height;\n\n // Focus glow effect\n const focusGlow =\n focused && !hasError\n ? tokens.borders.focusRing.default\n : hasError && focused\n ? `0 0 0 3px ${tokens.colors.status.critical}20`\n : \"none\";\n\n // Background for the outlined label \"notch\" (must be opaque to mask the border)\n const labelBg = isTransparentTheme\n ? tokens.colors.background.base\n : tokens.colors.background.surface;\n\n // Shared label content (text + required/optional indicators)\n const labelContent = (\n <>\n {label}\n {required && (\n <span\n style={{ color: tokens.colors.status.critical, marginLeft: \"2px\" }}\n >\n *\n </span>\n )}\n {optional && (\n <span\n style={{\n color: tokens.colors.text.tertiary,\n fontWeight: 400,\n fontStyle: \"italic\",\n }}\n >\n {\" \"}\n (optional)\n </span>\n )}\n </>\n );\n\n return (\n <div\n className={classNames(\"zendir-input-wrapper\", className)}\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: tokens.spacing.xs,\n width: fullWidth ? \"100%\" : \"auto\",\n minWidth: fullWidth ? undefined : isMobile ? \"100%\" : \"200px\",\n ...style,\n }}\n >\n {/* Label: 'above' variant — sits above the input with gap */}\n {label && !isOutlined && (\n <label\n htmlFor={inputId}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: tokens.spacing.xs,\n fontSize: config.labelSize,\n fontWeight: 500,\n color: tokens.colors.text.secondary,\n letterSpacing: \"0.01em\",\n }}\n >\n {labelContent}\n </label>\n )}\n\n <div\n style={{\n position: \"relative\",\n display: \"flex\",\n alignItems: \"center\",\n }}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n >\n {/* Label: 'outlined' variant — positioned on the input border */}\n {label && isOutlined && (\n <label\n htmlFor={inputId}\n style={{\n position: \"absolute\",\n top: 0,\n left: icon ? \"34px\" : `${config.inputPaddingLeft - 6}px`,\n transform: \"translateY(-50%)\",\n backgroundColor: labelBg,\n padding: `0 ${tokens.spacing.xs}`,\n fontSize: config.outlinedLabelSize,\n fontWeight: 500,\n color: focused\n ? hasError\n ? tokens.colors.status.critical\n : tokens.colors.accent.primary\n : hasError\n ? tokens.colors.status.critical\n : tokens.colors.text.secondary,\n letterSpacing: \"0.01em\",\n zIndex: 1,\n pointerEvents: \"none\",\n transition: \"color 200ms cubic-bezier(0.4, 0, 0.2, 1)\",\n lineHeight: 1.2,\n whiteSpace: \"nowrap\",\n }}\n >\n {labelContent}\n </label>\n )}\n\n {icon && (\n <span\n style={{\n position: \"absolute\",\n left: tokens.spacing.smd,\n display: \"flex\",\n alignItems: \"center\",\n color: focused\n ? safeAccentText(tokens.colors.accent.primary)\n : tokens.colors.text.tertiary,\n pointerEvents: \"none\",\n transition: tokens.animation.fast,\n }}\n >\n {icon}\n </span>\n )}\n\n <input\n ref={ref}\n id={inputId}\n disabled={disabled}\n required={required}\n aria-invalid={hasError}\n aria-describedby={\n helperText || error ? `${inputId}-helper` : undefined\n }\n onFocus={(e) => {\n setFocused(true);\n onFocus?.(e);\n }}\n onBlur={handleBlur}\n onPaste={handlePaste}\n type={type}\n autoComplete={autoComplete}\n inputMode={resolvedInputMode}\n style={{\n width: \"100%\",\n height: controlHeight,\n padding: config.padding,\n paddingLeft: icon ? \"40px\" : config.padding,\n paddingRight: iconEnd ? \"40px\" : config.padding,\n fontSize: config.fontSize,\n fontFamily: tokens.typography.fontFamily.primary,\n color: tokens.colors.text.primary,\n backgroundColor: isTransparentTheme\n ? \"rgba(10, 15, 25, 0.4)\"\n : tokens.colors.background.surface,\n border: getBorder(),\n borderRadius: tokens.borderRadius.md,\n outline: \"none\",\n transition: \"all 200ms cubic-bezier(0.4, 0, 0.2, 1)\",\n cursor: disabled ? \"not-allowed\" : \"text\",\n opacity: disabled ? 0.5 : 1,\n boxShadow: focusGlow,\n }}\n {...rest}\n />\n\n {iconEnd && (\n <span\n style={{\n position: \"absolute\",\n right: tokens.spacing.smd,\n display: \"flex\",\n alignItems: \"center\",\n color: tokens.colors.text.tertiary,\n cursor: \"pointer\",\n }}\n >\n {iconEnd}\n </span>\n )}\n </div>\n\n {(helperText || error) && (\n <span\n id={`${inputId}-helper`}\n role={hasError ? \"alert\" : undefined}\n style={{\n fontSize: \"0.6875rem\",\n fontWeight: hasError ? 500 : 400,\n color: hasError\n ? tokens.colors.status.critical\n : tokens.colors.text.tertiary,\n display: \"flex\",\n alignItems: \"center\",\n gap: tokens.spacing.xs,\n }}\n >\n {hasError && (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 24 24\"\n fill={tokens.colors.status.critical}\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z\" />\n </svg>\n )}\n {error || helperText}\n </span>\n )}\n </div>\n );\n }),\n);\n\nexport default Input;\n"],"mappings":"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"}
@@ -1,6 +1,5 @@
1
1
  import { default as React } from 'react';
2
-
3
- export type LimitsState = 'red_low' | 'yellow_low' | 'green' | 'yellow_high' | 'red_high' | 'blue' | 'stale';
2
+ export type LimitsState = "red_low" | "yellow_low" | "green" | "yellow_high" | "red_high" | "blue" | "stale";
4
3
  export interface LimitsBarProps {
5
4
  /** Current value */
6
5
  value: number;
@@ -1,200 +1,275 @@
1
- import { jsxs, jsx } from "react/jsx-runtime";
2
- import { memo, useMemo } from "react";
3
1
  import { useTheme } from "../../theme/ThemeProvider.js";
2
+ import { memo, useMemo } from "react";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
4
+ //#region src/react/core/inputs/LimitsBar.tsx
5
+ /**
6
+ * @zendir/ui - LimitsBar Component
7
+ *
8
+ * Visual limits indicator for telemetry monitoring and spacecraft health assessment.
9
+ * Displays a horizontal bar with colored zones (red-low, yellow-low, green, yellow-high, red-high)
10
+ * and a marker showing the current value position within the range.
11
+ *
12
+ * Supports:
13
+ * - 5-zone limits (red-low, yellow-low, green/normal, yellow-high, red-high)
14
+ * - 3-zone limits (low, nominal, high)
15
+ * - Blue zone for "out of range" / stale
16
+ * - Animated value transitions
17
+ * - Compact and full display modes
18
+ * - Value label with units
19
+ * - Configurable thresholds
20
+ *
21
+ * Astro UX Compliance:
22
+ * - Uses official Astro status colors
23
+ * - Consistent with Astro monitoring patterns
24
+ *
25
+ * @example
26
+ * ```tsx
27
+ * <LimitsBar
28
+ * value={72.5}
29
+ * redLow={10} yellowLow={25} greenLow={40}
30
+ * greenHigh={80} yellowHigh={90} redHigh={100}
31
+ * label="Temperature" unit="°C"
32
+ * />
33
+ * ```
34
+ */
4
35
  function getLimitsState(value, redLow, yellowLow, greenLow, greenHigh, yellowHigh, redHigh) {
5
- if (redLow !== void 0 && value < redLow) return "red_low";
6
- if (yellowLow !== void 0 && value < yellowLow) return "yellow_low";
7
- if (greenLow !== void 0 && value < greenLow) return "yellow_low";
8
- if (redHigh !== void 0 && value > redHigh) return "red_high";
9
- if (yellowHigh !== void 0 && value > yellowHigh) return "yellow_high";
10
- if (greenHigh !== void 0 && value > greenHigh) return "yellow_high";
11
- return "green";
36
+ if (redLow !== void 0 && value < redLow) return "red_low";
37
+ if (yellowLow !== void 0 && value < yellowLow) return "yellow_low";
38
+ if (greenLow !== void 0 && value < greenLow) return "yellow_low";
39
+ if (redHigh !== void 0 && value > redHigh) return "red_high";
40
+ if (yellowHigh !== void 0 && value > yellowHigh) return "yellow_high";
41
+ if (greenHigh !== void 0 && value > greenHigh) return "yellow_high";
42
+ return "green";
12
43
  }
13
- const LimitsBar = memo(function LimitsBar2({
14
- value,
15
- redLow: redLowProp,
16
- yellowLow: yellowLowProp,
17
- greenLow: greenLowProp,
18
- greenHigh: greenHighProp,
19
- yellowHigh: yellowHighProp,
20
- redHigh: redHighProp,
21
- min: minProp,
22
- max: maxProp,
23
- label,
24
- unit,
25
- stale = false,
26
- compact = false,
27
- showValue = true,
28
- showThresholds = false,
29
- showLower = true,
30
- showUpper = true,
31
- width = "100%",
32
- barHeight: barHeightProp,
33
- statusOverride,
34
- className = ""
35
- }) {
36
- const redLow = showLower ? redLowProp : void 0;
37
- const yellowLow = showLower ? yellowLowProp : void 0;
38
- const greenLow = showLower ? greenLowProp : void 0;
39
- const greenHigh = showUpper ? greenHighProp : void 0;
40
- const yellowHigh = showUpper ? yellowHighProp : void 0;
41
- const redHigh = showUpper ? redHighProp : void 0;
42
- const { tokens } = useTheme();
43
- const softStatusColors = useMemo(() => ({
44
- normal: tokens.colors.status.normal,
45
- caution: tokens.colors.status.caution,
46
- serious: tokens.colors.status.serious,
47
- critical: tokens.colors.status.critical,
48
- off: tokens.colors.status.off,
49
- standby: tokens.colors.status.standby
50
- }), [tokens]);
51
- const barHeight = barHeightProp ?? (compact ? 12 : 20);
52
- useMemo(() => {
53
- const rl = redLow ?? -Infinity;
54
- const yl = yellowLow ?? redLow ?? -Infinity;
55
- const gl = greenLow ?? yellowLow ?? redLow ?? -Infinity;
56
- const gh = greenHigh ?? yellowHigh ?? redHigh ?? Infinity;
57
- const yh = yellowHigh ?? redHigh ?? Infinity;
58
- const rh = redHigh ?? Infinity;
59
- return { rl, yl, gl, gh, yh, rh };
60
- }, [redLow, yellowLow, greenLow, greenHigh, yellowHigh, redHigh]);
61
- const rangeMin = minProp ?? (redLow !== void 0 ? redLow - (redHigh !== void 0 ? (redHigh - redLow) * 0.1 : 10) : 0);
62
- const rangeMax = maxProp ?? (redHigh !== void 0 ? redHigh + (redLow !== void 0 ? (redHigh - redLow) * 0.1 : 10) : 100);
63
- const range = rangeMax - rangeMin;
64
- const status = stale ? "stale" : statusOverride ?? getLimitsState(value, redLow, yellowLow, greenLow, greenHigh, yellowHigh, redHigh);
65
- const statusColors = {
66
- red_low: softStatusColors.critical,
67
- red_high: softStatusColors.critical,
68
- yellow_low: softStatusColors.caution,
69
- yellow_high: softStatusColors.caution,
70
- green: softStatusColors.normal,
71
- blue: softStatusColors.standby,
72
- stale: softStatusColors.off
73
- };
74
- const valuePercent = range > 0 ? Math.max(0, Math.min(100, (value - rangeMin) / range * 100)) : 50;
75
- const zones = useMemo(() => {
76
- const segs = [];
77
- const toPercent = (v) => Math.max(0, Math.min(100, (v - rangeMin) / range * 100));
78
- const critical = softStatusColors.critical;
79
- const caution = softStatusColors.caution;
80
- const normal = softStatusColors.normal;
81
- if (redLow !== void 0) {
82
- segs.push({ start: 0, end: toPercent(redLow), color: `${critical}66` });
83
- }
84
- if (yellowLow !== void 0) {
85
- const s = redLow !== void 0 ? toPercent(redLow) : 0;
86
- segs.push({ start: s, end: toPercent(yellowLow), color: `${caution}66` });
87
- }
88
- {
89
- const s = yellowLow !== void 0 ? toPercent(yellowLow) : redLow !== void 0 ? toPercent(redLow) : 0;
90
- const e = yellowHigh !== void 0 ? toPercent(yellowHigh) : redHigh !== void 0 ? toPercent(redHigh) : 100;
91
- segs.push({ start: s, end: e, color: `${normal}44` });
92
- }
93
- if (yellowHigh !== void 0) {
94
- const e = redHigh !== void 0 ? toPercent(redHigh) : 100;
95
- segs.push({ start: toPercent(yellowHigh), end: e, color: `${caution}66` });
96
- }
97
- if (redHigh !== void 0) {
98
- segs.push({ start: toPercent(redHigh), end: 100, color: `${critical}66` });
99
- }
100
- return segs;
101
- }, [redLow, yellowLow, yellowHigh, redHigh, rangeMin, range, softStatusColors]);
102
- const markerColor = statusColors[status];
103
- return /* @__PURE__ */ jsxs(
104
- "div",
105
- {
106
- className: `limits-bar ${className}`,
107
- role: "meter",
108
- "aria-valuenow": value,
109
- "aria-valuemin": rangeMin,
110
- "aria-valuemax": rangeMax,
111
- "aria-label": label ? `${label}: ${value}${unit ? " " + unit : ""}` : `${value}${unit ? " " + unit : ""}`,
112
- style: { width, fontFamily: tokens.typography.fontFamily.primary },
113
- children: [
114
- (label || showValue) && !compact && /* @__PURE__ */ jsxs("div", { style: { display: "flex", justifyContent: "space-between", marginBottom: tokens.spacing.xs, fontSize: tokens.typography.fontSize.sm }, children: [
115
- label && /* @__PURE__ */ jsx("span", { style: { color: tokens.colors.text.secondary, fontWeight: tokens.typography.fontWeight.medium }, children: label }),
116
- showValue && /* @__PURE__ */ jsxs("span", { style: { color: markerColor, fontWeight: tokens.typography.fontWeight.medium, fontFamily: tokens.typography.fontFamily.mono }, children: [
117
- typeof value === "number" ? value.toFixed(2) : value,
118
- unit && /* @__PURE__ */ jsx("span", { style: { fontSize: tokens.typography.fontSize.xxs, marginLeft: tokens.spacing.xxs, color: tokens.colors.text.muted }, children: unit })
119
- ] })
120
- ] }),
121
- /* @__PURE__ */ jsxs("div", { style: {
122
- position: "relative",
123
- height: barHeight,
124
- borderRadius: tokens.borderRadius.full,
125
- background: tokens.colors.background.base,
126
- border: `1px solid ${tokens.colors.border.muted}`,
127
- overflow: "hidden"
128
- }, children: [
129
- zones.map((z, i) => /* @__PURE__ */ jsx(
130
- "div",
131
- {
132
- style: {
133
- position: "absolute",
134
- left: `${z.start}%`,
135
- width: `${z.end - z.start}%`,
136
- height: "100%",
137
- background: z.color
138
- }
139
- },
140
- i
141
- )),
142
- /* @__PURE__ */ jsx("div", { style: {
143
- position: "absolute",
144
- left: `${valuePercent}%`,
145
- top: 0,
146
- bottom: 0,
147
- width: compact ? 3 : 4,
148
- marginLeft: compact ? -1.5 : -2,
149
- background: markerColor,
150
- borderRadius: tokens.borderRadius.sm,
151
- boxShadow: `0 0 8px ${markerColor}66, 0 0 3px ${markerColor}44`,
152
- transition: "left 300ms cubic-bezier(0.4, 0, 0.2, 1), background 300ms ease"
153
- } }),
154
- compact && showValue && /* @__PURE__ */ jsxs("div", { style: {
155
- position: "absolute",
156
- right: tokens.spacing.xs,
157
- top: "50%",
158
- transform: "translateY(-50%)",
159
- fontSize: tokens.typography.fontSize.micro,
160
- fontWeight: tokens.typography.fontWeight.medium,
161
- color: markerColor,
162
- fontFamily: tokens.typography.fontFamily.mono,
163
- textShadow: `0 0 4px ${tokens.colors.background.base}`
164
- }, children: [
165
- typeof value === "number" ? value.toFixed(1) : value,
166
- unit || ""
167
- ] })
168
- ] }),
169
- showThresholds && !compact && /* @__PURE__ */ jsx("div", { style: { position: "relative", height: 14, marginTop: tokens.spacing.xxs }, children: [
170
- { val: redLow, color: softStatusColors.critical },
171
- { val: yellowLow, color: softStatusColors.caution },
172
- { val: greenHigh ?? yellowHigh, color: softStatusColors.caution },
173
- { val: redHigh, color: softStatusColors.critical }
174
- ].filter((t) => t.val !== void 0).map((t, i) => {
175
- const pct = range > 0 ? (t.val - rangeMin) / range * 100 : 0;
176
- return /* @__PURE__ */ jsx(
177
- "span",
178
- {
179
- "aria-label": `Threshold: ${t.val}`,
180
- style: {
181
- position: "absolute",
182
- left: `${pct}%`,
183
- transform: "translateX(-50%)",
184
- fontSize: tokens.typography.fontSize.micro,
185
- color: t.color,
186
- fontFamily: tokens.typography.fontFamily.mono
187
- },
188
- children: t.val
189
- },
190
- i
191
- );
192
- }) })
193
- ]
194
- }
195
- );
44
+ var LimitsBar = memo(function LimitsBar({ value, redLow: redLowProp, yellowLow: yellowLowProp, greenLow: greenLowProp, greenHigh: greenHighProp, yellowHigh: yellowHighProp, redHigh: redHighProp, min: minProp, max: maxProp, label, unit, stale = false, compact = false, showValue = true, showThresholds = false, showLower = true, showUpper = true, width = "100%", barHeight: barHeightProp, statusOverride, className = "" }) {
45
+ const redLow = showLower ? redLowProp : void 0;
46
+ const yellowLow = showLower ? yellowLowProp : void 0;
47
+ const greenLow = showLower ? greenLowProp : void 0;
48
+ const greenHigh = showUpper ? greenHighProp : void 0;
49
+ const yellowHigh = showUpper ? yellowHighProp : void 0;
50
+ const redHigh = showUpper ? redHighProp : void 0;
51
+ const { tokens } = useTheme();
52
+ const softStatusColors = useMemo(() => ({
53
+ normal: tokens.colors.status.normal,
54
+ caution: tokens.colors.status.caution,
55
+ serious: tokens.colors.status.serious,
56
+ critical: tokens.colors.status.critical,
57
+ off: tokens.colors.status.off,
58
+ standby: tokens.colors.status.standby
59
+ }), [tokens]);
60
+ const barHeight = barHeightProp ?? (compact ? 12 : 20);
61
+ useMemo(() => {
62
+ return {
63
+ rl: redLow ?? -Infinity,
64
+ yl: yellowLow ?? redLow ?? -Infinity,
65
+ gl: greenLow ?? yellowLow ?? redLow ?? -Infinity,
66
+ gh: greenHigh ?? yellowHigh ?? redHigh ?? Infinity,
67
+ yh: yellowHigh ?? redHigh ?? Infinity,
68
+ rh: redHigh ?? Infinity
69
+ };
70
+ }, [
71
+ redLow,
72
+ yellowLow,
73
+ greenLow,
74
+ greenHigh,
75
+ yellowHigh,
76
+ redHigh
77
+ ]);
78
+ const rangeMin = minProp ?? (redLow !== void 0 ? redLow - (redHigh !== void 0 ? (redHigh - redLow) * .1 : 10) : 0);
79
+ const rangeMax = maxProp ?? (redHigh !== void 0 ? redHigh + (redLow !== void 0 ? (redHigh - redLow) * .1 : 10) : 100);
80
+ const range = rangeMax - rangeMin;
81
+ const status = stale ? "stale" : statusOverride ?? getLimitsState(value, redLow, yellowLow, greenLow, greenHigh, yellowHigh, redHigh);
82
+ const statusColors = {
83
+ red_low: softStatusColors.critical,
84
+ red_high: softStatusColors.critical,
85
+ yellow_low: softStatusColors.caution,
86
+ yellow_high: softStatusColors.caution,
87
+ green: softStatusColors.normal,
88
+ blue: softStatusColors.standby,
89
+ stale: softStatusColors.off
90
+ };
91
+ const valuePercent = range > 0 ? Math.max(0, Math.min(100, (value - rangeMin) / range * 100)) : 50;
92
+ const zones = useMemo(() => {
93
+ const segs = [];
94
+ const toPercent = (v) => Math.max(0, Math.min(100, (v - rangeMin) / range * 100));
95
+ const critical = softStatusColors.critical;
96
+ const caution = softStatusColors.caution;
97
+ const normal = softStatusColors.normal;
98
+ if (redLow !== void 0) segs.push({
99
+ start: 0,
100
+ end: toPercent(redLow),
101
+ color: `${critical}66`
102
+ });
103
+ if (yellowLow !== void 0) {
104
+ const s = redLow !== void 0 ? toPercent(redLow) : 0;
105
+ segs.push({
106
+ start: s,
107
+ end: toPercent(yellowLow),
108
+ color: `${caution}66`
109
+ });
110
+ }
111
+ {
112
+ const s = yellowLow !== void 0 ? toPercent(yellowLow) : redLow !== void 0 ? toPercent(redLow) : 0;
113
+ const e = yellowHigh !== void 0 ? toPercent(yellowHigh) : redHigh !== void 0 ? toPercent(redHigh) : 100;
114
+ segs.push({
115
+ start: s,
116
+ end: e,
117
+ color: `${normal}44`
118
+ });
119
+ }
120
+ if (yellowHigh !== void 0) {
121
+ const e = redHigh !== void 0 ? toPercent(redHigh) : 100;
122
+ segs.push({
123
+ start: toPercent(yellowHigh),
124
+ end: e,
125
+ color: `${caution}66`
126
+ });
127
+ }
128
+ if (redHigh !== void 0) segs.push({
129
+ start: toPercent(redHigh),
130
+ end: 100,
131
+ color: `${critical}66`
132
+ });
133
+ return segs;
134
+ }, [
135
+ redLow,
136
+ yellowLow,
137
+ yellowHigh,
138
+ redHigh,
139
+ rangeMin,
140
+ range,
141
+ softStatusColors
142
+ ]);
143
+ const markerColor = statusColors[status];
144
+ return /* @__PURE__ */ jsxs("div", {
145
+ className: `limits-bar ${className}`,
146
+ role: "meter",
147
+ "aria-valuenow": value,
148
+ "aria-valuemin": rangeMin,
149
+ "aria-valuemax": rangeMax,
150
+ "aria-label": label ? `${label}: ${value}${unit ? " " + unit : ""}` : `${value}${unit ? " " + unit : ""}`,
151
+ style: {
152
+ width,
153
+ fontFamily: tokens.typography.fontFamily.primary
154
+ },
155
+ children: [
156
+ (label || showValue) && !compact && /* @__PURE__ */ jsxs("div", {
157
+ style: {
158
+ display: "flex",
159
+ justifyContent: "space-between",
160
+ marginBottom: tokens.spacing.xs,
161
+ fontSize: tokens.typography.fontSize.sm
162
+ },
163
+ children: [label && /* @__PURE__ */ jsx("span", {
164
+ style: {
165
+ color: tokens.colors.text.secondary,
166
+ fontWeight: tokens.typography.fontWeight.medium
167
+ },
168
+ children: label
169
+ }), showValue && /* @__PURE__ */ jsxs("span", {
170
+ style: {
171
+ color: markerColor,
172
+ fontWeight: tokens.typography.fontWeight.medium,
173
+ fontFamily: tokens.typography.fontFamily.mono
174
+ },
175
+ children: [typeof value === "number" ? value.toFixed(2) : value, unit && /* @__PURE__ */ jsx("span", {
176
+ style: {
177
+ fontSize: tokens.typography.fontSize.xxs,
178
+ marginLeft: tokens.spacing.xxs,
179
+ color: tokens.colors.text.muted
180
+ },
181
+ children: unit
182
+ })]
183
+ })]
184
+ }),
185
+ /* @__PURE__ */ jsxs("div", {
186
+ style: {
187
+ position: "relative",
188
+ height: barHeight,
189
+ borderRadius: tokens.borderRadius.full,
190
+ background: tokens.colors.background.base,
191
+ border: `1px solid ${tokens.colors.border.muted}`,
192
+ overflow: "hidden"
193
+ },
194
+ children: [
195
+ zones.map((z, i) => /* @__PURE__ */ jsx("div", { style: {
196
+ position: "absolute",
197
+ left: `${z.start}%`,
198
+ width: `${z.end - z.start}%`,
199
+ height: "100%",
200
+ background: z.color
201
+ } }, i)),
202
+ /* @__PURE__ */ jsx("div", { style: {
203
+ position: "absolute",
204
+ left: `${valuePercent}%`,
205
+ top: 0,
206
+ bottom: 0,
207
+ width: compact ? 3 : 4,
208
+ marginLeft: compact ? -1.5 : -2,
209
+ background: markerColor,
210
+ borderRadius: tokens.borderRadius.sm,
211
+ boxShadow: `0 0 8px ${markerColor}66, 0 0 3px ${markerColor}44`,
212
+ transition: "left 300ms cubic-bezier(0.4, 0, 0.2, 1), background 300ms ease"
213
+ } }),
214
+ compact && showValue && /* @__PURE__ */ jsxs("div", {
215
+ style: {
216
+ position: "absolute",
217
+ right: tokens.spacing.xs,
218
+ top: "50%",
219
+ transform: "translateY(-50%)",
220
+ fontSize: tokens.typography.fontSize.micro,
221
+ fontWeight: tokens.typography.fontWeight.medium,
222
+ color: markerColor,
223
+ fontFamily: tokens.typography.fontFamily.mono,
224
+ textShadow: `0 0 4px ${tokens.colors.background.base}`
225
+ },
226
+ children: [typeof value === "number" ? value.toFixed(1) : value, unit || ""]
227
+ })
228
+ ]
229
+ }),
230
+ showThresholds && !compact && /* @__PURE__ */ jsx("div", {
231
+ style: {
232
+ position: "relative",
233
+ height: 14,
234
+ marginTop: tokens.spacing.xxs
235
+ },
236
+ children: [
237
+ {
238
+ val: redLow,
239
+ color: softStatusColors.critical
240
+ },
241
+ {
242
+ val: yellowLow,
243
+ color: softStatusColors.caution
244
+ },
245
+ {
246
+ val: greenHigh ?? yellowHigh,
247
+ color: softStatusColors.caution
248
+ },
249
+ {
250
+ val: redHigh,
251
+ color: softStatusColors.critical
252
+ }
253
+ ].filter((t) => t.val !== void 0).map((t, i) => {
254
+ const pct = range > 0 ? (t.val - rangeMin) / range * 100 : 0;
255
+ return /* @__PURE__ */ jsx("span", {
256
+ "aria-label": `Threshold: ${t.val}`,
257
+ style: {
258
+ position: "absolute",
259
+ left: `${pct}%`,
260
+ transform: "translateX(-50%)",
261
+ fontSize: tokens.typography.fontSize.micro,
262
+ color: t.color,
263
+ fontFamily: tokens.typography.fontFamily.mono
264
+ },
265
+ children: t.val
266
+ }, i);
267
+ })
268
+ })
269
+ ]
270
+ });
196
271
  });
197
- export {
198
- LimitsBar
199
- };
200
- //# sourceMappingURL=LimitsBar.js.map
272
+ //#endregion
273
+ export { LimitsBar, LimitsBar as default };
274
+
275
+ //# sourceMappingURL=LimitsBar.js.map