···11"use client";
2233+import * as stylex from "@stylexjs/stylex";
34import {
45 Button as AriaButton,
56 ButtonProps as AriaButtonProps,
67} from "react-aria-components";
77-import * as stylex from "@stylexjs/stylex";
8899import { useButtonStyles } from "../theme/useButtonStyles";
1010import { Size, ButtonVariant } from "../types";
+3-3
apps/example/src/components/card/index.tsx
···11import * as stylex from "@stylexjs/stylex";
2233-import { gray } from "../theme/semantic-color.stylex";
33+import { Flex } from "../flex";
44import { radius } from "../theme/radius.stylex";
55+import { gray } from "../theme/semantic-color.stylex";
56import { spacing } from "../theme/spacing.stylex";
67import { fontFamily, fontSize, fontWeight } from "../theme/typography.stylex";
77-import { Flex } from "../flex";
8899const styles = stylex.create({
1010 card: {
···6969 return (
7070 <Flex
7171 {...props}
7272- style={[styles.cardHeader, style]}
7272+ style={[styles.cardHeader as unknown as stylex.StyleXStyles, style]}
7373 direction="column"
7474 gap="3"
7575 />
+9-8
apps/example/src/components/checkbox/index.tsx
···33 CheckboxGroupProps as AriaCheckboxGroupProps,
44 ValidationResult,
55} from "react-aria-components";
66+77+import * as stylex from "@stylexjs/stylex";
88+import { Check, Minus } from "lucide-react";
69import {
710 Checkbox as AriaCheckbox,
811 CheckboxGroup as AriaCheckboxGroup,
912 FieldError,
1013} from "react-aria-components";
1111-import * as stylex from "@stylexjs/stylex";
1212-import { Check, Minus } from "lucide-react";
13141414-import { spacing } from "../theme/spacing.stylex";
1515+import { Flex } from "../flex";
1616+import { Description, Label } from "../label";
1517import { radius } from "../theme/radius.stylex";
1618import { gray, primary } from "../theme/semantic-color.stylex";
1919+import { spacing } from "../theme/spacing.stylex";
1720import { fontFamily, fontSize, lineHeight } from "../theme/typography.stylex";
1818-import { Flex } from "../flex";
1919-import { Description, Label } from "../label";
2021import { Size } from "../types";
21222223const styles = stylex.create({
···7475}: CheckboxGroupProps) {
7576 return (
7677 <AriaCheckboxGroup {...props} {...stylex.props(styles.group, style)}>
7777- {label && <Label size={size}>{label}</Label>}
7878+ {label !== null && <Label size={size}>{label}</Label>}
7879 <Flex direction="column" gap="2">
7980 {children}
8081 </Flex>
···102103 ? [gray.bgSolid, gray.border, styles.checked]
103104 : isSelected
104105 ? [primary.bgSolid, primary.borderInteractive, styles.checked]
105105- : [gray.borderInteractive]
106106+ : [gray.borderInteractive],
106107 )}
107108 >
108109 {isIndeterminate ? (
···111112 <Check size={16} />
112113 ) : null}
113114 </div>
114114- {children && (
115115+ {children !== null && (
115116 <Flex direction="column" gap="1">
116117 {children}
117118 </Flex>
+19-7
apps/example/src/components/color-field/index.tsx
···11+import * as stylex from "@stylexjs/stylex";
22+import { useRef } from "react";
13import {
24 ColorFieldProps as AriaColorFieldProps,
35 Input,
···68 FieldError,
79 ColorField as AriaColorField,
810} from "react-aria-components";
99-import * as stylex from "@stylexjs/stylex";
1111+1012import { Description, Label } from "../label";
1111-import { useRef } from "react";
1313+import { useInputStyles } from "../theme/useInputStyles";
1214import { Size } from "../types";
1313-import { useInputStyles } from "../theme/useInputStyles";
14151516export interface ColorFieldProps
1617 extends Omit<AriaColorFieldProps, "style" | "className">,
···40414142 return (
4243 <AriaColorField {...props} {...stylex.props(inputStyles.field, style)}>
4343- <Label size={size}>{label}</Label>
4444+ {label !== null && <Label size={size}>{label}</Label>}
4545+ {/*
4646+ This onClick is specifically for mouse users not clicking directly on the input.
4747+ A keyboard user would not encounter the same issue.
4848+ */}
4949+ {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions */}
4450 <div
4551 {...stylex.props(inputStyles.wrapper)}
4652 onClick={() => inputRef.current?.focus()}
4753 >
4848- {prefix && <div {...stylex.props(inputStyles.addon)}>{prefix}</div>}
5454+ {prefix !== null && (
5555+ <div {...stylex.props(inputStyles.addon)}>{prefix}</div>
5656+ )}
4957 <Input
5058 placeholder={placeholder}
5159 ref={inputRef}
5260 {...stylex.props(inputStyles.input)}
5361 />
5454- {suffix && <div {...stylex.props(inputStyles.addon)}>{suffix}</div>}
6262+ {suffix !== null && (
6363+ <div {...stylex.props(inputStyles.addon)}>{suffix}</div>
6464+ )}
5565 </div>
5656- {description && <Description size={size}>{description}</Description>}
6666+ {description !== undefined && (
6767+ <Description size={size}>{description}</Description>
6868+ )}
5769 <FieldError>{errorMessage}</FieldError>
5870 </AriaColorField>
5971 );
+33-35
apps/example/src/components/combobox/index.tsx
···11+import type { ListBoxProps, ValidationResult } from "react-aria-components";
22+33+import * as stylex from "@stylexjs/stylex";
44+import { ChevronDown } from "lucide-react";
55+import { use } from "react";
16import {
27 Button,
38 Popover,
···510 ComboBox as AriaComboBox,
611 ComboBoxProps as AriaComboBoxProps,
712 Input,
1313+ FieldError,
814} from "react-aria-components";
99-import * as stylex from "@stylexjs/stylex";
1010-import type {
1111- ListBoxProps,
1212- ListBoxSectionProps,
1313- ValidationResult,
1414-} from "react-aria-components";
1515-import { FieldError } from "react-aria-components";
1616-import { Description, Label } from "../label";
1717-import { ChevronDown } from "lucide-react";
1818-import { Size } from "../types";
1919-import {
2020- ListBox,
2121- ListBoxItem,
2222- ListBoxItemProps,
2323- ListBoxSectionHeaderProps,
2424- ListBoxSectionHeader,
2525- ListBoxSeparatorProps,
2626- ListBoxSeparator,
2727- ListBoxSection,
2828-} from "../listbox";
1515+2916import { SizeContext } from "../context";
1717+import { IconButton } from "../icon-button";
1818+import { Description, Label } from "../label";
1919+import { ListBox } from "../listbox";
2020+import { spacing } from "../theme/spacing.stylex";
3021import { useInputStyles } from "../theme/useInputStyles";
3122import { usePopoverStyles } from "../theme/usePopoverStyles";
3232-import { IconButton } from "../icon-button";
2323+import { Size } from "../types";
3324import { SmallBody } from "../typography";
3434-import { spacing } from "../theme/spacing.stylex";
3535-import { use } from "react";
36253726const styles = stylex.create({
3827 matchWidth: {
···9887 const popoverStyles = usePopoverStyles();
998810089 return (
101101- <SizeContext.Provider value={size}>
9090+ <SizeContext value={size}>
10291 <AriaComboBox {...props} {...stylex.props(inputStyles.field, style)}>
10392 {label && <Label size={size}>{label}</Label>}
10493 <Button {...stylex.props(inputStyles.wrapper)}>
105105- {prefix && <div {...stylex.props(inputStyles.addon)}>{prefix}</div>}
9494+ {prefix !== null && (
9595+ <div {...stylex.props(inputStyles.addon)}>{prefix}</div>
9696+ )}
10697 <Input
10798 {...stylex.props(inputStyles.input)}
10899 placeholder={placeholder}
109100 />
110110- {suffix && <div {...stylex.props(inputStyles.addon)}>{suffix}</div>}
101101+ {suffix !== null && (
102102+ <div {...stylex.props(inputStyles.addon)}>{suffix}</div>
103103+ )}
111104 <div {...stylex.props(inputStyles.addon)}>
112105 <IconButton size="sm" variant="secondary" label="Open combobox">
113106 <ChevronDown size={16} aria-hidden="true" />
···132125 </ListBox>
133126 </Popover>
134127 </AriaComboBox>
135135- </SizeContext.Provider>
128128+ </SizeContext>
136129 );
137130}
138131139139-export type ComboBoxItemProps = ListBoxItemProps;
140140-export const ComboBoxItem = ListBoxItem;
141141-export type ComboBoxSectionProps<T extends object> = ListBoxSectionProps<T>;
142142-export const ComboBoxSection = ListBoxSection;
143143-export type ComboBoxSectionHeaderProps = ListBoxSectionHeaderProps;
144144-export const ComboBoxSectionHeader = ListBoxSectionHeader;
145145-export type ComboBoxSeparatorProps = ListBoxSeparatorProps;
146146-export const ComboBoxSeparator = ListBoxSeparator;
132132+export type {
133133+ ListBoxItemProps as ComboBoxItemProps,
134134+ ListBoxSectionProps as ComboBoxSectionProps,
135135+ ListBoxSectionHeaderProps as ComboBoxSectionHeaderProps,
136136+ ListBoxSeparatorProps as ComboBoxSeparatorProps,
137137+} from "../listbox";
138138+139139+export {
140140+ ListBoxItem as ComboBoxItem,
141141+ ListBoxSection as ComboBoxSection,
142142+ ListBoxSectionHeader as ComboBoxSectionHeader,
143143+ ListBoxSeparator as ComboBoxSeparator,
144144+} from "../listbox";
···11+import * as stylex from "@stylexjs/stylex";
22+import { SearchIcon, X } from "lucide-react";
33+import { useRef } from "react";
14import {
25 SearchFieldProps as AriaSearchFieldProps,
36 Input,
···69 FieldError,
710 SearchField as AriaSearchField,
811} from "react-aria-components";
99-import * as stylex from "@stylexjs/stylex";
1212+1313+import { IconButton } from "../icon-button";
1014import { Description, Label } from "../label";
1111-import { useRef } from "react";
1212-import { Size } from "../types";
1515+import { spacing } from "../theme/spacing.stylex";
1316import { useInputStyles } from "../theme/useInputStyles";
1414-import { SearchIcon, X } from "lucide-react";
1515-import { IconButton } from "../icon-button";
1616-import { spacing } from "../theme/spacing.stylex";
1717+import { Size } from "../types";
17181819const styles = stylex.create({
1920 wrapper: {
···4142 prefix?: React.ReactNode;
4243 suffix?: React.ReactNode;
4344}
4545+4646+const defaultPrefix = <SearchIcon />;
44474548export function SearchField({
4649 label,
···4851 errorMessage,
4952 style,
5053 size,
5151- prefix = <SearchIcon />,
5454+ prefix = defaultPrefix,
5255 suffix,
5356 placeholder,
5457 ...props
···6164 {({ isEmpty }) => {
6265 return (
6366 <>
6464- {label && <Label size={size}>{label}</Label>}
6767+ {label !== null && <Label size={size}>{label}</Label>}
6868+ {/*
6969+ This onClick is specifically for mouse users not clicking directly on the input.
7070+ A keyboard user would not encounter the same issue.
7171+ */}
7272+ {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions */}
6573 <div
6674 {...stylex.props(inputStyles.wrapper, styles.wrapper)}
6775 onClick={() => inputRef.current?.focus()}
6876 >
6969- {prefix && (
7777+ {prefix !== null && (
7078 <div {...stylex.props(inputStyles.addon)}>{prefix}</div>
7179 )}
7280 <Input
···7482 ref={inputRef}
7583 {...stylex.props(
7684 inputStyles.input,
7777- !isEmpty && styles.clearButtonPadding
8585+ !isEmpty && styles.clearButtonPadding,
7886 )}
7987 />
8080- {suffix && (
8888+ {suffix !== null && (
8189 <div {...stylex.props(inputStyles.addon)}>{suffix}</div>
8290 )}
8391 {!isEmpty && (
+32-33
apps/example/src/components/select/index.tsx
···11+import type { ValidationResult } from "react-aria-components";
22+33+import * as stylex from "@stylexjs/stylex";
44+import { ChevronDown } from "lucide-react";
55+import { use } from "react";
16import {
27 SelectProps as AriaSelectProps,
38 Button,
49 Popover,
510 SelectValue,
611 PopoverProps,
77-} from "react-aria-components";
88-import { Select as AriaSelect } from "react-aria-components";
99-import * as stylex from "@stylexjs/stylex";
1010-import type {
1111- ListBoxSectionProps,
1212- ValidationResult,
1212+ Select as AriaSelect,
1313+ FieldError,
1314} from "react-aria-components";
1414-import { FieldError } from "react-aria-components";
1515-import { Description, Label } from "../label";
1616-import { ChevronDown } from "lucide-react";
1717-import { Size } from "../types";
1818-import {
1919- ListBox,
2020- ListBoxItem,
2121- ListBoxItemProps,
2222- ListBoxSectionHeaderProps,
2323- ListBoxSectionHeader,
2424- ListBoxSeparatorProps,
2525- ListBoxSeparator,
2626- ListBoxSection,
2727-} from "../listbox";
1515+2816import { SizeContext } from "../context";
1717+import { Description, Label } from "../label";
1818+import { ListBox } from "../listbox";
2919import { useInputStyles } from "../theme/useInputStyles";
3020import { usePopoverStyles } from "../theme/usePopoverStyles";
3131-import { use } from "react";
2121+import { Size } from "../types";
32223323const styles = stylex.create({
3424 matchWidth: {
···8272 const popoverStyles = usePopoverStyles();
83738474 return (
8585- <SizeContext.Provider value={size}>
7575+ <SizeContext value={size}>
8676 <AriaSelect
8777 {...props}
8878 {...stylex.props(inputStyles.field, style)}
···9080 >
9181 {label && <Label size={size}>{label}</Label>}
9282 <Button {...stylex.props(inputStyles.wrapper)}>
9393- {prefix && <div {...stylex.props(inputStyles.addon)}>{prefix}</div>}
8383+ {prefix !== null && (
8484+ <div {...stylex.props(inputStyles.addon)}>{prefix}</div>
8585+ )}
9486 <SelectValue {...stylex.props(inputStyles.input)}>
9587 {({ selectedText, isPlaceholder, defaultChildren }) => {
9688 if (isPlaceholder) return placeholder;
···9991 return defaultChildren;
10092 }}
10193 </SelectValue>
102102- {suffix && <div {...stylex.props(inputStyles.addon)}>{suffix}</div>}
9494+ {suffix !== null && (
9595+ <div {...stylex.props(inputStyles.addon)}>{suffix}</div>
9696+ )}
10397 <div {...stylex.props(inputStyles.addon)}>
10498 <ChevronDown size={16} aria-hidden="true" />
10599 </div>
···121115 </ListBox>
122116 </Popover>
123117 </AriaSelect>
124124- </SizeContext.Provider>
118118+ </SizeContext>
125119 );
126120}
127121128128-export type SelectItemProps = ListBoxItemProps;
129129-export const SelectItem = ListBoxItem;
130130-export type SelectSectionProps<T extends object> = ListBoxSectionProps<T>;
131131-export const SelectSection = ListBoxSection;
132132-export type SelectSectionHeaderProps = ListBoxSectionHeaderProps;
133133-export const SelectSectionHeader = ListBoxSectionHeader;
134134-export type SelectSeparatorProps = ListBoxSeparatorProps;
135135-export const SelectSeparator = ListBoxSeparator;
122122+export type {
123123+ ListBoxItemProps as SelectItemProps,
124124+ ListBoxSectionProps as SelectSectionProps,
125125+ ListBoxSectionHeaderProps as SelectSectionHeaderProps,
126126+ ListBoxSeparatorProps as SelectSeparatorProps,
127127+} from "../listbox";
128128+129129+export {
130130+ ListBoxItem as SelectItem,
131131+ ListBoxSection as SelectSection,
132132+ ListBoxSectionHeader as SelectSectionHeader,
133133+ ListBoxSeparator as SelectSeparator,
134134+} from "../listbox";
+4-2
apps/example/src/components/separator/index.tsx
···11-import { SeparatorProps as AriaSeparatorProps } from "react-aria-components";
22-import { Separator as AriaSeparator } from "react-aria-components";
31import * as stylex from "@stylexjs/stylex";
22+import {
33+ SeparatorProps as AriaSeparatorProps,
44+ Separator as AriaSeparator,
55+} from "react-aria-components";
4657import { slate } from "../theme/colors.stylex";
68
+16-10
apps/example/src/components/text-area/index.tsx
···11+import * as stylex from "@stylexjs/stylex";
22+import { use, useRef } from "react";
13import {
24 TextArea as AriaTextArea,
35 TextAreaProps as AriaTextAreaProps,
46 InputProps,
57 TextFieldProps,
68 ValidationResult,
99+ FieldError,
1010+ TextField as AriaTextField,
711} from "react-aria-components";
81299-import { FieldError, TextField as AriaTextField } from "react-aria-components";
1010-import * as stylex from "@stylexjs/stylex";
1313+import { SizeContext } from "../context";
1414+import { Description, Label } from "../label";
1515+import { slate } from "../theme/colors.stylex";
1616+import { radius } from "../theme/radius.stylex";
1117import { gray } from "../theme/semantic-color.stylex";
1218import { spacing } from "../theme/spacing.stylex";
1313-import { Description, Label } from "../label";
1414-import { radius } from "../theme/radius.stylex";
1519import { lineHeight, fontSize, fontFamily } from "../theme/typography.stylex";
1616-import { slate } from "../theme/colors.stylex";
1717-import { use, useRef } from "react";
1820import { Size } from "../types";
1919-import { SizeContext } from "../context";
20212122const styles = stylex.create({
2223 wrapper: {
···140141141142 return (
142143 <AriaTextField {...props} {...stylex.props(styles.wrapper, style)}>
143143- <Label size={size}>{label}</Label>
144144+ {label !== null && <Label size={size}>{label}</Label>}
145145+ {/*
146146+ This onClick is specifically for mouse users not clicking directly on the input.
147147+ A keyboard user would not encounter the same issue.
148148+ */}
149149+ {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions */}
144150 <div
145151 {...stylex.props(styles.inputWrapper, gray.bgUi, gray.text)}
146152 onClick={() => textAreaRef.current?.focus()}
147153 >
148148- {prefix && <div {...stylex.props(styles.addon)}>{prefix}</div>}
154154+ {prefix !== null && <div {...stylex.props(styles.addon)}>{prefix}</div>}
149155 <AriaTextArea
150156 {...stylex.props(styles.input, styles[`${size}Input`])}
151157 ref={textAreaRef}
152158 placeholder={placeholder}
153159 rows={rows}
154160 />
155155- {suffix && <div {...stylex.props(styles.addon)}>{suffix}</div>}
161161+ {suffix !== null && <div {...stylex.props(styles.addon)}>{suffix}</div>}
156162 </div>
157163 {description && <Description size={size}>{description}</Description>}
158164 <FieldError>{errorMessage}</FieldError>
+22-15
apps/example/src/components/text-field/index.tsx
···11+import * as stylex from "@stylexjs/stylex";
22+import { Eye, EyeOff } from "lucide-react";
33+import { useRef, useState, use } from "react";
14import {
25 TextFieldProps as AriaTextFieldProps,
36 InputContext,
47 InputProps,
58 ValidationResult,
66-} from "react-aria-components";
77-88-import {
99 FieldError,
1010 Input,
1111 TextField as AriaTextField,
1212} from "react-aria-components";
1313-import * as stylex from "@stylexjs/stylex";
1313+1414+import { IconButton } from "../icon-button";
1415import { Description, Label } from "../label";
1515-import { useRef } from "react";
1616-import { useState } from "react";
1717-import { IconButton } from "../icon-button";
1818-import { Eye, EyeOff } from "lucide-react";
1919-import { use } from "react";
1616+import { useInputStyles } from "../theme/useInputStyles";
2017import { Size } from "../types";
2121-import { useInputStyles } from "../theme/useInputStyles";
22182319function PasswordToggle({
2420 type,
···3935 size="sm"
4036 variant="tertiary"
4137 label="Toggle password visibility"
4242- onPress={() => setType(type === "password" ? "text" : "password")}
3838+ onPress={() => {
3939+ setType(type === "password" ? "text" : "password");
4040+ }}
4341 >
4442 {type === "password" ? <EyeOff /> : <Eye />}
4543 </IconButton>
···7270}: TextFieldProps) {
7371 const inputRef = useRef<HTMLInputElement>(null);
7472 const [type, setType] = useState<TextFieldProps["type"]>(
7575- props.type || "text"
7373+ props.type || "text",
7674 );
7775 const isPasswordInput = props.type === "password";
7876 const inputStyles = useInputStyles({ size });
···8381 type={type}
8482 {...stylex.props(inputStyles.field, style)}
8583 >
8686- <Label size={size}>{label}</Label>
8484+ {label !== null && <Label size={size}>{label}</Label>}
8585+ {/*
8686+ This onClick is specifically for mouse users not clicking directly on the input.
8787+ A keyboard user would not encounter the same issue.
8888+ */}
8989+ {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions */}
8790 <div
8891 {...stylex.props(inputStyles.wrapper)}
8992 onClick={() => inputRef.current?.focus()}
9093 >
9191- {prefix && <div {...stylex.props(inputStyles.addon)}>{prefix}</div>}
9494+ {prefix !== null && (
9595+ <div {...stylex.props(inputStyles.addon)}>{prefix}</div>
9696+ )}
9297 <Input
9398 {...stylex.props(inputStyles.input)}
9499 ref={inputRef}
95100 placeholder={placeholder}
96101 />
9797- {suffix && <div {...stylex.props(inputStyles.addon)}>{suffix}</div>}
102102+ {suffix !== null && (
103103+ <div {...stylex.props(inputStyles.addon)}>{suffix}</div>
104104+ )}
98105 {isPasswordInput && (
99106 <PasswordToggle
100107 type={type}