Skip to content

Commit 3397670

Browse files
committed
update remaining tokens and setup error message
1 parent f2a89cf commit 3397670

File tree

3 files changed

+31
-11
lines changed

3 files changed

+31
-11
lines changed

packages/@react-spectrum/s2/src/Calendar.tsx

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,10 @@ const cellStyles = style({
135135
default: 2,
136136
isFirstWeek: 0
137137
},
138-
paddingBottom: 2,
138+
paddingBottom: {
139+
default: 2,
140+
isLastWeek: 0
141+
},
139142
position: 'relative',
140143
width: 32,
141144
height: 32,
@@ -579,20 +582,22 @@ const CalendarCell = (props: Omit<CalendarCellProps, 'children'> & {firstDayOfWe
579582
let {locale} = useLocale();
580583
let firstDayOfWeek = props.firstDayOfWeek;
581584
// Calculate the day and week index based on the date.
582-
let {dayIndex, weekIndex} = useWeekAndDayIndices(props.date, locale, firstDayOfWeek);
585+
let {dayIndex, weekIndex, lastWeekIndex} = useWeekAndDayIndices(props.date, locale, firstDayOfWeek);
583586

584587
let calendarStateContext = useContext(CalendarStateContext);
585588
let rangeCalendarStateContext = useContext(RangeCalendarStateContext);
586589
let state = (calendarStateContext ?? rangeCalendarStateContext)!;
587590

591+
588592
let isFirstWeek = weekIndex === 0;
593+
let isLastWeek = weekIndex === lastWeekIndex;
589594
let isFirstChild = dayIndex === 0;
590595
let isLastChild = dayIndex === 6;
591596

592597
return (
593598
<AriaCalendarCell
594599
date={props.date}
595-
className={(renderProps) => cellStyles({...renderProps, isFirstChild, isLastChild, isFirstWeek})}>
600+
className={(renderProps) => cellStyles({...renderProps, isFirstChild, isLastChild, isFirstWeek, isLastWeek})}>
596601
{(renderProps) => <CalendarCellInner {...props} weekIndex={weekIndex} dayIndex={dayIndex} state={state} isRangeSelection={!!rangeCalendarStateContext} renderProps={renderProps} />}
597602
</AriaCalendarCell>
598603
);
@@ -677,7 +682,7 @@ function useWeekAndDayIndices(
677682
locale: string,
678683
firstDayOfWeek?: DayOfWeek
679684
) {
680-
let {dayIndex, weekIndex} = useMemo(() => {
685+
let result = useMemo(() => {
681686
// Get the day index within the week (0-6)
682687
const dayIndex = getDayOfWeek(date, locale, firstDayOfWeek);
683688

@@ -689,12 +694,15 @@ function useWeekAndDayIndices(
689694
const dayOfMonth = date.day;
690695

691696
const weekIndex = Math.floor((dayOfMonth + monthStartDayOfWeek - 1) / 7);
697+
const lastDayOfMonth = startOfMonth(date).add({months: 1}).subtract({days: 1});
698+
const lastWeekIndex = Math.floor((lastDayOfMonth.day + monthStartDayOfWeek - 1) / 7);
692699

693700
return {
694701
weekIndex,
702+
lastWeekIndex,
695703
dayIndex
696704
};
697705
}, [date, locale, firstDayOfWeek]);
698706

699-
return {dayIndex, weekIndex};
707+
return result;
700708
}

packages/@react-spectrum/s2/src/DatePicker.tsx

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,11 @@ export interface DatePickerProps<T extends DateValue> extends
5757
* The maximum number of months to display at once in the calendar popover, if screen space permits.
5858
* @default 1
5959
*/
60-
maxVisibleMonths?: number
60+
maxVisibleMonths?: number,
61+
/**
62+
* The error message to display when the calendar is invalid.
63+
*/
64+
errorMessage?: ReactNode
6165
}
6266

6367
export const DatePickerContext = createContext<ContextValue<Partial<DatePickerProps<any>>, HTMLDivElement>>(null);
@@ -208,7 +212,8 @@ export const DatePicker = /*#__PURE__*/ (forwardRef as forwardRefType)(function
208212
<CalendarPopover shouldFlip={props.shouldFlip}>
209213
<Calendar
210214
visibleMonths={maxVisibleMonths}
211-
createCalendar={createCalendar} />
215+
createCalendar={createCalendar}
216+
errorMessage={errorMessage} />
212217
{showTimeField && (
213218
<div className={style({display: 'flex', gap: 16, contain: 'inline-size'})}>
214219
<TimeField
@@ -248,7 +253,8 @@ export function CalendarPopover(props: Omit<PopoverProps, 'children'> & {childre
248253
padding="none">
249254
<div
250255
className={style({
251-
padding: 16,
256+
paddingX: 16,
257+
paddingY: 24,
252258
overflow: 'auto',
253259
display: 'flex',
254260
flexDirection: 'column',

packages/@react-spectrum/s2/src/DateRangePicker.tsx

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import {
1919
PopoverProps
2020
} from 'react-aria-components';
2121
import {CalendarButton, CalendarPopover, timeField} from './DatePicker';
22-
import {createContext, forwardRef, ReactElement, Ref, useContext, useState} from 'react';
22+
import {createContext, forwardRef, ReactElement, ReactNode, Ref, useContext, useState} from 'react';
2323
import {DateInput, DateInputContainer, InvalidIndicator} from './DateField';
2424
import {field, fieldInput, getAllowedOverrides, StyleProps} from './style-utils' with {type: 'macro'};
2525
import {FieldGroup, FieldLabel, HelpText} from './Field';
@@ -49,7 +49,11 @@ export interface DateRangePickerProps<T extends DateValue> extends
4949
* The maximum number of months to display at once in the calendar popover, if screen space permits.
5050
* @default 1
5151
*/
52-
maxVisibleMonths?: number
52+
maxVisibleMonths?: number,
53+
/**
54+
* The error message to display when the calendar is invalid.
55+
*/
56+
errorMessage?: ReactNode
5357
}
5458

5559
export const DateRangePickerContext = createContext<ContextValue<Partial<DateRangePickerProps<any>>, HTMLDivElement>>(null);
@@ -83,6 +87,7 @@ export const DateRangePicker = /*#__PURE__*/ (forwardRef as forwardRefType)(func
8387
} = props;
8488
let formContext = useContext(FormContext);
8589
let [buttonHasFocus, setButtonHasFocus] = useState(false);
90+
console.log('errorMessage', errorMessage);
8691

8792
return (
8893
<AriaDateRangePicker
@@ -148,7 +153,8 @@ export const DateRangePicker = /*#__PURE__*/ (forwardRef as forwardRefType)(func
148153
<CalendarPopover shouldFlip={props.shouldFlip}>
149154
<RangeCalendar
150155
visibleMonths={maxVisibleMonths}
151-
createCalendar={createCalendar} />
156+
createCalendar={createCalendar}
157+
errorMessage={errorMessage} />
152158
{showTimeField && (
153159
<div className={style({display: 'flex', gap: 16, contain: 'inline-size', marginTop: 24})}>
154160
<TimeField

0 commit comments

Comments
 (0)