Skip to content

Commit 8fce25d

Browse files
Dark mode polish (#19370)
* Dark mode polish * Linting * pr feedback * pr feedback * PR feedback, linting * PR review, code cleanup * Update select-styles.ts
1 parent 4319cbc commit 8fce25d

File tree

7 files changed

+254
-7
lines changed

7 files changed

+254
-7
lines changed

packages/connect-react/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
"dist"
77
],
88
"type": "module",
9+
"main": "./dist/connect-react.umd.js",
910
"browser": "./dist/connect-react.umd.js",
1011
"module": "./dist/connect-react.es.js",
1112
"types": "./dist/connect-react.umd.d.ts",

packages/connect-react/src/components/ControlApp.tsx

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,14 @@ import { useFrontendClient } from "../hooks/frontend-client-context";
33
import { useAccounts } from "../hooks/use-accounts";
44
import { useFormFieldContext } from "../hooks/form-field-context";
55
import { useFormContext } from "../hooks/form-context";
6-
import { useCustomize } from "../hooks/customization-context";
7-
import type { BaseReactSelectProps } from "../hooks/customization-context";
6+
import {
7+
useCustomize,
8+
type BaseReactSelectProps,
9+
} from "../hooks/customization-context";
10+
import {
11+
createBaseSelectStyles,
12+
resolveSelectColors,
13+
} from "../utils/select-styles";
814
import { useMemo } from "react";
915
import type { CSSProperties } from "react";
1016
import type { OptionProps } from "react-select";
@@ -49,6 +55,16 @@ export function ControlApp({ app }: ControlAppProps) {
4955
getProps, select, theme,
5056
} = useCustomize();
5157

58+
const {
59+
surface,
60+
border,
61+
text,
62+
textStrong,
63+
hoverBg,
64+
selectedBg,
65+
selectedHoverBg,
66+
} = resolveSelectColors(theme.colors);
67+
5268
const baseStyles: CSSProperties = {
5369
color: theme.colors.neutral60,
5470
gridArea: "control",
@@ -63,15 +79,28 @@ export function ControlApp({ app }: ControlAppProps) {
6379
gridArea: "control",
6480
};
6581

82+
const selectStyles = createBaseSelectStyles<SelectValue>({
83+
colors: {
84+
surface,
85+
border,
86+
text,
87+
textStrong,
88+
hoverBg,
89+
selectedBg,
90+
selectedHoverBg,
91+
},
92+
boxShadow: theme.boxShadow,
93+
});
94+
6695
const baseSelectProps: BaseReactSelectProps<SelectValue> = {
6796
components: {
6897
Option: BaseOption,
6998
},
7099
styles: {
71-
control: (base) => ({
72-
...base,
100+
...selectStyles,
101+
control: (base, state) => ({
102+
...(selectStyles.control?.(base, state) ?? base),
73103
gridArea: "control",
74-
boxShadow: theme.boxShadow.input,
75104
}),
76105
},
77106
};

packages/connect-react/src/components/SelectApp.tsx

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,14 @@ import type {
66
MenuListProps, OptionProps, SingleValueProps,
77
} from "react-select";
88
import { useApps } from "../hooks/use-apps";
9+
import {
10+
useCustomize,
11+
type BaseReactSelectProps,
12+
} from "../hooks/customization-context";
13+
import {
14+
createBaseSelectStyles,
15+
resolveSelectColors,
16+
} from "../utils/select-styles";
917
import type {
1018
App,
1119
AppsListRequest,
@@ -62,6 +70,9 @@ export function SelectApp({
6270
SingleValue,
6371
MenuList,
6472
} = components;
73+
const {
74+
select, theme,
75+
} = useCustomize();
6576
const isLoadingMoreRef = useRef(isLoadingMore);
6677
isLoadingMoreRef.current = isLoadingMore;
6778

@@ -87,6 +98,34 @@ export function SelectApp({
8798
loadMore,
8899
]);
89100

101+
const {
102+
surface,
103+
border,
104+
text,
105+
textStrong,
106+
hoverBg,
107+
selectedBg,
108+
selectedHoverBg,
109+
appIconBg,
110+
} = resolveSelectColors(theme.colors);
111+
112+
const baseSelectProps: BaseReactSelectProps<App> = {
113+
styles: createBaseSelectStyles<App>({
114+
colors: {
115+
surface,
116+
border,
117+
text,
118+
textStrong,
119+
hoverBg,
120+
selectedBg,
121+
selectedHoverBg,
122+
},
123+
boxShadow: theme.boxShadow,
124+
}),
125+
};
126+
127+
const selectProps = select.getProps("selectApp", baseSelectProps);
128+
90129
// Memoize custom components to prevent remounting
91130
const customComponents = useMemo(() => ({
92131
Option: (optionProps: OptionProps<App>) => (
@@ -100,6 +139,9 @@ export function SelectApp({
100139
style={{
101140
height: 24,
102141
width: 24,
142+
backgroundColor: appIconBg,
143+
borderRadius: 6,
144+
padding: 2,
103145
}}
104146
alt={optionProps.data.name}
105147
/>
@@ -121,6 +163,9 @@ export function SelectApp({
121163
style={{
122164
height: 24,
123165
width: 24,
166+
backgroundColor: appIconBg,
167+
borderRadius: 6,
168+
padding: 2,
124169
}}
125170
alt={singleValueProps.data.name}
126171
/>
@@ -152,13 +197,18 @@ export function SelectApp({
152197
Option,
153198
SingleValue,
154199
MenuList,
200+
appIconBg,
155201
]);
156202
return (
157203
<Select
158204
instanceId={instanceId}
159205
className="react-select-container text-sm"
206+
{...selectProps}
160207
classNamePrefix="react-select"
161-
components={customComponents}
208+
components={{
209+
...selectProps.components,
210+
...customComponents,
211+
}}
162212
options={apps || []}
163213
getOptionLabel={(o: App) => o.name || o.nameSlug}
164214
getOptionValue={(o: App) => o.nameSlug}
@@ -179,6 +229,7 @@ export function SelectApp({
179229
}
180230
menuPosition="fixed"
181231
styles={{
232+
...(selectProps.styles ?? {}),
182233
menuPortal: (base) => ({
183234
...base,
184235
zIndex: 99999,

packages/connect-react/src/components/SelectComponent.tsx

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,14 @@ import {
1111
import Select, { components } from "react-select";
1212
import type { MenuListProps } from "react-select";
1313
import { useComponents } from "../hooks/use-components";
14+
import {
15+
useCustomize,
16+
type BaseReactSelectProps,
17+
} from "../hooks/customization-context";
18+
import {
19+
createBaseSelectStyles,
20+
resolveSelectColors,
21+
} from "../utils/select-styles";
1422

1523
type SelectComponentProps = {
1624
app?: Partial<App> & { nameSlug: string; };
@@ -38,6 +46,20 @@ export function SelectComponent({
3846
});
3947

4048
const { MenuList } = components;
49+
const {
50+
select, theme,
51+
} = useCustomize();
52+
53+
const {
54+
surface,
55+
border,
56+
text,
57+
textStrong,
58+
hoverBg,
59+
selectedBg,
60+
selectedHoverBg,
61+
} = resolveSelectColors(theme.colors);
62+
4163
const isLoadingMoreRef = useRef(isLoadingMore);
4264
isLoadingMoreRef.current = isLoadingMore;
4365

@@ -60,6 +82,23 @@ export function SelectComponent({
6082
loadMore,
6183
]);
6284

85+
const baseSelectProps: BaseReactSelectProps<Component> = {
86+
styles: createBaseSelectStyles<Component>({
87+
colors: {
88+
surface,
89+
border,
90+
text,
91+
textStrong,
92+
hoverBg,
93+
selectedBg,
94+
selectedHoverBg,
95+
},
96+
boxShadow: theme.boxShadow,
97+
}),
98+
};
99+
100+
const selectProps = select.getProps("selectComponent", baseSelectProps);
101+
63102
// Memoize custom components to prevent remounting
64103
const customComponents = useMemo(() => ({
65104
MenuList: (props: MenuListProps<Component>) => (
@@ -89,6 +128,7 @@ export function SelectComponent({
89128
<Select
90129
instanceId={instanceId}
91130
className="react-select-container text-sm"
131+
{...selectProps}
92132
classNamePrefix="react-select"
93133
options={componentsList}
94134
getOptionLabel={(o) => o.name || o.key}
@@ -97,14 +137,18 @@ export function SelectComponent({
97137
onChange={(o) => onChange?.((o as Component) || undefined)}
98138
onMenuScrollToBottom={handleMenuScrollToBottom}
99139
isLoading={isLoading}
100-
components={customComponents}
140+
components={{
141+
...selectProps.components,
142+
...customComponents,
143+
}}
101144
menuPortalTarget={
102145
typeof document !== "undefined"
103146
? document.body
104147
: null
105148
}
106149
menuPosition="fixed"
107150
styles={{
151+
...(selectProps.styles ?? {}),
108152
menuPortal: (base) => ({
109153
...base,
110154
zIndex: 99999,

packages/connect-react/src/hooks/customization-context.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ export const defaultComponents = {
5454
export type ReactSelectComponents = {
5555
controlAppSelect: typeof ControlApp;
5656
controlSelect: typeof ControlSelect;
57+
selectApp: typeof ControlApp;
58+
selectComponent: typeof ControlSelect;
5759
};
5860

5961
export type CustomComponents<Option, IsMulti extends boolean, Group extends GroupBase<Option>> = {

packages/connect-react/src/theme.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,17 @@ export type Colors = {
5959
// select.singleValue:color
6060
neutral80: string;
6161
neutral90: string;
62+
63+
// Option state backgrounds (dark mode friendly)
64+
// select.option:hover:backgroundColor
65+
optionHover?: string;
66+
// select.option:selected:backgroundColor
67+
optionSelected?: string;
68+
// select.option:selected:hover:backgroundColor
69+
optionSelectedHover?: string;
70+
71+
// App icon background color (for visibility in dark mode)
72+
appIconBackground?: string;
6273
};
6374

6475
export type Shadows = {

0 commit comments

Comments
 (0)