@idealyst/datepicker 1.1.3 → 1.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/package.json +6 -5
  2. package/src/DateInput.native.tsx +155 -0
  3. package/src/DateInput.tsx +2 -0
  4. package/src/DateInput.web.tsx +146 -0
  5. package/src/DatePicker.tsx +276 -0
  6. package/src/DateTimePicker.tsx +89 -0
  7. package/src/TimeInput.native.tsx +175 -0
  8. package/src/TimeInput.tsx +2 -0
  9. package/src/TimeInput.web.tsx +171 -0
  10. package/src/TimePicker.tsx +106 -0
  11. package/src/examples/DatePickerExamples.tsx +113 -149
  12. package/src/examples/index.ts +1 -1
  13. package/src/index.native.ts +15 -20
  14. package/src/index.ts +14 -19
  15. package/src/styles.ts +127 -0
  16. package/src/types.ts +56 -0
  17. package/src/DateInput/DateInput.native.tsx +0 -61
  18. package/src/DateInput/DateInput.styles.tsx +0 -26
  19. package/src/DateInput/DateInput.web.tsx +0 -61
  20. package/src/DateInput/DateInputBase.tsx +0 -228
  21. package/src/DateInput/index.native.ts +0 -2
  22. package/src/DateInput/index.ts +0 -2
  23. package/src/DateInput/types.ts +0 -60
  24. package/src/DatePicker/Calendar.native.tsx +0 -261
  25. package/src/DatePicker/Calendar.styles.tsx +0 -230
  26. package/src/DatePicker/Calendar.web.tsx +0 -159
  27. package/src/DatePicker/DatePicker.native.tsx +0 -51
  28. package/src/DatePicker/DatePicker.styles.tsx +0 -76
  29. package/src/DatePicker/DatePicker.web.tsx +0 -31
  30. package/src/DatePicker/index.native.ts +0 -3
  31. package/src/DatePicker/index.ts +0 -3
  32. package/src/DatePicker/types.ts +0 -78
  33. package/src/DateRangePicker/DateRangePicker.native.tsx +0 -39
  34. package/src/DateRangePicker/DateRangePicker.styles.tsx +0 -83
  35. package/src/DateRangePicker/DateRangePicker.web.tsx +0 -40
  36. package/src/DateRangePicker/RangeCalendar.native.tsx +0 -355
  37. package/src/DateRangePicker/RangeCalendar.styles.tsx +0 -200
  38. package/src/DateRangePicker/RangeCalendar.web.tsx +0 -384
  39. package/src/DateRangePicker/index.native.ts +0 -3
  40. package/src/DateRangePicker/index.ts +0 -3
  41. package/src/DateRangePicker/types.ts +0 -107
  42. package/src/DateTimePicker/DateTimePicker.native.tsx +0 -24
  43. package/src/DateTimePicker/DateTimePicker.styles.tsx +0 -104
  44. package/src/DateTimePicker/DateTimePicker.tsx +0 -21
  45. package/src/DateTimePicker/DateTimePickerBase.tsx +0 -185
  46. package/src/DateTimePicker/TimePicker.native.tsx +0 -17
  47. package/src/DateTimePicker/TimePicker.styles.tsx +0 -115
  48. package/src/DateTimePicker/TimePicker.tsx +0 -14
  49. package/src/DateTimePicker/TimePickerBase.tsx +0 -232
  50. package/src/DateTimePicker/index.native.ts +0 -3
  51. package/src/DateTimePicker/index.ts +0 -3
  52. package/src/DateTimePicker/primitives/ClockFace.native.tsx +0 -195
  53. package/src/DateTimePicker/primitives/ClockFace.web.tsx +0 -168
  54. package/src/DateTimePicker/primitives/TimeInput.native.tsx +0 -53
  55. package/src/DateTimePicker/primitives/TimeInput.web.tsx +0 -66
  56. package/src/DateTimePicker/primitives/index.native.ts +0 -2
  57. package/src/DateTimePicker/primitives/index.ts +0 -2
  58. package/src/DateTimePicker/primitives/index.web.ts +0 -2
  59. package/src/DateTimePicker/types.ts +0 -80
  60. package/src/DateTimePicker/utils/dimensions.native.ts +0 -9
  61. package/src/DateTimePicker/utils/dimensions.ts +0 -9
  62. package/src/DateTimePicker/utils/dimensions.web.ts +0 -33
  63. package/src/DateTimeRangePicker/DateTimeRangePicker.native.tsx +0 -24
  64. package/src/DateTimeRangePicker/DateTimeRangePicker.styles.tsx +0 -118
  65. package/src/DateTimeRangePicker/DateTimeRangePicker.web.tsx +0 -21
  66. package/src/DateTimeRangePicker/DateTimeRangePickerBase.tsx +0 -327
  67. package/src/DateTimeRangePicker/index.native.ts +0 -2
  68. package/src/DateTimeRangePicker/index.ts +0 -2
  69. package/src/DateTimeRangePicker/types.ts +0 -70
  70. package/src/primitives/CalendarGrid/CalendarGrid.styles.tsx +0 -51
  71. package/src/primitives/CalendarGrid/CalendarGrid.tsx +0 -146
  72. package/src/primitives/CalendarGrid/index.ts +0 -1
  73. package/src/primitives/CalendarHeader/CalendarHeader.styles.tsx +0 -25
  74. package/src/primitives/CalendarHeader/CalendarHeader.tsx +0 -69
  75. package/src/primitives/CalendarHeader/index.ts +0 -1
  76. package/src/primitives/CalendarOverlay/CalendarOverlay.styles.tsx +0 -86
  77. package/src/primitives/CalendarOverlay/CalendarOverlay.tsx +0 -136
  78. package/src/primitives/CalendarOverlay/index.ts +0 -1
  79. package/src/primitives/Wrapper/Wrapper.web.tsx +0 -33
  80. package/src/primitives/Wrapper/index.ts +0 -1
@@ -1,118 +0,0 @@
1
- import { StyleSheet } from 'react-native-unistyles';
2
-
3
- export const dateTimeRangePickerStyles = StyleSheet.create((theme) => ({
4
- container: {
5
- gap: theme.spacing?.md || 16,
6
- },
7
-
8
- label: {
9
- fontSize: theme.typography?.fontSize?.sm || 14,
10
- fontWeight: '600',
11
- color: theme.colors?.text?.primary || '#111827',
12
- marginBottom: theme.spacing?.xs || 4,
13
- },
14
-
15
- picker: {
16
- gap: theme.spacing?.md || 16,
17
- },
18
-
19
- selectedRangeHeader: {
20
- flexDirection: 'column',
21
- padding: theme.spacing?.sm || 12,
22
- backgroundColor: theme.colors?.surface?.secondary || '#f9fafb',
23
- borderRadius: theme.borderRadius?.md || 8,
24
- borderWidth: 1,
25
- borderColor: theme.colors?.border?.primary || '#e5e7eb',
26
- gap: theme.spacing?.xs || 4,
27
-
28
- _web: {
29
- display: 'flex',
30
- flexDirection: 'column',
31
- border: `1px solid ${theme.colors?.border?.primary || '#e5e7eb'}`,
32
- },
33
- },
34
-
35
- selectedRangeLabel: {
36
- fontSize: theme.typography?.fontSize?.sm || 12,
37
- fontWeight: '500',
38
- color: theme.colors?.text?.secondary || '#6b7280',
39
- },
40
-
41
- selectedRangeValue: {
42
- fontSize: theme.typography?.fontSize?.md || 16,
43
- fontWeight: '600',
44
- color: theme.colors?.text?.primary || '#111827',
45
- },
46
-
47
- section: {
48
- gap: theme.spacing?.xs || 8,
49
- },
50
-
51
- sectionLabel: {
52
- fontSize: theme.typography?.fontSize?.sm || 14,
53
- fontWeight: '600',
54
- color: theme.colors?.text?.primary || '#111827',
55
- },
56
-
57
- sectionContent: {
58
- padding: theme.spacing?.sm || 12,
59
- borderWidth: 1,
60
- borderColor: theme.colors?.border?.primary || '#e5e7eb',
61
- borderRadius: theme.borderRadius?.md || 8,
62
- backgroundColor: theme.colors?.surface?.primary || '#ffffff',
63
-
64
- _web: {
65
- border: `1px solid ${theme.colors?.border?.primary || '#e5e7eb'}`,
66
- },
67
- },
68
-
69
- timeSection: {
70
- flexDirection: 'row',
71
- alignItems: 'flex-start',
72
- gap: theme.spacing?.lg || 24,
73
- },
74
-
75
- timeGroup: {
76
- flex: 1,
77
- gap: theme.spacing?.xs || 8,
78
- alignItems: 'center',
79
- },
80
-
81
- timeGroupLabel: {
82
- fontSize: theme.typography?.fontSize?.sm || 12,
83
- fontWeight: '500',
84
- color: theme.colors?.text?.secondary || '#6b7280',
85
- },
86
-
87
- errorText: {
88
- fontSize: theme.typography?.fontSize?.sm || 12,
89
- color: theme.colors?.semantic?.error || '#dc2626',
90
- marginTop: theme.spacing?.xs || 4,
91
- },
92
-
93
- helperText: {
94
- fontSize: theme.typography?.fontSize?.sm || 12,
95
- color: theme.colors?.text?.secondary || '#6b7280',
96
- marginTop: theme.spacing?.xs || 4,
97
- },
98
-
99
- sideBySideLayout: {
100
- flexDirection: 'row',
101
- gap: theme.spacing?.lg || 24,
102
- alignItems: 'flex-start',
103
- _web: {
104
- display: 'flex',
105
- },
106
- },
107
-
108
- timeSelectionPanel: {
109
- minWidth: 220,
110
- flexShrink: 0,
111
- },
112
-
113
- navigationContainer: {
114
- marginTop: theme.spacing?.sm || 12,
115
- flexDirection: 'row',
116
- justifyContent: 'space-between',
117
- },
118
- }));
@@ -1,21 +0,0 @@
1
- import React from 'react';
2
- import { DateTimeRangePickerProps } from './types';
3
- import { DateTimeRangePickerBase } from './DateTimeRangePickerBase';
4
- import { RangeCalendar } from '../DateRangePicker/RangeCalendar.web';
5
- import { TimePicker } from '../DateTimePicker/TimePicker';
6
-
7
- const DateTimeRangePicker: React.FC<DateTimeRangePickerProps> = (props) => {
8
- return (
9
- <DateTimeRangePickerBase
10
- {...props}
11
- renderRangeCalendar={(rangeCalendarProps) => (
12
- <RangeCalendar {...rangeCalendarProps} />
13
- )}
14
- renderTimePicker={(timePickerProps) => (
15
- <TimePicker {...timePickerProps} />
16
- )}
17
- />
18
- );
19
- };
20
-
21
- export default DateTimeRangePicker;
@@ -1,327 +0,0 @@
1
- import React, { useState, useEffect, useCallback } from 'react';
2
- import { View, Button } from '@idealyst/components';
3
- import { DateTimeRangePickerProps, DateTimeRange } from './types';
4
- import { dateTimeRangePickerStyles } from './DateTimeRangePicker.styles';
5
- import { timePickerStyles } from '../DateTimePicker/TimePicker.styles';
6
- import { getDimensions, addEventListener } from '../DateTimePicker/utils/dimensions';
7
-
8
- interface DateTimeRangePickerBaseProps extends DateTimeRangePickerProps {
9
- renderRangeCalendar: (props: {
10
- value: DateTimeRange;
11
- onChange: (range: DateTimeRange) => void;
12
- minDate?: Date;
13
- maxDate?: Date;
14
- disabled: boolean;
15
- allowSameDay: boolean;
16
- maxDays?: number;
17
- onDateSelected?: (type: 'start' | 'end') => void;
18
- showTimes?: boolean;
19
- timeMode?: '12h' | '24h';
20
- }) => React.ReactNode;
21
- renderTimePicker: (props: {
22
- value: Date;
23
- onChange: (date: Date) => void;
24
- disabled: boolean;
25
- mode: '12h' | '24h';
26
- step: number;
27
- }) => React.ReactNode;
28
- }
29
-
30
- type ViewMode = 'responsive' | 'date' | 'start-time' | 'end-time';
31
- type TimeSelection = 'start' | 'end';
32
-
33
- export const DateTimeRangePickerBase: React.FC<DateTimeRangePickerBaseProps> = ({
34
- value,
35
- onChange,
36
- minDate,
37
- maxDate,
38
- disabled = false,
39
- timeMode = '12h',
40
- timeStep = 1,
41
- allowSameDay = true,
42
- maxDays,
43
- style,
44
- testID,
45
- renderRangeCalendar,
46
- renderTimePicker,
47
- }) => {
48
- const [screenData, setScreenData] = useState(() => getDimensions());
49
- const [viewMode, setViewMode] = useState<ViewMode>('responsive');
50
- const [activeTimeSelection, setActiveTimeSelection] = useState<TimeSelection>('start');
51
-
52
- // Listen for screen dimension changes
53
- useEffect(() => {
54
- const subscription = addEventListener(({ window }) => {
55
- setScreenData(window);
56
- });
57
- return () => subscription?.remove();
58
- }, []);
59
-
60
- // Determine if we should use side-by-side layout
61
- const shouldUseSideBySide = screenData.width >= 700; // Wider threshold for range picker
62
- const canFitSideBySide = screenData.width >= 580; // Minimum for side-by-side
63
-
64
- // Auto-adjust view mode based on screen size
65
- useEffect(() => {
66
- if (shouldUseSideBySide) {
67
- setViewMode('responsive');
68
- } else if (viewMode === 'responsive' && !canFitSideBySide) {
69
- setViewMode('date');
70
- }
71
- }, [shouldUseSideBySide, canFitSideBySide, viewMode]);
72
-
73
- const handleDateRangeChange = useCallback((newRange: DateTimeRange) => {
74
- // Preserve existing times when date changes
75
- const updatedRange: DateTimeRange = { ...newRange };
76
-
77
- if (newRange.startDate && value?.startDate) {
78
- updatedRange.startDate = new Date(newRange.startDate);
79
- updatedRange.startDate.setHours(
80
- value.startDate.getHours(),
81
- value.startDate.getMinutes(),
82
- value.startDate.getSeconds()
83
- );
84
- }
85
-
86
- if (newRange.endDate && value?.endDate) {
87
- updatedRange.endDate = new Date(newRange.endDate);
88
- updatedRange.endDate.setHours(
89
- value.endDate.getHours(),
90
- value.endDate.getMinutes(),
91
- value.endDate.getSeconds()
92
- );
93
- }
94
-
95
- onChange(updatedRange.startDate || updatedRange.endDate ? updatedRange : null);
96
- }, [value, onChange]);
97
-
98
- const handleDateSelected = useCallback((type: 'start' | 'end') => {
99
- // Auto-focus time selection when date is selected on mobile
100
- if (!canFitSideBySide) {
101
- setActiveTimeSelection(type);
102
- setViewMode(type === 'start' ? 'start-time' : 'end-time');
103
- } else {
104
- // On desktop, just switch the active time tab
105
- setActiveTimeSelection(type);
106
- }
107
- }, [canFitSideBySide]);
108
-
109
- const handleStartTimeChange = useCallback((newTime: Date) => {
110
- if (value?.startDate) {
111
- const updatedDate = new Date(value.startDate);
112
- updatedDate.setHours(newTime.getHours(), newTime.getMinutes(), newTime.getSeconds());
113
- onChange({ ...value, startDate: updatedDate });
114
- }
115
- }, [value, onChange]);
116
-
117
- const handleEndTimeChange = useCallback((newTime: Date) => {
118
- if (value?.endDate) {
119
- const updatedDate = new Date(value.endDate);
120
- updatedDate.setHours(newTime.getHours(), newTime.getMinutes(), newTime.getSeconds());
121
- onChange({ ...value, endDate: updatedDate });
122
- }
123
- }, [value, onChange]);
124
-
125
- // Initialize styles
126
- timePickerStyles.useVariants({});
127
-
128
- // Side-by-side layout for larger screens
129
- if (viewMode === 'responsive' && shouldUseSideBySide) {
130
- return (
131
- <View style={[dateTimeRangePickerStyles.container, style]} testID={testID} data-testid={testID}>
132
- {/* Side by side layout */}
133
- <View style={dateTimeRangePickerStyles.sideBySideLayout}>
134
- {renderRangeCalendar({
135
- value: value || {},
136
- onChange: handleDateRangeChange,
137
- minDate,
138
- maxDate,
139
- disabled,
140
- allowSameDay,
141
- maxDays,
142
- onDateSelected: handleDateSelected,
143
- showTimes: true,
144
- timeMode,
145
- })}
146
-
147
- {/* Time Selection Panel */}
148
- {(value?.startDate || value?.endDate) && (
149
- <View style={dateTimeRangePickerStyles.timeSelectionPanel}>
150
- {/* Time Selection Tabs */}
151
- <View style={timePickerStyles.tabBar}>
152
- <Button
153
- onPress={() => setActiveTimeSelection('start')}
154
- disabled={disabled || !value?.startDate}
155
- style={[
156
- timePickerStyles.tabButton,
157
- activeTimeSelection === 'start' ? timePickerStyles.activeTab : timePickerStyles.inactiveTab
158
- ]}
159
- >
160
- Start Time
161
- </Button>
162
- <Button
163
- onPress={() => setActiveTimeSelection('end')}
164
- disabled={disabled || !value?.endDate}
165
- style={[
166
- timePickerStyles.tabButton,
167
- activeTimeSelection === 'end' ? timePickerStyles.activeTab : timePickerStyles.inactiveTab
168
- ]}
169
- >
170
- End Time
171
- </Button>
172
- </View>
173
-
174
- {/* Active Time Picker */}
175
- {activeTimeSelection === 'start' && value?.startDate && (
176
- renderTimePicker({
177
- value: value.startDate,
178
- onChange: handleStartTimeChange,
179
- disabled,
180
- mode: timeMode,
181
- step: timeStep,
182
- })
183
- )}
184
-
185
- {activeTimeSelection === 'end' && value?.endDate && (
186
- renderTimePicker({
187
- value: value.endDate,
188
- onChange: handleEndTimeChange,
189
- disabled,
190
- mode: timeMode,
191
- step: timeStep,
192
- })
193
- )}
194
- </View>
195
- )}
196
- </View>
197
- </View>
198
- );
199
- }
200
-
201
- // Step-by-step layout for smaller screens
202
- const isDateStep = viewMode === 'date';
203
- const isStartTimeStep = viewMode === 'start-time';
204
- const isEndTimeStep = viewMode === 'end-time';
205
-
206
- return (
207
- <View style={[dateTimeRangePickerStyles.container, style]} testID={testID} data-testid={testID}>
208
- {/* Step Navigation */}
209
- <View style={timePickerStyles.tabBar}>
210
- <Button
211
- onPress={() => setViewMode('date')}
212
- disabled={disabled}
213
- style={[
214
- timePickerStyles.tabButton,
215
- isDateStep ? timePickerStyles.activeTab : timePickerStyles.inactiveTab
216
- ]}
217
- >
218
- 1. Dates
219
- </Button>
220
- <Button
221
- onPress={() => setViewMode('start-time')}
222
- disabled={disabled || !value?.startDate}
223
- style={[
224
- timePickerStyles.tabButton,
225
- isStartTimeStep ? timePickerStyles.activeTab : timePickerStyles.inactiveTab
226
- ]}
227
- >
228
- 2. Start Time
229
- </Button>
230
- <Button
231
- onPress={() => setViewMode('end-time')}
232
- disabled={disabled || !value?.endDate}
233
- style={[
234
- timePickerStyles.tabButton,
235
- isEndTimeStep ? timePickerStyles.activeTab : timePickerStyles.inactiveTab
236
- ]}
237
- >
238
- 3. End Time
239
- </Button>
240
- </View>
241
-
242
- {/* Step Content */}
243
- {isDateStep && (
244
- <View>
245
- {renderRangeCalendar({
246
- value: value || {},
247
- onChange: handleDateRangeChange,
248
- minDate,
249
- maxDate,
250
- disabled,
251
- allowSameDay,
252
- maxDays,
253
- onDateSelected: handleDateSelected,
254
- showTimes: true,
255
- timeMode,
256
- })}
257
- </View>
258
- )}
259
-
260
- {isStartTimeStep && value?.startDate && (
261
- <View>
262
- {renderTimePicker({
263
- value: value.startDate,
264
- onChange: handleStartTimeChange,
265
- disabled,
266
- mode: timeMode,
267
- step: timeStep,
268
- })}
269
-
270
- {/* Navigation */}
271
- <View style={dateTimeRangePickerStyles.navigationContainer}>
272
- <Button
273
- variant="text"
274
- size="sm"
275
- onPress={() => setViewMode('date')}
276
- disabled={disabled}
277
- >
278
- ← Back to Dates
279
- </Button>
280
- {value.endDate && (
281
- <Button
282
- variant="text"
283
- size="sm"
284
- onPress={() => setViewMode('end-time')}
285
- disabled={disabled}
286
- >
287
- End Time →
288
- </Button>
289
- )}
290
- </View>
291
- </View>
292
- )}
293
-
294
- {isEndTimeStep && value?.endDate && (
295
- <View>
296
- {renderTimePicker({
297
- value: value.endDate,
298
- onChange: handleEndTimeChange,
299
- disabled,
300
- mode: timeMode,
301
- step: timeStep,
302
- })}
303
-
304
- {/* Navigation */}
305
- <View style={dateTimeRangePickerStyles.navigationContainer}>
306
- <Button
307
- variant="text"
308
- size="sm"
309
- onPress={() => setViewMode('start-time')}
310
- disabled={disabled}
311
- >
312
- ← Start Time
313
- </Button>
314
- <Button
315
- variant="text"
316
- size="sm"
317
- onPress={() => setViewMode('date')}
318
- disabled={disabled}
319
- >
320
- Back to Dates
321
- </Button>
322
- </View>
323
- </View>
324
- )}
325
- </View>
326
- );
327
- };
@@ -1,2 +0,0 @@
1
- export { default as DateTimeRangePicker } from './DateTimeRangePicker.native';
2
- export * from './types';
@@ -1,2 +0,0 @@
1
- export { default as DateTimeRangePicker } from './DateTimeRangePicker.web';
2
- export * from './types';
@@ -1,70 +0,0 @@
1
- import { ReactNode } from 'react';
2
- import { ViewStyle } from 'react-native';
3
-
4
- export interface DateTimeRange {
5
- /** Start date and time of the range */
6
- startDate?: Date;
7
-
8
- /** End date and time of the range */
9
- endDate?: Date;
10
- }
11
-
12
- export interface DateTimeRangePickerProps {
13
- /** Current selected date/time range */
14
- value?: DateTimeRange;
15
-
16
- /** Called when date/time range changes */
17
- onChange: (range: DateTimeRange | null) => void;
18
-
19
- /** Minimum selectable date */
20
- minDate?: Date;
21
-
22
- /** Maximum selectable date */
23
- maxDate?: Date;
24
-
25
- /** Disabled state */
26
- disabled?: boolean;
27
-
28
- /** Placeholder text when no range is selected */
29
- placeholder?: string;
30
-
31
- /** Label for the picker */
32
- label?: string;
33
-
34
- /** Error message to display */
35
- error?: string;
36
-
37
- /** Helper text */
38
- helperText?: string;
39
-
40
- /** Date format for display (default: 'MM/dd/yyyy HH:mm') */
41
- format?: string;
42
-
43
- /** Locale for date formatting */
44
- locale?: string;
45
-
46
- /** Size variant */
47
- size?: 'sm' | 'md' | 'lg';
48
-
49
- /** Visual variant */
50
- variant?: 'outlined' | 'filled';
51
-
52
- /** Time picker mode */
53
- timeMode?: '12h' | '24h';
54
-
55
-
56
- /** Time step in minutes */
57
- timeStep?: number;
58
-
59
- /** Allow same day selection for start and end */
60
- allowSameDay?: boolean;
61
-
62
- /** Maximum number of days in range */
63
- maxDays?: number;
64
-
65
- /** Custom styles */
66
- style?: ViewStyle;
67
-
68
- /** Test ID for testing */
69
- testID?: string;
70
- }
@@ -1,51 +0,0 @@
1
- import { Theme } from '@/theme';
2
- import { StyleSheet } from 'react-native-unistyles';
3
-
4
- type CalendarGridVariants = {
5
- isCurrentMonth: boolean;
6
- isSelected: boolean;
7
- };
8
-
9
- export const calendarGridStyles = StyleSheet.create((theme: Theme) => ({
10
- weekdayHeader: {
11
- marginBottom: 8,
12
- },
13
- weekdayCell: {
14
- alignItems: 'center',
15
- justifyContent: 'center',
16
- paddingVertical: 4,
17
- },
18
- weekdayText: {
19
- fontSize: 12,
20
- fontWeight: '500',
21
- color: theme.colors.text.secondary,
22
- },
23
- calendarGrid: {
24
- marginBottom: 8,
25
- height: 192,
26
- },
27
- dayCell: {
28
- alignItems: 'center',
29
- justifyContent: 'center',
30
- minHeight: 0,
31
-
32
- _web: {
33
- display: 'flex',
34
- alignItems: 'center',
35
- justifyContent: 'center',
36
- }
37
- },
38
- dayButton: ({ isCurrentMonth, isSelected }: CalendarGridVariants) => ({
39
- width: '100%',
40
- height: '100%',
41
- maxWidth: 36,
42
- minWidth: 24,
43
- minHeight: 24,
44
- padding: 0,
45
- borderRadius: 4,
46
- fontSize: 13,
47
- opacity: isCurrentMonth ? 1 : 0.4,
48
- backgroundColor: isSelected ? undefined : 'transparent',
49
- color: isSelected ? undefined : theme.colors.text.primary,
50
- }),
51
- }));