Skip to content

Commit b4d4e62

Browse files
authored
Merge pull request #925 from buildo/search-bar-layout
Use flex positioning for SearchBar accessories to fix SSR glitches
2 parents 424cb3e + 65e9689 commit b4d4e62

File tree

2 files changed

+27
-52
lines changed

2 files changed

+27
-52
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,20 @@
11
import { style } from "@vanilla-extract/css";
2+
import { bentoSprinkles } from "../internal";
23

3-
export const input = style({
4-
selectors: {
5-
[`&::-webkit-search-decoration,
4+
export const input = style([
5+
bentoSprinkles({
6+
outline: "none",
7+
}),
8+
{
9+
selectors: {
10+
[`&::-webkit-search-decoration,
611
&::-webkit-search-cancel-button,
712
&::-webkit-search-results-button,
813
&::-webkit-search-results-decoration`]: {
9-
WebkitAppearance: "none",
14+
WebkitAppearance: "none",
15+
},
1016
},
1117
},
12-
});
18+
]);
19+
20+
export const inputContainer = style({});

packages/bento-design-system/src/SearchBar/SearchBar.tsx

+14-47
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
import { useTextField } from "@react-aria/textfield";
22
import { HTMLAttributes, useRef } from "react";
3-
import useDimensions from "react-cool-dimensions";
43
import { LocalizedString, Box, Field, IconButton } from "..";
54
import { inputRecipe } from "../Field/Field.css";
65
import { bodyRecipe } from "../Typography/Body/Body.css";
7-
import { input } from "./SearchBar.css";
6+
import { input, inputContainer } from "./SearchBar.css";
87
import { useDefaultMessages } from "../util/useDefaultMessages";
98
import { useBentoConfig } from "../BentoConfigContext";
109
import { AtLeast } from "../util/AtLeast";
@@ -25,16 +24,6 @@ export function SearchBar(props: Props) {
2524
const config = useBentoConfig().searchBar;
2625
const inputRef = useRef<HTMLInputElement>(null);
2726

28-
const { observe: leftAccessoryRef, width: leftAccessoryWidth } = useDimensions({
29-
// This is needed to include the padding in the width calculation
30-
useBorderBoxSize: true,
31-
});
32-
33-
const { observe: rightAccessoryRef, width: rightAccessoryWidth } = useDimensions({
34-
// This is needed to include the padding in the width calculation
35-
useBorderBoxSize: true,
36-
});
37-
3827
const { labelProps, inputProps, descriptionProps, errorMessageProps } = useTextField(
3928
{
4029
...props,
@@ -64,19 +53,17 @@ export function SearchBar(props: Props) {
6453
assistiveTextProps={descriptionProps}
6554
errorMessageProps={errorMessageProps}
6655
>
67-
<Box position="relative" display="flex">
68-
<Box
69-
ref={leftAccessoryRef}
70-
position="absolute"
71-
display="flex"
72-
justifyContent="center"
73-
alignItems="center"
74-
paddingLeft={config.paddingX}
75-
paddingRight={config.internalSpacing}
76-
top={0}
77-
bottom={0}
78-
left={0}
79-
>
56+
<Box
57+
display="flex"
58+
className={[inputRecipe({ validation: "valid" }), inputContainer]}
59+
gap={config.internalSpacing}
60+
paddingX={config.paddingX}
61+
background={config.background.default}
62+
paddingY={config.paddingY}
63+
{...getRadiusPropsFromConfig(config.radius)}
64+
style={getReadOnlyBackgroundStyle(config)}
65+
>
66+
<Box display="flex" justifyContent="center" alignItems="center">
8067
{config.searchIcon({ size: config.searchIconSize })}
8168
</Box>
8269
<Box
@@ -90,7 +77,6 @@ export function SearchBar(props: Props) {
9077
height={undefined}
9178
className={[
9279
input,
93-
inputRecipe({ validation: "valid" }),
9480
bodyRecipe({
9581
color: props.disabled ? "disabled" : "primary",
9682
weight: "default",
@@ -99,29 +85,10 @@ export function SearchBar(props: Props) {
9985
}),
10086
]}
10187
display="flex"
102-
style={{
103-
flexGrow: 1,
104-
paddingLeft: leftAccessoryWidth,
105-
paddingRight: rightAccessoryWidth,
106-
...getReadOnlyBackgroundStyle(config),
107-
}}
108-
{...getRadiusPropsFromConfig(config.radius)}
109-
paddingY={config.paddingY}
110-
background={config.background.default}
88+
flexGrow={1}
11189
/>
11290
{rightAccessoryContent && (
113-
<Box
114-
ref={rightAccessoryRef}
115-
position="absolute"
116-
display="flex"
117-
justifyContent="center"
118-
alignItems="center"
119-
paddingLeft={config.internalSpacing}
120-
paddingRight={config.paddingX}
121-
top={0}
122-
bottom={0}
123-
right={0}
124-
>
91+
<Box display="flex" justifyContent="center" alignItems="center">
12592
{rightAccessoryContent}
12693
</Box>
12794
)}

0 commit comments

Comments
 (0)