@zendir/ui 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (359) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/LICENSE +21 -0
  3. package/README.md +589 -0
  4. package/dist/index.d.ts +8 -0
  5. package/dist/index.js +421 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/react/3d/EarthViewer.d.ts +46 -0
  8. package/dist/react/3d/EarthViewer.js +836 -0
  9. package/dist/react/3d/EarthViewer.js.map +1 -0
  10. package/dist/react/3d/SolarSystemViewer.d.ts +43 -0
  11. package/dist/react/3d/SolarSystemViewer.js +372 -0
  12. package/dist/react/3d/SolarSystemViewer.js.map +1 -0
  13. package/dist/react/3d/ZenSpace3D.d.ts +16 -0
  14. package/dist/react/3d/ZenSpace3D.js +1253 -0
  15. package/dist/react/3d/ZenSpace3D.js.map +1 -0
  16. package/dist/react/3d/ZenSpace3DCesium.d.ts +9 -0
  17. package/dist/react/3d/ZenSpace3DCesium.js +186 -0
  18. package/dist/react/3d/ZenSpace3DCesium.js.map +1 -0
  19. package/dist/react/3d/ZenSpace3DShaders.d.ts +78 -0
  20. package/dist/react/3d/ZenSpace3DShaders.js +94 -0
  21. package/dist/react/3d/ZenSpace3DShaders.js.map +1 -0
  22. package/dist/react/3d/ZenSpace3DTypes.d.ts +614 -0
  23. package/dist/react/3d/ZenSpace3DUtils.d.ts +183 -0
  24. package/dist/react/3d/ZenSpace3DUtils.js +213 -0
  25. package/dist/react/3d/ZenSpace3DUtils.js.map +1 -0
  26. package/dist/react/3d/index.d.ts +23 -0
  27. package/dist/react/3d/threeLoader.d.ts +22 -0
  28. package/dist/react/3d/threeLoader.js +18 -0
  29. package/dist/react/3d/threeLoader.js.map +1 -0
  30. package/dist/react/astro/ClassificationBanner.d.ts +25 -0
  31. package/dist/react/astro/ClassificationBanner.js +83 -0
  32. package/dist/react/astro/ClassificationBanner.js.map +1 -0
  33. package/dist/react/astro/GlobalStatusBar.d.ts +42 -0
  34. package/dist/react/astro/GlobalStatusBar.js +165 -0
  35. package/dist/react/astro/GlobalStatusBar.js.map +1 -0
  36. package/dist/react/astro/MissionClock.d.ts +169 -0
  37. package/dist/react/astro/MissionClock.js +411 -0
  38. package/dist/react/astro/MissionClock.js.map +1 -0
  39. package/dist/react/astro/MonitoringIcon.d.ts +60 -0
  40. package/dist/react/astro/MonitoringIcon.js +369 -0
  41. package/dist/react/astro/MonitoringIcon.js.map +1 -0
  42. package/dist/react/astro/Notification.d.ts +42 -0
  43. package/dist/react/astro/Notification.js +156 -0
  44. package/dist/react/astro/Notification.js.map +1 -0
  45. package/dist/react/astro/Progress.d.ts +39 -0
  46. package/dist/react/astro/Progress.js +149 -0
  47. package/dist/react/astro/Progress.js.map +1 -0
  48. package/dist/react/astro/SimulationControls.d.ts +136 -0
  49. package/dist/react/astro/SimulationControls.js +668 -0
  50. package/dist/react/astro/SimulationControls.js.map +1 -0
  51. package/dist/react/astro/StatusIndicator.d.ts +34 -0
  52. package/dist/react/astro/StatusIndicator.js +189 -0
  53. package/dist/react/astro/StatusIndicator.js.map +1 -0
  54. package/dist/react/astro/UnifiedTimeline.d.ts +106 -0
  55. package/dist/react/astro/UnifiedTimeline.js +1768 -0
  56. package/dist/react/astro/UnifiedTimeline.js.map +1 -0
  57. package/dist/react/astro/index.d.ts +63 -0
  58. package/dist/react/cards/AccessCard.d.ts +37 -0
  59. package/dist/react/cards/AccessCard.js +410 -0
  60. package/dist/react/cards/AccessCard.js.map +1 -0
  61. package/dist/react/cards/OrbitCard.d.ts +31 -0
  62. package/dist/react/cards/OrbitCard.js +372 -0
  63. package/dist/react/cards/OrbitCard.js.map +1 -0
  64. package/dist/react/cards/SpacecraftCard.d.ts +54 -0
  65. package/dist/react/cards/SpacecraftCard.js +941 -0
  66. package/dist/react/cards/SpacecraftCard.js.map +1 -0
  67. package/dist/react/cards/TelemetryCard.d.ts +40 -0
  68. package/dist/react/cards/TelemetryCard.js +742 -0
  69. package/dist/react/cards/TelemetryCard.js.map +1 -0
  70. package/dist/react/cards/TelemetryStreamCard.d.ts +59 -0
  71. package/dist/react/cards/TelemetryStreamCard.js +309 -0
  72. package/dist/react/cards/TelemetryStreamCard.js.map +1 -0
  73. package/dist/react/cards/index.d.ts +13 -0
  74. package/dist/react/charts/GroundTrackMap.d.ts +112 -0
  75. package/dist/react/charts/GroundTrackMap.js +1123 -0
  76. package/dist/react/charts/GroundTrackMap.js.map +1 -0
  77. package/dist/react/charts/GroundTrackMapLeaflet.d.ts +26 -0
  78. package/dist/react/charts/GroundTrackMapLeaflet.js +571 -0
  79. package/dist/react/charts/GroundTrackMapLeaflet.js.map +1 -0
  80. package/dist/react/charts/groundTrackMapLeafletTiles.d.ts +22 -0
  81. package/dist/react/charts/groundTrackMapLeafletTiles.js +11 -0
  82. package/dist/react/charts/groundTrackMapLeafletTiles.js.map +1 -0
  83. package/dist/react/charts/groundTrackMapLeafletUtils.d.ts +24 -0
  84. package/dist/react/charts/groundTrackMapLeafletUtils.js +109 -0
  85. package/dist/react/charts/groundTrackMapLeafletUtils.js.map +1 -0
  86. package/dist/react/charts/index.d.ts +10 -0
  87. package/dist/react/charts/unified/AstroChart.d.ts +24 -0
  88. package/dist/react/charts/unified/AstroChart.js +1405 -0
  89. package/dist/react/charts/unified/AstroChart.js.map +1 -0
  90. package/dist/react/charts/unified/PowerOverviewChart.d.ts +73 -0
  91. package/dist/react/charts/unified/PowerOverviewChart.js +488 -0
  92. package/dist/react/charts/unified/PowerOverviewChart.js.map +1 -0
  93. package/dist/react/charts/unified/domain.d.ts +845 -0
  94. package/dist/react/charts/unified/domain.js +3168 -0
  95. package/dist/react/charts/unified/domain.js.map +1 -0
  96. package/dist/react/charts/unified/generators.d.ts +276 -0
  97. package/dist/react/charts/unified/generators.js +518 -0
  98. package/dist/react/charts/unified/generators.js.map +1 -0
  99. package/dist/react/charts/unified/index.d.ts +55 -0
  100. package/dist/react/charts/unified/presets.d.ts +290 -0
  101. package/dist/react/charts/unified/presets.js +999 -0
  102. package/dist/react/charts/unified/presets.js.map +1 -0
  103. package/dist/react/charts/unified/sync.d.ts +69 -0
  104. package/dist/react/charts/unified/sync.js +219 -0
  105. package/dist/react/charts/unified/sync.js.map +1 -0
  106. package/dist/react/charts/unified/theme.d.ts +447 -0
  107. package/dist/react/charts/unified/theme.js +562 -0
  108. package/dist/react/charts/unified/theme.js.map +1 -0
  109. package/dist/react/charts/unified/types.d.ts +826 -0
  110. package/dist/react/charts/unified/useChartStream.d.ts +58 -0
  111. package/dist/react/charts/unified/useChartStream.js +226 -0
  112. package/dist/react/charts/unified/useChartStream.js.map +1 -0
  113. package/dist/react/chatgpt/AppCard.d.ts +59 -0
  114. package/dist/react/chatgpt/AppCard.js +306 -0
  115. package/dist/react/chatgpt/AppCard.js.map +1 -0
  116. package/dist/react/chatgpt/ChatGPTCard.d.ts +6 -0
  117. package/dist/react/chatgpt/index.d.ts +167 -0
  118. package/dist/react/chatgpt/index.js +166 -0
  119. package/dist/react/chatgpt/index.js.map +1 -0
  120. package/dist/react/context/DisplaySettingsContext.d.ts +107 -0
  121. package/dist/react/context/DisplaySettingsContext.js +169 -0
  122. package/dist/react/context/DisplaySettingsContext.js.map +1 -0
  123. package/dist/react/context/index.d.ts +5 -0
  124. package/dist/react/core/ActivityPlanner.d.ts +45 -0
  125. package/dist/react/core/ActivityPlanner.js +532 -0
  126. package/dist/react/core/ActivityPlanner.js.map +1 -0
  127. package/dist/react/core/AppBar.d.ts +71 -0
  128. package/dist/react/core/AppBar.js +817 -0
  129. package/dist/react/core/AppBar.js.map +1 -0
  130. package/dist/react/core/AstroIcon.d.ts +84 -0
  131. package/dist/react/core/AstroIcon.js +1243 -0
  132. package/dist/react/core/AstroIcon.js.map +1 -0
  133. package/dist/react/core/Badge.d.ts +27 -0
  134. package/dist/react/core/Badge.js +134 -0
  135. package/dist/react/core/Badge.js.map +1 -0
  136. package/dist/react/core/Button.d.ts +26 -0
  137. package/dist/react/core/Button.js +306 -0
  138. package/dist/react/core/Button.js.map +1 -0
  139. package/dist/react/core/CardHeader.d.ts +34 -0
  140. package/dist/react/core/CardHeader.js +316 -0
  141. package/dist/react/core/CardHeader.js.map +1 -0
  142. package/dist/react/core/ChatPanel.d.ts +627 -0
  143. package/dist/react/core/ChatPanel.js +1144 -0
  144. package/dist/react/core/ChatPanel.js.map +1 -0
  145. package/dist/react/core/Checkbox.d.ts +26 -0
  146. package/dist/react/core/Checkbox.js +130 -0
  147. package/dist/react/core/Checkbox.js.map +1 -0
  148. package/dist/react/core/ColorPickerPanel.d.ts +25 -0
  149. package/dist/react/core/ColorPickerPanel.js +293 -0
  150. package/dist/react/core/ColorPickerPanel.js.map +1 -0
  151. package/dist/react/core/CommandBuilder.d.ts +74 -0
  152. package/dist/react/core/CommandBuilder.js +518 -0
  153. package/dist/react/core/CommandBuilder.js.map +1 -0
  154. package/dist/react/core/ConfirmDialog.d.ts +45 -0
  155. package/dist/react/core/ConfirmDialog.js +315 -0
  156. package/dist/react/core/ConfirmDialog.js.map +1 -0
  157. package/dist/react/core/ConnectionForm.d.ts +57 -0
  158. package/dist/react/core/ConnectionForm.js +496 -0
  159. package/dist/react/core/ConnectionForm.js.map +1 -0
  160. package/dist/react/core/Container.d.ts +51 -0
  161. package/dist/react/core/Container.js +670 -0
  162. package/dist/react/core/Container.js.map +1 -0
  163. package/dist/react/core/CopyButton.d.ts +39 -0
  164. package/dist/react/core/CopyButton.js +105 -0
  165. package/dist/react/core/CopyButton.js.map +1 -0
  166. package/dist/react/core/DataTable.d.ts +113 -0
  167. package/dist/react/core/DataTable.js +446 -0
  168. package/dist/react/core/DataTable.js.map +1 -0
  169. package/dist/react/core/DataValue.d.ts +64 -0
  170. package/dist/react/core/DataValue.js +545 -0
  171. package/dist/react/core/DataValue.js.map +1 -0
  172. package/dist/react/core/Dialog.d.ts +32 -0
  173. package/dist/react/core/Dialog.js +201 -0
  174. package/dist/react/core/Dialog.js.map +1 -0
  175. package/dist/react/core/FileExplorer.d.ts +65 -0
  176. package/dist/react/core/FileExplorer.js +520 -0
  177. package/dist/react/core/FileExplorer.js.map +1 -0
  178. package/dist/react/core/GlassCard.d.ts +129 -0
  179. package/dist/react/core/GlassCard.js +375 -0
  180. package/dist/react/core/GlassCard.js.map +1 -0
  181. package/dist/react/core/HeaderIconWithStatus.d.ts +39 -0
  182. package/dist/react/core/HeaderIconWithStatus.js +157 -0
  183. package/dist/react/core/HeaderIconWithStatus.js.map +1 -0
  184. package/dist/react/core/HexViewer.d.ts +143 -0
  185. package/dist/react/core/HexViewer.js +1106 -0
  186. package/dist/react/core/HexViewer.js.map +1 -0
  187. package/dist/react/core/Icon.d.ts +32 -0
  188. package/dist/react/core/Icon.js +142 -0
  189. package/dist/react/core/Icon.js.map +1 -0
  190. package/dist/react/core/ImageGallery.d.ts +41 -0
  191. package/dist/react/core/ImageGallery.js +320 -0
  192. package/dist/react/core/ImageGallery.js.map +1 -0
  193. package/dist/react/core/Input.d.ts +38 -0
  194. package/dist/react/core/Input.js +288 -0
  195. package/dist/react/core/Input.js.map +1 -0
  196. package/dist/react/core/LimitsBar.d.ts +51 -0
  197. package/dist/react/core/LimitsBar.js +200 -0
  198. package/dist/react/core/LimitsBar.js.map +1 -0
  199. package/dist/react/core/LogViewer.d.ts +61 -0
  200. package/dist/react/core/LogViewer.js +599 -0
  201. package/dist/react/core/LogViewer.js.map +1 -0
  202. package/dist/react/core/MessageStream.d.ts +58 -0
  203. package/dist/react/core/MessageStream.js +455 -0
  204. package/dist/react/core/MessageStream.js.map +1 -0
  205. package/dist/react/core/MissionCalendar.d.ts +81 -0
  206. package/dist/react/core/MissionCalendar.js +1049 -0
  207. package/dist/react/core/MissionCalendar.js.map +1 -0
  208. package/dist/react/core/NumberInput.d.ts +85 -0
  209. package/dist/react/core/NumberInput.js +507 -0
  210. package/dist/react/core/NumberInput.js.map +1 -0
  211. package/dist/react/core/PacketViewer.d.ts +73 -0
  212. package/dist/react/core/PacketViewer.js +431 -0
  213. package/dist/react/core/PacketViewer.js.map +1 -0
  214. package/dist/react/core/Pagination.d.ts +30 -0
  215. package/dist/react/core/Pagination.js +190 -0
  216. package/dist/react/core/Pagination.js.map +1 -0
  217. package/dist/react/core/PinInput.d.ts +41 -0
  218. package/dist/react/core/PinInput.js +210 -0
  219. package/dist/react/core/PinInput.js.map +1 -0
  220. package/dist/react/core/Popover.d.ts +55 -0
  221. package/dist/react/core/Popover.js +288 -0
  222. package/dist/react/core/Popover.js.map +1 -0
  223. package/dist/react/core/Select.d.ts +42 -0
  224. package/dist/react/core/Select.js +303 -0
  225. package/dist/react/core/Select.js.map +1 -0
  226. package/dist/react/core/SideNav.d.ts +103 -0
  227. package/dist/react/core/SideNav.js +551 -0
  228. package/dist/react/core/SideNav.js.map +1 -0
  229. package/dist/react/core/SidePanel.d.ts +33 -0
  230. package/dist/react/core/SidePanel.js +199 -0
  231. package/dist/react/core/SidePanel.js.map +1 -0
  232. package/dist/react/core/Tabs.d.ts +47 -0
  233. package/dist/react/core/Tabs.js +129 -0
  234. package/dist/react/core/Tabs.js.map +1 -0
  235. package/dist/react/core/Toast.d.ts +56 -0
  236. package/dist/react/core/Toast.js +229 -0
  237. package/dist/react/core/Toast.js.map +1 -0
  238. package/dist/react/core/Toggle.d.ts +22 -0
  239. package/dist/react/core/Toggle.js +151 -0
  240. package/dist/react/core/Toggle.js.map +1 -0
  241. package/dist/react/core/Tooltip.d.ts +19 -0
  242. package/dist/react/core/Tooltip.js +179 -0
  243. package/dist/react/core/Tooltip.js.map +1 -0
  244. package/dist/react/core/Typography.d.ts +127 -0
  245. package/dist/react/core/Typography.js +187 -0
  246. package/dist/react/core/Typography.js.map +1 -0
  247. package/dist/react/core/index.d.ts +108 -0
  248. package/dist/react/core/layout/Box.d.ts +77 -0
  249. package/dist/react/core/layout/Box.js +126 -0
  250. package/dist/react/core/layout/Box.js.map +1 -0
  251. package/dist/react/core/layout/Center.d.ts +20 -0
  252. package/dist/react/core/layout/Center.js +34 -0
  253. package/dist/react/core/layout/Center.js.map +1 -0
  254. package/dist/react/core/layout/Divider.d.ts +16 -0
  255. package/dist/react/core/layout/Divider.js +108 -0
  256. package/dist/react/core/layout/Divider.js.map +1 -0
  257. package/dist/react/core/layout/Flex.d.ts +30 -0
  258. package/dist/react/core/layout/Flex.js +128 -0
  259. package/dist/react/core/layout/Flex.js.map +1 -0
  260. package/dist/react/core/layout/Grid.d.ts +36 -0
  261. package/dist/react/core/layout/Grid.js +142 -0
  262. package/dist/react/core/layout/Grid.js.map +1 -0
  263. package/dist/react/core/layout/Spacer.d.ts +8 -0
  264. package/dist/react/core/layout/Spacer.js +31 -0
  265. package/dist/react/core/layout/Spacer.js.map +1 -0
  266. package/dist/react/core/layout/Stack.d.ts +54 -0
  267. package/dist/react/core/layout/Stack.js +74 -0
  268. package/dist/react/core/layout/Stack.js.map +1 -0
  269. package/dist/react/core/layout/index.d.ts +38 -0
  270. package/dist/react/core/layout/responsive.d.ts +23 -0
  271. package/dist/react/core/layout/responsive.js +26 -0
  272. package/dist/react/core/layout/responsive.js.map +1 -0
  273. package/dist/react/core/layout/useBreakpoint.d.ts +77 -0
  274. package/dist/react/core/layout/useBreakpoint.js +73 -0
  275. package/dist/react/core/layout/useBreakpoint.js.map +1 -0
  276. package/dist/react/core/propertyConfig.d.ts +443 -0
  277. package/dist/react/core/propertyConfig.js +399 -0
  278. package/dist/react/core/propertyConfig.js.map +1 -0
  279. package/dist/react/hooks/index.d.ts +21 -0
  280. package/dist/react/hooks/useAccessWindows.d.ts +66 -0
  281. package/dist/react/hooks/useCompactMode.d.ts +82 -0
  282. package/dist/react/hooks/useCompactMode.js +62 -0
  283. package/dist/react/hooks/useCompactMode.js.map +1 -0
  284. package/dist/react/hooks/useLiveSelection.d.ts +57 -0
  285. package/dist/react/hooks/useSimulationPlayback.d.ts +97 -0
  286. package/dist/react/hooks/useSimulationTime.d.ts +61 -0
  287. package/dist/react/hooks/useSpacecraftPosition.d.ts +50 -0
  288. package/dist/react/hooks/useSpacecraftPosition.js +89 -0
  289. package/dist/react/hooks/useSpacecraftPosition.js.map +1 -0
  290. package/dist/react/hooks/useTelemetry.d.ts +55 -0
  291. package/dist/react/hooks/useTelemetry.js +73 -0
  292. package/dist/react/hooks/useTelemetry.js.map +1 -0
  293. package/dist/react/hooks/useZendirSession.d.ts +109 -0
  294. package/dist/react/hooks/useZendirSession.js +148 -0
  295. package/dist/react/hooks/useZendirSession.js.map +1 -0
  296. package/dist/react/index.d.ts +74 -0
  297. package/dist/react/shared/ErrorBoundary.d.ts +63 -0
  298. package/dist/react/shared/ErrorBoundary.js +142 -0
  299. package/dist/react/shared/ErrorBoundary.js.map +1 -0
  300. package/dist/react/shared/Skeleton.d.ts +110 -0
  301. package/dist/react/shared/Skeleton.js +324 -0
  302. package/dist/react/shared/Skeleton.js.map +1 -0
  303. package/dist/react/shared/index.d.ts +12 -0
  304. package/dist/react/theme/ThemeProvider.d.ts +385 -0
  305. package/dist/react/theme/ThemeProvider.js +1096 -0
  306. package/dist/react/theme/ThemeProvider.js.map +1 -0
  307. package/dist/react/theme/astro-tokens.d.ts +153 -0
  308. package/dist/react/theme/cardAccent.d.ts +75 -0
  309. package/dist/react/theme/cardAccent.js +137 -0
  310. package/dist/react/theme/cardAccent.js.map +1 -0
  311. package/dist/react/theme/config.d.ts +39 -0
  312. package/dist/react/theme/index.d.ts +9 -0
  313. package/dist/react/types.d.ts +360 -0
  314. package/dist/react/types.js +58 -0
  315. package/dist/react/types.js.map +1 -0
  316. package/dist/react/utils/index.d.ts +247 -0
  317. package/dist/react/utils/index.js +423 -0
  318. package/dist/react/utils/index.js.map +1 -0
  319. package/dist/react/visualizations/EclipseTimerCard.d.ts +17 -0
  320. package/dist/react/visualizations/EclipseTimerCard.js +250 -0
  321. package/dist/react/visualizations/EclipseTimerCard.js.map +1 -0
  322. package/dist/react/visualizations/LinkBudgetCard.d.ts +50 -0
  323. package/dist/react/visualizations/LinkBudgetCard.js +444 -0
  324. package/dist/react/visualizations/LinkBudgetCard.js.map +1 -0
  325. package/dist/react/visualizations/NavBallCard.d.ts +17 -0
  326. package/dist/react/visualizations/NavBallCard.js +243 -0
  327. package/dist/react/visualizations/NavBallCard.js.map +1 -0
  328. package/dist/react/visualizations/PropulsionCard.d.ts +37 -0
  329. package/dist/react/visualizations/PropulsionCard.js +298 -0
  330. package/dist/react/visualizations/PropulsionCard.js.map +1 -0
  331. package/dist/react/visualizations/SensorFootprintCard.d.ts +33 -0
  332. package/dist/react/visualizations/SensorFootprintCard.js +326 -0
  333. package/dist/react/visualizations/SensorFootprintCard.js.map +1 -0
  334. package/dist/react/visualizations/ThermalHeatmapCard.d.ts +38 -0
  335. package/dist/react/visualizations/ThermalHeatmapCard.js +372 -0
  336. package/dist/react/visualizations/ThermalHeatmapCard.js.map +1 -0
  337. package/dist/react/visualizations/index.d.ts +17 -0
  338. package/dist/react.d.ts +1 -0
  339. package/dist/react.js +421 -0
  340. package/dist/react.js.map +1 -0
  341. package/dist/shaders/atmosphere.frag.js +5 -0
  342. package/dist/shaders/atmosphere.frag.js.map +1 -0
  343. package/dist/shaders/atmosphere.vert.js +5 -0
  344. package/dist/shaders/atmosphere.vert.js.map +1 -0
  345. package/dist/shaders/stars.frag.js +5 -0
  346. package/dist/shaders/stars.frag.js.map +1 -0
  347. package/dist/shaders/stars.vert.js +5 -0
  348. package/dist/shaders/stars.vert.js.map +1 -0
  349. package/dist/style.css +143 -0
  350. package/dist/tokens/index.d.ts +296 -0
  351. package/dist/tokens/index.js +263 -0
  352. package/dist/tokens/index.js.map +1 -0
  353. package/dist/tokens/tokens.css +155 -0
  354. package/dist/types/index.d.ts +23 -0
  355. package/dist/types.d.ts +1 -0
  356. package/dist/types.js +2 -0
  357. package/dist/types.js.map +1 -0
  358. package/package.json +220 -0
  359. package/sdk-stub.js +22 -0
@@ -0,0 +1,128 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { memo, forwardRef } from "react";
3
+ import { useBreakpoint } from "./useBreakpoint.js";
4
+ import { resolveResponsive, resolveResponsiveSpacing } from "./responsive.js";
5
+ import { useTheme } from "../../theme/ThemeProvider.js";
6
+ const Flex = memo(forwardRef(function Flex2({
7
+ direction,
8
+ wrap,
9
+ gap,
10
+ rowGap,
11
+ columnGap,
12
+ align,
13
+ justify,
14
+ column = false,
15
+ center = false,
16
+ inline = false,
17
+ style,
18
+ children,
19
+ // Extract BoxProps we handle ourselves
20
+ padding,
21
+ p,
22
+ px,
23
+ py,
24
+ pt,
25
+ pr,
26
+ pb,
27
+ pl,
28
+ margin,
29
+ m,
30
+ mx,
31
+ my,
32
+ mt,
33
+ mr,
34
+ mb,
35
+ ml,
36
+ background,
37
+ border,
38
+ borderRadius,
39
+ shadow,
40
+ display: _display,
41
+ width,
42
+ height,
43
+ minWidth,
44
+ minHeight,
45
+ maxWidth,
46
+ maxHeight,
47
+ overflow,
48
+ position,
49
+ flex: flexProp,
50
+ flexGrow,
51
+ flexShrink,
52
+ as: Component = "div",
53
+ ...rest
54
+ }, ref) {
55
+ const { tokens } = useTheme();
56
+ const { breakpoint } = useBreakpoint();
57
+ const resolveSpacing = (val) => resolveResponsiveSpacing(val, breakpoint, tokens);
58
+ const paddingAll = resolveSpacing(padding ?? p);
59
+ const paddingXVal = resolveSpacing(px);
60
+ const paddingYVal = resolveSpacing(py);
61
+ const marginAll = resolveSpacing(margin ?? m);
62
+ const marginXVal = resolveSpacing(mx);
63
+ const marginYVal = resolveSpacing(my);
64
+ const bgMap = {
65
+ base: tokens.colors.background.base,
66
+ surface: tokens.colors.background.surface,
67
+ elevated: tokens.colors.background.elevated,
68
+ overlay: tokens.colors.background.overlay
69
+ };
70
+ const resolveSize = (val) => {
71
+ if (val === void 0) return void 0;
72
+ if (typeof val === "number") return `${val}px`;
73
+ return val;
74
+ };
75
+ const resolvedDirection = column ? "column" : resolveResponsive(direction, breakpoint) ?? "row";
76
+ const resolvedGap = resolveSpacing(gap);
77
+ const resolvedRowGap = resolveSpacing(rowGap);
78
+ const resolvedColumnGap = resolveSpacing(columnGap);
79
+ const computedStyle = {
80
+ display: inline ? "inline-flex" : "flex",
81
+ flexDirection: resolvedDirection,
82
+ flexWrap: resolveResponsive(wrap, breakpoint),
83
+ ...resolvedGap !== void 0 ? { gap: resolvedGap } : {},
84
+ ...resolvedRowGap !== void 0 ? { rowGap: resolvedRowGap } : {},
85
+ ...resolvedColumnGap !== void 0 ? { columnGap: resolvedColumnGap } : {},
86
+ alignItems: center ? "center" : resolveResponsive(align, breakpoint),
87
+ justifyContent: center ? "center" : resolveResponsive(justify, breakpoint),
88
+ // Padding
89
+ ...paddingAll ? { padding: paddingAll } : {},
90
+ ...paddingXVal ? { paddingLeft: paddingXVal, paddingRight: paddingXVal } : {},
91
+ ...paddingYVal ? { paddingTop: paddingYVal, paddingBottom: paddingYVal } : {},
92
+ ...resolveSpacing(pt) ? { paddingTop: resolveSpacing(pt) } : {},
93
+ ...resolveSpacing(pr) ? { paddingRight: resolveSpacing(pr) } : {},
94
+ ...resolveSpacing(pb) ? { paddingBottom: resolveSpacing(pb) } : {},
95
+ ...resolveSpacing(pl) ? { paddingLeft: resolveSpacing(pl) } : {},
96
+ // Margin
97
+ ...marginAll ? { margin: marginAll } : {},
98
+ ...marginXVal ? { marginLeft: marginXVal, marginRight: marginXVal } : {},
99
+ ...marginYVal ? { marginTop: marginYVal, marginBottom: marginYVal } : {},
100
+ ...resolveSpacing(mt) ? { marginTop: resolveSpacing(mt) } : {},
101
+ ...resolveSpacing(mr) ? { marginRight: resolveSpacing(mr) } : {},
102
+ ...resolveSpacing(mb) ? { marginBottom: resolveSpacing(mb) } : {},
103
+ ...resolveSpacing(ml) ? { marginLeft: resolveSpacing(ml) } : {},
104
+ // Visual
105
+ ...background ? { backgroundColor: bgMap[background] || background } : {},
106
+ ...border ? { border: border === true ? `1px solid ${tokens.colors.border.default}` : border } : {},
107
+ ...borderRadius ? { borderRadius: tokens.borderRadius[borderRadius] || borderRadius } : {},
108
+ ...shadow && shadow !== "glow" ? { boxShadow: tokens.shadows[shadow] || shadow } : {},
109
+ // Size
110
+ width: resolveSize(resolveResponsive(width, breakpoint)),
111
+ height: resolveSize(resolveResponsive(height, breakpoint)),
112
+ minWidth: resolveSize(minWidth),
113
+ minHeight: resolveSize(minHeight),
114
+ maxWidth: resolveSize(maxWidth),
115
+ maxHeight: resolveSize(maxHeight),
116
+ overflow,
117
+ position,
118
+ flex: flexProp,
119
+ flexGrow,
120
+ flexShrink,
121
+ ...style
122
+ };
123
+ return /* @__PURE__ */ jsx(Component, { ref, style: computedStyle, ...rest, children });
124
+ }));
125
+ export {
126
+ Flex
127
+ };
128
+ //# sourceMappingURL=Flex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Flex.js","sources":["../../../../src/react/core/layout/Flex.tsx"],"sourcesContent":["/**\r\n * @zendir/ui - Flex Layout Primitive\r\n * \r\n * Flexbox container with theme-aware spacing and responsive direction/alignment.\r\n * The workhorse layout component for horizontal and vertical arrangements.\r\n * \r\n * Astro UX Compliance:\r\n * - 4px grid spacing tokens\r\n * - Responsive gap for mobile → mission control\r\n * \r\n * @example\r\n * ```tsx\r\n * // Horizontal row with centered items\r\n * <Flex gap=\"md\" align=\"center\">\r\n * <StatusIndicator status=\"normal\" />\r\n * <Body1>All Systems Nominal</Body1>\r\n * </Flex>\r\n * \r\n * // Vertical column, responsive gap\r\n * <Flex direction=\"column\" gap={['sm', 'md', 'lg']}>\r\n * <TelemetryCard />\r\n * <LinkBudgetCard />\r\n * </Flex>\r\n * \r\n * // Space between items\r\n * <Flex justify=\"space-between\" align=\"center\">\r\n * <H3>Telemetry</H3>\r\n * <Button variant=\"secondary\">Refresh</Button>\r\n * </Flex>\r\n * ```\r\n */\r\n\r\nimport React, { memo, forwardRef } from 'react';\r\nimport { useTheme } from '../../theme';\r\nimport { useBreakpoint } from './useBreakpoint';\r\nimport { resolveResponsiveSpacing, resolveResponsive } from './responsive';\r\nimport type { ResponsiveValue } from './useBreakpoint';\r\nimport type { SpacingToken } from './responsive';\r\nimport type { BoxProps } from './Box';\r\n\r\ntype SpacingInput = SpacingToken | string | number;\r\n\r\nexport interface FlexProps extends BoxProps {\r\n /** Flex direction */\r\n direction?: ResponsiveValue<'row' | 'column' | 'row-reverse' | 'column-reverse'>;\r\n /** Flex wrap */\r\n wrap?: ResponsiveValue<'nowrap' | 'wrap' | 'wrap-reverse'>;\r\n /** Gap between children (spacing token, px number, or CSS string) */\r\n gap?: ResponsiveValue<SpacingInput>;\r\n /** Row gap (overrides gap for rows) */\r\n rowGap?: ResponsiveValue<SpacingInput>;\r\n /** Column gap (overrides gap for columns) */\r\n columnGap?: ResponsiveValue<SpacingInput>;\r\n /** Align items (cross-axis) */\r\n align?: ResponsiveValue<'flex-start' | 'flex-end' | 'center' | 'baseline' | 'stretch'>;\r\n /** Justify content (main-axis) */\r\n justify?: ResponsiveValue<'flex-start' | 'flex-end' | 'center' | 'space-between' | 'space-around' | 'space-evenly'>;\r\n /** Shorthand: set both direction=\"column\" */\r\n column?: boolean;\r\n /** Shorthand: center both axes */\r\n center?: boolean;\r\n /** Make flex container inline */\r\n inline?: boolean;\r\n}\r\n\r\nexport const Flex = memo(forwardRef<HTMLDivElement, FlexProps>(function Flex(\r\n {\r\n direction,\r\n wrap,\r\n gap,\r\n rowGap,\r\n columnGap,\r\n align,\r\n justify,\r\n column = false,\r\n center = false,\r\n inline = false,\r\n style,\r\n children,\r\n // Extract BoxProps we handle ourselves\r\n padding, p, px, py, pt, pr, pb, pl,\r\n margin, m, mx, my, mt, mr, mb, ml,\r\n background,\r\n border,\r\n borderRadius,\r\n shadow,\r\n display: _display,\r\n width,\r\n height,\r\n minWidth,\r\n minHeight,\r\n maxWidth,\r\n maxHeight,\r\n overflow,\r\n position,\r\n flex: flexProp,\r\n flexGrow,\r\n flexShrink,\r\n as: Component = 'div',\r\n ...rest\r\n },\r\n ref\r\n): React.ReactElement {\r\n const { tokens } = useTheme();\r\n const { breakpoint } = useBreakpoint();\r\n \r\n const resolveSpacing = (val: ResponsiveValue<SpacingInput> | undefined) =>\r\n resolveResponsiveSpacing(val, breakpoint, tokens);\r\n \r\n // Resolve padding\r\n const paddingAll = resolveSpacing(padding ?? p);\r\n const paddingXVal = resolveSpacing(px);\r\n const paddingYVal = resolveSpacing(py);\r\n \r\n // Resolve margin\r\n const marginAll = resolveSpacing(margin ?? m);\r\n const marginXVal = resolveSpacing(mx);\r\n const marginYVal = resolveSpacing(my);\r\n\r\n // Background color resolution\r\n const bgMap: Record<string, string> = {\r\n base: tokens.colors.background.base,\r\n surface: tokens.colors.background.surface,\r\n elevated: tokens.colors.background.elevated,\r\n overlay: tokens.colors.background.overlay,\r\n };\r\n \r\n const resolveSize = (val: string | number | undefined): string | undefined => {\r\n if (val === undefined) return undefined;\r\n if (typeof val === 'number') return `${val}px`;\r\n return val;\r\n };\r\n\r\n const resolvedDirection = column\r\n ? 'column'\r\n : resolveResponsive(direction, breakpoint) ?? 'row';\r\n\r\n // Resolve gap values — use conditional spreads to avoid setting\r\n // rowGap/columnGap to undefined, which clears the gap shorthand\r\n // in browsers (setting `style.rowGap = ''` removes the value\r\n // that `style.gap` set for row-gap).\r\n const resolvedGap = resolveSpacing(gap);\r\n const resolvedRowGap = resolveSpacing(rowGap);\r\n const resolvedColumnGap = resolveSpacing(columnGap);\r\n\r\n const computedStyle: React.CSSProperties = {\r\n display: inline ? 'inline-flex' : 'flex',\r\n flexDirection: resolvedDirection,\r\n flexWrap: resolveResponsive(wrap, breakpoint),\r\n ...(resolvedGap !== undefined ? { gap: resolvedGap } : {}),\r\n ...(resolvedRowGap !== undefined ? { rowGap: resolvedRowGap } : {}),\r\n ...(resolvedColumnGap !== undefined ? { columnGap: resolvedColumnGap } : {}),\r\n alignItems: center\r\n ? 'center'\r\n : resolveResponsive(align, breakpoint),\r\n justifyContent: center\r\n ? 'center'\r\n : resolveResponsive(justify, breakpoint),\r\n \r\n // Padding\r\n ...(paddingAll ? { padding: paddingAll } : {}),\r\n ...(paddingXVal ? { paddingLeft: paddingXVal, paddingRight: paddingXVal } : {}),\r\n ...(paddingYVal ? { paddingTop: paddingYVal, paddingBottom: paddingYVal } : {}),\r\n ...(resolveSpacing(pt) ? { paddingTop: resolveSpacing(pt) } : {}),\r\n ...(resolveSpacing(pr) ? { paddingRight: resolveSpacing(pr) } : {}),\r\n ...(resolveSpacing(pb) ? { paddingBottom: resolveSpacing(pb) } : {}),\r\n ...(resolveSpacing(pl) ? { paddingLeft: resolveSpacing(pl) } : {}),\r\n \r\n // Margin\r\n ...(marginAll ? { margin: marginAll } : {}),\r\n ...(marginXVal ? { marginLeft: marginXVal, marginRight: marginXVal } : {}),\r\n ...(marginYVal ? { marginTop: marginYVal, marginBottom: marginYVal } : {}),\r\n ...(resolveSpacing(mt) ? { marginTop: resolveSpacing(mt) } : {}),\r\n ...(resolveSpacing(mr) ? { marginRight: resolveSpacing(mr) } : {}),\r\n ...(resolveSpacing(mb) ? { marginBottom: resolveSpacing(mb) } : {}),\r\n ...(resolveSpacing(ml) ? { marginLeft: resolveSpacing(ml) } : {}),\r\n \r\n // Visual\r\n ...(background ? { backgroundColor: bgMap[background] || background } : {}),\r\n ...(border ? { border: border === true ? `1px solid ${tokens.colors.border.default}` : border as string } : {}),\r\n ...(borderRadius ? { borderRadius: (tokens.borderRadius as Record<string, string>)[borderRadius as string] || borderRadius } : {}),\r\n ...(shadow && shadow !== 'glow' ? { boxShadow: (tokens.shadows as unknown as Record<string, string>)[shadow as string] || shadow } : {}),\r\n \r\n // Size\r\n width: resolveSize(resolveResponsive(width, breakpoint)),\r\n height: resolveSize(resolveResponsive(height, breakpoint)),\r\n minWidth: resolveSize(minWidth),\r\n minHeight: resolveSize(minHeight),\r\n maxWidth: resolveSize(maxWidth),\r\n maxHeight: resolveSize(maxHeight),\r\n overflow,\r\n position,\r\n flex: flexProp,\r\n flexGrow,\r\n flexShrink,\r\n \r\n ...style,\r\n };\r\n \r\n return (\r\n <Component ref={ref} style={computedStyle} {...rest}>\r\n {children}\r\n </Component>\r\n );\r\n}));\r\n\r\nexport default Flex;\r\n"],"names":["Flex"],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import { default as React } from 'react';
2
+ import { ResponsiveValue } from './useBreakpoint';
3
+ import { SpacingToken } from './responsive';
4
+ import { BoxProps } from './Box';
5
+
6
+ type SpacingInput = SpacingToken | string | number;
7
+ export interface GridProps extends Omit<BoxProps, 'display'> {
8
+ /** Number of equal columns (responsive) */
9
+ columns?: ResponsiveValue<number>;
10
+ /** Auto-fit: minimum column width in px. Creates `repeat(auto-fit, minmax(Npx, 1fr))` */
11
+ autoFit?: number;
12
+ /** Auto-fill: minimum column width in px. Creates `repeat(auto-fill, minmax(Npx, 1fr))` */
13
+ autoFill?: number;
14
+ /** Explicit grid-template-columns CSS value */
15
+ template?: ResponsiveValue<string>;
16
+ /** Explicit grid-template-rows CSS value */
17
+ rows?: string;
18
+ /** Gap between grid items */
19
+ gap?: ResponsiveValue<SpacingInput>;
20
+ /** Row gap (overrides gap for rows) */
21
+ rowGap?: ResponsiveValue<SpacingInput>;
22
+ /** Column gap (overrides gap for columns) */
23
+ columnGap?: ResponsiveValue<SpacingInput>;
24
+ /** Align items (cross-axis per cell) */
25
+ align?: 'start' | 'end' | 'center' | 'stretch' | 'baseline';
26
+ /** Justify items (main-axis per cell) */
27
+ justifyItems?: 'start' | 'end' | 'center' | 'stretch';
28
+ /** Align content (cross-axis for the grid as a whole) */
29
+ alignContent?: 'start' | 'end' | 'center' | 'stretch' | 'space-between' | 'space-around' | 'space-evenly';
30
+ /** Justify content (main-axis for the grid as a whole) */
31
+ justifyContent?: 'start' | 'end' | 'center' | 'stretch' | 'space-between' | 'space-around' | 'space-evenly';
32
+ /** Make grid inline */
33
+ inline?: boolean;
34
+ }
35
+ export declare const Grid: React.MemoExoticComponent<React.ForwardRefExoticComponent<GridProps & React.RefAttributes<HTMLDivElement>>>;
36
+ export default Grid;
@@ -0,0 +1,142 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { memo, forwardRef } from "react";
3
+ import { useBreakpoint } from "./useBreakpoint.js";
4
+ import { resolveResponsive, resolveResponsiveSpacing } from "./responsive.js";
5
+ import { useTheme } from "../../theme/ThemeProvider.js";
6
+ const Grid = memo(forwardRef(function Grid2({
7
+ columns,
8
+ autoFit,
9
+ autoFill,
10
+ template,
11
+ rows,
12
+ gap,
13
+ rowGap,
14
+ columnGap,
15
+ align,
16
+ justifyItems,
17
+ alignContent,
18
+ justifyContent,
19
+ inline = false,
20
+ // Box props
21
+ padding,
22
+ p,
23
+ px,
24
+ py,
25
+ pt,
26
+ pr,
27
+ pb,
28
+ pl,
29
+ margin,
30
+ m,
31
+ mx,
32
+ my,
33
+ mt,
34
+ mr,
35
+ mb,
36
+ ml,
37
+ background,
38
+ border,
39
+ borderRadius,
40
+ shadow,
41
+ width,
42
+ height,
43
+ minWidth,
44
+ minHeight,
45
+ maxWidth,
46
+ maxHeight,
47
+ overflow,
48
+ position,
49
+ flex,
50
+ flexGrow,
51
+ flexShrink,
52
+ as: Component = "div",
53
+ style,
54
+ children,
55
+ ...rest
56
+ }, ref) {
57
+ const { tokens } = useTheme();
58
+ const { breakpoint } = useBreakpoint();
59
+ const resolveSpacing = (val) => resolveResponsiveSpacing(val, breakpoint, tokens);
60
+ let gridTemplateColumns;
61
+ if (autoFit) {
62
+ gridTemplateColumns = `repeat(auto-fit, minmax(${autoFit}px, 1fr))`;
63
+ } else if (autoFill) {
64
+ gridTemplateColumns = `repeat(auto-fill, minmax(${autoFill}px, 1fr))`;
65
+ } else if (template) {
66
+ gridTemplateColumns = resolveResponsive(template, breakpoint);
67
+ } else if (columns !== void 0) {
68
+ const cols = resolveResponsive(columns, breakpoint);
69
+ gridTemplateColumns = cols ? `repeat(${cols}, 1fr)` : void 0;
70
+ }
71
+ const bgMap = {
72
+ base: tokens.colors.background.base,
73
+ surface: tokens.colors.background.surface,
74
+ elevated: tokens.colors.background.elevated,
75
+ overlay: tokens.colors.background.overlay
76
+ };
77
+ const resolveSize = (val) => {
78
+ if (val === void 0) return void 0;
79
+ if (typeof val === "number") return `${val}px`;
80
+ return val;
81
+ };
82
+ const paddingAll = resolveSpacing(padding ?? p);
83
+ const paddingXVal = resolveSpacing(px);
84
+ const paddingYVal = resolveSpacing(py);
85
+ const marginAll = resolveSpacing(margin ?? m);
86
+ const marginXVal = resolveSpacing(mx);
87
+ const marginYVal = resolveSpacing(my);
88
+ const resolvedGap = resolveSpacing(gap);
89
+ const resolvedRowGap = resolveSpacing(rowGap);
90
+ const resolvedColumnGap = resolveSpacing(columnGap);
91
+ const computedStyle = {
92
+ display: inline ? "inline-grid" : "grid",
93
+ gridTemplateColumns,
94
+ gridTemplateRows: rows,
95
+ ...resolvedGap !== void 0 ? { gap: resolvedGap } : {},
96
+ ...resolvedRowGap !== void 0 ? { rowGap: resolvedRowGap } : {},
97
+ ...resolvedColumnGap !== void 0 ? { columnGap: resolvedColumnGap } : {},
98
+ alignItems: align,
99
+ justifyItems,
100
+ alignContent,
101
+ justifyContent,
102
+ // Padding
103
+ ...paddingAll ? { padding: paddingAll } : {},
104
+ ...paddingXVal ? { paddingLeft: paddingXVal, paddingRight: paddingXVal } : {},
105
+ ...paddingYVal ? { paddingTop: paddingYVal, paddingBottom: paddingYVal } : {},
106
+ ...resolveSpacing(pt) ? { paddingTop: resolveSpacing(pt) } : {},
107
+ ...resolveSpacing(pr) ? { paddingRight: resolveSpacing(pr) } : {},
108
+ ...resolveSpacing(pb) ? { paddingBottom: resolveSpacing(pb) } : {},
109
+ ...resolveSpacing(pl) ? { paddingLeft: resolveSpacing(pl) } : {},
110
+ // Margin
111
+ ...marginAll ? { margin: marginAll } : {},
112
+ ...marginXVal ? { marginLeft: marginXVal, marginRight: marginXVal } : {},
113
+ ...marginYVal ? { marginTop: marginYVal, marginBottom: marginYVal } : {},
114
+ ...resolveSpacing(mt) ? { marginTop: resolveSpacing(mt) } : {},
115
+ ...resolveSpacing(mr) ? { marginRight: resolveSpacing(mr) } : {},
116
+ ...resolveSpacing(mb) ? { marginBottom: resolveSpacing(mb) } : {},
117
+ ...resolveSpacing(ml) ? { marginLeft: resolveSpacing(ml) } : {},
118
+ // Visual
119
+ ...background ? { backgroundColor: bgMap[background] || background } : {},
120
+ ...border ? { border: border === true ? `1px solid ${tokens.colors.border.default}` : border } : {},
121
+ ...borderRadius ? { borderRadius: tokens.borderRadius[borderRadius] || borderRadius } : {},
122
+ ...shadow && shadow !== "glow" ? { boxShadow: tokens.shadows[shadow] || shadow } : {},
123
+ // Size
124
+ width: resolveSize(resolveResponsive(width, breakpoint)),
125
+ height: resolveSize(resolveResponsive(height, breakpoint)),
126
+ minWidth: resolveSize(minWidth),
127
+ minHeight: resolveSize(minHeight),
128
+ maxWidth: resolveSize(maxWidth),
129
+ maxHeight: resolveSize(maxHeight),
130
+ overflow,
131
+ position,
132
+ flex,
133
+ flexGrow,
134
+ flexShrink,
135
+ ...style
136
+ };
137
+ return /* @__PURE__ */ jsx(Component, { ref, style: computedStyle, ...rest, children });
138
+ }));
139
+ export {
140
+ Grid
141
+ };
142
+ //# sourceMappingURL=Grid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Grid.js","sources":["../../../../src/react/core/layout/Grid.tsx"],"sourcesContent":["/**\r\n * @zendir/ui - Grid Layout Primitive\r\n * \r\n * CSS Grid container with responsive columns and auto-fit support.\r\n * Designed for operator dashboard layouts: telemetry grids, card layouts,\r\n * multi-panel mission control views.\r\n * \r\n * Astro UX Compliance:\r\n * - 4px grid spacing tokens\r\n * - Responsive column count for mobile → 4K mission control\r\n * \r\n * @example\r\n * ```tsx\r\n * // Fixed responsive columns\r\n * <Grid columns={[1, 2, 3]} gap=\"md\">\r\n * <TelemetryCard />\r\n * <LinkBudgetCard />\r\n * <SpacecraftCard />\r\n * </Grid>\r\n * \r\n * // Auto-fit: as many 300px-min columns as fit\r\n * <Grid autoFit={300} gap=\"md\">\r\n * {telemetryItems.map(item => <DataValue key={item.key} {...item} />)}\r\n * </Grid>\r\n * \r\n * // Template-based for complex layouts\r\n * <Grid template=\"1fr 2fr 1fr\" rows=\"auto 1fr\" gap=\"md\">\r\n * <SideNav />\r\n * <MainContent />\r\n * <DetailPanel />\r\n * </Grid>\r\n * ```\r\n */\r\n\r\nimport React, { memo, forwardRef } from 'react';\r\nimport { useTheme } from '../../theme';\r\nimport { useBreakpoint } from './useBreakpoint';\r\nimport { resolveResponsiveSpacing, resolveResponsive } from './responsive';\r\nimport type { ResponsiveValue } from './useBreakpoint';\r\nimport type { SpacingToken } from './responsive';\r\nimport type { BoxProps } from './Box';\r\n\r\ntype SpacingInput = SpacingToken | string | number;\r\n\r\nexport interface GridProps extends Omit<BoxProps, 'display'> {\r\n /** Number of equal columns (responsive) */\r\n columns?: ResponsiveValue<number>;\r\n /** Auto-fit: minimum column width in px. Creates `repeat(auto-fit, minmax(Npx, 1fr))` */\r\n autoFit?: number;\r\n /** Auto-fill: minimum column width in px. Creates `repeat(auto-fill, minmax(Npx, 1fr))` */\r\n autoFill?: number;\r\n /** Explicit grid-template-columns CSS value */\r\n template?: ResponsiveValue<string>;\r\n /** Explicit grid-template-rows CSS value */\r\n rows?: string;\r\n /** Gap between grid items */\r\n gap?: ResponsiveValue<SpacingInput>;\r\n /** Row gap (overrides gap for rows) */\r\n rowGap?: ResponsiveValue<SpacingInput>;\r\n /** Column gap (overrides gap for columns) */\r\n columnGap?: ResponsiveValue<SpacingInput>;\r\n /** Align items (cross-axis per cell) */\r\n align?: 'start' | 'end' | 'center' | 'stretch' | 'baseline';\r\n /** Justify items (main-axis per cell) */\r\n justifyItems?: 'start' | 'end' | 'center' | 'stretch';\r\n /** Align content (cross-axis for the grid as a whole) */\r\n alignContent?: 'start' | 'end' | 'center' | 'stretch' | 'space-between' | 'space-around' | 'space-evenly';\r\n /** Justify content (main-axis for the grid as a whole) */\r\n justifyContent?: 'start' | 'end' | 'center' | 'stretch' | 'space-between' | 'space-around' | 'space-evenly';\r\n /** Make grid inline */\r\n inline?: boolean;\r\n}\r\n\r\nexport const Grid = memo(forwardRef<HTMLDivElement, GridProps>(function Grid(\r\n {\r\n columns,\r\n autoFit,\r\n autoFill,\r\n template,\r\n rows,\r\n gap,\r\n rowGap,\r\n columnGap,\r\n align,\r\n justifyItems,\r\n alignContent,\r\n justifyContent,\r\n inline = false,\r\n // Box props\r\n padding, p, px, py, pt, pr, pb, pl,\r\n margin, m, mx, my, mt, mr, mb, ml,\r\n background,\r\n border,\r\n borderRadius,\r\n shadow,\r\n width,\r\n height,\r\n minWidth,\r\n minHeight,\r\n maxWidth,\r\n maxHeight,\r\n overflow,\r\n position,\r\n flex,\r\n flexGrow,\r\n flexShrink,\r\n as: Component = 'div',\r\n style,\r\n children,\r\n ...rest\r\n },\r\n ref\r\n): React.ReactElement {\r\n const { tokens } = useTheme();\r\n const { breakpoint } = useBreakpoint();\r\n \r\n const resolveSpacing = (val: ResponsiveValue<SpacingInput> | undefined) =>\r\n resolveResponsiveSpacing(val, breakpoint, tokens);\r\n \r\n // Determine grid-template-columns\r\n let gridTemplateColumns: string | undefined;\r\n \r\n if (autoFit) {\r\n gridTemplateColumns = `repeat(auto-fit, minmax(${autoFit}px, 1fr))`;\r\n } else if (autoFill) {\r\n gridTemplateColumns = `repeat(auto-fill, minmax(${autoFill}px, 1fr))`;\r\n } else if (template) {\r\n gridTemplateColumns = resolveResponsive(template, breakpoint);\r\n } else if (columns !== undefined) {\r\n const cols = resolveResponsive(columns, breakpoint);\r\n gridTemplateColumns = cols ? `repeat(${cols}, 1fr)` : undefined;\r\n }\r\n \r\n // Background resolution\r\n const bgMap: Record<string, string> = {\r\n base: tokens.colors.background.base,\r\n surface: tokens.colors.background.surface,\r\n elevated: tokens.colors.background.elevated,\r\n overlay: tokens.colors.background.overlay,\r\n };\r\n \r\n const resolveSize = (val: string | number | undefined): string | undefined => {\r\n if (val === undefined) return undefined;\r\n if (typeof val === 'number') return `${val}px`;\r\n return val;\r\n };\r\n \r\n // Resolve padding\r\n const paddingAll = resolveSpacing(padding ?? p);\r\n const paddingXVal = resolveSpacing(px);\r\n const paddingYVal = resolveSpacing(py);\r\n \r\n // Resolve margin\r\n const marginAll = resolveSpacing(margin ?? m);\r\n const marginXVal = resolveSpacing(mx);\r\n const marginYVal = resolveSpacing(my);\r\n \r\n // Resolve gap values — use conditional spreads to avoid setting\r\n // rowGap/columnGap to undefined, which clears the gap shorthand\r\n // in browsers (setting `style.rowGap = ''` removes the value\r\n // that `style.gap` set for row-gap).\r\n const resolvedGap = resolveSpacing(gap);\r\n const resolvedRowGap = resolveSpacing(rowGap);\r\n const resolvedColumnGap = resolveSpacing(columnGap);\r\n\r\n const computedStyle: React.CSSProperties = {\r\n display: inline ? 'inline-grid' : 'grid',\r\n gridTemplateColumns,\r\n gridTemplateRows: rows,\r\n ...(resolvedGap !== undefined ? { gap: resolvedGap } : {}),\r\n ...(resolvedRowGap !== undefined ? { rowGap: resolvedRowGap } : {}),\r\n ...(resolvedColumnGap !== undefined ? { columnGap: resolvedColumnGap } : {}),\r\n alignItems: align,\r\n justifyItems,\r\n alignContent,\r\n justifyContent,\r\n \r\n // Padding\r\n ...(paddingAll ? { padding: paddingAll } : {}),\r\n ...(paddingXVal ? { paddingLeft: paddingXVal, paddingRight: paddingXVal } : {}),\r\n ...(paddingYVal ? { paddingTop: paddingYVal, paddingBottom: paddingYVal } : {}),\r\n ...(resolveSpacing(pt) ? { paddingTop: resolveSpacing(pt) } : {}),\r\n ...(resolveSpacing(pr) ? { paddingRight: resolveSpacing(pr) } : {}),\r\n ...(resolveSpacing(pb) ? { paddingBottom: resolveSpacing(pb) } : {}),\r\n ...(resolveSpacing(pl) ? { paddingLeft: resolveSpacing(pl) } : {}),\r\n \r\n // Margin\r\n ...(marginAll ? { margin: marginAll } : {}),\r\n ...(marginXVal ? { marginLeft: marginXVal, marginRight: marginXVal } : {}),\r\n ...(marginYVal ? { marginTop: marginYVal, marginBottom: marginYVal } : {}),\r\n ...(resolveSpacing(mt) ? { marginTop: resolveSpacing(mt) } : {}),\r\n ...(resolveSpacing(mr) ? { marginRight: resolveSpacing(mr) } : {}),\r\n ...(resolveSpacing(mb) ? { marginBottom: resolveSpacing(mb) } : {}),\r\n ...(resolveSpacing(ml) ? { marginLeft: resolveSpacing(ml) } : {}),\r\n \r\n // Visual\r\n ...(background ? { backgroundColor: bgMap[background] || background } : {}),\r\n ...(border ? { border: border === true ? `1px solid ${tokens.colors.border.default}` : border as string } : {}),\r\n ...(borderRadius ? { borderRadius: (tokens.borderRadius as Record<string, string>)[borderRadius as string] || borderRadius } : {}),\r\n ...(shadow && shadow !== 'glow' ? { boxShadow: (tokens.shadows as unknown as Record<string, string>)[shadow as string] || shadow } : {}),\r\n \r\n // Size\r\n width: resolveSize(resolveResponsive(width, breakpoint)),\r\n height: resolveSize(resolveResponsive(height, breakpoint)),\r\n minWidth: resolveSize(minWidth),\r\n minHeight: resolveSize(minHeight),\r\n maxWidth: resolveSize(maxWidth),\r\n maxHeight: resolveSize(maxHeight),\r\n overflow,\r\n position,\r\n flex,\r\n flexGrow,\r\n flexShrink,\r\n \r\n ...style,\r\n };\r\n \r\n return (\r\n <Component ref={ref} style={computedStyle} {...rest}>\r\n {children}\r\n </Component>\r\n );\r\n}));\r\n\r\nexport default Grid;\r\n"],"names":["Grid"],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { default as React } from 'react';
2
+
3
+ export interface SpacerProps {
4
+ /** Fixed size instead of flexible (spacing token compatible, number → px) */
5
+ size?: string | number;
6
+ }
7
+ export declare const Spacer: React.NamedExoticComponent<SpacerProps>;
8
+ export default Spacer;
@@ -0,0 +1,31 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { memo } from "react";
3
+ const Spacer = memo(function Spacer2({ size }) {
4
+ const resolvedSize = typeof size === "number" ? `${size}px` : size;
5
+ if (resolvedSize) {
6
+ return /* @__PURE__ */ jsx(
7
+ "div",
8
+ {
9
+ "aria-hidden": "true",
10
+ style: {
11
+ flexShrink: 0,
12
+ width: resolvedSize,
13
+ height: resolvedSize
14
+ }
15
+ }
16
+ );
17
+ }
18
+ return /* @__PURE__ */ jsx(
19
+ "div",
20
+ {
21
+ "aria-hidden": "true",
22
+ style: {
23
+ flex: "1 1 0%"
24
+ }
25
+ }
26
+ );
27
+ });
28
+ export {
29
+ Spacer
30
+ };
31
+ //# sourceMappingURL=Spacer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Spacer.js","sources":["../../../../src/react/core/layout/Spacer.tsx"],"sourcesContent":["/**\r\n * @zendir/ui - Spacer Layout Primitive\r\n * \r\n * Flexible space filler for Flex and Stack layouts.\r\n * Expands to fill available space, pushing siblings apart.\r\n * \r\n * @example\r\n * ```tsx\r\n * <Flex align=\"center\" gap=\"sm\">\r\n * <H3>Telemetry</H3>\r\n * <Spacer />\r\n * <Button variant=\"secondary\" size=\"small\">Refresh</Button>\r\n * <Button size=\"small\">Export</Button>\r\n * </Flex>\r\n * ```\r\n */\r\n\r\nimport React, { memo } from 'react';\r\n\r\nexport interface SpacerProps {\r\n /** Fixed size instead of flexible (spacing token compatible, number → px) */\r\n size?: string | number;\r\n}\r\n\r\nexport const Spacer = memo(function Spacer({ size }: SpacerProps): React.ReactElement {\r\n const resolvedSize = typeof size === 'number' ? `${size}px` : size;\r\n \r\n if (resolvedSize) {\r\n return (\r\n <div\r\n aria-hidden=\"true\"\r\n style={{\r\n flexShrink: 0,\r\n width: resolvedSize,\r\n height: resolvedSize,\r\n }}\r\n />\r\n );\r\n }\r\n \r\n return (\r\n <div\r\n aria-hidden=\"true\"\r\n style={{\r\n flex: '1 1 0%',\r\n }}\r\n />\r\n );\r\n});\r\n\r\nexport default Spacer;\r\n"],"names":["Spacer"],"mappings":";;AAwBO,MAAM,SAAS,KAAK,SAASA,QAAO,EAAE,QAAyC;AACpF,QAAM,eAAe,OAAO,SAAS,WAAW,GAAG,IAAI,OAAO;AAE9D,MAAI,cAAc;AAChB,WACE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,eAAY;AAAA,QACZ,OAAO;AAAA,UACL,YAAY;AAAA,UACZ,OAAO;AAAA,UACP,QAAQ;AAAA,QAAA;AAAA,MACV;AAAA,IAAA;AAAA,EAGN;AAEA,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,eAAY;AAAA,MACZ,OAAO;AAAA,QACL,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,EAAA;AAGN,CAAC;"}
@@ -0,0 +1,54 @@
1
+ import { default as React } from 'react';
2
+ import { ResponsiveValue } from './useBreakpoint';
3
+ import { SpacingToken } from './responsive';
4
+
5
+ type SpacingInput = SpacingToken | string | number;
6
+ export interface StackProps extends React.HTMLAttributes<HTMLDivElement> {
7
+ /** Element type to render */
8
+ as?: React.ElementType;
9
+ /** Stack direction */
10
+ direction?: ResponsiveValue<'row' | 'column' | 'row-reverse' | 'column-reverse'>;
11
+ /** Space between children (spacing token, px, or CSS string) */
12
+ spacing?: ResponsiveValue<SpacingInput>;
13
+ /** Align items (cross-axis) */
14
+ align?: 'flex-start' | 'flex-end' | 'center' | 'baseline' | 'stretch';
15
+ /** Justify content (main-axis) */
16
+ justify?: 'flex-start' | 'flex-end' | 'center' | 'space-between' | 'space-around' | 'space-evenly';
17
+ /** Flex wrap */
18
+ wrap?: 'nowrap' | 'wrap' | 'wrap-reverse';
19
+ /** Full width */
20
+ fullWidth?: boolean;
21
+ /** Full height */
22
+ fullHeight?: boolean;
23
+ /** Divider between items — renders a themed line */
24
+ divider?: boolean;
25
+ /** Children */
26
+ children?: React.ReactNode;
27
+ }
28
+ export declare const Stack: React.MemoExoticComponent<React.ForwardRefExoticComponent<StackProps & React.RefAttributes<HTMLDivElement>>>;
29
+ /**
30
+ * Horizontal Stack — `<Stack direction="row">` shorthand.
31
+ *
32
+ * @example
33
+ * ```tsx
34
+ * <HStack spacing="sm" align="center">
35
+ * <Icon name="satellite" />
36
+ * <Body1>SAT-1</Body1>
37
+ * <Badge status="normal">Nominal</Badge>
38
+ * </HStack>
39
+ * ```
40
+ */
41
+ export declare const HStack: React.MemoExoticComponent<React.ForwardRefExoticComponent<Omit<StackProps, "direction"> & React.RefAttributes<HTMLDivElement>>>;
42
+ /**
43
+ * Vertical Stack — `<Stack direction="column">` shorthand.
44
+ *
45
+ * @example
46
+ * ```tsx
47
+ * <VStack spacing="md">
48
+ * <TelemetryCard />
49
+ * <LinkBudgetCard />
50
+ * </VStack>
51
+ * ```
52
+ */
53
+ export declare const VStack: React.MemoExoticComponent<React.ForwardRefExoticComponent<Omit<StackProps, "direction"> & React.RefAttributes<HTMLDivElement>>>;
54
+ export default Stack;
@@ -0,0 +1,74 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import React, { memo, forwardRef } from "react";
3
+ import { useBreakpoint } from "./useBreakpoint.js";
4
+ import { resolveResponsiveSpacing } from "./responsive.js";
5
+ import { useTheme } from "../../theme/ThemeProvider.js";
6
+ const Stack = memo(forwardRef(function Stack2({
7
+ as: Component = "div",
8
+ direction = "column",
9
+ spacing = "md",
10
+ align,
11
+ justify,
12
+ wrap,
13
+ fullWidth = false,
14
+ fullHeight = false,
15
+ divider = false,
16
+ style,
17
+ children,
18
+ ...rest
19
+ }, ref) {
20
+ const { tokens } = useTheme();
21
+ const { breakpoint } = useBreakpoint();
22
+ const resolvedSpacing = resolveResponsiveSpacing(spacing, breakpoint, tokens);
23
+ const resolvedDirection = Array.isArray(direction) ? direction[Math.min(["base", "sm", "md", "lg", "xl", "xxl"].indexOf(breakpoint), direction.length - 1)] ?? direction[direction.length - 1] : direction;
24
+ const isVertical = resolvedDirection === "column" || resolvedDirection === "column-reverse";
25
+ const computedStyle = {
26
+ display: "flex",
27
+ flexDirection: resolvedDirection,
28
+ ...divider || !resolvedSpacing ? {} : { gap: resolvedSpacing },
29
+ alignItems: align,
30
+ justifyContent: justify,
31
+ flexWrap: wrap,
32
+ ...fullWidth ? { width: "100%" } : {},
33
+ ...fullHeight ? { height: "100%" } : {},
34
+ ...style
35
+ };
36
+ if (divider) {
37
+ const items = React.Children.toArray(children).filter(Boolean);
38
+ const dividerStyle = isVertical ? {
39
+ width: "100%",
40
+ height: "1px",
41
+ backgroundColor: tokens.colors.border.muted,
42
+ flexShrink: 0,
43
+ margin: `${resolvedSpacing} 0`
44
+ } : {
45
+ height: "100%",
46
+ width: "1px",
47
+ backgroundColor: tokens.colors.border.muted,
48
+ flexShrink: 0,
49
+ alignSelf: "stretch",
50
+ margin: `0 ${resolvedSpacing}`
51
+ };
52
+ return /* @__PURE__ */ jsx(Component, { ref, style: computedStyle, ...rest, children: items.map((child, index) => /* @__PURE__ */ jsxs(React.Fragment, { children: [
53
+ child,
54
+ index < items.length - 1 && /* @__PURE__ */ jsx("div", { style: dividerStyle, "aria-hidden": "true" })
55
+ ] }, index)) });
56
+ }
57
+ return /* @__PURE__ */ jsx(Component, { ref, style: computedStyle, ...rest, children });
58
+ }));
59
+ const HStack = memo(forwardRef(
60
+ function HStack2(props, ref) {
61
+ return /* @__PURE__ */ jsx(Stack, { ref, direction: "row", ...props });
62
+ }
63
+ ));
64
+ const VStack = memo(forwardRef(
65
+ function VStack2(props, ref) {
66
+ return /* @__PURE__ */ jsx(Stack, { ref, direction: "column", ...props });
67
+ }
68
+ ));
69
+ export {
70
+ HStack,
71
+ Stack,
72
+ VStack
73
+ };
74
+ //# sourceMappingURL=Stack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Stack.js","sources":["../../../../src/react/core/layout/Stack.tsx"],"sourcesContent":["/**\r\n * @zendir/ui - Stack Layout Primitives\r\n * \r\n * Consistent spacing stacks — the most common layout pattern in operator dashboards.\r\n * Stack, HStack, and VStack provide directional flex with uniform gaps.\r\n * \r\n * @example\r\n * ```tsx\r\n * // Vertical stack (default)\r\n * <Stack spacing=\"md\">\r\n * <TelemetryCard />\r\n * <LinkBudgetCard />\r\n * <SpacecraftCard />\r\n * </Stack>\r\n * \r\n * // Horizontal stack\r\n * <HStack spacing=\"sm\" align=\"center\">\r\n * <StatusIndicator status=\"normal\" />\r\n * <Body1>Connected</Body1>\r\n * </HStack>\r\n * \r\n * // Responsive spacing\r\n * <VStack spacing={['sm', 'md', 'lg']}>\r\n * <Content />\r\n * </VStack>\r\n * ```\r\n */\r\n\r\nimport React, { memo, forwardRef } from 'react';\r\nimport { useTheme } from '../../theme';\r\nimport { useBreakpoint } from './useBreakpoint';\r\nimport { resolveResponsiveSpacing } from './responsive';\r\nimport type { ResponsiveValue } from './useBreakpoint';\r\nimport type { SpacingToken } from './responsive';\r\n\r\ntype SpacingInput = SpacingToken | string | number;\r\n\r\nexport interface StackProps extends React.HTMLAttributes<HTMLDivElement> {\r\n /** Element type to render */\r\n as?: React.ElementType;\r\n /** Stack direction */\r\n direction?: ResponsiveValue<'row' | 'column' | 'row-reverse' | 'column-reverse'>;\r\n /** Space between children (spacing token, px, or CSS string) */\r\n spacing?: ResponsiveValue<SpacingInput>;\r\n /** Align items (cross-axis) */\r\n align?: 'flex-start' | 'flex-end' | 'center' | 'baseline' | 'stretch';\r\n /** Justify content (main-axis) */\r\n justify?: 'flex-start' | 'flex-end' | 'center' | 'space-between' | 'space-around' | 'space-evenly';\r\n /** Flex wrap */\r\n wrap?: 'nowrap' | 'wrap' | 'wrap-reverse';\r\n /** Full width */\r\n fullWidth?: boolean;\r\n /** Full height */\r\n fullHeight?: boolean;\r\n /** Divider between items — renders a themed line */\r\n divider?: boolean;\r\n /** Children */\r\n children?: React.ReactNode;\r\n}\r\n\r\nexport const Stack = memo(forwardRef<HTMLDivElement, StackProps>(function Stack(\r\n {\r\n as: Component = 'div',\r\n direction = 'column',\r\n spacing = 'md',\r\n align,\r\n justify,\r\n wrap,\r\n fullWidth = false,\r\n fullHeight = false,\r\n divider = false,\r\n style,\r\n children,\r\n ...rest\r\n },\r\n ref\r\n): React.ReactElement {\r\n const { tokens } = useTheme();\r\n const { breakpoint } = useBreakpoint();\r\n \r\n const resolvedSpacing = resolveResponsiveSpacing(spacing, breakpoint, tokens);\r\n const resolvedDirection = Array.isArray(direction)\r\n ? (direction[Math.min(['base', 'sm', 'md', 'lg', 'xl', 'xxl'].indexOf(breakpoint), direction.length - 1)] ?? direction[direction.length - 1])\r\n : direction;\r\n const isVertical = resolvedDirection === 'column' || resolvedDirection === 'column-reverse';\r\n \r\n const computedStyle: React.CSSProperties = {\r\n display: 'flex',\r\n flexDirection: resolvedDirection as 'row' | 'column' | 'row-reverse' | 'column-reverse',\r\n ...(divider || !resolvedSpacing ? {} : { gap: resolvedSpacing }),\r\n alignItems: align,\r\n justifyContent: justify,\r\n flexWrap: wrap,\r\n ...(fullWidth ? { width: '100%' } : {}),\r\n ...(fullHeight ? { height: '100%' } : {}),\r\n ...style,\r\n };\r\n \r\n // If divider is enabled, interleave divider elements\r\n if (divider) {\r\n const items = React.Children.toArray(children).filter(Boolean);\r\n const dividerStyle: React.CSSProperties = isVertical\r\n ? {\r\n width: '100%',\r\n height: '1px',\r\n backgroundColor: tokens.colors.border.muted,\r\n flexShrink: 0,\r\n margin: `${resolvedSpacing} 0`,\r\n }\r\n : {\r\n height: '100%',\r\n width: '1px',\r\n backgroundColor: tokens.colors.border.muted,\r\n flexShrink: 0,\r\n alignSelf: 'stretch',\r\n margin: `0 ${resolvedSpacing}`,\r\n };\r\n \r\n return (\r\n <Component ref={ref} style={computedStyle} {...rest}>\r\n {items.map((child, index) => (\r\n <React.Fragment key={index}>\r\n {child}\r\n {index < items.length - 1 && <div style={dividerStyle} aria-hidden=\"true\" />}\r\n </React.Fragment>\r\n ))}\r\n </Component>\r\n );\r\n }\r\n \r\n return (\r\n <Component ref={ref} style={computedStyle} {...rest}>\r\n {children}\r\n </Component>\r\n );\r\n}));\r\n\r\n/**\r\n * Horizontal Stack — `<Stack direction=\"row\">` shorthand.\r\n * \r\n * @example\r\n * ```tsx\r\n * <HStack spacing=\"sm\" align=\"center\">\r\n * <Icon name=\"satellite\" />\r\n * <Body1>SAT-1</Body1>\r\n * <Badge status=\"normal\">Nominal</Badge>\r\n * </HStack>\r\n * ```\r\n */\r\nexport const HStack = memo(forwardRef<HTMLDivElement, Omit<StackProps, 'direction'>>(\r\n function HStack(props, ref) {\r\n return <Stack ref={ref} direction=\"row\" {...props} />;\r\n }\r\n));\r\n\r\n/**\r\n * Vertical Stack — `<Stack direction=\"column\">` shorthand.\r\n * \r\n * @example\r\n * ```tsx\r\n * <VStack spacing=\"md\">\r\n * <TelemetryCard />\r\n * <LinkBudgetCard />\r\n * </VStack>\r\n * ```\r\n */\r\nexport const VStack = memo(forwardRef<HTMLDivElement, Omit<StackProps, 'direction'>>(\r\n function VStack(props, ref) {\r\n return <Stack ref={ref} direction=\"column\" {...props} />;\r\n }\r\n));\r\n\r\nexport default Stack;\r\n"],"names":["Stack","HStack","VStack"],"mappings":";;;;;AA4DO,MAAM,QAAQ,KAAK,WAAuC,SAASA,OACxE;AAAA,EACE,IAAI,YAAY;AAAA,EAChB,YAAY;AAAA,EACZ,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA,GAAG;AACL,GACA,KACoB;AACpB,QAAM,EAAE,OAAA,IAAW,SAAA;AACnB,QAAM,EAAE,WAAA,IAAe,cAAA;AAEvB,QAAM,kBAAkB,yBAAyB,SAAS,YAAY,MAAM;AAC5E,QAAM,oBAAoB,MAAM,QAAQ,SAAS,IAC5C,UAAU,KAAK,IAAI,CAAC,QAAQ,MAAM,MAAM,MAAM,MAAM,KAAK,EAAE,QAAQ,UAAU,GAAG,UAAU,SAAS,CAAC,CAAC,KAAK,UAAU,UAAU,SAAS,CAAC,IACzI;AACJ,QAAM,aAAa,sBAAsB,YAAY,sBAAsB;AAE3E,QAAM,gBAAqC;AAAA,IACzC,SAAS;AAAA,IACT,eAAe;AAAA,IACf,GAAI,WAAW,CAAC,kBAAkB,CAAA,IAAK,EAAE,KAAK,gBAAA;AAAA,IAC9C,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,UAAU;AAAA,IACV,GAAI,YAAY,EAAE,OAAO,OAAA,IAAW,CAAA;AAAA,IACpC,GAAI,aAAa,EAAE,QAAQ,OAAA,IAAW,CAAA;AAAA,IACtC,GAAG;AAAA,EAAA;AAIL,MAAI,SAAS;AACX,UAAM,QAAQ,MAAM,SAAS,QAAQ,QAAQ,EAAE,OAAO,OAAO;AAC7D,UAAM,eAAoC,aACtC;AAAA,MACE,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,iBAAiB,OAAO,OAAO,OAAO;AAAA,MACtC,YAAY;AAAA,MACZ,QAAQ,GAAG,eAAe;AAAA,IAAA,IAE5B;AAAA,MACE,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,iBAAiB,OAAO,OAAO,OAAO;AAAA,MACtC,YAAY;AAAA,MACZ,WAAW;AAAA,MACX,QAAQ,KAAK,eAAe;AAAA,IAAA;AAGlC,WACE,oBAAC,WAAA,EAAU,KAAU,OAAO,eAAgB,GAAG,MAC5C,UAAA,MAAM,IAAI,CAAC,OAAO,UACjB,qBAAC,MAAM,UAAN,EACE,UAAA;AAAA,MAAA;AAAA,MACA,QAAQ,MAAM,SAAS,yBAAM,OAAA,EAAI,OAAO,cAAc,eAAY,OAAA,CAAO;AAAA,IAAA,KAFvD,KAGrB,CACD,GACH;AAAA,EAEJ;AAEA,6BACG,WAAA,EAAU,KAAU,OAAO,eAAgB,GAAG,MAC5C,UACH;AAEJ,CAAC,CAAC;AAcK,MAAM,SAAS,KAAK;AAAA,EACzB,SAASC,QAAO,OAAO,KAAK;AAC1B,+BAAQ,OAAA,EAAM,KAAU,WAAU,OAAO,GAAG,OAAO;AAAA,EACrD;AACF,CAAC;AAaM,MAAM,SAAS,KAAK;AAAA,EACzB,SAASC,QAAO,OAAO,KAAK;AAC1B,+BAAQ,OAAA,EAAM,KAAU,WAAU,UAAU,GAAG,OAAO;AAAA,EACxD;AACF,CAAC;"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * @zendir/ui - Layout Primitives
3
+ *
4
+ * Foundation layout components following Astro UX Design System spacing tokens.
5
+ * Inspired by Apple's precision layout and Google Material's systematic spacing,
6
+ * built for mission-critical space operations dashboards.
7
+ *
8
+ * Components:
9
+ * - Box: Base layout container with theme-aware padding, margin, and styling
10
+ * - Flex: Flexbox layout with gap, alignment, and wrapping
11
+ * - Grid: CSS Grid with responsive columns and auto-fit
12
+ * - Stack: Vertical or horizontal stack with consistent spacing
13
+ * - Center: Centers content horizontally and vertically
14
+ * - Spacer: Flexible space filler for Flex/Stack layouts
15
+ * - Divider: Visual separator line
16
+ *
17
+ * All components support responsive props via array syntax:
18
+ * - `columns={[1, 2, 3]}` → 1 col mobile, 2 col tablet, 3 col desktop
19
+ * - `gap={['sm', 'md', 'lg']}` → sm mobile, md tablet, lg desktop
20
+ */
21
+ export { Box } from './Box';
22
+ export type { BoxProps } from './Box';
23
+ export { Flex } from './Flex';
24
+ export type { FlexProps } from './Flex';
25
+ export { Grid } from './Grid';
26
+ export type { GridProps } from './Grid';
27
+ export { Stack, HStack, VStack } from './Stack';
28
+ export type { StackProps } from './Stack';
29
+ export { Center } from './Center';
30
+ export type { CenterProps } from './Center';
31
+ export { Spacer } from './Spacer';
32
+ export type { SpacerProps } from './Spacer';
33
+ export { Divider } from './Divider';
34
+ export type { DividerProps } from './Divider';
35
+ export { useBreakpoint, BREAKPOINTS } from './useBreakpoint';
36
+ export type { Breakpoint, ResponsiveValue } from './useBreakpoint';
37
+ export { resolveResponsive, resolveSpacing } from './responsive';
38
+ export type { SpacingToken } from './responsive';
@@ -0,0 +1,23 @@
1
+ import { ThemeTokens } from '../../theme';
2
+ import { Breakpoint, ResponsiveValue } from './useBreakpoint';
3
+
4
+ /** Spacing token names matching ThemeTokens.spacing */
5
+ export type SpacingToken = 'xxs' | 'xs' | 'sm' | 'smd' | 'md' | 'mdl' | 'lg' | 'xl' | 'xxl';
6
+ /** Value that can be a spacing token, a CSS string, or a number (px) */
7
+ type SpacingInput = SpacingToken | string | number;
8
+ /**
9
+ * Resolve a spacing value to a CSS string.
10
+ * - SpacingToken ('xs', 'sm', etc.) → looks up token value
11
+ * - number → converts to px string
12
+ * - string → passes through (e.g., '1rem', '50%')
13
+ */
14
+ export declare function resolveSpacing(value: SpacingInput | undefined, tokens: ThemeTokens): string | undefined;
15
+ /**
16
+ * Resolve a responsive spacing value at the current breakpoint.
17
+ */
18
+ export declare function resolveResponsiveSpacing(value: ResponsiveValue<SpacingInput> | undefined, breakpoint: Breakpoint, tokens: ThemeTokens): string | undefined;
19
+ /**
20
+ * Resolve a responsive value (non-spacing) at the current breakpoint.
21
+ */
22
+ export declare function resolveResponsive<T>(value: ResponsiveValue<T> | undefined, breakpoint: Breakpoint): T | undefined;
23
+ export {};
@@ -0,0 +1,26 @@
1
+ import { resolveResponsiveValue } from "./useBreakpoint.js";
2
+ function resolveSpacing(value, tokens) {
3
+ if (value === void 0 || value === null) return void 0;
4
+ if (typeof value === "string" && value in tokens.spacing) {
5
+ return tokens.spacing[value];
6
+ }
7
+ if (typeof value === "number") {
8
+ return `${value}px`;
9
+ }
10
+ return value;
11
+ }
12
+ function resolveResponsiveSpacing(value, breakpoint, tokens) {
13
+ if (value === void 0 || value === null) return void 0;
14
+ const resolved = Array.isArray(value) ? resolveResponsiveValue(value, breakpoint) : value;
15
+ return resolveSpacing(resolved, tokens);
16
+ }
17
+ function resolveResponsive(value, breakpoint) {
18
+ if (value === void 0 || value === null) return void 0;
19
+ return Array.isArray(value) ? resolveResponsiveValue(value, breakpoint) : value;
20
+ }
21
+ export {
22
+ resolveResponsive,
23
+ resolveResponsiveSpacing,
24
+ resolveSpacing
25
+ };
26
+ //# sourceMappingURL=responsive.js.map