= {
day: 'Day',
month: 'Month',
quarter: 'Quarter',
- halfYear: 'Half-year',
+ 'half-year': 'Half-year',
year: 'Year'
};
diff --git a/packages/react/components/calendar-preview/lib/parse.ts b/packages/react/components/calendar-preview/lib/parse.ts
index 9a0de8033..06cbf7560 100644
--- a/packages/react/components/calendar-preview/lib/parse.ts
+++ b/packages/react/components/calendar-preview/lib/parse.ts
@@ -62,7 +62,7 @@ export function parseScaleInput(
const half = HALF_YEAR.exec(text);
if (half) {
const year = yearFrom(half[2], referenceDate);
- return at(year, half[1] === '1' ? 1 : 7, 'halfYear', trailing);
+ return at(year, half[1] === '1' ? 1 : 7, 'half-year', trailing);
}
const year = YEAR.exec(text);
diff --git a/packages/react/components/calendar-preview/lib/scale.ts b/packages/react/components/calendar-preview/lib/scale.ts
index 84098f31b..9a9333ddf 100644
--- a/packages/react/components/calendar-preview/lib/scale.ts
+++ b/packages/react/components/calendar-preview/lib/scale.ts
@@ -7,7 +7,7 @@ import {
startOfMonthKey
} from '../date-adapter';
-export type Scale = 'day' | 'month' | 'quarter' | 'halfYear' | 'year';
+export type Scale = 'day' | 'month' | 'quarter' | 'half-year' | 'year';
export interface ScaleValue {
date: DayKey;
@@ -23,7 +23,7 @@ export const SCALES: readonly Scale[] = [
'day',
'month',
'quarter',
- 'halfYear',
+ 'half-year',
'year'
];
@@ -55,7 +55,7 @@ const FIXED_EDGES: Record<
(month: number) => readonly [string, string]
> = {
quarter: month => QUARTERS[Math.floor((month - 1) / 3)],
- halfYear: month => (month <= 6 ? ['01-01', '06-30'] : ['07-01', '12-31']),
+ 'half-year': month => (month <= 6 ? ['01-01', '06-30'] : ['07-01', '12-31']),
year: () => ['01-01', '12-31']
};
diff --git a/packages/react/components/chip/__tests__/chip.test.tsx b/packages/react/components/chip/__tests__/chip.test.tsx
index b5e9ad76a..6002bc417 100644
--- a/packages/react/components/chip/__tests__/chip.test.tsx
+++ b/packages/react/components/chip/__tests__/chip.test.tsx
@@ -60,7 +60,7 @@ describe('Chip', () => {
});
describe('Variants', () => {
- const variants = ['outline', 'filled'] as const;
+ const variants = ['outline', 'solid'] as const;
it.each(variants)('renders %s variant correctly', variant => {
render(Test Chip );
diff --git a/packages/react/components/chip/chip.module.css b/packages/react/components/chip/chip.module.css
index b87320265..a874423d5 100644
--- a/packages/react/components/chip/chip.module.css
+++ b/packages/react/components/chip/chip.module.css
@@ -38,9 +38,9 @@
--chip-fg-hover: var(--rs-color-foreground-base-primary);
--chip-fg-active: var(--rs-color-foreground-base-primary);
/* A foreground token as the border color. */
- --chip-filled-border-hover: var(--rs-color-foreground-base-primary);
- --chip-filled-fg-hover: var(--rs-color-foreground-base-primary);
- --chip-filled-bg-active: var(--rs-color-background-neutral-primary);
+ --chip-solid-border-hover: var(--rs-color-foreground-base-primary);
+ --chip-solid-fg-hover: var(--rs-color-foreground-base-primary);
+ --chip-solid-bg-active: var(--rs-color-background-neutral-primary);
}
.chip-color-accent {
@@ -50,10 +50,10 @@
--chip-fg: var(--rs-color-foreground-accent-primary);
--chip-fg-hover: var(--rs-color-foreground-accent-primary-hover);
--chip-fg-active: var(--rs-color-foreground-accent-primary);
- --chip-filled-border-hover: var(--rs-color-border-accent-emphasis);
- /* Accent filled hover changes the border only, not the text. */
- --chip-filled-fg-hover: var(--rs-color-foreground-accent-primary);
- --chip-filled-bg-active: var(--rs-color-background-accent-primary);
+ --chip-solid-border-hover: var(--rs-color-border-accent-emphasis);
+ /* Accent solid hover changes the border only, not the text. */
+ --chip-solid-fg-hover: var(--rs-color-foreground-accent-primary);
+ --chip-solid-bg-active: var(--rs-color-background-accent-primary);
}
.chip-color-danger {
@@ -63,9 +63,9 @@
--chip-fg: var(--rs-color-foreground-danger-primary);
--chip-fg-hover: var(--rs-color-foreground-danger-primary-hover);
--chip-fg-active: var(--rs-color-foreground-danger-primary);
- --chip-filled-border-hover: var(--rs-color-border-danger-emphasis);
- --chip-filled-fg-hover: var(--rs-color-foreground-danger-primary);
- --chip-filled-bg-active: var(--rs-color-background-danger-primary);
+ --chip-solid-border-hover: var(--rs-color-border-danger-emphasis);
+ --chip-solid-fg-hover: var(--rs-color-foreground-danger-primary);
+ --chip-solid-bg-active: var(--rs-color-background-danger-primary);
}
.chip-color-success {
@@ -75,9 +75,9 @@
--chip-fg: var(--rs-color-foreground-success-primary);
--chip-fg-hover: var(--rs-color-foreground-success-primary-hover);
--chip-fg-active: var(--rs-color-foreground-success-primary);
- --chip-filled-border-hover: var(--rs-color-border-success-emphasis);
- --chip-filled-fg-hover: var(--rs-color-foreground-success-primary);
- --chip-filled-bg-active: var(--rs-color-background-success-primary);
+ --chip-solid-border-hover: var(--rs-color-border-success-emphasis);
+ --chip-solid-fg-hover: var(--rs-color-foreground-success-primary);
+ --chip-solid-bg-active: var(--rs-color-background-success-primary);
}
/* The public value is `warning`, backed by the `attention` tokens, as in Badge. */
@@ -88,9 +88,9 @@
--chip-fg: var(--rs-color-foreground-attention-primary);
--chip-fg-hover: var(--rs-color-foreground-attention-primary-hover);
--chip-fg-active: var(--rs-color-foreground-attention-primary);
- --chip-filled-border-hover: var(--rs-color-border-attention-emphasis);
- --chip-filled-fg-hover: var(--rs-color-foreground-attention-primary);
- --chip-filled-bg-active: var(--rs-color-background-attention-primary);
+ --chip-solid-border-hover: var(--rs-color-border-attention-emphasis);
+ --chip-solid-fg-hover: var(--rs-color-foreground-attention-primary);
+ --chip-solid-bg-active: var(--rs-color-background-attention-primary);
}
/* Variants */
@@ -111,21 +111,21 @@
color: var(--chip-fg-active);
}
-.chip-variant-filled {
+.chip-variant-solid {
background: var(--rs-color-background-base-primary);
border: 0.5px solid var(--chip-border);
color: var(--chip-fg);
}
-.chip-variant-filled:hover {
- border-color: var(--chip-filled-border-hover);
- color: var(--chip-filled-fg-hover);
+.chip-variant-solid:hover {
+ border-color: var(--chip-solid-border-hover);
+ color: var(--chip-solid-fg-hover);
background: var(--rs-color-background-base-primary-hover);
}
-.chip-variant-filled:active,
-.chip-variant-filled[data-state="active"] {
- background: var(--chip-filled-bg-active);
+.chip-variant-solid:active,
+.chip-variant-solid[data-state="active"] {
+ background: var(--chip-solid-bg-active);
color: var(--chip-fg-active);
}
diff --git a/packages/react/components/chip/chip.tsx b/packages/react/components/chip/chip.tsx
index cd0b11a7c..3630a16eb 100644
--- a/packages/react/components/chip/chip.tsx
+++ b/packages/react/components/chip/chip.tsx
@@ -11,7 +11,7 @@ const chip = cva(styles.chip, {
...radiusVariants,
variant: {
outline: styles['chip-variant-outline'],
- filled: styles['chip-variant-filled']
+ solid: styles['chip-variant-solid']
},
size: {
large: styles['chip-size-large'],
diff --git a/packages/react/components/command/command-input.tsx b/packages/react/components/command/command-input.tsx
index 4543e18b7..9563b2c09 100644
--- a/packages/react/components/command/command-input.tsx
+++ b/packages/react/components/command/command-input.tsx
@@ -34,7 +34,7 @@ export const CommandInput = ({
containerRef={inputContainerRef}
classNames={{ container: styles.commandInputContainer }}
leadingIcon={leadingIcon}
- variant='borderless'
+ variant='text'
size={size}
autoFocus={autoFocus}
placeholder={placeholder}
diff --git a/packages/react/components/command/command.module.css b/packages/react/components/command/command.module.css
index 26f41997d..ccf0b0d87 100644
--- a/packages/react/components/command/command.module.css
+++ b/packages/react/components/command/command.module.css
@@ -15,7 +15,7 @@
background-color: var(--rs-color-background-base-primary);
}
-/* The search bar sits in its own dialog panel, so the borderless input's
+/* The search bar sits in its own dialog panel, so the `text` variant input's
keyboard focus ring is redundant here. The doubled class outranks the base
ring rule without needing !important. */
.commandInputContainer.commandInputContainer:has(input:focus-visible) {
diff --git a/packages/react/components/editor/editor-link-form.tsx b/packages/react/components/editor/editor-link-form.tsx
index 78d5e0b33..1ed6fd106 100644
--- a/packages/react/components/editor/editor-link-form.tsx
+++ b/packages/react/components/editor/editor-link-form.tsx
@@ -38,7 +38,7 @@ export function EditorLinkForm({ onDone }: EditorLinkFormProps) {
{
- it('exposes slots for every rendered part (empty1 variant)', () => {
+ it('exposes slots for every rendered part (compact variant)', () => {
const { container } = render(
Icon
}
@@ -28,7 +28,7 @@ describe('EmptyState data-slot contract', () => {
expect(getSlot(container, 'empty-state-subheading')).toBeNull();
});
- it('exposes slots for every rendered part (empty2 variant)', () => {
+ it('exposes slots for every rendered part (page variant)', () => {
const { container } = render(
Icon}
@@ -36,7 +36,7 @@ describe('EmptyState data-slot contract', () => {
subHeading='Try adjusting your filters'
primaryAction={Retry }
secondaryAction={Cancel }
- variant='empty2'
+ variant='page'
/>
);
expectSlots(container, [
diff --git a/packages/react/components/empty-state/__tests__/empty-state.test.tsx b/packages/react/components/empty-state/__tests__/empty-state.test.tsx
index 7939458d5..ff94c163d 100644
--- a/packages/react/components/empty-state/__tests__/empty-state.test.tsx
+++ b/packages/react/components/empty-state/__tests__/empty-state.test.tsx
@@ -39,7 +39,7 @@ describe('EmptyState', () => {
});
describe('Variants', () => {
- it('renders empty1 variant by default', () => {
+ it('renders compact variant by default', () => {
const { container } = render(Icon} />);
expect(
container.querySelector(`.${styles.emptyState}`)
@@ -49,9 +49,9 @@ describe('EmptyState', () => {
).not.toBeInTheDocument();
});
- it('renders empty2 variant correctly', () => {
+ it('renders page variant correctly', () => {
const { container } = render(
- Icon} variant='empty2' />
+ Icon} variant='page' />
);
expect(
container.querySelector(`.${styles.emptyStatePage}`)
diff --git a/packages/react/components/empty-state/empty-state.module.css b/packages/react/components/empty-state/empty-state.module.css
index 4e890de84..9ab51c732 100644
--- a/packages/react/components/empty-state/empty-state.module.css
+++ b/packages/react/components/empty-state/empty-state.module.css
@@ -64,7 +64,7 @@
max-width: 360px;
}
-/* Empty2 */
+/* Page variant */
.emptyStateContent {
width: 366px;
diff --git a/packages/react/components/empty-state/empty-state.tsx b/packages/react/components/empty-state/empty-state.tsx
index faddad338..c4a7a9459 100644
--- a/packages/react/components/empty-state/empty-state.tsx
+++ b/packages/react/components/empty-state/empty-state.tsx
@@ -26,7 +26,7 @@ export interface EmptyStateProps extends ComponentProps {
* `[data-slot="empty-state-subheading"]`.
*/
classNames?: Partial>;
- variant?: 'empty1' | 'empty2';
+ variant?: 'compact' | 'page';
}
export function EmptyState({
@@ -36,10 +36,10 @@ export function EmptyState({
primaryAction,
secondaryAction,
classNames,
- variant = 'empty1',
+ variant = 'compact',
...props
}: EmptyStateProps) {
- if (variant === 'empty2') {
+ if (variant === 'page') {
return (
{
expect(screen.getByText('Name')).toBeInTheDocument();
});
- it('applies default variant classes', () => {
+ it('applies outline variant classes by default', () => {
const { container } = render( );
const chip = container.querySelector(`.${styles.chip}`);
expect(chip).toBeInTheDocument();
- expect(chip).toHaveClass(styles['chip-default']);
+ expect(chip).toHaveClass(styles['variant-outline']);
});
it('applies text variant', () => {
diff --git a/packages/react/components/filter-chip/filter-chip.module.css b/packages/react/components/filter-chip/filter-chip.module.css
index 75eaef08a..55c6729ca 100644
--- a/packages/react/components/filter-chip/filter-chip.module.css
+++ b/packages/react/components/filter-chip/filter-chip.module.css
@@ -15,7 +15,7 @@
overflow: clip;
}
-.chip-default {
+.variant-outline {
border: 1px solid var(--rs-color-border-base-tertiary);
}
diff --git a/packages/react/components/filter-chip/filter-chip.tsx b/packages/react/components/filter-chip/filter-chip.tsx
index ee5b34a71..e4f2dd13b 100644
--- a/packages/react/components/filter-chip/filter-chip.tsx
+++ b/packages/react/components/filter-chip/filter-chip.tsx
@@ -38,12 +38,12 @@ import { Operation } from './filter-chip-operation';
const chip = cva(styles.chip, {
variants: {
variant: {
- default: styles['chip-default'],
+ outline: styles['variant-outline'],
text: null
}
},
defaultVariants: {
- variant: 'default'
+ variant: 'outline'
}
});
@@ -328,7 +328,7 @@ export const FilterChip = ({
data-slot='filter-chip-value'
>
handleTextInputChange(e.target.value)}
diff --git a/packages/react/components/grid/__tests__/grid.test.tsx b/packages/react/components/grid/__tests__/grid.test.tsx
index e4f264086..06da8d7c6 100644
--- a/packages/react/components/grid/__tests__/grid.test.tsx
+++ b/packages/react/components/grid/__tests__/grid.test.tsx
@@ -149,10 +149,11 @@ describe('Grid', () => {
describe('Alignment', () => {
const alignments = ['start', 'end', 'center', 'stretch'] as const;
- const extendedAlignments = [
- 'space-around',
- 'space-between',
- 'space-evenly'
+ const contentAlignments = [
+ ...alignments.map(align => [align, align] as const),
+ ['around', 'space-around'],
+ ['between', 'space-between'],
+ ['evenly', 'space-evenly']
] as const;
it.each(alignments)('renders %s justify items correctly', align => {
@@ -161,28 +162,24 @@ describe('Grid', () => {
expect(grid).toHaveStyle({ justifyItems: align });
});
- it.each(alignments)('renders %s align items correctly', align => {
- const { container } = render(Content );
+ it.each(alignments)('renders %s align correctly', align => {
+ const { container } = render(Content );
const grid = container.firstChild as HTMLElement;
expect(grid).toHaveStyle({ alignItems: align });
});
- it.each([
- ...alignments,
- ...extendedAlignments
- ])('renders %s justify content correctly', align => {
- const { container } = render(Content );
+ it.each(contentAlignments)('renders %s justify correctly', (align, css) => {
+ const { container } = render(Content );
const grid = container.firstChild as HTMLElement;
- expect(grid).toHaveStyle({ justifyContent: align });
+ expect(grid).toHaveStyle({ justifyContent: css });
});
- it.each([
- ...alignments,
- ...extendedAlignments
- ])('renders %s align content correctly', align => {
+ it.each(
+ contentAlignments
+ )('renders %s align content correctly', (align, css) => {
const { container } = render(Content );
const grid = container.firstChild as HTMLElement;
- expect(grid).toHaveStyle({ alignContent: align });
+ expect(grid).toHaveStyle({ alignContent: css });
});
});
diff --git a/packages/react/components/grid/grid.tsx b/packages/react/components/grid/grid.tsx
index ae178b8a6..48a00f9fc 100644
--- a/packages/react/components/grid/grid.tsx
+++ b/packages/react/components/grid/grid.tsx
@@ -17,6 +17,11 @@ const grid = cva(styles.grid, {
}
});
+const toCssAlignment = (value?: AlignExtendedType) =>
+ value === 'between' || value === 'around' || value === 'evenly'
+ ? `space-${value}`
+ : value;
+
export type GridProps = useRender.ComponentProps<'div'> &
VariantProps & {
/**
@@ -53,8 +58,8 @@ export type GridProps = useRender.ComponentProps<'div'> &
*/
rows?: string | number;
justifyItems?: AlignType;
- alignItems?: AlignType;
- justifyContent?: AlignExtendedType;
+ align?: AlignType;
+ justify?: AlignExtendedType;
alignContent?: AlignExtendedType;
inline?: boolean;
};
@@ -70,8 +75,8 @@ export function Grid({
columnGap,
rowGap,
justifyItems,
- alignItems,
- justifyContent,
+ align,
+ justify,
alignContent,
inline = false,
className,
@@ -103,9 +108,9 @@ export function Grid({
gridTemplateColumns,
gridTemplateRows,
justifyItems,
- alignItems,
- justifyContent,
- alignContent,
+ alignItems: align,
+ justifyContent: toCssAlignment(justify),
+ alignContent: toCssAlignment(alignContent),
...style
};
diff --git a/packages/react/components/grid/types.ts b/packages/react/components/grid/types.ts
index af024e97e..40fb03cbd 100644
--- a/packages/react/components/grid/types.ts
+++ b/packages/react/components/grid/types.ts
@@ -1,6 +1,2 @@
export type AlignType = 'start' | 'end' | 'center' | 'stretch';
-export type AlignExtendedType =
- | AlignType
- | 'space-around'
- | 'space-between'
- | 'space-evenly';
+export type AlignExtendedType = AlignType | 'between' | 'around' | 'evenly';
diff --git a/packages/react/components/input/__tests__/input.test.tsx b/packages/react/components/input/__tests__/input.test.tsx
index 5b6d46d41..f5c9a239d 100644
--- a/packages/react/components/input/__tests__/input.test.tsx
+++ b/packages/react/components/input/__tests__/input.test.tsx
@@ -52,16 +52,16 @@ describe('Input', () => {
});
describe('Variants', () => {
- it('renders default variant by default', () => {
+ it('renders outline variant by default', () => {
const { container } = render( );
const wrapper = container.querySelector(`.${styles['input-wrapper']}`);
- expect(wrapper).toHaveClass(styles['variant-default']);
+ expect(wrapper).not.toHaveClass(styles['variant-text']);
});
- it('renders borderless variant when specified', () => {
- const { container } = render( );
+ it('renders text variant when specified', () => {
+ const { container } = render( );
const wrapper = container.querySelector(`.${styles['input-wrapper']}`);
- expect(wrapper).toHaveClass(styles['variant-borderless']);
+ expect(wrapper).toHaveClass(styles['variant-text']);
});
});
diff --git a/packages/react/components/input/input.module.css b/packages/react/components/input/input.module.css
index 36424cf37..54f4992f3 100644
--- a/packages/react/components/input/input.module.css
+++ b/packages/react/components/input/input.module.css
@@ -221,16 +221,16 @@
padding-right: var(--rs-space-2);
}
-.variant-borderless {
+.variant-text {
border-color: transparent;
}
-.variant-borderless:focus-within {
+.variant-text:focus-within {
border-color: transparent;
outline: none;
}
/* Keyboard focus must still be visible on the chromeless variant. */
-.variant-borderless:has(.input-field:focus-visible) {
+.variant-text:has(.input-field:focus-visible) {
box-shadow: var(--rs-focus-ring-shadow);
}
diff --git a/packages/react/components/input/input.tsx b/packages/react/components/input/input.tsx
index 2199c9597..a6480eadb 100644
--- a/packages/react/components/input/input.tsx
+++ b/packages/react/components/input/input.tsx
@@ -14,13 +14,13 @@ const inputWrapper = cva(styles['input-wrapper'], {
large: styles['size-large']
},
variant: {
- default: styles['variant-default'],
- borderless: styles['variant-borderless']
+ outline: null,
+ text: styles['variant-text']
}
},
defaultVariants: {
size: 'large',
- variant: 'default'
+ variant: 'outline'
}
});
@@ -34,7 +34,7 @@ export interface InputProps
suffix?: string;
chips?: Array<{ label: string; onRemove?: () => void }>;
maxChipsVisible?: number;
- variant?: 'default' | 'borderless';
+ variant?: 'outline' | 'text';
containerRef?: RefObject;
/** @deprecated Use `[data-slot="input-container"]` instead. */
classNames?: { container?: string };
@@ -52,7 +52,7 @@ export function Input({
maxChipsVisible = 2,
size,
radius,
- variant = 'default',
+ variant = 'outline',
containerRef,
classNames,
required,
diff --git a/packages/react/components/prompt-input/prompt-input-textarea.tsx b/packages/react/components/prompt-input/prompt-input-textarea.tsx
index 5dd3d87ca..a3d33ec92 100644
--- a/packages/react/components/prompt-input/prompt-input-textarea.tsx
+++ b/packages/react/components/prompt-input/prompt-input-textarea.tsx
@@ -86,7 +86,7 @@ export function PromptInputTextarea({