@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,6 +1,5 @@
1
1
  import { default as React } from 'react';
2
-
3
- export type PopoverPlacement = 'top' | 'top-start' | 'top-end' | 'bottom' | 'bottom-start' | 'bottom-end' | 'left' | 'left-start' | 'left-end' | 'right' | 'right-start' | 'right-end';
2
+ export type PopoverPlacement = "top" | "top-start" | "top-end" | "bottom" | "bottom-start" | "bottom-end" | "left" | "left-start" | "left-end" | "right" | "right-start" | "right-end";
4
3
  export interface PopoverProps {
5
4
  /** Trigger element */
6
5
  trigger: React.ReactElement;
@@ -17,7 +16,7 @@ export interface PopoverProps {
17
16
  /** Close on content click */
18
17
  closeOnClick?: boolean;
19
18
  /** Width: 'trigger' matches trigger width, number for px, 'auto' */
20
- width?: 'trigger' | 'auto' | number;
19
+ width?: "trigger" | "auto" | number;
21
20
  /** Custom style for popover panel */
22
21
  style?: React.CSSProperties;
23
22
  }
@@ -1,294 +1,315 @@
1
- import { jsxs, jsx } from "react/jsx-runtime";
2
- import { memo, useState, useRef, useCallback, useEffect, useContext, createContext } from "react";
3
1
  import { useTheme } from "../../theme/ThemeProvider.js";
4
- const PopoverContext = createContext({ close: () => {
5
- } });
6
- const Popover = memo(function Popover2({
7
- trigger,
8
- children,
9
- placement = "bottom-start",
10
- hover = false,
11
- open: controlledOpen,
12
- onOpenChange,
13
- closeOnClick = true,
14
- width = "auto",
15
- style
16
- }) {
17
- const { tokens, theme } = useTheme();
18
- const isTransparentTheme = theme === "transparent" || theme === "transparent-bold" || theme === "transparent-minimal";
19
- const [internalOpen, setInternalOpen] = useState(false);
20
- const triggerRef = useRef(null);
21
- const popoverRef = useRef(null);
22
- const hoverTimeout = useRef();
23
- const isOpen = controlledOpen !== void 0 ? controlledOpen : internalOpen;
24
- const setOpen = useCallback((val) => {
25
- if (controlledOpen === void 0) setInternalOpen(val);
26
- onOpenChange == null ? void 0 : onOpenChange(val);
27
- }, [controlledOpen, onOpenChange]);
28
- const close = useCallback(() => setOpen(false), [setOpen]);
29
- useEffect(() => {
30
- if (!isOpen) return;
31
- const handler = (e) => {
32
- if (triggerRef.current && !triggerRef.current.contains(e.target) && popoverRef.current && !popoverRef.current.contains(e.target)) {
33
- close();
34
- }
35
- };
36
- document.addEventListener("mousedown", handler);
37
- return () => document.removeEventListener("mousedown", handler);
38
- }, [isOpen, close]);
39
- useEffect(() => {
40
- if (!isOpen) return;
41
- const handler = (e) => {
42
- if (e.key === "Escape") close();
43
- };
44
- document.addEventListener("keydown", handler);
45
- return () => document.removeEventListener("keydown", handler);
46
- }, [isOpen, close]);
47
- useEffect(() => {
48
- return () => {
49
- clearTimeout(hoverTimeout.current);
50
- };
51
- }, []);
52
- const [position, setPosition] = useState({ position: "fixed", left: 0, top: 0 });
53
- const [positioned, setPositioned] = useState(false);
54
- useEffect(() => {
55
- if (!isOpen) setPositioned(false);
56
- }, [isOpen]);
57
- useEffect(() => {
58
- if (!isOpen || !triggerRef.current) return;
59
- const gap = 8;
60
- const viewportPadding = 8;
61
- const updatePosition = () => {
62
- var _a, _b, _c;
63
- const rect = (_a = triggerRef.current) == null ? void 0 : _a.getBoundingClientRect();
64
- if (!rect) return;
65
- const panelWidth = width === "trigger" ? rect.width : typeof width === "number" ? width : ((_b = popoverRef.current) == null ? void 0 : _b.offsetWidth) ?? 220;
66
- const panelHeight = ((_c = popoverRef.current) == null ? void 0 : _c.offsetHeight) ?? 220;
67
- let left = rect.left;
68
- let top = rect.bottom + gap;
69
- if (placement.startsWith("top")) {
70
- top = rect.top - panelHeight - gap;
71
- } else if (placement.startsWith("bottom")) {
72
- top = rect.bottom + gap;
73
- } else if (placement.startsWith("left")) {
74
- left = rect.left - panelWidth - gap;
75
- } else if (placement.startsWith("right")) {
76
- left = rect.right + gap;
77
- }
78
- if (placement.startsWith("top") || placement.startsWith("bottom")) {
79
- if (placement.endsWith("-start")) {
80
- left = rect.left;
81
- } else if (placement.endsWith("-end")) {
82
- left = rect.right - panelWidth;
83
- } else {
84
- left = rect.left + (rect.width - panelWidth) / 2;
85
- }
86
- } else {
87
- if (placement.endsWith("-start")) {
88
- top = rect.top;
89
- } else if (placement.endsWith("-end")) {
90
- top = rect.bottom - panelHeight;
91
- } else {
92
- top = rect.top + (rect.height - panelHeight) / 2;
93
- }
94
- }
95
- left = Math.max(viewportPadding, Math.min(left, window.innerWidth - panelWidth - viewportPadding));
96
- top = Math.max(viewportPadding, Math.min(top, window.innerHeight - panelHeight - viewportPadding));
97
- const pos = {
98
- position: "fixed",
99
- zIndex: 9990,
100
- left,
101
- top
102
- };
103
- if (width === "trigger") {
104
- pos.width = rect.width;
105
- pos.minWidth = rect.width;
106
- } else if (typeof width === "number") {
107
- pos.width = width;
108
- }
109
- setPosition(pos);
110
- setPositioned(true);
111
- };
112
- const raf = requestAnimationFrame(updatePosition);
113
- window.addEventListener("resize", updatePosition);
114
- window.addEventListener("scroll", updatePosition, true);
115
- return () => {
116
- cancelAnimationFrame(raf);
117
- window.removeEventListener("resize", updatePosition);
118
- window.removeEventListener("scroll", updatePosition, true);
119
- };
120
- }, [isOpen, placement, width]);
121
- const triggerProps = {};
122
- if (hover) {
123
- triggerProps.onMouseEnter = () => {
124
- clearTimeout(hoverTimeout.current);
125
- setOpen(true);
126
- };
127
- triggerProps.onMouseLeave = () => {
128
- hoverTimeout.current = setTimeout(close, 150);
129
- };
130
- } else {
131
- triggerProps.onClick = () => setOpen(!isOpen);
132
- }
133
- const popoverHoverProps = hover ? {
134
- onMouseEnter: () => clearTimeout(hoverTimeout.current),
135
- onMouseLeave: () => {
136
- hoverTimeout.current = setTimeout(close, 150);
137
- }
138
- } : {};
139
- return /* @__PURE__ */ jsxs(PopoverContext.Provider, { value: { close }, children: [
140
- /* @__PURE__ */ jsx("div", { ref: triggerRef, style: { display: "inline-flex" }, "aria-expanded": isOpen, "aria-haspopup": "true", ...triggerProps, children: trigger }),
141
- isOpen && /* @__PURE__ */ jsx(
142
- "div",
143
- {
144
- ref: popoverRef,
145
- role: "dialog",
146
- onClick: closeOnClick ? close : void 0,
147
- ...popoverHoverProps,
148
- style: {
149
- ...position,
150
- visibility: positioned ? "visible" : "hidden",
151
- backgroundColor: isTransparentTheme ? "rgba(15, 12, 30, 0.85)" : tokens.colors.background.elevated,
152
- border: `1px solid ${tokens.colors.border.muted}`,
153
- borderRadius: tokens.borderRadius.md,
154
- boxShadow: tokens.shadows.lg,
155
- padding: tokens.spacing.xs,
156
- maxWidth: "min(320px, calc(100vw - 16px))",
157
- fontFamily: tokens.typography.fontFamily.primary,
158
- animation: `zendir-popover-enter 150ms ${tokens.animation.easing.default}`,
159
- ...isTransparentTheme ? {
160
- backdropFilter: "blur(16px)",
161
- WebkitBackdropFilter: "blur(16px)"
162
- } : {},
163
- ...style
164
- },
165
- children
166
- }
167
- ),
168
- /* @__PURE__ */ jsx("style", { children: `
2
+ import { createContext, memo, useCallback, useContext, useEffect, useRef, useState } from "react";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
4
+ //#region src/react/core/overlays/Popover.tsx
5
+ /**
6
+ * @zendir/ui - Popover & Menu Components
7
+ *
8
+ * General-purpose popover for dropdown menus, sort controls, action menus,
9
+ * and contextual information. Portal-rendered with auto-positioning.
10
+ *
11
+ * Astro UX Compliance:
12
+ * - Consistent with Dialog/Tooltip styling
13
+ * - Focus trap for keyboard navigation
14
+ * - Escape to close
15
+ * - Click outside to close
16
+ * - Reduced motion support
17
+ *
18
+ * @example
19
+ * ```tsx
20
+ * <Popover
21
+ * trigger={<Button variant="secondary">Sort</Button>}
22
+ * placement="bottom-start"
23
+ * >
24
+ * <Menu>
25
+ * <Menu.Item onClick={...}>Sort by Time</Menu.Item>
26
+ * <Menu.Item onClick={...}>Sort by Name</Menu.Item>
27
+ * <Menu.Divider />
28
+ * <Menu.Item onClick={...} destructive>Clear All</Menu.Item>
29
+ * </Menu>
30
+ * </Popover>
31
+ * ```
32
+ */
33
+ var PopoverContext = createContext({ close: () => {} });
34
+ var Popover = memo(function Popover({ trigger, children, placement = "bottom-start", hover = false, open: controlledOpen, onOpenChange, closeOnClick = true, width = "auto", style }) {
35
+ const { tokens, theme } = useTheme();
36
+ const isTransparentTheme = theme === "transparent" || theme === "transparent-bold" || theme === "transparent-minimal";
37
+ const [internalOpen, setInternalOpen] = useState(false);
38
+ const triggerRef = useRef(null);
39
+ const popoverRef = useRef(null);
40
+ const hoverTimeout = useRef();
41
+ const isOpen = controlledOpen !== void 0 ? controlledOpen : internalOpen;
42
+ const setOpen = useCallback((val) => {
43
+ if (controlledOpen === void 0) setInternalOpen(val);
44
+ onOpenChange?.(val);
45
+ }, [controlledOpen, onOpenChange]);
46
+ const close = useCallback(() => setOpen(false), [setOpen]);
47
+ useEffect(() => {
48
+ if (!isOpen) return;
49
+ const handler = (e) => {
50
+ if (triggerRef.current && !triggerRef.current.contains(e.target) && popoverRef.current && !popoverRef.current.contains(e.target)) close();
51
+ };
52
+ document.addEventListener("mousedown", handler);
53
+ return () => document.removeEventListener("mousedown", handler);
54
+ }, [isOpen, close]);
55
+ useEffect(() => {
56
+ if (!isOpen) return;
57
+ const handler = (e) => {
58
+ if (e.key === "Escape") close();
59
+ };
60
+ document.addEventListener("keydown", handler);
61
+ return () => document.removeEventListener("keydown", handler);
62
+ }, [isOpen, close]);
63
+ useEffect(() => {
64
+ return () => {
65
+ clearTimeout(hoverTimeout.current);
66
+ };
67
+ }, []);
68
+ const [position, setPosition] = useState({
69
+ position: "fixed",
70
+ left: 0,
71
+ top: 0
72
+ });
73
+ const [positioned, setPositioned] = useState(false);
74
+ useEffect(() => {
75
+ if (!isOpen) setPositioned(false);
76
+ }, [isOpen]);
77
+ useEffect(() => {
78
+ if (!isOpen || !triggerRef.current) return;
79
+ const gap = 8;
80
+ const viewportPadding = 8;
81
+ const updatePosition = () => {
82
+ const rect = triggerRef.current?.getBoundingClientRect();
83
+ if (!rect) return;
84
+ const panelWidth = width === "trigger" ? rect.width : typeof width === "number" ? width : popoverRef.current?.offsetWidth ?? 220;
85
+ const panelHeight = popoverRef.current?.offsetHeight ?? 220;
86
+ let left = rect.left;
87
+ let top = rect.bottom + gap;
88
+ if (placement.startsWith("top")) top = rect.top - panelHeight - gap;
89
+ else if (placement.startsWith("bottom")) top = rect.bottom + gap;
90
+ else if (placement.startsWith("left")) left = rect.left - panelWidth - gap;
91
+ else if (placement.startsWith("right")) left = rect.right + gap;
92
+ if (placement.startsWith("top") || placement.startsWith("bottom")) if (placement.endsWith("-start")) left = rect.left;
93
+ else if (placement.endsWith("-end")) left = rect.right - panelWidth;
94
+ else left = rect.left + (rect.width - panelWidth) / 2;
95
+ else if (placement.endsWith("-start")) top = rect.top;
96
+ else if (placement.endsWith("-end")) top = rect.bottom - panelHeight;
97
+ else top = rect.top + (rect.height - panelHeight) / 2;
98
+ left = Math.max(viewportPadding, Math.min(left, window.innerWidth - panelWidth - viewportPadding));
99
+ top = Math.max(viewportPadding, Math.min(top, window.innerHeight - panelHeight - viewportPadding));
100
+ const pos = {
101
+ position: "fixed",
102
+ zIndex: 9990,
103
+ left,
104
+ top
105
+ };
106
+ if (width === "trigger") {
107
+ pos.width = rect.width;
108
+ pos.minWidth = rect.width;
109
+ } else if (typeof width === "number") pos.width = width;
110
+ setPosition(pos);
111
+ setPositioned(true);
112
+ };
113
+ const raf = requestAnimationFrame(updatePosition);
114
+ window.addEventListener("resize", updatePosition);
115
+ window.addEventListener("scroll", updatePosition, true);
116
+ return () => {
117
+ cancelAnimationFrame(raf);
118
+ window.removeEventListener("resize", updatePosition);
119
+ window.removeEventListener("scroll", updatePosition, true);
120
+ };
121
+ }, [
122
+ isOpen,
123
+ placement,
124
+ width
125
+ ]);
126
+ const triggerProps = {};
127
+ if (hover) {
128
+ triggerProps.onMouseEnter = () => {
129
+ clearTimeout(hoverTimeout.current);
130
+ setOpen(true);
131
+ };
132
+ triggerProps.onMouseLeave = () => {
133
+ hoverTimeout.current = setTimeout(close, 150);
134
+ };
135
+ } else triggerProps.onClick = () => setOpen(!isOpen);
136
+ const popoverHoverProps = hover ? {
137
+ onMouseEnter: () => clearTimeout(hoverTimeout.current),
138
+ onMouseLeave: () => {
139
+ hoverTimeout.current = setTimeout(close, 150);
140
+ }
141
+ } : {};
142
+ return /* @__PURE__ */ jsxs(PopoverContext.Provider, {
143
+ value: { close },
144
+ children: [
145
+ /* @__PURE__ */ jsx("div", {
146
+ ref: triggerRef,
147
+ style: { display: "inline-flex" },
148
+ "aria-expanded": isOpen,
149
+ "aria-haspopup": "true",
150
+ ...triggerProps,
151
+ children: trigger
152
+ }),
153
+ isOpen && /* @__PURE__ */ jsx("div", {
154
+ ref: popoverRef,
155
+ role: "dialog",
156
+ onClick: closeOnClick ? close : void 0,
157
+ ...popoverHoverProps,
158
+ style: {
159
+ ...position,
160
+ visibility: positioned ? "visible" : "hidden",
161
+ backgroundColor: isTransparentTheme ? "rgba(15, 12, 30, 0.85)" : tokens.colors.background.elevated,
162
+ border: `1px solid ${tokens.colors.border.muted}`,
163
+ borderRadius: tokens.borderRadius.md,
164
+ boxShadow: tokens.shadows.lg,
165
+ padding: tokens.spacing.xs,
166
+ maxWidth: "min(320px, calc(100vw - 16px))",
167
+ fontFamily: tokens.typography.fontFamily.primary,
168
+ animation: `zendir-popover-enter 150ms ${tokens.animation.easing.default}`,
169
+ ...isTransparentTheme ? {
170
+ backdropFilter: "blur(16px)",
171
+ WebkitBackdropFilter: "blur(16px)"
172
+ } : {},
173
+ ...style
174
+ },
175
+ children
176
+ }),
177
+ /* @__PURE__ */ jsx("style", { children: `
169
178
  @keyframes zendir-popover-enter {
170
179
  from { opacity: 0; transform: translateY(-4px) scale(0.98); }
171
180
  to { opacity: 1; transform: translateY(0) scale(1); }
172
181
  }
173
182
  ` })
174
- ] });
183
+ ]
184
+ });
175
185
  });
176
- const MenuRoot = memo(function Menu2({ children, style }) {
177
- return /* @__PURE__ */ jsx("div", { role: "menu", style: { minWidth: "min(160px, calc(100vw - 32px))", ...style }, children });
186
+ var MenuRoot = memo(function Menu({ children, style }) {
187
+ return /* @__PURE__ */ jsx("div", {
188
+ role: "menu",
189
+ style: {
190
+ minWidth: "min(160px, calc(100vw - 32px))",
191
+ ...style
192
+ },
193
+ children
194
+ });
178
195
  });
179
- const MenuItem = memo(function MenuItem2({
180
- onClick,
181
- icon,
182
- children,
183
- disabled = false,
184
- destructive = false,
185
- shortcut
186
- }) {
187
- const { tokens } = useTheme();
188
- const { close } = useContext(PopoverContext);
189
- const [isHovered, setIsHovered] = useState(false);
190
- const handleClick = useCallback(() => {
191
- if (disabled) return;
192
- onClick == null ? void 0 : onClick();
193
- close();
194
- }, [disabled, onClick, close]);
195
- const handleKeyDown = useCallback((e) => {
196
- var _a, _b, _c, _d, _e;
197
- const item = e.currentTarget;
198
- const siblings = (_a = item.parentElement) == null ? void 0 : _a.querySelectorAll('[role="menuitem"]:not([disabled])');
199
- if (!siblings) return;
200
- const items = Array.from(siblings);
201
- const idx = items.indexOf(item);
202
- if (e.key === "ArrowDown") {
203
- e.preventDefault();
204
- (_b = items[(idx + 1) % items.length]) == null ? void 0 : _b.focus();
205
- } else if (e.key === "ArrowUp") {
206
- e.preventDefault();
207
- (_c = items[(idx - 1 + items.length) % items.length]) == null ? void 0 : _c.focus();
208
- } else if (e.key === "Home") {
209
- e.preventDefault();
210
- (_d = items[0]) == null ? void 0 : _d.focus();
211
- } else if (e.key === "End") {
212
- e.preventDefault();
213
- (_e = items[items.length - 1]) == null ? void 0 : _e.focus();
214
- }
215
- }, []);
216
- const color = destructive ? tokens.colors.status.critical : disabled ? tokens.colors.text.tertiary : tokens.colors.text.primary;
217
- return /* @__PURE__ */ jsxs(
218
- "button",
219
- {
220
- role: "menuitem",
221
- tabIndex: disabled ? -1 : 0,
222
- onClick: handleClick,
223
- onKeyDown: handleKeyDown,
224
- disabled,
225
- onMouseEnter: () => setIsHovered(true),
226
- onMouseLeave: () => setIsHovered(false),
227
- style: {
228
- display: "flex",
229
- alignItems: "center",
230
- gap: tokens.spacing.sm,
231
- width: "100%",
232
- padding: `${tokens.spacing.sm} ${tokens.spacing.sm}`,
233
- minHeight: 44,
234
- border: "none",
235
- background: isHovered && !disabled ? `${destructive ? tokens.colors.status.critical : tokens.colors.accent.primary}12` : "transparent",
236
- color,
237
- fontSize: tokens.typography.fontSize.sm,
238
- fontWeight: tokens.typography.fontWeight.normal,
239
- fontFamily: tokens.typography.fontFamily.primary,
240
- cursor: disabled ? "not-allowed" : "pointer",
241
- borderRadius: tokens.borderRadius.sm,
242
- textAlign: "left",
243
- transition: tokens.animation.fast,
244
- opacity: disabled ? 0.5 : 1,
245
- outline: "none"
246
- },
247
- children: [
248
- icon && /* @__PURE__ */ jsx("span", { style: { flexShrink: 0, display: "flex" }, children: icon }),
249
- /* @__PURE__ */ jsx("span", { style: { flex: 1 }, children }),
250
- shortcut && /* @__PURE__ */ jsx("span", { style: {
251
- fontSize: tokens.typography.fontSize.xxs,
252
- color: tokens.colors.text.tertiary,
253
- fontFamily: tokens.typography.fontFamily.mono,
254
- flexShrink: 0
255
- }, children: shortcut })
256
- ]
257
- }
258
- );
196
+ var MenuItem = memo(function MenuItem({ onClick, icon, children, disabled = false, destructive = false, shortcut }) {
197
+ const { tokens } = useTheme();
198
+ const { close } = useContext(PopoverContext);
199
+ const [isHovered, setIsHovered] = useState(false);
200
+ const handleClick = useCallback(() => {
201
+ if (disabled) return;
202
+ onClick?.();
203
+ close();
204
+ }, [
205
+ disabled,
206
+ onClick,
207
+ close
208
+ ]);
209
+ const handleKeyDown = useCallback((e) => {
210
+ const item = e.currentTarget;
211
+ const siblings = item.parentElement?.querySelectorAll("[role=\"menuitem\"]:not([disabled])");
212
+ if (!siblings) return;
213
+ const items = Array.from(siblings);
214
+ const idx = items.indexOf(item);
215
+ if (e.key === "ArrowDown") {
216
+ e.preventDefault();
217
+ items[(idx + 1) % items.length]?.focus();
218
+ } else if (e.key === "ArrowUp") {
219
+ e.preventDefault();
220
+ items[(idx - 1 + items.length) % items.length]?.focus();
221
+ } else if (e.key === "Home") {
222
+ e.preventDefault();
223
+ items[0]?.focus();
224
+ } else if (e.key === "End") {
225
+ e.preventDefault();
226
+ items[items.length - 1]?.focus();
227
+ }
228
+ }, []);
229
+ const color = destructive ? tokens.colors.status.critical : disabled ? tokens.colors.text.tertiary : tokens.colors.text.primary;
230
+ return /* @__PURE__ */ jsxs("button", {
231
+ role: "menuitem",
232
+ tabIndex: disabled ? -1 : 0,
233
+ onClick: handleClick,
234
+ onKeyDown: handleKeyDown,
235
+ disabled,
236
+ onMouseEnter: () => setIsHovered(true),
237
+ onMouseLeave: () => setIsHovered(false),
238
+ style: {
239
+ display: "flex",
240
+ alignItems: "center",
241
+ gap: tokens.spacing.sm,
242
+ width: "100%",
243
+ padding: `${tokens.spacing.sm} ${tokens.spacing.sm}`,
244
+ minHeight: 44,
245
+ border: "none",
246
+ background: isHovered && !disabled ? `${destructive ? tokens.colors.status.critical : tokens.colors.accent.primary}12` : "transparent",
247
+ color,
248
+ fontSize: tokens.typography.fontSize.sm,
249
+ fontWeight: tokens.typography.fontWeight.normal,
250
+ fontFamily: tokens.typography.fontFamily.primary,
251
+ cursor: disabled ? "not-allowed" : "pointer",
252
+ borderRadius: tokens.borderRadius.sm,
253
+ textAlign: "left",
254
+ transition: tokens.animation.fast,
255
+ opacity: disabled ? .5 : 1,
256
+ outline: "none"
257
+ },
258
+ children: [
259
+ icon && /* @__PURE__ */ jsx("span", {
260
+ style: {
261
+ flexShrink: 0,
262
+ display: "flex"
263
+ },
264
+ children: icon
265
+ }),
266
+ /* @__PURE__ */ jsx("span", {
267
+ style: { flex: 1 },
268
+ children
269
+ }),
270
+ shortcut && /* @__PURE__ */ jsx("span", {
271
+ style: {
272
+ fontSize: tokens.typography.fontSize.xxs,
273
+ color: tokens.colors.text.tertiary,
274
+ fontFamily: tokens.typography.fontFamily.mono,
275
+ flexShrink: 0
276
+ },
277
+ children: shortcut
278
+ })
279
+ ]
280
+ });
259
281
  });
260
- const MenuDivider = memo(function MenuDivider2() {
261
- const { tokens } = useTheme();
262
- return /* @__PURE__ */ jsx(
263
- "div",
264
- {
265
- role: "separator",
266
- style: {
267
- height: "1px",
268
- backgroundColor: tokens.colors.border.muted,
269
- margin: `${tokens.spacing.xs} 0`
270
- }
271
- }
272
- );
282
+ var MenuDivider = memo(function MenuDivider() {
283
+ const { tokens } = useTheme();
284
+ return /* @__PURE__ */ jsx("div", {
285
+ role: "separator",
286
+ style: {
287
+ height: "1px",
288
+ backgroundColor: tokens.colors.border.muted,
289
+ margin: `${tokens.spacing.xs} 0`
290
+ }
291
+ });
273
292
  });
274
- const MenuLabel = memo(function MenuLabel2({ children }) {
275
- const { tokens } = useTheme();
276
- return /* @__PURE__ */ jsx("div", { style: {
277
- padding: `${tokens.spacing.xs} ${tokens.spacing.sm}`,
278
- fontSize: tokens.typography.fontSize.xxs,
279
- fontWeight: tokens.typography.fontWeight.bold,
280
- color: tokens.colors.text.tertiary,
281
- textTransform: "uppercase",
282
- letterSpacing: "0.06em"
283
- }, children });
293
+ var MenuLabel = memo(function MenuLabel({ children }) {
294
+ const { tokens } = useTheme();
295
+ return /* @__PURE__ */ jsx("div", {
296
+ style: {
297
+ padding: `${tokens.spacing.xs} ${tokens.spacing.sm}`,
298
+ fontSize: tokens.typography.fontSize.xxs,
299
+ fontWeight: tokens.typography.fontWeight.bold,
300
+ color: tokens.colors.text.tertiary,
301
+ textTransform: "uppercase",
302
+ letterSpacing: "0.06em"
303
+ },
304
+ children
305
+ });
284
306
  });
285
- const Menu = Object.assign(MenuRoot, {
286
- Item: MenuItem,
287
- Divider: MenuDivider,
288
- Label: MenuLabel
307
+ var Menu = Object.assign(MenuRoot, {
308
+ Item: MenuItem,
309
+ Divider: MenuDivider,
310
+ Label: MenuLabel
289
311
  });
290
- export {
291
- Menu,
292
- Popover
293
- };
294
- //# sourceMappingURL=Popover.js.map
312
+ //#endregion
313
+ export { Menu, Popover, Popover as default };
314
+
315
+ //# sourceMappingURL=Popover.js.map