@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,179 @@
1
+ import { jsxs, Fragment, jsx } from "react/jsx-runtime";
2
+ import { memo, useState, useRef, useCallback, useLayoutEffect, useEffect } from "react";
3
+ import ReactDOM from "react-dom";
4
+ import { classNames } from "../utils/index.js";
5
+ import { useTheme } from "../theme/ThemeProvider.js";
6
+ const Tooltip = memo(function Tooltip2({
7
+ content,
8
+ placement = "top",
9
+ delay = 200,
10
+ disabled = false,
11
+ children,
12
+ className = ""
13
+ }) {
14
+ const { tokens } = useTheme();
15
+ const [visible, setVisible] = useState(false);
16
+ const [positioned, setPositioned] = useState(false);
17
+ const [position, setPosition] = useState({ top: 0, left: 0 });
18
+ const triggerRef = useRef(null);
19
+ const tooltipRef = useRef(null);
20
+ const timeoutRef = useRef();
21
+ const hideTimeoutRef = useRef();
22
+ const showTooltip = useCallback(() => {
23
+ if (disabled) return;
24
+ if (hideTimeoutRef.current) {
25
+ clearTimeout(hideTimeoutRef.current);
26
+ hideTimeoutRef.current = void 0;
27
+ }
28
+ timeoutRef.current = window.setTimeout(() => {
29
+ setVisible(true);
30
+ setPositioned(false);
31
+ }, delay);
32
+ }, [disabled, delay]);
33
+ const hideTooltip = useCallback(() => {
34
+ if (timeoutRef.current) {
35
+ clearTimeout(timeoutRef.current);
36
+ }
37
+ hideTimeoutRef.current = window.setTimeout(() => {
38
+ setVisible(false);
39
+ setPositioned(false);
40
+ }, 100);
41
+ }, []);
42
+ const hideImmediately = useCallback(() => {
43
+ if (timeoutRef.current) clearTimeout(timeoutRef.current);
44
+ if (hideTimeoutRef.current) clearTimeout(hideTimeoutRef.current);
45
+ setVisible(false);
46
+ setPositioned(false);
47
+ }, []);
48
+ const calculatePosition = useCallback(() => {
49
+ if (!triggerRef.current || !tooltipRef.current) return;
50
+ const triggerRect = triggerRef.current.getBoundingClientRect();
51
+ const tooltipRect = tooltipRef.current.getBoundingClientRect();
52
+ const gap = 8;
53
+ const viewportWidth = window.innerWidth;
54
+ const viewportHeight = window.innerHeight;
55
+ let top = 0;
56
+ let left = 0;
57
+ switch (placement) {
58
+ case "top":
59
+ top = triggerRect.top - tooltipRect.height - gap;
60
+ left = triggerRect.left + (triggerRect.width - tooltipRect.width) / 2;
61
+ break;
62
+ case "bottom":
63
+ top = triggerRect.bottom + gap;
64
+ left = triggerRect.left + (triggerRect.width - tooltipRect.width) / 2;
65
+ break;
66
+ case "left":
67
+ top = triggerRect.top + (triggerRect.height - tooltipRect.height) / 2;
68
+ left = triggerRect.left - tooltipRect.width - gap;
69
+ break;
70
+ case "right":
71
+ top = triggerRect.top + (triggerRect.height - tooltipRect.height) / 2;
72
+ left = triggerRect.right + gap;
73
+ break;
74
+ }
75
+ if (left < gap) left = gap;
76
+ if (left + tooltipRect.width > viewportWidth - gap) {
77
+ left = viewportWidth - tooltipRect.width - gap;
78
+ }
79
+ if (top < gap) top = gap;
80
+ if (top + tooltipRect.height > viewportHeight - gap) {
81
+ top = viewportHeight - tooltipRect.height - gap;
82
+ }
83
+ setPosition({ top, left });
84
+ setPositioned(true);
85
+ }, [placement]);
86
+ useLayoutEffect(() => {
87
+ if (visible && triggerRef.current && tooltipRef.current) {
88
+ calculatePosition();
89
+ }
90
+ }, [visible, calculatePosition]);
91
+ useEffect(() => {
92
+ if (!visible) return;
93
+ const handleScrollOrResize = () => {
94
+ calculatePosition();
95
+ };
96
+ window.addEventListener("scroll", handleScrollOrResize, true);
97
+ window.addEventListener("resize", handleScrollOrResize);
98
+ return () => {
99
+ window.removeEventListener("scroll", handleScrollOrResize, true);
100
+ window.removeEventListener("resize", handleScrollOrResize);
101
+ };
102
+ }, [visible, calculatePosition]);
103
+ useEffect(() => {
104
+ if (!visible) return;
105
+ const handleEscape = (e) => {
106
+ if (e.key === "Escape") {
107
+ hideImmediately();
108
+ }
109
+ };
110
+ document.addEventListener("keydown", handleEscape);
111
+ return () => document.removeEventListener("keydown", handleEscape);
112
+ }, [visible, hideImmediately]);
113
+ useEffect(() => {
114
+ return () => {
115
+ if (timeoutRef.current) clearTimeout(timeoutRef.current);
116
+ if (hideTimeoutRef.current) clearTimeout(hideTimeoutRef.current);
117
+ };
118
+ }, []);
119
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
120
+ /* @__PURE__ */ jsx(
121
+ "div",
122
+ {
123
+ ref: triggerRef,
124
+ className: classNames("zendir-tooltip-trigger", className),
125
+ style: { display: "inline-flex", pointerEvents: "auto", maxWidth: "100%", width: "inherit" },
126
+ onMouseEnter: showTooltip,
127
+ onMouseLeave: hideTooltip,
128
+ onFocus: showTooltip,
129
+ onBlur: hideTooltip,
130
+ children
131
+ }
132
+ ),
133
+ visible && ReactDOM.createPortal(
134
+ /* @__PURE__ */ jsxs(
135
+ "div",
136
+ {
137
+ ref: tooltipRef,
138
+ role: "tooltip",
139
+ onMouseEnter: showTooltip,
140
+ onMouseLeave: hideTooltip,
141
+ style: {
142
+ position: "fixed",
143
+ top: positioned ? position.top : 0,
144
+ left: positioned ? position.left : 0,
145
+ width: "max-content",
146
+ padding: `${tokens.spacing.sm} ${tokens.spacing.smd}`,
147
+ backgroundColor: tokens.colors.background.elevated,
148
+ color: tokens.colors.text.primary,
149
+ fontSize: "0.75rem",
150
+ fontWeight: 500,
151
+ fontFamily: tokens.typography.fontFamily.primary,
152
+ borderRadius: tokens.borderRadius.md,
153
+ border: `1px solid ${tokens.colors.accent.primary}20`,
154
+ boxShadow: positioned ? `${tokens.shadows.lg}, 0 0 20px ${tokens.colors.accent.primary}10` : "none",
155
+ zIndex: 2147483100,
156
+ maxWidth: "min(280px, calc(100vw - 24px))",
157
+ whiteSpace: "normal",
158
+ pointerEvents: "auto",
159
+ visibility: positioned ? "visible" : "hidden",
160
+ opacity: positioned ? 1 : 0,
161
+ transition: positioned ? void 0 : "none",
162
+ animation: positioned ? `zendir-tooltip ${tokens.animation.duration.fast}ms ${tokens.animation.easing.default} both` : "none",
163
+ backdropFilter: "blur(8px)"
164
+ },
165
+ children: [
166
+ content,
167
+ /* @__PURE__ */ jsx("style", { children: `@keyframes zendir-tooltip { from { opacity: 0; transform: scale(0.95) translateY(${placement === "bottom" ? "-4px" : placement === "top" ? "4px" : "0"}); } to { opacity: 1; transform: scale(1) translateY(0); } }
168
+ @media (prefers-reduced-motion: reduce) { @keyframes zendir-tooltip { from, to { opacity: 1; transform: none; } } }` })
169
+ ]
170
+ }
171
+ ),
172
+ document.body
173
+ )
174
+ ] });
175
+ });
176
+ export {
177
+ Tooltip
178
+ };
179
+ //# sourceMappingURL=Tooltip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Tooltip.js","sources":["../../../src/react/core/Tooltip.tsx"],"sourcesContent":["/**\n * @zendir/ui - Tooltip Component\n * \n * Tooltip following Astro UX Design System.\n * Uses a portal to render in document.body, ensuring correct positioning\n * even when the trigger is inside containers with CSS transforms or overflow.\n * \n * @example\n * ```tsx\n * <Tooltip content=\"Click to enable telemetry\">\n * <Button>Enable</Button>\n * </Tooltip>\n * ```\n */\n\nimport React, { memo, useState, useRef, useEffect, useLayoutEffect, useCallback } from 'react';\nimport ReactDOM from 'react-dom';\nimport { useTheme } from '../theme';\nimport { classNames } from '../utils';\n\nexport type TooltipPlacement = 'top' | 'bottom' | 'left' | 'right';\n\nexport interface TooltipProps {\n /** Tooltip content */\n content: React.ReactNode;\n /** Placement */\n placement?: TooltipPlacement;\n /** Delay before showing (ms) */\n delay?: number;\n /** Disabled state */\n disabled?: boolean;\n /** Children element to trigger tooltip */\n children: React.ReactElement;\n /** Custom className */\n className?: string;\n}\n\nexport const Tooltip = memo(function Tooltip({\n content,\n placement = 'top',\n delay = 200,\n disabled = false,\n children,\n className = '',\n}: TooltipProps): React.ReactElement {\n const { tokens } = useTheme();\n const [visible, setVisible] = useState(false);\n const [positioned, setPositioned] = useState(false);\n const [position, setPosition] = useState({ top: 0, left: 0 });\n const triggerRef = useRef<HTMLDivElement>(null);\n const tooltipRef = useRef<HTMLDivElement>(null);\n const timeoutRef = useRef<number>();\n const hideTimeoutRef = useRef<number>();\n \n const showTooltip = useCallback(() => {\n if (disabled) return;\n // Cancel any pending hide so moving between trigger ↔ tooltip keeps it open\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n hideTimeoutRef.current = undefined;\n }\n timeoutRef.current = window.setTimeout(() => {\n setVisible(true);\n setPositioned(false);\n }, delay);\n }, [disabled, delay]);\n \n const hideTooltip = useCallback(() => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n // Small delay so user can move pointer from trigger to tooltip (WCAG 1.4.13)\n hideTimeoutRef.current = window.setTimeout(() => {\n setVisible(false);\n setPositioned(false);\n }, 100);\n }, []);\n \n const hideImmediately = useCallback(() => {\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n if (hideTimeoutRef.current) clearTimeout(hideTimeoutRef.current);\n setVisible(false);\n setPositioned(false);\n }, []);\n \n const calculatePosition = useCallback(() => {\n if (!triggerRef.current || !tooltipRef.current) return;\n \n const triggerRect = triggerRef.current.getBoundingClientRect();\n const tooltipRect = tooltipRef.current.getBoundingClientRect();\n const gap = 8;\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n \n let top = 0;\n let left = 0;\n \n switch (placement) {\n case 'top':\n top = triggerRect.top - tooltipRect.height - gap;\n left = triggerRect.left + (triggerRect.width - tooltipRect.width) / 2;\n break;\n case 'bottom':\n top = triggerRect.bottom + gap;\n left = triggerRect.left + (triggerRect.width - tooltipRect.width) / 2;\n break;\n case 'left':\n top = triggerRect.top + (triggerRect.height - tooltipRect.height) / 2;\n left = triggerRect.left - tooltipRect.width - gap;\n break;\n case 'right':\n top = triggerRect.top + (triggerRect.height - tooltipRect.height) / 2;\n left = triggerRect.right + gap;\n break;\n }\n \n // Keep tooltip within viewport bounds\n if (left < gap) left = gap;\n if (left + tooltipRect.width > viewportWidth - gap) {\n left = viewportWidth - tooltipRect.width - gap;\n }\n if (top < gap) top = gap;\n if (top + tooltipRect.height > viewportHeight - gap) {\n top = viewportHeight - tooltipRect.height - gap;\n }\n \n setPosition({ top, left });\n setPositioned(true);\n }, [placement]);\n \n // Use useLayoutEffect for initial positioning - runs synchronously\n // before browser paint, preventing flash at wrong position\n useLayoutEffect(() => {\n if (visible && triggerRef.current && tooltipRef.current) {\n calculatePosition();\n }\n }, [visible, calculatePosition]);\n \n // Use useEffect for scroll/resize listeners\n useEffect(() => {\n if (!visible) return;\n \n const handleScrollOrResize = () => {\n calculatePosition();\n };\n \n window.addEventListener('scroll', handleScrollOrResize, true);\n window.addEventListener('resize', handleScrollOrResize);\n \n return () => {\n window.removeEventListener('scroll', handleScrollOrResize, true);\n window.removeEventListener('resize', handleScrollOrResize);\n };\n }, [visible, calculatePosition]);\n \n // Escape key dismisses tooltip (WCAG 1.4.13 Content on Hover or Focus)\n useEffect(() => {\n if (!visible) return;\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n hideImmediately();\n }\n };\n document.addEventListener('keydown', handleEscape);\n return () => document.removeEventListener('keydown', handleEscape);\n }, [visible, hideImmediately]);\n \n useEffect(() => {\n return () => {\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n if (hideTimeoutRef.current) clearTimeout(hideTimeoutRef.current);\n };\n }, []);\n \n return (\n <>\n <div\n ref={triggerRef}\n className={classNames('zendir-tooltip-trigger', className)}\n style={{ display: 'inline-flex', pointerEvents: 'auto', maxWidth: '100%', width: 'inherit' }}\n onMouseEnter={showTooltip}\n onMouseLeave={hideTooltip}\n onFocus={showTooltip}\n onBlur={hideTooltip}\n >\n {children}\n </div>\n \n {visible && ReactDOM.createPortal(\n <div\n ref={tooltipRef}\n role=\"tooltip\"\n onMouseEnter={showTooltip}\n onMouseLeave={hideTooltip}\n style={{\n position: 'fixed',\n top: positioned ? position.top : 0,\n left: positioned ? position.left : 0,\n width: 'max-content',\n padding: `${tokens.spacing.sm} ${tokens.spacing.smd}`,\n backgroundColor: tokens.colors.background.elevated,\n color: tokens.colors.text.primary,\n fontSize: '0.75rem',\n fontWeight: 500,\n fontFamily: tokens.typography.fontFamily.primary,\n borderRadius: tokens.borderRadius.md,\n border: `1px solid ${tokens.colors.accent.primary}20`,\n boxShadow: positioned ? `${tokens.shadows.lg}, 0 0 20px ${tokens.colors.accent.primary}10` : 'none',\n zIndex: 2147483100,\n maxWidth: 'min(280px, calc(100vw - 24px))',\n whiteSpace: 'normal',\n pointerEvents: 'auto',\n visibility: positioned ? 'visible' : 'hidden',\n opacity: positioned ? 1 : 0,\n transition: positioned ? undefined : 'none',\n animation: positioned ? `zendir-tooltip ${tokens.animation.duration.fast}ms ${tokens.animation.easing.default} both` : 'none',\n backdropFilter: 'blur(8px)',\n }}\n >\n {content}\n <style>\n {`@keyframes zendir-tooltip { from { opacity: 0; transform: scale(0.95) translateY(${placement === 'bottom' ? '-4px' : placement === 'top' ? '4px' : '0'}); } to { opacity: 1; transform: scale(1) translateY(0); } }\n @media (prefers-reduced-motion: reduce) { @keyframes zendir-tooltip { from, to { opacity: 1; transform: none; } } }`}\n </style>\n </div>,\n document.body\n )}\n </>\n );\n});\n\nexport default Tooltip;\n"],"names":["Tooltip"],"mappings":";;;;;AAqCO,MAAM,UAAU,KAAK,SAASA,SAAQ;AAAA,EAC3C;AAAA,EACA,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,WAAW;AAAA,EACX;AAAA,EACA,YAAY;AACd,GAAqC;AACnC,QAAM,EAAE,OAAA,IAAW,SAAA;AACnB,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAC5C,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,KAAK;AAClD,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,EAAE,KAAK,GAAG,MAAM,GAAG;AAC5D,QAAM,aAAa,OAAuB,IAAI;AAC9C,QAAM,aAAa,OAAuB,IAAI;AAC9C,QAAM,aAAa,OAAA;AACnB,QAAM,iBAAiB,OAAA;AAEvB,QAAM,cAAc,YAAY,MAAM;AACpC,QAAI,SAAU;AAEd,QAAI,eAAe,SAAS;AAC1B,mBAAa,eAAe,OAAO;AACnC,qBAAe,UAAU;AAAA,IAC3B;AACA,eAAW,UAAU,OAAO,WAAW,MAAM;AAC3C,iBAAW,IAAI;AACf,oBAAc,KAAK;AAAA,IACrB,GAAG,KAAK;AAAA,EACV,GAAG,CAAC,UAAU,KAAK,CAAC;AAEpB,QAAM,cAAc,YAAY,MAAM;AACpC,QAAI,WAAW,SAAS;AACtB,mBAAa,WAAW,OAAO;AAAA,IACjC;AAEA,mBAAe,UAAU,OAAO,WAAW,MAAM;AAC/C,iBAAW,KAAK;AAChB,oBAAc,KAAK;AAAA,IACrB,GAAG,GAAG;AAAA,EACR,GAAG,CAAA,CAAE;AAEL,QAAM,kBAAkB,YAAY,MAAM;AACxC,QAAI,WAAW,QAAS,cAAa,WAAW,OAAO;AACvD,QAAI,eAAe,QAAS,cAAa,eAAe,OAAO;AAC/D,eAAW,KAAK;AAChB,kBAAc,KAAK;AAAA,EACrB,GAAG,CAAA,CAAE;AAEL,QAAM,oBAAoB,YAAY,MAAM;AAC1C,QAAI,CAAC,WAAW,WAAW,CAAC,WAAW,QAAS;AAEhD,UAAM,cAAc,WAAW,QAAQ,sBAAA;AACvC,UAAM,cAAc,WAAW,QAAQ,sBAAA;AACvC,UAAM,MAAM;AACZ,UAAM,gBAAgB,OAAO;AAC7B,UAAM,iBAAiB,OAAO;AAE9B,QAAI,MAAM;AACV,QAAI,OAAO;AAEX,YAAQ,WAAA;AAAA,MACN,KAAK;AACH,cAAM,YAAY,MAAM,YAAY,SAAS;AAC7C,eAAO,YAAY,QAAQ,YAAY,QAAQ,YAAY,SAAS;AACpE;AAAA,MACF,KAAK;AACH,cAAM,YAAY,SAAS;AAC3B,eAAO,YAAY,QAAQ,YAAY,QAAQ,YAAY,SAAS;AACpE;AAAA,MACF,KAAK;AACH,cAAM,YAAY,OAAO,YAAY,SAAS,YAAY,UAAU;AACpE,eAAO,YAAY,OAAO,YAAY,QAAQ;AAC9C;AAAA,MACF,KAAK;AACH,cAAM,YAAY,OAAO,YAAY,SAAS,YAAY,UAAU;AACpE,eAAO,YAAY,QAAQ;AAC3B;AAAA,IAAA;AAIJ,QAAI,OAAO,IAAK,QAAO;AACvB,QAAI,OAAO,YAAY,QAAQ,gBAAgB,KAAK;AAClD,aAAO,gBAAgB,YAAY,QAAQ;AAAA,IAC7C;AACA,QAAI,MAAM,IAAK,OAAM;AACrB,QAAI,MAAM,YAAY,SAAS,iBAAiB,KAAK;AACnD,YAAM,iBAAiB,YAAY,SAAS;AAAA,IAC9C;AAEA,gBAAY,EAAE,KAAK,MAAM;AACzB,kBAAc,IAAI;AAAA,EACpB,GAAG,CAAC,SAAS,CAAC;AAId,kBAAgB,MAAM;AACpB,QAAI,WAAW,WAAW,WAAW,WAAW,SAAS;AACvD,wBAAA;AAAA,IACF;AAAA,EACF,GAAG,CAAC,SAAS,iBAAiB,CAAC;AAG/B,YAAU,MAAM;AACd,QAAI,CAAC,QAAS;AAEd,UAAM,uBAAuB,MAAM;AACjC,wBAAA;AAAA,IACF;AAEA,WAAO,iBAAiB,UAAU,sBAAsB,IAAI;AAC5D,WAAO,iBAAiB,UAAU,oBAAoB;AAEtD,WAAO,MAAM;AACX,aAAO,oBAAoB,UAAU,sBAAsB,IAAI;AAC/D,aAAO,oBAAoB,UAAU,oBAAoB;AAAA,IAC3D;AAAA,EACF,GAAG,CAAC,SAAS,iBAAiB,CAAC;AAG/B,YAAU,MAAM;AACd,QAAI,CAAC,QAAS;AACd,UAAM,eAAe,CAAC,MAAqB;AACzC,UAAI,EAAE,QAAQ,UAAU;AACtB,wBAAA;AAAA,MACF;AAAA,IACF;AACA,aAAS,iBAAiB,WAAW,YAAY;AACjD,WAAO,MAAM,SAAS,oBAAoB,WAAW,YAAY;AAAA,EACnE,GAAG,CAAC,SAAS,eAAe,CAAC;AAE7B,YAAU,MAAM;AACd,WAAO,MAAM;AACX,UAAI,WAAW,QAAS,cAAa,WAAW,OAAO;AACvD,UAAI,eAAe,QAAS,cAAa,eAAe,OAAO;AAAA,IACjE;AAAA,EACF,GAAG,CAAA,CAAE;AAEL,SACE,qBAAA,UAAA,EACE,UAAA;AAAA,IAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAK;AAAA,QACL,WAAW,WAAW,0BAA0B,SAAS;AAAA,QACzD,OAAO,EAAE,SAAS,eAAe,eAAe,QAAQ,UAAU,QAAQ,OAAO,UAAA;AAAA,QACjF,cAAc;AAAA,QACd,cAAc;AAAA,QACd,SAAS;AAAA,QACT,QAAQ;AAAA,QAEP;AAAA,MAAA;AAAA,IAAA;AAAA,IAGF,WAAW,SAAS;AAAA,MACnB;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,KAAK;AAAA,UACL,MAAK;AAAA,UACL,cAAc;AAAA,UACd,cAAc;AAAA,UACd,OAAO;AAAA,YACL,UAAU;AAAA,YACV,KAAK,aAAa,SAAS,MAAM;AAAA,YACjC,MAAM,aAAa,SAAS,OAAO;AAAA,YACnC,OAAO;AAAA,YACP,SAAS,GAAG,OAAO,QAAQ,EAAE,IAAI,OAAO,QAAQ,GAAG;AAAA,YACnD,iBAAiB,OAAO,OAAO,WAAW;AAAA,YAC1C,OAAO,OAAO,OAAO,KAAK;AAAA,YAC1B,UAAU;AAAA,YACV,YAAY;AAAA,YACZ,YAAY,OAAO,WAAW,WAAW;AAAA,YACzC,cAAc,OAAO,aAAa;AAAA,YAClC,QAAQ,aAAa,OAAO,OAAO,OAAO,OAAO;AAAA,YACjD,WAAW,aAAa,GAAG,OAAO,QAAQ,EAAE,cAAc,OAAO,OAAO,OAAO,OAAO,OAAO;AAAA,YAC7F,QAAQ;AAAA,YACR,UAAU;AAAA,YACV,YAAY;AAAA,YACZ,eAAe;AAAA,YACf,YAAY,aAAa,YAAY;AAAA,YACrC,SAAS,aAAa,IAAI;AAAA,YAC1B,YAAY,aAAa,SAAY;AAAA,YACrC,WAAW,aAAa,kBAAkB,OAAO,UAAU,SAAS,IAAI,MAAM,OAAO,UAAU,OAAO,OAAO,UAAU;AAAA,YACvH,gBAAgB;AAAA,UAAA;AAAA,UAGjB,UAAA;AAAA,YAAA;AAAA,YACD,oBAAC,WACE,UAAA,oFAAoF,cAAc,WAAW,SAAS,cAAc,QAAQ,QAAQ,GAAG;AAAA,iIAAA,CAE1J;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAEF,SAAS;AAAA,IAAA;AAAA,EACX,GACF;AAEJ,CAAC;"}
@@ -0,0 +1,127 @@
1
+ import { default as React } from 'react';
2
+
3
+ /**
4
+ * Typography variant following Astro UX Design System
5
+ * Maps directly to official Astro typography tokens
6
+ */
7
+ export type TypographyVariant = 'display1' | 'display2' | 'h1' | 'h1Bold' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'body1' | 'body1Bold' | 'body2' | 'body2Bold' | 'body3' | 'body3Bold' | 'control1' | 'control1Bold' | 'compact' | 'compactBold' | 'micro' | 'microBold' | 'mono' | 'monoSmall' | 'monoCompact';
8
+ /**
9
+ * Semantic element to render
10
+ */
11
+ export type TypographyElement = 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'p' | 'span' | 'div' | 'label' | 'code' | 'pre';
12
+ /**
13
+ * Text color variants
14
+ */
15
+ export type TypographyColor = 'primary' | 'secondary' | 'tertiary' | 'muted' | 'inverse' | 'inherit' | 'normal' | 'standby' | 'caution' | 'serious' | 'critical' | 'off';
16
+ export interface TypographyProps {
17
+ /** Typography variant (required) */
18
+ variant: TypographyVariant;
19
+ /** HTML element to render */
20
+ as?: TypographyElement;
21
+ /** Text color */
22
+ color?: TypographyColor;
23
+ /** Enable tabular figures for numeric alignment */
24
+ tabular?: boolean;
25
+ /** Truncate with ellipsis */
26
+ truncate?: boolean;
27
+ /** Text alignment */
28
+ align?: 'left' | 'center' | 'right';
29
+ /** Disable text wrapping */
30
+ noWrap?: boolean;
31
+ /** Transform text case */
32
+ transform?: 'none' | 'uppercase' | 'lowercase' | 'capitalize';
33
+ /** Additional CSS styles */
34
+ style?: React.CSSProperties;
35
+ /** Additional CSS class */
36
+ className?: string;
37
+ /** Children */
38
+ children?: React.ReactNode;
39
+ /** Test ID */
40
+ 'data-testid'?: string;
41
+ }
42
+ /**
43
+ * Standard font family fallback stack per AstroUXDS
44
+ * Roboto is the primary font for all Astro applications
45
+ */
46
+ export declare const FONT_FAMILY_PRIMARY = "\"Roboto\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Helvetica Neue\", Arial, sans-serif";
47
+ /**
48
+ * Monospace font stack for tabular data and code
49
+ * Roboto Mono is the primary monospace font for Astro
50
+ */
51
+ export declare const FONT_FAMILY_MONO = "\"Roboto Mono\", \"SF Mono\", \"Consolas\", \"Liberation Mono\", monospace";
52
+ export declare const FONT_WEIGHTS: {
53
+ readonly light: 300;
54
+ readonly regular: 400;
55
+ readonly medium: 500;
56
+ readonly bold: 700;
57
+ };
58
+ /**
59
+ * Typography component providing AstroUXDS-compliant text styling.
60
+ *
61
+ * @example
62
+ * ```tsx
63
+ * // Heading
64
+ * <Typography variant="h3">Section Title</Typography>
65
+ *
66
+ * // Body text
67
+ * <Typography variant="body1" color="secondary">Description text</Typography>
68
+ *
69
+ * // Monospace data with tabular figures
70
+ * <Typography variant="mono" tabular>123.456</Typography>
71
+ *
72
+ * // Compact label for cards
73
+ * <Typography variant="compact" color="tertiary">LABEL</Typography>
74
+ * ```
75
+ */
76
+ export declare const Typography: React.FC<TypographyProps>;
77
+ /** Display 1 - Largest display text */
78
+ export declare const Display1: React.FC<Omit<TypographyProps, 'variant'>>;
79
+ /** Display 2 - Large display text */
80
+ export declare const Display2: React.FC<Omit<TypographyProps, 'variant'>>;
81
+ /** Heading 1 */
82
+ export declare const H1: React.FC<Omit<TypographyProps, 'variant'> & {
83
+ bold?: boolean;
84
+ }>;
85
+ /** Heading 2 */
86
+ export declare const H2: React.FC<Omit<TypographyProps, 'variant'>>;
87
+ /** Heading 3 */
88
+ export declare const H3: React.FC<Omit<TypographyProps, 'variant'>>;
89
+ /** Heading 4 */
90
+ export declare const H4: React.FC<Omit<TypographyProps, 'variant'>>;
91
+ /** Heading 5 */
92
+ export declare const H5: React.FC<Omit<TypographyProps, 'variant'>>;
93
+ /** Heading 6 */
94
+ export declare const H6: React.FC<Omit<TypographyProps, 'variant'>>;
95
+ /** Body text level 1 (16px) */
96
+ export declare const Body1: React.FC<Omit<TypographyProps, 'variant'> & {
97
+ bold?: boolean;
98
+ }>;
99
+ /** Body text level 2 (14px) */
100
+ export declare const Body2: React.FC<Omit<TypographyProps, 'variant'> & {
101
+ bold?: boolean;
102
+ }>;
103
+ /** Body text level 3 (12px) */
104
+ export declare const Body3: React.FC<Omit<TypographyProps, 'variant'> & {
105
+ bold?: boolean;
106
+ }>;
107
+ /** Compact text for dense UIs (10px) */
108
+ export declare const Compact: React.FC<Omit<TypographyProps, 'variant'> & {
109
+ bold?: boolean;
110
+ }>;
111
+ /** Micro text for very tight spaces (9px) */
112
+ export declare const Micro: React.FC<Omit<TypographyProps, 'variant'> & {
113
+ bold?: boolean;
114
+ }>;
115
+ /** Monospace text for data/code */
116
+ export declare const Mono: React.FC<Omit<TypographyProps, 'variant'> & {
117
+ size?: 'normal' | 'small' | 'compact';
118
+ }>;
119
+ /** Data value text - monospace with tabular figures (for numeric displays) */
120
+ export declare const DataText: React.FC<Omit<TypographyProps, 'variant' | 'tabular'> & {
121
+ size?: 'large' | 'normal' | 'small' | 'compact';
122
+ }>;
123
+ /** Label text for form controls and card headers */
124
+ export declare const Label: React.FC<Omit<TypographyProps, 'variant'> & {
125
+ bold?: boolean;
126
+ }>;
127
+ export default Typography;
@@ -0,0 +1,187 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { useTheme } from "../theme/ThemeProvider.js";
3
+ const FONT_FAMILY_PRIMARY = '"Roboto", -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", Arial, sans-serif';
4
+ const FONT_FAMILY_MONO = '"Roboto Mono", "SF Mono", "Consolas", "Liberation Mono", monospace';
5
+ const FONT_WEIGHTS = {
6
+ light: 300,
7
+ regular: 400,
8
+ medium: 500,
9
+ bold: 700
10
+ };
11
+ function getTypographyStyles(variant) {
12
+ const styles = {
13
+ // Display variants
14
+ display1: { fontSize: "3.75rem", fontWeight: 300, lineHeight: "4.375rem", letterSpacing: "-0.5px" },
15
+ display2: { fontSize: "3rem", fontWeight: 400, lineHeight: "3.5rem", letterSpacing: "0" },
16
+ // Heading variants
17
+ h1: { fontSize: "2.125rem", fontWeight: 400, lineHeight: "2.5rem", letterSpacing: "0.25px" },
18
+ h1Bold: { fontSize: "2.125rem", fontWeight: 700, lineHeight: "2.5rem", letterSpacing: "0.25px" },
19
+ h2: { fontSize: "1.5rem", fontWeight: 400, lineHeight: "1.75rem", letterSpacing: "0" },
20
+ h3: { fontSize: "1.25rem", fontWeight: 500, lineHeight: "1.5rem", letterSpacing: "0.15px" },
21
+ h4: { fontSize: "1.25rem", fontWeight: 300, lineHeight: "1.5rem", letterSpacing: "0.15px" },
22
+ h5: { fontSize: "1.125rem", fontWeight: 400, lineHeight: "1.5rem", letterSpacing: "0" },
23
+ h6: { fontSize: "1.125rem", fontWeight: 300, lineHeight: "1.5rem", letterSpacing: "0" },
24
+ // Body variants
25
+ body1: { fontSize: "1rem", fontWeight: 400, lineHeight: "1.5rem", letterSpacing: "0.5px" },
26
+ body1Bold: { fontSize: "1rem", fontWeight: 700, lineHeight: "1.5rem", letterSpacing: "0.5px" },
27
+ body2: { fontSize: "0.875rem", fontWeight: 400, lineHeight: "1.25rem", letterSpacing: "0.5px" },
28
+ body2Bold: { fontSize: "0.875rem", fontWeight: 700, lineHeight: "1.25rem", letterSpacing: "0.5px" },
29
+ body3: { fontSize: "0.75rem", fontWeight: 400, lineHeight: "1rem", letterSpacing: "0" },
30
+ body3Bold: { fontSize: "0.75rem", fontWeight: 700, lineHeight: "1rem", letterSpacing: "0" },
31
+ // Control variants (UI labels)
32
+ control1: { fontSize: "1rem", fontWeight: 400, lineHeight: "1.25rem", letterSpacing: "0.5px" },
33
+ control1Bold: { fontSize: "1rem", fontWeight: 700, lineHeight: "1.25rem", letterSpacing: "0.5px" },
34
+ // Compact variants for dense UIs (cards, badges, data labels)
35
+ compact: { fontSize: "0.625rem", fontWeight: 400, lineHeight: "0.875rem", letterSpacing: "0" },
36
+ // 10px
37
+ compactBold: { fontSize: "0.625rem", fontWeight: 500, lineHeight: "0.875rem", letterSpacing: "0" },
38
+ micro: { fontSize: "0.5625rem", fontWeight: 400, lineHeight: "0.75rem", letterSpacing: "0" },
39
+ // 9px
40
+ microBold: { fontSize: "0.5625rem", fontWeight: 500, lineHeight: "0.75rem", letterSpacing: "0" },
41
+ // Monospace variants for data/code
42
+ mono: { fontSize: "0.875rem", fontWeight: 400, lineHeight: "1.25rem", letterSpacing: "0", fontFamily: FONT_FAMILY_MONO },
43
+ monoSmall: { fontSize: "0.75rem", fontWeight: 400, lineHeight: "1rem", letterSpacing: "0", fontFamily: FONT_FAMILY_MONO },
44
+ monoCompact: { fontSize: "0.625rem", fontWeight: 400, lineHeight: "0.875rem", letterSpacing: "0", fontFamily: FONT_FAMILY_MONO }
45
+ };
46
+ return styles[variant];
47
+ }
48
+ function getDefaultElement(variant) {
49
+ if (variant.startsWith("display")) return "h1";
50
+ if (variant.startsWith("h1")) return "h1";
51
+ if (variant.startsWith("h2")) return "h2";
52
+ if (variant.startsWith("h3")) return "h3";
53
+ if (variant.startsWith("h4")) return "h4";
54
+ if (variant.startsWith("h5")) return "h5";
55
+ if (variant.startsWith("h6")) return "h6";
56
+ if (variant.startsWith("mono")) return "code";
57
+ if (variant.startsWith("control")) return "label";
58
+ return "span";
59
+ }
60
+ const Typography = ({
61
+ variant,
62
+ as,
63
+ color = "primary",
64
+ tabular = false,
65
+ truncate = false,
66
+ align,
67
+ noWrap = false,
68
+ transform,
69
+ style,
70
+ className,
71
+ children,
72
+ "data-testid": testId
73
+ }) => {
74
+ const { tokens } = useTheme();
75
+ const typographyStyles = getTypographyStyles(variant);
76
+ const Element = as || getDefaultElement(variant);
77
+ const getColor = () => {
78
+ if (color === "inherit") return "inherit";
79
+ if (color === "primary") return tokens.colors.text.primary;
80
+ if (color === "secondary") return tokens.colors.text.secondary;
81
+ if (color === "tertiary") return tokens.colors.text.tertiary;
82
+ if (color === "muted") return tokens.colors.text.muted || tokens.colors.text.tertiary;
83
+ if (color === "inverse") return tokens.colors.text.inverse;
84
+ if (color === "normal") return tokens.colors.status.normal;
85
+ if (color === "standby") return tokens.colors.status.standby;
86
+ if (color === "caution") return tokens.colors.status.caution;
87
+ if (color === "serious") return tokens.colors.status.serious;
88
+ if (color === "critical") return tokens.colors.status.critical;
89
+ if (color === "off") return tokens.colors.status.off;
90
+ return void 0;
91
+ };
92
+ const combinedStyle = {
93
+ fontFamily: typographyStyles.fontFamily || FONT_FAMILY_PRIMARY,
94
+ fontSize: typographyStyles.fontSize,
95
+ fontWeight: typographyStyles.fontWeight,
96
+ lineHeight: typographyStyles.lineHeight,
97
+ letterSpacing: typographyStyles.letterSpacing,
98
+ color: getColor(),
99
+ margin: 0,
100
+ padding: 0,
101
+ // Tabular figures for numeric alignment
102
+ ...tabular && {
103
+ fontVariantNumeric: "tabular-nums",
104
+ fontFeatureSettings: '"tnum"'
105
+ },
106
+ // Truncation
107
+ ...truncate && {
108
+ overflow: "hidden",
109
+ textOverflow: "ellipsis",
110
+ whiteSpace: "nowrap"
111
+ },
112
+ // No wrap
113
+ ...noWrap && !truncate && {
114
+ whiteSpace: "nowrap"
115
+ },
116
+ // Text alignment
117
+ ...align && { textAlign: align },
118
+ // Text transform
119
+ ...transform && { textTransform: transform },
120
+ // Custom styles (can override defaults)
121
+ ...style
122
+ };
123
+ return /* @__PURE__ */ jsx(
124
+ Element,
125
+ {
126
+ className,
127
+ style: combinedStyle,
128
+ "data-testid": testId,
129
+ children
130
+ }
131
+ );
132
+ };
133
+ const Display1 = (props) => /* @__PURE__ */ jsx(Typography, { variant: "display1", ...props });
134
+ const Display2 = (props) => /* @__PURE__ */ jsx(Typography, { variant: "display2", ...props });
135
+ const H1 = ({ bold, ...props }) => /* @__PURE__ */ jsx(Typography, { variant: bold ? "h1Bold" : "h1", ...props });
136
+ const H2 = (props) => /* @__PURE__ */ jsx(Typography, { variant: "h2", ...props });
137
+ const H3 = (props) => /* @__PURE__ */ jsx(Typography, { variant: "h3", ...props });
138
+ const H4 = (props) => /* @__PURE__ */ jsx(Typography, { variant: "h4", ...props });
139
+ const H5 = (props) => /* @__PURE__ */ jsx(Typography, { variant: "h5", ...props });
140
+ const H6 = (props) => /* @__PURE__ */ jsx(Typography, { variant: "h6", ...props });
141
+ const Body1 = ({ bold, ...props }) => /* @__PURE__ */ jsx(Typography, { variant: bold ? "body1Bold" : "body1", ...props });
142
+ const Body2 = ({ bold, ...props }) => /* @__PURE__ */ jsx(Typography, { variant: bold ? "body2Bold" : "body2", ...props });
143
+ const Body3 = ({ bold, ...props }) => /* @__PURE__ */ jsx(Typography, { variant: bold ? "body3Bold" : "body3", ...props });
144
+ const Compact = ({ bold, ...props }) => /* @__PURE__ */ jsx(Typography, { variant: bold ? "compactBold" : "compact", ...props });
145
+ const Micro = ({ bold, ...props }) => /* @__PURE__ */ jsx(Typography, { variant: bold ? "microBold" : "micro", ...props });
146
+ const Mono = ({
147
+ size = "normal",
148
+ tabular = true,
149
+ // Default to tabular for mono
150
+ ...props
151
+ }) => {
152
+ const variant = size === "compact" ? "monoCompact" : size === "small" ? "monoSmall" : "mono";
153
+ return /* @__PURE__ */ jsx(Typography, { variant, tabular, ...props });
154
+ };
155
+ const DataText = ({ size = "normal", ...props }) => {
156
+ const variantMap = {
157
+ large: "mono",
158
+ normal: "mono",
159
+ small: "monoSmall",
160
+ compact: "monoCompact"
161
+ };
162
+ return /* @__PURE__ */ jsx(Typography, { variant: variantMap[size], tabular: true, ...props });
163
+ };
164
+ const Label = ({ bold, ...props }) => /* @__PURE__ */ jsx(Typography, { variant: bold ? "control1Bold" : "control1", as: "label", ...props });
165
+ export {
166
+ Body1,
167
+ Body2,
168
+ Body3,
169
+ Compact,
170
+ DataText,
171
+ Display1,
172
+ Display2,
173
+ FONT_FAMILY_MONO,
174
+ FONT_FAMILY_PRIMARY,
175
+ FONT_WEIGHTS,
176
+ H1,
177
+ H2,
178
+ H3,
179
+ H4,
180
+ H5,
181
+ H6,
182
+ Label,
183
+ Micro,
184
+ Mono,
185
+ Typography
186
+ };
187
+ //# sourceMappingURL=Typography.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Typography.js","sources":["../../../src/react/core/Typography.tsx"],"sourcesContent":["/**\r\n * @zendir/ui - Typography Component\r\n * \r\n * AstroUXDS-compliant typography component providing consistent text styling\r\n * across the design system. All sizing uses rem units per Astro specifications.\r\n * \r\n * Typography Scale (Astro UX Design System):\r\n * - Display: Large hero text (display1, display2)\r\n * - Heading: Section headers (h1-h6)\r\n * - Body: Content text (body1, body2, body3)\r\n * - Control: UI element labels\r\n * - Mono: Tabular/code data\r\n * \r\n * @see https://www.astrouxds.com/foundations/typography/\r\n */\r\n\r\nimport React from 'react';\r\nimport { useTheme } from '../theme/ThemeProvider';\r\n\r\n// ============================================================================\r\n// Typography Variants (AstroUXDS Compliant)\r\n// ============================================================================\r\n\r\n/**\r\n * Typography variant following Astro UX Design System\r\n * Maps directly to official Astro typography tokens\r\n */\r\nexport type TypographyVariant =\r\n // Display - Large hero text\r\n | 'display1'\r\n | 'display2'\r\n // Headings\r\n | 'h1'\r\n | 'h1Bold'\r\n | 'h2'\r\n | 'h3'\r\n | 'h4'\r\n | 'h5'\r\n | 'h6'\r\n // Body text\r\n | 'body1'\r\n | 'body1Bold'\r\n | 'body2'\r\n | 'body2Bold'\r\n | 'body3'\r\n | 'body3Bold'\r\n // Control (UI labels)\r\n | 'control1'\r\n | 'control1Bold'\r\n // Compact variants for dense UIs (cards, badges)\r\n | 'compact' // 10px - for tight spaces\r\n | 'compactBold'\r\n | 'micro' // 9px - for very tight spaces\r\n | 'microBold'\r\n // Monospace for data/code\r\n | 'mono'\r\n | 'monoSmall'\r\n | 'monoCompact';\r\n\r\n/**\r\n * Semantic element to render\r\n */\r\nexport type TypographyElement =\r\n | 'h1'\r\n | 'h2'\r\n | 'h3'\r\n | 'h4'\r\n | 'h5'\r\n | 'h6'\r\n | 'p'\r\n | 'span'\r\n | 'div'\r\n | 'label'\r\n | 'code'\r\n | 'pre';\r\n\r\n/**\r\n * Text color variants\r\n */\r\nexport type TypographyColor =\r\n | 'primary'\r\n | 'secondary'\r\n | 'tertiary'\r\n | 'muted'\r\n | 'inverse'\r\n | 'inherit'\r\n // Status colors\r\n | 'normal'\r\n | 'standby'\r\n | 'caution'\r\n | 'serious'\r\n | 'critical'\r\n | 'off';\r\n\r\nexport interface TypographyProps {\r\n /** Typography variant (required) */\r\n variant: TypographyVariant;\r\n /** HTML element to render */\r\n as?: TypographyElement;\r\n /** Text color */\r\n color?: TypographyColor;\r\n /** Enable tabular figures for numeric alignment */\r\n tabular?: boolean;\r\n /** Truncate with ellipsis */\r\n truncate?: boolean;\r\n /** Text alignment */\r\n align?: 'left' | 'center' | 'right';\r\n /** Disable text wrapping */\r\n noWrap?: boolean;\r\n /** Transform text case */\r\n transform?: 'none' | 'uppercase' | 'lowercase' | 'capitalize';\r\n /** Additional CSS styles */\r\n style?: React.CSSProperties;\r\n /** Additional CSS class */\r\n className?: string;\r\n /** Children */\r\n children?: React.ReactNode;\r\n /** Test ID */\r\n 'data-testid'?: string;\r\n}\r\n\r\n// ============================================================================\r\n// AstroUXDS Font Stack (Standardized)\r\n// ============================================================================\r\n\r\n/**\r\n * Standard font family fallback stack per AstroUXDS\r\n * Roboto is the primary font for all Astro applications\r\n */\r\nexport const FONT_FAMILY_PRIMARY = '\"Roboto\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Helvetica Neue\", Arial, sans-serif';\r\n\r\n/**\r\n * Monospace font stack for tabular data and code\r\n * Roboto Mono is the primary monospace font for Astro\r\n */\r\nexport const FONT_FAMILY_MONO = '\"Roboto Mono\", \"SF Mono\", \"Consolas\", \"Liberation Mono\", monospace';\r\n\r\n// ============================================================================\r\n// AstroUXDS Font Weights\r\n// Official weights: 300 (Light), 400 (Regular), 500 (Medium), 700 (Bold)\r\n// Note: Astro does NOT use 600 (semibold) - use 500 or 700 instead\r\n// ============================================================================\r\n\r\nexport const FONT_WEIGHTS = {\r\n light: 300,\r\n regular: 400,\r\n medium: 500,\r\n bold: 700,\r\n} as const;\r\n\r\n// ============================================================================\r\n// Typography Style Definitions\r\n// ============================================================================\r\n\r\ninterface TypographyStyleDef {\r\n fontSize: string;\r\n fontWeight: number;\r\n lineHeight: string;\r\n letterSpacing: string;\r\n fontFamily?: string;\r\n}\r\n\r\n/**\r\n * Get typography styles for a variant\r\n * All sizes in rem for Astro compliance\r\n */\r\nfunction getTypographyStyles(variant: TypographyVariant): TypographyStyleDef {\r\n const styles: Record<TypographyVariant, TypographyStyleDef> = {\r\n // Display variants\r\n display1: { fontSize: '3.75rem', fontWeight: 300, lineHeight: '4.375rem', letterSpacing: '-0.5px' },\r\n display2: { fontSize: '3rem', fontWeight: 400, lineHeight: '3.5rem', letterSpacing: '0' },\r\n \r\n // Heading variants\r\n h1: { fontSize: '2.125rem', fontWeight: 400, lineHeight: '2.5rem', letterSpacing: '0.25px' },\r\n h1Bold: { fontSize: '2.125rem', fontWeight: 700, lineHeight: '2.5rem', letterSpacing: '0.25px' },\r\n h2: { fontSize: '1.5rem', fontWeight: 400, lineHeight: '1.75rem', letterSpacing: '0' },\r\n h3: { fontSize: '1.25rem', fontWeight: 500, lineHeight: '1.5rem', letterSpacing: '0.15px' },\r\n h4: { fontSize: '1.25rem', fontWeight: 300, lineHeight: '1.5rem', letterSpacing: '0.15px' },\r\n h5: { fontSize: '1.125rem', fontWeight: 400, lineHeight: '1.5rem', letterSpacing: '0' },\r\n h6: { fontSize: '1.125rem', fontWeight: 300, lineHeight: '1.5rem', letterSpacing: '0' },\r\n \r\n // Body variants\r\n body1: { fontSize: '1rem', fontWeight: 400, lineHeight: '1.5rem', letterSpacing: '0.5px' },\r\n body1Bold: { fontSize: '1rem', fontWeight: 700, lineHeight: '1.5rem', letterSpacing: '0.5px' },\r\n body2: { fontSize: '0.875rem', fontWeight: 400, lineHeight: '1.25rem', letterSpacing: '0.5px' },\r\n body2Bold: { fontSize: '0.875rem', fontWeight: 700, lineHeight: '1.25rem', letterSpacing: '0.5px' },\r\n body3: { fontSize: '0.75rem', fontWeight: 400, lineHeight: '1rem', letterSpacing: '0' },\r\n body3Bold: { fontSize: '0.75rem', fontWeight: 700, lineHeight: '1rem', letterSpacing: '0' },\r\n \r\n // Control variants (UI labels)\r\n control1: { fontSize: '1rem', fontWeight: 400, lineHeight: '1.25rem', letterSpacing: '0.5px' },\r\n control1Bold: { fontSize: '1rem', fontWeight: 700, lineHeight: '1.25rem', letterSpacing: '0.5px' },\r\n \r\n // Compact variants for dense UIs (cards, badges, data labels)\r\n compact: { fontSize: '0.625rem', fontWeight: 400, lineHeight: '0.875rem', letterSpacing: '0' }, // 10px\r\n compactBold: { fontSize: '0.625rem', fontWeight: 500, lineHeight: '0.875rem', letterSpacing: '0' },\r\n micro: { fontSize: '0.5625rem', fontWeight: 400, lineHeight: '0.75rem', letterSpacing: '0' }, // 9px\r\n microBold: { fontSize: '0.5625rem', fontWeight: 500, lineHeight: '0.75rem', letterSpacing: '0' },\r\n \r\n // Monospace variants for data/code\r\n mono: { fontSize: '0.875rem', fontWeight: 400, lineHeight: '1.25rem', letterSpacing: '0', fontFamily: FONT_FAMILY_MONO },\r\n monoSmall: { fontSize: '0.75rem', fontWeight: 400, lineHeight: '1rem', letterSpacing: '0', fontFamily: FONT_FAMILY_MONO },\r\n monoCompact: { fontSize: '0.625rem', fontWeight: 400, lineHeight: '0.875rem', letterSpacing: '0', fontFamily: FONT_FAMILY_MONO },\r\n };\r\n \r\n return styles[variant];\r\n}\r\n\r\n/**\r\n * Get default HTML element for variant\r\n */\r\nfunction getDefaultElement(variant: TypographyVariant): TypographyElement {\r\n if (variant.startsWith('display')) return 'h1';\r\n if (variant.startsWith('h1')) return 'h1';\r\n if (variant.startsWith('h2')) return 'h2';\r\n if (variant.startsWith('h3')) return 'h3';\r\n if (variant.startsWith('h4')) return 'h4';\r\n if (variant.startsWith('h5')) return 'h5';\r\n if (variant.startsWith('h6')) return 'h6';\r\n if (variant.startsWith('mono')) return 'code';\r\n if (variant.startsWith('control')) return 'label';\r\n return 'span';\r\n}\r\n\r\n// ============================================================================\r\n// Typography Component\r\n// ============================================================================\r\n\r\n/**\r\n * Typography component providing AstroUXDS-compliant text styling.\r\n * \r\n * @example\r\n * ```tsx\r\n * // Heading\r\n * <Typography variant=\"h3\">Section Title</Typography>\r\n * \r\n * // Body text\r\n * <Typography variant=\"body1\" color=\"secondary\">Description text</Typography>\r\n * \r\n * // Monospace data with tabular figures\r\n * <Typography variant=\"mono\" tabular>123.456</Typography>\r\n * \r\n * // Compact label for cards\r\n * <Typography variant=\"compact\" color=\"tertiary\">LABEL</Typography>\r\n * ```\r\n */\r\nexport const Typography: React.FC<TypographyProps> = ({\r\n variant,\r\n as,\r\n color = 'primary',\r\n tabular = false,\r\n truncate = false,\r\n align,\r\n noWrap = false,\r\n transform,\r\n style,\r\n className,\r\n children,\r\n 'data-testid': testId,\r\n}) => {\r\n const { tokens } = useTheme();\r\n \r\n const typographyStyles = getTypographyStyles(variant);\r\n const Element = as || getDefaultElement(variant);\r\n \r\n // Resolve color\r\n const getColor = (): string | undefined => {\r\n if (color === 'inherit') return 'inherit';\r\n if (color === 'primary') return tokens.colors.text.primary;\r\n if (color === 'secondary') return tokens.colors.text.secondary;\r\n if (color === 'tertiary') return tokens.colors.text.tertiary;\r\n if (color === 'muted') return tokens.colors.text.muted || tokens.colors.text.tertiary;\r\n if (color === 'inverse') return tokens.colors.text.inverse;\r\n // Status colors\r\n if (color === 'normal') return tokens.colors.status.normal;\r\n if (color === 'standby') return tokens.colors.status.standby;\r\n if (color === 'caution') return tokens.colors.status.caution;\r\n if (color === 'serious') return tokens.colors.status.serious;\r\n if (color === 'critical') return tokens.colors.status.critical;\r\n if (color === 'off') return tokens.colors.status.off;\r\n return undefined;\r\n };\r\n \r\n const combinedStyle: React.CSSProperties = {\r\n fontFamily: typographyStyles.fontFamily || FONT_FAMILY_PRIMARY,\r\n fontSize: typographyStyles.fontSize,\r\n fontWeight: typographyStyles.fontWeight,\r\n lineHeight: typographyStyles.lineHeight,\r\n letterSpacing: typographyStyles.letterSpacing,\r\n color: getColor(),\r\n margin: 0,\r\n padding: 0,\r\n // Tabular figures for numeric alignment\r\n ...(tabular && {\r\n fontVariantNumeric: 'tabular-nums',\r\n fontFeatureSettings: '\"tnum\"',\r\n }),\r\n // Truncation\r\n ...(truncate && {\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap',\r\n }),\r\n // No wrap\r\n ...(noWrap && !truncate && {\r\n whiteSpace: 'nowrap',\r\n }),\r\n // Text alignment\r\n ...(align && { textAlign: align }),\r\n // Text transform\r\n ...(transform && { textTransform: transform }),\r\n // Custom styles (can override defaults)\r\n ...style,\r\n };\r\n \r\n return (\r\n <Element\r\n className={className}\r\n style={combinedStyle}\r\n data-testid={testId}\r\n >\r\n {children}\r\n </Element>\r\n );\r\n};\r\n\r\n// ============================================================================\r\n// Convenience Components\r\n// ============================================================================\r\n\r\n/** Display 1 - Largest display text */\r\nexport const Display1: React.FC<Omit<TypographyProps, 'variant'>> = (props) => (\r\n <Typography variant=\"display1\" {...props} />\r\n);\r\n\r\n/** Display 2 - Large display text */\r\nexport const Display2: React.FC<Omit<TypographyProps, 'variant'>> = (props) => (\r\n <Typography variant=\"display2\" {...props} />\r\n);\r\n\r\n/** Heading 1 */\r\nexport const H1: React.FC<Omit<TypographyProps, 'variant'> & { bold?: boolean }> = ({ bold, ...props }) => (\r\n <Typography variant={bold ? 'h1Bold' : 'h1'} {...props} />\r\n);\r\n\r\n/** Heading 2 */\r\nexport const H2: React.FC<Omit<TypographyProps, 'variant'>> = (props) => (\r\n <Typography variant=\"h2\" {...props} />\r\n);\r\n\r\n/** Heading 3 */\r\nexport const H3: React.FC<Omit<TypographyProps, 'variant'>> = (props) => (\r\n <Typography variant=\"h3\" {...props} />\r\n);\r\n\r\n/** Heading 4 */\r\nexport const H4: React.FC<Omit<TypographyProps, 'variant'>> = (props) => (\r\n <Typography variant=\"h4\" {...props} />\r\n);\r\n\r\n/** Heading 5 */\r\nexport const H5: React.FC<Omit<TypographyProps, 'variant'>> = (props) => (\r\n <Typography variant=\"h5\" {...props} />\r\n);\r\n\r\n/** Heading 6 */\r\nexport const H6: React.FC<Omit<TypographyProps, 'variant'>> = (props) => (\r\n <Typography variant=\"h6\" {...props} />\r\n);\r\n\r\n/** Body text level 1 (16px) */\r\nexport const Body1: React.FC<Omit<TypographyProps, 'variant'> & { bold?: boolean }> = ({ bold, ...props }) => (\r\n <Typography variant={bold ? 'body1Bold' : 'body1'} {...props} />\r\n);\r\n\r\n/** Body text level 2 (14px) */\r\nexport const Body2: React.FC<Omit<TypographyProps, 'variant'> & { bold?: boolean }> = ({ bold, ...props }) => (\r\n <Typography variant={bold ? 'body2Bold' : 'body2'} {...props} />\r\n);\r\n\r\n/** Body text level 3 (12px) */\r\nexport const Body3: React.FC<Omit<TypographyProps, 'variant'> & { bold?: boolean }> = ({ bold, ...props }) => (\r\n <Typography variant={bold ? 'body3Bold' : 'body3'} {...props} />\r\n);\r\n\r\n/** Compact text for dense UIs (10px) */\r\nexport const Compact: React.FC<Omit<TypographyProps, 'variant'> & { bold?: boolean }> = ({ bold, ...props }) => (\r\n <Typography variant={bold ? 'compactBold' : 'compact'} {...props} />\r\n);\r\n\r\n/** Micro text for very tight spaces (9px) */\r\nexport const Micro: React.FC<Omit<TypographyProps, 'variant'> & { bold?: boolean }> = ({ bold, ...props }) => (\r\n <Typography variant={bold ? 'microBold' : 'micro'} {...props} />\r\n);\r\n\r\n/** Monospace text for data/code */\r\nexport const Mono: React.FC<Omit<TypographyProps, 'variant'> & { size?: 'normal' | 'small' | 'compact' }> = ({ \r\n size = 'normal', \r\n tabular = true, // Default to tabular for mono\r\n ...props \r\n}) => {\r\n const variant = size === 'compact' ? 'monoCompact' : size === 'small' ? 'monoSmall' : 'mono';\r\n return <Typography variant={variant} tabular={tabular} {...props} />;\r\n};\r\n\r\n/** Data value text - monospace with tabular figures (for numeric displays) */\r\nexport const DataText: React.FC<Omit<TypographyProps, 'variant' | 'tabular'> & { \r\n size?: 'large' | 'normal' | 'small' | 'compact';\r\n}> = ({ size = 'normal', ...props }) => {\r\n const variantMap: Record<string, TypographyVariant> = {\r\n large: 'mono',\r\n normal: 'mono',\r\n small: 'monoSmall',\r\n compact: 'monoCompact',\r\n };\r\n return <Typography variant={variantMap[size]} tabular {...props} />;\r\n};\r\n\r\n/** Label text for form controls and card headers */\r\nexport const Label: React.FC<Omit<TypographyProps, 'variant'> & { bold?: boolean }> = ({ bold, ...props }) => (\r\n <Typography variant={bold ? 'control1Bold' : 'control1'} as=\"label\" {...props} />\r\n);\r\n\r\nexport default Typography;\r\n"],"names":[],"mappings":"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"}