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