@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,446 +1,479 @@
1
- import { jsx, jsxs } from "react/jsx-runtime";
2
- import React, { memo, useMemo, useState, useCallback } from "react";
3
1
  import { useTheme } from "../../theme/ThemeProvider.js";
2
+ import { addAlpha } from "../../utils/index.js";
4
3
  import { useBreakpoint } from "../layout/useBreakpoint.js";
5
4
  import { Tooltip } from "../overlays/Tooltip.js";
6
- import { addAlpha } from "../../utils/index.js";
7
- const STATUS_DOT_COLORS = {
8
- normal: "#56F000",
9
- caution: "#FCE83A",
10
- serious: "#FFB302",
11
- critical: "#FF3838",
12
- standby: "#2DCCFF",
13
- off: "#9EA7AD"
14
- };
15
- const DataTableRowDetail = memo(function DataTableRowDetail2({
16
- title,
17
- subtitle,
18
- fields,
19
- footer,
20
- icon,
21
- maxWidth = 320
22
- }) {
23
- const { tokens } = useTheme();
24
- return /* @__PURE__ */ jsxs("div", { style: { maxWidth, minWidth: 180 }, children: [
25
- (title || icon) && /* @__PURE__ */ jsxs("div", { style: {
26
- display: "flex",
27
- alignItems: "center",
28
- gap: tokens.spacing.sm,
29
- marginBottom: (fields == null ? void 0 : fields.length) || subtitle ? tokens.spacing.sm : 0
30
- }, children: [
31
- icon,
32
- /* @__PURE__ */ jsxs("div", { style: { flex: 1, minWidth: 0 }, children: [
33
- title && /* @__PURE__ */ jsx("div", { style: {
34
- fontWeight: tokens.typography.fontWeight.semibold,
35
- fontSize: tokens.typography.fontSize.sm,
36
- color: tokens.colors.text.primary,
37
- lineHeight: 1.3,
38
- overflow: "hidden",
39
- textOverflow: "ellipsis"
40
- }, children: title }),
41
- subtitle && /* @__PURE__ */ jsx("div", { style: {
42
- fontSize: tokens.typography.fontSize.xxs,
43
- color: tokens.colors.text.tertiary,
44
- marginTop: 2
45
- }, children: subtitle })
46
- ] })
47
- ] }),
48
- fields && fields.length > 0 && /* @__PURE__ */ jsx("div", { style: {
49
- display: "grid",
50
- gridTemplateColumns: "auto 1fr",
51
- gap: `${tokens.spacing.xs} ${tokens.spacing.md}`,
52
- fontSize: tokens.typography.fontSize.xs,
53
- lineHeight: 1.5
54
- }, children: fields.map((field, i) => /* @__PURE__ */ jsxs(React.Fragment, { children: [
55
- /* @__PURE__ */ jsx("span", { style: {
56
- color: tokens.colors.text.tertiary,
57
- whiteSpace: "nowrap"
58
- }, children: field.label }),
59
- /* @__PURE__ */ jsx("span", { style: {
60
- color: field.status ? STATUS_DOT_COLORS[field.status] || tokens.colors.text.primary : tokens.colors.text.primary,
61
- fontFamily: field.mono ? tokens.typography.fontFamily.mono : "inherit",
62
- fontVariantNumeric: field.mono ? "tabular-nums" : "normal",
63
- textAlign: "right",
64
- overflow: "hidden",
65
- textOverflow: "ellipsis",
66
- whiteSpace: "nowrap"
67
- }, children: field.value })
68
- ] }, i)) }),
69
- footer && /* @__PURE__ */ jsx("div", { style: {
70
- marginTop: tokens.spacing.sm,
71
- paddingTop: tokens.spacing.xs,
72
- borderTop: `1px solid ${addAlpha(tokens.colors.border.muted, 0.19)}`,
73
- fontSize: tokens.typography.fontSize.xxs,
74
- color: tokens.colors.text.tertiary
75
- }, children: footer })
76
- ] });
5
+ import React, { memo, useCallback, useMemo, useState } from "react";
6
+ import { jsx, jsxs } from "react/jsx-runtime";
7
+ //#region src/react/core/data/DataTable.tsx
8
+ /**
9
+ * @zendir/ui - DataTable Component
10
+ *
11
+ * Structured data display with expandable groups, responsive columns,
12
+ * and theme-aware styling. Designed for telemetry parameter grids,
13
+ * link budget displays, spacecraft information panels.
14
+ *
15
+ * Astro UX Compliance:
16
+ * - Tabular monospace numbers for value columns
17
+ * - Status-based row coloring
18
+ * - Compact mode support
19
+ * - Accessible table semantics
20
+ *
21
+ * Enhanced Tooltip System:
22
+ * - Row-level tooltips (string or rich ReactNode via rowTooltipContent)
23
+ * - Cell-level tooltips per column definition
24
+ * - Header tooltips for column descriptions
25
+ * - Built-in DataTableRowDetail component for structured detail views
26
+ * - Portal-rendered, WCAG-compliant, animated tooltips
27
+ *
28
+ * @example
29
+ * ```tsx
30
+ * <DataTable
31
+ * columns={[
32
+ * { key: 'label', header: 'Parameter', width: '40%', headerTooltip: 'Telemetry parameter name' },
33
+ * { key: 'value', header: 'Value', align: 'right', mono: true, cellTooltip: (v, row) => `Raw: ${v}` },
34
+ * { key: 'unit', header: 'Unit', width: 80 },
35
+ * ]}
36
+ * data={[
37
+ * { label: 'Frequency', value: '437.500', unit: 'MHz' },
38
+ * { label: 'Bandwidth', value: '25.000', unit: 'kHz' },
39
+ * ]}
40
+ * rowTooltipContent={(row) => (
41
+ * <DataTableRowDetail
42
+ * title={row.label}
43
+ * fields={[
44
+ * { label: 'Value', value: `${row.value} ${row.unit}` },
45
+ * ]}
46
+ * />
47
+ * )}
48
+ * />
49
+ * ```
50
+ */
51
+ /**
52
+ * Pre-built tooltip content renderer for DataTable rows.
53
+ * Provides a structured layout: title, key-value fields, and optional footer.
54
+ *
55
+ * @example
56
+ * ```tsx
57
+ * <DataTable
58
+ * columns={columns}
59
+ * data={data}
60
+ * rowTooltipContent={(row) => (
61
+ * <DataTableRowDetail
62
+ * title={row.parameter}
63
+ * subtitle={row.category}
64
+ * fields={[
65
+ * { label: 'Value', value: row.value, mono: true },
66
+ * { label: 'Status', value: row.status, status: row.status },
67
+ * ]}
68
+ * footer={`Last updated: ${row.timestamp}`}
69
+ * />
70
+ * )}
71
+ * />
72
+ * ```
73
+ */
74
+ var DataTableRowDetail = memo(function DataTableRowDetail({ title, subtitle, fields, footer, icon, maxWidth = 320 }) {
75
+ const { tokens } = useTheme();
76
+ return /* @__PURE__ */ jsxs("div", {
77
+ style: {
78
+ maxWidth,
79
+ minWidth: 180
80
+ },
81
+ children: [
82
+ (title || icon) && /* @__PURE__ */ jsxs("div", {
83
+ style: {
84
+ display: "flex",
85
+ alignItems: "center",
86
+ gap: tokens.spacing.sm,
87
+ marginBottom: fields?.length || subtitle ? tokens.spacing.sm : 0
88
+ },
89
+ children: [icon, /* @__PURE__ */ jsxs("div", {
90
+ style: {
91
+ flex: 1,
92
+ minWidth: 0
93
+ },
94
+ children: [title && /* @__PURE__ */ jsx("div", {
95
+ style: {
96
+ fontWeight: tokens.typography.fontWeight.semibold,
97
+ fontSize: tokens.typography.fontSize.sm,
98
+ color: tokens.colors.text.primary,
99
+ lineHeight: 1.3,
100
+ overflow: "hidden",
101
+ textOverflow: "ellipsis"
102
+ },
103
+ children: title
104
+ }), subtitle && /* @__PURE__ */ jsx("div", {
105
+ style: {
106
+ fontSize: tokens.typography.fontSize.xxs,
107
+ color: tokens.colors.text.tertiary,
108
+ marginTop: 2
109
+ },
110
+ children: subtitle
111
+ })]
112
+ })]
113
+ }),
114
+ fields && fields.length > 0 && /* @__PURE__ */ jsx("div", {
115
+ style: {
116
+ display: "grid",
117
+ gridTemplateColumns: "auto 1fr",
118
+ gap: `${tokens.spacing.xs} ${tokens.spacing.md}`,
119
+ fontSize: tokens.typography.fontSize.xs,
120
+ lineHeight: 1.5
121
+ },
122
+ children: fields.map((field, i) => /* @__PURE__ */ jsxs(React.Fragment, { children: [/* @__PURE__ */ jsx("span", {
123
+ style: {
124
+ color: tokens.colors.text.tertiary,
125
+ whiteSpace: "nowrap"
126
+ },
127
+ children: field.label
128
+ }), /* @__PURE__ */ jsx("span", {
129
+ style: {
130
+ color: field.status ? tokens.colors.status[field.status] || tokens.colors.text.primary : tokens.colors.text.primary,
131
+ fontFamily: field.mono ? tokens.typography.fontFamily.mono : "inherit",
132
+ fontVariantNumeric: field.mono ? "tabular-nums" : "normal",
133
+ textAlign: "right",
134
+ overflow: "hidden",
135
+ textOverflow: "ellipsis",
136
+ whiteSpace: "nowrap"
137
+ },
138
+ children: field.value
139
+ })] }, i))
140
+ }),
141
+ footer && /* @__PURE__ */ jsx("div", {
142
+ style: {
143
+ marginTop: tokens.spacing.sm,
144
+ paddingTop: tokens.spacing.xs,
145
+ borderTop: `1px solid ${addAlpha(tokens.colors.border.muted, .19)}`,
146
+ fontSize: tokens.typography.fontSize.xxs,
147
+ color: tokens.colors.text.tertiary
148
+ },
149
+ children: footer
150
+ })
151
+ ]
152
+ });
77
153
  });
78
- const CellTooltipWrapper = memo(function CellTooltipWrapper2({
79
- content,
80
- placement,
81
- delay,
82
- children
83
- }) {
84
- if (!content) return children;
85
- return /* @__PURE__ */ jsx(Tooltip, { content, placement, delay, children });
154
+ var CellTooltipWrapper = memo(function CellTooltipWrapper({ content, placement, delay, children }) {
155
+ if (!content) return children;
156
+ return /* @__PURE__ */ jsx(Tooltip, {
157
+ content,
158
+ placement,
159
+ delay,
160
+ children
161
+ });
86
162
  });
87
- const DataTable = memo(function DataTable2({
88
- columns,
89
- data,
90
- keyField,
91
- groupBy,
92
- expandable = false,
93
- defaultExpanded = true,
94
- striped = false,
95
- compact = false,
96
- showHeader = true,
97
- emptyMessage = "No data available",
98
- onRowClick,
99
- rowTooltip,
100
- rowTooltipContent,
101
- tooltipPlacement = "top",
102
- tooltipDelay = 300,
103
- maxHeight,
104
- booleanColor,
105
- getRowStatus,
106
- style
107
- }) {
108
- const { tokens } = useTheme();
109
- const { isMobile: isMobileView } = useBreakpoint();
110
- const statusColorMap = useMemo(() => ({
111
- normal: tokens.colors.status.normal,
112
- caution: tokens.colors.status.caution,
113
- serious: tokens.colors.status.serious,
114
- critical: tokens.colors.status.critical,
115
- standby: tokens.colors.status.standby,
116
- off: tokens.colors.status.off
117
- }), [tokens.colors.status]);
118
- const visibleColumns = isMobileView ? columns.filter((col) => !col.hideOnMobile) : columns;
119
- const [expandedGroups, setExpandedGroups] = useState(
120
- defaultExpanded ? /* @__PURE__ */ new Set(["__all__"]) : /* @__PURE__ */ new Set()
121
- );
122
- const [hoveredRow, setHoveredRow] = useState(null);
123
- const visibleColumnCount = Math.max(1, visibleColumns.length);
124
- const cellPadding = compact ? `${tokens.spacing.xs} ${tokens.spacing.sm}` : `${tokens.spacing.sm} ${tokens.spacing.md}`;
125
- const toggleGroup = useCallback((group) => {
126
- setExpandedGroups((prev) => {
127
- const next = new Set(prev);
128
- if (next.has(group)) next.delete(group);
129
- else next.add(group);
130
- return next;
131
- });
132
- }, []);
133
- const isGroupExpanded = useCallback((group) => {
134
- return expandedGroups.has("__all__") || expandedGroups.has(group);
135
- }, [expandedGroups]);
136
- const groups = useMemo(() => {
137
- if (!groupBy) return [{ key: "__default__", label: "", rows: data }];
138
- const map = /* @__PURE__ */ new Map();
139
- data.forEach((row) => {
140
- const key = String(row[groupBy] ?? "Other");
141
- if (!map.has(key)) map.set(key, []);
142
- map.get(key).push(row);
143
- });
144
- return Array.from(map.entries()).map(([key, rows]) => ({
145
- key,
146
- label: key,
147
- rows
148
- }));
149
- }, [data, groupBy]);
150
- const resolveWidth = (w) => {
151
- if (w === void 0) return void 0;
152
- if (typeof w === "number") return `${w}px`;
153
- return w;
154
- };
155
- const renderCell = (col, row, rowIndex) => {
156
- const value = row[col.key];
157
- if (col.render) return col.render(value, row, rowIndex);
158
- if (value === null || value === void 0) return "—";
159
- if (typeof value === "boolean") {
160
- const label = value ? "✓" : "✗";
161
- const color = booleanColor ?? (getRowStatus ? (() => {
162
- const s = getRowStatus(row, rowIndex);
163
- return s ? statusColorMap[s] : void 0;
164
- })() : void 0) ?? tokens.colors.text.primary;
165
- return /* @__PURE__ */ jsx("span", { style: { color }, children: label });
166
- }
167
- return String(value);
168
- };
169
- const renderCellWithTooltip = (col, row, rowIndex) => {
170
- const cellContent = renderCell(col, row, rowIndex);
171
- if (!col.cellTooltip) return cellContent;
172
- const tooltipContent = col.cellTooltip(row[col.key], row, rowIndex);
173
- if (!tooltipContent) return cellContent;
174
- return /* @__PURE__ */ jsx(
175
- CellTooltipWrapper,
176
- {
177
- content: tooltipContent,
178
- placement: tooltipPlacement,
179
- delay: tooltipDelay,
180
- children: /* @__PURE__ */ jsx("span", { style: { cursor: "help" }, children: cellContent })
181
- }
182
- );
183
- };
184
- const renderHeaderCell = (col) => {
185
- const headerContent = /* @__PURE__ */ jsxs("span", { style: { display: "inline-flex", alignItems: "center", gap: 4 }, children: [
186
- col.header,
187
- col.headerTooltip && /* @__PURE__ */ jsxs(
188
- "svg",
189
- {
190
- width: "12",
191
- height: "12",
192
- viewBox: "0 0 16 16",
193
- fill: "none",
194
- style: { opacity: 0.5, flexShrink: 0 },
195
- children: [
196
- /* @__PURE__ */ jsx("circle", { cx: "8", cy: "8", r: "7", stroke: "currentColor", strokeWidth: "1.5" }),
197
- /* @__PURE__ */ jsx("path", { d: "M8 7v4", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round" }),
198
- /* @__PURE__ */ jsx("circle", { cx: "8", cy: "5", r: "0.75", fill: "currentColor" })
199
- ]
200
- }
201
- )
202
- ] });
203
- if (!col.headerTooltip) return headerContent;
204
- return /* @__PURE__ */ jsx(Tooltip, { content: col.headerTooltip, placement: "bottom", delay: tooltipDelay, children: headerContent });
205
- };
206
- const chevron = (expanded) => /* @__PURE__ */ jsx(
207
- "svg",
208
- {
209
- width: "14",
210
- height: "14",
211
- viewBox: "0 0 24 24",
212
- fill: "none",
213
- stroke: "currentColor",
214
- strokeWidth: "2",
215
- strokeLinecap: "round",
216
- style: {
217
- transition: tokens.animation.fast,
218
- transform: expanded ? "rotate(90deg)" : "rotate(0deg)",
219
- flexShrink: 0
220
- },
221
- children: /* @__PURE__ */ jsx("polyline", { points: "9 18 15 12 9 6" })
222
- }
223
- );
224
- const hasRichRowTooltip = !!rowTooltipContent;
225
- const renderRowContent = (row, rowIdx, localIndex) => {
226
- const isHovered = hoveredRow === rowIdx;
227
- const rowKey = keyField ? String(row[keyField]) : rowIdx;
228
- const useNativeTitle = !hasRichRowTooltip && rowTooltip;
229
- const tr = /* @__PURE__ */ jsx(
230
- "tr",
231
- {
232
- tabIndex: onRowClick ? 0 : void 0,
233
- onClick: onRowClick ? () => onRowClick(row, rowIdx) : void 0,
234
- onKeyDown: onRowClick ? (e) => {
235
- if (e.key === "Enter" || e.key === " ") {
236
- e.preventDefault();
237
- onRowClick(row, rowIdx);
238
- }
239
- } : void 0,
240
- onMouseEnter: () => setHoveredRow(rowIdx),
241
- onMouseLeave: () => setHoveredRow(null),
242
- title: useNativeTitle ? rowTooltip(row) : void 0,
243
- style: {
244
- cursor: onRowClick ? "pointer" : "default",
245
- backgroundColor: isHovered ? addAlpha(tokens.colors.accent.primary, 0.08) : striped && localIndex % 2 === 1 ? addAlpha(tokens.colors.background.surface, 0.5) : "transparent",
246
- transition: "background-color 150ms ease"
247
- },
248
- children: visibleColumns.map((col) => /* @__PURE__ */ jsx(
249
- "td",
250
- {
251
- style: {
252
- padding: cellPadding,
253
- textAlign: col.align || "left",
254
- color: tokens.colors.text.primary,
255
- borderBottom: `1px solid ${addAlpha(tokens.colors.border.muted, 0.08)}`,
256
- fontFamily: col.mono ? tokens.typography.fontFamily.mono : "inherit",
257
- fontVariantNumeric: col.mono ? "tabular-nums" : "normal",
258
- whiteSpace: "nowrap",
259
- overflow: "hidden",
260
- textOverflow: "ellipsis",
261
- maxWidth: resolveWidth(col.width) || "300px"
262
- },
263
- children: renderCellWithTooltip(col, row, rowIdx)
264
- },
265
- col.key
266
- ))
267
- },
268
- rowKey
269
- );
270
- if (hasRichRowTooltip) {
271
- const tooltipContent = rowTooltipContent(row, rowIdx);
272
- if (tooltipContent) {
273
- return /* @__PURE__ */ jsx(
274
- Tooltip,
275
- {
276
- content: tooltipContent,
277
- placement: tooltipPlacement,
278
- delay: tooltipDelay,
279
- children: tr
280
- },
281
- rowKey
282
- );
283
- }
284
- }
285
- return tr;
286
- };
287
- let globalRowIndex = 0;
288
- return /* @__PURE__ */ jsx(
289
- "div",
290
- {
291
- style: {
292
- fontFamily: tokens.typography.fontFamily.primary,
293
- overflow: "auto",
294
- WebkitOverflowScrolling: "touch",
295
- maxHeight: typeof maxHeight === "number" ? `${maxHeight}px` : maxHeight,
296
- borderRadius: tokens.borderRadius.md,
297
- border: tokens.borders.divider,
298
- ...style
299
- },
300
- children: /* @__PURE__ */ jsxs(
301
- "table",
302
- {
303
- style: {
304
- width: "100%",
305
- borderCollapse: "collapse",
306
- fontSize: compact ? tokens.typography.fontSize.xs : tokens.typography.fontSize.sm
307
- },
308
- children: [
309
- showHeader && /* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsx("tr", { children: visibleColumns.map((col) => /* @__PURE__ */ jsx(
310
- "th",
311
- {
312
- style: {
313
- padding: cellPadding,
314
- textAlign: col.align || "left",
315
- fontSize: tokens.typography.fontSize.xxs,
316
- fontWeight: tokens.typography.fontWeight.bold,
317
- color: tokens.colors.text.tertiary,
318
- textTransform: "uppercase",
319
- letterSpacing: "0.06em",
320
- backgroundColor: tokens.colors.background.surface,
321
- borderBottom: tokens.borders.divider,
322
- width: resolveWidth(col.width),
323
- position: "sticky",
324
- top: 0,
325
- zIndex: 1,
326
- whiteSpace: "nowrap"
327
- },
328
- children: renderHeaderCell(col)
329
- },
330
- col.key
331
- )) }) }),
332
- /* @__PURE__ */ jsxs("tbody", { children: [
333
- data.length === 0 && /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx(
334
- "td",
335
- {
336
- colSpan: visibleColumnCount,
337
- style: {
338
- padding: tokens.spacing.xl,
339
- textAlign: "center",
340
- color: tokens.colors.text.tertiary,
341
- fontSize: tokens.typography.fontSize.sm
342
- },
343
- children: emptyMessage
344
- }
345
- ) }),
346
- groups.map((group) => {
347
- const isExpanded = !groupBy || isGroupExpanded(group.key);
348
- return /* @__PURE__ */ jsxs(React.Fragment, { children: [
349
- groupBy && group.label && /* @__PURE__ */ jsx(
350
- "tr",
351
- {
352
- style: {
353
- backgroundColor: addAlpha(tokens.colors.accent.primary, 0.08)
354
- },
355
- children: /* @__PURE__ */ jsx(
356
- "td",
357
- {
358
- colSpan: visibleColumnCount,
359
- style: {
360
- padding: 0,
361
- borderBottom: tokens.borders.divider
362
- },
363
- children: expandable ? /* @__PURE__ */ jsxs(
364
- "button",
365
- {
366
- type: "button",
367
- "aria-expanded": isExpanded,
368
- onClick: () => toggleGroup(group.key),
369
- style: {
370
- display: "flex",
371
- alignItems: "center",
372
- gap: tokens.spacing.xs,
373
- width: "100%",
374
- padding: cellPadding,
375
- margin: 0,
376
- border: "none",
377
- background: "none",
378
- cursor: "pointer",
379
- fontWeight: tokens.typography.fontWeight.semibold,
380
- color: tokens.colors.text.primary,
381
- fontSize: compact ? tokens.typography.fontSize.xs : tokens.typography.fontSize.sm,
382
- fontFamily: "inherit",
383
- textAlign: "left"
384
- },
385
- children: [
386
- chevron(isExpanded),
387
- group.label,
388
- /* @__PURE__ */ jsxs("span", { style: {
389
- fontSize: tokens.typography.fontSize.xxs,
390
- color: tokens.colors.text.tertiary,
391
- fontWeight: tokens.typography.fontWeight.normal
392
- }, children: [
393
- "(",
394
- group.rows.length,
395
- ")"
396
- ] })
397
- ]
398
- }
399
- ) : /* @__PURE__ */ jsxs(
400
- "div",
401
- {
402
- style: {
403
- display: "flex",
404
- alignItems: "center",
405
- gap: tokens.spacing.xs,
406
- padding: cellPadding,
407
- fontWeight: tokens.typography.fontWeight.semibold,
408
- color: tokens.colors.text.primary,
409
- fontSize: compact ? tokens.typography.fontSize.xs : tokens.typography.fontSize.sm
410
- },
411
- children: [
412
- group.label,
413
- /* @__PURE__ */ jsxs("span", { style: {
414
- fontSize: tokens.typography.fontSize.xxs,
415
- color: tokens.colors.text.tertiary,
416
- fontWeight: tokens.typography.fontWeight.normal
417
- }, children: [
418
- "(",
419
- group.rows.length,
420
- ")"
421
- ] })
422
- ]
423
- }
424
- )
425
- }
426
- )
427
- }
428
- ),
429
- isExpanded && group.rows.map((row, localIndex) => {
430
- const rowIdx = globalRowIndex++;
431
- return renderRowContent(row, rowIdx, localIndex);
432
- })
433
- ] }, group.key);
434
- })
435
- ] })
436
- ]
437
- }
438
- )
439
- }
440
- );
163
+ var DataTable = memo(function DataTable({ columns, data, keyField, groupBy, expandable = false, defaultExpanded = true, striped = false, compact = false, showHeader = true, emptyMessage = "No data available", onRowClick, rowTooltip, rowTooltipContent, tooltipPlacement = "top", tooltipDelay = 300, maxHeight, booleanColor, getRowStatus, style }) {
164
+ const { tokens } = useTheme();
165
+ const { isMobile: isMobileView } = useBreakpoint();
166
+ const statusColorMap = useMemo(() => ({
167
+ normal: tokens.colors.status.normal,
168
+ caution: tokens.colors.status.caution,
169
+ serious: tokens.colors.status.serious,
170
+ critical: tokens.colors.status.critical,
171
+ standby: tokens.colors.status.standby,
172
+ off: tokens.colors.status.off
173
+ }), [tokens.colors.status]);
174
+ const visibleColumns = isMobileView ? columns.filter((col) => !col.hideOnMobile) : columns;
175
+ const [expandedGroups, setExpandedGroups] = useState(defaultExpanded ? /* @__PURE__ */ new Set(["__all__"]) : /* @__PURE__ */ new Set());
176
+ const [hoveredRow, setHoveredRow] = useState(null);
177
+ const visibleColumnCount = Math.max(1, visibleColumns.length);
178
+ const cellPadding = compact ? `${tokens.spacing.xs} ${tokens.spacing.sm}` : `${tokens.spacing.sm} ${tokens.spacing.md}`;
179
+ const toggleGroup = useCallback((group) => {
180
+ setExpandedGroups((prev) => {
181
+ const next = new Set(prev);
182
+ if (next.has(group)) next.delete(group);
183
+ else next.add(group);
184
+ return next;
185
+ });
186
+ }, []);
187
+ const isGroupExpanded = useCallback((group) => {
188
+ return expandedGroups.has("__all__") || expandedGroups.has(group);
189
+ }, [expandedGroups]);
190
+ const groups = useMemo(() => {
191
+ if (!groupBy) return [{
192
+ key: "__default__",
193
+ label: "",
194
+ rows: data
195
+ }];
196
+ const map = /* @__PURE__ */ new Map();
197
+ data.forEach((row) => {
198
+ const key = String(row[groupBy] ?? "Other");
199
+ if (!map.has(key)) map.set(key, []);
200
+ map.get(key).push(row);
201
+ });
202
+ return Array.from(map.entries()).map(([key, rows]) => ({
203
+ key,
204
+ label: key,
205
+ rows
206
+ }));
207
+ }, [data, groupBy]);
208
+ const resolveWidth = (w) => {
209
+ if (w === void 0) return void 0;
210
+ if (typeof w === "number") return `${w}px`;
211
+ return w;
212
+ };
213
+ const renderCell = (col, row, rowIndex) => {
214
+ const value = row[col.key];
215
+ if (col.render) return col.render(value, row, rowIndex);
216
+ if (value === null || value === void 0) return "";
217
+ if (typeof value === "boolean") {
218
+ const label = value ? "✓" : "✗";
219
+ return /* @__PURE__ */ jsx("span", {
220
+ style: { color: booleanColor ?? (getRowStatus ? (() => {
221
+ const s = getRowStatus(row, rowIndex);
222
+ return s ? statusColorMap[s] : void 0;
223
+ })() : void 0) ?? tokens.colors.text.primary },
224
+ children: label
225
+ });
226
+ }
227
+ return String(value);
228
+ };
229
+ const renderCellWithTooltip = (col, row, rowIndex) => {
230
+ const cellContent = renderCell(col, row, rowIndex);
231
+ if (!col.cellTooltip) return cellContent;
232
+ const tooltipContent = col.cellTooltip(row[col.key], row, rowIndex);
233
+ if (!tooltipContent) return cellContent;
234
+ return /* @__PURE__ */ jsx(CellTooltipWrapper, {
235
+ content: tooltipContent,
236
+ placement: tooltipPlacement,
237
+ delay: tooltipDelay,
238
+ children: /* @__PURE__ */ jsx("span", {
239
+ style: { cursor: "help" },
240
+ children: cellContent
241
+ })
242
+ });
243
+ };
244
+ const renderHeaderCell = (col) => {
245
+ const headerContent = /* @__PURE__ */ jsxs("span", {
246
+ style: {
247
+ display: "inline-flex",
248
+ alignItems: "center",
249
+ gap: 4
250
+ },
251
+ children: [col.header, col.headerTooltip && /* @__PURE__ */ jsxs("svg", {
252
+ width: "12",
253
+ height: "12",
254
+ viewBox: "0 0 16 16",
255
+ fill: "none",
256
+ style: {
257
+ opacity: .5,
258
+ flexShrink: 0
259
+ },
260
+ children: [
261
+ /* @__PURE__ */ jsx("circle", {
262
+ cx: "8",
263
+ cy: "8",
264
+ r: "7",
265
+ stroke: "currentColor",
266
+ strokeWidth: "1.5"
267
+ }),
268
+ /* @__PURE__ */ jsx("path", {
269
+ d: "M8 7v4",
270
+ stroke: "currentColor",
271
+ strokeWidth: "1.5",
272
+ strokeLinecap: "round"
273
+ }),
274
+ /* @__PURE__ */ jsx("circle", {
275
+ cx: "8",
276
+ cy: "5",
277
+ r: "0.75",
278
+ fill: "currentColor"
279
+ })
280
+ ]
281
+ })]
282
+ });
283
+ if (!col.headerTooltip) return headerContent;
284
+ return /* @__PURE__ */ jsx(Tooltip, {
285
+ content: col.headerTooltip,
286
+ placement: "bottom",
287
+ delay: tooltipDelay,
288
+ children: headerContent
289
+ });
290
+ };
291
+ const chevron = (expanded) => /* @__PURE__ */ jsx("svg", {
292
+ width: "14",
293
+ height: "14",
294
+ viewBox: "0 0 24 24",
295
+ fill: "none",
296
+ stroke: "currentColor",
297
+ strokeWidth: "2",
298
+ strokeLinecap: "round",
299
+ style: {
300
+ transition: tokens.animation.fast,
301
+ transform: expanded ? "rotate(90deg)" : "rotate(0deg)",
302
+ flexShrink: 0
303
+ },
304
+ children: /* @__PURE__ */ jsx("polyline", { points: "9 18 15 12 9 6" })
305
+ });
306
+ const hasRichRowTooltip = !!rowTooltipContent;
307
+ const renderRowContent = (row, rowIdx, localIndex) => {
308
+ const isHovered = hoveredRow === rowIdx;
309
+ const rowKey = keyField ? String(row[keyField]) : rowIdx;
310
+ const tr = /* @__PURE__ */ jsx("tr", {
311
+ tabIndex: onRowClick ? 0 : void 0,
312
+ onClick: onRowClick ? () => onRowClick(row, rowIdx) : void 0,
313
+ onKeyDown: onRowClick ? (e) => {
314
+ if (e.key === "Enter" || e.key === " ") {
315
+ e.preventDefault();
316
+ onRowClick(row, rowIdx);
317
+ }
318
+ } : void 0,
319
+ onMouseEnter: () => setHoveredRow(rowIdx),
320
+ onMouseLeave: () => setHoveredRow(null),
321
+ title: !hasRichRowTooltip && rowTooltip ? rowTooltip(row) : void 0,
322
+ style: {
323
+ cursor: onRowClick ? "pointer" : "default",
324
+ backgroundColor: isHovered ? addAlpha(tokens.colors.accent.primary, .08) : striped && localIndex % 2 === 1 ? addAlpha(tokens.colors.background.surface, .5) : "transparent",
325
+ transition: "background-color 150ms ease"
326
+ },
327
+ children: visibleColumns.map((col) => /* @__PURE__ */ jsx("td", {
328
+ style: {
329
+ padding: cellPadding,
330
+ textAlign: col.align || "left",
331
+ color: tokens.colors.text.primary,
332
+ borderBottom: `1px solid ${addAlpha(tokens.colors.border.muted, .08)}`,
333
+ fontFamily: col.mono ? tokens.typography.fontFamily.mono : "inherit",
334
+ fontVariantNumeric: col.mono ? "tabular-nums" : "normal",
335
+ whiteSpace: "nowrap",
336
+ overflow: "hidden",
337
+ textOverflow: "ellipsis",
338
+ maxWidth: resolveWidth(col.width) || "300px"
339
+ },
340
+ children: renderCellWithTooltip(col, row, rowIdx)
341
+ }, col.key))
342
+ }, rowKey);
343
+ if (hasRichRowTooltip) {
344
+ const tooltipContent = rowTooltipContent(row, rowIdx);
345
+ if (tooltipContent) return /* @__PURE__ */ jsx(Tooltip, {
346
+ content: tooltipContent,
347
+ placement: tooltipPlacement,
348
+ delay: tooltipDelay,
349
+ children: tr
350
+ }, rowKey);
351
+ }
352
+ return tr;
353
+ };
354
+ let globalRowIndex = 0;
355
+ return /* @__PURE__ */ jsx("div", {
356
+ style: {
357
+ fontFamily: tokens.typography.fontFamily.primary,
358
+ overflow: "auto",
359
+ WebkitOverflowScrolling: "touch",
360
+ maxHeight: typeof maxHeight === "number" ? `${maxHeight}px` : maxHeight,
361
+ borderRadius: tokens.borderRadius.md,
362
+ border: tokens.borders.divider,
363
+ ...style
364
+ },
365
+ children: /* @__PURE__ */ jsxs("table", {
366
+ style: {
367
+ width: "100%",
368
+ borderCollapse: "collapse",
369
+ fontSize: compact ? tokens.typography.fontSize.xs : tokens.typography.fontSize.sm
370
+ },
371
+ children: [showHeader && /* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsx("tr", { children: visibleColumns.map((col) => /* @__PURE__ */ jsx("th", {
372
+ style: {
373
+ padding: cellPadding,
374
+ textAlign: col.align || "left",
375
+ fontSize: tokens.typography.fontSize.xxs,
376
+ fontWeight: tokens.typography.fontWeight.bold,
377
+ color: tokens.colors.text.tertiary,
378
+ textTransform: "uppercase",
379
+ letterSpacing: "0.06em",
380
+ backgroundColor: tokens.colors.background.surface,
381
+ borderBottom: tokens.borders.divider,
382
+ width: resolveWidth(col.width),
383
+ position: "sticky",
384
+ top: 0,
385
+ zIndex: 1,
386
+ whiteSpace: "nowrap"
387
+ },
388
+ children: renderHeaderCell(col)
389
+ }, col.key)) }) }), /* @__PURE__ */ jsxs("tbody", { children: [data.length === 0 && /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx("td", {
390
+ colSpan: visibleColumnCount,
391
+ style: {
392
+ padding: tokens.spacing.xl,
393
+ textAlign: "center",
394
+ color: tokens.colors.text.tertiary,
395
+ fontSize: tokens.typography.fontSize.sm
396
+ },
397
+ children: emptyMessage
398
+ }) }), groups.map((group) => {
399
+ const isExpanded = !groupBy || isGroupExpanded(group.key);
400
+ return /* @__PURE__ */ jsxs(React.Fragment, { children: [groupBy && group.label && /* @__PURE__ */ jsx("tr", {
401
+ style: { backgroundColor: addAlpha(tokens.colors.accent.primary, .08) },
402
+ children: /* @__PURE__ */ jsx("td", {
403
+ colSpan: visibleColumnCount,
404
+ style: {
405
+ padding: 0,
406
+ borderBottom: tokens.borders.divider
407
+ },
408
+ children: expandable ? /* @__PURE__ */ jsxs("button", {
409
+ type: "button",
410
+ "aria-expanded": isExpanded,
411
+ onClick: () => toggleGroup(group.key),
412
+ style: {
413
+ display: "flex",
414
+ alignItems: "center",
415
+ gap: tokens.spacing.xs,
416
+ width: "100%",
417
+ padding: cellPadding,
418
+ margin: 0,
419
+ border: "none",
420
+ background: "none",
421
+ cursor: "pointer",
422
+ fontWeight: tokens.typography.fontWeight.semibold,
423
+ color: tokens.colors.text.primary,
424
+ fontSize: compact ? tokens.typography.fontSize.xs : tokens.typography.fontSize.sm,
425
+ fontFamily: "inherit",
426
+ textAlign: "left"
427
+ },
428
+ children: [
429
+ chevron(isExpanded),
430
+ group.label,
431
+ /* @__PURE__ */ jsxs("span", {
432
+ style: {
433
+ fontSize: tokens.typography.fontSize.xxs,
434
+ color: tokens.colors.text.tertiary,
435
+ fontWeight: tokens.typography.fontWeight.normal
436
+ },
437
+ children: [
438
+ "(",
439
+ group.rows.length,
440
+ ")"
441
+ ]
442
+ })
443
+ ]
444
+ }) : /* @__PURE__ */ jsxs("div", {
445
+ style: {
446
+ display: "flex",
447
+ alignItems: "center",
448
+ gap: tokens.spacing.xs,
449
+ padding: cellPadding,
450
+ fontWeight: tokens.typography.fontWeight.semibold,
451
+ color: tokens.colors.text.primary,
452
+ fontSize: compact ? tokens.typography.fontSize.xs : tokens.typography.fontSize.sm
453
+ },
454
+ children: [group.label, /* @__PURE__ */ jsxs("span", {
455
+ style: {
456
+ fontSize: tokens.typography.fontSize.xxs,
457
+ color: tokens.colors.text.tertiary,
458
+ fontWeight: tokens.typography.fontWeight.normal
459
+ },
460
+ children: [
461
+ "(",
462
+ group.rows.length,
463
+ ")"
464
+ ]
465
+ })]
466
+ })
467
+ })
468
+ }), isExpanded && group.rows.map((row, localIndex) => {
469
+ const rowIdx = globalRowIndex++;
470
+ return renderRowContent(row, rowIdx, localIndex);
471
+ })] }, group.key);
472
+ })] })]
473
+ })
474
+ });
441
475
  });
442
- export {
443
- DataTable,
444
- DataTableRowDetail
445
- };
446
- //# sourceMappingURL=DataTable.js.map
476
+ //#endregion
477
+ export { DataTable, DataTable as default, DataTableRowDetail };
478
+
479
+ //# sourceMappingURL=DataTable.js.map