@buoy-gg/shared-ui 7.0.26 → 7.0.28

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 (221) hide show
  1. package/lib/commonjs/JsModal.js +156 -20
  2. package/lib/commonjs/JsModal.web.js +85 -39
  3. package/lib/commonjs/dataViewer/VirtualizedDataExplorer.js +14 -4
  4. package/lib/commonjs/dataViewer/diffThemes.js +20 -18
  5. package/lib/commonjs/dataViewer/tree/TreeDiffViewer.js +8 -8
  6. package/lib/commonjs/hooks/safe-area-impl.js +1 -1
  7. package/lib/commonjs/icons/lucide-icons.js +74 -15
  8. package/lib/commonjs/index.js +86 -0
  9. package/lib/commonjs/ui/backgrounds/BackgroundSwitcher.js +248 -74
  10. package/lib/commonjs/ui/backgrounds/README.md +102 -20
  11. package/lib/commonjs/ui/backgrounds/backgroundStore.js +20 -6
  12. package/lib/commonjs/ui/backgrounds/index.js +91 -1
  13. package/lib/commonjs/ui/backgrounds/primitives.js +50 -14
  14. package/lib/commonjs/ui/backgrounds/registry.js +41 -64
  15. package/lib/commonjs/ui/backgrounds/rng.js +21 -0
  16. package/lib/commonjs/ui/backgrounds/skyClock.js +45 -0
  17. package/lib/commonjs/ui/backgrounds/variants/daylight.js +453 -0
  18. package/lib/commonjs/ui/backgrounds/variants/deepField.js +60 -30
  19. package/lib/commonjs/ui/backgrounds/variants/hyperspace.js +218 -0
  20. package/lib/commonjs/ui/backgrounds/variants/liveSky.js +898 -0
  21. package/lib/commonjs/ui/backgrounds/variants/meteors.js +257 -0
  22. package/lib/commonjs/ui/backgrounds/variants/moonlight.js +472 -0
  23. package/lib/commonjs/ui/backgrounds/variants/underwater.js +757 -0
  24. package/lib/commonjs/ui/components/Badge.js +11 -10
  25. package/lib/commonjs/ui/components/CompactRow.js +35 -18
  26. package/lib/commonjs/ui/components/CopyButton.js +6 -4
  27. package/lib/commonjs/ui/components/DevToolsCard.js +16 -9
  28. package/lib/commonjs/ui/components/DynamicFilterView.js +43 -41
  29. package/lib/commonjs/ui/components/EventStepperFooter.js +38 -10
  30. package/lib/commonjs/ui/components/FilterComponents.js +11 -11
  31. package/lib/commonjs/ui/components/ModalHeader.js +28 -15
  32. package/lib/commonjs/ui/components/SectionHeader.js +3 -1
  33. package/lib/commonjs/ui/components/StorageTypeBadge.js +3 -2
  34. package/lib/commonjs/ui/components/TabSelector.js +56 -38
  35. package/lib/commonjs/ui/components/ValueTypeBadge.js +7 -6
  36. package/lib/commonjs/ui/components/WindowControls.js +37 -10
  37. package/lib/commonjs/ui/gameUI/constants/gameUIColors.js +8 -0
  38. package/lib/commonjs/ui/night/nightTheme.js +120 -0
  39. package/lib/commonjs/ui/night/primitives.js +498 -0
  40. package/lib/module/JsModal.js +156 -20
  41. package/lib/module/JsModal.web.js +83 -39
  42. package/lib/module/dataViewer/VirtualizedDataExplorer.js +14 -4
  43. package/lib/module/dataViewer/diffThemes.js +20 -18
  44. package/lib/module/dataViewer/tree/TreeDiffViewer.js +9 -9
  45. package/lib/module/hooks/safe-area-impl.js +1 -1
  46. package/lib/module/icons/lucide-icons.js +74 -15
  47. package/lib/module/index.js +4 -0
  48. package/lib/module/ui/backgrounds/BackgroundSwitcher.js +250 -76
  49. package/lib/module/ui/backgrounds/README.md +102 -20
  50. package/lib/module/ui/backgrounds/backgroundStore.js +19 -5
  51. package/lib/module/ui/backgrounds/index.js +11 -2
  52. package/lib/module/ui/backgrounds/primitives.js +53 -16
  53. package/lib/module/ui/backgrounds/registry.js +41 -64
  54. package/lib/module/ui/backgrounds/rng.js +20 -0
  55. package/lib/module/ui/backgrounds/skyClock.js +39 -0
  56. package/lib/module/ui/backgrounds/variants/daylight.js +449 -0
  57. package/lib/module/ui/backgrounds/variants/deepField.js +62 -31
  58. package/lib/module/ui/backgrounds/variants/hyperspace.js +214 -0
  59. package/lib/module/ui/backgrounds/variants/liveSky.js +893 -0
  60. package/lib/module/ui/backgrounds/variants/meteors.js +253 -0
  61. package/lib/module/ui/backgrounds/variants/moonlight.js +468 -0
  62. package/lib/module/ui/backgrounds/variants/underwater.js +753 -0
  63. package/lib/module/ui/components/Badge.js +11 -10
  64. package/lib/module/ui/components/CompactRow.js +35 -18
  65. package/lib/module/ui/components/CopyButton.js +6 -4
  66. package/lib/module/ui/components/DevToolsCard.js +16 -9
  67. package/lib/module/ui/components/DynamicFilterView.js +43 -41
  68. package/lib/module/ui/components/EventStepperFooter.js +38 -10
  69. package/lib/module/ui/components/FilterComponents.js +11 -11
  70. package/lib/module/ui/components/ModalHeader.js +28 -15
  71. package/lib/module/ui/components/SectionHeader.js +3 -1
  72. package/lib/module/ui/components/StorageTypeBadge.js +3 -2
  73. package/lib/module/ui/components/TabSelector.js +57 -39
  74. package/lib/module/ui/components/ValueTypeBadge.js +7 -6
  75. package/lib/module/ui/components/WindowControls.js +37 -10
  76. package/lib/module/ui/gameUI/constants/gameUIColors.js +8 -0
  77. package/lib/module/ui/night/nightTheme.js +116 -0
  78. package/lib/module/ui/night/primitives.js +485 -0
  79. package/lib/typescript/commonjs/JsModal.d.ts +18 -0
  80. package/lib/typescript/commonjs/JsModal.d.ts.map +1 -1
  81. package/lib/typescript/commonjs/JsModal.web.d.ts +13 -0
  82. package/lib/typescript/commonjs/JsModal.web.d.ts.map +1 -1
  83. package/lib/typescript/commonjs/dataViewer/VirtualizedDataExplorer.d.ts.map +1 -1
  84. package/lib/typescript/commonjs/dataViewer/diffThemes.d.ts +3 -1
  85. package/lib/typescript/commonjs/dataViewer/diffThemes.d.ts.map +1 -1
  86. package/lib/typescript/commonjs/dataViewer/tree/TreeDiffViewer.d.ts.map +1 -1
  87. package/lib/typescript/commonjs/hooks/safe-area-impl.d.ts +1 -1
  88. package/lib/typescript/commonjs/icons/lucide-icons.d.ts +12 -1
  89. package/lib/typescript/commonjs/icons/lucide-icons.d.ts.map +1 -1
  90. package/lib/typescript/commonjs/index.d.ts +3 -0
  91. package/lib/typescript/commonjs/index.d.ts.map +1 -1
  92. package/lib/typescript/commonjs/ui/backgrounds/BackgroundSwitcher.d.ts +26 -6
  93. package/lib/typescript/commonjs/ui/backgrounds/BackgroundSwitcher.d.ts.map +1 -1
  94. package/lib/typescript/commonjs/ui/backgrounds/backgroundStore.d.ts +3 -0
  95. package/lib/typescript/commonjs/ui/backgrounds/backgroundStore.d.ts.map +1 -1
  96. package/lib/typescript/commonjs/ui/backgrounds/index.d.ts +7 -1
  97. package/lib/typescript/commonjs/ui/backgrounds/index.d.ts.map +1 -1
  98. package/lib/typescript/commonjs/ui/backgrounds/primitives.d.ts +18 -3
  99. package/lib/typescript/commonjs/ui/backgrounds/primitives.d.ts.map +1 -1
  100. package/lib/typescript/commonjs/ui/backgrounds/registry.d.ts +8 -0
  101. package/lib/typescript/commonjs/ui/backgrounds/registry.d.ts.map +1 -1
  102. package/lib/typescript/commonjs/ui/backgrounds/rng.d.ts +6 -0
  103. package/lib/typescript/commonjs/ui/backgrounds/rng.d.ts.map +1 -1
  104. package/lib/typescript/commonjs/ui/backgrounds/skyClock.d.ts +17 -0
  105. package/lib/typescript/commonjs/ui/backgrounds/skyClock.d.ts.map +1 -0
  106. package/lib/typescript/commonjs/ui/backgrounds/types.d.ts +1 -1
  107. package/lib/typescript/commonjs/ui/backgrounds/types.d.ts.map +1 -1
  108. package/lib/typescript/commonjs/ui/backgrounds/variants/daylight.d.ts +30 -0
  109. package/lib/typescript/commonjs/ui/backgrounds/variants/daylight.d.ts.map +1 -0
  110. package/lib/typescript/commonjs/ui/backgrounds/variants/deepField.d.ts +19 -4
  111. package/lib/typescript/commonjs/ui/backgrounds/variants/deepField.d.ts.map +1 -1
  112. package/lib/typescript/commonjs/ui/backgrounds/variants/hyperspace.d.ts +39 -0
  113. package/lib/typescript/commonjs/ui/backgrounds/variants/hyperspace.d.ts.map +1 -0
  114. package/lib/typescript/commonjs/ui/backgrounds/variants/liveSky.d.ts +41 -0
  115. package/lib/typescript/commonjs/ui/backgrounds/variants/liveSky.d.ts.map +1 -0
  116. package/lib/typescript/commonjs/ui/backgrounds/variants/meteors.d.ts +26 -0
  117. package/lib/typescript/commonjs/ui/backgrounds/variants/meteors.d.ts.map +1 -0
  118. package/lib/typescript/commonjs/ui/backgrounds/variants/moonlight.d.ts +35 -0
  119. package/lib/typescript/commonjs/ui/backgrounds/variants/moonlight.d.ts.map +1 -0
  120. package/lib/typescript/commonjs/ui/backgrounds/variants/underwater.d.ts +51 -0
  121. package/lib/typescript/commonjs/ui/backgrounds/variants/underwater.d.ts.map +1 -0
  122. package/lib/typescript/commonjs/ui/components/Badge.d.ts.map +1 -1
  123. package/lib/typescript/commonjs/ui/components/CompactRow.d.ts +3 -1
  124. package/lib/typescript/commonjs/ui/components/CompactRow.d.ts.map +1 -1
  125. package/lib/typescript/commonjs/ui/components/CopyButton.d.ts.map +1 -1
  126. package/lib/typescript/commonjs/ui/components/DevToolsCard.d.ts +3 -1
  127. package/lib/typescript/commonjs/ui/components/DevToolsCard.d.ts.map +1 -1
  128. package/lib/typescript/commonjs/ui/components/DynamicFilterView.d.ts.map +1 -1
  129. package/lib/typescript/commonjs/ui/components/EventStepperFooter.d.ts +2 -0
  130. package/lib/typescript/commonjs/ui/components/EventStepperFooter.d.ts.map +1 -1
  131. package/lib/typescript/commonjs/ui/components/ModalHeader.d.ts.map +1 -1
  132. package/lib/typescript/commonjs/ui/components/StorageTypeBadge.d.ts.map +1 -1
  133. package/lib/typescript/commonjs/ui/components/TabSelector.d.ts +9 -0
  134. package/lib/typescript/commonjs/ui/components/TabSelector.d.ts.map +1 -1
  135. package/lib/typescript/commonjs/ui/components/ValueTypeBadge.d.ts.map +1 -1
  136. package/lib/typescript/commonjs/ui/components/WindowControls.d.ts +4 -2
  137. package/lib/typescript/commonjs/ui/components/WindowControls.d.ts.map +1 -1
  138. package/lib/typescript/commonjs/ui/gameUI/constants/gameUIColors.d.ts +8 -0
  139. package/lib/typescript/commonjs/ui/gameUI/constants/gameUIColors.d.ts.map +1 -1
  140. package/lib/typescript/commonjs/ui/night/nightTheme.d.ts +113 -0
  141. package/lib/typescript/commonjs/ui/night/nightTheme.d.ts.map +1 -0
  142. package/lib/typescript/commonjs/ui/night/primitives.d.ts +111 -0
  143. package/lib/typescript/commonjs/ui/night/primitives.d.ts.map +1 -0
  144. package/lib/typescript/module/JsModal.d.ts +18 -0
  145. package/lib/typescript/module/JsModal.d.ts.map +1 -1
  146. package/lib/typescript/module/JsModal.web.d.ts +13 -0
  147. package/lib/typescript/module/JsModal.web.d.ts.map +1 -1
  148. package/lib/typescript/module/dataViewer/VirtualizedDataExplorer.d.ts.map +1 -1
  149. package/lib/typescript/module/dataViewer/diffThemes.d.ts +3 -1
  150. package/lib/typescript/module/dataViewer/diffThemes.d.ts.map +1 -1
  151. package/lib/typescript/module/dataViewer/tree/TreeDiffViewer.d.ts.map +1 -1
  152. package/lib/typescript/module/hooks/safe-area-impl.d.ts +1 -1
  153. package/lib/typescript/module/icons/lucide-icons.d.ts +12 -1
  154. package/lib/typescript/module/icons/lucide-icons.d.ts.map +1 -1
  155. package/lib/typescript/module/index.d.ts +3 -0
  156. package/lib/typescript/module/index.d.ts.map +1 -1
  157. package/lib/typescript/module/ui/backgrounds/BackgroundSwitcher.d.ts +26 -6
  158. package/lib/typescript/module/ui/backgrounds/BackgroundSwitcher.d.ts.map +1 -1
  159. package/lib/typescript/module/ui/backgrounds/backgroundStore.d.ts +3 -0
  160. package/lib/typescript/module/ui/backgrounds/backgroundStore.d.ts.map +1 -1
  161. package/lib/typescript/module/ui/backgrounds/index.d.ts +7 -1
  162. package/lib/typescript/module/ui/backgrounds/index.d.ts.map +1 -1
  163. package/lib/typescript/module/ui/backgrounds/primitives.d.ts +18 -3
  164. package/lib/typescript/module/ui/backgrounds/primitives.d.ts.map +1 -1
  165. package/lib/typescript/module/ui/backgrounds/registry.d.ts +8 -0
  166. package/lib/typescript/module/ui/backgrounds/registry.d.ts.map +1 -1
  167. package/lib/typescript/module/ui/backgrounds/rng.d.ts +6 -0
  168. package/lib/typescript/module/ui/backgrounds/rng.d.ts.map +1 -1
  169. package/lib/typescript/module/ui/backgrounds/skyClock.d.ts +17 -0
  170. package/lib/typescript/module/ui/backgrounds/skyClock.d.ts.map +1 -0
  171. package/lib/typescript/module/ui/backgrounds/types.d.ts +1 -1
  172. package/lib/typescript/module/ui/backgrounds/types.d.ts.map +1 -1
  173. package/lib/typescript/module/ui/backgrounds/variants/daylight.d.ts +30 -0
  174. package/lib/typescript/module/ui/backgrounds/variants/daylight.d.ts.map +1 -0
  175. package/lib/typescript/module/ui/backgrounds/variants/deepField.d.ts +19 -4
  176. package/lib/typescript/module/ui/backgrounds/variants/deepField.d.ts.map +1 -1
  177. package/lib/typescript/module/ui/backgrounds/variants/hyperspace.d.ts +39 -0
  178. package/lib/typescript/module/ui/backgrounds/variants/hyperspace.d.ts.map +1 -0
  179. package/lib/typescript/module/ui/backgrounds/variants/liveSky.d.ts +41 -0
  180. package/lib/typescript/module/ui/backgrounds/variants/liveSky.d.ts.map +1 -0
  181. package/lib/typescript/module/ui/backgrounds/variants/meteors.d.ts +26 -0
  182. package/lib/typescript/module/ui/backgrounds/variants/meteors.d.ts.map +1 -0
  183. package/lib/typescript/module/ui/backgrounds/variants/moonlight.d.ts +35 -0
  184. package/lib/typescript/module/ui/backgrounds/variants/moonlight.d.ts.map +1 -0
  185. package/lib/typescript/module/ui/backgrounds/variants/underwater.d.ts +51 -0
  186. package/lib/typescript/module/ui/backgrounds/variants/underwater.d.ts.map +1 -0
  187. package/lib/typescript/module/ui/components/Badge.d.ts.map +1 -1
  188. package/lib/typescript/module/ui/components/CompactRow.d.ts +3 -1
  189. package/lib/typescript/module/ui/components/CompactRow.d.ts.map +1 -1
  190. package/lib/typescript/module/ui/components/CopyButton.d.ts.map +1 -1
  191. package/lib/typescript/module/ui/components/DevToolsCard.d.ts +3 -1
  192. package/lib/typescript/module/ui/components/DevToolsCard.d.ts.map +1 -1
  193. package/lib/typescript/module/ui/components/DynamicFilterView.d.ts.map +1 -1
  194. package/lib/typescript/module/ui/components/EventStepperFooter.d.ts +2 -0
  195. package/lib/typescript/module/ui/components/EventStepperFooter.d.ts.map +1 -1
  196. package/lib/typescript/module/ui/components/ModalHeader.d.ts.map +1 -1
  197. package/lib/typescript/module/ui/components/StorageTypeBadge.d.ts.map +1 -1
  198. package/lib/typescript/module/ui/components/TabSelector.d.ts +9 -0
  199. package/lib/typescript/module/ui/components/TabSelector.d.ts.map +1 -1
  200. package/lib/typescript/module/ui/components/ValueTypeBadge.d.ts.map +1 -1
  201. package/lib/typescript/module/ui/components/WindowControls.d.ts +4 -2
  202. package/lib/typescript/module/ui/components/WindowControls.d.ts.map +1 -1
  203. package/lib/typescript/module/ui/gameUI/constants/gameUIColors.d.ts +8 -0
  204. package/lib/typescript/module/ui/gameUI/constants/gameUIColors.d.ts.map +1 -1
  205. package/lib/typescript/module/ui/night/nightTheme.d.ts +113 -0
  206. package/lib/typescript/module/ui/night/nightTheme.d.ts.map +1 -0
  207. package/lib/typescript/module/ui/night/primitives.d.ts +111 -0
  208. package/lib/typescript/module/ui/night/primitives.d.ts.map +1 -0
  209. package/package.json +4 -4
  210. package/lib/commonjs/ui/backgrounds/variants/lattice.js +0 -579
  211. package/lib/commonjs/ui/backgrounds/variants/starfield.js +0 -210
  212. package/lib/module/ui/backgrounds/variants/lattice.js +0 -575
  213. package/lib/module/ui/backgrounds/variants/starfield.js +0 -206
  214. package/lib/typescript/commonjs/ui/backgrounds/variants/lattice.d.ts +0 -33
  215. package/lib/typescript/commonjs/ui/backgrounds/variants/lattice.d.ts.map +0 -1
  216. package/lib/typescript/commonjs/ui/backgrounds/variants/starfield.d.ts +0 -12
  217. package/lib/typescript/commonjs/ui/backgrounds/variants/starfield.d.ts.map +0 -1
  218. package/lib/typescript/module/ui/backgrounds/variants/lattice.d.ts +0 -33
  219. package/lib/typescript/module/ui/backgrounds/variants/lattice.d.ts.map +0 -1
  220. package/lib/typescript/module/ui/backgrounds/variants/starfield.d.ts +0 -12
  221. package/lib/typescript/module/ui/backgrounds/variants/starfield.d.ts.map +0 -1
@@ -12,6 +12,7 @@ import React, { memo } from "react";
12
12
  import { View, Text, TouchableOpacity, StyleSheet } from "react-native";
13
13
  import { ChevronLeft, ChevronRight } from "../../icons/lucide-icons.js";
14
14
  import { macOSColors } from "../gameUI/constants/macOSDesignSystemColors.js";
15
+ import { night } from "../night/nightTheme.js";
15
16
  import { useSafeAreaInsets } from "../../hooks/useSafeAreaInsets.js";
16
17
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
17
18
  /**
@@ -26,51 +27,56 @@ export const EventStepperFooter = /*#__PURE__*/memo(function EventStepperFooter(
26
27
  itemLabel = "Event",
27
28
  subtitle,
28
29
  absolute = false,
29
- applySafeAreaInset = true
30
+ applySafeAreaInset = true,
31
+ variant = "night"
30
32
  }) {
31
33
  const insets = useSafeAreaInsets();
32
34
 
33
35
  // Don't render if there's only one or no items
34
36
  if (totalItems <= 1) return null;
37
+ const isNight = variant === "night";
35
38
  const isFirstItem = currentIndex === 0;
36
39
  const isLastItem = currentIndex === totalItems - 1;
37
40
  const bottomPadding = applySafeAreaInset ? 12 + insets.bottom : 12;
41
+ // Night buttons are the plate-with-accent-label style — chevrons match.
42
+ const enabledInk = isNight ? night.color.accent : macOSColors.text.primary;
43
+ const disabledInk = isNight ? night.color.textTertiary : macOSColors.text.muted;
38
44
  return /*#__PURE__*/_jsxs(View, {
39
- style: [styles.footer, absolute && styles.footerAbsolute, {
45
+ style: [styles.footer, isNight && styles.nightFooter, absolute && styles.footerAbsolute, {
40
46
  paddingBottom: bottomPadding
41
47
  }],
42
48
  children: [/*#__PURE__*/_jsxs(TouchableOpacity, {
43
49
  onPress: onPrevious,
44
50
  disabled: isFirstItem,
45
- style: [styles.navButton, isFirstItem && styles.navButtonDisabled],
51
+ style: [styles.navButton, isNight && styles.nightNavButton, isFirstItem && styles.navButtonDisabled],
46
52
  activeOpacity: 0.7,
47
53
  children: [/*#__PURE__*/_jsx(ChevronLeft, {
48
54
  size: 20,
49
- color: isFirstItem ? macOSColors.text.muted : macOSColors.text.primary
55
+ color: isFirstItem ? disabledInk : enabledInk
50
56
  }), /*#__PURE__*/_jsx(Text, {
51
- style: [styles.navButtonText, isFirstItem && styles.navButtonTextDisabled],
57
+ style: [styles.navButtonText, isNight && styles.nightNavButtonText, isFirstItem && styles.navButtonTextDisabled, isFirstItem && isNight && styles.nightNavButtonTextDisabled],
52
58
  children: "Previous"
53
59
  })]
54
60
  }), /*#__PURE__*/_jsxs(View, {
55
61
  style: styles.counterContainer,
56
62
  children: [/*#__PURE__*/_jsxs(Text, {
57
- style: styles.counterText,
63
+ style: [styles.counterText, isNight && styles.nightCounterText],
58
64
  children: [itemLabel, " ", currentIndex + 1, " of ", totalItems]
59
65
  }), subtitle && /*#__PURE__*/_jsx(Text, {
60
- style: styles.subtitleText,
66
+ style: [styles.subtitleText, isNight && styles.nightSubtitleText],
61
67
  children: subtitle
62
68
  })]
63
69
  }), /*#__PURE__*/_jsxs(TouchableOpacity, {
64
70
  onPress: onNext,
65
71
  disabled: isLastItem,
66
- style: [styles.navButton, isLastItem && styles.navButtonDisabled],
72
+ style: [styles.navButton, isNight && styles.nightNavButton, isLastItem && styles.navButtonDisabled],
67
73
  activeOpacity: 0.7,
68
74
  children: [/*#__PURE__*/_jsx(Text, {
69
- style: [styles.navButtonText, isLastItem && styles.navButtonTextDisabled],
75
+ style: [styles.navButtonText, isNight && styles.nightNavButtonText, isLastItem && styles.navButtonTextDisabled, isLastItem && isNight && styles.nightNavButtonTextDisabled],
70
76
  children: "Next"
71
77
  }), /*#__PURE__*/_jsx(ChevronRight, {
72
78
  size: 20,
73
- color: isLastItem ? macOSColors.text.muted : macOSColors.text.primary
79
+ color: isLastItem ? disabledInk : enabledInk
74
80
  })]
75
81
  })]
76
82
  });
@@ -139,5 +145,27 @@ const styles = StyleSheet.create({
139
145
  color: macOSColors.text.secondary,
140
146
  fontFamily: "monospace",
141
147
  marginTop: 2
148
+ },
149
+ // ── Night variant (see ui/night/nightTheme.ts): near-black glass bar with
150
+ // hairline top border, plate buttons, night text hierarchy.
151
+ nightFooter: {
152
+ backgroundColor: "rgba(5, 5, 5, 0.92)",
153
+ borderTopColor: night.color.border
154
+ },
155
+ nightNavButton: {
156
+ backgroundColor: night.color.button,
157
+ borderRadius: 15
158
+ },
159
+ nightNavButtonText: {
160
+ color: night.color.accent
161
+ },
162
+ nightNavButtonTextDisabled: {
163
+ color: night.color.textTertiary
164
+ },
165
+ nightCounterText: {
166
+ color: night.color.text
167
+ },
168
+ nightSubtitleText: {
169
+ color: night.color.textSecondary
142
170
  }
143
171
  });
@@ -2,7 +2,7 @@
2
2
 
3
3
  import { View, Text, TouchableOpacity, TextInput, StyleSheet } from "react-native";
4
4
  import { X, Plus } from "../../icons/index.js";
5
- import { buoyColors } from "../gameUI/constants/gameUIColors.js";
5
+ import { night } from "../night/nightTheme.js";
6
6
 
7
7
  // Container for filter section
8
8
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
@@ -165,7 +165,7 @@ export function FilterList({
165
165
  const styles = StyleSheet.create({
166
166
  filterSection: {
167
167
  padding: 16,
168
- backgroundColor: buoyColors.base
168
+ backgroundColor: "transparent"
169
169
  },
170
170
  badge: {
171
171
  flexDirection: "row",
@@ -188,10 +188,10 @@ const styles = StyleSheet.create({
188
188
  inputContainer: {
189
189
  flexDirection: "row",
190
190
  alignItems: "center",
191
- backgroundColor: buoyColors.input,
191
+ backgroundColor: night.color.surfaceElevated,
192
192
  borderRadius: 10,
193
193
  borderWidth: 1,
194
- borderColor: buoyColors.border,
194
+ borderColor: night.color.border,
195
195
  paddingHorizontal: 14,
196
196
  paddingVertical: 10,
197
197
  marginBottom: 8
@@ -200,7 +200,7 @@ const styles = StyleSheet.create({
200
200
  flex: 1,
201
201
  fontSize: 13,
202
202
  paddingVertical: 0,
203
- color: buoyColors.text
203
+ color: night.color.text
204
204
  },
205
205
  inputButtons: {
206
206
  flexDirection: "row",
@@ -210,7 +210,7 @@ const styles = StyleSheet.create({
210
210
  cancelButton: {
211
211
  padding: 4,
212
212
  borderRadius: 6,
213
- backgroundColor: buoyColors.hover
213
+ backgroundColor: night.color.surfaceElevated
214
214
  },
215
215
  inlineAddButton: {
216
216
  paddingHorizontal: 12,
@@ -231,8 +231,8 @@ const styles = StyleSheet.create({
231
231
  borderRadius: 10,
232
232
  borderWidth: 1,
233
233
  borderStyle: "dashed",
234
- borderColor: buoyColors.border,
235
- backgroundColor: buoyColors.input
234
+ borderColor: night.color.border,
235
+ backgroundColor: night.color.surfaceElevated
236
236
  },
237
237
  addButtonText: {
238
238
  fontSize: 13,
@@ -248,17 +248,17 @@ const styles = StyleSheet.create({
248
248
  justifyContent: "space-between",
249
249
  paddingVertical: 10,
250
250
  paddingHorizontal: 12,
251
- backgroundColor: buoyColors.hover,
251
+ backgroundColor: night.color.surfaceElevated,
252
252
  borderRadius: 8,
253
253
  borderWidth: 1,
254
- borderColor: buoyColors.border
254
+ borderColor: night.color.border
255
255
  },
256
256
  filterItemText: {
257
257
  flex: 1,
258
258
  fontSize: 12,
259
259
  fontFamily: "monospace",
260
260
  marginRight: 8,
261
- color: buoyColors.text
261
+ color: night.color.text
262
262
  },
263
263
  filterItemMeta: {
264
264
  marginRight: 8
@@ -3,7 +3,7 @@
3
3
  import { View, Text, TextInput, TouchableOpacity, StyleSheet } from "react-native";
4
4
  import { useEffect, useRef } from "react";
5
5
  import { ChevronLeft, Search as SearchIcon, X } from "../../icons/index.js";
6
- import { buoyColors } from "../gameUI/constants/gameUIColors.js";
6
+ import { night } from "../night/nightTheme.js";
7
7
 
8
8
  // Base ModalHeader container component
9
9
  // Note: onClose and onMinimize are now handled by WindowControls in JsModal
@@ -35,9 +35,12 @@ export function Navigation({
35
35
  }), /*#__PURE__*/_jsx(TouchableOpacity, {
36
36
  onPress: onClose,
37
37
  style: styles.navigationButton,
38
+ testID: "tool-close",
39
+ accessibilityLabel: "Close",
40
+ accessibilityRole: "button",
38
41
  children: closeIcon || /*#__PURE__*/_jsx(X, {
39
42
  size: 20,
40
- color: buoyColors.textMuted
43
+ color: night.color.textSecondary
41
44
  })
42
45
  })]
43
46
  });
@@ -48,9 +51,12 @@ export function Navigation({
48
51
  return /*#__PURE__*/_jsx(TouchableOpacity, {
49
52
  onPress: onBack,
50
53
  style: styles.navigationButton,
54
+ testID: "tool-back",
55
+ accessibilityLabel: "Back",
56
+ accessibilityRole: "button",
51
57
  children: backIcon || /*#__PURE__*/_jsx(ChevronLeft, {
52
58
  size: 20,
53
- color: buoyColors.textSecondary
59
+ color: night.color.textSecondary
54
60
  })
55
61
  });
56
62
  }
@@ -61,9 +67,12 @@ export function Navigation({
61
67
  return /*#__PURE__*/_jsx(TouchableOpacity, {
62
68
  onPress: onBack,
63
69
  style: styles.navigationButton,
70
+ testID: "tool-back",
71
+ accessibilityLabel: "Back",
72
+ accessibilityRole: "button",
64
73
  children: backIcon || /*#__PURE__*/_jsx(ChevronLeft, {
65
74
  size: 20,
66
- color: buoyColors.textSecondary
75
+ color: night.color.textSecondary
67
76
  })
68
77
  });
69
78
  }
@@ -131,12 +140,12 @@ export function HeaderSearch({
131
140
  style: styles.searchContainer,
132
141
  children: [/*#__PURE__*/_jsx(SearchIcon, {
133
142
  size: 12,
134
- color: buoyColors.textSecondary
143
+ color: night.color.textSecondary
135
144
  }), /*#__PURE__*/_jsx(TextInput, {
136
145
  ref: inputRef,
137
146
  style: styles.searchInput,
138
147
  placeholder: placeholder,
139
- placeholderTextColor: buoyColors.textMuted,
148
+ placeholderTextColor: night.color.placeholder,
140
149
  value: value,
141
150
  onChangeText: onChangeText,
142
151
  autoCorrect: false,
@@ -146,7 +155,7 @@ export function HeaderSearch({
146
155
  style: styles.searchCancelButton,
147
156
  children: /*#__PURE__*/_jsx(X, {
148
157
  size: 12,
149
- color: buoyColors.textSecondary
158
+ color: night.color.textSecondary
150
159
  })
151
160
  })]
152
161
  });
@@ -164,7 +173,10 @@ const styles = StyleSheet.create({
164
173
  flex: 1,
165
174
  gap: 8,
166
175
  minHeight: 32,
167
- paddingLeft: 4
176
+ paddingLeft: 4,
177
+ // Traffic-light window controls sit absolutely in this corner. Reserve
178
+ // space so Copy / search / extra actions never paint under them.
179
+ paddingRight: 56
168
180
  },
169
181
  navigationButton: {
170
182
  padding: 4
@@ -181,7 +193,7 @@ const styles = StyleSheet.create({
181
193
  justifyContent: "center"
182
194
  },
183
195
  headerTitle: {
184
- color: buoyColors.text,
196
+ color: night.color.text,
185
197
  fontSize: 14,
186
198
  fontWeight: "500"
187
199
  },
@@ -190,7 +202,7 @@ const styles = StyleSheet.create({
190
202
  },
191
203
  headerSubtitle: {
192
204
  fontSize: 12,
193
- color: buoyColors.textSecondary,
205
+ color: night.color.textSecondary,
194
206
  marginTop: 2
195
207
  },
196
208
  headerSubtitleCentered: {
@@ -200,7 +212,8 @@ const styles = StyleSheet.create({
200
212
  flexDirection: "row",
201
213
  gap: 6,
202
214
  marginLeft: "auto",
203
- marginRight: 4
215
+ marginRight: 4,
216
+ flexShrink: 0
204
217
  },
205
218
  headerContentNoMargin: {
206
219
  marginHorizontal: 0
@@ -209,21 +222,21 @@ const styles = StyleSheet.create({
209
222
  flexDirection: "row",
210
223
  alignItems: "center",
211
224
  flex: 1,
212
- backgroundColor: buoyColors.input,
213
- borderRadius: 6,
225
+ backgroundColor: night.color.surfaceElevated,
226
+ borderRadius: 10,
214
227
  paddingHorizontal: 10,
215
228
  paddingVertical: 4,
216
229
  marginHorizontal: 12,
217
230
  marginVertical: 4,
218
231
  height: 32,
219
232
  borderWidth: 1,
220
- borderColor: buoyColors.border
233
+ borderColor: night.color.border
221
234
  },
222
235
  searchInput: {
223
236
  flex: 1,
224
237
  marginLeft: 8,
225
238
  fontSize: 13,
226
- color: buoyColors.text,
239
+ color: night.color.text,
227
240
  padding: 0,
228
241
  height: "100%"
229
242
  },
@@ -90,7 +90,9 @@ const styles = StyleSheet.create({
90
90
  alignItems: "center",
91
91
  paddingHorizontal: 16,
92
92
  paddingVertical: 8,
93
- backgroundColor: buoyColors.base,
93
+ // Transparent (was the opaque buoy base): section headers sit on night
94
+ // surfaces now, and an opaque strip breaks the star field behind them.
95
+ backgroundColor: "transparent",
94
96
  minHeight: 40
95
97
  },
96
98
  iconWrapper: {
@@ -3,6 +3,7 @@
3
3
  import { View, Text, StyleSheet } from "react-native";
4
4
  import { Database, Lock, HardDrive } from "../../icons/index.js";
5
5
  import { buoyColors } from "../gameUI/constants/gameUIColors.js";
6
+ import { night } from "../night/nightTheme.js";
6
7
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
7
8
  export function StorageTypeBadge({
8
9
  type,
@@ -13,13 +14,13 @@ export function StorageTypeBadge({
13
14
  const getStorageColor = () => {
14
15
  switch (type) {
15
16
  case "async":
16
- return buoyColors.textSecondary;
17
+ return night.color.textSecondary;
17
18
  case "mmkv":
18
19
  return buoyColors.success;
19
20
  case "secure":
20
21
  return buoyColors.warning;
21
22
  default:
22
- return buoyColors.textMuted;
23
+ return night.color.textTertiary;
23
24
  }
24
25
  };
25
26
  const getStorageText = () => {
@@ -1,8 +1,17 @@
1
1
  "use strict";
2
2
 
3
3
  import { View, Text, TouchableOpacity, StyleSheet } from "react-native";
4
- import { buoyColors } from "../gameUI/constants/gameUIColors.js";
5
- import { jsx as _jsx } from "react/jsx-runtime";
4
+ import { night } from "../night/nightTheme.js";
5
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
6
+ /**
7
+ * Header tab strip — the night segmented control (see ui/night): `#050505`
8
+ * track, `#161618` thumb, accent underline glow under the active label.
9
+ *
10
+ * Same props API it has always had, so every tool header that mounts it got
11
+ * the night look in one shared edit. Visually identical to `NightSegmented`
12
+ * at its compact size — new night-native code should prefer that primitive;
13
+ * this component exists so existing consumers convert without a code change.
14
+ */
6
15
  export function TabSelector({
7
16
  tabs,
8
17
  activeTab,
@@ -10,60 +19,69 @@ export function TabSelector({
10
19
  }) {
11
20
  return /*#__PURE__*/_jsx(View, {
12
21
  style: styles.container,
13
- children: tabs.map(tab => /*#__PURE__*/_jsx(TouchableOpacity, {
14
- "sentry-label": "ignore user interaction",
15
- accessibilityLabel: tab.label,
16
- accessibilityHint: `View ${tab.label.toLowerCase()}`,
17
- onPress: () => onTabChange(tab.key),
18
- style: [styles.tabButton, activeTab === tab.key ? styles.tabButtonActive : styles.tabButtonInactive],
19
- children: /*#__PURE__*/_jsx(Text, {
20
- style: [styles.tabButtonText, activeTab === tab.key ? styles.tabButtonTextActive : styles.tabButtonTextInactive],
21
- children: tab.label
22
- })
23
- }, tab.key))
22
+ children: tabs.map(tab => {
23
+ const active = activeTab === tab.key;
24
+ return /*#__PURE__*/_jsxs(TouchableOpacity, {
25
+ "sentry-label": "ignore user interaction",
26
+ accessibilityRole: "tab",
27
+ accessibilityState: {
28
+ selected: active
29
+ },
30
+ accessibilityLabel: tab.label,
31
+ accessibilityHint: `View ${tab.label.toLowerCase()}`,
32
+ onPress: () => onTabChange(tab.key),
33
+ style: [styles.tabButton, active && styles.tabButtonActive],
34
+ children: [/*#__PURE__*/_jsx(Text, {
35
+ style: [styles.tabButtonText, active && styles.tabButtonTextActive],
36
+ children: tab.label
37
+ }), active ? /*#__PURE__*/_jsx(View, {
38
+ style: styles.underline
39
+ }) : null]
40
+ }, tab.key);
41
+ })
24
42
  });
25
43
  }
26
44
  const styles = StyleSheet.create({
27
45
  container: {
28
46
  flexDirection: "row",
29
- backgroundColor: buoyColors.hover,
30
- borderRadius: 6,
31
- padding: 2,
47
+ backgroundColor: night.color.bg,
48
+ borderRadius: night.radius.row,
32
49
  borderWidth: 1,
33
- borderColor: buoyColors.border,
34
- justifyContent: "space-evenly",
35
- height: 28
50
+ borderColor: night.color.border,
51
+ padding: 3
36
52
  },
37
53
  tabButton: {
38
- paddingHorizontal: 8,
39
- paddingVertical: 3,
40
- borderRadius: 4,
54
+ flex: 1,
55
+ paddingVertical: 5,
41
56
  alignItems: "center",
42
57
  justifyContent: "center",
43
- flex: 1,
44
- marginHorizontal: 1
58
+ borderRadius: night.radius.segment
45
59
  },
46
- /**
47
- * The selected tab is marked with an accent ring.
48
- */
49
60
  tabButtonActive: {
50
- backgroundColor: buoyColors.primary + "20",
51
- borderWidth: 1,
52
- borderColor: buoyColors.primary
53
- },
54
- tabButtonInactive: {
55
- backgroundColor: "transparent"
61
+ backgroundColor: night.color.surfaceElevated
56
62
  },
57
63
  tabButtonText: {
58
64
  fontSize: 12,
59
- fontWeight: "600",
60
- letterSpacing: 0.5,
61
- textTransform: "uppercase"
65
+ fontWeight: "500",
66
+ color: night.color.textSecondary
62
67
  },
63
68
  tabButtonTextActive: {
64
- color: buoyColors.primary
69
+ fontWeight: "600",
70
+ color: night.color.text
65
71
  },
66
- tabButtonTextInactive: {
67
- color: buoyColors.textMuted
72
+ underline: {
73
+ position: "absolute",
74
+ bottom: 1.5,
75
+ width: 20,
76
+ height: 2,
77
+ borderRadius: 1,
78
+ backgroundColor: night.color.accent,
79
+ shadowColor: night.color.accent,
80
+ shadowOffset: {
81
+ width: 0,
82
+ height: 0
83
+ },
84
+ shadowOpacity: 0.6,
85
+ shadowRadius: 6
68
86
  }
69
87
  });
@@ -3,6 +3,7 @@
3
3
  import { View, Text, StyleSheet } from "react-native";
4
4
  import { CheckCircle, XCircle } from "../../icons/index.js";
5
5
  import { buoyColors } from "../gameUI/constants/gameUIColors.js";
6
+ import { night } from "../night/nightTheme.js";
6
7
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
7
8
  export function ValueTypeBadge({
8
9
  type,
@@ -71,12 +72,12 @@ export function ValueTypeBadge({
71
72
  return buoyColors.primary;
72
73
  case "null":
73
74
  case "undefined":
74
- return buoyColors.textMuted;
75
+ return night.color.textTertiary;
75
76
  case "object":
76
77
  case "array":
77
- return buoyColors.textSecondary;
78
+ return night.color.textSecondary;
78
79
  default:
79
- return buoyColors.textMuted;
80
+ return night.color.textTertiary;
80
81
  }
81
82
  };
82
83
  return /*#__PURE__*/_jsx(View, {
@@ -131,12 +132,12 @@ const styles = StyleSheet.create({
131
132
  backgroundColor: buoyColors.primary + "1A"
132
133
  },
133
134
  secondaryBadge: {
134
- backgroundColor: buoyColors.textSecondary + "1A"
135
+ backgroundColor: night.color.textSecondary + "1A"
135
136
  },
136
137
  mutedBadge: {
137
- backgroundColor: buoyColors.textMuted + "1A"
138
+ backgroundColor: night.color.textTertiary + "1A"
138
139
  },
139
140
  defaultBadge: {
140
- backgroundColor: buoyColors.textMuted + "1A"
141
+ backgroundColor: night.color.textTertiary + "1A"
141
142
  }
142
143
  });
@@ -4,6 +4,7 @@ import { useState, useRef, useCallback, useEffect } from "react";
4
4
  import { View, TouchableOpacity, TouchableWithoutFeedback, StyleSheet, Animated, Modal, Platform } from "react-native";
5
5
  import { X, Minus, DockBottom, FloatWindow } from "../../icons/index.js";
6
6
  import { buoyColors } from "../gameUI/constants/gameUIColors.js";
7
+ import { night } from "../night/nightTheme.js";
7
8
 
8
9
  // ============================================================================
9
10
  // Global expandable setting — controlled via setExpandableWindowControls()
@@ -68,7 +69,8 @@ export function WindowControls({
68
69
  onClose,
69
70
  onMinimize,
70
71
  onToggleMode,
71
- mode
72
+ mode,
73
+ variant = "night"
72
74
  }) {
73
75
  // Show action-based icon: what will happen when clicked
74
76
  const ToggleModeIcon = mode === "floating" ? DockBottom : FloatWindow;
@@ -121,15 +123,18 @@ export function WindowControls({
121
123
  onClose: onClose,
122
124
  onMinimize: onMinimize,
123
125
  onToggleMode: onToggleMode,
124
- mode: mode
126
+ mode: mode,
127
+ variant: variant
125
128
  });
126
129
  }
127
130
  function ExpandableWindowControls({
128
131
  onClose,
129
132
  onMinimize,
130
133
  onToggleMode,
131
- mode
134
+ mode,
135
+ variant = "night"
132
136
  }) {
137
+ const isNight = variant === "night";
133
138
  const [expanded, setExpanded] = useState(false);
134
139
  const [triggerLayout, setTriggerLayout] = useState(null);
135
140
  const expandAnim = useRef(new Animated.Value(0)).current;
@@ -263,38 +268,38 @@ function ExpandableWindowControls({
263
268
  }],
264
269
  children: /*#__PURE__*/_jsx(TouchableWithoutFeedback, {
265
270
  children: /*#__PURE__*/_jsxs(View, {
266
- style: styles.expandedContainer,
271
+ style: [styles.expandedContainer, isNight && styles.nightExpandedContainer],
267
272
  children: [onMinimize && /*#__PURE__*/_jsx(TouchableOpacity, {
268
273
  onPress: () => handleAction(onMinimize),
269
- style: [styles.expandedButton, styles.minimizeButtonExpanded],
274
+ style: [styles.expandedButton, isNight ? styles.nightMinimizeButton : styles.minimizeButtonExpanded],
270
275
  activeOpacity: 0.7,
271
276
  accessibilityLabel: "Minimize modal",
272
277
  accessibilityRole: "button",
273
278
  children: /*#__PURE__*/_jsx(Minus, {
274
279
  size: EXPANDED_ICON_SIZE,
275
- color: "#7A5A00",
280
+ color: isNight ? night.color.warning : "#7A5A00",
276
281
  strokeWidth: 2
277
282
  })
278
283
  }), onToggleMode && /*#__PURE__*/_jsx(TouchableOpacity, {
279
284
  onPress: () => handleAction(onToggleMode),
280
- style: [styles.expandedButton, styles.expandButtonExpanded],
285
+ style: [styles.expandedButton, isNight ? styles.nightToggleButton : styles.expandButtonExpanded],
281
286
  activeOpacity: 0.7,
282
287
  accessibilityLabel: toggleModeLabel,
283
288
  accessibilityRole: "button",
284
289
  children: /*#__PURE__*/_jsx(ToggleModeIcon, {
285
290
  size: EXPANDED_ICON_SIZE,
286
- color: "#004A1A",
291
+ color: isNight ? night.color.accent : "#004A1A",
287
292
  strokeWidth: 2
288
293
  })
289
294
  }), /*#__PURE__*/_jsx(TouchableOpacity, {
290
295
  onPress: () => handleAction(onClose),
291
- style: [styles.expandedButton, styles.closeButtonExpanded],
296
+ style: [styles.expandedButton, isNight ? styles.nightCloseButton : styles.closeButtonExpanded],
292
297
  activeOpacity: 0.7,
293
298
  accessibilityLabel: "Close modal",
294
299
  accessibilityRole: "button",
295
300
  children: /*#__PURE__*/_jsx(X, {
296
301
  size: EXPANDED_ICON_SIZE,
297
- color: "#4A0000",
302
+ color: isNight ? night.color.danger : "#4A0000",
298
303
  strokeWidth: 2
299
304
  })
300
305
  })]
@@ -377,5 +382,27 @@ const styles = StyleSheet.create({
377
382
  },
378
383
  expandButtonExpanded: {
379
384
  backgroundColor: COLORS.toggleMode
385
+ },
386
+ // ── Night variant (Everlights language — see ui/night/nightTheme.ts):
387
+ // near-black plate, hairline border, soft-tinted circles with toned icons
388
+ // instead of the solid macOS traffic lights.
389
+ nightExpandedContainer: {
390
+ backgroundColor: night.color.surface,
391
+ borderColor: night.color.border
392
+ },
393
+ nightMinimizeButton: {
394
+ backgroundColor: night.color.warningSoft,
395
+ borderWidth: 1,
396
+ borderColor: night.color.warning + "59"
397
+ },
398
+ nightToggleButton: {
399
+ backgroundColor: night.color.accentSoft,
400
+ borderWidth: 1,
401
+ borderColor: night.color.accentBorderStrong
402
+ },
403
+ nightCloseButton: {
404
+ backgroundColor: night.color.dangerSoft,
405
+ borderWidth: 1,
406
+ borderColor: night.color.danger + "59"
380
407
  }
381
408
  });
@@ -174,6 +174,14 @@ export const buoyColors = {
174
174
  // Backgrounds (dark to light)
175
175
  base: "#121212",
176
176
  card: "#1A1A1A",
177
+ /**
178
+ * Card fill for surfaces that sit over a ToolBackground: translucent so the
179
+ * field reads through, but calibrated against the BRIGHTEST scene in the
180
+ * catalogue (Live Sky's noon clouds/sun bloom, ~215 luminance) so a card's
181
+ * backing stays ≤ ~45 luminance and text never washes out. Over the "off"
182
+ * preset it is visually indistinguishable from `card`.
183
+ */
184
+ cardScrim: "rgba(10,13,20,0.9)",
177
185
  hover: "#242424",
178
186
  input: "#2A2A2A",
179
187
  // Borders