@zendir/ui 0.5.0 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (391) hide show
  1. package/CHANGELOG.md +419 -386
  2. package/README.md +640 -631
  3. package/dist/_virtual/_rolldown/runtime.js +13 -0
  4. package/dist/index.js +17 -221
  5. package/dist/react/3d/CesiumCaptureSource.d.ts +0 -1
  6. package/dist/react/3d/CesiumCaptureSource.js +364 -283
  7. package/dist/react/3d/CesiumCaptureSource.js.map +1 -1
  8. package/dist/react/3d/ZenSpace3D.d.ts +2 -3
  9. package/dist/react/3d/ZenSpace3D.js +1681 -1237
  10. package/dist/react/3d/ZenSpace3D.js.map +1 -1
  11. package/dist/react/3d/ZenSpace3DCesium.d.ts +0 -1
  12. package/dist/react/3d/ZenSpace3DCesium.js +513 -560
  13. package/dist/react/3d/ZenSpace3DCesium.js.map +1 -1
  14. package/dist/react/3d/ZenSpace3DShaders.js +61 -66
  15. package/dist/react/3d/ZenSpace3DShaders.js.map +1 -1
  16. package/dist/react/3d/ZenSpace3DTypes.d.ts +19 -20
  17. package/dist/react/3d/ZenSpace3DUtils.d.ts +0 -1
  18. package/dist/react/3d/ZenSpace3DUtils.js +37 -24
  19. package/dist/react/3d/ZenSpace3DUtils.js.map +1 -1
  20. package/dist/react/3d/capturePngAnalysis.js +42 -36
  21. package/dist/react/3d/capturePngAnalysis.js.map +1 -1
  22. package/dist/react/3d/index.d.ts +3 -3
  23. package/dist/react/3d/index.js +5 -53
  24. package/dist/react/3d/threeLoader.d.ts +1 -1
  25. package/dist/react/3d/threeLoader.js +23 -18
  26. package/dist/react/3d/threeLoader.js.map +1 -1
  27. package/dist/react/astro/ClassificationBanner.d.ts +2 -3
  28. package/dist/react/astro/ClassificationBanner.js +95 -79
  29. package/dist/react/astro/ClassificationBanner.js.map +1 -1
  30. package/dist/react/astro/GlobalStatusBar.d.ts +0 -1
  31. package/dist/react/astro/GlobalStatusBar.js +157 -163
  32. package/dist/react/astro/GlobalStatusBar.js.map +1 -1
  33. package/dist/react/astro/MissionClock.d.ts +7 -8
  34. package/dist/react/astro/MissionClock.js +377 -400
  35. package/dist/react/astro/MissionClock.js.map +1 -1
  36. package/dist/react/astro/MonitoringIcon.d.ts +1 -2
  37. package/dist/react/astro/MonitoringIcon.js +422 -358
  38. package/dist/react/astro/MonitoringIcon.js.map +1 -1
  39. package/dist/react/astro/Notification.d.ts +1 -2
  40. package/dist/react/astro/Notification.js +229 -126
  41. package/dist/react/astro/Notification.js.map +1 -1
  42. package/dist/react/astro/Progress.d.ts +0 -1
  43. package/dist/react/astro/Progress.js +199 -141
  44. package/dist/react/astro/Progress.js.map +1 -1
  45. package/dist/react/astro/SimulationControls.d.ts +3 -4
  46. package/dist/react/astro/SimulationControls.js +596 -650
  47. package/dist/react/astro/SimulationControls.js.map +1 -1
  48. package/dist/react/astro/StatusIndicator.d.ts +0 -1
  49. package/dist/react/astro/StatusIndicator.js +236 -170
  50. package/dist/react/astro/StatusIndicator.js.map +1 -1
  51. package/dist/react/astro/UnifiedTimeline.d.ts +9 -10
  52. package/dist/react/astro/UnifiedTimeline.js +2345 -2392
  53. package/dist/react/astro/UnifiedTimeline.js.map +1 -1
  54. package/dist/react/astro/index.d.ts +5 -5
  55. package/dist/react/astro/index.js +1 -25
  56. package/dist/react/cards/AccessCard.d.ts +0 -1
  57. package/dist/react/cards/AccessCard.js +471 -405
  58. package/dist/react/cards/AccessCard.js.map +1 -1
  59. package/dist/react/cards/OrbitCard.d.ts +0 -1
  60. package/dist/react/cards/OrbitCard.js +487 -364
  61. package/dist/react/cards/OrbitCard.js.map +1 -1
  62. package/dist/react/cards/SpacecraftCard.d.ts +0 -1
  63. package/dist/react/cards/SpacecraftCard.js +813 -925
  64. package/dist/react/cards/SpacecraftCard.js.map +1 -1
  65. package/dist/react/cards/TelemetryCard.d.ts +0 -1
  66. package/dist/react/cards/TelemetryCard.js +1055 -732
  67. package/dist/react/cards/TelemetryCard.js.map +1 -1
  68. package/dist/react/cards/TelemetryStreamCard.d.ts +0 -1
  69. package/dist/react/cards/TelemetryStreamCard.js +323 -297
  70. package/dist/react/cards/TelemetryStreamCard.js.map +1 -1
  71. package/dist/react/cards/index.d.ts +1 -1
  72. package/dist/react/cards/index.js +1 -8
  73. package/dist/react/charts/GroundTrackMap.d.ts +6 -7
  74. package/dist/react/charts/GroundTrackMap.js +1377 -1256
  75. package/dist/react/charts/GroundTrackMap.js.map +1 -1
  76. package/dist/react/charts/GroundTrackMapLeaflet.d.ts +1 -2
  77. package/dist/react/charts/GroundTrackMapLeaflet.js +1065 -987
  78. package/dist/react/charts/GroundTrackMapLeaflet.js.map +1 -1
  79. package/dist/react/charts/groundTrackMapLeafletTiles.js +34 -25
  80. package/dist/react/charts/groundTrackMapLeafletTiles.js.map +1 -1
  81. package/dist/react/charts/groundTrackMapLeafletUtils.js +70 -61
  82. package/dist/react/charts/groundTrackMapLeafletUtils.js.map +1 -1
  83. package/dist/react/charts/index.d.ts +1 -1
  84. package/dist/react/charts/index.js +7 -100
  85. package/dist/react/charts/unified/AstroChart.d.ts +1 -2
  86. package/dist/react/charts/unified/AstroChart.js +1331 -1411
  87. package/dist/react/charts/unified/AstroChart.js.map +1 -1
  88. package/dist/react/charts/unified/PowerOverviewChart.d.ts +3 -3
  89. package/dist/react/charts/unified/PowerOverviewChart.js +495 -478
  90. package/dist/react/charts/unified/PowerOverviewChart.js.map +1 -1
  91. package/dist/react/charts/unified/domain.d.ts +12 -13
  92. package/dist/react/charts/unified/domain.js +3999 -3145
  93. package/dist/react/charts/unified/domain.js.map +1 -1
  94. package/dist/react/charts/unified/generators.d.ts +3 -4
  95. package/dist/react/charts/unified/generators.js +561 -498
  96. package/dist/react/charts/unified/generators.js.map +1 -1
  97. package/dist/react/charts/unified/index.d.ts +1 -1
  98. package/dist/react/charts/unified/presets.d.ts +14 -15
  99. package/dist/react/charts/unified/presets.js +857 -994
  100. package/dist/react/charts/unified/presets.js.map +1 -1
  101. package/dist/react/charts/unified/sync.d.ts +2 -3
  102. package/dist/react/charts/unified/sync.js +229 -195
  103. package/dist/react/charts/unified/sync.js.map +1 -1
  104. package/dist/react/charts/unified/theme.d.ts +11 -12
  105. package/dist/react/charts/unified/theme.js +606 -642
  106. package/dist/react/charts/unified/theme.js.map +1 -1
  107. package/dist/react/charts/unified/types.d.ts +32 -33
  108. package/dist/react/charts/unified/useChartStream.d.ts +1 -2
  109. package/dist/react/charts/unified/useChartStream.js +203 -216
  110. package/dist/react/charts/unified/useChartStream.js.map +1 -1
  111. package/dist/react/chatgpt/AppCard.d.ts +1 -2
  112. package/dist/react/chatgpt/index.d.ts +7 -7
  113. package/dist/react/chatgpt/index.js +160 -139
  114. package/dist/react/chatgpt/index.js.map +1 -1
  115. package/dist/react/context/CategoryContext.d.ts +0 -1
  116. package/dist/react/context/CategoryContext.js +78 -29
  117. package/dist/react/context/CategoryContext.js.map +1 -1
  118. package/dist/react/context/DisplaySettingsContext.d.ts +1 -2
  119. package/dist/react/context/DisplaySettingsContext.js +205 -156
  120. package/dist/react/context/DisplaySettingsContext.js.map +1 -1
  121. package/dist/react/context/SpatialSelectionContext.d.ts +0 -1
  122. package/dist/react/context/SpatialSelectionContext.js +36 -7
  123. package/dist/react/context/SpatialSelectionContext.js.map +1 -1
  124. package/dist/react/core/data/DataTable.d.ts +3 -4
  125. package/dist/react/core/data/DataTable.js +473 -440
  126. package/dist/react/core/data/DataTable.js.map +1 -1
  127. package/dist/react/core/data/DataValue.d.ts +4 -5
  128. package/dist/react/core/data/DataValue.js +605 -571
  129. package/dist/react/core/data/DataValue.js.map +1 -1
  130. package/dist/react/core/data/propertyConfig.d.ts +1 -2
  131. package/dist/react/core/data/propertyConfig.js +446 -382
  132. package/dist/react/core/data/propertyConfig.js.map +1 -1
  133. package/dist/react/core/display/AstroIcon.d.ts +4 -5
  134. package/dist/react/core/display/AstroIcon.js +339 -429
  135. package/dist/react/core/display/AstroIcon.js.map +1 -1
  136. package/dist/react/core/display/Badge.d.ts +2 -3
  137. package/dist/react/core/display/Badge.js +131 -131
  138. package/dist/react/core/display/Badge.js.map +1 -1
  139. package/dist/react/core/display/CardHeader.d.ts +0 -1
  140. package/dist/react/core/display/CardHeader.js +398 -311
  141. package/dist/react/core/display/CardHeader.js.map +1 -1
  142. package/dist/react/core/display/Container.d.ts +2 -3
  143. package/dist/react/core/display/Container.js +640 -668
  144. package/dist/react/core/display/Container.js.map +1 -1
  145. package/dist/react/core/display/CopyButton.d.ts +1 -2
  146. package/dist/react/core/display/CopyButton.js +158 -101
  147. package/dist/react/core/display/CopyButton.js.map +1 -1
  148. package/dist/react/core/display/GlassCard.d.ts +3 -4
  149. package/dist/react/core/display/GlassCard.js +416 -369
  150. package/dist/react/core/display/GlassCard.js.map +1 -1
  151. package/dist/react/core/display/HeaderIconWithStatus.d.ts +0 -1
  152. package/dist/react/core/display/HeaderIconWithStatus.js +152 -152
  153. package/dist/react/core/display/HeaderIconWithStatus.js.map +1 -1
  154. package/dist/react/core/display/Icon.d.ts +2 -3
  155. package/dist/react/core/display/Icon.js +172 -143
  156. package/dist/react/core/display/Icon.js.map +1 -1
  157. package/dist/react/core/display/Typography.d.ts +24 -25
  158. package/dist/react/core/display/Typography.js +360 -178
  159. package/dist/react/core/display/Typography.js.map +1 -1
  160. package/dist/react/core/feedback/ConfirmDialog.d.ts +1 -2
  161. package/dist/react/core/feedback/ConfirmDialog.js +343 -304
  162. package/dist/react/core/feedback/ConfirmDialog.js.map +1 -1
  163. package/dist/react/core/feedback/Dialog.d.ts +2 -3
  164. package/dist/react/core/feedback/Dialog.js +189 -197
  165. package/dist/react/core/feedback/Dialog.js.map +1 -1
  166. package/dist/react/core/feedback/Toast.d.ts +2 -3
  167. package/dist/react/core/feedback/Toast.js +346 -207
  168. package/dist/react/core/feedback/Toast.js.map +1 -1
  169. package/dist/react/core/index.d.ts +26 -26
  170. package/dist/react/core/index.js +7 -119
  171. package/dist/react/core/inputs/Button.d.ts +2 -3
  172. package/dist/react/core/inputs/Button.js +281 -304
  173. package/dist/react/core/inputs/Button.js.map +1 -1
  174. package/dist/react/core/inputs/Checkbox.d.ts +2 -3
  175. package/dist/react/core/inputs/Checkbox.js +139 -127
  176. package/dist/react/core/inputs/Checkbox.js.map +1 -1
  177. package/dist/react/core/inputs/Input.d.ts +3 -4
  178. package/dist/react/core/inputs/Input.js +277 -285
  179. package/dist/react/core/inputs/Input.js.map +1 -1
  180. package/dist/react/core/inputs/LimitsBar.d.ts +1 -2
  181. package/dist/react/core/inputs/LimitsBar.js +271 -196
  182. package/dist/react/core/inputs/LimitsBar.js.map +1 -1
  183. package/dist/react/core/inputs/NumberInput.d.ts +2 -3
  184. package/dist/react/core/inputs/NumberInput.js +531 -503
  185. package/dist/react/core/inputs/NumberInput.js.map +1 -1
  186. package/dist/react/core/inputs/PinInput.d.ts +2 -3
  187. package/dist/react/core/inputs/PinInput.js +224 -207
  188. package/dist/react/core/inputs/PinInput.js.map +1 -1
  189. package/dist/react/core/inputs/Select.d.ts +1 -2
  190. package/dist/react/core/inputs/Select.js +298 -299
  191. package/dist/react/core/inputs/Select.js.map +1 -1
  192. package/dist/react/core/inputs/Toggle.d.ts +2 -3
  193. package/dist/react/core/inputs/Toggle.js +142 -148
  194. package/dist/react/core/inputs/Toggle.js.map +1 -1
  195. package/dist/react/core/layout/Box.d.ts +3 -4
  196. package/dist/react/core/layout/Box.js +118 -122
  197. package/dist/react/core/layout/Box.js.map +1 -1
  198. package/dist/react/core/layout/Center.d.ts +0 -1
  199. package/dist/react/core/layout/Center.js +45 -32
  200. package/dist/react/core/layout/Center.js.map +1 -1
  201. package/dist/react/core/layout/Divider.d.ts +1 -2
  202. package/dist/react/core/layout/Divider.js +112 -106
  203. package/dist/react/core/layout/Divider.js.map +1 -1
  204. package/dist/react/core/layout/Flex.d.ts +4 -5
  205. package/dist/react/core/layout/Flex.js +120 -124
  206. package/dist/react/core/layout/Flex.js.map +1 -1
  207. package/dist/react/core/layout/Grid.d.ts +5 -6
  208. package/dist/react/core/layout/Grid.js +131 -138
  209. package/dist/react/core/layout/Grid.js.map +1 -1
  210. package/dist/react/core/layout/Spacer.d.ts +0 -1
  211. package/dist/react/core/layout/Spacer.js +36 -29
  212. package/dist/react/core/layout/Spacer.js.map +1 -1
  213. package/dist/react/core/layout/Stack.d.ts +4 -5
  214. package/dist/react/core/layout/Stack.js +127 -70
  215. package/dist/react/core/layout/Stack.js.map +1 -1
  216. package/dist/react/core/layout/responsive.d.ts +1 -2
  217. package/dist/react/core/layout/responsive.js +25 -19
  218. package/dist/react/core/layout/responsive.js.map +1 -1
  219. package/dist/react/core/layout/useBreakpoint.d.ts +1 -1
  220. package/dist/react/core/layout/useBreakpoint.js +119 -66
  221. package/dist/react/core/layout/useBreakpoint.js.map +1 -1
  222. package/dist/react/core/navigation/AppBar.d.ts +1 -2
  223. package/dist/react/core/navigation/AppBar.js +827 -805
  224. package/dist/react/core/navigation/AppBar.js.map +1 -1
  225. package/dist/react/core/navigation/Pagination.d.ts +2 -3
  226. package/dist/react/core/navigation/Pagination.js +207 -187
  227. package/dist/react/core/navigation/Pagination.js.map +1 -1
  228. package/dist/react/core/navigation/SideNav.d.ts +5 -6
  229. package/dist/react/core/navigation/SideNav.js +855 -629
  230. package/dist/react/core/navigation/SideNav.js.map +1 -1
  231. package/dist/react/core/navigation/Tabs.d.ts +0 -1
  232. package/dist/react/core/navigation/Tabs.js +113 -119
  233. package/dist/react/core/navigation/Tabs.js.map +1 -1
  234. package/dist/react/core/overlays/Popover.d.ts +2 -3
  235. package/dist/react/core/overlays/Popover.js +303 -282
  236. package/dist/react/core/overlays/Popover.js.map +1 -1
  237. package/dist/react/core/overlays/SidePanel.d.ts +1 -2
  238. package/dist/react/core/overlays/SidePanel.js +217 -212
  239. package/dist/react/core/overlays/SidePanel.js.map +1 -1
  240. package/dist/react/core/overlays/Tooltip.d.ts +1 -2
  241. package/dist/react/core/overlays/Tooltip.js +170 -176
  242. package/dist/react/core/overlays/Tooltip.js.map +1 -1
  243. package/dist/react/core/widgets/ActivityPlanner.d.ts +0 -1
  244. package/dist/react/core/widgets/ActivityPlanner.js +855 -517
  245. package/dist/react/core/widgets/ActivityPlanner.js.map +1 -1
  246. package/dist/react/core/widgets/Capture.d.ts +2 -3
  247. package/dist/react/core/widgets/Capture.js +965 -779
  248. package/dist/react/core/widgets/Capture.js.map +1 -1
  249. package/dist/react/core/widgets/ChatPanel.d.ts +16 -17
  250. package/dist/react/core/widgets/ChatPanel.js +1734 -1034
  251. package/dist/react/core/widgets/ChatPanel.js.map +1 -1
  252. package/dist/react/core/widgets/ColorPickerPanel.d.ts +0 -1
  253. package/dist/react/core/widgets/ColorPickerPanel.js +298 -287
  254. package/dist/react/core/widgets/ColorPickerPanel.js.map +1 -1
  255. package/dist/react/core/widgets/CommandBuilder.d.ts +2 -3
  256. package/dist/react/core/widgets/CommandBuilder.js +624 -516
  257. package/dist/react/core/widgets/CommandBuilder.js.map +1 -1
  258. package/dist/react/core/widgets/ConnectionForm.d.ts +2 -3
  259. package/dist/react/core/widgets/ConnectionForm.js +528 -492
  260. package/dist/react/core/widgets/ConnectionForm.js.map +1 -1
  261. package/dist/react/core/widgets/FileExplorer.d.ts +3 -4
  262. package/dist/react/core/widgets/FileExplorer.js +617 -505
  263. package/dist/react/core/widgets/FileExplorer.js.map +1 -1
  264. package/dist/react/core/widgets/HexViewer.d.ts +2 -3
  265. package/dist/react/core/widgets/HexViewer.js +1353 -1091
  266. package/dist/react/core/widgets/HexViewer.js.map +1 -1
  267. package/dist/react/core/widgets/ImageFrame.d.ts +1 -2
  268. package/dist/react/core/widgets/ImageFrame.js +230 -193
  269. package/dist/react/core/widgets/ImageFrame.js.map +1 -1
  270. package/dist/react/core/widgets/ImageGallery.d.ts +2 -1
  271. package/dist/react/core/widgets/ImageGallery.js +380 -314
  272. package/dist/react/core/widgets/ImageGallery.js.map +1 -1
  273. package/dist/react/core/widgets/ImagePanel.d.ts +0 -1
  274. package/dist/react/core/widgets/ImagePanel.js +110 -101
  275. package/dist/react/core/widgets/ImagePanel.js.map +1 -1
  276. package/dist/react/core/widgets/LogViewer.d.ts +2 -3
  277. package/dist/react/core/widgets/LogViewer.js +711 -607
  278. package/dist/react/core/widgets/LogViewer.js.map +1 -1
  279. package/dist/react/core/widgets/MessageStream.d.ts +3 -4
  280. package/dist/react/core/widgets/MessageStream.js +514 -444
  281. package/dist/react/core/widgets/MessageStream.js.map +1 -1
  282. package/dist/react/core/widgets/MissionCalendar.d.ts +3 -4
  283. package/dist/react/core/widgets/MissionCalendar.js +1488 -1020
  284. package/dist/react/core/widgets/MissionCalendar.js.map +1 -1
  285. package/dist/react/core/widgets/PacketViewer.d.ts +2 -3
  286. package/dist/react/core/widgets/PacketViewer.js +550 -421
  287. package/dist/react/core/widgets/PacketViewer.js.map +1 -1
  288. package/dist/react/core/widgets/capture-placeholder.png.js +6 -5
  289. package/dist/react/core/widgets/capture-placeholder.png.js.map +1 -1
  290. package/dist/react/hooks/index.d.ts +5 -5
  291. package/dist/react/hooks/useAccessWindows.d.ts +0 -1
  292. package/dist/react/hooks/useCompactMode.d.ts +1 -1
  293. package/dist/react/hooks/useCompactMode.js +104 -58
  294. package/dist/react/hooks/useCompactMode.js.map +1 -1
  295. package/dist/react/hooks/useGroundTrackHistory.d.ts +0 -1
  296. package/dist/react/hooks/useSimulationScene.d.ts +1 -2
  297. package/dist/react/hooks/useSimulationScene.js +481 -374
  298. package/dist/react/hooks/useSimulationScene.js.map +1 -1
  299. package/dist/react/index.d.ts +3 -3
  300. package/dist/react/panels/LayerControlPanel.d.ts +1 -2
  301. package/dist/react/panels/LayerControlPanel.js +223 -180
  302. package/dist/react/panels/LayerControlPanel.js.map +1 -1
  303. package/dist/react/panels/ObjectInventoryPanel.d.ts +2 -3
  304. package/dist/react/panels/ObjectInventoryPanel.js +315 -250
  305. package/dist/react/panels/ObjectInventoryPanel.js.map +1 -1
  306. package/dist/react/panels/index.d.ts +1 -1
  307. package/dist/react/panels/index.js +1 -6
  308. package/dist/react/shared/ErrorBoundary.d.ts +1 -2
  309. package/dist/react/shared/ErrorBoundary.js +170 -139
  310. package/dist/react/shared/ErrorBoundary.js.map +1 -1
  311. package/dist/react/shared/Skeleton.d.ts +1 -2
  312. package/dist/react/shared/Skeleton.js +300 -301
  313. package/dist/react/shared/Skeleton.js.map +1 -1
  314. package/dist/react/theme/ThemeProvider.d.ts +2 -321
  315. package/dist/react/theme/ThemeProvider.js +313 -939
  316. package/dist/react/theme/ThemeProvider.js.map +1 -1
  317. package/dist/react/theme/cardAccent.d.ts +1 -2
  318. package/dist/react/theme/cardAccent.js +196 -126
  319. package/dist/react/theme/cardAccent.js.map +1 -1
  320. package/dist/react/theme/config.d.ts +0 -1
  321. package/dist/react/theme/config.js +47 -25
  322. package/dist/react/theme/config.js.map +1 -1
  323. package/dist/react/theme/index.d.ts +2 -2
  324. package/dist/react/theme/index.js +1 -16
  325. package/dist/react/theme/types.d.ts +332 -0
  326. package/dist/react/theme/types.js +39 -0
  327. package/dist/react/theme/types.js.map +1 -0
  328. package/dist/react/types.d.ts +8 -8
  329. package/dist/react/types.js +147 -47
  330. package/dist/react/types.js.map +1 -1
  331. package/dist/react/utils/categoryPalette.d.ts +0 -1
  332. package/dist/react/utils/categoryPalette.js +91 -102
  333. package/dist/react/utils/categoryPalette.js.map +1 -1
  334. package/dist/react/utils/index.d.ts +5 -5
  335. package/dist/react/utils/index.js +457 -371
  336. package/dist/react/utils/index.js.map +1 -1
  337. package/dist/react/visualizations/EclipseTimerCard.d.ts +0 -1
  338. package/dist/react/visualizations/LinkBudgetCard.d.ts +0 -1
  339. package/dist/react/visualizations/NavBallCard.d.ts +0 -1
  340. package/dist/react/visualizations/PropulsionCard.d.ts +1 -2
  341. package/dist/react/visualizations/SensorFootprintCard.d.ts +1 -2
  342. package/dist/react/visualizations/ThermalHeatmapCard.d.ts +0 -1
  343. package/dist/react/visualizations/index.d.ts +3 -3
  344. package/dist/react.d.ts +2 -1
  345. package/dist/react.js +17 -221
  346. package/dist/shaders/atmosphere.frag.js +6 -5
  347. package/dist/shaders/atmosphere.frag.js.map +1 -1
  348. package/dist/shaders/atmosphere.vert.js +6 -5
  349. package/dist/shaders/atmosphere.vert.js.map +1 -1
  350. package/dist/shaders/stars.frag.js +6 -5
  351. package/dist/shaders/stars.frag.js.map +1 -1
  352. package/dist/shaders/stars.vert.js +6 -5
  353. package/dist/shaders/stars.vert.js.map +1 -1
  354. package/dist/style.css +26 -3
  355. package/dist/tokens/core.d.ts +159 -0
  356. package/dist/tokens/core.js +144 -0
  357. package/dist/tokens/core.js.map +1 -0
  358. package/dist/tokens/css-vars.d.ts +213 -2
  359. package/dist/tokens/css-vars.js +590 -227
  360. package/dist/tokens/css-vars.js.map +1 -1
  361. package/dist/tokens/index.d.ts +31 -228
  362. package/dist/tokens/index.js +281 -366
  363. package/dist/tokens/index.js.map +1 -1
  364. package/dist/tokens/palettes/astro.d.ts +129 -0
  365. package/dist/tokens/palettes/astro.js +112 -0
  366. package/dist/tokens/palettes/astro.js.map +1 -0
  367. package/dist/tokens/palettes/index.d.ts +288 -0
  368. package/dist/tokens/palettes/index.js +35 -0
  369. package/dist/tokens/palettes/index.js.map +1 -0
  370. package/dist/tokens/palettes/tailwind.d.ts +324 -0
  371. package/dist/tokens/palettes/tailwind.js +201 -0
  372. package/dist/tokens/palettes/tailwind.js.map +1 -0
  373. package/dist/tokens/palettes/zendir.d.ts +126 -0
  374. package/dist/tokens/palettes/zendir.js +92 -0
  375. package/dist/tokens/palettes/zendir.js.map +1 -0
  376. package/dist/tokens/themes.d.ts +30 -0
  377. package/dist/tokens/themes.js +704 -0
  378. package/dist/tokens/themes.js.map +1 -0
  379. package/dist/tokens/tokens.css +533 -155
  380. package/dist/types/index.d.ts +2 -2
  381. package/package.json +310 -313
  382. package/dist/index.js.map +0 -1
  383. package/dist/react/3d/index.js.map +0 -1
  384. package/dist/react/astro/index.js.map +0 -1
  385. package/dist/react/cards/index.js.map +0 -1
  386. package/dist/react/charts/index.js.map +0 -1
  387. package/dist/react/core/index.js.map +0 -1
  388. package/dist/react/panels/index.js.map +0 -1
  389. package/dist/react/theme/astro-tokens.d.ts +0 -153
  390. package/dist/react/theme/index.js.map +0 -1
  391. package/dist/react.js.map +0 -1
@@ -1,169 +1,218 @@
1
+ import { createContext, useCallback, useContext, useEffect, useMemo, useState } from "react";
1
2
  import { jsx } from "react/jsx-runtime";
2
- import { useState, useEffect, useCallback, useMemo, useContext, createContext } from "react";
3
- const PRESET_COLORS = {
4
- purple: "#8b5cf6",
5
- blue: "#3b82f6",
6
- cyan: "#06b6d4",
7
- teal: "#14b8a6",
8
- green: "#10b981",
9
- lime: "#84cc16",
10
- amber: "#f59e0b",
11
- orange: "#f97316",
12
- pink: "#ec4899",
13
- red: "#ef4444",
14
- slate: "#64748b"
3
+ //#region src/react/context/DisplaySettingsContext.tsx
4
+ /**
5
+ * @zendir/ui - DisplaySettingsContext
6
+ *
7
+ * Centralized context for app-wide display preferences.
8
+ * Controls compact mode, accent colors, glass tint, and other display settings.
9
+ *
10
+ * Features:
11
+ * - Compact mode toggle (affects all cards globally)
12
+ * - Accent color selection (for card accents)
13
+ * - Glass tint selection (for transparent themes)
14
+ * - Color target control (both, accent-only, glass-only)
15
+ * - LocalStorage persistence
16
+ *
17
+ * @example
18
+ * ```tsx
19
+ * import { DisplaySettingsProvider, useDisplaySettings } from '@zendir/ui';
20
+ *
21
+ * // Wrap your app
22
+ * <DisplaySettingsProvider>
23
+ * <App />
24
+ * </DisplaySettingsProvider>
25
+ *
26
+ * // Use in components
27
+ * function MyCard() {
28
+ * const { compactMode, accentColor } = useDisplaySettings();
29
+ * return <Card compact={compactMode} />;
30
+ * }
31
+ * ```
32
+ */
33
+ var PRESET_COLORS = {
34
+ purple: "#8b5cf6",
35
+ blue: "#3b82f6",
36
+ cyan: "#06b6d4",
37
+ teal: "#14b8a6",
38
+ green: "#10b981",
39
+ lime: "#84cc16",
40
+ amber: "#f59e0b",
41
+ orange: "#f97316",
42
+ pink: "#ec4899",
43
+ red: "#ef4444",
44
+ slate: "#64748b"
15
45
  };
16
- const GLASS_TINTS = {
17
- ...PRESET_COLORS,
18
- clear: "rgba(255,255,255,0.05)",
19
- dark: "rgba(0,0,0,0.3)"
46
+ var GLASS_TINTS = {
47
+ ...PRESET_COLORS,
48
+ clear: "rgba(255,255,255,0.05)",
49
+ dark: "rgba(0,0,0,0.3)"
20
50
  };
21
- const DEFAULT_SETTINGS = {
22
- compactMode: false,
23
- accentColor: PRESET_COLORS.purple,
24
- glassTint: PRESET_COLORS.purple,
25
- colorTarget: "both",
26
- accentBorders: true
51
+ var DEFAULT_SETTINGS = {
52
+ compactMode: false,
53
+ accentColor: PRESET_COLORS.purple,
54
+ glassTint: PRESET_COLORS.purple,
55
+ colorTarget: "both",
56
+ accentBorders: true
27
57
  };
28
- const STORAGE_KEY = "zendir-display-settings";
29
- const DisplaySettingsContext = createContext(null);
30
- function DisplaySettingsProvider({
31
- children,
32
- defaultCompactMode,
33
- defaultAccentColor,
34
- defaultGlassTint,
35
- defaultColorTarget,
36
- defaultAccentBorders,
37
- persist = true
38
- }) {
39
- const [settings, setSettings] = useState(() => {
40
- if (persist && typeof window !== "undefined") {
41
- try {
42
- const stored = localStorage.getItem(STORAGE_KEY);
43
- if (stored) {
44
- const parsed = JSON.parse(stored);
45
- return {
46
- compactMode: parsed.compactMode ?? defaultCompactMode ?? DEFAULT_SETTINGS.compactMode,
47
- accentColor: parsed.accentColor ?? defaultAccentColor ?? DEFAULT_SETTINGS.accentColor,
48
- glassTint: parsed.glassTint ?? defaultGlassTint ?? DEFAULT_SETTINGS.glassTint,
49
- colorTarget: parsed.colorTarget ?? defaultColorTarget ?? DEFAULT_SETTINGS.colorTarget,
50
- accentBorders: parsed.accentBorders ?? defaultAccentBorders ?? DEFAULT_SETTINGS.accentBorders
51
- };
52
- }
53
- } catch {
54
- }
55
- }
56
- return {
57
- compactMode: defaultCompactMode ?? DEFAULT_SETTINGS.compactMode,
58
- accentColor: defaultAccentColor ?? DEFAULT_SETTINGS.accentColor,
59
- glassTint: defaultGlassTint ?? DEFAULT_SETTINGS.glassTint,
60
- colorTarget: defaultColorTarget ?? DEFAULT_SETTINGS.colorTarget,
61
- accentBorders: defaultAccentBorders ?? DEFAULT_SETTINGS.accentBorders
62
- };
63
- });
64
- useEffect(() => {
65
- if (persist && typeof window !== "undefined") {
66
- try {
67
- localStorage.setItem(STORAGE_KEY, JSON.stringify(settings));
68
- } catch {
69
- }
70
- }
71
- }, [settings, persist]);
72
- const setCompactMode = useCallback((value2) => {
73
- setSettings((prev) => ({ ...prev, compactMode: value2 }));
74
- }, []);
75
- const toggleCompactMode = useCallback(() => {
76
- setSettings((prev) => ({ ...prev, compactMode: !prev.compactMode }));
77
- }, []);
78
- const setAccentColor = useCallback((color) => {
79
- setSettings((prev) => ({ ...prev, accentColor: color }));
80
- }, []);
81
- const setGlassTint = useCallback((color) => {
82
- setSettings((prev) => ({ ...prev, glassTint: color }));
83
- }, []);
84
- const setColorTarget = useCallback((target) => {
85
- setSettings((prev) => ({ ...prev, colorTarget: target }));
86
- }, []);
87
- const setColor = useCallback((color) => {
88
- setSettings((prev) => {
89
- switch (prev.colorTarget) {
90
- case "accent":
91
- return { ...prev, accentColor: color };
92
- case "glass":
93
- return { ...prev, glassTint: color };
94
- case "both":
95
- default:
96
- return { ...prev, accentColor: color, glassTint: color };
97
- }
98
- });
99
- }, []);
100
- const setAccentBorders = useCallback((value2) => {
101
- setSettings((prev) => ({ ...prev, accentBorders: value2 }));
102
- }, []);
103
- const toggleAccentBorders = useCallback(() => {
104
- setSettings((prev) => ({ ...prev, accentBorders: !prev.accentBorders }));
105
- }, []);
106
- const resetSettings = useCallback(() => {
107
- setSettings(DEFAULT_SETTINGS);
108
- }, []);
109
- const value = useMemo(() => ({
110
- ...settings,
111
- setCompactMode,
112
- toggleCompactMode,
113
- setAccentColor,
114
- setGlassTint,
115
- setColorTarget,
116
- setColor,
117
- setAccentBorders,
118
- toggleAccentBorders,
119
- resetSettings
120
- }), [
121
- settings,
122
- setCompactMode,
123
- toggleCompactMode,
124
- setAccentColor,
125
- setGlassTint,
126
- setColorTarget,
127
- setColor,
128
- setAccentBorders,
129
- toggleAccentBorders,
130
- resetSettings
131
- ]);
132
- return /* @__PURE__ */ jsx(DisplaySettingsContext.Provider, { value, children });
58
+ var STORAGE_KEY = "zendir-display-settings";
59
+ var DisplaySettingsContext = createContext(null);
60
+ function DisplaySettingsProvider({ children, defaultCompactMode, defaultAccentColor, defaultGlassTint, defaultColorTarget, defaultAccentBorders, persist = true }) {
61
+ const [settings, setSettings] = useState(() => {
62
+ if (persist && typeof window !== "undefined") try {
63
+ const stored = localStorage.getItem(STORAGE_KEY);
64
+ if (stored) {
65
+ const parsed = JSON.parse(stored);
66
+ return {
67
+ compactMode: parsed.compactMode ?? defaultCompactMode ?? DEFAULT_SETTINGS.compactMode,
68
+ accentColor: parsed.accentColor ?? defaultAccentColor ?? DEFAULT_SETTINGS.accentColor,
69
+ glassTint: parsed.glassTint ?? defaultGlassTint ?? DEFAULT_SETTINGS.glassTint,
70
+ colorTarget: parsed.colorTarget ?? defaultColorTarget ?? DEFAULT_SETTINGS.colorTarget,
71
+ accentBorders: parsed.accentBorders ?? defaultAccentBorders ?? DEFAULT_SETTINGS.accentBorders
72
+ };
73
+ }
74
+ } catch {}
75
+ return {
76
+ compactMode: defaultCompactMode ?? DEFAULT_SETTINGS.compactMode,
77
+ accentColor: defaultAccentColor ?? DEFAULT_SETTINGS.accentColor,
78
+ glassTint: defaultGlassTint ?? DEFAULT_SETTINGS.glassTint,
79
+ colorTarget: defaultColorTarget ?? DEFAULT_SETTINGS.colorTarget,
80
+ accentBorders: defaultAccentBorders ?? DEFAULT_SETTINGS.accentBorders
81
+ };
82
+ });
83
+ useEffect(() => {
84
+ if (persist && typeof window !== "undefined") try {
85
+ localStorage.setItem(STORAGE_KEY, JSON.stringify(settings));
86
+ } catch {}
87
+ }, [settings, persist]);
88
+ const setCompactMode = useCallback((value) => {
89
+ setSettings((prev) => ({
90
+ ...prev,
91
+ compactMode: value
92
+ }));
93
+ }, []);
94
+ const toggleCompactMode = useCallback(() => {
95
+ setSettings((prev) => ({
96
+ ...prev,
97
+ compactMode: !prev.compactMode
98
+ }));
99
+ }, []);
100
+ const setAccentColor = useCallback((color) => {
101
+ setSettings((prev) => ({
102
+ ...prev,
103
+ accentColor: color
104
+ }));
105
+ }, []);
106
+ const setGlassTint = useCallback((color) => {
107
+ setSettings((prev) => ({
108
+ ...prev,
109
+ glassTint: color
110
+ }));
111
+ }, []);
112
+ const setColorTarget = useCallback((target) => {
113
+ setSettings((prev) => ({
114
+ ...prev,
115
+ colorTarget: target
116
+ }));
117
+ }, []);
118
+ const setColor = useCallback((color) => {
119
+ setSettings((prev) => {
120
+ switch (prev.colorTarget) {
121
+ case "accent": return {
122
+ ...prev,
123
+ accentColor: color
124
+ };
125
+ case "glass": return {
126
+ ...prev,
127
+ glassTint: color
128
+ };
129
+ default: return {
130
+ ...prev,
131
+ accentColor: color,
132
+ glassTint: color
133
+ };
134
+ }
135
+ });
136
+ }, []);
137
+ const setAccentBorders = useCallback((value) => {
138
+ setSettings((prev) => ({
139
+ ...prev,
140
+ accentBorders: value
141
+ }));
142
+ }, []);
143
+ const toggleAccentBorders = useCallback(() => {
144
+ setSettings((prev) => ({
145
+ ...prev,
146
+ accentBorders: !prev.accentBorders
147
+ }));
148
+ }, []);
149
+ const resetSettings = useCallback(() => {
150
+ setSettings(DEFAULT_SETTINGS);
151
+ }, []);
152
+ const value = useMemo(() => ({
153
+ ...settings,
154
+ setCompactMode,
155
+ toggleCompactMode,
156
+ setAccentColor,
157
+ setGlassTint,
158
+ setColorTarget,
159
+ setColor,
160
+ setAccentBorders,
161
+ toggleAccentBorders,
162
+ resetSettings
163
+ }), [
164
+ settings,
165
+ setCompactMode,
166
+ toggleCompactMode,
167
+ setAccentColor,
168
+ setGlassTint,
169
+ setColorTarget,
170
+ setColor,
171
+ setAccentBorders,
172
+ toggleAccentBorders,
173
+ resetSettings
174
+ ]);
175
+ return /* @__PURE__ */ jsx(DisplaySettingsContext.Provider, {
176
+ value,
177
+ children
178
+ });
133
179
  }
180
+ /**
181
+ * Access display settings context
182
+ * Must be used within a DisplaySettingsProvider
183
+ */
134
184
  function useDisplaySettings() {
135
- const context = useContext(DisplaySettingsContext);
136
- if (!context) {
137
- throw new Error("useDisplaySettings must be used within a DisplaySettingsProvider");
138
- }
139
- return context;
185
+ const context = useContext(DisplaySettingsContext);
186
+ if (!context) throw new Error("useDisplaySettings must be used within a DisplaySettingsProvider");
187
+ return context;
140
188
  }
189
+ /**
190
+ * Optional hook that returns null if not within provider
191
+ * Useful for components that should work with or without the provider
192
+ */
141
193
  function useDisplaySettingsOptional() {
142
- return useContext(DisplaySettingsContext);
194
+ return useContext(DisplaySettingsContext);
143
195
  }
196
+ /**
197
+ * Get effective compact mode value
198
+ * Priority: explicit prop > context value > default (false)
199
+ */
144
200
  function getEffectiveCompactMode(propValue, contextValue) {
145
- if (propValue !== void 0) return propValue;
146
- if (contextValue !== void 0) return contextValue;
147
- return false;
201
+ if (propValue !== void 0) return propValue;
202
+ if (contextValue !== void 0) return contextValue;
203
+ return false;
148
204
  }
205
+ /**
206
+ * Hook to get card border style based on accentBorders setting
207
+ * Returns the appropriate border style for transparent themes
208
+ */
149
209
  function useCardBorderStyle(tokens, isTransparentTheme) {
150
- const displaySettings = useDisplaySettingsOptional();
151
- const accentBorders = (displaySettings == null ? void 0 : displaySettings.accentBorders) ?? true;
152
- if (!isTransparentTheme) {
153
- return tokens.colors.border.cardStyle ?? { border: `1px solid ${tokens.colors.border.muted}` };
154
- }
155
- if (accentBorders) {
156
- return tokens.colors.border.cardStyle ?? {};
157
- }
158
- return { border: "1px solid rgba(255, 255, 255, 0.08)" };
210
+ const accentBorders = useDisplaySettingsOptional()?.accentBorders ?? true;
211
+ if (!isTransparentTheme) return tokens.colors.border.cardStyle ?? { border: `1px solid ${tokens.colors.border.muted}` };
212
+ if (accentBorders) return tokens.colors.border.cardStyle ?? {};
213
+ return { border: "1px solid rgba(255, 255, 255, 0.08)" };
159
214
  }
160
- export {
161
- DisplaySettingsProvider,
162
- GLASS_TINTS,
163
- PRESET_COLORS,
164
- getEffectiveCompactMode,
165
- useCardBorderStyle,
166
- useDisplaySettings,
167
- useDisplaySettingsOptional
168
- };
169
- //# sourceMappingURL=DisplaySettingsContext.js.map
215
+ //#endregion
216
+ export { DisplaySettingsProvider, DisplaySettingsProvider as default, GLASS_TINTS, PRESET_COLORS, getEffectiveCompactMode, useCardBorderStyle, useDisplaySettings, useDisplaySettingsOptional };
217
+
218
+ //# sourceMappingURL=DisplaySettingsContext.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DisplaySettingsContext.js","sources":["../../../src/react/context/DisplaySettingsContext.tsx"],"sourcesContent":["/**\n * @zendir/ui - DisplaySettingsContext\n * \n * Centralized context for app-wide display preferences.\n * Controls compact mode, accent colors, glass tint, and other display settings.\n * \n * Features:\n * - Compact mode toggle (affects all cards globally)\n * - Accent color selection (for card accents)\n * - Glass tint selection (for transparent themes)\n * - Color target control (both, accent-only, glass-only)\n * - LocalStorage persistence\n * \n * @example\n * ```tsx\n * import { DisplaySettingsProvider, useDisplaySettings } from '@zendir/ui';\n * \n * // Wrap your app\n * <DisplaySettingsProvider>\n * <App />\n * </DisplaySettingsProvider>\n * \n * // Use in components\n * function MyCard() {\n * const { compactMode, accentColor } = useDisplaySettings();\n * return <Card compact={compactMode} />;\n * }\n * ```\n */\n\nimport React, { createContext, useContext, useState, useCallback, useMemo, useEffect, type ReactNode } from 'react';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type ColorTarget = 'both' | 'accent' | 'glass';\n\nexport interface DisplaySettings {\n /** Global compact mode - affects all cards */\n compactMode: boolean;\n \n /** Accent color for cards and UI elements */\n accentColor: string;\n \n /** Glass tint color for transparent themes */\n glassTint: string;\n \n /** Which color setting to apply: both, accent-only, or glass-only */\n colorTarget: ColorTarget;\n \n /** Enable accent-colored borders on cards (for transparent themes) */\n accentBorders: boolean;\n}\n\nexport interface DisplaySettingsContextValue extends DisplaySettings {\n /** Set compact mode on/off */\n setCompactMode: (value: boolean) => void;\n \n /** Toggle compact mode */\n toggleCompactMode: () => void;\n \n /** Set accent color */\n setAccentColor: (color: string) => void;\n \n /** Set glass tint color */\n setGlassTint: (color: string) => void;\n \n /** Set which color setting to apply */\n setColorTarget: (target: ColorTarget) => void;\n \n /** Set a color that applies based on current target */\n setColor: (color: string) => void;\n \n /** Set accent borders on/off */\n setAccentBorders: (value: boolean) => void;\n \n /** Toggle accent borders */\n toggleAccentBorders: () => void;\n \n /** Reset all settings to defaults */\n resetSettings: () => void;\n}\n\n// =============================================================================\n// Preset Colors\n// =============================================================================\n\nexport const PRESET_COLORS = {\n purple: '#8b5cf6',\n blue: '#3b82f6',\n cyan: '#06b6d4',\n teal: '#14b8a6',\n green: '#10b981',\n lime: '#84cc16',\n amber: '#f59e0b',\n orange: '#f97316',\n pink: '#ec4899',\n red: '#ef4444',\n slate: '#64748b',\n} as const;\n\nexport const GLASS_TINTS = {\n ...PRESET_COLORS,\n clear: 'rgba(255,255,255,0.05)',\n dark: 'rgba(0,0,0,0.3)',\n} as const;\n\nexport type PresetColorKey = keyof typeof PRESET_COLORS;\nexport type GlassTintKey = keyof typeof GLASS_TINTS;\n\n// =============================================================================\n// Default Values\n// =============================================================================\n\nconst DEFAULT_SETTINGS: DisplaySettings = {\n compactMode: false,\n accentColor: PRESET_COLORS.purple,\n glassTint: PRESET_COLORS.purple,\n colorTarget: 'both',\n accentBorders: true,\n};\n\nconst STORAGE_KEY = 'zendir-display-settings';\n\n// =============================================================================\n// Context\n// =============================================================================\n\nconst DisplaySettingsContext = createContext<DisplaySettingsContextValue | null>(null);\n\n// =============================================================================\n// Provider Props\n// =============================================================================\n\nexport interface DisplaySettingsProviderProps {\n children: ReactNode;\n \n /** Initial compact mode state */\n defaultCompactMode?: boolean;\n \n /** Initial accent color */\n defaultAccentColor?: string;\n \n /** Initial glass tint color */\n defaultGlassTint?: string;\n \n /** Initial color target */\n defaultColorTarget?: ColorTarget;\n \n /** Initial accent borders state */\n defaultAccentBorders?: boolean;\n \n /** Enable localStorage persistence (default: true) */\n persist?: boolean;\n}\n\n// =============================================================================\n// Provider Component\n// =============================================================================\n\nexport function DisplaySettingsProvider({\n children,\n defaultCompactMode,\n defaultAccentColor,\n defaultGlassTint,\n defaultColorTarget,\n defaultAccentBorders,\n persist = true,\n}: DisplaySettingsProviderProps): React.ReactElement {\n // Initialize state from localStorage or defaults\n const [settings, setSettings] = useState<DisplaySettings>(() => {\n if (persist && typeof window !== 'undefined') {\n try {\n const stored = localStorage.getItem(STORAGE_KEY);\n if (stored) {\n const parsed = JSON.parse(stored);\n return {\n compactMode: parsed.compactMode ?? defaultCompactMode ?? DEFAULT_SETTINGS.compactMode,\n accentColor: parsed.accentColor ?? defaultAccentColor ?? DEFAULT_SETTINGS.accentColor,\n glassTint: parsed.glassTint ?? defaultGlassTint ?? DEFAULT_SETTINGS.glassTint,\n colorTarget: parsed.colorTarget ?? defaultColorTarget ?? DEFAULT_SETTINGS.colorTarget,\n accentBorders: parsed.accentBorders ?? defaultAccentBorders ?? DEFAULT_SETTINGS.accentBorders,\n };\n }\n } catch {\n // Ignore parse errors\n }\n }\n \n return {\n compactMode: defaultCompactMode ?? DEFAULT_SETTINGS.compactMode,\n accentColor: defaultAccentColor ?? DEFAULT_SETTINGS.accentColor,\n glassTint: defaultGlassTint ?? DEFAULT_SETTINGS.glassTint,\n colorTarget: defaultColorTarget ?? DEFAULT_SETTINGS.colorTarget,\n accentBorders: defaultAccentBorders ?? DEFAULT_SETTINGS.accentBorders,\n };\n });\n \n // Persist to localStorage when settings change\n useEffect(() => {\n if (persist && typeof window !== 'undefined') {\n try {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(settings));\n } catch {\n // Ignore storage errors\n }\n }\n }, [settings, persist]);\n \n // Setters\n const setCompactMode = useCallback((value: boolean) => {\n setSettings(prev => ({ ...prev, compactMode: value }));\n }, []);\n \n const toggleCompactMode = useCallback(() => {\n setSettings(prev => ({ ...prev, compactMode: !prev.compactMode }));\n }, []);\n \n const setAccentColor = useCallback((color: string) => {\n setSettings(prev => ({ ...prev, accentColor: color }));\n }, []);\n \n const setGlassTint = useCallback((color: string) => {\n setSettings(prev => ({ ...prev, glassTint: color }));\n }, []);\n \n const setColorTarget = useCallback((target: ColorTarget) => {\n setSettings(prev => ({ ...prev, colorTarget: target }));\n }, []);\n \n // Set color based on current target\n const setColor = useCallback((color: string) => {\n setSettings(prev => {\n switch (prev.colorTarget) {\n case 'accent':\n return { ...prev, accentColor: color };\n case 'glass':\n return { ...prev, glassTint: color };\n case 'both':\n default:\n return { ...prev, accentColor: color, glassTint: color };\n }\n });\n }, []);\n \n const setAccentBorders = useCallback((value: boolean) => {\n setSettings(prev => ({ ...prev, accentBorders: value }));\n }, []);\n \n const toggleAccentBorders = useCallback(() => {\n setSettings(prev => ({ ...prev, accentBorders: !prev.accentBorders }));\n }, []);\n \n const resetSettings = useCallback(() => {\n setSettings(DEFAULT_SETTINGS);\n }, []);\n \n // Memoized context value\n const value = useMemo<DisplaySettingsContextValue>(() => ({\n ...settings,\n setCompactMode,\n toggleCompactMode,\n setAccentColor,\n setGlassTint,\n setColorTarget,\n setColor,\n setAccentBorders,\n toggleAccentBorders,\n resetSettings,\n }), [\n settings,\n setCompactMode,\n toggleCompactMode,\n setAccentColor,\n setGlassTint,\n setColorTarget,\n setColor,\n setAccentBorders,\n toggleAccentBorders,\n resetSettings,\n ]);\n \n return (\n <DisplaySettingsContext.Provider value={value}>\n {children}\n </DisplaySettingsContext.Provider>\n );\n}\n\n// =============================================================================\n// Hook\n// =============================================================================\n\n/**\n * Access display settings context\n * Must be used within a DisplaySettingsProvider\n */\nexport function useDisplaySettings(): DisplaySettingsContextValue {\n const context = useContext(DisplaySettingsContext);\n \n if (!context) {\n throw new Error('useDisplaySettings must be used within a DisplaySettingsProvider');\n }\n \n return context;\n}\n\n/**\n * Optional hook that returns null if not within provider\n * Useful for components that should work with or without the provider\n */\nexport function useDisplaySettingsOptional(): DisplaySettingsContextValue | null {\n return useContext(DisplaySettingsContext);\n}\n\n// =============================================================================\n// Utility Functions\n// =============================================================================\n\n/**\n * Get effective compact mode value\n * Priority: explicit prop > context value > default (false)\n */\nexport function getEffectiveCompactMode(\n propValue: boolean | undefined,\n contextValue: boolean | undefined\n): boolean {\n if (propValue !== undefined) return propValue;\n if (contextValue !== undefined) return contextValue;\n return false;\n}\n\n/**\n * Get effective accent borders value\n * Priority: explicit prop > context value > default (true)\n */\nexport function getEffectiveAccentBorders(\n propValue: boolean | undefined,\n contextValue: boolean | undefined\n): boolean {\n if (propValue !== undefined) return propValue;\n if (contextValue !== undefined) return contextValue;\n return true;\n}\n\n/**\n * Hook to get card border style based on accentBorders setting\n * Returns the appropriate border style for transparent themes\n */\nexport function useCardBorderStyle(\n tokens: any,\n isTransparentTheme: boolean\n): React.CSSProperties {\n const displaySettings = useDisplaySettingsOptional();\n const accentBorders = displaySettings?.accentBorders ?? true;\n \n if (!isTransparentTheme) {\n return tokens.colors.border.cardStyle ?? { border: `1px solid ${tokens.colors.border.muted}` };\n }\n \n if (accentBorders) {\n return tokens.colors.border.cardStyle ?? {};\n }\n \n // Fallback to subtle neutral border when accent borders disabled\n return { border: '1px solid rgba(255, 255, 255, 0.08)' };\n}\n\nexport default DisplaySettingsProvider;\n"],"names":["value"],"mappings":"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"}
1
+ {"version":3,"file":"DisplaySettingsContext.js","names":[],"sources":["../../../src/react/context/DisplaySettingsContext.tsx"],"sourcesContent":["/**\r\n * @zendir/ui - DisplaySettingsContext\r\n *\r\n * Centralized context for app-wide display preferences.\r\n * Controls compact mode, accent colors, glass tint, and other display settings.\r\n *\r\n * Features:\r\n * - Compact mode toggle (affects all cards globally)\r\n * - Accent color selection (for card accents)\r\n * - Glass tint selection (for transparent themes)\r\n * - Color target control (both, accent-only, glass-only)\r\n * - LocalStorage persistence\r\n *\r\n * @example\r\n * ```tsx\r\n * import { DisplaySettingsProvider, useDisplaySettings } from '@zendir/ui';\r\n *\r\n * // Wrap your app\r\n * <DisplaySettingsProvider>\r\n * <App />\r\n * </DisplaySettingsProvider>\r\n *\r\n * // Use in components\r\n * function MyCard() {\r\n * const { compactMode, accentColor } = useDisplaySettings();\r\n * return <Card compact={compactMode} />;\r\n * }\r\n * ```\r\n */\r\n\r\nimport React, {\r\n createContext,\r\n useContext,\r\n useState,\r\n useCallback,\r\n useMemo,\r\n useEffect,\r\n type ReactNode,\r\n} from \"react\";\r\n\r\n// =============================================================================\r\n// Types\r\n// =============================================================================\r\n\r\nexport type ColorTarget = \"both\" | \"accent\" | \"glass\";\r\n\r\nexport interface DisplaySettings {\r\n /** Global compact mode - affects all cards */\r\n compactMode: boolean;\r\n\r\n /** Accent color for cards and UI elements */\r\n accentColor: string;\r\n\r\n /** Glass tint color for transparent themes */\r\n glassTint: string;\r\n\r\n /** Which color setting to apply: both, accent-only, or glass-only */\r\n colorTarget: ColorTarget;\r\n\r\n /** Enable accent-colored borders on cards (for transparent themes) */\r\n accentBorders: boolean;\r\n}\r\n\r\nexport interface DisplaySettingsContextValue extends DisplaySettings {\r\n /** Set compact mode on/off */\r\n setCompactMode: (value: boolean) => void;\r\n\r\n /** Toggle compact mode */\r\n toggleCompactMode: () => void;\r\n\r\n /** Set accent color */\r\n setAccentColor: (color: string) => void;\r\n\r\n /** Set glass tint color */\r\n setGlassTint: (color: string) => void;\r\n\r\n /** Set which color setting to apply */\r\n setColorTarget: (target: ColorTarget) => void;\r\n\r\n /** Set a color that applies based on current target */\r\n setColor: (color: string) => void;\r\n\r\n /** Set accent borders on/off */\r\n setAccentBorders: (value: boolean) => void;\r\n\r\n /** Toggle accent borders */\r\n toggleAccentBorders: () => void;\r\n\r\n /** Reset all settings to defaults */\r\n resetSettings: () => void;\r\n}\r\n\r\n// =============================================================================\r\n// Preset Colors\r\n// =============================================================================\r\n\r\nexport const PRESET_COLORS = {\r\n purple: \"#8b5cf6\",\r\n blue: \"#3b82f6\",\r\n cyan: \"#06b6d4\",\r\n teal: \"#14b8a6\",\r\n green: \"#10b981\",\r\n lime: \"#84cc16\",\r\n amber: \"#f59e0b\",\r\n orange: \"#f97316\",\r\n pink: \"#ec4899\",\r\n red: \"#ef4444\",\r\n slate: \"#64748b\",\r\n} as const;\r\n\r\nexport const GLASS_TINTS = {\r\n ...PRESET_COLORS,\r\n clear: \"rgba(255,255,255,0.05)\",\r\n dark: \"rgba(0,0,0,0.3)\",\r\n} as const;\r\n\r\nexport type PresetColorKey = keyof typeof PRESET_COLORS;\r\nexport type GlassTintKey = keyof typeof GLASS_TINTS;\r\n\r\n// =============================================================================\r\n// Default Values\r\n// =============================================================================\r\n\r\nconst DEFAULT_SETTINGS: DisplaySettings = {\r\n compactMode: false,\r\n accentColor: PRESET_COLORS.purple,\r\n glassTint: PRESET_COLORS.purple,\r\n colorTarget: \"both\",\r\n accentBorders: true,\r\n};\r\n\r\nconst STORAGE_KEY = \"zendir-display-settings\";\r\n\r\n// =============================================================================\r\n// Context\r\n// =============================================================================\r\n\r\nconst DisplaySettingsContext =\r\n createContext<DisplaySettingsContextValue | null>(null);\r\n\r\n// =============================================================================\r\n// Provider Props\r\n// =============================================================================\r\n\r\nexport interface DisplaySettingsProviderProps {\r\n children: ReactNode;\r\n\r\n /** Initial compact mode state */\r\n defaultCompactMode?: boolean;\r\n\r\n /** Initial accent color */\r\n defaultAccentColor?: string;\r\n\r\n /** Initial glass tint color */\r\n defaultGlassTint?: string;\r\n\r\n /** Initial color target */\r\n defaultColorTarget?: ColorTarget;\r\n\r\n /** Initial accent borders state */\r\n defaultAccentBorders?: boolean;\r\n\r\n /** Enable localStorage persistence (default: true) */\r\n persist?: boolean;\r\n}\r\n\r\n// =============================================================================\r\n// Provider Component\r\n// =============================================================================\r\n\r\nexport function DisplaySettingsProvider({\r\n children,\r\n defaultCompactMode,\r\n defaultAccentColor,\r\n defaultGlassTint,\r\n defaultColorTarget,\r\n defaultAccentBorders,\r\n persist = true,\r\n}: DisplaySettingsProviderProps): React.ReactElement {\r\n // Initialize state from localStorage or defaults\r\n const [settings, setSettings] = useState<DisplaySettings>(() => {\r\n if (persist && typeof window !== \"undefined\") {\r\n try {\r\n const stored = localStorage.getItem(STORAGE_KEY);\r\n if (stored) {\r\n const parsed = JSON.parse(stored);\r\n return {\r\n compactMode:\r\n parsed.compactMode ??\r\n defaultCompactMode ??\r\n DEFAULT_SETTINGS.compactMode,\r\n accentColor:\r\n parsed.accentColor ??\r\n defaultAccentColor ??\r\n DEFAULT_SETTINGS.accentColor,\r\n glassTint:\r\n parsed.glassTint ??\r\n defaultGlassTint ??\r\n DEFAULT_SETTINGS.glassTint,\r\n colorTarget:\r\n parsed.colorTarget ??\r\n defaultColorTarget ??\r\n DEFAULT_SETTINGS.colorTarget,\r\n accentBorders:\r\n parsed.accentBorders ??\r\n defaultAccentBorders ??\r\n DEFAULT_SETTINGS.accentBorders,\r\n };\r\n }\r\n } catch {\r\n // Ignore parse errors\r\n }\r\n }\r\n\r\n return {\r\n compactMode: defaultCompactMode ?? DEFAULT_SETTINGS.compactMode,\r\n accentColor: defaultAccentColor ?? DEFAULT_SETTINGS.accentColor,\r\n glassTint: defaultGlassTint ?? DEFAULT_SETTINGS.glassTint,\r\n colorTarget: defaultColorTarget ?? DEFAULT_SETTINGS.colorTarget,\r\n accentBorders: defaultAccentBorders ?? DEFAULT_SETTINGS.accentBorders,\r\n };\r\n });\r\n\r\n // Persist to localStorage when settings change\r\n useEffect(() => {\r\n if (persist && typeof window !== \"undefined\") {\r\n try {\r\n localStorage.setItem(STORAGE_KEY, JSON.stringify(settings));\r\n } catch {\r\n // Ignore storage errors\r\n }\r\n }\r\n }, [settings, persist]);\r\n\r\n // Setters\r\n const setCompactMode = useCallback((value: boolean) => {\r\n setSettings((prev) => ({ ...prev, compactMode: value }));\r\n }, []);\r\n\r\n const toggleCompactMode = useCallback(() => {\r\n setSettings((prev) => ({ ...prev, compactMode: !prev.compactMode }));\r\n }, []);\r\n\r\n const setAccentColor = useCallback((color: string) => {\r\n setSettings((prev) => ({ ...prev, accentColor: color }));\r\n }, []);\r\n\r\n const setGlassTint = useCallback((color: string) => {\r\n setSettings((prev) => ({ ...prev, glassTint: color }));\r\n }, []);\r\n\r\n const setColorTarget = useCallback((target: ColorTarget) => {\r\n setSettings((prev) => ({ ...prev, colorTarget: target }));\r\n }, []);\r\n\r\n // Set color based on current target\r\n const setColor = useCallback((color: string) => {\r\n setSettings((prev) => {\r\n switch (prev.colorTarget) {\r\n case \"accent\":\r\n return { ...prev, accentColor: color };\r\n case \"glass\":\r\n return { ...prev, glassTint: color };\r\n case \"both\":\r\n default:\r\n return { ...prev, accentColor: color, glassTint: color };\r\n }\r\n });\r\n }, []);\r\n\r\n const setAccentBorders = useCallback((value: boolean) => {\r\n setSettings((prev) => ({ ...prev, accentBorders: value }));\r\n }, []);\r\n\r\n const toggleAccentBorders = useCallback(() => {\r\n setSettings((prev) => ({ ...prev, accentBorders: !prev.accentBorders }));\r\n }, []);\r\n\r\n const resetSettings = useCallback(() => {\r\n setSettings(DEFAULT_SETTINGS);\r\n }, []);\r\n\r\n // Memoized context value\r\n const value = useMemo<DisplaySettingsContextValue>(\r\n () => ({\r\n ...settings,\r\n setCompactMode,\r\n toggleCompactMode,\r\n setAccentColor,\r\n setGlassTint,\r\n setColorTarget,\r\n setColor,\r\n setAccentBorders,\r\n toggleAccentBorders,\r\n resetSettings,\r\n }),\r\n [\r\n settings,\r\n setCompactMode,\r\n toggleCompactMode,\r\n setAccentColor,\r\n setGlassTint,\r\n setColorTarget,\r\n setColor,\r\n setAccentBorders,\r\n toggleAccentBorders,\r\n resetSettings,\r\n ],\r\n );\r\n\r\n return (\r\n <DisplaySettingsContext.Provider value={value}>\r\n {children}\r\n </DisplaySettingsContext.Provider>\r\n );\r\n}\r\n\r\n// =============================================================================\r\n// Hook\r\n// =============================================================================\r\n\r\n/**\r\n * Access display settings context\r\n * Must be used within a DisplaySettingsProvider\r\n */\r\nexport function useDisplaySettings(): DisplaySettingsContextValue {\r\n const context = useContext(DisplaySettingsContext);\r\n\r\n if (!context) {\r\n throw new Error(\r\n \"useDisplaySettings must be used within a DisplaySettingsProvider\",\r\n );\r\n }\r\n\r\n return context;\r\n}\r\n\r\n/**\r\n * Optional hook that returns null if not within provider\r\n * Useful for components that should work with or without the provider\r\n */\r\nexport function useDisplaySettingsOptional(): DisplaySettingsContextValue | null {\r\n return useContext(DisplaySettingsContext);\r\n}\r\n\r\n// =============================================================================\r\n// Utility Functions\r\n// =============================================================================\r\n\r\n/**\r\n * Get effective compact mode value\r\n * Priority: explicit prop > context value > default (false)\r\n */\r\nexport function getEffectiveCompactMode(\r\n propValue: boolean | undefined,\r\n contextValue: boolean | undefined,\r\n): boolean {\r\n if (propValue !== undefined) return propValue;\r\n if (contextValue !== undefined) return contextValue;\r\n return false;\r\n}\r\n\r\n/**\r\n * Get effective accent borders value\r\n * Priority: explicit prop > context value > default (true)\r\n */\r\nexport function getEffectiveAccentBorders(\r\n propValue: boolean | undefined,\r\n contextValue: boolean | undefined,\r\n): boolean {\r\n if (propValue !== undefined) return propValue;\r\n if (contextValue !== undefined) return contextValue;\r\n return true;\r\n}\r\n\r\n/**\r\n * Hook to get card border style based on accentBorders setting\r\n * Returns the appropriate border style for transparent themes\r\n */\r\nexport function useCardBorderStyle(\r\n tokens: any,\r\n isTransparentTheme: boolean,\r\n): React.CSSProperties {\r\n const displaySettings = useDisplaySettingsOptional();\r\n const accentBorders = displaySettings?.accentBorders ?? true;\r\n\r\n if (!isTransparentTheme) {\r\n return (\r\n tokens.colors.border.cardStyle ?? {\r\n border: `1px solid ${tokens.colors.border.muted}`,\r\n }\r\n );\r\n }\r\n\r\n if (accentBorders) {\r\n return tokens.colors.border.cardStyle ?? {};\r\n }\r\n\r\n // Fallback to subtle neutral border when accent borders disabled\r\n return { border: \"1px solid rgba(255, 255, 255, 0.08)\" };\r\n}\r\n\r\nexport default DisplaySettingsProvider;\r\n"],"mappings":"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"}
@@ -1,5 +1,4 @@
1
1
  import { ReactNode } from 'react';
2
-
3
2
  export interface SpatialSelectionContextValue {
4
3
  /** ID of the currently selected object, or null if nothing is selected. */
5
4
  selectedId: string | null;
@@ -1,10 +1,39 @@
1
+ import { createContext, useContext } from "react";
1
2
  import "react/jsx-runtime";
2
- import { useContext, createContext } from "react";
3
- const SpatialSelectionContextInternal = createContext(null);
3
+ //#region src/react/context/SpatialSelectionContext.tsx
4
+ /**
5
+ * @zendir/ui - SpatialSelectionContext
6
+ *
7
+ * Optional shared selection state for spatial dashboards. Wrap a tree
8
+ * containing `<ZenSpace3D />`, `<GroundTrackMap />`,
9
+ * `<ObjectInventoryPanel />`, etc. — they cross-talk via the context
10
+ * and stay synchronised without prop-drilling:
11
+ *
12
+ * <SpatialSelectionProvider>
13
+ * <ObjectInventoryPanel objects={scene.objects} /> // writes selection
14
+ * <ZenSpace3D satellites={...} /> // reads selection
15
+ * <GroundTrackMap satellites={tracks} /> // reads selection
16
+ * </SpatialSelectionProvider>
17
+ *
18
+ * The provider is **opt-in**. Components that consume the context use
19
+ * `useSpatialSelection()` which returns `null` outside a provider —
20
+ * that's how every component stays standalone-usable. No coupling.
21
+ */
22
+ var SpatialSelectionContextInternal = createContext(null);
23
+ /**
24
+ * Read the spatial-selection context. Returns `null` when used outside
25
+ * a `<SpatialSelectionProvider>` — components MUST handle that case so
26
+ * they stay standalone-usable. Treat the provider as a progressive
27
+ * enhancement, never a hard dependency.
28
+ *
29
+ * const ctx = useSpatialSelection();
30
+ * const selectedId = ctx?.selectedId ?? null; // safe outside provider
31
+ * const onSelect = ctx?.setSelectedId ?? noop; // safe outside provider
32
+ */
4
33
  function useSpatialSelection() {
5
- return useContext(SpatialSelectionContextInternal);
34
+ return useContext(SpatialSelectionContextInternal);
6
35
  }
7
- export {
8
- useSpatialSelection
9
- };
10
- //# sourceMappingURL=SpatialSelectionContext.js.map
36
+ //#endregion
37
+ export { useSpatialSelection };
38
+
39
+ //# sourceMappingURL=SpatialSelectionContext.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SpatialSelectionContext.js","sources":["../../../src/react/context/SpatialSelectionContext.tsx"],"sourcesContent":["/**\n * @zendir/ui - SpatialSelectionContext\n *\n * Optional shared selection state for spatial dashboards. Wrap a tree\n * containing `<ZenSpace3D />`, `<GroundTrackMap />`,\n * `<ObjectInventoryPanel />`, etc. — they cross-talk via the context\n * and stay synchronised without prop-drilling:\n *\n * <SpatialSelectionProvider>\n * <ObjectInventoryPanel objects={scene.objects} /> // writes selection\n * <ZenSpace3D satellites={...} /> // reads selection\n * <GroundTrackMap satellites={tracks} /> // reads selection\n * </SpatialSelectionProvider>\n *\n * The provider is **opt-in**. Components that consume the context use\n * `useSpatialSelection()` which returns `null` outside a provider —\n * that's how every component stays standalone-usable. No coupling.\n */\n\nimport { createContext, useCallback, useContext, useMemo, useState } from 'react';\nimport type { ReactNode } from 'react';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface SpatialSelectionContextValue {\n /** ID of the currently selected object, or null if nothing is selected. */\n selectedId: string | null;\n /** Set the selection (or clear with `null`). */\n setSelectedId: (id: string | null) => void;\n /** Toggle selection: select the id if it isn't selected, clear otherwise. */\n toggleSelection: (id: string) => void;\n /** Convenience: clear any current selection. */\n clearSelection: () => void;\n}\n\nconst SpatialSelectionContextInternal = createContext<SpatialSelectionContextValue | null>(null);\n\n// ─── Provider ─────────────────────────────────────────────────────────────────\n\nexport interface SpatialSelectionProviderProps {\n children: ReactNode;\n /** Initial selected id. Default null (nothing selected). */\n defaultSelectedId?: string | null;\n /** Controlled mode: when set, the provider mirrors this value instead\n * of owning state. Pair with `onSelectionChange`. */\n selectedId?: string | null;\n /** Called whenever the selection changes (uncontrolled or controlled). */\n onSelectionChange?: (id: string | null) => void;\n}\n\nexport function SpatialSelectionProvider({\n children,\n defaultSelectedId = null,\n selectedId: controlledId,\n onSelectionChange,\n}: SpatialSelectionProviderProps) {\n const [internalId, setInternalId] = useState<string | null>(defaultSelectedId);\n const isControlled = controlledId !== undefined;\n const selectedId = isControlled ? controlledId : internalId;\n\n const setSelectedId = useCallback(\n (id: string | null) => {\n if (!isControlled) setInternalId(id);\n onSelectionChange?.(id);\n },\n [isControlled, onSelectionChange],\n );\n\n const toggleSelection = useCallback(\n (id: string) => {\n const next = selectedId === id ? null : id;\n if (!isControlled) setInternalId(next);\n onSelectionChange?.(next);\n },\n [selectedId, isControlled, onSelectionChange],\n );\n\n const clearSelection = useCallback(() => {\n if (!isControlled) setInternalId(null);\n onSelectionChange?.(null);\n }, [isControlled, onSelectionChange]);\n\n const value = useMemo<SpatialSelectionContextValue>(\n () => ({ selectedId, setSelectedId, toggleSelection, clearSelection }),\n [selectedId, setSelectedId, toggleSelection, clearSelection],\n );\n\n return (\n <SpatialSelectionContextInternal.Provider value={value}>\n {children}\n </SpatialSelectionContextInternal.Provider>\n );\n}\n\n// ─── Hooks ────────────────────────────────────────────────────────────────────\n\n/**\n * Read the spatial-selection context. Returns `null` when used outside\n * a `<SpatialSelectionProvider>` — components MUST handle that case so\n * they stay standalone-usable. Treat the provider as a progressive\n * enhancement, never a hard dependency.\n *\n * const ctx = useSpatialSelection();\n * const selectedId = ctx?.selectedId ?? null; // safe outside provider\n * const onSelect = ctx?.setSelectedId ?? noop; // safe outside provider\n */\nexport function useSpatialSelection(): SpatialSelectionContextValue | null {\n return useContext(SpatialSelectionContextInternal);\n}\n\n/**\n * Strict variant — throws if used outside a provider. Useful in the\n * provider's own children when the dependency is intentional.\n */\nexport function useSpatialSelectionStrict(): SpatialSelectionContextValue {\n const ctx = useContext(SpatialSelectionContextInternal);\n if (!ctx) {\n throw new Error(\n 'useSpatialSelectionStrict() called outside <SpatialSelectionProvider>. ' +\n 'Wrap the tree, or use useSpatialSelection() (returns null) for opt-in usage.',\n );\n }\n return ctx;\n}\n\nexport default SpatialSelectionProvider;\n"],"names":[],"mappings":";;AAmCA,MAAM,kCAAkC,cAAmD,IAAI;AAuExF,SAAS,sBAA2D;AACzE,SAAO,WAAW,+BAA+B;AACnD;"}
1
+ {"version":3,"file":"SpatialSelectionContext.js","names":[],"sources":["../../../src/react/context/SpatialSelectionContext.tsx"],"sourcesContent":["/**\r\n * @zendir/ui - SpatialSelectionContext\r\n *\r\n * Optional shared selection state for spatial dashboards. Wrap a tree\r\n * containing `<ZenSpace3D />`, `<GroundTrackMap />`,\r\n * `<ObjectInventoryPanel />`, etc. — they cross-talk via the context\r\n * and stay synchronised without prop-drilling:\r\n *\r\n * <SpatialSelectionProvider>\r\n * <ObjectInventoryPanel objects={scene.objects} /> // writes selection\r\n * <ZenSpace3D satellites={...} /> // reads selection\r\n * <GroundTrackMap satellites={tracks} /> // reads selection\r\n * </SpatialSelectionProvider>\r\n *\r\n * The provider is **opt-in**. Components that consume the context use\r\n * `useSpatialSelection()` which returns `null` outside a provider —\r\n * that's how every component stays standalone-usable. No coupling.\r\n */\r\n\r\nimport {\r\n createContext,\r\n useCallback,\r\n useContext,\r\n useMemo,\r\n useState,\r\n} from \"react\";\r\nimport type { ReactNode } from \"react\";\r\n\r\n// ─── Types ────────────────────────────────────────────────────────────────────\r\n\r\nexport interface SpatialSelectionContextValue {\r\n /** ID of the currently selected object, or null if nothing is selected. */\r\n selectedId: string | null;\r\n /** Set the selection (or clear with `null`). */\r\n setSelectedId: (id: string | null) => void;\r\n /** Toggle selection: select the id if it isn't selected, clear otherwise. */\r\n toggleSelection: (id: string) => void;\r\n /** Convenience: clear any current selection. */\r\n clearSelection: () => void;\r\n}\r\n\r\nconst SpatialSelectionContextInternal =\r\n createContext<SpatialSelectionContextValue | null>(null);\r\n\r\n// ─── Provider ─────────────────────────────────────────────────────────────────\r\n\r\nexport interface SpatialSelectionProviderProps {\r\n children: ReactNode;\r\n /** Initial selected id. Default null (nothing selected). */\r\n defaultSelectedId?: string | null;\r\n /** Controlled mode: when set, the provider mirrors this value instead\r\n * of owning state. Pair with `onSelectionChange`. */\r\n selectedId?: string | null;\r\n /** Called whenever the selection changes (uncontrolled or controlled). */\r\n onSelectionChange?: (id: string | null) => void;\r\n}\r\n\r\nexport function SpatialSelectionProvider({\r\n children,\r\n defaultSelectedId = null,\r\n selectedId: controlledId,\r\n onSelectionChange,\r\n}: SpatialSelectionProviderProps) {\r\n const [internalId, setInternalId] = useState<string | null>(\r\n defaultSelectedId,\r\n );\r\n const isControlled = controlledId !== undefined;\r\n const selectedId = isControlled ? controlledId : internalId;\r\n\r\n const setSelectedId = useCallback(\r\n (id: string | null) => {\r\n if (!isControlled) setInternalId(id);\r\n onSelectionChange?.(id);\r\n },\r\n [isControlled, onSelectionChange],\r\n );\r\n\r\n const toggleSelection = useCallback(\r\n (id: string) => {\r\n const next = selectedId === id ? null : id;\r\n if (!isControlled) setInternalId(next);\r\n onSelectionChange?.(next);\r\n },\r\n [selectedId, isControlled, onSelectionChange],\r\n );\r\n\r\n const clearSelection = useCallback(() => {\r\n if (!isControlled) setInternalId(null);\r\n onSelectionChange?.(null);\r\n }, [isControlled, onSelectionChange]);\r\n\r\n const value = useMemo<SpatialSelectionContextValue>(\r\n () => ({ selectedId, setSelectedId, toggleSelection, clearSelection }),\r\n [selectedId, setSelectedId, toggleSelection, clearSelection],\r\n );\r\n\r\n return (\r\n <SpatialSelectionContextInternal.Provider value={value}>\r\n {children}\r\n </SpatialSelectionContextInternal.Provider>\r\n );\r\n}\r\n\r\n// ─── Hooks ────────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Read the spatial-selection context. Returns `null` when used outside\r\n * a `<SpatialSelectionProvider>` — components MUST handle that case so\r\n * they stay standalone-usable. Treat the provider as a progressive\r\n * enhancement, never a hard dependency.\r\n *\r\n * const ctx = useSpatialSelection();\r\n * const selectedId = ctx?.selectedId ?? null; // safe outside provider\r\n * const onSelect = ctx?.setSelectedId ?? noop; // safe outside provider\r\n */\r\nexport function useSpatialSelection(): SpatialSelectionContextValue | null {\r\n return useContext(SpatialSelectionContextInternal);\r\n}\r\n\r\n/**\r\n * Strict variant — throws if used outside a provider. Useful in the\r\n * provider's own children when the dependency is intentional.\r\n */\r\nexport function useSpatialSelectionStrict(): SpatialSelectionContextValue {\r\n const ctx = useContext(SpatialSelectionContextInternal);\r\n if (!ctx) {\r\n throw new Error(\r\n \"useSpatialSelectionStrict() called outside <SpatialSelectionProvider>. \" +\r\n \"Wrap the tree, or use useSpatialSelection() (returns null) for opt-in usage.\",\r\n );\r\n }\r\n return ctx;\r\n}\r\n\r\nexport default SpatialSelectionProvider;\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAyCA,IAAM,kCACJ,cAAmD,IAAI;;;;;;;;;;;AAyEzD,SAAgB,sBAA2D;CACzE,OAAO,WAAW,+BAA+B;AACnD"}
@@ -1,6 +1,5 @@
1
1
  import { default as React } from 'react';
2
2
  import { TooltipPlacement } from '../overlays/Tooltip';
3
-
4
3
  export interface DataTableColumn<T = Record<string, unknown>> {
5
4
  /** Key in data object */
6
5
  key: string;
@@ -9,7 +8,7 @@ export interface DataTableColumn<T = Record<string, unknown>> {
9
8
  /** Column width (CSS value or number for px) */
10
9
  width?: string | number;
11
10
  /** Text alignment */
12
- align?: 'left' | 'center' | 'right';
11
+ align?: "left" | "center" | "right";
13
12
  /** Use monospace font (good for numbers) */
14
13
  mono?: boolean;
15
14
  /** Custom cell renderer */
@@ -57,7 +56,7 @@ export interface DataTableProps<T = Record<string, unknown>> {
57
56
  /** Color for boolean ✓/✗ values (e.g. '#fff' for white). Defaults to text.primary or row status. */
58
57
  booleanColor?: string;
59
58
  /** Optional row status key or getter — boolean cells use this row's status color when set (matches white/status design). */
60
- getRowStatus?: (row: T, index: number) => 'normal' | 'caution' | 'serious' | 'critical' | 'standby' | 'off' | undefined;
59
+ getRowStatus?: (row: T, index: number) => "normal" | "caution" | "serious" | "critical" | "standby" | "off" | undefined;
61
60
  /** Custom style */
62
61
  style?: React.CSSProperties;
63
62
  }
@@ -67,7 +66,7 @@ export interface DataTableRowDetailField {
67
66
  /** Field value (string, number, or ReactNode for custom rendering) */
68
67
  value: React.ReactNode;
69
68
  /** Optional status color for the value */
70
- status?: 'normal' | 'caution' | 'serious' | 'critical' | 'standby' | 'off';
69
+ status?: "normal" | "caution" | "serious" | "critical" | "standby" | "off";
71
70
  /** Use monospace font for this value */
72
71
  mono?: boolean;
73
72
  }