@demlanide/react-lucky-components 0.1.0
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.
- package/README.md +184 -0
- package/dist/Alert/Alert.d.ts +3 -0
- package/dist/Alert/Alert.d.ts.map +1 -0
- package/dist/Alert/Alert.js +7 -0
- package/dist/Alert/constants.d.ts +38 -0
- package/dist/Alert/constants.d.ts.map +1 -0
- package/dist/Alert/constants.js +34 -0
- package/dist/Alert/index.d.ts +3 -0
- package/dist/Alert/index.d.ts.map +1 -0
- package/dist/Alert/index.js +1 -0
- package/dist/Alert/styles.d.ts +11 -0
- package/dist/Alert/styles.d.ts.map +1 -0
- package/dist/Alert/styles.js +49 -0
- package/dist/Alert/types.d.ts +20 -0
- package/dist/Alert/types.d.ts.map +1 -0
- package/dist/Alert/types.js +1 -0
- package/dist/Avatar/Avatar.d.ts +3 -0
- package/dist/Avatar/Avatar.d.ts.map +1 -0
- package/dist/Avatar/Avatar.js +33 -0
- package/dist/Avatar/Shapes/.map.json +42 -0
- package/dist/Avatar/Shapes/romb.png +0 -0
- package/dist/Avatar/consts.d.ts +21 -0
- package/dist/Avatar/consts.d.ts.map +1 -0
- package/dist/Avatar/consts.js +20 -0
- package/dist/Avatar/index.d.ts +3 -0
- package/dist/Avatar/index.d.ts.map +1 -0
- package/dist/Avatar/index.js +1 -0
- package/dist/Avatar/styles.d.ts +27 -0
- package/dist/Avatar/styles.d.ts.map +1 -0
- package/dist/Avatar/styles.js +83 -0
- package/dist/Avatar/types.d.ts +31 -0
- package/dist/Avatar/types.d.ts.map +1 -0
- package/dist/Avatar/types.js +1 -0
- package/dist/Avatar/utilities.d.ts +8 -0
- package/dist/Avatar/utilities.d.ts.map +1 -0
- package/dist/Avatar/utilities.js +66 -0
- package/dist/Badge/Badge.d.ts +3 -0
- package/dist/Badge/Badge.d.ts.map +1 -0
- package/dist/Badge/Badge.js +8 -0
- package/dist/Badge/constants.d.ts +20 -0
- package/dist/Badge/constants.d.ts.map +1 -0
- package/dist/Badge/constants.js +32 -0
- package/dist/Badge/index.d.ts +3 -0
- package/dist/Badge/index.d.ts.map +1 -0
- package/dist/Badge/index.js +1 -0
- package/dist/Badge/styles.d.ts +10 -0
- package/dist/Badge/styles.d.ts.map +1 -0
- package/dist/Badge/styles.js +28 -0
- package/dist/Badge/types.d.ts +18 -0
- package/dist/Badge/types.d.ts.map +1 -0
- package/dist/Badge/types.js +1 -0
- package/dist/BigInput/BigInput.d.ts +3 -0
- package/dist/BigInput/BigInput.d.ts.map +1 -0
- package/dist/BigInput/BigInput.js +46 -0
- package/dist/BigInput/constants.d.ts +32 -0
- package/dist/BigInput/constants.d.ts.map +1 -0
- package/dist/BigInput/constants.js +31 -0
- package/dist/BigInput/index.d.ts +3 -0
- package/dist/BigInput/index.d.ts.map +1 -0
- package/dist/BigInput/index.js +1 -0
- package/dist/BigInput/styles.d.ts +14 -0
- package/dist/BigInput/styles.d.ts.map +1 -0
- package/dist/BigInput/styles.js +80 -0
- package/dist/BigInput/types.d.ts +23 -0
- package/dist/BigInput/types.d.ts.map +1 -0
- package/dist/BigInput/types.js +1 -0
- package/dist/Button/Button.d.ts +3 -0
- package/dist/Button/Button.d.ts.map +1 -0
- package/dist/Button/Button.js +7 -0
- package/dist/Button/constants.d.ts +23 -0
- package/dist/Button/constants.d.ts.map +1 -0
- package/dist/Button/constants.js +28 -0
- package/dist/Button/index.d.ts +3 -0
- package/dist/Button/index.d.ts.map +1 -0
- package/dist/Button/index.js +1 -0
- package/dist/Button/styles.d.ts +13 -0
- package/dist/Button/styles.d.ts.map +1 -0
- package/dist/Button/styles.js +34 -0
- package/dist/Button/types.d.ts +20 -0
- package/dist/Button/types.d.ts.map +1 -0
- package/dist/Button/types.js +1 -0
- package/dist/CardStack/BehindCard.d.ts +12 -0
- package/dist/CardStack/BehindCard.d.ts.map +1 -0
- package/dist/CardStack/BehindCard.js +18 -0
- package/dist/CardStack/CardStack.d.ts +3 -0
- package/dist/CardStack/CardStack.d.ts.map +1 -0
- package/dist/CardStack/CardStack.js +77 -0
- package/dist/CardStack/CardStackDots.d.ts +3 -0
- package/dist/CardStack/CardStackDots.d.ts.map +1 -0
- package/dist/CardStack/CardStackDots.js +121 -0
- package/dist/CardStack/StackCard.d.ts +27 -0
- package/dist/CardStack/StackCard.d.ts.map +1 -0
- package/dist/CardStack/StackCard.js +45 -0
- package/dist/CardStack/constants.d.ts +32 -0
- package/dist/CardStack/constants.d.ts.map +1 -0
- package/dist/CardStack/constants.js +31 -0
- package/dist/CardStack/index.d.ts +4 -0
- package/dist/CardStack/index.d.ts.map +1 -0
- package/dist/CardStack/index.js +2 -0
- package/dist/CardStack/types.d.ts +39 -0
- package/dist/CardStack/types.d.ts.map +1 -0
- package/dist/CardStack/types.js +1 -0
- package/dist/CardStack/useSwipeGesture.d.ts +18 -0
- package/dist/CardStack/useSwipeGesture.d.ts.map +1 -0
- package/dist/CardStack/useSwipeGesture.js +70 -0
- package/dist/DatePicker/CalendarModal.d.ts +15 -0
- package/dist/DatePicker/CalendarModal.d.ts.map +1 -0
- package/dist/DatePicker/CalendarModal.js +129 -0
- package/dist/DatePicker/DatePicker.d.ts +3 -0
- package/dist/DatePicker/DatePicker.d.ts.map +1 -0
- package/dist/DatePicker/DatePicker.js +57 -0
- package/dist/DatePicker/DayCell.d.ts +14 -0
- package/dist/DatePicker/DayCell.d.ts.map +1 -0
- package/dist/DatePicker/DayCell.js +16 -0
- package/dist/DatePicker/constants.d.ts +46 -0
- package/dist/DatePicker/constants.d.ts.map +1 -0
- package/dist/DatePicker/constants.js +51 -0
- package/dist/DatePicker/icons.d.ts +4 -0
- package/dist/DatePicker/icons.d.ts.map +1 -0
- package/dist/DatePicker/icons.js +12 -0
- package/dist/DatePicker/index.d.ts +3 -0
- package/dist/DatePicker/index.d.ts.map +1 -0
- package/dist/DatePicker/index.js +1 -0
- package/dist/DatePicker/styles.d.ts +40 -0
- package/dist/DatePicker/styles.d.ts.map +1 -0
- package/dist/DatePicker/styles.js +134 -0
- package/dist/DatePicker/types.d.ts +39 -0
- package/dist/DatePicker/types.d.ts.map +1 -0
- package/dist/DatePicker/types.js +1 -0
- package/dist/DatePicker/utils.d.ts +15 -0
- package/dist/DatePicker/utils.d.ts.map +1 -0
- package/dist/DatePicker/utils.js +133 -0
- package/dist/DimmedScrollView/DimmedScrollView.d.ts +5 -0
- package/dist/DimmedScrollView/DimmedScrollView.d.ts.map +1 -0
- package/dist/DimmedScrollView/DimmedScrollView.js +18 -0
- package/dist/DimmedScrollView/index.d.ts +3 -0
- package/dist/DimmedScrollView/index.d.ts.map +1 -0
- package/dist/DimmedScrollView/index.js +1 -0
- package/dist/DimmedScrollView/styles.d.ts +15 -0
- package/dist/DimmedScrollView/styles.d.ts.map +1 -0
- package/dist/DimmedScrollView/styles.js +32 -0
- package/dist/DimmedScrollView/types.d.ts +20 -0
- package/dist/DimmedScrollView/types.d.ts.map +1 -0
- package/dist/DimmedScrollView/types.js +1 -0
- package/dist/FadingEdge/FadingEdge.d.ts +3 -0
- package/dist/FadingEdge/FadingEdge.d.ts.map +1 -0
- package/dist/FadingEdge/FadingEdge.js +30 -0
- package/dist/FadingEdge/index.d.ts +3 -0
- package/dist/FadingEdge/index.d.ts.map +1 -0
- package/dist/FadingEdge/index.js +1 -0
- package/dist/FadingEdge/types.d.ts +14 -0
- package/dist/FadingEdge/types.d.ts.map +1 -0
- package/dist/FadingEdge/types.js +1 -0
- package/dist/Icon/Icon.d.ts +6 -0
- package/dist/Icon/Icon.d.ts.map +1 -0
- package/dist/Icon/Icon.js +16 -0
- package/dist/Icon/defaults.d.ts +7 -0
- package/dist/Icon/defaults.d.ts.map +1 -0
- package/dist/Icon/defaults.js +80 -0
- package/dist/Icon/icons/navigation.d.ts +10 -0
- package/dist/Icon/icons/navigation.d.ts.map +1 -0
- package/dist/Icon/icons/navigation.js +10 -0
- package/dist/Icon/icons/system.d.ts +29 -0
- package/dist/Icon/icons/system.d.ts.map +1 -0
- package/dist/Icon/icons/system.js +29 -0
- package/dist/Icon/icons/tabs.d.ts +6 -0
- package/dist/Icon/icons/tabs.d.ts.map +1 -0
- package/dist/Icon/icons/tabs.js +6 -0
- package/dist/Icon/index.d.ts +3 -0
- package/dist/Icon/index.d.ts.map +1 -0
- package/dist/Icon/index.js +1 -0
- package/dist/Icon/registry.d.ts +3 -0
- package/dist/Icon/registry.d.ts.map +1 -0
- package/dist/Icon/registry.js +43 -0
- package/dist/Icon/types.d.ts +20 -0
- package/dist/Icon/types.d.ts.map +1 -0
- package/dist/Icon/types.js +40 -0
- package/dist/Input/Input.d.ts +5 -0
- package/dist/Input/Input.d.ts.map +1 -0
- package/dist/Input/Input.js +64 -0
- package/dist/Input/constants.d.ts +56 -0
- package/dist/Input/constants.d.ts.map +1 -0
- package/dist/Input/constants.js +61 -0
- package/dist/Input/index.d.ts +3 -0
- package/dist/Input/index.d.ts.map +1 -0
- package/dist/Input/index.js +1 -0
- package/dist/Input/styles.d.ts +23 -0
- package/dist/Input/styles.d.ts.map +1 -0
- package/dist/Input/styles.js +99 -0
- package/dist/Input/types.d.ts +21 -0
- package/dist/Input/types.d.ts.map +1 -0
- package/dist/Input/types.js +1 -0
- package/dist/ListCell/CheckMark.d.ts +10 -0
- package/dist/ListCell/CheckMark.d.ts.map +1 -0
- package/dist/ListCell/CheckMark.js +12 -0
- package/dist/ListCell/Chevron.d.ts +14 -0
- package/dist/ListCell/Chevron.d.ts.map +1 -0
- package/dist/ListCell/Chevron.js +22 -0
- package/dist/ListCell/ListCell.d.ts +3 -0
- package/dist/ListCell/ListCell.d.ts.map +1 -0
- package/dist/ListCell/ListCell.js +120 -0
- package/dist/ListCell/PickerModal.d.ts +13 -0
- package/dist/ListCell/PickerModal.d.ts.map +1 -0
- package/dist/ListCell/PickerModal.js +8 -0
- package/dist/ListCell/RadioButton.d.ts +10 -0
- package/dist/ListCell/RadioButton.d.ts.map +1 -0
- package/dist/ListCell/RadioButton.js +12 -0
- package/dist/ListCell/SwitchTrack.d.ts +19 -0
- package/dist/ListCell/SwitchTrack.d.ts.map +1 -0
- package/dist/ListCell/SwitchTrack.js +8 -0
- package/dist/ListCell/constants.d.ts +30 -0
- package/dist/ListCell/constants.d.ts.map +1 -0
- package/dist/ListCell/constants.js +35 -0
- package/dist/ListCell/index.d.ts +3 -0
- package/dist/ListCell/index.d.ts.map +1 -0
- package/dist/ListCell/index.js +1 -0
- package/dist/ListCell/styles.d.ts +28 -0
- package/dist/ListCell/styles.d.ts.map +1 -0
- package/dist/ListCell/styles.js +111 -0
- package/dist/ListCell/types.d.ts +68 -0
- package/dist/ListCell/types.d.ts.map +1 -0
- package/dist/ListCell/types.js +1 -0
- package/dist/ListCell/useSwitchAnimation.d.ts +12 -0
- package/dist/ListCell/useSwitchAnimation.d.ts.map +1 -0
- package/dist/ListCell/useSwitchAnimation.js +31 -0
- package/dist/ListCell/utilities.d.ts +24 -0
- package/dist/ListCell/utilities.d.ts.map +1 -0
- package/dist/ListCell/utilities.js +29 -0
- package/dist/Picker/Picker.d.ts +3 -0
- package/dist/Picker/Picker.d.ts.map +1 -0
- package/dist/Picker/Picker.js +76 -0
- package/dist/Picker/PickerHeader.d.ts +7 -0
- package/dist/Picker/PickerHeader.d.ts.map +1 -0
- package/dist/Picker/PickerHeader.js +6 -0
- package/dist/Picker/PickerRow.d.ts +9 -0
- package/dist/Picker/PickerRow.d.ts.map +1 -0
- package/dist/Picker/PickerRow.js +9 -0
- package/dist/Picker/SearchField.d.ts +8 -0
- package/dist/Picker/SearchField.d.ts.map +1 -0
- package/dist/Picker/SearchField.js +8 -0
- package/dist/Picker/constants.d.ts +24 -0
- package/dist/Picker/constants.d.ts.map +1 -0
- package/dist/Picker/constants.js +29 -0
- package/dist/Picker/icons.d.ts +3 -0
- package/dist/Picker/icons.d.ts.map +1 -0
- package/dist/Picker/icons.js +9 -0
- package/dist/Picker/index.d.ts +3 -0
- package/dist/Picker/index.d.ts.map +1 -0
- package/dist/Picker/index.js +1 -0
- package/dist/Picker/styles.d.ts +34 -0
- package/dist/Picker/styles.d.ts.map +1 -0
- package/dist/Picker/styles.js +192 -0
- package/dist/Picker/types.d.ts +40 -0
- package/dist/Picker/types.d.ts.map +1 -0
- package/dist/Picker/types.js +1 -0
- package/dist/Picker/useFilteredItems.d.ts +3 -0
- package/dist/Picker/useFilteredItems.d.ts.map +1 -0
- package/dist/Picker/useFilteredItems.js +18 -0
- package/dist/SegmentedTabs/SegmentedTabs.d.ts +3 -0
- package/dist/SegmentedTabs/SegmentedTabs.d.ts.map +1 -0
- package/dist/SegmentedTabs/SegmentedTabs.js +70 -0
- package/dist/SegmentedTabs/index.d.ts +3 -0
- package/dist/SegmentedTabs/index.d.ts.map +1 -0
- package/dist/SegmentedTabs/index.js +1 -0
- package/dist/SegmentedTabs/types.d.ts +10 -0
- package/dist/SegmentedTabs/types.d.ts.map +1 -0
- package/dist/SegmentedTabs/types.js +1 -0
- package/dist/Select/Select.d.ts +3 -0
- package/dist/Select/Select.d.ts.map +1 -0
- package/dist/Select/Select.js +60 -0
- package/dist/Select/index.d.ts +3 -0
- package/dist/Select/index.d.ts.map +1 -0
- package/dist/Select/index.js +1 -0
- package/dist/Select/styles.d.ts +8 -0
- package/dist/Select/styles.d.ts.map +1 -0
- package/dist/Select/styles.js +36 -0
- package/dist/Select/types.d.ts +37 -0
- package/dist/Select/types.d.ts.map +1 -0
- package/dist/Select/types.js +1 -0
- package/dist/Tabs/FloatingTabBar.d.ts +9 -0
- package/dist/Tabs/FloatingTabBar.d.ts.map +1 -0
- package/dist/Tabs/FloatingTabBar.js +55 -0
- package/dist/Tabs/Tabs.d.ts +21 -0
- package/dist/Tabs/Tabs.d.ts.map +1 -0
- package/dist/Tabs/Tabs.js +29 -0
- package/dist/Tabs/constants.d.ts +35 -0
- package/dist/Tabs/constants.d.ts.map +1 -0
- package/dist/Tabs/constants.js +36 -0
- package/dist/Tabs/icons.d.ts +16 -0
- package/dist/Tabs/icons.d.ts.map +1 -0
- package/dist/Tabs/icons.js +8 -0
- package/dist/Tabs/index.d.ts +6 -0
- package/dist/Tabs/index.d.ts.map +1 -0
- package/dist/Tabs/index.js +4 -0
- package/dist/Tabs/styles.d.ts +224 -0
- package/dist/Tabs/styles.d.ts.map +1 -0
- package/dist/Tabs/styles.js +121 -0
- package/dist/Tabs/types.d.ts +61 -0
- package/dist/Tabs/types.d.ts.map +1 -0
- package/dist/Tabs/types.js +4 -0
- package/dist/Tabs/useFloatingTabBarScrollPadding.d.ts +7 -0
- package/dist/Tabs/useFloatingTabBarScrollPadding.d.ts.map +1 -0
- package/dist/Tabs/useFloatingTabBarScrollPadding.js +11 -0
- package/dist/Tabs/utilities.d.ts +7 -0
- package/dist/Tabs/utilities.d.ts.map +1 -0
- package/dist/Tabs/utilities.js +18 -0
- package/dist/ToggleSection/ToggleSection.d.ts +3 -0
- package/dist/ToggleSection/ToggleSection.d.ts.map +1 -0
- package/dist/ToggleSection/ToggleSection.js +18 -0
- package/dist/ToggleSection/index.d.ts +3 -0
- package/dist/ToggleSection/index.d.ts.map +1 -0
- package/dist/ToggleSection/index.js +1 -0
- package/dist/ToggleSection/styles.d.ts +15 -0
- package/dist/ToggleSection/styles.d.ts.map +1 -0
- package/dist/ToggleSection/styles.js +49 -0
- package/dist/ToggleSection/types.d.ts +36 -0
- package/dist/ToggleSection/types.d.ts.map +1 -0
- package/dist/ToggleSection/types.js +1 -0
- package/dist/assets/fonts/.map.json +51 -0
- package/dist/assets/fonts/SB Sans Text.ttf +0 -0
- package/dist/assets/fonts/sf-pro-display/.map.json +114 -0
- package/dist/assets/fonts/sf-pro-display/SFPRODISPLAYBLACKITALIC.OTF +0 -0
- package/dist/assets/fonts/sf-pro-display/SFPRODISPLAYBOLD.OTF +0 -0
- package/dist/assets/fonts/sf-pro-display/SFPRODISPLAYHEAVYITALIC.OTF +0 -0
- package/dist/assets/fonts/sf-pro-display/SFPRODISPLAYLIGHTITALIC.OTF +0 -0
- package/dist/assets/fonts/sf-pro-display/SFPRODISPLAYMEDIUM.OTF +0 -0
- package/dist/assets/fonts/sf-pro-display/SFPRODISPLAYREGULAR.otf +0 -0
- package/dist/assets/fonts/sf-pro-display/SFPRODISPLAYSEMIBOLDITALIC.OTF +0 -0
- package/dist/assets/fonts/sf-pro-display/SFPRODISPLAYTHINITALIC.OTF +0 -0
- package/dist/assets/fonts/sf-pro-display/SFPRODISPLAYULTRALIGHTITALIC.OTF +0 -0
- package/dist/fonts.d.ts +6 -0
- package/dist/fonts.d.ts.map +1 -0
- package/dist/fonts.js +8 -0
- package/dist/index.d.ts +38 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/theme.d.ts +19 -0
- package/dist/theme.d.ts.map +1 -0
- package/dist/theme.js +18 -0
- package/package.json +76 -0
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { DatePickerMode, DateRangeValue } from './types';
|
|
2
|
+
export interface CalendarModalProps {
|
|
3
|
+
visible: boolean;
|
|
4
|
+
mode: DatePickerMode;
|
|
5
|
+
initialSingle?: string;
|
|
6
|
+
initialRange: DateRangeValue;
|
|
7
|
+
initialYear: number;
|
|
8
|
+
initialMonth: number;
|
|
9
|
+
minDate: Date | null;
|
|
10
|
+
maxDate: Date | null;
|
|
11
|
+
onSave: (single: string | undefined, range: DateRangeValue) => void;
|
|
12
|
+
onClose: () => void;
|
|
13
|
+
}
|
|
14
|
+
export declare function CalendarModal({ visible, mode, initialSingle, initialRange, initialYear, initialMonth, minDate, maxDate, onSave, onClose, }: CalendarModalProps): import("react/jsx-runtime").JSX.Element;
|
|
15
|
+
//# sourceMappingURL=CalendarModal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CalendarModal.d.ts","sourceRoot":"","sources":["../../src/DatePicker/CalendarModal.tsx"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAa9D,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,cAAc,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,cAAc,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,IAAI,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,IAAI,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;IACpE,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAID,wBAAgB,aAAa,CAAC,EAC5B,OAAO,EACP,IAAI,EACJ,aAAa,EACb,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,OAAO,EACP,OAAO,EACP,MAAM,EACN,OAAO,GACR,EAAE,kBAAkB,2CAyOpB"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback, useMemo, useState } from 'react';
|
|
3
|
+
import { Modal } from 'react-native';
|
|
4
|
+
import { DAY_LABELS, MONTH_NAMES } from './constants';
|
|
5
|
+
import { DayCell, EmptyDayCell } from './DayCell';
|
|
6
|
+
import { ChevronLeft, ChevronRight } from './icons';
|
|
7
|
+
import { CalendarBody, CalendarHeaderRow, DayLabelCell, DayLabelText, DayLabelsRow, Grabber, ModalContainer, ModalOverlay, MonthTitle, NavButton, SaveButton, SaveButtonText, WeekRow, } from './styles';
|
|
8
|
+
import { buildWeeks, isBefore, isBetween, isSameDay, parseLocalDate, toISOLocal, } from './utils';
|
|
9
|
+
/* ── Component ───────────────────────────────────────────────────── */
|
|
10
|
+
export function CalendarModal({ visible, mode, initialSingle, initialRange, initialYear, initialMonth, minDate, maxDate, onSave, onClose, }) {
|
|
11
|
+
const today = useMemo(() => new Date(), []);
|
|
12
|
+
const [viewYear, setViewYear] = useState(initialYear);
|
|
13
|
+
const [viewMonth, setViewMonth] = useState(initialMonth);
|
|
14
|
+
const [pendingSingle, setPendingSingle] = useState(initialSingle);
|
|
15
|
+
const [pendingRange, setPendingRange] = useState(initialRange);
|
|
16
|
+
/* Reset internal state whenever the modal opens with new props */
|
|
17
|
+
const prevVisibleRef = useMemo(() => ({ current: false }), []);
|
|
18
|
+
if (visible && !prevVisibleRef.current) {
|
|
19
|
+
// Sync to latest props on each open
|
|
20
|
+
if (viewYear !== initialYear)
|
|
21
|
+
setViewYear(initialYear);
|
|
22
|
+
if (viewMonth !== initialMonth)
|
|
23
|
+
setViewMonth(initialMonth);
|
|
24
|
+
setPendingSingle(initialSingle);
|
|
25
|
+
setPendingRange(initialRange);
|
|
26
|
+
}
|
|
27
|
+
prevVisibleRef.current = visible;
|
|
28
|
+
const weeks = useMemo(() => buildWeeks(viewYear, viewMonth), [viewYear, viewMonth]);
|
|
29
|
+
const selectedSingleDate = useMemo(() => (pendingSingle ? parseLocalDate(pendingSingle) : null), [pendingSingle]);
|
|
30
|
+
const rangeStartDate = useMemo(() => (pendingRange.startDate ? parseLocalDate(pendingRange.startDate) : null), [pendingRange.startDate]);
|
|
31
|
+
const rangeEndDate = useMemo(() => (pendingRange.endDate ? parseLocalDate(pendingRange.endDate) : null), [pendingRange.endDate]);
|
|
32
|
+
/* ── Navigation ─────────────────────────────────────────────────── */
|
|
33
|
+
const goToPrevMonth = useCallback(() => {
|
|
34
|
+
setViewMonth((m) => {
|
|
35
|
+
if (m === 0) {
|
|
36
|
+
setViewYear((y) => y - 1);
|
|
37
|
+
return 11;
|
|
38
|
+
}
|
|
39
|
+
return m - 1;
|
|
40
|
+
});
|
|
41
|
+
}, []);
|
|
42
|
+
const goToNextMonth = useCallback(() => {
|
|
43
|
+
setViewMonth((m) => {
|
|
44
|
+
if (m === 11) {
|
|
45
|
+
setViewYear((y) => y + 1);
|
|
46
|
+
return 0;
|
|
47
|
+
}
|
|
48
|
+
return m + 1;
|
|
49
|
+
});
|
|
50
|
+
}, []);
|
|
51
|
+
/* ── Day press ──────────────────────────────────────────────────── */
|
|
52
|
+
const handleDayPress = useCallback((date) => {
|
|
53
|
+
if (mode === 'single') {
|
|
54
|
+
setPendingSingle(toISOLocal(date));
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
setPendingRange((prev) => {
|
|
58
|
+
const hasCompleteRange = prev.startDate && prev.endDate;
|
|
59
|
+
if (hasCompleteRange || !prev.startDate) {
|
|
60
|
+
return { startDate: toISOLocal(date), endDate: undefined };
|
|
61
|
+
}
|
|
62
|
+
const start = parseLocalDate(prev.startDate);
|
|
63
|
+
if (isBefore(date, start)) {
|
|
64
|
+
return { startDate: toISOLocal(date), endDate: undefined };
|
|
65
|
+
}
|
|
66
|
+
return { startDate: prev.startDate, endDate: toISOLocal(date) };
|
|
67
|
+
});
|
|
68
|
+
}, [mode]);
|
|
69
|
+
/* ── Save ───────────────────────────────────────────────────────── */
|
|
70
|
+
const handleSave = useCallback(() => {
|
|
71
|
+
onSave(pendingSingle, {
|
|
72
|
+
startDate: pendingRange.startDate,
|
|
73
|
+
endDate: pendingRange.endDate,
|
|
74
|
+
});
|
|
75
|
+
}, [pendingSingle, pendingRange, onSave]);
|
|
76
|
+
/* ── Day disabled check ─────────────────────────────────────────── */
|
|
77
|
+
const isDayDisabled = useCallback((date) => {
|
|
78
|
+
if (minDate && isBefore(date, minDate))
|
|
79
|
+
return true;
|
|
80
|
+
if (maxDate && date > maxDate && !isSameDay(date, maxDate))
|
|
81
|
+
return true;
|
|
82
|
+
return false;
|
|
83
|
+
}, [minDate, maxDate]);
|
|
84
|
+
/* ── Calendar grid ──────────────────────────────────────────────── */
|
|
85
|
+
const calendarContent = useMemo(() => {
|
|
86
|
+
return weeks.map((week, wi) => (_jsx(WeekRow, { children: week.map((cell, ci) => {
|
|
87
|
+
if (!cell)
|
|
88
|
+
return _jsx(EmptyDayCell, {}, `e${ci}`);
|
|
89
|
+
const { day, date } = cell;
|
|
90
|
+
const dayDisabled = isDayDisabled(date);
|
|
91
|
+
const isToday = isSameDay(date, today);
|
|
92
|
+
let isSelected = false;
|
|
93
|
+
let isRangeStart = false;
|
|
94
|
+
let isRangeEnd = false;
|
|
95
|
+
let isInRange = false;
|
|
96
|
+
if (mode === 'single') {
|
|
97
|
+
isSelected =
|
|
98
|
+
selectedSingleDate != null && isSameDay(date, selectedSingleDate);
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
if (rangeStartDate && isSameDay(date, rangeStartDate)) {
|
|
102
|
+
isSelected = true;
|
|
103
|
+
isRangeStart = true;
|
|
104
|
+
}
|
|
105
|
+
if (rangeEndDate && isSameDay(date, rangeEndDate)) {
|
|
106
|
+
isSelected = true;
|
|
107
|
+
isRangeEnd = true;
|
|
108
|
+
}
|
|
109
|
+
if (rangeStartDate && rangeEndDate) {
|
|
110
|
+
isInRange = isBetween(date, rangeStartDate, rangeEndDate);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return (_jsx(DayCell, { day: day, date: date, isSelected: isSelected, isRangeStart: isRangeStart, isRangeEnd: isRangeEnd, isInRange: isInRange, isToday: isToday, isDisabled: dayDisabled, onPress: handleDayPress }, day));
|
|
114
|
+
}) }, wi)));
|
|
115
|
+
}, [
|
|
116
|
+
weeks,
|
|
117
|
+
mode,
|
|
118
|
+
selectedSingleDate,
|
|
119
|
+
rangeStartDate,
|
|
120
|
+
rangeEndDate,
|
|
121
|
+
today,
|
|
122
|
+
isDayDisabled,
|
|
123
|
+
handleDayPress,
|
|
124
|
+
]);
|
|
125
|
+
const canSave = mode === 'single'
|
|
126
|
+
? pendingSingle != null
|
|
127
|
+
: pendingRange.startDate != null && pendingRange.endDate != null;
|
|
128
|
+
return (_jsx(Modal, { visible: visible, animationType: "fade", transparent: true, onRequestClose: onClose, children: _jsx(ModalOverlay, { onPress: onClose, children: _jsxs(ModalContainer, { onStartShouldSetResponder: () => true, onTouchEnd: (e) => e.stopPropagation(), children: [_jsx(Grabber, {}), _jsxs(CalendarHeaderRow, { children: [_jsx(NavButton, { onPress: goToPrevMonth, accessibilityLabel: "Previous month", accessibilityRole: "button", children: _jsx(ChevronLeft, {}) }), _jsxs(MonthTitle, { children: [MONTH_NAMES[viewMonth], " ", viewYear] }), _jsx(NavButton, { onPress: goToNextMonth, accessibilityLabel: "Next month", accessibilityRole: "button", children: _jsx(ChevronRight, {}) })] }), _jsx(DayLabelsRow, { children: DAY_LABELS.map((label) => (_jsx(DayLabelCell, { children: _jsx(DayLabelText, { children: label }) }, label))) }), _jsx(CalendarBody, { children: calendarContent }), _jsx(SaveButton, { onPress: handleSave, disabled: !canSave, accessibilityLabel: "Save date", accessibilityRole: "button", testID: "datepicker-save-button", style: { opacity: canSave ? 1 : 0.4 }, children: _jsx(SaveButtonText, { children: "Save" }) })] }) }) }));
|
|
129
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { DatePickerProps } from './types';
|
|
2
|
+
export declare function DatePicker({ mode, value, onChange, minDate: minDateStr, maxDate: maxDateStr, placeholder, required, helperText, errorText, disabled, containerStyle, inputWrapperStyle, testID, renderTrigger, }: DatePickerProps): import("react/jsx-runtime").JSX.Element;
|
|
3
|
+
//# sourceMappingURL=DatePicker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DatePicker.d.ts","sourceRoot":"","sources":["../../src/DatePicker/DatePicker.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,eAAe,EAAkB,MAAM,SAAS,CAAC;AAG/D,wBAAgB,UAAU,CAAC,EACzB,IAAe,EACf,KAAK,EACL,QAAQ,EACR,OAAO,EAAE,UAAU,EACnB,OAAO,EAAE,UAAU,EACnB,WAAW,EACX,QAAgB,EAChB,UAAU,EACV,SAAS,EACT,QAAgB,EAChB,cAAc,EACd,iBAAiB,EACjB,MAAM,EACN,aAAa,GACd,EAAE,eAAe,2CAgHjB"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback, useMemo, useState } from 'react';
|
|
3
|
+
import { Keyboard } from 'react-native';
|
|
4
|
+
import { Input } from '../Input/Input';
|
|
5
|
+
import { CalendarModal } from './CalendarModal';
|
|
6
|
+
import { CalendarIcon } from './icons';
|
|
7
|
+
import { Pressable } from './styles';
|
|
8
|
+
import { formatDisplayValue, parseLocalDate, sanitizeValue } from './utils';
|
|
9
|
+
export function DatePicker({ mode = 'single', value, onChange, minDate: minDateStr, maxDate: maxDateStr, placeholder, required = false, helperText, errorText, disabled = false, containerStyle, inputWrapperStyle, testID, renderTrigger, }) {
|
|
10
|
+
const [visible, setVisible] = useState(false);
|
|
11
|
+
const today = useMemo(() => new Date(), []);
|
|
12
|
+
const minDate = useMemo(() => (minDateStr ? parseLocalDate(minDateStr) : null), [minDateStr]);
|
|
13
|
+
const maxDate = useMemo(() => (maxDateStr ? parseLocalDate(maxDateStr) : null), [maxDateStr]);
|
|
14
|
+
const safeValue = useMemo(() => sanitizeValue(value, mode, minDate, maxDate), [value, mode, minDate, maxDate]);
|
|
15
|
+
const displayValue = useMemo(() => formatDisplayValue(safeValue, mode), [safeValue, mode]);
|
|
16
|
+
/* ── Derive what to pass into the modal ─────────────────────────── */
|
|
17
|
+
const initialSingle = mode === 'single' && typeof safeValue === 'string' ? safeValue : undefined;
|
|
18
|
+
const initialRange = mode === 'range' && safeValue && typeof safeValue === 'object'
|
|
19
|
+
? safeValue
|
|
20
|
+
: {};
|
|
21
|
+
const resolveInitialDate = useCallback(() => {
|
|
22
|
+
if (mode === 'single' && typeof safeValue === 'string' && safeValue) {
|
|
23
|
+
const d = parseLocalDate(safeValue);
|
|
24
|
+
if (d)
|
|
25
|
+
return { year: d.getFullYear(), month: d.getMonth() };
|
|
26
|
+
}
|
|
27
|
+
if (mode === 'range' && safeValue && typeof safeValue === 'object') {
|
|
28
|
+
const rv = safeValue;
|
|
29
|
+
if (rv.startDate) {
|
|
30
|
+
const d = parseLocalDate(rv.startDate);
|
|
31
|
+
if (d)
|
|
32
|
+
return { year: d.getFullYear(), month: d.getMonth() };
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return { year: today.getFullYear(), month: today.getMonth() };
|
|
36
|
+
}, [safeValue, mode, today]);
|
|
37
|
+
/* ── Handlers ───────────────────────────────────────────────────── */
|
|
38
|
+
const open = useCallback(() => {
|
|
39
|
+
if (disabled)
|
|
40
|
+
return;
|
|
41
|
+
Keyboard.dismiss();
|
|
42
|
+
setVisible(true);
|
|
43
|
+
}, [disabled]);
|
|
44
|
+
const close = useCallback(() => setVisible(false), []);
|
|
45
|
+
const handleSave = useCallback((single, range) => {
|
|
46
|
+
if (mode === 'single') {
|
|
47
|
+
if (single)
|
|
48
|
+
onChange?.(single);
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
onChange?.({ startDate: range.startDate, endDate: range.endDate });
|
|
52
|
+
}
|
|
53
|
+
setVisible(false);
|
|
54
|
+
}, [mode, onChange]);
|
|
55
|
+
const { year: initYear, month: initMonth } = resolveInitialDate();
|
|
56
|
+
return (_jsxs(_Fragment, { children: [renderTrigger ? renderTrigger(displayValue, open) : (_jsx(Pressable, { onPress: open, disabled: disabled, accessibilityRole: "button", accessibilityState: { disabled }, testID: testID, children: _jsx(Input, { value: displayValue, placeholder: placeholder, required: required, helperText: helperText, errorText: errorText, editable: false, disabled: disabled, rightIcon: _jsx(CalendarIcon, {}), containerStyle: containerStyle, inputWrapperStyle: inputWrapperStyle, pointerEvents: "none" }) })), _jsx(CalendarModal, { visible: visible, mode: mode, initialSingle: initialSingle, initialRange: initialRange, initialYear: initYear, initialMonth: initMonth, minDate: minDate, maxDate: maxDate, onSave: handleSave, onClose: close })] }));
|
|
57
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface DayCellProps {
|
|
2
|
+
day: number;
|
|
3
|
+
date: Date;
|
|
4
|
+
isSelected: boolean;
|
|
5
|
+
isRangeStart: boolean;
|
|
6
|
+
isRangeEnd: boolean;
|
|
7
|
+
isInRange: boolean;
|
|
8
|
+
isToday: boolean;
|
|
9
|
+
isDisabled: boolean;
|
|
10
|
+
onPress: (date: Date) => void;
|
|
11
|
+
}
|
|
12
|
+
export declare function DayCell({ day, date, isSelected, isRangeStart, isRangeEnd, isInRange, isToday, isDisabled, onPress, }: DayCellProps): import("react/jsx-runtime").JSX.Element;
|
|
13
|
+
export declare function EmptyDayCell(): import("react/jsx-runtime").JSX.Element;
|
|
14
|
+
//# sourceMappingURL=DayCell.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DayCell.d.ts","sourceRoot":"","sources":["../../src/DatePicker/DayCell.tsx"],"names":[],"mappings":"AAUA,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,IAAI,CAAC;IACX,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;CAC/B;AAED,wBAAgB,OAAO,CAAC,EACtB,GAAG,EACH,IAAI,EACJ,UAAU,EACV,YAAY,EACZ,UAAU,EACV,SAAS,EACT,OAAO,EACP,UAAU,EACV,OAAO,GACR,EAAE,YAAY,2CA6Bd;AAED,wBAAgB,YAAY,4CAM3B"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback } from 'react';
|
|
3
|
+
import { View } from 'react-native';
|
|
4
|
+
import { CALENDAR } from './constants';
|
|
5
|
+
import { DayRangeFill, DayCellInner, DayCellOuter, DayText, } from './styles';
|
|
6
|
+
export function DayCell({ day, date, isSelected, isRangeStart, isRangeEnd, isInRange, isToday, isDisabled, onPress, }) {
|
|
7
|
+
const handlePress = useCallback(() => {
|
|
8
|
+
if (!isDisabled)
|
|
9
|
+
onPress(date);
|
|
10
|
+
}, [date, isDisabled, onPress]);
|
|
11
|
+
const hasRangeFill = isInRange && !(isRangeStart && isRangeEnd);
|
|
12
|
+
return (_jsxs(DayCellOuter, { children: [hasRangeFill ? (_jsx(DayRangeFill, { "$isRangeStart": isRangeStart, "$isRangeEnd": isRangeEnd })) : null, _jsx(DayCellInner, { onPress: handlePress, disabled: isDisabled, "$isSelected": isSelected, "$isToday": isToday, "$isDisabled": isDisabled, accessibilityRole: "button", accessibilityLabel: `${day}`, accessibilityState: { disabled: isDisabled, selected: isSelected }, children: _jsx(DayText, { "$isSelected": isSelected, "$isDisabled": isDisabled, children: day }) })] }));
|
|
13
|
+
}
|
|
14
|
+
export function EmptyDayCell() {
|
|
15
|
+
return (_jsx(DayCellOuter, { children: _jsx(View, { style: { width: CALENDAR.cellSize, height: CALENDAR.cellSize } }) }));
|
|
16
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export declare const CALENDAR: {
|
|
2
|
+
readonly cellSize: 40;
|
|
3
|
+
readonly cellGap: 2;
|
|
4
|
+
readonly headerHeight: 44;
|
|
5
|
+
readonly dayLabelHeight: 32;
|
|
6
|
+
readonly padding: 16;
|
|
7
|
+
readonly borderRadius: 12;
|
|
8
|
+
readonly colors: {
|
|
9
|
+
readonly primary: "#2C2C2C";
|
|
10
|
+
readonly secondary: "#738295";
|
|
11
|
+
readonly disabled: "#C7C7CC";
|
|
12
|
+
readonly accent: "#2C2C2C";
|
|
13
|
+
readonly accentText: "#FFFFFF";
|
|
14
|
+
readonly rangeBackground: "rgba(44, 44, 44, 0.08)";
|
|
15
|
+
readonly todayBorder: "#2C2C2C";
|
|
16
|
+
readonly background: "#FFFFFF";
|
|
17
|
+
readonly modalBackground: "#EFF4F7";
|
|
18
|
+
readonly chevron: "#2C2C2C";
|
|
19
|
+
readonly saveButton: "#2C2C2C";
|
|
20
|
+
readonly saveButtonText: "#FFFFFF";
|
|
21
|
+
};
|
|
22
|
+
readonly typography: {
|
|
23
|
+
readonly monthTitle: {
|
|
24
|
+
readonly fontFamily: "SB Sans Text";
|
|
25
|
+
readonly fontSize: 16;
|
|
26
|
+
readonly fontWeight: "600";
|
|
27
|
+
readonly lineHeight: 20;
|
|
28
|
+
};
|
|
29
|
+
readonly dayLabel: {
|
|
30
|
+
readonly fontFamily: "SB Sans Text";
|
|
31
|
+
readonly fontSize: 13;
|
|
32
|
+
readonly fontWeight: "500";
|
|
33
|
+
readonly lineHeight: 18;
|
|
34
|
+
};
|
|
35
|
+
readonly day: {
|
|
36
|
+
readonly fontFamily: "SB Sans Text";
|
|
37
|
+
readonly fontSize: 16;
|
|
38
|
+
readonly fontWeight: "500";
|
|
39
|
+
readonly lineHeight: 20;
|
|
40
|
+
};
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
export declare const MONTH_NAMES: readonly ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
|
|
44
|
+
export declare const SHORT_MONTH_NAMES: readonly ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
|
|
45
|
+
export declare const DAY_LABELS: readonly ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"];
|
|
46
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/DatePicker/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2CX,CAAC;AAEX,eAAO,MAAM,WAAW,qIAGd,CAAC;AAEX,eAAO,MAAM,iBAAiB,+FAGpB,CAAC;AAEX,eAAO,MAAM,UAAU,4DAA6D,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
export const CALENDAR = {
|
|
2
|
+
cellSize: 40,
|
|
3
|
+
cellGap: 2,
|
|
4
|
+
headerHeight: 44,
|
|
5
|
+
dayLabelHeight: 32,
|
|
6
|
+
padding: 16,
|
|
7
|
+
borderRadius: 12,
|
|
8
|
+
colors: {
|
|
9
|
+
primary: '#2C2C2C',
|
|
10
|
+
secondary: '#738295',
|
|
11
|
+
disabled: '#C7C7CC',
|
|
12
|
+
accent: '#2C2C2C',
|
|
13
|
+
accentText: '#FFFFFF',
|
|
14
|
+
rangeBackground: 'rgba(44, 44, 44, 0.08)',
|
|
15
|
+
todayBorder: '#2C2C2C',
|
|
16
|
+
background: '#FFFFFF',
|
|
17
|
+
modalBackground: '#EFF4F7',
|
|
18
|
+
chevron: '#2C2C2C',
|
|
19
|
+
saveButton: '#2C2C2C',
|
|
20
|
+
saveButtonText: '#FFFFFF',
|
|
21
|
+
},
|
|
22
|
+
typography: {
|
|
23
|
+
monthTitle: {
|
|
24
|
+
fontFamily: 'SB Sans Text',
|
|
25
|
+
fontSize: 16,
|
|
26
|
+
fontWeight: '600',
|
|
27
|
+
lineHeight: 20,
|
|
28
|
+
},
|
|
29
|
+
dayLabel: {
|
|
30
|
+
fontFamily: 'SB Sans Text',
|
|
31
|
+
fontSize: 13,
|
|
32
|
+
fontWeight: '500',
|
|
33
|
+
lineHeight: 18,
|
|
34
|
+
},
|
|
35
|
+
day: {
|
|
36
|
+
fontFamily: 'SB Sans Text',
|
|
37
|
+
fontSize: 16,
|
|
38
|
+
fontWeight: '500',
|
|
39
|
+
lineHeight: 20,
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
export const MONTH_NAMES = [
|
|
44
|
+
'January', 'February', 'March', 'April', 'May', 'June',
|
|
45
|
+
'July', 'August', 'September', 'October', 'November', 'December',
|
|
46
|
+
];
|
|
47
|
+
export const SHORT_MONTH_NAMES = [
|
|
48
|
+
'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
|
|
49
|
+
'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec',
|
|
50
|
+
];
|
|
51
|
+
export const DAY_LABELS = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'];
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare function CalendarIcon(): import("react/jsx-runtime").JSX.Element;
|
|
2
|
+
export declare function ChevronLeft(): import("react/jsx-runtime").JSX.Element;
|
|
3
|
+
export declare function ChevronRight(): import("react/jsx-runtime").JSX.Element;
|
|
4
|
+
//# sourceMappingURL=icons.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icons.d.ts","sourceRoot":"","sources":["../../src/DatePicker/icons.tsx"],"names":[],"mappings":"AAGA,wBAAgB,YAAY,4CAE3B;AAED,wBAAgB,WAAW,4CAI1B;AAED,wBAAgB,YAAY,4CAI3B"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { CALENDAR } from './constants';
|
|
3
|
+
import { Icon } from '../Icon';
|
|
4
|
+
export function CalendarIcon() {
|
|
5
|
+
return _jsx(Icon, { name: "calendar" });
|
|
6
|
+
}
|
|
7
|
+
export function ChevronLeft() {
|
|
8
|
+
return (_jsx(Icon, { name: "chevron-left", color: CALENDAR.colors.chevron }));
|
|
9
|
+
}
|
|
10
|
+
export function ChevronRight() {
|
|
11
|
+
return (_jsx(Icon, { name: "chevron-right", color: CALENDAR.colors.chevron }));
|
|
12
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/DatePicker/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { DatePicker } from './DatePicker';
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
export declare const Pressable: import("styled-components/native/dist/types").IStyledComponentBase<"native", import("styled-components/native/dist/types").FastOmit<Omit<import("react-native").PressableProps & import("react").RefAttributes<import("react-native").View>, "ref"> & {
|
|
3
|
+
ref?: ((instance: import("react-native").View | null) => void) | import("react").RefObject<import("react-native").View> | null | undefined;
|
|
4
|
+
}, never>>;
|
|
5
|
+
export declare const ModalOverlay: import("styled-components/native/dist/types").IStyledComponentBase<"native", import("styled-components/native/dist/types").FastOmit<Omit<import("react-native").PressableProps & import("react").RefAttributes<import("react-native").View>, "ref"> & {
|
|
6
|
+
ref?: ((instance: import("react-native").View | null) => void) | import("react").RefObject<import("react-native").View> | null | undefined;
|
|
7
|
+
}, never>>;
|
|
8
|
+
export declare const ModalContainer: import("styled-components/native/dist/types").IStyledComponentBase<"native", import("styled-components/native/dist/types").FastOmit<import("react-native").ViewProps, never>>;
|
|
9
|
+
export declare const Grabber: import("styled-components/native/dist/types").IStyledComponentBase<"native", import("styled-components/native/dist/types").FastOmit<import("react-native").ViewProps, never>>;
|
|
10
|
+
export declare const CalendarHeaderRow: import("styled-components/native/dist/types").IStyledComponentBase<"native", import("styled-components/native/dist/types").FastOmit<import("react-native").ViewProps, never>>;
|
|
11
|
+
export declare const MonthTitle: import("styled-components/native/dist/types").IStyledComponentBase<"native", import("styled-components/native/dist/types").FastOmit<import("react-native").TextProps, never>>;
|
|
12
|
+
export declare const NavButton: import("styled-components/native/dist/types").IStyledComponentBase<"native", import("styled-components/native/dist/types").FastOmit<Omit<import("react-native").PressableProps & import("react").RefAttributes<import("react-native").View>, "ref"> & {
|
|
13
|
+
ref?: ((instance: import("react-native").View | null) => void) | import("react").RefObject<import("react-native").View> | null | undefined;
|
|
14
|
+
}, never>>;
|
|
15
|
+
export declare const DayLabelsRow: import("styled-components/native/dist/types").IStyledComponentBase<"native", import("styled-components/native/dist/types").FastOmit<import("react-native").ViewProps, never>>;
|
|
16
|
+
export declare const DayLabelCell: import("styled-components/native/dist/types").IStyledComponentBase<"native", import("styled-components/native/dist/types").FastOmit<import("react-native").ViewProps, never>>;
|
|
17
|
+
export declare const DayLabelText: import("styled-components/native/dist/types").IStyledComponentBase<"native", import("styled-components/native/dist/types").FastOmit<import("react-native").TextProps, never>>;
|
|
18
|
+
export declare const WeekRow: import("styled-components/native/dist/types").IStyledComponentBase<"native", import("styled-components/native/dist/types").FastOmit<import("react-native").ViewProps, never>>;
|
|
19
|
+
export declare const DayCellOuter: import("styled-components/native/dist/types").IStyledComponentBase<"native", import("styled-components/native/dist/types").FastOmit<import("react-native").ViewProps, never>>;
|
|
20
|
+
export declare const DayRangeFill: import("styled-components/native/dist/types").IStyledComponentBase<"native", import("styled-components/native/dist/types").Substitute<import("styled-components/native/dist/types").FastOmit<import("styled-components/native/dist/types").Substitute<import("react-native").ViewProps, import("react-native").ViewProps & import("react").RefAttributes<import("react-native").View>>, never>, {
|
|
21
|
+
$isRangeStart: boolean;
|
|
22
|
+
$isRangeEnd: boolean;
|
|
23
|
+
}>>;
|
|
24
|
+
export declare const DayCellInner: import("styled-components/native/dist/types").IStyledComponentBase<"native", import("styled-components/native/dist/types").Substitute<Omit<import("react-native").PressableProps & import("react").RefAttributes<import("react-native").View>, "ref"> & {
|
|
25
|
+
ref?: ((instance: import("react-native").View | null) => void) | import("react").RefObject<import("react-native").View> | null | undefined;
|
|
26
|
+
}, {
|
|
27
|
+
$isSelected: boolean;
|
|
28
|
+
$isToday: boolean;
|
|
29
|
+
$isDisabled: boolean;
|
|
30
|
+
}>>;
|
|
31
|
+
export declare const DayText: import("styled-components/native/dist/types").IStyledComponentBase<"native", import("styled-components/native/dist/types").Substitute<import("react-native").TextProps, {
|
|
32
|
+
$isSelected: boolean;
|
|
33
|
+
$isDisabled: boolean;
|
|
34
|
+
}>>;
|
|
35
|
+
export declare const SaveButton: import("styled-components/native/dist/types").IStyledComponentBase<"native", import("styled-components/native/dist/types").FastOmit<Omit<import("react-native").PressableProps & import("react").RefAttributes<import("react-native").View>, "ref"> & {
|
|
36
|
+
ref?: ((instance: import("react-native").View | null) => void) | import("react").RefObject<import("react-native").View> | null | undefined;
|
|
37
|
+
}, never>>;
|
|
38
|
+
export declare const SaveButtonText: import("styled-components/native/dist/types").IStyledComponentBase<"native", import("styled-components/native/dist/types").FastOmit<import("react-native").TextProps, never>>;
|
|
39
|
+
export declare const CalendarBody: import("styled-components/native/dist/types").IStyledComponentBase<"native", import("styled-components/native/dist/types").FastOmit<import("react-native").ViewProps, never>>;
|
|
40
|
+
//# sourceMappingURL=styles.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../src/DatePicker/styles.ts"],"names":[],"mappings":";AAOA,eAAO,MAAM,SAAS;;UAErB,CAAC;AAIF,eAAO,MAAM,YAAY;;UAIxB,CAAC;AAEF,eAAO,MAAM,cAAc,+KAK1B,CAAC;AAEF,eAAO,MAAM,OAAO,+KAQnB,CAAC;AAIF,eAAO,MAAM,iBAAiB,+KAM7B,CAAC;AAEF,eAAO,MAAM,UAAU,+KAQtB,CAAC;AAEF,eAAO,MAAM,SAAS;;UAKrB,CAAC;AAIF,eAAO,MAAM,YAAY,+KAIxB,CAAC;AAEF,eAAO,MAAM,YAAY,+KAMxB,CAAC;AAEF,eAAO,MAAM,YAAY,+KAMxB,CAAC;AAIF,eAAO,MAAM,OAAO,+KAGnB,CAAC;AAEF,eAAO,MAAM,YAAY,+KAOxB,CAAC;AAEF,eAAO,MAAM,YAAY;mBAGR,OAAO;iBACT,OAAO;GAQrB,CAAC;AAEF,eAAO,MAAM,YAAY;;;iBACV,OAAO;cACV,OAAO;iBACJ,OAAO;GAarB,CAAC;AAEF,eAAO,MAAM,OAAO;iBACL,OAAO;iBACP,OAAO;GAQrB,CAAC;AAIF,eAAO,MAAM,UAAU;;UAQtB,CAAC;AAEF,eAAO,MAAM,cAAc,+KAM1B,CAAC;AAIF,eAAO,MAAM,YAAY,+KAGxB,CAAC"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { Pressable as RNPressable } from 'react-native';
|
|
2
|
+
import styled from 'styled-components/native';
|
|
3
|
+
import { CALENDAR } from './constants';
|
|
4
|
+
/* ── Trigger ─────────────────────────────────────────────────────── */
|
|
5
|
+
export const Pressable = styled(RNPressable) `
|
|
6
|
+
width: 100%;
|
|
7
|
+
`;
|
|
8
|
+
/* ── Modal ────────────────────────────────────────────────────────── */
|
|
9
|
+
export const ModalOverlay = styled(RNPressable) `
|
|
10
|
+
flex: 1;
|
|
11
|
+
justify-content: flex-end;
|
|
12
|
+
background-color: rgba(0, 0, 0, 0.4);
|
|
13
|
+
`;
|
|
14
|
+
export const ModalContainer = styled.View `
|
|
15
|
+
background-color: ${CALENDAR.colors.background};
|
|
16
|
+
border-top-left-radius: 20px;
|
|
17
|
+
border-top-right-radius: 20px;
|
|
18
|
+
padding-bottom: 16px;
|
|
19
|
+
`;
|
|
20
|
+
export const Grabber = styled.View `
|
|
21
|
+
width: 36px;
|
|
22
|
+
height: 5px;
|
|
23
|
+
border-radius: 100px;
|
|
24
|
+
background-color: #cccccc;
|
|
25
|
+
align-self: center;
|
|
26
|
+
margin-top: 8px;
|
|
27
|
+
margin-bottom: 4px;
|
|
28
|
+
`;
|
|
29
|
+
/* ── Calendar header (month title + nav) ─────────────────────────── */
|
|
30
|
+
export const CalendarHeaderRow = styled.View `
|
|
31
|
+
flex-direction: row;
|
|
32
|
+
align-items: center;
|
|
33
|
+
justify-content: space-between;
|
|
34
|
+
height: ${CALENDAR.headerHeight}px;
|
|
35
|
+
padding-horizontal: ${CALENDAR.padding}px;
|
|
36
|
+
`;
|
|
37
|
+
export const MonthTitle = styled.Text `
|
|
38
|
+
font-family: ${CALENDAR.typography.monthTitle.fontFamily};
|
|
39
|
+
font-size: ${CALENDAR.typography.monthTitle.fontSize}px;
|
|
40
|
+
font-weight: ${CALENDAR.typography.monthTitle.fontWeight};
|
|
41
|
+
line-height: ${CALENDAR.typography.monthTitle.lineHeight}px;
|
|
42
|
+
color: ${CALENDAR.colors.primary};
|
|
43
|
+
flex: 1;
|
|
44
|
+
text-align: center;
|
|
45
|
+
`;
|
|
46
|
+
export const NavButton = styled(RNPressable) `
|
|
47
|
+
width: ${CALENDAR.headerHeight}px;
|
|
48
|
+
height: ${CALENDAR.headerHeight}px;
|
|
49
|
+
align-items: center;
|
|
50
|
+
justify-content: center;
|
|
51
|
+
`;
|
|
52
|
+
/* ── Day-of-week labels ──────────────────────────────────────────── */
|
|
53
|
+
export const DayLabelsRow = styled.View `
|
|
54
|
+
flex-direction: row;
|
|
55
|
+
padding-horizontal: ${CALENDAR.padding}px;
|
|
56
|
+
margin-bottom: 4px;
|
|
57
|
+
`;
|
|
58
|
+
export const DayLabelCell = styled.View `
|
|
59
|
+
width: ${CALENDAR.cellSize}px;
|
|
60
|
+
height: ${CALENDAR.dayLabelHeight}px;
|
|
61
|
+
align-items: center;
|
|
62
|
+
justify-content: center;
|
|
63
|
+
flex: 1;
|
|
64
|
+
`;
|
|
65
|
+
export const DayLabelText = styled.Text `
|
|
66
|
+
font-family: ${CALENDAR.typography.dayLabel.fontFamily};
|
|
67
|
+
font-size: ${CALENDAR.typography.dayLabel.fontSize}px;
|
|
68
|
+
font-weight: ${CALENDAR.typography.dayLabel.fontWeight};
|
|
69
|
+
line-height: ${CALENDAR.typography.dayLabel.lineHeight}px;
|
|
70
|
+
color: ${CALENDAR.colors.secondary};
|
|
71
|
+
`;
|
|
72
|
+
/* ── Day grid ────────────────────────────────────────────────────── */
|
|
73
|
+
export const WeekRow = styled.View `
|
|
74
|
+
flex-direction: row;
|
|
75
|
+
padding-horizontal: ${CALENDAR.padding}px;
|
|
76
|
+
`;
|
|
77
|
+
export const DayCellOuter = styled.View `
|
|
78
|
+
position: relative;
|
|
79
|
+
flex: 1;
|
|
80
|
+
height: ${CALENDAR.cellSize}px;
|
|
81
|
+
align-items: center;
|
|
82
|
+
justify-content: center;
|
|
83
|
+
background-color: transparent;
|
|
84
|
+
`;
|
|
85
|
+
export const DayRangeFill = styled.View.attrs({
|
|
86
|
+
pointerEvents: 'none',
|
|
87
|
+
}) `
|
|
88
|
+
position: absolute;
|
|
89
|
+
top: 0;
|
|
90
|
+
bottom: 0;
|
|
91
|
+
left: ${({ $isRangeStart }) => ($isRangeStart ? '50%' : 0)};
|
|
92
|
+
right: ${({ $isRangeEnd }) => ($isRangeEnd ? '50%' : 0)};
|
|
93
|
+
background-color: ${CALENDAR.colors.rangeBackground};
|
|
94
|
+
`;
|
|
95
|
+
export const DayCellInner = styled(RNPressable) `
|
|
96
|
+
width: ${CALENDAR.cellSize}px;
|
|
97
|
+
height: ${CALENDAR.cellSize}px;
|
|
98
|
+
border-radius: ${CALENDAR.cellSize / 2}px;
|
|
99
|
+
align-items: center;
|
|
100
|
+
justify-content: center;
|
|
101
|
+
background-color: ${({ $isSelected }) => $isSelected ? CALENDAR.colors.accent : 'transparent'};
|
|
102
|
+
border-width: ${({ $isToday, $isSelected }) => $isToday && !$isSelected ? 1 : 0}px;
|
|
103
|
+
border-color: ${CALENDAR.colors.todayBorder};
|
|
104
|
+
opacity: ${({ $isDisabled }) => ($isDisabled ? 0.3 : 1)};
|
|
105
|
+
`;
|
|
106
|
+
export const DayText = styled.Text `
|
|
107
|
+
font-family: ${CALENDAR.typography.day.fontFamily};
|
|
108
|
+
font-size: ${CALENDAR.typography.day.fontSize}px;
|
|
109
|
+
font-weight: ${CALENDAR.typography.day.fontWeight};
|
|
110
|
+
line-height: ${CALENDAR.typography.day.lineHeight}px;
|
|
111
|
+
color: ${({ $isSelected }) => $isSelected ? CALENDAR.colors.accentText : CALENDAR.colors.primary};
|
|
112
|
+
`;
|
|
113
|
+
/* ── Save button ─────────────────────────────────────────────────── */
|
|
114
|
+
export const SaveButton = styled(RNPressable) `
|
|
115
|
+
height: 50px;
|
|
116
|
+
border-radius: ${CALENDAR.borderRadius}px;
|
|
117
|
+
background-color: ${CALENDAR.colors.saveButton};
|
|
118
|
+
align-items: center;
|
|
119
|
+
justify-content: center;
|
|
120
|
+
margin-horizontal: ${CALENDAR.padding}px;
|
|
121
|
+
margin-bottom: ${CALENDAR.padding}px;
|
|
122
|
+
`;
|
|
123
|
+
export const SaveButtonText = styled.Text `
|
|
124
|
+
font-size: 17px;
|
|
125
|
+
font-weight: 600;
|
|
126
|
+
line-height: 22px;
|
|
127
|
+
letter-spacing: -0.43px;
|
|
128
|
+
color: ${CALENDAR.colors.saveButtonText};
|
|
129
|
+
`;
|
|
130
|
+
/* ── Calendar content wrapper ─────────────────────────────────────── */
|
|
131
|
+
export const CalendarBody = styled.View `
|
|
132
|
+
padding-top: 8px;
|
|
133
|
+
padding-bottom: 16px;
|
|
134
|
+
`;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
import type { StyleProp, ViewStyle } from 'react-native';
|
|
3
|
+
export type DatePickerMode = 'single' | 'range';
|
|
4
|
+
export interface DateRangeValue {
|
|
5
|
+
startDate?: string;
|
|
6
|
+
endDate?: string;
|
|
7
|
+
}
|
|
8
|
+
export type DatePickerValue = string | DateRangeValue;
|
|
9
|
+
export interface DatePickerProps {
|
|
10
|
+
/** Selection mode. @default 'single' */
|
|
11
|
+
mode?: DatePickerMode;
|
|
12
|
+
/** Selected value — ISO `YYYY-MM-DD` string for single, or `{ startDate, endDate }` for range. */
|
|
13
|
+
value?: DatePickerValue;
|
|
14
|
+
/** Called when selection changes. */
|
|
15
|
+
onChange?: (value: DatePickerValue) => void;
|
|
16
|
+
/** Earliest selectable date (inclusive), ISO `YYYY-MM-DD`. */
|
|
17
|
+
minDate?: string;
|
|
18
|
+
/** Latest selectable date (inclusive), ISO `YYYY-MM-DD`. */
|
|
19
|
+
maxDate?: string;
|
|
20
|
+
/** Floating placeholder text (e.g. "Date"). */
|
|
21
|
+
placeholder?: string;
|
|
22
|
+
/** Show red asterisk after placeholder. */
|
|
23
|
+
required?: boolean;
|
|
24
|
+
/** Helper text shown below the field. */
|
|
25
|
+
helperText?: string;
|
|
26
|
+
/** Error text — highlights border red. */
|
|
27
|
+
errorText?: string;
|
|
28
|
+
/** Disabled state — field is not pressable. */
|
|
29
|
+
disabled?: boolean;
|
|
30
|
+
/** Style for the outer container. */
|
|
31
|
+
containerStyle?: StyleProp<ViewStyle>;
|
|
32
|
+
/** Style for the input wrapper. */
|
|
33
|
+
inputWrapperStyle?: StyleProp<ViewStyle>;
|
|
34
|
+
/** Forwarded to the root pressable. */
|
|
35
|
+
testID?: string;
|
|
36
|
+
/** Custom trigger element. When provided, replaces the default input field. Receives the formatted display label and the open handler. */
|
|
37
|
+
renderTrigger?: (label: string, onPress: () => void) => ReactNode;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/DatePicker/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzD,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEhD,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,cAAc,CAAC;AAEtD,MAAM,WAAW,eAAe;IAC9B,wCAAwC;IACxC,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,kGAAkG;IAClG,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,qCAAqC;IACrC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;IAC5C,8DAA8D;IAC9D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4DAA4D;IAC5D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,+CAA+C;IAC/C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,yCAAyC;IACzC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0CAA0C;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,qCAAqC;IACrC,cAAc,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IACtC,mCAAmC;IACnC,iBAAiB,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IACzC,uCAAuC;IACvC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0IAA0I;IAC1I,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,IAAI,KAAK,SAAS,CAAC;CACnE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|