@oneuptime/common 11.5.7 → 11.5.9

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 (212) hide show
  1. package/Models/DatabaseModels/AIAgentTaskPullRequest.ts +15 -6
  2. package/Models/DatabaseModels/AIRun.ts +68 -0
  3. package/Models/DatabaseModels/AIRunEvent.ts +34 -1
  4. package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +215 -0
  5. package/Models/DatabaseModels/Project.ts +25 -0
  6. package/Models/DatabaseModels/StatusPage.ts +42 -0
  7. package/Server/API/AIAgentTaskAPI.ts +38 -12
  8. package/Server/API/AIAgentTaskLogAPI.ts +49 -0
  9. package/Server/API/AIChatAPI.ts +16 -0
  10. package/Server/API/AIReadinessAPI.ts +84 -0
  11. package/Server/API/CodeFixRunAPI.ts +190 -57
  12. package/Server/API/TelemetryExceptionAPI.ts +6 -1
  13. package/Server/Infrastructure/Postgres/SchemaMigrations/1784105912819-BackfillCodeFixTaskType.ts +41 -0
  14. package/Server/Infrastructure/Postgres/SchemaMigrations/1784124919694-AddAITaskNumberAndRunTranscript.ts +95 -0
  15. package/Server/Infrastructure/Postgres/SchemaMigrations/1784135099754-AllowNullAiAgentOnPullRequest.ts +52 -0
  16. package/Server/Infrastructure/Postgres/SchemaMigrations/1784137457184-AddEnableMcpServerToStatusPage.ts +30 -0
  17. package/Server/Infrastructure/Postgres/SchemaMigrations/1784200000000-AddSnmpV3ColumnsToNetworkDeviceDiscoveryScan.ts +49 -0
  18. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +10 -0
  19. package/Server/Middleware/MasterAdminAuthorization.ts +1 -1
  20. package/Server/Middleware/ProjectAuthorization.ts +1 -1
  21. package/Server/Services/AIRunEventService.ts +15 -1
  22. package/Server/Services/AIRunService.ts +48 -12
  23. package/Server/Services/LlmProviderService.ts +2 -0
  24. package/Server/Services/ProjectService.ts +42 -0
  25. package/Server/Services/StatusPageService.ts +87 -0
  26. package/Server/Services/TelemetryExceptionService.ts +19 -90
  27. package/Server/Types/Markdown.ts +9 -9
  28. package/Server/Types/MarkdownSlugify.ts +47 -0
  29. package/Server/Utils/AI/AIRunPrivacyFilter.ts +106 -0
  30. package/Server/Utils/AI/AIRunTranscript.ts +240 -0
  31. package/Server/Utils/AI/Chat/ChatAgentRunner.ts +9 -0
  32. package/Server/Utils/AI/Chat/ObservabilityChatPrompt.ts +119 -5
  33. package/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.ts +75 -0
  34. package/Server/Utils/AI/CodeFix/CodeFixReadiness.ts +235 -0
  35. package/Server/Utils/AI/SRE/Insights/FixRouting.ts +2 -3
  36. package/Server/Utils/AI/Toolbox/CodeTools.ts +883 -0
  37. package/Server/Utils/AI/Toolbox/CodeWriteTools.ts +519 -0
  38. package/Server/Utils/AI/Toolbox/Index.ts +27 -0
  39. package/Server/Utils/AI/Toolbox/ScheduledMaintenanceTools.ts +279 -0
  40. package/Server/Utils/AnalyticsDatabase/ClickhouseCapacity.ts +19 -1
  41. package/Server/Utils/CodeRepository/GitHub/GitHub.ts +600 -0
  42. package/Server/Utils/CodeRepository/StackTraceRepoResolver.ts +7 -2
  43. package/Server/Utils/LLM/LLMService.ts +397 -18
  44. package/Server/Utils/Monitor/NetworkDeviceHydrationUtil.ts +4 -11
  45. package/Tests/Models/StatusPageEnableMcpServer.test.ts +125 -0
  46. package/Tests/Server/Services/StatusPageServiceMcp.test.ts +223 -0
  47. package/Tests/Server/Services/TelemetryExceptionAIFixReadiness.test.ts +26 -3
  48. package/Tests/Server/Services/TelemetryExceptionCodeFixRun.test.ts +12 -0
  49. package/Tests/Server/Types/Markdown.test.ts +106 -0
  50. package/Tests/Server/Utils/AI/AIRunPrivacyFilter.test.ts +295 -0
  51. package/Tests/Server/Utils/AI/AIRunTranscript.test.ts +182 -0
  52. package/Tests/Server/Utils/AI/CodeFixReadiness.test.ts +411 -0
  53. package/Tests/Server/Utils/AI/CodeTools.test.ts +596 -0
  54. package/Tests/Server/Utils/AI/CodeWriteTools.test.ts +475 -0
  55. package/Tests/Server/Utils/AI/LLMServiceModelCompatibility.test.ts +548 -0
  56. package/Tests/Server/Utils/AI/ObservabilityChatPrompt.test.ts +142 -0
  57. package/Tests/Server/Utils/AI/ScheduledMaintenanceTools.test.ts +176 -0
  58. package/Tests/Server/Utils/AnalyticsDatabase/ClickhouseCapacity.test.ts +63 -0
  59. package/Tests/Server/Utils/GitHubGetFileContent.test.ts +197 -0
  60. package/Tests/Server/Utils/Monitor/NetworkDeviceHydrationUtil.test.ts +502 -0
  61. package/Tests/Types/AI/AIAgentTaskStatus.test.ts +7 -6
  62. package/Tests/Types/AI/AIChatPageContext.test.ts +0 -0
  63. package/Tests/Types/AI/AIRunStatus.test.ts +42 -0
  64. package/Tests/Types/Log/LogSeverity.test.ts +78 -0
  65. package/Tests/UI/Components/BasicFormDropdownNormalization.test.tsx +167 -0
  66. package/Tests/UI/Components/Charts/AxisTickColor.test.tsx +66 -0
  67. package/Tests/UI/Utils/AIChatExport/ChatWidgetData.test.ts +319 -0
  68. package/Tests/UI/Utils/AIChatExport/ChatWidgetMarkdown.test.ts +188 -0
  69. package/Types/AI/AIAgentTaskStatus.ts +13 -0
  70. package/Types/AI/AIChatPageContext.ts +137 -0
  71. package/Types/AI/AIChatTypes.ts +44 -0
  72. package/Types/AI/AIFixReadiness.ts +46 -0
  73. package/Types/AI/AIRunStatus.ts +11 -0
  74. package/Types/Email/EmailTemplateType.ts +2 -0
  75. package/Types/Log/LogSeverity.ts +61 -0
  76. package/Types/Monitor/SnmpMonitor/SnmpVersion.ts +40 -0
  77. package/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.tsx +8 -2
  78. package/UI/Components/Charts/ChartLibrary/BarChart/BarChart.tsx +3 -1
  79. package/UI/Components/Charts/ChartLibrary/LineChart/LineChart.tsx +8 -2
  80. package/UI/Components/EditionLabel/EditionLabel.tsx +821 -331
  81. package/UI/Components/Forms/BasicForm.tsx +26 -8
  82. package/UI/Styles/Theme.css +1314 -0
  83. package/UI/Utils/AIChatExport/ChatWidgetData.ts +316 -0
  84. package/UI/Utils/AIChatExport/ChatWidgetMarkdown.ts +349 -0
  85. package/UI/Utils/AIChatExport/ConversationMarkdown.ts +177 -0
  86. package/UI/Utils/AIChatExport/MarkdownBlocks.ts +327 -0
  87. package/UI/Utils/AIChatExport/MarkdownSafety.ts +215 -0
  88. package/UI/Utils/DownloadFile.ts +54 -0
  89. package/build/dist/Models/DatabaseModels/AIAgentTaskPullRequest.js +15 -7
  90. package/build/dist/Models/DatabaseModels/AIAgentTaskPullRequest.js.map +1 -1
  91. package/build/dist/Models/DatabaseModels/AIRun.js +69 -0
  92. package/build/dist/Models/DatabaseModels/AIRun.js.map +1 -1
  93. package/build/dist/Models/DatabaseModels/AIRunEvent.js +31 -0
  94. package/build/dist/Models/DatabaseModels/AIRunEvent.js.map +1 -1
  95. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js +225 -0
  96. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
  97. package/build/dist/Models/DatabaseModels/Project.js +27 -0
  98. package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
  99. package/build/dist/Models/DatabaseModels/StatusPage.js +43 -0
  100. package/build/dist/Models/DatabaseModels/StatusPage.js.map +1 -1
  101. package/build/dist/Server/API/AIAgentTaskAPI.js +37 -11
  102. package/build/dist/Server/API/AIAgentTaskAPI.js.map +1 -1
  103. package/build/dist/Server/API/AIAgentTaskLogAPI.js +32 -7
  104. package/build/dist/Server/API/AIAgentTaskLogAPI.js.map +1 -1
  105. package/build/dist/Server/API/AIChatAPI.js +9 -0
  106. package/build/dist/Server/API/AIChatAPI.js.map +1 -1
  107. package/build/dist/Server/API/AIReadinessAPI.js +57 -0
  108. package/build/dist/Server/API/AIReadinessAPI.js.map +1 -0
  109. package/build/dist/Server/API/CodeFixRunAPI.js +165 -51
  110. package/build/dist/Server/API/CodeFixRunAPI.js.map +1 -1
  111. package/build/dist/Server/API/TelemetryExceptionAPI.js +4 -0
  112. package/build/dist/Server/API/TelemetryExceptionAPI.js.map +1 -1
  113. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784105912819-BackfillCodeFixTaskType.js +36 -0
  114. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784105912819-BackfillCodeFixTaskType.js.map +1 -0
  115. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784124919694-AddAITaskNumberAndRunTranscript.js +80 -0
  116. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784124919694-AddAITaskNumberAndRunTranscript.js.map +1 -0
  117. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784135099754-AllowNullAiAgentOnPullRequest.js +37 -0
  118. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784135099754-AllowNullAiAgentOnPullRequest.js.map +1 -0
  119. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784137457184-AddEnableMcpServerToStatusPage.js +23 -0
  120. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784137457184-AddEnableMcpServerToStatusPage.js.map +1 -0
  121. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784200000000-AddSnmpV3ColumnsToNetworkDeviceDiscoveryScan.js +22 -0
  122. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784200000000-AddSnmpV3ColumnsToNetworkDeviceDiscoveryScan.js.map +1 -0
  123. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +10 -0
  124. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  125. package/build/dist/Server/Middleware/MasterAdminAuthorization.js +1 -1
  126. package/build/dist/Server/Middleware/ProjectAuthorization.js +1 -1
  127. package/build/dist/Server/Services/AIRunEventService.js +8 -0
  128. package/build/dist/Server/Services/AIRunEventService.js.map +1 -1
  129. package/build/dist/Server/Services/AIRunService.js +39 -3
  130. package/build/dist/Server/Services/AIRunService.js.map +1 -1
  131. package/build/dist/Server/Services/LlmProviderService.js +2 -0
  132. package/build/dist/Server/Services/LlmProviderService.js.map +1 -1
  133. package/build/dist/Server/Services/ProjectService.js +39 -0
  134. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  135. package/build/dist/Server/Services/StatusPageService.js +81 -0
  136. package/build/dist/Server/Services/StatusPageService.js.map +1 -1
  137. package/build/dist/Server/Services/TelemetryExceptionService.js +14 -61
  138. package/build/dist/Server/Services/TelemetryExceptionService.js.map +1 -1
  139. package/build/dist/Server/Types/Markdown.js +8 -8
  140. package/build/dist/Server/Types/Markdown.js.map +1 -1
  141. package/build/dist/Server/Types/MarkdownSlugify.js +47 -0
  142. package/build/dist/Server/Types/MarkdownSlugify.js.map +1 -0
  143. package/build/dist/Server/Utils/AI/AIRunPrivacyFilter.js +82 -0
  144. package/build/dist/Server/Utils/AI/AIRunPrivacyFilter.js.map +1 -0
  145. package/build/dist/Server/Utils/AI/AIRunTranscript.js +180 -0
  146. package/build/dist/Server/Utils/AI/AIRunTranscript.js.map +1 -0
  147. package/build/dist/Server/Utils/AI/Chat/ChatAgentRunner.js +1 -0
  148. package/build/dist/Server/Utils/AI/Chat/ChatAgentRunner.js.map +1 -1
  149. package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js +103 -5
  150. package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js.map +1 -1
  151. package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.js +55 -0
  152. package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.js.map +1 -1
  153. package/build/dist/Server/Utils/AI/CodeFix/CodeFixReadiness.js +211 -0
  154. package/build/dist/Server/Utils/AI/CodeFix/CodeFixReadiness.js.map +1 -0
  155. package/build/dist/Server/Utils/AI/SRE/Insights/FixRouting.js.map +1 -1
  156. package/build/dist/Server/Utils/AI/Toolbox/CodeTools.js +654 -0
  157. package/build/dist/Server/Utils/AI/Toolbox/CodeTools.js.map +1 -0
  158. package/build/dist/Server/Utils/AI/Toolbox/CodeWriteTools.js +389 -0
  159. package/build/dist/Server/Utils/AI/Toolbox/CodeWriteTools.js.map +1 -0
  160. package/build/dist/Server/Utils/AI/Toolbox/Index.js +19 -0
  161. package/build/dist/Server/Utils/AI/Toolbox/Index.js.map +1 -1
  162. package/build/dist/Server/Utils/AI/Toolbox/ScheduledMaintenanceTools.js +239 -0
  163. package/build/dist/Server/Utils/AI/Toolbox/ScheduledMaintenanceTools.js.map +1 -0
  164. package/build/dist/Server/Utils/AnalyticsDatabase/ClickhouseCapacity.js +19 -1
  165. package/build/dist/Server/Utils/AnalyticsDatabase/ClickhouseCapacity.js.map +1 -1
  166. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHub.js +439 -0
  167. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHub.js.map +1 -1
  168. package/build/dist/Server/Utils/CodeRepository/StackTraceRepoResolver.js +1 -1
  169. package/build/dist/Server/Utils/CodeRepository/StackTraceRepoResolver.js.map +1 -1
  170. package/build/dist/Server/Utils/LLM/LLMService.js +275 -19
  171. package/build/dist/Server/Utils/LLM/LLMService.js.map +1 -1
  172. package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js +2 -11
  173. package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js.map +1 -1
  174. package/build/dist/Types/AI/AIAgentTaskStatus.js +12 -0
  175. package/build/dist/Types/AI/AIAgentTaskStatus.js.map +1 -1
  176. package/build/dist/Types/AI/AIChatPageContext.js +101 -0
  177. package/build/dist/Types/AI/AIChatPageContext.js.map +1 -0
  178. package/build/dist/Types/AI/AIChatTypes.js +2 -0
  179. package/build/dist/Types/AI/AIChatTypes.js.map +1 -1
  180. package/build/dist/Types/AI/AIFixReadiness.js +9 -0
  181. package/build/dist/Types/AI/AIFixReadiness.js.map +1 -0
  182. package/build/dist/Types/AI/AIRunStatus.js +11 -0
  183. package/build/dist/Types/AI/AIRunStatus.js.map +1 -1
  184. package/build/dist/Types/Email/EmailTemplateType.js +1 -0
  185. package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
  186. package/build/dist/Types/Log/LogSeverity.js +56 -0
  187. package/build/dist/Types/Log/LogSeverity.js.map +1 -1
  188. package/build/dist/Types/Monitor/SnmpMonitor/SnmpVersion.js +38 -0
  189. package/build/dist/Types/Monitor/SnmpMonitor/SnmpVersion.js.map +1 -1
  190. package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js +9 -2
  191. package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js.map +1 -1
  192. package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js +3 -1
  193. package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js.map +1 -1
  194. package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js +9 -2
  195. package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js.map +1 -1
  196. package/build/dist/UI/Components/EditionLabel/EditionLabel.js +424 -139
  197. package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
  198. package/build/dist/UI/Components/Forms/BasicForm.js +24 -6
  199. package/build/dist/UI/Components/Forms/BasicForm.js.map +1 -1
  200. package/build/dist/UI/Utils/AIChatExport/ChatWidgetData.js +217 -0
  201. package/build/dist/UI/Utils/AIChatExport/ChatWidgetData.js.map +1 -0
  202. package/build/dist/UI/Utils/AIChatExport/ChatWidgetMarkdown.js +234 -0
  203. package/build/dist/UI/Utils/AIChatExport/ChatWidgetMarkdown.js.map +1 -0
  204. package/build/dist/UI/Utils/AIChatExport/ConversationMarkdown.js +111 -0
  205. package/build/dist/UI/Utils/AIChatExport/ConversationMarkdown.js.map +1 -0
  206. package/build/dist/UI/Utils/AIChatExport/MarkdownBlocks.js +233 -0
  207. package/build/dist/UI/Utils/AIChatExport/MarkdownBlocks.js.map +1 -0
  208. package/build/dist/UI/Utils/AIChatExport/MarkdownSafety.js +134 -0
  209. package/build/dist/UI/Utils/AIChatExport/MarkdownSafety.js.map +1 -0
  210. package/build/dist/UI/Utils/DownloadFile.js +41 -0
  211. package/build/dist/UI/Utils/DownloadFile.js.map +1 -0
  212. package/package.json +5 -1
@@ -0,0 +1,1314 @@
1
+ /*
2
+ * Shared dashboard theme tokens (Dashboard + Admin Dashboard). Light is
3
+ * intentionally the default; the dark values are activated only by the
4
+ * explicit class applied to <html>.
5
+ */
6
+ :root {
7
+ color-scheme: light;
8
+ --ou-background-primary: #f8f9fb;
9
+ --ou-surface-primary: #ffffff;
10
+ --ou-surface-secondary: #f9fafb;
11
+ --ou-surface-tertiary: #f3f4f6;
12
+ --ou-surface-quaternary: #e5e7eb;
13
+ --ou-border-subtle: #f3f4f6;
14
+ --ou-border-default: #e5e7eb;
15
+ --ou-border-strong: #d1d5db;
16
+ --ou-text-primary: #111827;
17
+ --ou-text-secondary: #4b5563;
18
+ --ou-text-muted: #6b7280;
19
+ --ou-text-subtle: #9ca3af;
20
+ --ou-chart-grid: #f1f5f9;
21
+ /* Axis ticks are 10px, so they need >= 4.5:1 against the light surface. */
22
+ --ou-chart-tick: #6b7280;
23
+ --ou-chart-series-neutral: #64748b;
24
+ --ou-chart-cursor: #d1d5db;
25
+ --ou-chart-track: #eef2f7;
26
+ --ou-chart-marker-ring: #ffffff;
27
+ --ou-flow-mask: rgb(241 245 249 / 70%);
28
+ --ou-accent-soft: #eef2ff;
29
+ --ou-accent-muted: #e0e7ff;
30
+ --ou-accent-text: #312e81;
31
+ --ou-link: #4f46e5;
32
+ --ou-danger-text: #b91c1c;
33
+ --ou-success-text: #166534;
34
+ --ou-tool-text: #0e7490;
35
+ --ou-warning-text: #b45309;
36
+ --ou-card-shadow: 0 1px 4px 0 rgb(0 0 0 / 4%),
37
+ 0 1px 2px -1px rgb(0 0 0 / 3%);
38
+ --ou-card-shadow-hover: 0 8px 25px -5px rgb(0 0 0 / 10%),
39
+ 0 4px 10px -6px rgb(0 0 0 / 5%);
40
+ --ou-card-shadow-selected: 0 4px 12px -2px rgb(59 130 246 / 12%),
41
+ 0 2px 4px -1px rgb(0 0 0 / 4%);
42
+ --ou-card-shadow-dragging: 0 20px 40px -8px rgb(59 130 246 / 15%),
43
+ 0 8px 16px -4px rgb(0 0 0 / 8%);
44
+ --ou-shadow-sm: 0 1px 3px rgb(15 23 42 / 8%);
45
+ --ou-shadow-md: 0 8px 20px -6px rgb(15 23 42 / 18%);
46
+ --ou-shadow-lg: 0 18px 40px -12px rgb(15 23 42 / 24%);
47
+ }
48
+
49
+ html.dark {
50
+ color-scheme: dark;
51
+ --ou-background-primary: #0f172a;
52
+ --ou-surface-primary: #172033;
53
+ --ou-surface-secondary: #1e293b;
54
+ --ou-surface-tertiary: #273449;
55
+ --ou-surface-quaternary: #334155;
56
+ --ou-border-subtle: #334155;
57
+ --ou-border-default: #475569;
58
+ --ou-border-strong: #64748b;
59
+ --ou-text-primary: #f8fafc;
60
+ --ou-text-secondary: #e2e8f0;
61
+ --ou-text-muted: #cbd5e1;
62
+ --ou-text-subtle: #94a3b8;
63
+ --ou-chart-grid: #334155;
64
+ --ou-chart-tick: #94a3b8;
65
+ --ou-chart-series-neutral: #cbd5e1;
66
+ --ou-chart-cursor: #64748b;
67
+ --ou-chart-track: #334155;
68
+ --ou-chart-marker-ring: #172033;
69
+ --ou-flow-mask: rgb(15 23 42 / 72%);
70
+ --ou-accent-soft: #1e1b4b;
71
+ --ou-accent-muted: #312e81;
72
+ --ou-accent-text: #e0e7ff;
73
+ --ou-link: #a5b4fc;
74
+ --ou-danger-text: #fca5a5;
75
+ --ou-success-text: #86efac;
76
+ --ou-tool-text: #67e8f9;
77
+ --ou-warning-text: #fcd34d;
78
+ --ou-card-shadow: 0 10px 28px rgb(0 0 0 / 42%),
79
+ 0 0 0 1px rgb(148 163 184 / 10%);
80
+ --ou-card-shadow-hover: 0 16px 36px -8px rgb(0 0 0 / 58%),
81
+ 0 0 0 1px rgb(148 163 184 / 16%);
82
+ --ou-card-shadow-selected: 0 10px 30px -8px rgb(59 130 246 / 38%),
83
+ 0 0 0 1px rgb(96 165 250 / 36%);
84
+ --ou-card-shadow-dragging: 0 24px 48px -10px rgb(0 0 0 / 68%),
85
+ 0 0 0 2px rgb(96 165 250 / 48%);
86
+ --ou-shadow-sm: 0 2px 6px rgb(0 0 0 / 36%),
87
+ 0 0 0 1px rgb(148 163 184 / 8%);
88
+ --ou-shadow-md: 0 12px 28px -8px rgb(0 0 0 / 52%),
89
+ 0 0 0 1px rgb(148 163 184 / 10%);
90
+ --ou-shadow-lg: 0 24px 52px -14px rgb(0 0 0 / 64%),
91
+ 0 0 0 1px rgb(148 163 184 / 12%);
92
+ }
93
+
94
+ html.dark,
95
+ html.dark body,
96
+ html.dark #root {
97
+ background-color: var(--ou-background-primary);
98
+ color: var(--ou-text-primary);
99
+ }
100
+
101
+ html.dark * {
102
+ --tw-ring-offset-color: var(--ou-background-primary);
103
+ }
104
+
105
+ html.dark ::selection {
106
+ background-color: rgb(99 102 241 / 45%);
107
+ color: #ffffff;
108
+ }
109
+
110
+ /* Core neutral surfaces. */
111
+ html.dark .bg-white,
112
+ html.dark [class~="!bg-white"] {
113
+ background-color: var(--ou-surface-primary) !important;
114
+ }
115
+
116
+ html.dark :is(
117
+ [class~="bg-white/60"],
118
+ [class~="bg-white/80"],
119
+ [class~="bg-white/90"],
120
+ [class~="bg-white/95"]
121
+ ) {
122
+ background-color: color-mix(
123
+ in srgb,
124
+ var(--ou-surface-primary) 88%,
125
+ transparent
126
+ );
127
+ }
128
+
129
+ html.dark :is(.bg-gray-50, .bg-slate-50) {
130
+ background-color: var(--ou-surface-secondary);
131
+ }
132
+
133
+ /* The app shell uses bg-gray-50 too; keep only the canvas at the deepest tone. */
134
+ html.dark body.bg-gray-50 {
135
+ background-color: var(--ou-background-primary) !important;
136
+ }
137
+
138
+ html.dark :is(
139
+ [class~="bg-gray-50/30"],
140
+ [class~="bg-gray-50/40"],
141
+ [class~="bg-gray-50/50"],
142
+ [class~="bg-gray-50/60"],
143
+ [class~="bg-gray-50/70"],
144
+ [class~="bg-gray-50/80"]
145
+ ) {
146
+ background-color: color-mix(
147
+ in srgb,
148
+ var(--ou-surface-secondary) 75%,
149
+ transparent
150
+ );
151
+ }
152
+
153
+ html.dark :is(.bg-gray-100, .bg-slate-100, .bg-stone-100),
154
+ html.dark [class~="!bg-gray-100"] {
155
+ background-color: var(--ou-surface-tertiary) !important;
156
+ }
157
+
158
+ html.dark :is(
159
+ [class~="bg-gray-100/50"],
160
+ [class~="bg-gray-100/60"],
161
+ [class~="bg-gray-100/70"]
162
+ ) {
163
+ background-color: color-mix(
164
+ in srgb,
165
+ var(--ou-surface-tertiary) 82%,
166
+ transparent
167
+ );
168
+ }
169
+
170
+ html.dark :is(.bg-gray-200, .bg-slate-200) {
171
+ background-color: var(--ou-surface-quaternary);
172
+ }
173
+
174
+ html.dark [class~="bg-gray-200/70"] {
175
+ background-color: color-mix(
176
+ in srgb,
177
+ var(--ou-surface-quaternary) 82%,
178
+ transparent
179
+ );
180
+ }
181
+
182
+ html.dark :is(.bg-gray-300, .bg-slate-300) {
183
+ background-color: var(--ou-border-strong);
184
+ }
185
+
186
+ /* Light-theme primary controls use gray-900, which otherwise merges into the canvas. */
187
+ html.dark .bg-gray-900.text-white {
188
+ background-color: var(--ou-surface-quaternary);
189
+ }
190
+
191
+ html.dark [class~="bg-gray-900/5"] {
192
+ background-color: rgb(148 163 184 / 12%);
193
+ }
194
+
195
+ /* State variants that otherwise flash back to literal light Tailwind colors. */
196
+ html.dark :is(
197
+ [class~="hover:bg-gray-50"],
198
+ [class*="hover:bg-gray-50/"],
199
+ [class~="hover:bg-slate-50"],
200
+ [class~="hover:bg-white"],
201
+ [class~="hover:bg-white/60"]
202
+ ):hover,
203
+ html.dark :is([class~="focus:bg-gray-50"], [class~="focus:bg-white"]):focus {
204
+ background-color: var(--ou-surface-secondary) !important;
205
+ }
206
+
207
+ html.dark :is(
208
+ [class~="hover:bg-gray-100"],
209
+ [class*="hover:bg-gray-100/"],
210
+ [class~="active:bg-gray-100"]
211
+ ):hover,
212
+ html.dark [class~="active:bg-gray-100"]:active,
213
+ html.dark [class~="disabled:bg-gray-100"]:disabled {
214
+ background-color: var(--ou-surface-tertiary) !important;
215
+ }
216
+
217
+ html.dark :is(
218
+ [class~="hover:bg-gray-200"],
219
+ [class*="hover:bg-gray-200/"],
220
+ [class~="group-hover:bg-gray-200"]
221
+ ):hover,
222
+ html.dark .group:hover :is(
223
+ [class~="group-hover:bg-gray-200"],
224
+ [class*="group-hover:bg-gray-50/"]
225
+ ) {
226
+ background-color: var(--ou-surface-quaternary) !important;
227
+ }
228
+
229
+ html.dark :is(
230
+ [class~="hover:bg-gray-300"],
231
+ [class~="group-hover:bg-gray-300"]
232
+ ):hover,
233
+ html.dark .group:hover [class~="group-hover:bg-gray-300"] {
234
+ background-color: var(--ou-border-default) !important;
235
+ }
236
+
237
+ html.dark [class~="hover:bg-gray-800"]:hover,
238
+ html.dark .group:hover [class~="group-hover:bg-gray-900"] {
239
+ background-color: var(--ou-border-default) !important;
240
+ }
241
+
242
+ /* Neutral text and placeholders. */
243
+ html.dark :is(.text-gray-900, .text-slate-900),
244
+ html.dark [class~="!text-gray-900"] {
245
+ color: var(--ou-text-primary) !important;
246
+ }
247
+
248
+ html.dark :is(.text-gray-800, .text-slate-800) {
249
+ color: var(--ou-text-primary);
250
+ }
251
+
252
+ html.dark :is(.text-gray-700, .text-slate-700, .text-stone-600) {
253
+ color: var(--ou-text-secondary);
254
+ }
255
+
256
+ html.dark :is(.text-gray-600, .text-slate-600) {
257
+ color: var(--ou-text-muted);
258
+ }
259
+
260
+ html.dark :is(.text-gray-500, .text-slate-500) {
261
+ color: var(--ou-text-subtle);
262
+ }
263
+
264
+ html.dark :is(.text-gray-400, .text-slate-400),
265
+ html.dark [class~="!text-gray-400"] {
266
+ color: #94a3b8 !important;
267
+ }
268
+
269
+ html.dark :is(.text-gray-300, .text-slate-300) {
270
+ color: #cbd5e1;
271
+ }
272
+
273
+ html.dark :is(
274
+ [class~="hover:text-gray-500"],
275
+ [class~="hover:text-gray-600"],
276
+ [class~="hover:text-gray-700"],
277
+ [class~="hover:text-gray-800"],
278
+ [class~="hover:text-gray-900"]
279
+ ):hover,
280
+ html.dark [class~="focus:text-gray-900"]:focus,
281
+ html.dark .group:hover [class*="group-hover"][class*="text-gray-"] {
282
+ color: var(--ou-text-primary) !important;
283
+ }
284
+
285
+ html.dark :is(.placeholder-gray-400, .placeholder-gray-500)::placeholder {
286
+ color: var(--ou-text-subtle);
287
+ }
288
+
289
+ /*
290
+ * Neutral borders, dividers, rings and SVG utility colors.
291
+ *
292
+ * Tailwind emits one class token per variant, and a class selector matches
293
+ * only the exact token: `.border-gray-200` never matches `sm:border-gray-200`,
294
+ * so an uncovered variant keeps its literal light Tailwind color and paints
295
+ * near-white on a dark surface. Two kinds of variant, handled differently:
296
+ *
297
+ * Responsive (sm:/md:/lg:/xl:) -- the same static color at a different
298
+ * breakpoint. Listed alongside the bare token, one color per step below.
299
+ *
300
+ * State (hover:/group-hover:/focus-within:) -- a DIFFERENT color, and only
301
+ * while the state holds. These need their own state-qualified rules; folding
302
+ * them in here would paint the state color permanently. For the same reason
303
+ * never widen these to [class*="border-gray-200"] -- that substring also
304
+ * matches `hover:border-gray-200`, which would give a permanent border to
305
+ * every `border-transparent hover:border-gray-200` element.
306
+ *
307
+ * When adding a variant to a component, add its token to the matching step.
308
+ */
309
+ html.dark :is(
310
+ .border-gray-50,
311
+ .border-gray-100,
312
+ .border-slate-200,
313
+ [class~="sm:border-gray-100"],
314
+ [class~="md:border-gray-100"],
315
+ [class~="lg:border-gray-100"],
316
+ [class~="xl:border-gray-100"]
317
+ ),
318
+ html.dark [class~="border-gray-100/80"],
319
+ html.dark [class~="!border-gray-100"] {
320
+ border-color: var(--ou-border-subtle) !important;
321
+ }
322
+
323
+ html.dark :is(
324
+ .border-gray-200,
325
+ .border-slate-300,
326
+ [class~="sm:border-gray-200"],
327
+ [class~="md:border-gray-200"],
328
+ [class~="lg:border-gray-200"],
329
+ [class~="xl:border-gray-200"]
330
+ ),
331
+ html.dark :is(
332
+ [class~="border-gray-200/60"],
333
+ [class~="border-gray-200/70"],
334
+ [class~="border-gray-200/80"]
335
+ ) {
336
+ border-color: var(--ou-border-default);
337
+ }
338
+
339
+ html.dark :is(
340
+ .border-gray-300,
341
+ [class~="sm:border-gray-300"],
342
+ [class~="md:border-gray-300"],
343
+ [class~="lg:border-gray-300"],
344
+ [class~="xl:border-gray-300"]
345
+ ),
346
+ html.dark [class~="!border-gray-300"] {
347
+ border-color: var(--ou-border-strong) !important;
348
+ }
349
+
350
+ html.dark :is(
351
+ [class~="hover:border-gray-200"],
352
+ [class~="hover:border-gray-300"],
353
+ [class~="hover:border-gray-400"],
354
+ [class~="hover:border-slate-300"]
355
+ ):hover,
356
+ html.dark [class~="focus-within:border-gray-300"]:focus-within {
357
+ border-color: #64748b !important;
358
+ }
359
+
360
+ /*
361
+ * A group-hover border rides alongside a hover background change, so it stays
362
+ * subtle -- the background is what carries the hover affordance.
363
+ */
364
+ html.dark .group:hover [class~="group-hover:border-gray-200"] {
365
+ border-color: var(--ou-border-subtle);
366
+ }
367
+
368
+ /* Divider scale: bare + responsive variants share one color per step. */
369
+ html.dark :is(
370
+ .divide-gray-50,
371
+ .divide-gray-100,
372
+ [class~="divide-gray-100/80"],
373
+ [class~="sm:divide-gray-100"],
374
+ [class~="md:divide-gray-100"],
375
+ [class~="lg:divide-gray-100"],
376
+ [class~="xl:divide-gray-100"]
377
+ ) > :not([hidden]) ~ :not([hidden]) {
378
+ border-color: var(--ou-border-subtle);
379
+ }
380
+
381
+ html.dark :is(
382
+ .divide-gray-200,
383
+ .divide-gray-300,
384
+ [class~="sm:divide-gray-200"],
385
+ [class~="md:divide-gray-200"],
386
+ [class~="lg:divide-gray-200"],
387
+ [class~="xl:divide-gray-200"]
388
+ ) > :not([hidden]) ~ :not([hidden]) {
389
+ border-color: var(--ou-border-default);
390
+ }
391
+
392
+ /*
393
+ * Exception, and the only one in the scale: the TopSection rule spans the full
394
+ * header width, so it reads subtle in dark even though gray-200 dividers map to
395
+ * --ou-border-default above. Light mode keeps gray-200, where a subtler step
396
+ * would all but vanish against the white header -- which is why this is a theme
397
+ * exception and not a different token on the component.
398
+ * Must stay after the scale: equal specificity, so source order decides.
399
+ */
400
+ html.dark [class~="lg:divide-gray-200"] > :not([hidden]) ~ :not([hidden]) {
401
+ border-color: var(--ou-border-subtle);
402
+ }
403
+
404
+ html.dark :is(
405
+ .ring-gray-100,
406
+ .ring-gray-200,
407
+ .ring-slate-200,
408
+ [class~="ring-gray-200/80"]
409
+ ) {
410
+ --tw-ring-color: var(--ou-border-default);
411
+ }
412
+
413
+ html.dark :is(.ring-gray-300, .ring-slate-300, .ring-stone-300) {
414
+ --tw-ring-color: var(--ou-border-strong);
415
+ }
416
+
417
+ html.dark :is([class~="ring-black/5"], [class~="ring-black/10"]) {
418
+ --tw-ring-color: rgb(148 163 184 / 18%);
419
+ }
420
+
421
+ html.dark [class~="ring-gray-900/5"] {
422
+ --tw-ring-color: rgb(148 163 184 / 20%);
423
+ }
424
+
425
+ html.dark .ring-white {
426
+ --tw-ring-color: var(--ou-surface-primary);
427
+ }
428
+
429
+ html.dark :is(
430
+ [class~="focus-visible:ring-gray-200"],
431
+ [class~="focus-visible:ring-gray-300"]
432
+ ):focus-visible {
433
+ --tw-ring-color: #64748b;
434
+ }
435
+
436
+ html.dark [class~="focus:ring-gray-900"]:focus,
437
+ html.dark [class~="focus-within:ring-gray-900"]:focus-within {
438
+ --tw-ring-color: #818cf8;
439
+ }
440
+
441
+ html.dark [class~="focus-visible:outline-gray-900"]:focus-visible {
442
+ outline-color: #818cf8 !important;
443
+ }
444
+
445
+ html.dark :is(.fill-gray-500, .fill-gray-800) {
446
+ fill: var(--ou-chart-tick);
447
+ }
448
+
449
+ html.dark .stroke-gray-100 {
450
+ stroke: var(--ou-chart-grid);
451
+ }
452
+
453
+ html.dark .stroke-gray-500 {
454
+ stroke: var(--ou-chart-series-neutral);
455
+ }
456
+
457
+ /* Tailwind's light shadows disappear against dark surfaces. */
458
+ html.dark .shadow-sm {
459
+ --tw-shadow: var(--ou-shadow-sm);
460
+ }
461
+
462
+ html.dark :is(.shadow, .shadow-md) {
463
+ --tw-shadow: var(--ou-shadow-md);
464
+ }
465
+
466
+ html.dark :is(.shadow-lg, .shadow-xl, .shadow-2xl) {
467
+ --tw-shadow: var(--ou-shadow-lg);
468
+ }
469
+
470
+ /* Light gradients become layered dark surfaces. */
471
+ html.dark :is(
472
+ .from-white,
473
+ .from-gray-50,
474
+ [class~="from-gray-50/50"],
475
+ [class~="from-gray-50/60"]
476
+ ) {
477
+ --tw-gradient-from: var(--ou-surface-primary) var(--tw-gradient-from-position);
478
+ --tw-gradient-to: rgb(17 24 39 / 0%) var(--tw-gradient-to-position);
479
+ }
480
+
481
+ /*
482
+ * Tailwind's via-* classes bake the middle color into --tw-gradient-stops
483
+ * directly (there is no --tw-gradient-via variable), so the stops list must be
484
+ * rebuilt to recolor the middle stop.
485
+ */
486
+ html.dark :is(.via-white, .via-gray-200) {
487
+ --tw-gradient-stops: var(--tw-gradient-from),
488
+ var(--ou-surface-secondary) var(--tw-gradient-via-position),
489
+ var(--tw-gradient-to);
490
+ }
491
+
492
+ html.dark :is(
493
+ .to-white,
494
+ .to-gray-50,
495
+ .to-gray-100,
496
+ .to-slate-50,
497
+ [class~="to-gray-50/50"]
498
+ ) {
499
+ --tw-gradient-to: var(--ou-surface-secondary)
500
+ var(--tw-gradient-to-position);
501
+ }
502
+
503
+ html.dark :is(.from-red-50, .from-rose-50, .from-orange-50) {
504
+ --tw-gradient-from: rgb(127 29 29 / 38%) var(--tw-gradient-from-position);
505
+ --tw-gradient-to: rgb(127 29 29 / 0%) var(--tw-gradient-to-position);
506
+ }
507
+
508
+ html.dark .from-amber-50 {
509
+ --tw-gradient-from: rgb(120 53 15 / 38%) var(--tw-gradient-from-position);
510
+ --tw-gradient-to: rgb(120 53 15 / 0%) var(--tw-gradient-to-position);
511
+ }
512
+
513
+ html.dark .from-emerald-50 {
514
+ --tw-gradient-from: rgb(6 78 59 / 38%) var(--tw-gradient-from-position);
515
+ --tw-gradient-to: rgb(6 78 59 / 0%) var(--tw-gradient-to-position);
516
+ }
517
+
518
+ html.dark :is(.from-blue-50, .from-sky-50, .from-cyan-50) {
519
+ --tw-gradient-from: rgb(30 64 175 / 35%) var(--tw-gradient-from-position);
520
+ --tw-gradient-to: rgb(30 64 175 / 0%) var(--tw-gradient-to-position);
521
+ }
522
+
523
+ html.dark :is(
524
+ .from-indigo-50,
525
+ .from-violet-50,
526
+ [class~="from-indigo-50/40"]
527
+ ) {
528
+ --tw-gradient-from: rgb(49 46 129 / 42%) var(--tw-gradient-from-position);
529
+ --tw-gradient-to: rgb(49 46 129 / 0%) var(--tw-gradient-to-position);
530
+ }
531
+
532
+ html.dark .via-indigo-50 {
533
+ --tw-gradient-stops: var(--tw-gradient-from),
534
+ rgb(49 46 129 / 34%) var(--tw-gradient-via-position),
535
+ var(--tw-gradient-to);
536
+ }
537
+
538
+ html.dark :is(.to-red-100, .to-rose-50) {
539
+ --tw-gradient-to: rgb(127 29 29 / 42%) var(--tw-gradient-to-position);
540
+ }
541
+
542
+ html.dark .to-amber-100 {
543
+ --tw-gradient-to: rgb(120 53 15 / 42%) var(--tw-gradient-to-position);
544
+ }
545
+
546
+ html.dark .to-emerald-100 {
547
+ --tw-gradient-to: rgb(6 78 59 / 42%) var(--tw-gradient-to-position);
548
+ }
549
+
550
+ html.dark :is(.to-blue-100, .to-sky-100) {
551
+ --tw-gradient-to: rgb(30 64 175 / 40%) var(--tw-gradient-to-position);
552
+ }
553
+
554
+ html.dark :is(
555
+ .to-indigo-50,
556
+ [class~="to-indigo-50/50"]
557
+ ) {
558
+ --tw-gradient-to: rgb(49 46 129 / 42%) var(--tw-gradient-to-position);
559
+ }
560
+
561
+ /* Semantic light surfaces retain hue without becoming luminous cards. */
562
+ html.dark :is(
563
+ .bg-red-50,
564
+ .bg-red-100,
565
+ [class~="bg-red-50/30"],
566
+ [class~="bg-red-50/40"],
567
+ [class~="bg-red-50/50"],
568
+ [class~="bg-red-50/60"]
569
+ ) {
570
+ background-color: rgb(127 29 29 / 32%);
571
+ }
572
+
573
+ html.dark :is(.bg-orange-50, .bg-orange-100) {
574
+ background-color: rgb(124 45 18 / 32%);
575
+ }
576
+
577
+ html.dark :is(
578
+ .bg-amber-50,
579
+ .bg-amber-100,
580
+ [class~="bg-amber-50/30"],
581
+ [class~="bg-amber-50/50"],
582
+ [class~="bg-amber-50/60"],
583
+ [class~="bg-amber-50/70"]
584
+ ) {
585
+ background-color: rgb(120 53 15 / 32%);
586
+ }
587
+
588
+ html.dark :is(.bg-yellow-50, .bg-yellow-100, [class~="bg-yellow-50/50"]) {
589
+ background-color: rgb(113 63 18 / 32%);
590
+ }
591
+
592
+ html.dark :is(.bg-green-50, .bg-green-100, [class~="bg-green-50/50"]) {
593
+ background-color: rgb(20 83 45 / 32%);
594
+ }
595
+
596
+ html.dark :is(
597
+ .bg-emerald-50,
598
+ .bg-emerald-100,
599
+ [class~="bg-emerald-50/60"],
600
+ [class~="bg-emerald-50/70"]
601
+ ) {
602
+ background-color: rgb(6 78 59 / 32%);
603
+ }
604
+
605
+ html.dark :is(.bg-teal-50, .bg-teal-100) {
606
+ background-color: rgb(19 78 74 / 32%);
607
+ }
608
+
609
+ html.dark :is(.bg-cyan-50, .bg-cyan-100) {
610
+ background-color: rgb(22 78 99 / 32%);
611
+ }
612
+
613
+ html.dark :is(.bg-sky-50, .bg-sky-100, [class~="bg-sky-50/60"]) {
614
+ background-color: rgb(12 74 110 / 32%);
615
+ }
616
+
617
+ html.dark :is(
618
+ .bg-blue-50,
619
+ .bg-blue-100,
620
+ [class~="bg-blue-50/40"],
621
+ [class~="bg-blue-50/50"]
622
+ ) {
623
+ background-color: rgb(30 64 175 / 28%);
624
+ }
625
+
626
+ html.dark :is(
627
+ .bg-indigo-50,
628
+ .bg-indigo-100,
629
+ .bg-indigo-200,
630
+ [class~="bg-indigo-50/30"],
631
+ [class~="bg-indigo-50/40"],
632
+ [class~="bg-indigo-50/50"],
633
+ [class~="bg-indigo-50/60"],
634
+ [class~="bg-indigo-50/70"],
635
+ [class~="bg-indigo-100/50"],
636
+ [class~="bg-indigo-500/5"]
637
+ ) {
638
+ background-color: rgb(49 46 129 / 35%);
639
+ }
640
+
641
+ html.dark :is(.bg-violet-50, .bg-violet-100, [class~="bg-violet-50/40"]) {
642
+ background-color: rgb(76 29 149 / 32%);
643
+ }
644
+
645
+ html.dark :is(.bg-purple-50, .bg-purple-100, [class~="bg-purple-50/50"]) {
646
+ background-color: rgb(88 28 135 / 32%);
647
+ }
648
+
649
+ html.dark :is(.bg-fuchsia-50, .bg-fuchsia-100) {
650
+ background-color: rgb(112 26 117 / 32%);
651
+ }
652
+
653
+ html.dark :is(.bg-pink-50, .bg-pink-100) {
654
+ background-color: rgb(131 24 67 / 32%);
655
+ }
656
+
657
+ html.dark :is(.bg-rose-50, .bg-rose-100, [class~="bg-rose-50/60"]) {
658
+ background-color: rgb(136 19 55 / 32%);
659
+ }
660
+
661
+ html.dark :is(
662
+ .text-red-500,
663
+ .text-red-600,
664
+ .text-red-700,
665
+ .text-red-800,
666
+ .text-red-900,
667
+ [class~="text-red-600/70"]
668
+ ) {
669
+ color: #fca5a5;
670
+ }
671
+
672
+ html.dark :is(
673
+ .text-orange-600,
674
+ .text-orange-700,
675
+ .text-orange-800,
676
+ .text-orange-900
677
+ ) {
678
+ color: #fdba74;
679
+ }
680
+
681
+ html.dark :is(
682
+ .text-amber-600,
683
+ .text-amber-700,
684
+ .text-amber-800,
685
+ .text-amber-900,
686
+ [class~="text-amber-700/80"]
687
+ ) {
688
+ color: #fcd34d;
689
+ }
690
+
691
+ html.dark :is(
692
+ .text-yellow-600,
693
+ .text-yellow-700,
694
+ .text-yellow-800,
695
+ .text-yellow-900
696
+ ) {
697
+ color: #fde047;
698
+ }
699
+
700
+ html.dark :is(
701
+ .text-green-600,
702
+ .text-green-700,
703
+ .text-green-800,
704
+ .text-green-900
705
+ ) {
706
+ color: #86efac;
707
+ }
708
+
709
+ html.dark :is(
710
+ .text-emerald-600,
711
+ .text-emerald-700,
712
+ .text-emerald-800,
713
+ .text-emerald-900,
714
+ [class~="text-emerald-700/80"]
715
+ ) {
716
+ color: #6ee7b7;
717
+ }
718
+
719
+ html.dark :is(.text-teal-600, .text-teal-700, .text-teal-800) {
720
+ color: #5eead4;
721
+ }
722
+
723
+ html.dark :is(.text-cyan-600, .text-cyan-700, .text-cyan-800) {
724
+ color: #67e8f9;
725
+ }
726
+
727
+ html.dark :is(
728
+ .text-sky-600,
729
+ .text-sky-700,
730
+ .text-sky-800,
731
+ .text-sky-900,
732
+ [class~="text-sky-700/80"]
733
+ ) {
734
+ color: #7dd3fc;
735
+ }
736
+
737
+ html.dark :is(
738
+ .text-blue-500,
739
+ .text-blue-600,
740
+ .text-blue-700,
741
+ .text-blue-800,
742
+ .text-blue-900
743
+ ) {
744
+ color: #93c5fd;
745
+ }
746
+
747
+ html.dark :is(
748
+ .text-indigo-500,
749
+ .text-indigo-600,
750
+ .text-indigo-700,
751
+ .text-indigo-800,
752
+ .text-indigo-900,
753
+ [class~="text-indigo-500/80"]
754
+ ) {
755
+ color: #a5b4fc;
756
+ }
757
+
758
+ html.dark :is(
759
+ .text-violet-500,
760
+ .text-violet-600,
761
+ .text-violet-700,
762
+ .text-violet-800,
763
+ .text-violet-900
764
+ ) {
765
+ color: #c4b5fd;
766
+ }
767
+
768
+ html.dark :is(
769
+ .text-purple-600,
770
+ .text-purple-700,
771
+ .text-purple-800,
772
+ .text-purple-900
773
+ ) {
774
+ color: #d8b4fe;
775
+ }
776
+
777
+ html.dark :is(.text-fuchsia-600, .text-fuchsia-700) {
778
+ color: #e879f9;
779
+ }
780
+
781
+ html.dark :is(.text-pink-600, .text-pink-700) {
782
+ color: #f9a8d4;
783
+ }
784
+
785
+ html.dark :is(
786
+ .text-rose-500,
787
+ .text-rose-600,
788
+ .text-rose-700,
789
+ .text-rose-800,
790
+ .text-rose-900,
791
+ [class~="text-rose-700/80"]
792
+ ) {
793
+ color: #fda4af;
794
+ }
795
+
796
+ html.dark :is(
797
+ .border-red-100,
798
+ .border-red-200,
799
+ .border-red-300,
800
+ [class~="border-red-200/60"],
801
+ .ring-red-100,
802
+ .ring-red-200
803
+ ) {
804
+ border-color: rgb(248 113 113 / 45%);
805
+ --tw-ring-color: rgb(248 113 113 / 35%);
806
+ }
807
+
808
+ html.dark :is(
809
+ .border-amber-100,
810
+ .border-amber-200,
811
+ .border-amber-300,
812
+ [class~="border-amber-200/70"],
813
+ .ring-amber-100,
814
+ .ring-amber-200
815
+ ) {
816
+ border-color: rgb(251 191 36 / 42%);
817
+ --tw-ring-color: rgb(251 191 36 / 32%);
818
+ }
819
+
820
+ html.dark :is(
821
+ .border-green-100,
822
+ .border-green-200,
823
+ .border-emerald-100,
824
+ .border-emerald-200,
825
+ .border-emerald-300,
826
+ .ring-green-200,
827
+ .ring-emerald-200
828
+ ) {
829
+ border-color: rgb(52 211 153 / 42%);
830
+ --tw-ring-color: rgb(52 211 153 / 32%);
831
+ }
832
+
833
+ html.dark :is(
834
+ .border-fuchsia-100,
835
+ .border-pink-100,
836
+ .ring-fuchsia-200,
837
+ .ring-pink-200
838
+ ) {
839
+ border-color: rgb(232 121 249 / 42%);
840
+ --tw-ring-color: rgb(244 114 182 / 35%);
841
+ }
842
+
843
+ html.dark :is(
844
+ .border-blue-100,
845
+ .border-blue-200,
846
+ .border-blue-300,
847
+ .ring-blue-100,
848
+ .ring-blue-200,
849
+ .border-sky-100,
850
+ .border-sky-200,
851
+ .ring-sky-200
852
+ ) {
853
+ border-color: rgb(96 165 250 / 42%);
854
+ --tw-ring-color: rgb(96 165 250 / 32%);
855
+ }
856
+
857
+ html.dark :is(
858
+ .border-indigo-100,
859
+ .border-indigo-200,
860
+ .border-indigo-300,
861
+ .ring-indigo-100,
862
+ .ring-indigo-200,
863
+ .ring-indigo-300,
864
+ .border-violet-100,
865
+ .ring-violet-200,
866
+ .border-purple-100,
867
+ .ring-purple-200
868
+ ) {
869
+ border-color: rgb(129 140 248 / 45%);
870
+ --tw-ring-color: rgb(129 140 248 / 35%);
871
+ }
872
+
873
+ html.dark :is(
874
+ .border-yellow-100,
875
+ .border-yellow-200,
876
+ .border-orange-100,
877
+ .ring-yellow-200,
878
+ .ring-orange-200,
879
+ .border-rose-100,
880
+ .border-rose-200,
881
+ .ring-rose-200
882
+ ) {
883
+ border-color: rgb(251 146 60 / 42%);
884
+ --tw-ring-color: rgb(251 146 60 / 32%);
885
+ }
886
+
887
+ /* Semantic interaction variants use the same dark palette as their base. */
888
+ html.dark :is(
889
+ [class*="hover:bg-indigo-50"],
890
+ [class~="hover:bg-indigo-100"],
891
+ [class~="hover:bg-indigo-200"],
892
+ [class~="group-hover:bg-indigo-50"],
893
+ [class~="group-hover:bg-indigo-100"]
894
+ ):hover,
895
+ html.dark .group:hover :is(
896
+ [class*="group-hover:bg-indigo-50"],
897
+ [class~="group-hover:bg-indigo-100"]
898
+ ) {
899
+ background-color: rgb(49 46 129 / 48%) !important;
900
+ }
901
+
902
+ html.dark :is(
903
+ [class*="hover:bg-red-50"],
904
+ [class~="hover:bg-red-100"],
905
+ [class*="hover:bg-amber-50"],
906
+ [class~="hover:bg-amber-100"],
907
+ [class~="hover:bg-yellow-50"],
908
+ [class~="hover:bg-green-50"],
909
+ [class~="hover:bg-green-100"],
910
+ [class~="hover:bg-emerald-100"],
911
+ [class~="hover:bg-blue-50"],
912
+ [class~="hover:bg-rose-50"],
913
+ [class~="hover:bg-rose-100"]
914
+ ):hover {
915
+ background-color: var(--ou-surface-tertiary) !important;
916
+ }
917
+
918
+ html.dark [class*="hover:text-red-"]:hover,
919
+ html.dark .group:hover [class*="group-hover:text-red-"] {
920
+ color: #fca5a5 !important;
921
+ }
922
+
923
+ html.dark [class*="hover:text-amber-"]:hover,
924
+ html.dark .group:hover [class*="group-hover:text-amber-"] {
925
+ color: #fcd34d !important;
926
+ }
927
+
928
+ html.dark [class*="hover:text-green-"]:hover,
929
+ html.dark .group:hover [class*="group-hover:text-green-"],
930
+ html.dark [class*="hover:text-emerald-"]:hover,
931
+ html.dark .group:hover [class*="group-hover:text-emerald-"] {
932
+ color: #86efac !important;
933
+ }
934
+
935
+ html.dark [class*="hover:text-blue-"]:hover,
936
+ html.dark .group:hover [class*="group-hover:text-blue-"] {
937
+ color: #93c5fd !important;
938
+ }
939
+
940
+ html.dark [class*="hover:text-indigo-"]:hover,
941
+ html.dark .group:hover [class*="group-hover:text-indigo-"] {
942
+ color: #a5b4fc !important;
943
+ }
944
+
945
+ html.dark [class*="hover:text-violet-"]:hover,
946
+ html.dark [class*="hover:text-purple-"]:hover {
947
+ color: #c4b5fd !important;
948
+ }
949
+
950
+ html.dark [class*="hover:text-rose-"]:hover {
951
+ color: #fda4af !important;
952
+ }
953
+
954
+ html.dark [class*="focus:ring-indigo-"]:focus,
955
+ html.dark [class*="focus-visible:ring-indigo-"]:focus-visible {
956
+ --tw-ring-color: rgb(129 140 248 / 55%) !important;
957
+ }
958
+
959
+ html.dark [class*="focus:ring-red-"]:focus,
960
+ html.dark [class*="focus-visible:ring-red-"]:focus-visible {
961
+ --tw-ring-color: rgb(248 113 113 / 50%) !important;
962
+ }
963
+
964
+ html.dark [class*="focus:ring-blue-"]:focus,
965
+ html.dark [class*="focus:ring-emerald-"]:focus,
966
+ html.dark [class*="focus:ring-green-"]:focus {
967
+ --tw-ring-color: rgb(96 165 250 / 50%) !important;
968
+ }
969
+
970
+ html.dark :is(
971
+ [class*="hover:border-indigo-"],
972
+ [class*="focus:border-indigo-"]
973
+ ):hover,
974
+ html.dark [class*="focus:border-indigo-"]:focus {
975
+ border-color: #818cf8 !important;
976
+ }
977
+
978
+ html.dark :is(
979
+ .ring-indigo-50,
980
+ .ring-red-50,
981
+ .ring-blue-50,
982
+ .ring-green-50,
983
+ .ring-emerald-50,
984
+ .ring-amber-50,
985
+ .ring-yellow-50,
986
+ .ring-sky-50,
987
+ .ring-rose-50
988
+ ) {
989
+ --tw-ring-color: rgb(129 140 248 / 35%);
990
+ }
991
+
992
+ /* Native controls and browser-managed states. */
993
+ html.dark input,
994
+ html.dark textarea,
995
+ html.dark select,
996
+ html.dark option,
997
+ html.dark optgroup {
998
+ color-scheme: dark;
999
+ }
1000
+
1001
+ /* Switch thumbs are an affordance, not a surface, and must stay distinct. */
1002
+ html.dark button[role="switch"] > span.bg-white {
1003
+ background-color: #f8fafc !important;
1004
+ }
1005
+
1006
+ html.dark option,
1007
+ html.dark optgroup {
1008
+ background-color: var(--ou-surface-primary);
1009
+ color: var(--ou-text-primary);
1010
+ }
1011
+
1012
+ html.dark input:-webkit-autofill,
1013
+ html.dark input:-webkit-autofill:hover,
1014
+ html.dark input:-webkit-autofill:focus,
1015
+ html.dark textarea:-webkit-autofill,
1016
+ html.dark select:-webkit-autofill {
1017
+ -webkit-text-fill-color: var(--ou-text-primary);
1018
+ box-shadow: 0 0 0 1000px var(--ou-surface-primary) inset;
1019
+ caret-color: var(--ou-text-primary);
1020
+ }
1021
+
1022
+ html.dark {
1023
+ scrollbar-color: #475569 #0f172a;
1024
+ }
1025
+
1026
+ html.dark ::-webkit-scrollbar {
1027
+ width: 12px;
1028
+ height: 12px;
1029
+ }
1030
+
1031
+ html.dark ::-webkit-scrollbar-track {
1032
+ background: #0f172a;
1033
+ }
1034
+
1035
+ html.dark ::-webkit-scrollbar-thumb {
1036
+ background: #475569;
1037
+ border: 3px solid #0f172a;
1038
+ border-radius: 9999px;
1039
+ }
1040
+
1041
+ html.dark ::-webkit-scrollbar-thumb:hover {
1042
+ background: #64748b;
1043
+ }
1044
+
1045
+ /* Third-party portal and widget surfaces. */
1046
+ html.dark .tippy-box[data-theme~="light-border"] {
1047
+ background-color: var(--ou-surface-primary);
1048
+ color: var(--ou-text-secondary);
1049
+ border-color: var(--ou-border-strong);
1050
+ box-shadow: 0 12px 28px rgb(0 0 0 / 45%);
1051
+ }
1052
+
1053
+ html.dark .tippy-box[data-theme~="light-border"] > .tippy-backdrop {
1054
+ background-color: var(--ou-surface-primary);
1055
+ }
1056
+
1057
+ html.dark
1058
+ .tippy-box[data-theme~="light-border"][data-placement^="top"]
1059
+ > .tippy-arrow::before {
1060
+ border-top-color: var(--ou-surface-primary);
1061
+ }
1062
+
1063
+ html.dark
1064
+ .tippy-box[data-theme~="light-border"][data-placement^="top"]
1065
+ > .tippy-arrow::after {
1066
+ border-top-color: var(--ou-border-strong);
1067
+ }
1068
+
1069
+ html.dark
1070
+ .tippy-box[data-theme~="light-border"][data-placement^="bottom"]
1071
+ > .tippy-arrow::before {
1072
+ border-bottom-color: var(--ou-surface-primary);
1073
+ }
1074
+
1075
+ html.dark
1076
+ .tippy-box[data-theme~="light-border"][data-placement^="bottom"]
1077
+ > .tippy-arrow::after {
1078
+ border-bottom-color: var(--ou-border-strong);
1079
+ }
1080
+
1081
+ html.dark
1082
+ .tippy-box[data-theme~="light-border"][data-placement^="left"]
1083
+ > .tippy-arrow::before {
1084
+ border-left-color: var(--ou-surface-primary);
1085
+ }
1086
+
1087
+ html.dark
1088
+ .tippy-box[data-theme~="light-border"][data-placement^="left"]
1089
+ > .tippy-arrow::after {
1090
+ border-left-color: var(--ou-border-strong);
1091
+ }
1092
+
1093
+ html.dark
1094
+ .tippy-box[data-theme~="light-border"][data-placement^="right"]
1095
+ > .tippy-arrow::before {
1096
+ border-right-color: var(--ou-surface-primary);
1097
+ }
1098
+
1099
+ html.dark
1100
+ .tippy-box[data-theme~="light-border"][data-placement^="right"]
1101
+ > .tippy-arrow::after {
1102
+ border-right-color: var(--ou-border-strong);
1103
+ }
1104
+
1105
+ html.dark .tippy-box[data-theme~="light-border"] > .tippy-svg-arrow {
1106
+ fill: var(--ou-surface-primary);
1107
+ }
1108
+
1109
+ html.dark :is(.ou-select__control, .ou-select__menu) {
1110
+ background-color: var(--ou-surface-primary) !important;
1111
+ border-color: var(--ou-border-default) !important;
1112
+ color: var(--ou-text-primary) !important;
1113
+ }
1114
+
1115
+ html.dark :is(.ou-select__input-container, .ou-select__single-value) {
1116
+ color: var(--ou-text-primary) !important;
1117
+ }
1118
+
1119
+ html.dark .ou-select__placeholder {
1120
+ color: var(--ou-text-subtle) !important;
1121
+ }
1122
+
1123
+ html.dark .ou-select__option {
1124
+ background-color: var(--ou-surface-primary) !important;
1125
+ color: var(--ou-text-secondary) !important;
1126
+ }
1127
+
1128
+ html.dark .ou-select__option--is-focused {
1129
+ background-color: var(--ou-accent-soft) !important;
1130
+ color: #c7d2fe !important;
1131
+ }
1132
+
1133
+ html.dark .ou-select__option--is-selected {
1134
+ background-color: var(--ou-accent-muted) !important;
1135
+ color: #e0e7ff !important;
1136
+ }
1137
+
1138
+ html.dark .ou-select__multi-value {
1139
+ background-color: var(--ou-accent-soft) !important;
1140
+ border-color: rgb(129 140 248 / 45%) !important;
1141
+ }
1142
+
1143
+ html.dark .ou-select__multi-value__label {
1144
+ color: #c7d2fe !important;
1145
+ }
1146
+
1147
+ html.dark .ou-select__indicator {
1148
+ color: var(--ou-text-subtle) !important;
1149
+ }
1150
+
1151
+ html.dark .ou-select__indicator:hover {
1152
+ color: var(--ou-text-primary) !important;
1153
+ }
1154
+
1155
+ html.dark .ou-select__indicator-separator {
1156
+ background-color: var(--ou-border-default) !important;
1157
+ }
1158
+
1159
+ html.dark .ou-select__menu-notice {
1160
+ color: var(--ou-text-subtle) !important;
1161
+ }
1162
+
1163
+ html.dark .ou-select__control--is-focused {
1164
+ border-color: #818cf8 !important;
1165
+ box-shadow: 0 0 0 1px #818cf8 !important;
1166
+ }
1167
+
1168
+ html.dark .ou-select__control--is-disabled {
1169
+ background-color: var(--ou-surface-secondary) !important;
1170
+ color: var(--ou-text-subtle) !important;
1171
+ }
1172
+
1173
+ html.dark :is(.react-flow, .react-flow__renderer) {
1174
+ background-color: var(--ou-background-primary);
1175
+ }
1176
+
1177
+ html.dark :is(.react-flow__node-default, .react-flow__node-input, .react-flow__node-output) {
1178
+ background-color: var(--ou-surface-primary);
1179
+ border-color: var(--ou-border-default);
1180
+ color: var(--ou-text-primary);
1181
+ }
1182
+
1183
+ html.dark :is(.react-flow__controls, .react-flow__minimap) {
1184
+ background: var(--ou-surface-primary) !important;
1185
+ border-color: var(--ou-border-default) !important;
1186
+ }
1187
+
1188
+ html.dark .react-flow__controls-button {
1189
+ background: var(--ou-surface-primary) !important;
1190
+ border-color: var(--ou-border-default) !important;
1191
+ color: var(--ou-text-secondary) !important;
1192
+ fill: var(--ou-text-secondary) !important;
1193
+ }
1194
+
1195
+ html.dark .react-flow__controls-button:hover {
1196
+ background: var(--ou-surface-secondary) !important;
1197
+ }
1198
+
1199
+ html.dark .react-flow__controls-button svg {
1200
+ fill: currentColor;
1201
+ }
1202
+
1203
+ html.dark .chrome-picker {
1204
+ background-color: var(--ou-surface-primary) !important;
1205
+ color: var(--ou-text-primary) !important;
1206
+ box-shadow: 0 8px 24px rgb(0 0 0 / 45%) !important;
1207
+ }
1208
+
1209
+ html.dark .chrome-picker input {
1210
+ background-color: var(--ou-surface-secondary) !important;
1211
+ color: var(--ou-text-primary) !important;
1212
+ box-shadow: inset 0 0 0 1px var(--ou-border-default) !important;
1213
+ }
1214
+
1215
+ html.dark .chrome-picker svg {
1216
+ color: var(--ou-text-secondary) !important;
1217
+ fill: var(--ou-text-secondary) !important;
1218
+ }
1219
+
1220
+ /* React Big Calendar ships a light-only skin; these remain wrapper-scoped. */
1221
+ html.dark .oneuptime-calendar .rbc-calendar,
1222
+ html.dark .oneuptime-calendar .rbc-toolbar-label,
1223
+ html.dark .oneuptime-calendar .rbc-date-cell,
1224
+ html.dark .oneuptime-calendar .rbc-agenda-view table,
1225
+ html.dark .oneuptime-calendar .rbc-agenda-date-cell,
1226
+ html.dark .oneuptime-calendar .rbc-agenda-time-cell {
1227
+ color: var(--ou-text-secondary);
1228
+ }
1229
+
1230
+ html.dark .oneuptime-calendar :is(
1231
+ .rbc-month-view,
1232
+ .rbc-time-view,
1233
+ .rbc-agenda-view,
1234
+ .rbc-toolbar .rbc-btn-group,
1235
+ .rbc-time-content,
1236
+ .rbc-day-bg,
1237
+ .rbc-timeslot-group
1238
+ ) {
1239
+ background-color: var(--ou-surface-primary);
1240
+ border-color: var(--ou-border-default);
1241
+ }
1242
+
1243
+ html.dark .oneuptime-calendar :is(
1244
+ .rbc-header,
1245
+ .rbc-off-range-bg,
1246
+ .rbc-toolbar button:hover,
1247
+ .rbc-toolbar button:focus,
1248
+ .rbc-agenda-view thead > tr > th
1249
+ ) {
1250
+ background-color: var(--ou-surface-secondary);
1251
+ border-color: var(--ou-border-default);
1252
+ color: var(--ou-text-muted);
1253
+ }
1254
+
1255
+ html.dark .oneuptime-calendar .rbc-today {
1256
+ background-color: var(--ou-accent-soft);
1257
+ }
1258
+
1259
+ html.dark .oneuptime-calendar .rbc-toolbar button {
1260
+ background-color: var(--ou-surface-primary);
1261
+ border-color: var(--ou-border-default);
1262
+ color: var(--ou-text-secondary);
1263
+ }
1264
+
1265
+ html.dark .oneuptime-calendar .rbc-toolbar button.rbc-active {
1266
+ background-color: var(--ou-accent-soft);
1267
+ border-color: var(--ou-border-strong);
1268
+ color: var(--ou-accent-text);
1269
+ }
1270
+
1271
+ html.dark .oneuptime-calendar :is(.rbc-off-range, .rbc-label) {
1272
+ color: var(--ou-text-subtle);
1273
+ }
1274
+
1275
+ html.dark .oneuptime-calendar .rbc-show-more {
1276
+ background-color: var(--ou-surface-secondary);
1277
+ color: var(--ou-link);
1278
+ }
1279
+
1280
+ html.dark .oneuptime-calendar .rbc-current-time-indicator {
1281
+ background-color: #818cf8;
1282
+ }
1283
+
1284
+ html.dark .oneuptime-calendar :is(
1285
+ .rbc-month-row,
1286
+ .rbc-day-bg,
1287
+ .rbc-header,
1288
+ .rbc-time-header-content,
1289
+ .rbc-time-slot,
1290
+ .rbc-timeslot-group,
1291
+ td,
1292
+ th
1293
+ ) {
1294
+ border-color: var(--ou-border-default) !important;
1295
+ }
1296
+
1297
+ /* SVG/Recharts literals used by older widgets. */
1298
+ html.dark svg :is(
1299
+ [stroke="#f1f5f9"],
1300
+ [stroke="#e2e8f0"],
1301
+ [stroke="#e5e7eb"],
1302
+ [stroke="#d1d5db"]
1303
+ ) {
1304
+ stroke: var(--ou-chart-grid) !important;
1305
+ }
1306
+
1307
+ html.dark svg :is([fill="#94a3b8"], [fill="#6b7280"]) {
1308
+ fill: var(--ou-chart-tick) !important;
1309
+ }
1310
+
1311
+ html.dark :fullscreen,
1312
+ html.dark ::backdrop {
1313
+ background-color: var(--ou-background-primary);
1314
+ }