@xola/ui-kit 1.4.2
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/.github/ISSUE_TEMPLATE/v2-component.md +12 -0
- package/.nvmrc +1 -0
- package/.prettierrc +6 -0
- package/.storybook/main.js +17 -0
- package/.storybook/preview.js +3 -0
- package/README.md +1 -0
- package/babel.config.json +13 -0
- package/build/favicon.ico +0 -0
- package/build/style.css +1 -0
- package/build/ui-kit.mjs +12455 -0
- package/build/ui-kit.umd.js +33 -0
- package/lib/index.js +1 -0
- package/package.json +48 -0
- package/src/components/CountrySelect/CountrySelect.js +15 -0
- package/src/components/CountrySelect/index.js +1 -0
- package/src/components/DatePicker/DatePicker.js +80 -0
- package/src/components/DatePicker/DatePicker.module.scss +3 -0
- package/src/components/DatePicker/DatePicker.scss +18 -0
- package/src/components/DatePicker/index.js +3 -0
- package/src/components/FormInput/FormInput.js +23 -0
- package/src/components/FormInput/index.js +3 -0
- package/src/components/MiniStepper/MiniStepper.js +39 -0
- package/src/components/MiniStepper/MiniStepper.module.scss +9 -0
- package/src/components/MiniStepper/index.js +1 -0
- package/src/components/PhoneInput/PhoneInput.js +44 -0
- package/src/components/PhoneInput/index.js +1 -0
- package/src/components/ProductSelector/ProductListItem/ProductListItem.js +41 -0
- package/src/components/ProductSelector/ProductListItem/ProductListItem.module.scss +32 -0
- package/src/components/ProductSelector/ProductSelector.js +71 -0
- package/src/components/ProductSelector/index.js +3 -0
- package/src/components/ScheduleEditor/ScheduleEditor.js +277 -0
- package/src/components/ScheduleEditor/ScheduleEditorRow.js +26 -0
- package/src/components/ScheduleEditor/TimeRangeSelector/TimeRangeSelector.js +94 -0
- package/src/components/ScheduleEditor/TimeRangeSelector/TimeRangeSelector.module.scss +13 -0
- package/src/components/ScheduleEditor/TimeSlotSelector/TimeSlotSelector.js +62 -0
- package/src/components/ScheduleEditor/TimeSlotSelector/TimeSlotSelector.module.scss +21 -0
- package/src/components/ScheduleEditor/WeekSelector/WeekSelector.js +50 -0
- package/src/components/ScheduleEditor/helpers/schedule.js +15 -0
- package/src/components/ScheduleEditor/helpers/scheduleSummary.js +128 -0
- package/src/components/ScheduleEditor/index.js +4 -0
- package/src/components/Stepper/Step.js +31 -0
- package/src/components/Stepper/Step.module.scss +25 -0
- package/src/components/Stepper/Stepper.js +25 -0
- package/src/components/Stepper/Stepper.module.scss +5 -0
- package/src/components/Stepper/index.js +4 -0
- package/src/components/TimePicker/TimePicker.js +51 -0
- package/src/components/TimePicker/TimePicker.module.scss +16 -0
- package/src/components/TimePicker/TimePickerPopover.js +94 -0
- package/src/components/TimePicker/TimePickerPopover.module.scss +48 -0
- package/src/components/TimePicker/index.js +3 -0
- package/src/icons/CheckIcon.js +9 -0
- package/src/icons/TrashIcon.js +17 -0
- package/src/index.js +18 -0
- package/src/stories/Button.stories.js +66 -0
- package/src/stories/CountrySelect.stories.js +18 -0
- package/src/stories/DatePicker.stories.js +96 -0
- package/src/stories/FormInput.stories.js +25 -0
- package/src/stories/Forms.stories.js +43 -0
- package/src/stories/Icons.stories.js +21 -0
- package/src/stories/MiniStepper.stories.js +15 -0
- package/src/stories/PhoneInput.stories.js +26 -0
- package/src/stories/ProductSelector.stories.js +42 -0
- package/src/stories/ScheduleEditor.stories.js +37 -0
- package/src/stories/Stepper.stories.js +36 -0
- package/src/stories/TimePicker.stories.js +14 -0
- package/src/stories/Typography.stories.js +18 -0
- package/src/styles/custom.scss +60 -0
- package/src/styles/index.scss +3 -0
- package/src/styles/variables.scss +43 -0
- package/src/theme.js +359 -0
- package/src/values/countries.js +196 -0
- package/src/values/products.js +86 -0
- package/src/values/sellers.js +5 -0
- package/webpack.config.js +47 -0
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
@import "../../styles/variables.scss";
|
|
2
|
+
|
|
3
|
+
.timepickerPopover {
|
|
4
|
+
z-index: 200;
|
|
5
|
+
width: 500px;
|
|
6
|
+
box-shadow: 0 0 5px $box-shadow-color;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
.minuteContainer {
|
|
10
|
+
width: 126px;
|
|
11
|
+
.minutes {
|
|
12
|
+
width: 126px;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
.hourContainer {
|
|
17
|
+
width: 334px;
|
|
18
|
+
.meridian {
|
|
19
|
+
width: 58px;
|
|
20
|
+
p {
|
|
21
|
+
margin-top: 40px;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
.hours {
|
|
25
|
+
width: 252px;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.slotButton {
|
|
30
|
+
margin: 2px;
|
|
31
|
+
width: 38px !important;
|
|
32
|
+
height: 38px !important;
|
|
33
|
+
font-size: 14px;
|
|
34
|
+
background: white;
|
|
35
|
+
color: $input-color;
|
|
36
|
+
outline: none;
|
|
37
|
+
&:hover,
|
|
38
|
+
&:active,
|
|
39
|
+
&:focus {
|
|
40
|
+
background-color: theme-color("primary");
|
|
41
|
+
color: white;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
.selected {
|
|
46
|
+
background-color: theme-color("primary");
|
|
47
|
+
color: white;
|
|
48
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
|
|
3
|
+
export const CheckIcon = (props) => {
|
|
4
|
+
return (
|
|
5
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" fill="none" viewBox="0 0 14 14" {...props}>
|
|
6
|
+
<path stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" d="M2 7.545l2.727 2.728L12 3" />
|
|
7
|
+
</svg>
|
|
8
|
+
);
|
|
9
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
|
|
3
|
+
export const TrashIcon = (props) => {
|
|
4
|
+
return (
|
|
5
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" fill="none" viewBox="0 0 14 14" {...props}>
|
|
6
|
+
<g stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" clipPath="url(#clip0)">
|
|
7
|
+
<path d="M1.829 3.324H12.15M8.095 1.85H5.884v0a.737.737 0 00-.738.737v.737h3.687v-.737 0a.737.737 0 00-.738-.737v0zM5.884 9.591V5.905M8.095 9.591V5.905M10.364 11.495v0a.737.737 0 01-.735.677H4.351v0a.737.737 0 01-.735-.677l-.681-8.17h8.11l-.681 8.17z"></path>
|
|
8
|
+
</g>
|
|
9
|
+
|
|
10
|
+
<defs>
|
|
11
|
+
<clipPath id="clip0">
|
|
12
|
+
<path fill="currentColor" d="M0 0H11.796V11.796H0z" transform="translate(1.091 1.113)"></path>
|
|
13
|
+
</clipPath>
|
|
14
|
+
</defs>
|
|
15
|
+
</svg>
|
|
16
|
+
);
|
|
17
|
+
};
|
package/src/index.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import "./styles/index.scss";
|
|
2
|
+
|
|
3
|
+
// Components
|
|
4
|
+
export { Stepper, Step } from "./components/Stepper";
|
|
5
|
+
export { FormInput } from "./components/FormInput";
|
|
6
|
+
export { CountrySelect } from "./components/CountrySelect";
|
|
7
|
+
export { PhoneInput } from "./components/PhoneInput";
|
|
8
|
+
export { MiniStepper } from "./components/MiniStepper";
|
|
9
|
+
export { ProductSelector } from "./components/ProductSelector";
|
|
10
|
+
export { ScheduleEditor, getScheduleSummary } from "./components/ScheduleEditor";
|
|
11
|
+
export { DatePicker, formatDate } from "./components/DatePicker";
|
|
12
|
+
export { TimePicker } from "./components/TimePicker";
|
|
13
|
+
|
|
14
|
+
// Icons
|
|
15
|
+
export { CheckIcon } from "./icons/CheckIcon";
|
|
16
|
+
export { TrashIcon } from "./icons/TrashIcon";
|
|
17
|
+
|
|
18
|
+
export * from "reactstrap";
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { Button } from "..";
|
|
2
|
+
import React from "react";
|
|
3
|
+
|
|
4
|
+
export default {
|
|
5
|
+
title: "Button",
|
|
6
|
+
component: Button,
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
export const Default = () => {
|
|
10
|
+
return <Button>Default</Button>;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export const Colors = () => {
|
|
14
|
+
return (
|
|
15
|
+
<div>
|
|
16
|
+
<Button color="primary">Primary</Button> <Button color="secondary">Secondary</Button>{" "}
|
|
17
|
+
<Button color="success">Success</Button> <Button color="info">Info</Button>{" "}
|
|
18
|
+
<Button color="warning">Warning</Button> <Button color="danger">Danger</Button>{" "}
|
|
19
|
+
<Button color="link">Link</Button>{" "}
|
|
20
|
+
</div>
|
|
21
|
+
);
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export const Outlined = () => {
|
|
25
|
+
return (
|
|
26
|
+
<div>
|
|
27
|
+
<Button color="primary" outline>
|
|
28
|
+
Primary
|
|
29
|
+
</Button>{" "}
|
|
30
|
+
<Button color="secondary" outline>
|
|
31
|
+
Secondary
|
|
32
|
+
</Button>{" "}
|
|
33
|
+
<Button color="success" outline>
|
|
34
|
+
Success
|
|
35
|
+
</Button>{" "}
|
|
36
|
+
<Button color="info" outline>
|
|
37
|
+
Info
|
|
38
|
+
</Button>{" "}
|
|
39
|
+
<Button color="warning" outline>
|
|
40
|
+
Warning
|
|
41
|
+
</Button>{" "}
|
|
42
|
+
<Button color="danger" outline>
|
|
43
|
+
Danger
|
|
44
|
+
</Button>{" "}
|
|
45
|
+
<Button color="link" outline>
|
|
46
|
+
Link
|
|
47
|
+
</Button>
|
|
48
|
+
</div>
|
|
49
|
+
);
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
export const Sizes = () => {
|
|
53
|
+
return (
|
|
54
|
+
<div>
|
|
55
|
+
<Button size="sm" color="primary">
|
|
56
|
+
Small
|
|
57
|
+
</Button>{" "}
|
|
58
|
+
<Button size="md" color="secondary">
|
|
59
|
+
Medium
|
|
60
|
+
</Button>{" "}
|
|
61
|
+
<Button size="lg" color="success">
|
|
62
|
+
Large
|
|
63
|
+
</Button>
|
|
64
|
+
</div>
|
|
65
|
+
);
|
|
66
|
+
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { CountrySelect, FormInput } from "..";
|
|
2
|
+
import React from "react";
|
|
3
|
+
|
|
4
|
+
export default {
|
|
5
|
+
title: "CountrySelect",
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
export const Default = () => {
|
|
9
|
+
return <CountrySelect />;
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
export const WithFormInput = () => {
|
|
13
|
+
return (
|
|
14
|
+
<FormInput label="Select Country">
|
|
15
|
+
<CountrySelect />
|
|
16
|
+
</FormInput>
|
|
17
|
+
);
|
|
18
|
+
};
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import React, { Component, useState } from "react";
|
|
2
|
+
import { Fragment } from "react";
|
|
3
|
+
import { DatePicker } from "..";
|
|
4
|
+
|
|
5
|
+
export default {
|
|
6
|
+
title: "DatePicker",
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
export const Calendar = () => {
|
|
10
|
+
const [selectedValue, setSelectedValue] = useState(new Date("2021-03-17"));
|
|
11
|
+
const handleChange = (value) => {
|
|
12
|
+
setSelectedValue(value);
|
|
13
|
+
};
|
|
14
|
+
return <DatePicker onChange={handleChange} isDatePicker={false} value={selectedValue} />;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export const CalendarWithMultipleDates = () => {
|
|
18
|
+
const [selectedDates, setSelectedDates] = useState([
|
|
19
|
+
new Date("2021-03-01"),
|
|
20
|
+
new Date("2021-03-14"),
|
|
21
|
+
new Date("2021-03-20"),
|
|
22
|
+
]);
|
|
23
|
+
const handleChange = (value) => {
|
|
24
|
+
setSelectedDates([...selectedDates, ...value]);
|
|
25
|
+
};
|
|
26
|
+
return <DatePicker onChange={handleChange} isDatePicker={false} value={selectedDates} />;
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
export const Datepicker = () => {
|
|
30
|
+
const [selectedValue, setSelectedValue] = useState();
|
|
31
|
+
const handleChange = (value) => {
|
|
32
|
+
setSelectedValue(value);
|
|
33
|
+
console.log(selectedValue);
|
|
34
|
+
};
|
|
35
|
+
return (
|
|
36
|
+
<DatePicker
|
|
37
|
+
isDatePicker={true}
|
|
38
|
+
placeholder="Select Date"
|
|
39
|
+
format="dd MMM, yyyy"
|
|
40
|
+
value={selectedValue}
|
|
41
|
+
onChange={(v) => handleChange(v)}
|
|
42
|
+
/>
|
|
43
|
+
);
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
export const MultiDatePicker = () => {
|
|
47
|
+
const [selectedDates, setSelectedDates] = useState();
|
|
48
|
+
const handleChange = (value) => {
|
|
49
|
+
setSelectedDates([...value]);
|
|
50
|
+
console.log(selectedDates);
|
|
51
|
+
};
|
|
52
|
+
return (
|
|
53
|
+
<DatePicker
|
|
54
|
+
isDatePicker={true}
|
|
55
|
+
isMultiple={true}
|
|
56
|
+
placeholder="Select Date"
|
|
57
|
+
format="dd MMM, yyyy"
|
|
58
|
+
value={selectedDates}
|
|
59
|
+
onChange={(v) => handleChange(v)}
|
|
60
|
+
/>
|
|
61
|
+
);
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
export const RangePicker = () => {
|
|
65
|
+
const [range, setRange] = useState({ from: null, to: null });
|
|
66
|
+
const today = new Date();
|
|
67
|
+
const handleChange = (value, key) => {
|
|
68
|
+
let currentRange = { ...range };
|
|
69
|
+
currentRange[key] = value;
|
|
70
|
+
setRange(currentRange);
|
|
71
|
+
};
|
|
72
|
+
return (
|
|
73
|
+
<Fragment>
|
|
74
|
+
<DatePicker
|
|
75
|
+
isDatePicker={true}
|
|
76
|
+
placeholder="From"
|
|
77
|
+
value={range.from}
|
|
78
|
+
minDate={today}
|
|
79
|
+
format="MM-dd-yyyy"
|
|
80
|
+
maxDate={range.to}
|
|
81
|
+
onChange={(v) => handleChange(v, "from")}
|
|
82
|
+
name="from"
|
|
83
|
+
/>{" "}
|
|
84
|
+
untill{" "}
|
|
85
|
+
<DatePicker
|
|
86
|
+
isDatePicker={true}
|
|
87
|
+
placeholder="To"
|
|
88
|
+
value={range.to}
|
|
89
|
+
minDate={range.from ? range.from : today}
|
|
90
|
+
format="MM-dd-yyyy"
|
|
91
|
+
onChange={(v) => handleChange(v, "to")}
|
|
92
|
+
name="to"
|
|
93
|
+
/>
|
|
94
|
+
</Fragment>
|
|
95
|
+
);
|
|
96
|
+
};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { FormInput } from "..";
|
|
2
|
+
import React from "react";
|
|
3
|
+
|
|
4
|
+
export default {
|
|
5
|
+
title: "FormInput",
|
|
6
|
+
// component: Input,
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
export const Default = () => {
|
|
10
|
+
return <FormInput label="Name" />;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export const WithError = () => {
|
|
14
|
+
return <FormInput label="Name" error="is required and the rest of the message is really long" />;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export const Select = () => {
|
|
18
|
+
return (
|
|
19
|
+
<FormInput label="Select Number" type="select">
|
|
20
|
+
<option value="one">One</option>
|
|
21
|
+
<option value="two">Two</option>
|
|
22
|
+
<option value="three">Three</option>
|
|
23
|
+
</FormInput>
|
|
24
|
+
);
|
|
25
|
+
};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { CustomInput, FormGroup, Input, Label } from "..";
|
|
3
|
+
|
|
4
|
+
export default {
|
|
5
|
+
title: "Form",
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
export const Default = () => {
|
|
9
|
+
return (
|
|
10
|
+
<FormGroup>
|
|
11
|
+
<Label>Name</Label>
|
|
12
|
+
<Input />
|
|
13
|
+
</FormGroup>
|
|
14
|
+
);
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export const Checkboxes = () => {
|
|
18
|
+
return (
|
|
19
|
+
<div>
|
|
20
|
+
<FormGroup check>
|
|
21
|
+
<Label check>
|
|
22
|
+
<Input type="checkbox" /> Native
|
|
23
|
+
</Label>
|
|
24
|
+
</FormGroup>
|
|
25
|
+
|
|
26
|
+
<CustomInput type="checkbox" id="checkbox-example" label="Custom" />
|
|
27
|
+
</div>
|
|
28
|
+
);
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
export const Radios = () => {
|
|
32
|
+
return (
|
|
33
|
+
<div>
|
|
34
|
+
<FormGroup check>
|
|
35
|
+
<Label check>
|
|
36
|
+
<Input type="radio" /> Native
|
|
37
|
+
</Label>
|
|
38
|
+
</FormGroup>
|
|
39
|
+
|
|
40
|
+
<CustomInput type="radio" id="radio-example" label="Custom" />
|
|
41
|
+
</div>
|
|
42
|
+
);
|
|
43
|
+
};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { CheckIcon } from "..";
|
|
3
|
+
import { TrashIcon } from "..";
|
|
4
|
+
|
|
5
|
+
export default {
|
|
6
|
+
title: "Icons",
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
export const Default = () => {
|
|
10
|
+
return (
|
|
11
|
+
<div>
|
|
12
|
+
<div>
|
|
13
|
+
CheckIcon <CheckIcon />
|
|
14
|
+
</div>
|
|
15
|
+
|
|
16
|
+
<div>
|
|
17
|
+
TrashIcon <TrashIcon />
|
|
18
|
+
</div>
|
|
19
|
+
</div>
|
|
20
|
+
);
|
|
21
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { MiniStepper } from "..";
|
|
3
|
+
|
|
4
|
+
export default {
|
|
5
|
+
title: "MiniStepper",
|
|
6
|
+
component: MiniStepper,
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
export const Default = () => {
|
|
10
|
+
return <MiniStepper count={10} value={3} />;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export const Resized = () => {
|
|
14
|
+
return <MiniStepper count={10} value={3} size={30} />;
|
|
15
|
+
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { PhoneInput, FormInput } from "..";
|
|
2
|
+
import React, { useState } from "react";
|
|
3
|
+
|
|
4
|
+
export default {
|
|
5
|
+
title: "PhoneInput",
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
export const Default = () => {
|
|
9
|
+
const [value, setValue] = useState("");
|
|
10
|
+
return <PhoneInput onChange={setValue} value={value} />;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export const WithDefaultCountry = () => {
|
|
14
|
+
const [value, setValue] = useState("+1");
|
|
15
|
+
return <PhoneInput onChange={setValue} value={value} defaultCountry="US" />;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
export const WithFormInput = () => {
|
|
19
|
+
const [value, setValue] = useState("");
|
|
20
|
+
|
|
21
|
+
return (
|
|
22
|
+
<FormInput label="Select Country">
|
|
23
|
+
<PhoneInput onChange={setValue} value={value} />
|
|
24
|
+
</FormInput>
|
|
25
|
+
);
|
|
26
|
+
};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { ProductSelector } from "..";
|
|
2
|
+
import React, { useState } from "react";
|
|
3
|
+
import products from "../values/products";
|
|
4
|
+
|
|
5
|
+
export default {
|
|
6
|
+
title: "ProductSelector",
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
export const Default = () => {
|
|
10
|
+
const onChange = (selectedProducts) => {
|
|
11
|
+
console.log("Selected Products are", selectedProducts);
|
|
12
|
+
};
|
|
13
|
+
return <ProductSelector onChange={onChange} products={products} />;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export const withValues = () => {
|
|
17
|
+
const [selectedProducts, setSelectedProducts] = useState([
|
|
18
|
+
{
|
|
19
|
+
id: "1",
|
|
20
|
+
name: "Bird Watching Experience",
|
|
21
|
+
seller: { id: "1" },
|
|
22
|
+
photo: { src: "https://placeimg.com/140/105/animals" },
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
id: "2",
|
|
26
|
+
name: "1 Hour deep dive Scuba diving",
|
|
27
|
+
seller: { id: "2" },
|
|
28
|
+
photo: { src: "https://placeimg.com/140/105/nature" },
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
id: "3",
|
|
32
|
+
name: "Paragliding Experience",
|
|
33
|
+
seller: { id: "1" },
|
|
34
|
+
photo: { src: "https://placeimg.com/140/105/nature" },
|
|
35
|
+
},
|
|
36
|
+
]);
|
|
37
|
+
const onChange = (selectedProducts) => {
|
|
38
|
+
console.log("Selected Products are", selectedProducts);
|
|
39
|
+
setSelectedProducts(selectedProducts);
|
|
40
|
+
};
|
|
41
|
+
return <ProductSelector onChange={onChange} value={selectedProducts} products={products} />;
|
|
42
|
+
};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import React, { useState } from "react";
|
|
2
|
+
import { ScheduleEditor } from "..";
|
|
3
|
+
|
|
4
|
+
export default {
|
|
5
|
+
title: "ScheduleEditor",
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
export const Default = () => {
|
|
9
|
+
const handleChange = (schedule) => {
|
|
10
|
+
console.log("Updated Schedule", schedule);
|
|
11
|
+
};
|
|
12
|
+
return <ScheduleEditor onChange={handleChange} />;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export const WithValues = () => {
|
|
16
|
+
const [schedule, setSchedule] = useState({
|
|
17
|
+
name: "Every Thursday",
|
|
18
|
+
type: "available",
|
|
19
|
+
repeat: "custom",
|
|
20
|
+
days: [4],
|
|
21
|
+
dates: ["2021-04-14", "2021-03-14", "2021-03-21"],
|
|
22
|
+
departure: "fixed",
|
|
23
|
+
priceDelta: 60,
|
|
24
|
+
priceDeltaType: "increase",
|
|
25
|
+
times: [1235, 855],
|
|
26
|
+
timeRanges: [{ startTime: 600, endTime: 1645 }, { endTime: 2240 }],
|
|
27
|
+
start: new Date("2021-03-18"),
|
|
28
|
+
end: new Date("2021-03-25"),
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
const handleChange = (schedule) => {
|
|
32
|
+
console.log("Updated Schedule in STORIES", schedule);
|
|
33
|
+
setSchedule(schedule);
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
return <ScheduleEditor value={schedule} price={200} onChange={handleChange} />;
|
|
37
|
+
};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { Stepper, Step } from "..";
|
|
2
|
+
import React from "react";
|
|
3
|
+
|
|
4
|
+
export default {
|
|
5
|
+
title: "Stepper",
|
|
6
|
+
component: Stepper,
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
export const Default = () => {
|
|
10
|
+
return (
|
|
11
|
+
<Stepper>
|
|
12
|
+
<Step label="Basic Info" current>
|
|
13
|
+
1
|
|
14
|
+
</Step>
|
|
15
|
+
|
|
16
|
+
<Step label="Feature Menu">2</Step>
|
|
17
|
+
<Step label="Use Xola">3</Step>
|
|
18
|
+
</Stepper>
|
|
19
|
+
);
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export const Resized = () => {
|
|
23
|
+
return (
|
|
24
|
+
<Stepper size={40}>
|
|
25
|
+
<Step label="Basic Info" done>
|
|
26
|
+
1
|
|
27
|
+
</Step>
|
|
28
|
+
|
|
29
|
+
<Step label="Feature Menu" current>
|
|
30
|
+
2
|
|
31
|
+
</Step>
|
|
32
|
+
|
|
33
|
+
<Step label="Use Xola">3</Step>
|
|
34
|
+
</Stepper>
|
|
35
|
+
);
|
|
36
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React, { Fragment } from "react";
|
|
2
|
+
import { TimePicker } from "..";
|
|
3
|
+
|
|
4
|
+
export default {
|
|
5
|
+
title: "TimePicker",
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
export const Default = () => {
|
|
9
|
+
return <TimePicker onChange={(value) => console.log(value)} />;
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
export const WithValue = () => {
|
|
13
|
+
return <TimePicker value={1825} onChange={(value) => console.log(value)} />;
|
|
14
|
+
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import React, { Fragment } from "react";
|
|
2
|
+
|
|
3
|
+
export default {
|
|
4
|
+
title: "Typography",
|
|
5
|
+
};
|
|
6
|
+
|
|
7
|
+
export const Default = () => {
|
|
8
|
+
return (
|
|
9
|
+
<Fragment>
|
|
10
|
+
<h1>Heading 1</h1>
|
|
11
|
+
<h2>Heading 2</h2>
|
|
12
|
+
<h3>Heading 3</h3>
|
|
13
|
+
<h4>Heading 4</h4>
|
|
14
|
+
<h5>Heading 5</h5>
|
|
15
|
+
<h6>Heading 6</h6>
|
|
16
|
+
</Fragment>
|
|
17
|
+
);
|
|
18
|
+
};
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
@import "./variables.scss";
|
|
2
|
+
|
|
3
|
+
// Removes the "x" icon from invalid form inputs.
|
|
4
|
+
.form-control.is-invalid {
|
|
5
|
+
background-image: none;
|
|
6
|
+
padding-right: $input-padding-x;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
.cover {
|
|
10
|
+
object-fit: cover;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
.bg-cover {
|
|
14
|
+
background-size: cover;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
.form-group label {
|
|
18
|
+
font-size: 0.75rem;
|
|
19
|
+
font-weight: bold;
|
|
20
|
+
margin-bottom: 0.25rem;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
.form-check-label,
|
|
24
|
+
.custom-control-label {
|
|
25
|
+
font-size: 0.875rem !important;
|
|
26
|
+
font-weight: normal !important;
|
|
27
|
+
margin-bottom: 0 !important;
|
|
28
|
+
color: $secondary;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
.form-check-label .form-check-input {
|
|
32
|
+
margin-top: 0.25rem; // To compensate for smaller base font size.
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
.custom-control-label::before,
|
|
36
|
+
.custom-control-label::after {
|
|
37
|
+
top: 0.1rem;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.cursor-pointer {
|
|
41
|
+
cursor: pointer;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.modal-header {
|
|
45
|
+
border-bottom: none;
|
|
46
|
+
justify-content: center;
|
|
47
|
+
|
|
48
|
+
.modal-title {
|
|
49
|
+
flex: 1;
|
|
50
|
+
text-align: center;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
.close {
|
|
54
|
+
margin-left: 0;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.modal-footer {
|
|
59
|
+
border-top: none;
|
|
60
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
$font-size-base: 0.875rem; // ~14px
|
|
2
|
+
|
|
3
|
+
// Base body color.
|
|
4
|
+
$body-color: #222324;
|
|
5
|
+
$dark: #222324;
|
|
6
|
+
$light: #f0f2f4;
|
|
7
|
+
|
|
8
|
+
// Theme colors.
|
|
9
|
+
$theme-colors: (
|
|
10
|
+
"primary": #1352c6,
|
|
11
|
+
"secondary": #505254,
|
|
12
|
+
"success": #27ce70,
|
|
13
|
+
"info": #3fe2ee,
|
|
14
|
+
"danger": #ff5a5a,
|
|
15
|
+
"warning": #ffc03d,
|
|
16
|
+
);
|
|
17
|
+
|
|
18
|
+
// Fonts.
|
|
19
|
+
$font-family-sans-serif: "SF Pro Display", "Helvetica Neue", Helvetica, Arial, sans-serif;
|
|
20
|
+
|
|
21
|
+
// Fixes button label contrast issue when theme colors are changed.
|
|
22
|
+
// The yiq lightness value that determines when the lightness of color changes from "dark" to "light".
|
|
23
|
+
// Acceptable values are between 0 and 255.
|
|
24
|
+
$yiq-contrasted-threshold: 200;
|
|
25
|
+
|
|
26
|
+
// Border radius.
|
|
27
|
+
$border-color: #d3d3d3;
|
|
28
|
+
$border-radius: 0.25rem; // 4px
|
|
29
|
+
$border-radius-lg: 0.375rem; // 6px
|
|
30
|
+
$border-radius-sm: 0.1875rem; // 3px
|
|
31
|
+
|
|
32
|
+
//Hover
|
|
33
|
+
$hover-background: #f2f2f2;
|
|
34
|
+
|
|
35
|
+
//Input Border
|
|
36
|
+
$input-border: #ced4da;
|
|
37
|
+
$input-color: #495057;
|
|
38
|
+
|
|
39
|
+
//Box Shadow
|
|
40
|
+
$box-shadow-color: #8798ad;
|
|
41
|
+
@import "~bootstrap/scss/functions";
|
|
42
|
+
@import "~bootstrap/scss/variables";
|
|
43
|
+
@import "~bootstrap/scss/mixins";
|