diff --git a/.eslintrc b/.eslintrc
index ce9c8cf..2e627a6 100644
--- a/.eslintrc
+++ b/.eslintrc
@@ -1,5 +1,4 @@
{
- "extends": ["airbnb"],
"plugins": ["react", "react-hooks", "@typescript-eslint"],
"env": {
"browser": true,
diff --git a/.storybook/main.js b/.storybook/main.js
index d80a104..7abc68c 100644
--- a/.storybook/main.js
+++ b/.storybook/main.js
@@ -9,17 +9,9 @@ module.exports = {
sourceLoaderOptions: null,
},
},
+ '@storybook/addon-viewport',
'@storybook/addon-links',
'@storybook/addon-essentials',
'@storybook/preset-create-react-app',
],
- typescript: {
- reactDocgen: 'react-docgen-typescript',
- reactDocgenTypescriptOptions: {
- compilerOptions: {
- allowSyntheticDefaultImports: false,
- esModuleInterop: false,
- },
- },
- },
};
diff --git a/.storybook/preview.js b/.storybook/preview.js
index b285aac..d099e79 100644
--- a/.storybook/preview.js
+++ b/.storybook/preview.js
@@ -1,3 +1,9 @@
+import { INITIAL_VIEWPORTS } from '@storybook/addon-viewport';
+
export const parameters = {
actions: { argTypesRegex: '^on[A-Z].*' },
+ viewport: {
+ viewports: INITIAL_VIEWPORTS,
+ defaultViewport: 'iphone6',
+ },
};
diff --git a/package-lock.json b/package-lock.json
index fdcefe6..695cdd8 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "@persian-tools/persian-mobile-datepicker",
- "version": "0.0.1",
+ "version": "0.0.2",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "@persian-tools/persian-mobile-datepicker",
- "version": "0.0.1",
+ "version": "0.0.2",
"license": "MIT",
"dependencies": {
"date-fns-jalali": "^2.22.1-0",
@@ -22,11 +22,14 @@
"@babel/polyfill": "^7.2.5",
"@babel/preset-env": "^7.14.5",
"@babel/preset-react": "^7.14.5",
+ "@persian-tools/persian-tools": "^1.6.1",
"@semantic-release/changelog": "^5.0.1",
"@semantic-release/git": "^9.0.0",
"@storybook/addon-actions": "^6.2.9",
+ "@storybook/addon-docs": "^6.2.9",
"@storybook/addon-essentials": "^6.2.9",
"@storybook/addon-links": "^6.2.9",
+ "@storybook/addon-viewport": "^6.2.9",
"@storybook/addons": "^6.2.9",
"@storybook/preset-create-react-app": "^3.1.7",
"@storybook/react": "^6.2.9",
@@ -62,7 +65,8 @@
"react-testing-library": "^5.9.0",
"regenerator-runtime": "^0.13.7",
"semantic-release": "^17.4.3",
- "ts-jest": "^27.0.3"
+ "ts-jest": "^27.0.3",
+ "typescript": "^4.2.2"
},
"engines": {
"node": ">= 14.15.0"
@@ -4309,6 +4313,15 @@
"node": ">= 6.0.0"
}
},
+ "node_modules/@persian-tools/persian-tools": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/@persian-tools/persian-tools/-/persian-tools-1.6.1.tgz",
+ "integrity": "sha512-eiK1GV6Z0e5tKNcQmp3Qv9LFZXB5FppICe91LjFGRZfzatJthIPPWyCCXtfFcMhYNgbrEcxlhCBLqDy41W8Idg==",
+ "dev": true,
+ "dependencies": {
+ "fastest-levenshtein": "^1.0.12"
+ }
+ },
"node_modules/@popperjs/core": {
"version": "2.9.2",
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.9.2.tgz",
@@ -17378,6 +17391,12 @@
"integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
"dev": true
},
+ "node_modules/fastest-levenshtein": {
+ "version": "1.0.12",
+ "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz",
+ "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==",
+ "dev": true
+ },
"node_modules/fastparse": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz",
@@ -41284,9 +41303,9 @@
}
},
"node_modules/typescript": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.2.tgz",
- "integrity": "sha512-zZ4hShnmnoVnAHpVHWpTcxdv7dWP60S2FsydQLV8V5PbS3FifjWFFRiHSWpDJahly88PRyV5teTSLoq4eG7mKw==",
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.2.tgz",
+ "integrity": "sha512-tbb+NVrLfnsJy3M59lsDgrzWIflR4d4TIUjz+heUnHZwdF7YsrMTKoRERiIvI2lvBG95dfpLxB21WZhys1bgaQ==",
"dev": true,
"bin": {
"tsc": "bin/tsc",
@@ -47512,6 +47531,15 @@
"physical-cpu-count": "^2.0.0"
}
},
+ "@persian-tools/persian-tools": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/@persian-tools/persian-tools/-/persian-tools-1.6.1.tgz",
+ "integrity": "sha512-eiK1GV6Z0e5tKNcQmp3Qv9LFZXB5FppICe91LjFGRZfzatJthIPPWyCCXtfFcMhYNgbrEcxlhCBLqDy41W8Idg==",
+ "dev": true,
+ "requires": {
+ "fastest-levenshtein": "^1.0.12"
+ }
+ },
"@popperjs/core": {
"version": "2.9.2",
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.9.2.tgz",
@@ -57882,6 +57910,12 @@
"integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
"dev": true
},
+ "fastest-levenshtein": {
+ "version": "1.0.12",
+ "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz",
+ "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==",
+ "dev": true
+ },
"fastparse": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz",
@@ -76478,9 +76512,9 @@
}
},
"typescript": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.2.tgz",
- "integrity": "sha512-zZ4hShnmnoVnAHpVHWpTcxdv7dWP60S2FsydQLV8V5PbS3FifjWFFRiHSWpDJahly88PRyV5teTSLoq4eG7mKw==",
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.2.tgz",
+ "integrity": "sha512-tbb+NVrLfnsJy3M59lsDgrzWIflR4d4TIUjz+heUnHZwdF7YsrMTKoRERiIvI2lvBG95dfpLxB21WZhys1bgaQ==",
"dev": true
},
"uglify-js": {
diff --git a/package.json b/package.json
index b0f1726..2518c99 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "@persian-tools/persian-mobile-datepicker",
- "version": "0.0.1",
+ "version": "0.0.2",
"description": "Modern Persian mobile date picker",
"publishConfig": {
"access": "public"
@@ -60,11 +60,14 @@
"@babel/polyfill": "^7.2.5",
"@babel/preset-env": "^7.14.5",
"@babel/preset-react": "^7.14.5",
+ "@persian-tools/persian-tools": "^1.6.1",
"@semantic-release/changelog": "^5.0.1",
"@semantic-release/git": "^9.0.0",
"@storybook/addon-actions": "^6.2.9",
+ "@storybook/addon-docs": "^6.2.9",
"@storybook/addon-essentials": "^6.2.9",
"@storybook/addon-links": "^6.2.9",
+ "@storybook/addon-viewport": "^6.2.9",
"@storybook/addons": "^6.2.9",
"@storybook/preset-create-react-app": "^3.1.7",
"@storybook/react": "^6.2.9",
@@ -100,7 +103,8 @@
"react-testing-library": "^5.9.0",
"regenerator-runtime": "^0.13.7",
"semantic-release": "^17.4.3",
- "ts-jest": "^27.0.3"
+ "ts-jest": "^27.0.3",
+ "typescript": "^4.2.2"
},
"resolutions": {
"@babel/core": "^7.5.4"
diff --git a/src/components/WheelPicker/index.stories.tsx b/src/components/WheelPicker/index.stories.tsx
deleted file mode 100644
index 7126939..0000000
--- a/src/components/WheelPicker/index.stories.tsx
+++ /dev/null
@@ -1,17 +0,0 @@
-import React from 'react';
-import { WheelPicker } from './index';
-import { Story } from '@storybook/react/types-6-0';
-// Types
-import type { Meta } from '@storybook/react/types-6-0';
-import type { WheelPickerProps } from './index.types';
-
-export default {
- title: 'Wheel Picker',
- component: WheelPicker,
- decorators: [(Story): JSX.Element => ],
-} as Meta;
-
-const Template: Story = (args) => ;
-
-export const Default = Template.bind({});
-Default.args = {};
diff --git a/src/components/WheelPicker/index.styles.ts b/src/components/WheelPicker/index.styles.ts
index d7a6443..a524bd4 100644
--- a/src/components/WheelPicker/index.styles.ts
+++ b/src/components/WheelPicker/index.styles.ts
@@ -13,7 +13,9 @@ export const StyledCaption = styled.div`
color: #616161;
padding-bottom: 5px;
font-size: 1.1em;
- border-bottom: 1px solid #e0e0e0;
+ &:not(:empty) {
+ border-bottom: 1px solid #e0e0e0;
+ }
`;
StyledCaption.displayName = 'PersianTools(WheelPicker)(Caption)';
diff --git a/src/index.stories.tsx b/src/index.stories.tsx
index 6939c81..797a6b4 100644
--- a/src/index.stories.tsx
+++ b/src/index.stories.tsx
@@ -1,10 +1,11 @@
import React from 'react';
import { Story, Meta } from '@storybook/react/types-6-0';
-import Picker from './index';
+import { digitsEnToFa } from '@persian-tools/persian-tools';
+import { createDateInstance, DatePickerConfig, Picker } from './index';
import { PickerProps } from './index.types';
export default {
- title: 'Base Picker',
+ title: 'Picker with Sheet modal',
component: Picker,
argTypes: {
theme: {
@@ -19,7 +20,184 @@ export default {
const Template: Story = (args) => ;
-export const Default = Template.bind({});
-Default.args = {
- theme: 'android-light',
+const pickerConfig: DatePickerConfig = {
+ year: {},
+ month: {},
+ day: {},
+};
+
+export const Initial = Template.bind({});
+Initial.args = {
+ isOpen: true,
+ config: pickerConfig,
+ initialValue: createDateInstance({ year: 1400, month: 1, day: 1 }),
+};
+
+export const HighlightWeekends = Template.bind({});
+HighlightWeekends.args = {
+ isOpen: true,
+ highlightWeekends: true,
+ config: pickerConfig,
+ initialValue: createDateInstance({ year: 1400, month: 1, day: 6 }),
+};
+
+export const HighlightHolidays = Template.bind({});
+HighlightHolidays.args = {
+ isOpen: true,
+ highlightHolidays: true,
+ highlightWeekends: true,
+ config: pickerConfig,
+ initialValue: createDateInstance({ year: 1400, month: 1, day: 1 }),
+};
+
+export const ColumnsCaption = Template.bind({});
+const ColumnsCaptionConfig: DatePickerConfig = {
+ year: {
+ caption: {
+ text: 'سال',
+ },
+ },
+ month: {
+ caption: {
+ text: 'ماه',
+ },
+ },
+ day: {
+ caption: {
+ text: 'روز',
+ },
+ },
+};
+ColumnsCaption.args = {
+ isOpen: true,
+ highlightHolidays: true,
+ highlightWeekends: true,
+ config: ColumnsCaptionConfig,
+ initialValue: createDateInstance({ year: 1400, month: 1, day: 1 }),
+};
+
+export const ColumnsCaptionWithCSSStyle = Template.bind({});
+const ColumnsCaptionWithStyleConfig: DatePickerConfig = {
+ year: {
+ caption: {
+ text: 'سال',
+ style: {
+ color: '#1672ec',
+ },
+ },
+ },
+ month: {
+ caption: {
+ text: 'ماه',
+ style: {
+ color: '#1672ec',
+ },
+ },
+ },
+ day: {
+ caption: {
+ text: 'روز',
+ style: {
+ color: '#1672ec',
+ },
+ },
+ },
+};
+ColumnsCaptionWithCSSStyle.args = {
+ isOpen: true,
+ highlightHolidays: true,
+ highlightWeekends: true,
+ config: ColumnsCaptionWithStyleConfig,
+ initialValue: createDateInstance({ year: 1400, month: 1, day: 1 }),
+};
+
+export const ColumnsTextFormatter = Template.bind({});
+const ColumnsTextFormatterConfig: DatePickerConfig = {
+ year: {
+ caption: {
+ text: 'سال',
+ style: {
+ color: '#1672ec',
+ },
+ },
+ formatter(value) {
+ return digitsEnToFa(value.year);
+ },
+ },
+ month: {
+ caption: {
+ text: 'ماه',
+ style: {
+ color: '#1672ec',
+ },
+ },
+ },
+ day: {
+ caption: {
+ text: 'روز',
+ style: {
+ color: '#1672ec',
+ },
+ },
+ formatter(value) {
+ return digitsEnToFa(value.day);
+ },
+ },
+};
+ColumnsTextFormatter.args = {
+ isOpen: true,
+ highlightHolidays: true,
+ highlightWeekends: true,
+ config: ColumnsTextFormatterConfig,
+ initialValue: createDateInstance({ year: 1400, month: 1, day: 1 }),
+};
+
+export const ColumnsWithStyles = Template.bind({});
+const ColumnsWithStylesConfig: DatePickerConfig = {
+ year: {
+ caption: {
+ text: 'سال',
+ },
+ formatter(value) {
+ return digitsEnToFa(value.year);
+ },
+ columnStyle: {
+ background: '#f5e2A0',
+ },
+ selectedItemStyle: {
+ color: '#43a047',
+ },
+ },
+ month: {
+ caption: {
+ text: 'ماه',
+ },
+ columnStyle: {
+ background: '#dbe9f8',
+ },
+ itemStyle: {
+ color: '#1444d9',
+ },
+ },
+ day: {
+ caption: {
+ text: 'روز',
+ },
+ formatter(value) {
+ return digitsEnToFa(value.day);
+ },
+ columnStyle: {
+ background: '#dbe9f8',
+ },
+ itemStyle: {
+ color: '#1444d9',
+ },
+ },
+};
+ColumnsWithStyles.args = {
+ isOpen: true,
+ highlightHolidays: true,
+ highlightWeekends: true,
+ config: ColumnsWithStylesConfig,
+ initialValue: createDateInstance({ year: 1400, month: 1, day: 1 }),
};
diff --git a/src/index.styles.ts b/src/index.styles.ts
index 7b5c589..a158137 100644
--- a/src/index.styles.ts
+++ b/src/index.styles.ts
@@ -15,6 +15,7 @@ export const StyledSubmitButton = styled.button`
font-size: 1rem;
line-height: 1.5;
-webkit-appearance: button;
+ margin-right: 15px;
`;
StyledSubmitButton.displayName = 'PersianTools(Picker)(SubmitButton)';
@@ -22,6 +23,7 @@ export const StyledCancelButton = styled(StyledSubmitButton)`
color: #616161;
background-color: transparent;
border: 1px solid #c0c0c0;
+ margin-left: 15px;
`;
StyledCancelButton.displayName = 'PersianTools(Picker)(CancelButton)';
@@ -30,8 +32,8 @@ export const StyledFooter = styled.div`
bottom: 0;
right: 0;
width: 100%;
- height: 70px;
- padding: 15px;
+ height: 40px;
+ padding: 15px 0;
display: flex;
justify-content: space-between;
align-content: center;
diff --git a/src/index.tsx b/src/index.tsx
index 2901de7..c6fa3c4 100644
--- a/src/index.tsx
+++ b/src/index.tsx
@@ -41,7 +41,7 @@ const Picker: React.FC = (props) => {
handleClose()}
- snapPoints={[385 + (props.title ? 55 : 0)]}
+ snapPoints={[400 + (props.title ? 55 : 0)]}
initialSnap={0}
>