@mindlogic-ai/logician-ui 3.0.0 → 3.1.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (299) hide show
  1. package/dist/components/Avatar/Avatar.js +1 -1
  2. package/dist/components/Avatar/Avatar.js.map +1 -1
  3. package/dist/components/Avatar/Avatar.mjs +1 -1
  4. package/dist/components/Avatar/Avatar.mjs.map +1 -1
  5. package/dist/components/Badge/Badge.styles.d.ts.map +1 -1
  6. package/dist/components/Badge/Badge.styles.js +5 -3
  7. package/dist/components/Badge/Badge.styles.js.map +1 -1
  8. package/dist/components/Badge/Badge.styles.mjs +5 -3
  9. package/dist/components/Badge/Badge.styles.mjs.map +1 -1
  10. package/dist/components/Button/Button.styles.d.ts.map +1 -1
  11. package/dist/components/Button/Button.styles.js +39 -33
  12. package/dist/components/Button/Button.styles.js.map +1 -1
  13. package/dist/components/Button/Button.styles.mjs +39 -33
  14. package/dist/components/Button/Button.styles.mjs.map +1 -1
  15. package/dist/components/Card/Card.js +1 -1
  16. package/dist/components/Card/Card.js.map +1 -1
  17. package/dist/components/Card/Card.mjs +1 -1
  18. package/dist/components/Card/Card.mjs.map +1 -1
  19. package/dist/components/Checkbox/CheckboxControl.d.ts.map +1 -1
  20. package/dist/components/Checkbox/CheckboxControl.js +9 -3
  21. package/dist/components/Checkbox/CheckboxControl.js.map +1 -1
  22. package/dist/components/Checkbox/CheckboxControl.mjs +9 -3
  23. package/dist/components/Checkbox/CheckboxControl.mjs.map +1 -1
  24. package/dist/components/Chip/Chip.styles.d.ts.map +1 -1
  25. package/dist/components/Chip/Chip.styles.js +14 -11
  26. package/dist/components/Chip/Chip.styles.js.map +1 -1
  27. package/dist/components/Chip/Chip.styles.mjs +14 -11
  28. package/dist/components/Chip/Chip.styles.mjs.map +1 -1
  29. package/dist/components/Code/Code.js +4 -4
  30. package/dist/components/Code/Code.js.map +1 -1
  31. package/dist/components/Code/Code.mjs +4 -4
  32. package/dist/components/Code/Code.mjs.map +1 -1
  33. package/dist/components/CodeTabs/CopyButton.js +1 -1
  34. package/dist/components/CodeTabs/CopyButton.mjs +1 -1
  35. package/dist/components/Collapsible/CollapsibleRoot.js +1 -1
  36. package/dist/components/Collapsible/CollapsibleRoot.js.map +1 -1
  37. package/dist/components/Collapsible/CollapsibleRoot.mjs +1 -1
  38. package/dist/components/Collapsible/CollapsibleRoot.mjs.map +1 -1
  39. package/dist/components/Collapsible/CollapsibleTrigger.js +1 -1
  40. package/dist/components/Collapsible/CollapsibleTrigger.js.map +1 -1
  41. package/dist/components/Collapsible/CollapsibleTrigger.mjs +1 -1
  42. package/dist/components/Collapsible/CollapsibleTrigger.mjs.map +1 -1
  43. package/dist/components/ColorMode/ColorModeProvider.d.ts +39 -0
  44. package/dist/components/ColorMode/ColorModeProvider.d.ts.map +1 -0
  45. package/dist/components/ColorMode/ColorModeProvider.js +39 -0
  46. package/dist/components/ColorMode/ColorModeProvider.js.map +1 -0
  47. package/dist/components/ColorMode/ColorModeProvider.mjs +37 -0
  48. package/dist/components/ColorMode/ColorModeProvider.mjs.map +1 -0
  49. package/dist/components/ColorMode/ColorModeToggle.d.ts +18 -0
  50. package/dist/components/ColorMode/ColorModeToggle.d.ts.map +1 -0
  51. package/dist/components/ColorMode/ColorModeToggle.js +34 -0
  52. package/dist/components/ColorMode/ColorModeToggle.js.map +1 -0
  53. package/dist/components/ColorMode/ColorModeToggle.mjs +32 -0
  54. package/dist/components/ColorMode/ColorModeToggle.mjs.map +1 -0
  55. package/dist/components/ColorMode/index.d.ts +7 -0
  56. package/dist/components/ColorMode/index.d.ts.map +1 -0
  57. package/dist/components/ColorMode/useColorMode.d.ts +41 -0
  58. package/dist/components/ColorMode/useColorMode.d.ts.map +1 -0
  59. package/dist/components/ColorMode/useColorMode.js +55 -0
  60. package/dist/components/ColorMode/useColorMode.js.map +1 -0
  61. package/dist/components/ColorMode/useColorMode.mjs +52 -0
  62. package/dist/components/ColorMode/useColorMode.mjs.map +1 -0
  63. package/dist/components/DatePicker/RangeDatePicker.d.ts.map +1 -1
  64. package/dist/components/DatePicker/RangeDatePicker.js +8 -5
  65. package/dist/components/DatePicker/RangeDatePicker.js.map +1 -1
  66. package/dist/components/DatePicker/RangeDatePicker.mjs +8 -5
  67. package/dist/components/DatePicker/RangeDatePicker.mjs.map +1 -1
  68. package/dist/components/DatePicker/SingleDatePicker.js +3 -3
  69. package/dist/components/DatePicker/SingleDatePicker.js.map +1 -1
  70. package/dist/components/DatePicker/SingleDatePicker.mjs +3 -3
  71. package/dist/components/DatePicker/SingleDatePicker.mjs.map +1 -1
  72. package/dist/components/ErrorFallback/ErrorFallback.js +1 -1
  73. package/dist/components/ErrorFallback/ErrorFallback.js.map +1 -1
  74. package/dist/components/ErrorFallback/ErrorFallback.mjs +1 -1
  75. package/dist/components/ErrorFallback/ErrorFallback.mjs.map +1 -1
  76. package/dist/components/FileInput/FileInput.js +1 -1
  77. package/dist/components/FileInput/FileInput.js.map +1 -1
  78. package/dist/components/FileInput/FileInput.mjs +1 -1
  79. package/dist/components/FileInput/FileInput.mjs.map +1 -1
  80. package/dist/components/FileItem/FileItem.js +2 -2
  81. package/dist/components/FileItem/FileItem.js.map +1 -1
  82. package/dist/components/FileItem/FileItem.mjs +2 -2
  83. package/dist/components/FileItem/FileItem.mjs.map +1 -1
  84. package/dist/components/FileList/FileList.js +3 -3
  85. package/dist/components/FileList/FileList.js.map +1 -1
  86. package/dist/components/FileList/FileList.mjs +3 -3
  87. package/dist/components/FileList/FileList.mjs.map +1 -1
  88. package/dist/components/FormLabel/FormLabel.js +1 -1
  89. package/dist/components/FormLabel/FormLabel.js.map +1 -1
  90. package/dist/components/FormLabel/FormLabel.mjs +1 -1
  91. package/dist/components/FormLabel/FormLabel.mjs.map +1 -1
  92. package/dist/components/IconButton/IconButton.styles.js +1 -1
  93. package/dist/components/IconButton/IconButton.styles.js.map +1 -1
  94. package/dist/components/IconButton/IconButton.styles.mjs +1 -1
  95. package/dist/components/IconButton/IconButton.styles.mjs.map +1 -1
  96. package/dist/components/Input/Input.d.ts.map +1 -1
  97. package/dist/components/Input/Input.js +6 -6
  98. package/dist/components/Input/Input.js.map +1 -1
  99. package/dist/components/Input/Input.mjs +6 -6
  100. package/dist/components/Input/Input.mjs.map +1 -1
  101. package/dist/components/LineGraph/LineGraph.d.ts.map +1 -1
  102. package/dist/components/LineGraph/LineGraph.js +9 -5
  103. package/dist/components/LineGraph/LineGraph.js.map +1 -1
  104. package/dist/components/LineGraph/LineGraph.mjs +9 -5
  105. package/dist/components/LineGraph/LineGraph.mjs.map +1 -1
  106. package/dist/components/Loaders/PageLoader.js +1 -1
  107. package/dist/components/Loaders/PageLoader.js.map +1 -1
  108. package/dist/components/Loaders/PageLoader.mjs +1 -1
  109. package/dist/components/Loaders/PageLoader.mjs.map +1 -1
  110. package/dist/components/Loaders/SectionLoader.js +1 -1
  111. package/dist/components/Loaders/SectionLoader.js.map +1 -1
  112. package/dist/components/Loaders/SectionLoader.mjs +1 -1
  113. package/dist/components/Loaders/SectionLoader.mjs.map +1 -1
  114. package/dist/components/LogicianProvider/LogicianProvider.d.ts +20 -0
  115. package/dist/components/LogicianProvider/LogicianProvider.d.ts.map +1 -1
  116. package/dist/components/LogicianProvider/LogicianProvider.js +9 -2
  117. package/dist/components/LogicianProvider/LogicianProvider.js.map +1 -1
  118. package/dist/components/LogicianProvider/LogicianProvider.mjs +9 -2
  119. package/dist/components/LogicianProvider/LogicianProvider.mjs.map +1 -1
  120. package/dist/components/MDXEditor/MDXEditor.d.ts.map +1 -1
  121. package/dist/components/MDXEditor/MDXEditor.js +8 -16
  122. package/dist/components/MDXEditor/MDXEditor.js.map +1 -1
  123. package/dist/components/MDXEditor/MDXEditor.mjs +8 -16
  124. package/dist/components/MDXEditor/MDXEditor.mjs.map +1 -1
  125. package/dist/components/Markdown/Markdown.module.css.js +1 -1
  126. package/dist/components/Markdown/Markdown.module.css.mjs +1 -1
  127. package/dist/components/MaxLengthIndicator/MaxLengthIndicator.js +1 -1
  128. package/dist/components/MaxLengthIndicator/MaxLengthIndicator.js.map +1 -1
  129. package/dist/components/MaxLengthIndicator/MaxLengthIndicator.mjs +1 -1
  130. package/dist/components/MaxLengthIndicator/MaxLengthIndicator.mjs.map +1 -1
  131. package/dist/components/Menu/MenuItem.d.ts.map +1 -1
  132. package/dist/components/Menu/MenuItem.js +7 -3
  133. package/dist/components/Menu/MenuItem.js.map +1 -1
  134. package/dist/components/Menu/MenuItem.mjs +7 -3
  135. package/dist/components/Menu/MenuItem.mjs.map +1 -1
  136. package/dist/components/Menu/MenuList.d.ts.map +1 -1
  137. package/dist/components/Menu/MenuList.js +7 -1
  138. package/dist/components/Menu/MenuList.js.map +1 -1
  139. package/dist/components/Menu/MenuList.mjs +7 -1
  140. package/dist/components/Menu/MenuList.mjs.map +1 -1
  141. package/dist/components/Modal/ModalFooter/ModalFooter.js +1 -1
  142. package/dist/components/Modal/ModalFooter/ModalFooter.js.map +1 -1
  143. package/dist/components/Modal/ModalFooter/ModalFooter.mjs +1 -1
  144. package/dist/components/Modal/ModalFooter/ModalFooter.mjs.map +1 -1
  145. package/dist/components/MonthPicker/MonthPicker.js +1 -1
  146. package/dist/components/MonthPicker/MonthPicker.mjs +1 -1
  147. package/dist/components/Popover/PopoverArrowTip.js +1 -1
  148. package/dist/components/Popover/PopoverArrowTip.js.map +1 -1
  149. package/dist/components/Popover/PopoverArrowTip.mjs +1 -1
  150. package/dist/components/Popover/PopoverArrowTip.mjs.map +1 -1
  151. package/dist/components/Popover/PopoverContent.js +1 -1
  152. package/dist/components/Popover/PopoverContent.js.map +1 -1
  153. package/dist/components/Popover/PopoverContent.mjs +1 -1
  154. package/dist/components/Popover/PopoverContent.mjs.map +1 -1
  155. package/dist/components/RadialProgress/RadialProgress.js +1 -1
  156. package/dist/components/RadialProgress/RadialProgress.js.map +1 -1
  157. package/dist/components/RadialProgress/RadialProgress.mjs +1 -1
  158. package/dist/components/RadialProgress/RadialProgress.mjs.map +1 -1
  159. package/dist/components/SeeMoreButton/SeeMoreButton.styles.js +2 -2
  160. package/dist/components/SeeMoreButton/SeeMoreButton.styles.js.map +1 -1
  161. package/dist/components/SeeMoreButton/SeeMoreButton.styles.mjs +2 -2
  162. package/dist/components/SeeMoreButton/SeeMoreButton.styles.mjs.map +1 -1
  163. package/dist/components/SegmentedControl/SegmentedControl.d.ts.map +1 -1
  164. package/dist/components/SegmentedControl/SegmentedControl.js +7 -3
  165. package/dist/components/SegmentedControl/SegmentedControl.js.map +1 -1
  166. package/dist/components/SegmentedControl/SegmentedControl.mjs +7 -3
  167. package/dist/components/SegmentedControl/SegmentedControl.mjs.map +1 -1
  168. package/dist/components/Select/Select.styles.d.ts +18 -4
  169. package/dist/components/Select/Select.styles.d.ts.map +1 -1
  170. package/dist/components/Select/Select.styles.js +11 -10
  171. package/dist/components/Select/Select.styles.js.map +1 -1
  172. package/dist/components/Select/Select.styles.mjs +11 -10
  173. package/dist/components/Select/Select.styles.mjs.map +1 -1
  174. package/dist/components/Slider/SliderThumb/SliderThumb.js +1 -1
  175. package/dist/components/Slider/SliderThumb/SliderThumb.js.map +1 -1
  176. package/dist/components/Slider/SliderThumb/SliderThumb.mjs +1 -1
  177. package/dist/components/Slider/SliderThumb/SliderThumb.mjs.map +1 -1
  178. package/dist/components/Table/Table.styles.js +1 -1
  179. package/dist/components/Table/Table.styles.js.map +1 -1
  180. package/dist/components/Table/Table.styles.mjs +1 -1
  181. package/dist/components/Table/Table.styles.mjs.map +1 -1
  182. package/dist/components/Table/TableContainer.js +1 -1
  183. package/dist/components/Table/TableContainer.js.map +1 -1
  184. package/dist/components/Table/TableContainer.mjs +1 -1
  185. package/dist/components/Table/TableContainer.mjs.map +1 -1
  186. package/dist/components/Table/Tbody.js +1 -1
  187. package/dist/components/Table/Tbody.js.map +1 -1
  188. package/dist/components/Table/Tbody.mjs +1 -1
  189. package/dist/components/Table/Tbody.mjs.map +1 -1
  190. package/dist/components/Table/Thead.js +1 -1
  191. package/dist/components/Table/Thead.mjs +1 -1
  192. package/dist/components/Tabs/Tab/Tab.js +1 -1
  193. package/dist/components/Tabs/Tab/Tab.mjs +1 -1
  194. package/dist/components/Tabs/TabList/TabList.js +1 -1
  195. package/dist/components/Tabs/TabList/TabList.js.map +1 -1
  196. package/dist/components/Tabs/TabList/TabList.mjs +1 -1
  197. package/dist/components/Tabs/TabList/TabList.mjs.map +1 -1
  198. package/dist/components/Tag/Tag.styles.d.ts.map +1 -1
  199. package/dist/components/Tag/Tag.styles.js +19 -16
  200. package/dist/components/Tag/Tag.styles.js.map +1 -1
  201. package/dist/components/Tag/Tag.styles.mjs +19 -16
  202. package/dist/components/Tag/Tag.styles.mjs.map +1 -1
  203. package/dist/components/Textarea/Textarea.d.ts.map +1 -1
  204. package/dist/components/Textarea/Textarea.js +7 -7
  205. package/dist/components/Textarea/Textarea.js.map +1 -1
  206. package/dist/components/Textarea/Textarea.mjs +7 -7
  207. package/dist/components/Textarea/Textarea.mjs.map +1 -1
  208. package/dist/components/Typography/H3.js +1 -1
  209. package/dist/components/Typography/H3.js.map +1 -1
  210. package/dist/components/Typography/H3.mjs +1 -1
  211. package/dist/components/Typography/H3.mjs.map +1 -1
  212. package/dist/components/Typography/Subtext.js +1 -1
  213. package/dist/components/Typography/Subtext.js.map +1 -1
  214. package/dist/components/Typography/Subtext.mjs +1 -1
  215. package/dist/components/Typography/Subtext.mjs.map +1 -1
  216. package/dist/components/Typography/Subtitle.js +1 -1
  217. package/dist/components/Typography/Subtitle.js.map +1 -1
  218. package/dist/components/Typography/Subtitle.mjs +1 -1
  219. package/dist/components/Typography/Subtitle.mjs.map +1 -1
  220. package/dist/components/Typography/Text.js +1 -1
  221. package/dist/components/Typography/Text.js.map +1 -1
  222. package/dist/components/Typography/Text.mjs +1 -1
  223. package/dist/components/Typography/Text.mjs.map +1 -1
  224. package/dist/index.d.ts +2 -0
  225. package/dist/index.d.ts.map +1 -1
  226. package/dist/index.js +7 -0
  227. package/dist/index.js.map +1 -1
  228. package/dist/index.mjs +3 -0
  229. package/dist/index.mjs.map +1 -1
  230. package/dist/theme/colors.d.ts +276 -40
  231. package/dist/theme/colors.d.ts.map +1 -1
  232. package/dist/theme/colors.js +197 -40
  233. package/dist/theme/colors.js.map +1 -1
  234. package/dist/theme/colors.mjs +197 -40
  235. package/dist/theme/colors.mjs.map +1 -1
  236. package/dist/theme/global.d.ts.map +1 -1
  237. package/dist/theme/global.js +11 -1
  238. package/dist/theme/global.js.map +1 -1
  239. package/dist/theme/global.mjs +11 -1
  240. package/dist/theme/global.mjs.map +1 -1
  241. package/package.json +2 -1
  242. package/src/components/Avatar/Avatar.tsx +1 -1
  243. package/src/components/Badge/Badge.styles.ts +5 -3
  244. package/src/components/Button/Button.styles.ts +39 -33
  245. package/src/components/Card/Card.tsx +3 -3
  246. package/src/components/Checkbox/CheckboxControl.tsx +8 -3
  247. package/src/components/Chip/Chip.styles.ts +14 -11
  248. package/src/components/Code/Code.tsx +5 -5
  249. package/src/components/CodeTabs/CopyButton.tsx +1 -1
  250. package/src/components/Collapsible/CollapsibleRoot.tsx +1 -1
  251. package/src/components/Collapsible/CollapsibleTrigger.tsx +1 -1
  252. package/src/components/ColorMode/ColorModeProvider.tsx +63 -0
  253. package/src/components/ColorMode/ColorModeToggle.tsx +45 -0
  254. package/src/components/ColorMode/index.ts +6 -0
  255. package/src/components/ColorMode/useColorMode.ts +74 -0
  256. package/src/components/DatePicker/RangeDatePicker.tsx +8 -5
  257. package/src/components/DatePicker/SingleDatePicker.tsx +3 -3
  258. package/src/components/ErrorFallback/ErrorFallback.tsx +3 -3
  259. package/src/components/FileInput/FileInput.tsx +1 -1
  260. package/src/components/FileItem/FileItem.tsx +5 -5
  261. package/src/components/FileList/FileList.tsx +4 -4
  262. package/src/components/FormLabel/FormLabel.tsx +1 -1
  263. package/src/components/IconButton/IconButton.styles.ts +1 -1
  264. package/src/components/Input/Input.tsx +10 -7
  265. package/src/components/LineGraph/LineGraph.tsx +8 -5
  266. package/src/components/Loaders/PageLoader.tsx +1 -1
  267. package/src/components/Loaders/SectionLoader.tsx +1 -1
  268. package/src/components/LogicianProvider/LogicianProvider.tsx +41 -1
  269. package/src/components/MDXEditor/MDXEditor.tsx +8 -18
  270. package/src/components/Markdown/Markdown.module.css +1 -1
  271. package/src/components/MaxLengthIndicator/MaxLengthIndicator.tsx +1 -1
  272. package/src/components/Menu/MenuItem.tsx +6 -3
  273. package/src/components/Menu/MenuList.tsx +7 -2
  274. package/src/components/Modal/ModalFooter/ModalFooter.tsx +1 -1
  275. package/src/components/MonthPicker/MonthPicker.tsx +1 -1
  276. package/src/components/Popover/PopoverArrowTip.tsx +1 -1
  277. package/src/components/Popover/PopoverContent.tsx +1 -1
  278. package/src/components/RadialProgress/RadialProgress.stories.tsx +1 -1
  279. package/src/components/RadialProgress/RadialProgress.tsx +2 -2
  280. package/src/components/SeeMoreButton/SeeMoreButton.styles.ts +2 -2
  281. package/src/components/SegmentedControl/SegmentedControl.tsx +6 -3
  282. package/src/components/Select/Select.styles.ts +11 -10
  283. package/src/components/Slider/SliderThumb/SliderThumb.tsx +1 -1
  284. package/src/components/Table/Table.styles.ts +1 -1
  285. package/src/components/Table/TableContainer.tsx +1 -1
  286. package/src/components/Table/Tbody.tsx +1 -1
  287. package/src/components/Table/Thead.tsx +1 -1
  288. package/src/components/Tabs/Tab/Tab.tsx +1 -1
  289. package/src/components/Tabs/TabList/TabList.tsx +1 -1
  290. package/src/components/Tag/Tag.styles.ts +19 -16
  291. package/src/components/Textarea/Textarea.tsx +10 -7
  292. package/src/components/Typography/H3.tsx +1 -1
  293. package/src/components/Typography/Subtext.tsx +1 -1
  294. package/src/components/Typography/Subtitle.tsx +1 -1
  295. package/src/components/Typography/Text.tsx +1 -1
  296. package/src/index.ts +2 -0
  297. package/src/theme/Palette.stories.tsx +114 -88
  298. package/src/theme/colors.ts +225 -40
  299. package/src/theme/global.ts +12 -1
@@ -0,0 +1,74 @@
1
+ 'use client';
2
+ import { useCallback } from 'react';
3
+ import { useTheme } from 'next-themes';
4
+
5
+ import type { ColorMode } from './ColorModeProvider';
6
+
7
+ export interface UseColorModeReturn {
8
+ /**
9
+ * The resolved color mode actually being rendered: `'light'` or `'dark'`.
10
+ * If a forced mode is active (e.g. factchat's short-term force-light), this
11
+ * reflects the forced value.
12
+ */
13
+ colorMode: ColorMode;
14
+ /** The raw user preference, including `'system'`. */
15
+ colorModePreference: string | undefined;
16
+ /** Set the preference. Accepts `'light' | 'dark' | 'system'`. */
17
+ setColorMode: (mode: ColorMode | 'system') => void;
18
+ /** Toggle between light and dark based on the currently resolved mode. */
19
+ toggleColorMode: () => void;
20
+ }
21
+
22
+ /**
23
+ * Typed color-mode accessor backed by `next-themes`.
24
+ *
25
+ * Must be called under a {@link ColorModeProvider} (mounted by
26
+ * {@link LogicianProvider}).
27
+ *
28
+ * @example
29
+ * ```tsx
30
+ * const { colorMode, toggleColorMode } = useColorMode();
31
+ * ```
32
+ */
33
+ export function useColorMode(): UseColorModeReturn {
34
+ const { theme, resolvedTheme, forcedTheme, setTheme } = useTheme();
35
+
36
+ // `colorMode` reflects what's actually rendered (a forced mode wins).
37
+ const colorMode = (forcedTheme ?? resolvedTheme ?? 'light') as ColorMode;
38
+
39
+ // Toggle/preference operate on the *user* preference, not the forced
40
+ // override — so a staged `forcedColorMode` rollout doesn't invert the stored
41
+ // value, and the preference is preserved for when the force is removed.
42
+ const resolvedPreference = (resolvedTheme ?? 'light') as ColorMode;
43
+
44
+ const toggleColorMode = useCallback(() => {
45
+ setTheme(resolvedPreference === 'dark' ? 'light' : 'dark');
46
+ }, [resolvedPreference, setTheme]);
47
+
48
+ return {
49
+ colorMode,
50
+ colorModePreference: theme,
51
+ setColorMode: setTheme,
52
+ toggleColorMode,
53
+ };
54
+ }
55
+
56
+ /**
57
+ * Returns one of two values based on the resolved color mode — the Logician
58
+ * equivalent of Chakra v2's `useColorModeValue`.
59
+ *
60
+ * Prefer semantic tokens (`color="fg.default"`) over this hook; reach for it
61
+ * only when a value can't be expressed as a token (e.g. a chart color array).
62
+ *
63
+ * @example
64
+ * ```tsx
65
+ * const stroke = useColorModeValue('#1751D0', '#4A79DC');
66
+ * ```
67
+ */
68
+ export function useColorModeValue<TLight, TDark>(
69
+ light: TLight,
70
+ dark: TDark
71
+ ): TLight | TDark {
72
+ const { colorMode } = useColorMode();
73
+ return colorMode === 'dark' ? dark : light;
74
+ }
@@ -39,7 +39,7 @@ export const RangeDatePicker = ({
39
39
  propsConfigs={{
40
40
  triggerBtnProps: {
41
41
  fontWeight: 'regular',
42
- color: 'gray.1500',
42
+ color: 'fg.default',
43
43
  fontSize: 'md',
44
44
  ...propsConfigs?.triggerBtnProps,
45
45
  },
@@ -58,7 +58,10 @@ export const RangeDatePicker = ({
58
58
  boxShadow: 'lg',
59
59
  border: 'none',
60
60
  borderWidth: 0,
61
- bg: 'gray.0',
61
+ // Flip the popover surface with the mode; gray.0 stayed white and
62
+ // framed the (already dark) calendars in dark mode. bg.surface keeps
63
+ // the same light value and resolves to gray.1400 under .dark.
64
+ bg: 'bg.surface',
62
65
  ...propsConfigs?.popoverCompProps?.popoverContentProps,
63
66
  },
64
67
  ...propsConfigs?.popoverCompProps,
@@ -79,7 +82,7 @@ export const RangeDatePicker = ({
79
82
  borderWidth: '1px',
80
83
  borderColor: 'primary.extralight',
81
84
  borderRadius: 16,
82
- bg: 'white',
85
+ bg: 'bg.surface',
83
86
  ...propsConfigs?.calendarPanelProps?.contentProps,
84
87
  },
85
88
  bodyProps: {
@@ -95,7 +98,7 @@ export const RangeDatePicker = ({
95
98
  },
96
99
  weekdayLabelProps: {
97
100
  mb: 2,
98
- color: 'gray.1000',
101
+ color: 'fg.muted',
99
102
  fontSize: 'sm',
100
103
  fontWeight: 'regular',
101
104
  ...propsConfigs?.weekdayLabelProps,
@@ -104,7 +107,7 @@ export const RangeDatePicker = ({
104
107
  defaultBtnProps: {
105
108
  width: 34,
106
109
  height: 34,
107
- color: 'gray.1500',
110
+ color: 'fg.default',
108
111
  fontWeight: 'regular',
109
112
  _hover: {
110
113
  background: 'primary.extralight',
@@ -40,7 +40,7 @@ export const SingleDatePicker = ({
40
40
  triggerBtnProps: {
41
41
  justifyContent: 'left',
42
42
  fontWeight: 'regular',
43
- color: 'gray.1500',
43
+ color: 'fg.default',
44
44
  fontSize: 'md',
45
45
  ...propsConfigs?.triggerBtnProps,
46
46
  },
@@ -82,7 +82,7 @@ export const SingleDatePicker = ({
82
82
  },
83
83
  weekdayLabelProps: {
84
84
  mb: 2,
85
- color: 'gray.1000',
85
+ color: 'fg.muted',
86
86
  fontWeight: 'regular',
87
87
  ...propsConfigs?.weekdayLabelProps,
88
88
  },
@@ -90,7 +90,7 @@ export const SingleDatePicker = ({
90
90
  defaultBtnProps: {
91
91
  width: 34,
92
92
  height: 34,
93
- color: 'gray.1500',
93
+ color: 'fg.default',
94
94
  fontSize: 'sm',
95
95
  fontWeight: 'regular',
96
96
  _hover: {
@@ -67,7 +67,7 @@ User Agent: ${errorInfo.userAgent}`;
67
67
  p={12}
68
68
  textAlign="center"
69
69
  w="full"
70
- bgColor="white"
70
+ bgColor="bg.surface"
71
71
  boxShadow="2xl"
72
72
  >
73
73
  <VStack gap={6} align="center" w="full" mx="auto">
@@ -83,10 +83,10 @@ User Agent: ${errorInfo.userAgent}`;
83
83
 
84
84
  {/* Error Title */}
85
85
  <VStack gap={3} align="center" w="full">
86
- <H1 color="gray.1200" textStyle="h2" fontWeight="bold">
86
+ <H1 color="fg.default" textStyle="h2" fontWeight="bold">
87
87
  {translate('error_boundary_title')}
88
88
  </H1>
89
- <Subtitle color="gray.1000" textStyle="h5" maxW="md">
89
+ <Subtitle color="fg.muted" textStyle="h5" maxW="md">
90
90
  {translate('error_boundary_subtitle')}
91
91
  </Subtitle>
92
92
  </VStack>
@@ -36,7 +36,7 @@ export const FileInput = forwardRef<HTMLInputElement, FileInputProps>(
36
36
  align="center"
37
37
  justify="center"
38
38
  border="1px dashed"
39
- borderColor="gray.300"
39
+ borderColor="border.default"
40
40
  position="relative"
41
41
  overflow="hidden"
42
42
  borderRadius="md"
@@ -44,7 +44,7 @@ export const FileItem = ({
44
44
  justifyContent="space-between"
45
45
  alignItems="center"
46
46
  border="1px solid"
47
- borderColor="gray.200"
47
+ borderColor="border.subtle"
48
48
  w="100%"
49
49
  position="relative"
50
50
  _before={{
@@ -60,7 +60,7 @@ export const FileItem = ({
60
60
  >
61
61
  <Flex w="60%" alignItems="center" gap={2}>
62
62
  <Box minW={5}>
63
- <CiFileOn color={error ? errorColor : 'gray.800'} />
63
+ <CiFileOn color={error ? errorColor : 'fg.muted'} />
64
64
  </Box>
65
65
  <Text truncate color={error ? errorColor : undefined}>
66
66
  {fileName}
@@ -89,7 +89,7 @@ export const FileItem = ({
89
89
  colorPalette="neutral"
90
90
  variant="ghost"
91
91
  >
92
- <IoClose color="gray.600" boxSize="md" />
92
+ <IoClose color="fg.subtle" boxSize="md" />
93
93
  </IconButton>
94
94
  </Flex>
95
95
  )}
@@ -113,7 +113,7 @@ export const FileItem = ({
113
113
  colorPalette="neutral"
114
114
  variant="ghost"
115
115
  >
116
- <LuDownload color="gray.800" />
116
+ <LuDownload color="fg.muted" />
117
117
  </IconButton>
118
118
  </Tooltip>
119
119
  )}
@@ -134,7 +134,7 @@ export const FileItem = ({
134
134
  colorPalette="neutral"
135
135
  variant="ghost"
136
136
  >
137
- <FaRegTrashAlt boxSize="sm" color="gray.800" />
137
+ <FaRegTrashAlt boxSize="sm" color="fg.muted" />
138
138
  </IconButton>
139
139
  </Tooltip>
140
140
  )}
@@ -48,7 +48,7 @@ export const FileList = ({
48
48
  <Box
49
49
  w="100%"
50
50
  border="1px solid"
51
- borderColor="gray.200"
51
+ borderColor="border.subtle"
52
52
  borderRadius="md"
53
53
  overflow="hidden"
54
54
  >
@@ -67,7 +67,7 @@ export const FileList = ({
67
67
  }
68
68
  border={0}
69
69
  borderBottom="1px solid"
70
- borderBottomColor="gray.50"
70
+ borderBottomColor="border.subtle"
71
71
  progress={file.progress}
72
72
  error={file.error}
73
73
  fileSize={file.size}
@@ -91,10 +91,10 @@ export const FileList = ({
91
91
  cursor: 'pointer',
92
92
  }}
93
93
  >
94
- <Subtitle color="gray.600">
94
+ <Subtitle color="fg.subtle">
95
95
  {translate('see_more')} ({visibleCount}/{files.length})
96
96
  </Subtitle>
97
- <IoChevronDownOutline color="gray.600" />
97
+ <IoChevronDownOutline color="fg.subtle" />
98
98
  </Button>
99
99
  )}
100
100
  </Box>
@@ -1,7 +1,7 @@
1
1
  import { Box, Field } from '@chakra-ui/react';
2
2
 
3
3
  export const FormLabel = (props: Field.LabelProps) => (
4
- <Box color="gray.1000">
4
+ <Box color="fg.muted">
5
5
  <Field.Label
6
6
  {...props}
7
7
  style={{
@@ -27,7 +27,7 @@ export const iconButtonColorPaletteStyles: Record<
27
27
  ...buttonColorPaletteStyles.neutral,
28
28
  ghost: {
29
29
  ...buttonColorPaletteStyles.neutral.ghost,
30
- color: 'gray.600',
30
+ color: 'fg.subtle',
31
31
  },
32
32
  },
33
33
  };
@@ -318,8 +318,11 @@ export const Input = forwardRef(
318
318
  disabled={disabled}
319
319
  readOnly={readOnly}
320
320
  data-invalid={invalid || undefined}
321
- bg="white"
322
- borderColor={invalid ? 'danger.main' : 'gray.400'}
321
+ bg="bg.surface"
322
+ color="fg.default"
323
+ borderColor={
324
+ invalid ? 'danger.main' : { base: 'gray.400', _dark: 'gray.1100' }
325
+ }
323
326
  _hover={{
324
327
  borderColor: invalid ? 'danger.main' : 'primary.lighter',
325
328
  ..._hover,
@@ -340,15 +343,15 @@ export const Input = forwardRef(
340
343
  _readOnly={{
341
344
  opacity: 1,
342
345
  cursor: 'not-allowed',
343
- bg: 'gray.50',
344
- color: 'gray.600',
345
- borderColor: 'gray.200',
346
+ bg: 'bg.subtle',
347
+ color: 'fg.muted',
348
+ borderColor: 'border.subtle',
346
349
  }}
347
350
  _disabled={{
348
351
  opacity: 1,
349
352
  cursor: 'not-allowed',
350
- bg: 'gray.50',
351
- color: 'gray.1000',
353
+ bg: 'bg.subtle',
354
+ color: { base: 'gray.1000', _dark: 'gray.400' },
352
355
  fontWeight: 'semibold',
353
356
  }}
354
357
  {...rest}
@@ -35,15 +35,18 @@ export const LineGraph = <T extends DatumBase>({
35
35
  // No dashes
36
36
  strokeDasharray=""
37
37
  vertical={false}
38
- stroke="gray.400"
38
+ // recharts passes this straight to SVG and never resolves Chakra
39
+ // tokens, so use the CSS var directly — it flips with the .dark class.
40
+ stroke="var(--chakra-colors-border-default)"
39
41
  />
40
42
  <XAxis
41
43
  dataKey="name"
42
44
  // Color of line
43
45
  stroke="transparent"
44
- // Props of text
46
+ // Props of text. CSS var (not a Chakra token) so the axis labels
47
+ // flip with the mode — recharts won't resolve 'gray.1200' itself.
45
48
  tick={{
46
- fill: 'gray.1200',
49
+ fill: 'var(--chakra-colors-fg-muted)',
47
50
  fontSize: `${useToken('fontSizes', 'sm')}`,
48
51
  }}
49
52
  tickMargin={8}
@@ -51,9 +54,9 @@ export const LineGraph = <T extends DatumBase>({
51
54
  <YAxis
52
55
  // Color of line
53
56
  stroke="transparent"
54
- // Props of text
57
+ // CSS var (see XAxis) so the labels flip with the mode.
55
58
  tick={{
56
- fill: 'gray.1200',
59
+ fill: 'var(--chakra-colors-fg-muted)',
57
60
  fontSize: `${useToken('fontSizes', 'sm')}`,
58
61
  }}
59
62
  tickMargin={0}
@@ -16,7 +16,7 @@ export const PageLoader = ({
16
16
  justify="center"
17
17
  opacity={isLoading ? 0.5 : 0}
18
18
  transition="0.3s opacity ease"
19
- bg="white"
19
+ bg="bg.canvas"
20
20
  zIndex={9999}
21
21
  {...rest}
22
22
  >
@@ -15,7 +15,7 @@ export const SectionLoader = ({
15
15
  left={0}
16
16
  align="center"
17
17
  justify="center"
18
- bg="white"
18
+ bg="bg.canvas"
19
19
  transition="0.3 opacity ease"
20
20
  zIndex={9999}
21
21
  {...rest}
@@ -3,6 +3,8 @@ import React, { useEffect, useMemo } from 'react';
3
3
  import type { SystemConfig } from '@chakra-ui/react';
4
4
  import { ChakraProvider, createSystem, defaultConfig } from '@chakra-ui/react';
5
5
 
6
+ import type { ColorMode } from '@/components/ColorMode';
7
+ import { ColorModeProvider } from '@/components/ColorMode';
6
8
  import type { SupportedLanguage } from '@/components/MonthPicker/constants';
7
9
  import { LanguageContext } from '@/hooks/useLanguage';
8
10
 
@@ -85,6 +87,28 @@ export interface LogicianProviderProps {
85
87
  * @default true
86
88
  */
87
89
  loadFonts?: boolean;
90
+
91
+ /**
92
+ * Initial color mode preference when none is stored.
93
+ * @default 'system'
94
+ */
95
+ defaultColorMode?: ColorMode | 'system';
96
+
97
+ /**
98
+ * Pin the app to a single color mode, ignoring stored/system preference.
99
+ * Use for a staged rollout (e.g. force light while a product migrates its
100
+ * components). Leave undefined for normal light/dark/system behavior.
101
+ */
102
+ forcedColorMode?: ColorMode;
103
+
104
+ /**
105
+ * Set to `false` to skip mounting the color-mode provider — e.g. if the host
106
+ * app already mounts its own. Disabling it means `useColorMode`,
107
+ * `useColorModeValue`, and `ColorModeToggle` won't work unless a
108
+ * `ColorModeProvider` is supplied elsewhere.
109
+ * @default true
110
+ */
111
+ enableColorMode?: boolean;
88
112
  children?: React.ReactNode;
89
113
  }
90
114
 
@@ -111,6 +135,9 @@ export const LogicianProvider: React.FC<LogicianProviderProps> = ({
111
135
  config,
112
136
  language = 'en',
113
137
  loadFonts = true,
138
+ defaultColorMode = 'system',
139
+ forcedColorMode,
140
+ enableColorMode = true,
114
141
  children,
115
142
  }) => {
116
143
  useEffect(() => {
@@ -129,11 +156,24 @@ export const LogicianProvider: React.FC<LogicianProviderProps> = ({
129
156
 
130
157
  const languageValue = useMemo(() => ({ language }), [language]);
131
158
 
132
- return (
159
+ const tree = (
133
160
  <LanguageContext.Provider value={languageValue}>
134
161
  <ChakraProvider value={system}>{children}</ChakraProvider>
135
162
  </LanguageContext.Provider>
136
163
  );
164
+
165
+ if (!enableColorMode) {
166
+ return tree;
167
+ }
168
+
169
+ return (
170
+ <ColorModeProvider
171
+ defaultTheme={defaultColorMode}
172
+ forcedTheme={forcedColorMode}
173
+ >
174
+ {tree}
175
+ </ColorModeProvider>
176
+ );
137
177
  };
138
178
 
139
179
  LogicianProvider.displayName = 'LogicianProvider';
@@ -39,16 +39,6 @@ export const MDXEditor = forwardRef<
39
39
  const [error, setError] = useState<string | null>(null);
40
40
 
41
41
  // Resolve theme tokens to actual values
42
- const [gray50, gray100, gray800, primaryLight, primaryLighter, primaryMain] =
43
- useToken('colors', [
44
- 'gray.50',
45
- 'gray.100',
46
- 'gray.800',
47
- 'primary.light',
48
- 'primary.lighter',
49
- 'primary.main',
50
- ]);
51
-
52
42
  const [space1, space2, space4] = useToken('spacing', ['1', '2', '4']);
53
43
  const [radiusSm] = useToken('radii', ['sm']);
54
44
 
@@ -99,7 +89,7 @@ export const MDXEditor = forwardRef<
99
89
  width: '100%',
100
90
  minHeight: '300px',
101
91
  height: '100%',
102
- background: 'white',
92
+ background: 'var(--chakra-colors-bg-surface)',
103
93
  display: 'flex',
104
94
  flexDirection: 'column',
105
95
  },
@@ -108,7 +98,7 @@ export const MDXEditor = forwardRef<
108
98
  gap: space2,
109
99
  padding: space2,
110
100
  borderBottomWidth: '1px',
111
- background: gray50,
101
+ background: 'var(--chakra-colors-bg-subtle)',
112
102
  flexShrink: 0,
113
103
  cursor: 'default',
114
104
  },
@@ -135,7 +125,7 @@ export const MDXEditor = forwardRef<
135
125
  },
136
126
  '& .content-editable': {
137
127
  padding: space4,
138
- color: 'black',
128
+ color: 'var(--chakra-colors-fg-default)',
139
129
  display: 'flex',
140
130
  flexDirection: 'column',
141
131
  gap: radiusSm,
@@ -221,22 +211,22 @@ export const MDXEditor = forwardRef<
221
211
 
222
212
  '& blockquote': {
223
213
  borderLeftWidth: '4px',
224
- borderLeftColor: primaryLight,
225
- background: primaryLighter,
214
+ borderLeftColor: 'var(--chakra-colors-primary-light)',
215
+ background: 'var(--chakra-colors-primary-lighter)',
226
216
  paddingLeft: space4,
227
217
  paddingBlock: space2,
228
218
  marginBlock: space4,
229
- color: gray800,
219
+ color: 'var(--chakra-colors-fg-muted)',
230
220
  },
231
221
 
232
222
  '& a': {
233
- color: primaryMain,
223
+ color: 'var(--chakra-colors-primary-main)',
234
224
  textDecoration: 'underline',
235
225
  },
236
226
 
237
227
  '& code': {
238
228
  fontFamily: 'mono',
239
- background: gray100,
229
+ background: 'var(--chakra-colors-bg-muted)',
240
230
  paddingInline: space1,
241
231
  borderRadius: radiusSm,
242
232
 
@@ -1,5 +1,5 @@
1
1
  .markdownStyles {
2
- color: black;
2
+ color: var(--chakra-colors-fg-default, #1e2433);
3
3
  display: flex;
4
4
  flex-direction: column;
5
5
  gap: 1em; /* Intended for longer form content like update modals */
@@ -18,7 +18,7 @@ export const MaxLengthIndicator = ({
18
18
  }, [value]);
19
19
 
20
20
  return (
21
- <Subtitle textStyle="subtext" color="gray.600" {...rest}>
21
+ <Subtitle textStyle="subtext" color="fg.subtle" {...rest}>
22
22
  {currentValue}/{maxLength}
23
23
  </Subtitle>
24
24
  );
@@ -17,15 +17,18 @@ export const MenuItem = ({
17
17
  return (
18
18
  <Menu.Item
19
19
  value={value}
20
- color={isDangerVariant ? 'danger.main' : 'gray.1000'}
20
+ // Map item text/hover onto semantic tokens so they flip with the mode.
21
+ // Was gray.1000 / hover gray.1500 / hover bg gray.50 — none flipped, so
22
+ // items rendered dim and hover went near-black on a dark menu.
23
+ color={isDangerVariant ? 'danger.main' : 'fg.muted'}
21
24
  py={2}
22
25
  minW="fit-content"
23
26
  fontWeight="semibold"
24
27
  gap={3}
25
28
  cursor="pointer"
26
29
  _hover={{
27
- color: isDangerVariant ? 'danger.main' : 'gray.1500',
28
- backgroundColor: isDangerVariant ? 'danger.lightest' : 'gray.50',
30
+ color: isDangerVariant ? 'danger.main' : 'fg.default',
31
+ backgroundColor: isDangerVariant ? 'danger.lightest' : 'bg.subtle',
29
32
  }}
30
33
  {...focusRing}
31
34
  {...rest}
@@ -21,9 +21,14 @@ export const MenuList = forwardRef<HTMLDivElement, MenuListProps>(
21
21
  <Menu.Content
22
22
  ref={ref}
23
23
  border="1px solid"
24
- borderColor="gray.200"
24
+ borderColor="border.subtle"
25
25
  borderRadius="md"
26
- boxShadow="0 5px 20px 1px {colors.gray.50}"
26
+ // Light keeps its original near-white halo; dark uses a real dark
27
+ // shadow so the menu doesn't glow against the dark canvas.
28
+ boxShadow={{
29
+ base: '0 5px 20px 1px {colors.gray.50}',
30
+ _dark: '0 5px 20px 1px rgba(0, 0, 0, 0.5)',
31
+ }}
27
32
  p="1.5"
28
33
  {...rest}
29
34
  >
@@ -9,7 +9,7 @@ export const ModalFooter = ({ className, ...rest }: Dialog.FooterProps) => {
9
9
  gap={3}
10
10
  pt={4}
11
11
  borderTop="1px solid"
12
- borderColor="gray.50"
12
+ borderColor="border.subtle"
13
13
  {...rest}
14
14
  />
15
15
  );
@@ -294,7 +294,7 @@ export const MonthPicker: React.FC<MonthPickerProps> = ({
294
294
  <Box>
295
295
  <InputGroup
296
296
  startElement={
297
- <MdOutlineCalendarToday boxSize="xs" color="gray.800" />
297
+ <MdOutlineCalendarToday boxSize="xs" color="fg.muted" />
298
298
  }
299
299
  >
300
300
  <Input
@@ -6,7 +6,7 @@ import {
6
6
 
7
7
  export const PopoverArrowTip = forwardRef<HTMLDivElement, PopoverArrowTipProps>(
8
8
  (props, ref) => (
9
- <ChakraPopover.ArrowTip ref={ref} borderColor="gray.200" {...props} />
9
+ <ChakraPopover.ArrowTip ref={ref} borderColor="border.subtle" {...props} />
10
10
  )
11
11
  );
12
12
  PopoverArrowTip.displayName = 'Popover.ArrowTip';
@@ -16,7 +16,7 @@ export const PopoverContent = forwardRef<HTMLDivElement, PopoverContentProps>(
16
16
  <ChakraPopover.Content
17
17
  ref={ref}
18
18
  borderWidth="1px"
19
- borderColor="gray.200"
19
+ borderColor="border.subtle"
20
20
  {...props}
21
21
  >
22
22
  <ScaledContext fontSize={baseFontSize}>{children}</ScaledContext>
@@ -36,7 +36,7 @@ const meta = {
36
36
  },
37
37
  decorators: [
38
38
  (Story) => (
39
- <Box p={8} bg="white" borderRadius="md">
39
+ <Box p={8} bg="bg.surface" borderRadius="md">
40
40
  <Story />
41
41
  </Box>
42
42
  ),
@@ -149,7 +149,7 @@ const RadialProgress: React.FC<RadialProgressProps> = ({
149
149
  justifyContent="center"
150
150
  height={`${size}px`}
151
151
  width="100%"
152
- backgroundColor="white"
152
+ backgroundColor="bg.surface"
153
153
  className={['ml-radial-progress', className].join(' ')}
154
154
  {...rest}
155
155
  >
@@ -196,7 +196,7 @@ const RadialProgress: React.FC<RadialProgressProps> = ({
196
196
  <Text
197
197
  fontSize={`${fontSize}px`}
198
198
  fontWeight="500"
199
- color="gray.600"
199
+ color="fg.subtle"
200
200
  fontFamily="-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif"
201
201
  lineHeight="1"
202
202
  >
@@ -5,8 +5,8 @@ export const seeMoreButtonStyles = {
5
5
  display: 'flex',
6
6
  borderTop: '1px solid',
7
7
  borderRadius: 'none',
8
- borderColor: 'gray.300',
9
- color: 'gray.600',
8
+ borderColor: 'border.default',
9
+ color: 'fg.subtle',
10
10
  fontSize: 'subtitle',
11
11
  cursor: 'pointer',
12
12
  };