feat: active date

master
Guillermo Pages 5 months ago
parent 87d5661c9a
commit 81fd7dec58

@ -3,6 +3,7 @@ import { DateRangePicker } from './examples/DateRangePicker';
import { SingleMonth } from './examples/SingleMonth'; import { SingleMonth } from './examples/SingleMonth';
import { WeekView } from './examples/WeekView'; import { WeekView } from './examples/WeekView';
import { DateRangeView } from './examples/DateRangeView'; import { DateRangeView } from './examples/DateRangeView';
import { InteractiveDateRange } from './examples/InteractiveDateRange';
import { CompactYear } from './examples/CompactYear'; import { CompactYear } from './examples/CompactYear';
import styles from './App.module.scss'; import styles from './App.module.scss';
@ -13,6 +14,7 @@ const App: React.FC = () => {
<SingleMonth /> <SingleMonth />
<WeekView /> <WeekView />
<DateRangeView /> <DateRangeView />
<InteractiveDateRange />
<CompactYear /> <CompactYear />
</div> </div>
); );

@ -16,6 +16,8 @@ interface DateRangeProps {
size?: DaySize; size?: DaySize;
fontProportion?: number; fontProportion?: number;
magnify?: boolean; magnify?: boolean;
onDateClick?: (date: Date) => void;
activeDates?: Date[];
} }
export const DateRange: React.FC<DateRangeProps> = ({ export const DateRange: React.FC<DateRangeProps> = ({
@ -27,7 +29,9 @@ export const DateRange: React.FC<DateRangeProps> = ({
weekendDays = [6, 0], weekendDays = [6, 0],
size = 'l', size = 'l',
fontProportion = 100, fontProportion = 100,
magnify = false magnify = false,
onDateClick,
activeDates = []
}) => { }) => {
const startDate = startOfDay(from); const startDate = startOfDay(from);
const endDate = startOfDay(to); const endDate = startOfDay(to);
@ -53,6 +57,16 @@ export const DateRange: React.FC<DateRangeProps> = ({
const dayOfWeek = date.getDay(); const dayOfWeek = date.getDay();
const variations = getDateVariations(date, dateRange, weekendDays, dayOfWeek); const variations = getDateVariations(date, dateRange, weekendDays, dayOfWeek);
// Check if this date is active
const isActive = activeDates.some(activeDate =>
startOfDay(activeDate).getTime() === startOfDay(date).getTime()
);
// Add 'active' to variations if the date is active
const variationsWithActive = isActive
? [...variations, 'active' as DayVariation]
: variations;
const wrapperClasses = classNames( const wrapperClasses = classNames(
styles.DateRange__DayWrapper, styles.DateRange__DayWrapper,
{ {
@ -67,7 +81,8 @@ export const DateRange: React.FC<DateRangeProps> = ({
<Day <Day
date={date} date={date}
headerStyle={headerStyle} headerStyle={headerStyle}
variations={variations} variations={variationsWithActive}
onSelect={onDateClick ? () => onDateClick(date) : undefined}
size={size} size={size}
fontProportion={fontProportion} fontProportion={fontProportion}
magnify={magnify} magnify={magnify}

@ -190,6 +190,69 @@
} }
// end implicit (midrange) { // end implicit (midrange) {
// active state - inverted colors
&.Day__Container--active {
background: colors.$day-header-defaultmode-defaultstate-background-color;
color: colors.$day-header-defaultmode-defaultstate-color;
.Day__Header {
background: colors.$day-content-defaultmode-defaultstate-background-color;
color: colors.$day-content-defaultmode-defaultstate-color;
}
.Day__Number {
color: colors.$day-header-defaultmode-defaultstate-color;
// Ensure number stays inverted on hover
.Day__Container--interactive:hover & {
color: colors.$day-header-defaultmode-defaultstate-color;
}
}
// Maintain dark background on hover
&.Day__Container--interactive:hover {
background: colors.$day-header-defaultmode-defaultstate-background-color;
}
&.Day__Container--greyed {
background: colors.$day-header-greyedmode-defaultstate-background-color;
color: colors.$day-header-greyedmode-defaultstate-color;
.Day__Header {
background: colors.$day-content-greyedmode-defaultstate-background-color;
color: colors.$day-content-greyedmode-defaultstate-color;
}
.Day__Number {
color: colors.$day-header-greyedmode-defaultstate-color;
// Ensure number stays inverted on hover for greyed days
.Day__Container--interactive:hover & {
color: colors.$day-header-greyedmode-defaultstate-color;
}
}
// Maintain grey background on hover
&.Day__Container--interactive:hover {
background: colors.$day-header-greyedmode-defaultstate-background-color;
}
}
// Active state takes precedence over selected/selecting for visual clarity
&.Day__Container--selected,
&.Day__Container--selecting {
background: colors.$day-header-defaultmode-defaultstate-background-color;
.Day__Header {
background: colors.$day-content-defaultmode-defaultstate-background-color;
}
.Day__Number {
color: colors.$day-header-defaultmode-defaultstate-color;
}
}
}
// rangestart (selected|selecting)(greyed|defaultMode) // rangestart (selected|selecting)(greyed|defaultMode)
&.Day__Container--rangeStart:not(.Day__Container--rangeEnd) { &.Day__Container--rangeStart:not(.Day__Container--rangeEnd) {
// implicit .Day__Container--selected { // implicit .Day__Container--selected {
@ -488,7 +551,7 @@
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
font-feature-settings: 'tnum' on, 'lnum' on; font-feature-settings: 'tnum' on, 'lnum' on;
.Day__Container--interactive:hover &:not(&--selected) { .Day__Container--interactive:hover &:not(&--selected):not(&--active) {
fill: colors.$day-color-interactive-text-hover; fill: colors.$day-color-interactive-text-hover;
} }
@ -497,6 +560,24 @@
fill: colors.$day-content-greyedmode-defaultstate-color; fill: colors.$day-content-greyedmode-defaultstate-color;
} }
// Active state - inverted colors (high priority)
&--active {
fill: colors.$day-header-defaultmode-defaultstate-color;
// Ensure active state is maintained on hover
.Day__Container--interactive:hover & {
fill: colors.$day-header-defaultmode-defaultstate-color;
}
&.DayNumber__Text--greyed {
fill: colors.$day-header-greyedmode-defaultstate-color;
.Day__Container--interactive:hover & {
fill: colors.$day-header-greyedmode-defaultstate-color;
}
}
}
// Selected states // Selected states
&--selected { &--selected {
fill: colors.$day-content-defaultmode-selectedstate-midrange-color; fill: colors.$day-content-defaultmode-selectedstate-midrange-color;

@ -40,6 +40,7 @@ export const Day: React.FC<DayProps> = ({
[styles['Day__Container--greyed']]: variations.includes('greyed'), [styles['Day__Container--greyed']]: variations.includes('greyed'),
[styles['Day__Container--rowStart']]: variations.includes('rowStart'), [styles['Day__Container--rowStart']]: variations.includes('rowStart'),
[styles['Day__Container--rowEnd']]: variations.includes('rowEnd'), [styles['Day__Container--rowEnd']]: variations.includes('rowEnd'),
[styles['Day__Container--active']]: variations.includes('active'),
[styles['magnify']]: magnify && (variations.includes('selected') || variations.includes('selecting')) [styles['magnify']]: magnify && (variations.includes('selected') || variations.includes('selecting'))
}, },
styles[`Day--${headerStyle}`], styles[`Day--${headerStyle}`],

@ -54,6 +54,7 @@ export const DayNumber: React.FC<DayNumberProps> = ({
[styles['DayNumber__Text--selecting']]: variations.includes('selecting'), [styles['DayNumber__Text--selecting']]: variations.includes('selecting'),
[styles['DayNumber__Text--rangeStart']]: variations.includes('rangeStart'), [styles['DayNumber__Text--rangeStart']]: variations.includes('rangeStart'),
[styles['DayNumber__Text--rangeEnd']]: variations.includes('rangeEnd'), [styles['DayNumber__Text--rangeEnd']]: variations.includes('rangeEnd'),
[styles['DayNumber__Text--active']]: variations.includes('active'),
} }
); );

@ -16,7 +16,8 @@ export type DayVariation =
| 'rangeEnd' | 'rangeEnd'
| 'selecting' | 'selecting'
| 'rowStart' | 'rowStart'
| 'rowEnd'; | 'rowEnd'
| 'active';
export type DaySize = 'xl' | 'l' | 'm' | 's' | 'xs' | 'xxs'; export type DaySize = 'xl' | 'l' | 'm' | 's' | 'xs' | 'xxs';
export interface YearProps { export interface YearProps {

Loading…
Cancel
Save