@drivy/cobalt 0.35.0 → 0.36.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/components/Calendar/CalendarDayPicker/CalendarDayPicker.js +43 -0
- package/components/Calendar/CalendarDayPicker/CalendarDayPicker.js.map +1 -0
- package/components/Calendar/CalendarDayPicker/CalendarDayPickerDay.js +27 -0
- package/components/Calendar/CalendarDayPicker/CalendarDayPickerDay.js.map +1 -0
- package/components/Calendar/CalendarDayPicker/CalendarDayPickerMonth.js +35 -0
- package/components/Calendar/CalendarDayPicker/CalendarDayPickerMonth.js.map +1 -0
- package/components/Calendar/CalendarRangePicker/CalendarRangePickerMonth.js +4 -22
- package/components/Calendar/CalendarRangePicker/CalendarRangePickerMonth.js.map +1 -1
- package/components/Calendar/utils.js +29 -0
- package/components/Calendar/utils.js.map +1 -0
- package/components/Modal/index.js +2 -2
- package/components/Modal/index.js.map +1 -1
- package/index.js +2 -0
- package/index.js.map +1 -1
- package/package.json +24 -24
- package/styles/components/Calendar/CalendarDayPicker/index.scss +175 -0
- package/styles/components/Calendar/CalendarRangePicker/index.scss +7 -3
- package/styles/components/Form/Autocomplete/index.scss +3 -1
- package/styles/components.scss +1 -0
- package/types/components/Calendar/CalendarDayPicker/CalendarDayPicker.d.ts +19 -0
- package/types/components/Calendar/CalendarDayPicker/CalendarDayPickerDay.d.ts +13 -0
- package/types/components/Calendar/CalendarDayPicker/CalendarDayPickerMonth.d.ts +13 -0
- package/types/components/Calendar/CalendarDayPicker/index.d.ts +1 -0
- package/types/components/Calendar/utils.d.ts +2 -0
- package/types/components/Modal/index.d.ts +4 -0
- package/types/index.d.ts +3 -0
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import React, { useRef, useState, useEffect } from 'react';
|
|
2
|
+
import { CalendarDayPickerMonth } from './CalendarDayPickerMonth.js';
|
|
3
|
+
import cx from 'classnames';
|
|
4
|
+
import { Hint } from '../../Form/Hint.js';
|
|
5
|
+
import addMonths from 'date-fns/addMonths';
|
|
6
|
+
|
|
7
|
+
function CalendarDayPicker({ firstMonthDate = new Date(), numberOfMonths = 1, hint, firstAvailableDate = new Date(), lastAvailableDate, selectedDate, onChangeDate, onLeaveDate, onSelectDate, locale, }) {
|
|
8
|
+
const isFirstRender = useRef(true);
|
|
9
|
+
firstMonthDate.setHours(0, 0, 0, 0);
|
|
10
|
+
firstAvailableDate.setHours(0, 0, 0, 0);
|
|
11
|
+
const [internalSelectedDate, setInternalSelectedDate] = useState(selectedDate != null ? selectedDate : null);
|
|
12
|
+
useEffect(() => {
|
|
13
|
+
if (isFirstRender.current) {
|
|
14
|
+
isFirstRender.current = false;
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
selectedDate !== internalSelectedDate &&
|
|
18
|
+
setInternalSelectedDate(selectedDate);
|
|
19
|
+
}, [selectedDate]);
|
|
20
|
+
const handleSelectDate = (date) => {
|
|
21
|
+
setInternalSelectedDate(date);
|
|
22
|
+
onSelectDate && onSelectDate(date);
|
|
23
|
+
};
|
|
24
|
+
const handleChangeDate = (date, disabled) => {
|
|
25
|
+
const processChange = onChangeDate
|
|
26
|
+
? onChangeDate(date, disabled) !== false
|
|
27
|
+
: true;
|
|
28
|
+
if (!processChange || disabled)
|
|
29
|
+
return;
|
|
30
|
+
};
|
|
31
|
+
const months = [firstMonthDate];
|
|
32
|
+
for (let i = 0; i < numberOfMonths - 1; i++) {
|
|
33
|
+
months.push(addMonths(months[months.length - 1], 1));
|
|
34
|
+
}
|
|
35
|
+
return (React.createElement("div", { className: "cobalt-CalendarDayPicker" },
|
|
36
|
+
React.createElement("div", { className: "cobalt-CalendarDayPicker__months-container" }, months.map((monthDate) => (React.createElement(CalendarDayPickerMonth, { key: monthDate.getTime(), month: monthDate, selectedDate: internalSelectedDate, onSelectDate: handleSelectDate, onChangeDate: handleChangeDate, onLeaveDate: onLeaveDate, firstAvailableDate: firstAvailableDate, lastAvailableDate: lastAvailableDate, locale: locale })))),
|
|
37
|
+
React.createElement("div", { className: cx("cobalt-CalendarDayPicker__message", {
|
|
38
|
+
"cobalt-CalendarDayPicker__message--show": !!hint,
|
|
39
|
+
}) }, hint && React.createElement(Hint, { status: hint.status }, hint.html))));
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export { CalendarDayPicker };
|
|
43
|
+
//# sourceMappingURL=CalendarDayPicker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CalendarDayPicker.js","sources":["../../../../src/components/Calendar/CalendarDayPicker/CalendarDayPicker.tsx"],"sourcesContent":["import React, { useState, useEffect, useRef } from \"react\"\nimport { CalendarDayPickerMonth } from \"./CalendarDayPickerMonth\"\nimport classNames from \"classnames\"\nimport { Hint } from \"../../Form/Hint\"\nimport addMonths from \"date-fns/addMonths\"\nimport { FormElementStatus } from \"../../Form/form\"\n\ntype CalendarDayPickerPropsType = {\n numberOfMonths?: number\n firstMonthDate?: Date\n firstAvailableDate?: Date\n lastAvailableDate?: Date\n selectedDate?: Date | null\n hint?: {\n status?: FormElementStatus\n html: string\n }\n onChangeDate?: (date: Date, disabled: boolean) => boolean\n onLeaveDate?: (date: Date) => void\n onSelectDate?: (date: Date) => void\n locale?: Record<string, unknown>\n}\n\nexport function CalendarDayPicker({\n firstMonthDate = new Date(),\n numberOfMonths = 1,\n hint,\n firstAvailableDate = new Date(),\n lastAvailableDate,\n selectedDate,\n onChangeDate,\n onLeaveDate,\n onSelectDate,\n locale,\n}: CalendarDayPickerPropsType) {\n const isFirstRender = useRef(true)\n\n firstMonthDate.setHours(0, 0, 0, 0)\n firstAvailableDate.setHours(0, 0, 0, 0)\n\n const [internalSelectedDate, setInternalSelectedDate] = useState<\n Date | null | undefined\n >(selectedDate != null ? selectedDate : null)\n\n useEffect(() => {\n if (isFirstRender.current) {\n isFirstRender.current = false\n return\n }\n selectedDate !== internalSelectedDate &&\n setInternalSelectedDate(selectedDate)\n }, [selectedDate])\n\n const handleSelectDate = (date: Date) => {\n setInternalSelectedDate(date)\n onSelectDate && onSelectDate(date)\n }\n\n const handleChangeDate = (date: Date, disabled: boolean) => {\n const processChange = onChangeDate\n ? onChangeDate(date, disabled) !== false\n : true\n\n if (!processChange || disabled) return\n }\n\n const months = [firstMonthDate]\n for (let i = 0; i < numberOfMonths - 1; i++) {\n months.push(addMonths(months[months.length - 1], 1))\n }\n\n return (\n <div className=\"cobalt-CalendarDayPicker\">\n <div className=\"cobalt-CalendarDayPicker__months-container\">\n {months.map((monthDate) => (\n <CalendarDayPickerMonth\n key={monthDate.getTime()}\n month={monthDate}\n selectedDate={internalSelectedDate}\n onSelectDate={handleSelectDate}\n onChangeDate={handleChangeDate}\n onLeaveDate={onLeaveDate}\n firstAvailableDate={firstAvailableDate}\n lastAvailableDate={lastAvailableDate}\n locale={locale}\n />\n ))}\n </div>\n\n <div\n className={classNames(\"cobalt-CalendarDayPicker__message\", {\n \"cobalt-CalendarDayPicker__message--show\": !!hint,\n })}\n >\n {hint && <Hint status={hint.status}>{hint.html}</Hint>}\n </div>\n </div>\n )\n}\n"],"names":["classNames"],"mappings":";;;;;;AAuBgB,SAAA,iBAAiB,CAAC,EAChC,cAAc,GAAG,IAAI,IAAI,EAAE,EAC3B,cAAc,GAAG,CAAC,EAClB,IAAI,EACJ,kBAAkB,GAAG,IAAI,IAAI,EAAE,EAC/B,iBAAiB,EACjB,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,MAAM,GACqB,EAAA;AAC3B,IAAA,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,CAAA;IAElC,cAAc,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IACnC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IAEvC,MAAM,CAAC,oBAAoB,EAAE,uBAAuB,CAAC,GAAG,QAAQ,CAE9D,YAAY,IAAI,IAAI,GAAG,YAAY,GAAG,IAAI,CAAC,CAAA;IAE7C,SAAS,CAAC,MAAK;QACb,IAAI,aAAa,CAAC,OAAO,EAAE;AACzB,YAAA,aAAa,CAAC,OAAO,GAAG,KAAK,CAAA;YAC7B,OAAM;AACP,SAAA;AACD,QAAA,YAAY,KAAK,oBAAoB;YACnC,uBAAuB,CAAC,YAAY,CAAC,CAAA;AACzC,KAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAA;AAElB,IAAA,MAAM,gBAAgB,GAAG,CAAC,IAAU,KAAI;QACtC,uBAAuB,CAAC,IAAI,CAAC,CAAA;AAC7B,QAAA,YAAY,IAAI,YAAY,CAAC,IAAI,CAAC,CAAA;AACpC,KAAC,CAAA;AAED,IAAA,MAAM,gBAAgB,GAAG,CAAC,IAAU,EAAE,QAAiB,KAAI;QACzD,MAAM,aAAa,GAAG,YAAY;cAC9B,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,KAAK;cACtC,IAAI,CAAA;QAER,IAAI,CAAC,aAAa,IAAI,QAAQ;YAAE,OAAM;AACxC,KAAC,CAAA;AAED,IAAA,MAAM,MAAM,GAAG,CAAC,cAAc,CAAC,CAAA;AAC/B,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;AAC3C,QAAA,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;AACrD,KAAA;AAED,IAAA,QACE,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,0BAA0B,EAAA;QACvC,KAAK,CAAA,aAAA,CAAA,KAAA,EAAA,EAAA,SAAS,EAAC,4CAA4C,EACxD,EAAA,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,MACpB,KAAA,CAAA,aAAA,CAAC,sBAAsB,EAAA,EACrB,GAAG,EAAE,SAAS,CAAC,OAAO,EAAE,EACxB,KAAK,EAAE,SAAS,EAChB,YAAY,EAAE,oBAAoB,EAClC,YAAY,EAAE,gBAAgB,EAC9B,YAAY,EAAE,gBAAgB,EAC9B,WAAW,EAAE,WAAW,EACxB,kBAAkB,EAAE,kBAAkB,EACtC,iBAAiB,EAAE,iBAAiB,EACpC,MAAM,EAAE,MAAM,EAAA,CACd,CACH,CAAC,CACE;AAEN,QAAA,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EACE,SAAS,EAAEA,EAAU,CAAC,mCAAmC,EAAE;gBACzD,yCAAyC,EAAE,CAAC,CAAC,IAAI;AAClD,aAAA,CAAC,IAED,IAAI,IAAI,oBAAC,IAAI,EAAA,EAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAA,EAAG,IAAI,CAAC,IAAI,CAAQ,CAClD,CACF,EACP;AACH;;;;"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import cx from 'classnames';
|
|
3
|
+
import { format } from 'date-fns';
|
|
4
|
+
|
|
5
|
+
function CalendarDayPickerDay({ date, isToday, selected, disabled, onSelect, onMouseEnter, onMouseLeave, }) {
|
|
6
|
+
const handleSelectDate = () => {
|
|
7
|
+
!disabled && onSelect(date);
|
|
8
|
+
};
|
|
9
|
+
return (React.createElement("div", { className: cx("cobalt-CalendarDayPicker__day", {
|
|
10
|
+
"cobalt-CalendarDayPicker__day--today": isToday,
|
|
11
|
+
"cobalt-CalendarDayPicker__day--selected": selected,
|
|
12
|
+
"cobalt-CalendarDayPicker__day--disabled": disabled,
|
|
13
|
+
}), onMouseEnter: () => {
|
|
14
|
+
onMouseEnter && onMouseEnter(date, !!disabled);
|
|
15
|
+
}, onMouseLeave: () => {
|
|
16
|
+
onMouseLeave && onMouseLeave(date);
|
|
17
|
+
}, onClick: handleSelectDate, "data-day": format(date, "yyyy-MM-dd") },
|
|
18
|
+
React.createElement("div", { className: "cobalt-CalendarDayPicker__day-inner" }, date.getDate())));
|
|
19
|
+
}
|
|
20
|
+
function areEqual(prevProps, nextProps) {
|
|
21
|
+
return prevProps.selected === nextProps.selected;
|
|
22
|
+
}
|
|
23
|
+
const MemoizedComponent = React.memo(CalendarDayPickerDay, areEqual);
|
|
24
|
+
MemoizedComponent.displayName = "CalendarDayPickerDay";
|
|
25
|
+
|
|
26
|
+
export { MemoizedComponent as CalendarDayPickerDay };
|
|
27
|
+
//# sourceMappingURL=CalendarDayPickerDay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CalendarDayPickerDay.js","sources":["../../../../src/components/Calendar/CalendarDayPicker/CalendarDayPickerDay.tsx"],"sourcesContent":["import React from \"react\"\nimport classNames from \"classnames\"\nimport { format } from \"date-fns\"\n\ntype CalendarDayPickerDayPropsType = {\n date: Date\n isToday?: boolean\n selected?: boolean\n disabled?: boolean\n onSelect: (date: Date) => void\n onMouseEnter?: (date: Date, disabled: boolean) => void\n onMouseLeave?: (date: Date) => void\n}\n\nfunction CalendarDayPickerDay({\n date,\n isToday,\n selected,\n disabled,\n onSelect,\n onMouseEnter,\n onMouseLeave,\n}: CalendarDayPickerDayPropsType) {\n const handleSelectDate = () => {\n !disabled && onSelect(date)\n }\n\n return (\n <div\n className={classNames(\"cobalt-CalendarDayPicker__day\", {\n \"cobalt-CalendarDayPicker__day--today\": isToday,\n \"cobalt-CalendarDayPicker__day--selected\": selected,\n \"cobalt-CalendarDayPicker__day--disabled\": disabled,\n })}\n onMouseEnter={() => {\n onMouseEnter && onMouseEnter(date, !!disabled)\n }}\n onMouseLeave={() => {\n onMouseLeave && onMouseLeave(date)\n }}\n onClick={handleSelectDate}\n data-day={format(date, \"yyyy-MM-dd\")}\n >\n <div className=\"cobalt-CalendarDayPicker__day-inner\">\n {date.getDate()}\n </div>\n </div>\n )\n}\n\nfunction areEqual(\n prevProps: CalendarDayPickerDayPropsType,\n nextProps: CalendarDayPickerDayPropsType\n) {\n return prevProps.selected === nextProps.selected\n}\n\nconst MemoizedComponent = React.memo(CalendarDayPickerDay, areEqual)\nMemoizedComponent.displayName = \"CalendarDayPickerDay\"\n\nexport { MemoizedComponent as CalendarDayPickerDay }\n"],"names":["classNames"],"mappings":";;;;AAcA,SAAS,oBAAoB,CAAC,EAC5B,IAAI,EACJ,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,YAAY,GACkB,EAAA;IAC9B,MAAM,gBAAgB,GAAG,MAAK;AAC5B,QAAA,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAA;AAC7B,KAAC,CAAA;AAED,IAAA,QACE,KACE,CAAA,aAAA,CAAA,KAAA,EAAA,EAAA,SAAS,EAAEA,EAAU,CAAC,+BAA+B,EAAE;AACrD,YAAA,sCAAsC,EAAE,OAAO;AAC/C,YAAA,yCAAyC,EAAE,QAAQ;AACnD,YAAA,yCAAyC,EAAE,QAAQ;AACpD,SAAA,CAAC,EACF,YAAY,EAAE,MAAK;YACjB,YAAY,IAAI,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAA;AAChD,SAAC,EACD,YAAY,EAAE,MAAK;AACjB,YAAA,YAAY,IAAI,YAAY,CAAC,IAAI,CAAC,CAAA;SACnC,EACD,OAAO,EAAE,gBAAgB,EAAA,UAAA,EACf,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,EAAA;QAEpC,KAAK,CAAA,aAAA,CAAA,KAAA,EAAA,EAAA,SAAS,EAAC,qCAAqC,EACjD,EAAA,IAAI,CAAC,OAAO,EAAE,CACX,CACF,EACP;AACH,CAAC;AAED,SAAS,QAAQ,CACf,SAAwC,EACxC,SAAwC,EAAA;AAExC,IAAA,OAAO,SAAS,CAAC,QAAQ,KAAK,SAAS,CAAC,QAAQ,CAAA;AAClD,CAAC;AAEK,MAAA,iBAAiB,GAAG,KAAK,CAAC,IAAI,CAAC,oBAAoB,EAAE,QAAQ,EAAC;AACpE,iBAAiB,CAAC,WAAW,GAAG,sBAAsB;;;;"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import React, { useRef } from 'react';
|
|
2
|
+
import { CalendarDayPickerDay as MemoizedComponent } from './CalendarDayPickerDay.js';
|
|
3
|
+
import { format, isSameDay } from 'date-fns';
|
|
4
|
+
import { getWeekDays, getMonthDaysByWeeks } from '../utils.js';
|
|
5
|
+
|
|
6
|
+
function isDisabled(day, firstAvailableDate, lastAvailableDate) {
|
|
7
|
+
return (day.getTime() < firstAvailableDate.getTime() ||
|
|
8
|
+
(lastAvailableDate != null && day.getTime() > lastAvailableDate.getTime()));
|
|
9
|
+
}
|
|
10
|
+
function areEqualDays(date1, date2) {
|
|
11
|
+
return date1 != null && date2 != null && isSameDay(date1, date2);
|
|
12
|
+
}
|
|
13
|
+
const weekdays = getWeekDays();
|
|
14
|
+
const today = new Date().setHours(0, 0, 0, 0);
|
|
15
|
+
function CalendarDayPickerMonth({ month, selectedDate, onSelectDate, onChangeDate, onLeaveDate, firstAvailableDate, lastAvailableDate, locale, }) {
|
|
16
|
+
const byWeeks = useRef(getMonthDaysByWeeks(month));
|
|
17
|
+
const onMouseEnter = (day, disabled) => {
|
|
18
|
+
onChangeDate(day, disabled);
|
|
19
|
+
};
|
|
20
|
+
const onSelect = (targetDate) => {
|
|
21
|
+
if (!areEqualDays(targetDate, selectedDate)) {
|
|
22
|
+
onSelectDate(targetDate);
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
return (React.createElement("div", { className: "cobalt-CalendarDayPicker__month", "data-month": format(month, "yyyy-MM") },
|
|
26
|
+
React.createElement("div", { className: "cobalt-CalendarDayPicker__month-header" }, format(month, "MMMM yyyy", { locale })),
|
|
27
|
+
React.createElement("div", { className: "cobalt-CalendarDayPicker__month__weeks-container" },
|
|
28
|
+
React.createElement("div", { className: "cobalt-CalendarDayPicker__month__week-header" }, weekdays.map((weekday) => (React.createElement("div", { key: weekday.getTime(), className: "cobalt-CalendarDayPicker__month__day-header" }, format(weekday, "iiiiii", { locale }))))),
|
|
29
|
+
byWeeks.current.map((week, index) => (React.createElement("div", { key: index, className: "cobalt-CalendarDayPicker__month__week" }, week.map((day) => {
|
|
30
|
+
return (React.createElement(MemoizedComponent, { key: day.getTime(), onMouseEnter: onMouseEnter, onMouseLeave: onLeaveDate, date: day, onSelect: onSelect, isToday: isSameDay(day, today), disabled: isDisabled(day, firstAvailableDate, lastAvailableDate), selected: areEqualDays(day, selectedDate) }));
|
|
31
|
+
})))))));
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export { CalendarDayPickerMonth };
|
|
35
|
+
//# sourceMappingURL=CalendarDayPickerMonth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CalendarDayPickerMonth.js","sources":["../../../../src/components/Calendar/CalendarDayPicker/CalendarDayPickerMonth.tsx"],"sourcesContent":["import React, { useRef } from \"react\"\nimport { CalendarDayPickerDay } from \"./CalendarDayPickerDay\"\nimport { format, isSameDay } from \"date-fns\"\nimport { getMonthDaysByWeeks, getWeekDays } from \"../utils\"\n\ntype CalendarDayPickerMonthPropsType = {\n month: Date\n selectedDate?: Date | null\n onSelectDate: (date: Date) => void\n onChangeDate: (date: Date, disabled: boolean) => void\n onLeaveDate?: (date: Date) => void\n firstAvailableDate: Date\n lastAvailableDate?: Date\n locale: any\n}\n\nfunction isDisabled(\n day: Date,\n firstAvailableDate: Date,\n lastAvailableDate: Date | undefined\n) {\n return (\n day.getTime() < firstAvailableDate.getTime() ||\n (lastAvailableDate != null && day.getTime() > lastAvailableDate.getTime())\n )\n}\n\nfunction areEqualDays(\n date1: Date | null | undefined,\n date2: Date | null | undefined\n) {\n return date1 != null && date2 != null && isSameDay(date1, date2)\n}\n\nconst weekdays = getWeekDays()\nconst today = new Date().setHours(0, 0, 0, 0)\n\nexport function CalendarDayPickerMonth({\n month,\n selectedDate,\n onSelectDate,\n onChangeDate,\n onLeaveDate,\n firstAvailableDate,\n lastAvailableDate,\n locale,\n}: CalendarDayPickerMonthPropsType) {\n const byWeeks = useRef(getMonthDaysByWeeks(month))\n\n const onMouseEnter = (day: Date, disabled: boolean) => {\n onChangeDate(day, disabled)\n }\n\n const onSelect = (targetDate: Date) => {\n if (!areEqualDays(targetDate, selectedDate)) {\n onSelectDate(targetDate)\n }\n }\n\n return (\n <div\n className=\"cobalt-CalendarDayPicker__month\"\n data-month={format(month, \"yyyy-MM\")}\n >\n <div className=\"cobalt-CalendarDayPicker__month-header\">\n {format(month, \"MMMM yyyy\", { locale })}\n </div>\n <div className=\"cobalt-CalendarDayPicker__month__weeks-container\">\n <div className=\"cobalt-CalendarDayPicker__month__week-header\">\n {weekdays.map((weekday) => (\n <div\n key={weekday.getTime()}\n className=\"cobalt-CalendarDayPicker__month__day-header\"\n >\n {format(weekday, \"iiiiii\", { locale })}\n </div>\n ))}\n </div>\n {byWeeks.current.map((week, index) => (\n <div key={index} className=\"cobalt-CalendarDayPicker__month__week\">\n {week.map((day) => {\n return (\n <CalendarDayPickerDay\n key={day.getTime()}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onLeaveDate}\n date={day}\n onSelect={onSelect}\n isToday={isSameDay(day, today)}\n disabled={isDisabled(\n day,\n firstAvailableDate,\n lastAvailableDate\n )}\n selected={areEqualDays(day, selectedDate)}\n />\n )\n })}\n </div>\n ))}\n </div>\n </div>\n )\n}\n"],"names":["CalendarDayPickerDay"],"mappings":"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"}
|
|
@@ -1,24 +1,9 @@
|
|
|
1
1
|
import React, { useMemo, useState, useEffect } from 'react';
|
|
2
2
|
import { CalendarRangePickerDay as MemoizedComponent } from './CalendarRangePickerDay.js';
|
|
3
3
|
import cx from 'classnames';
|
|
4
|
-
import { startOfMonth, endOfMonth,
|
|
4
|
+
import { startOfMonth, endOfMonth, format, isSameDay, differenceInCalendarDays } from 'date-fns';
|
|
5
|
+
import { getMonthDaysByWeeks, getWeekDays } from '../utils.js';
|
|
5
6
|
|
|
6
|
-
function daysByWeeks(monthDate) {
|
|
7
|
-
const firstDayOfMonth = startOfMonth(monthDate);
|
|
8
|
-
const firstDayOfMonthOffset = getDay(firstDayOfMonth) - 1;
|
|
9
|
-
const lastDayOfMonth = endOfMonth(monthDate);
|
|
10
|
-
const days = eachDayOfInterval({
|
|
11
|
-
start: firstDayOfMonth,
|
|
12
|
-
end: lastDayOfMonth,
|
|
13
|
-
});
|
|
14
|
-
return days.reduce((acc, day, index) => {
|
|
15
|
-
if (index === 0 || (index + firstDayOfMonthOffset) % 7 === 0) {
|
|
16
|
-
acc.push([]);
|
|
17
|
-
}
|
|
18
|
-
acc[acc.length - 1].push(day);
|
|
19
|
-
return acc;
|
|
20
|
-
}, []);
|
|
21
|
-
}
|
|
22
7
|
function isDisabled(day, firstAvailableDate, lastAvailableDate) {
|
|
23
8
|
return (day.getTime() < firstAvailableDate.getTime() ||
|
|
24
9
|
(lastAvailableDate != null && day.getTime() > lastAvailableDate.getTime()));
|
|
@@ -51,14 +36,11 @@ function isRangeExceeded(startDate, endDate, rangeLimit) {
|
|
|
51
36
|
function CalendarRangePickerMonth({ date, onSelectDate, onChangeDate, onLeaveDate, startDate, endDate, isEditingStartDate = false, isEditingEndDate = false, rangeLimit, firstAvailableDate, lastAvailableDate, locale, }) {
|
|
52
37
|
const firstDayOfMonth = useMemo(() => startOfMonth(date), []);
|
|
53
38
|
const lastDayOfMonth = useMemo(() => endOfMonth(date), []);
|
|
54
|
-
const byWeeks = useMemo(() =>
|
|
39
|
+
const byWeeks = useMemo(() => getMonthDaysByWeeks(date), []);
|
|
55
40
|
// we use a state for the selected Date to allow the onSelect event to be memoized then still triggering some logic with updated data thanks to the setter+useEffect dependency mechanism
|
|
56
41
|
const [selectedDate, setSelectedDate] = useState(null);
|
|
57
42
|
const today = new Date().setHours(0, 0, 0, 0);
|
|
58
|
-
const weekdays = useMemo(() =>
|
|
59
|
-
start: startOfWeek(today, { weekStartsOn: 1 }),
|
|
60
|
-
end: endOfWeek(today, { weekStartsOn: 1 }),
|
|
61
|
-
}), []);
|
|
43
|
+
const weekdays = useMemo(() => getWeekDays(), []);
|
|
62
44
|
const isOutOfRange = isRangeExceeded(startDate, endDate, rangeLimit);
|
|
63
45
|
const isOutOfRangeStartDate = !!isEditingStartDate && isOutOfRange;
|
|
64
46
|
const onMouseEnter = (day, disabled) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CalendarRangePickerMonth.js","sources":["../../../../src/components/Calendar/CalendarRangePicker/CalendarRangePickerMonth.tsx"],"sourcesContent":["import React, { useEffect, useMemo, useState } from \"react\"\nimport { CalendarRangePickerDay } from \"./CalendarRangePickerDay\"\nimport classNames from \"classnames\"\nimport {\n eachDayOfInterval,\n startOfMonth,\n endOfMonth,\n format,\n isSameDay,\n getDay,\n differenceInCalendarDays,\n startOfWeek,\n endOfWeek,\n} from \"date-fns\"\n\ntype Props = {\n date: Date\n startDate?: Date\n endDate?: Date\n onSelectDate: (date: Date, isOutOfRange?: boolean) => void\n onChangeDate: (date: Date, isOutOfRange: boolean, disabled: boolean) => void\n onLeaveDate?: (date: Date) => void\n isEditingStartDate?: boolean\n isEditingEndDate?: boolean\n rangeLimit?: number\n firstAvailableDate: Date\n lastAvailableDate?: Date\n locale: any\n}\n\nfunction daysByWeeks(monthDate: Date): Date[][] {\n const firstDayOfMonth = startOfMonth(monthDate)\n const firstDayOfMonthOffset = getDay(firstDayOfMonth) - 1\n const lastDayOfMonth = endOfMonth(monthDate)\n const days = eachDayOfInterval({\n start: firstDayOfMonth,\n end: lastDayOfMonth,\n })\n\n return days.reduce((acc: Date[][], day, index) => {\n if (index === 0 || (index + firstDayOfMonthOffset) % 7 === 0) {\n acc.push([])\n }\n acc[acc.length - 1].push(day)\n return acc\n }, [])\n}\n\nfunction isDisabled(\n day: Date,\n firstAvailableDate: Date,\n lastAvailableDate: Date | undefined\n) {\n return (\n day.getTime() < firstAvailableDate.getTime() ||\n (lastAvailableDate != null && day.getTime() > lastAvailableDate.getTime())\n )\n}\n\nfunction isInvalid(\n day: Date,\n startDate: Date | undefined,\n rangeLimit: number | undefined,\n isOutOfRange: boolean,\n isEditingEndDate: boolean | undefined\n) {\n return (\n rangeLimit != null &&\n isOutOfRange &&\n isEditingEndDate &&\n startDate != null &&\n differenceInCalendarDays(day, startDate) >= rangeLimit\n )\n}\n\nfunction isRange(\n startDate: Date | undefined,\n endDate: Date | undefined,\n isOutOfRangeStartDate: boolean\n) {\n return !!(startDate && endDate) && !isOutOfRangeStartDate\n}\n\nfunction isSelected(\n day: Date,\n startDate: Date | undefined,\n endDate: Date | undefined,\n isStartDay: boolean,\n isEndDay: boolean,\n isOutOfRangeStartDate: boolean\n) {\n return (\n isStartDay ||\n isEndDay ||\n (!isOutOfRangeStartDate &&\n endDate &&\n day.getTime() <= endDate.getTime() &&\n startDate &&\n day.getTime() > startDate.getTime())\n )\n}\n\nfunction isRangeExceeded(\n startDate: Date | undefined,\n endDate: Date | undefined,\n rangeLimit: number | undefined\n) {\n return (\n rangeLimit != null &&\n startDate != null &&\n endDate != null &&\n differenceInCalendarDays(endDate, startDate) >= rangeLimit\n )\n}\n\nexport function CalendarRangePickerMonth({\n date,\n onSelectDate,\n onChangeDate,\n onLeaveDate,\n startDate,\n endDate,\n isEditingStartDate = false,\n isEditingEndDate = false,\n rangeLimit,\n firstAvailableDate,\n lastAvailableDate,\n locale,\n}: Props) {\n const firstDayOfMonth = useMemo(() => startOfMonth(date), [])\n const lastDayOfMonth = useMemo(() => endOfMonth(date), [])\n const byWeeks = useMemo(() => daysByWeeks(date), [])\n\n // we use a state for the selected Date to allow the onSelect event to be memoized then still triggering some logic with updated data thanks to the setter+useEffect dependency mechanism\n const [selectedDate, setSelectedDate] = useState<Date | null>(null)\n\n const today = new Date().setHours(0, 0, 0, 0)\n\n const weekdays: Date[] = useMemo(\n () =>\n eachDayOfInterval({\n start: startOfWeek(today, { weekStartsOn: 1 }),\n end: endOfWeek(today, { weekStartsOn: 1 }),\n }),\n []\n )\n\n const isOutOfRange = isRangeExceeded(startDate, endDate, rangeLimit)\n\n const isOutOfRangeStartDate = !!isEditingStartDate && isOutOfRange\n\n const onMouseEnter = (day: Date, disabled: boolean) => {\n let isDayOutOfRange = false\n if (rangeLimit != null) {\n if (isEditingStartDate) {\n isDayOutOfRange =\n endDate != null &&\n differenceInCalendarDays(endDate, day) >= rangeLimit\n } else if (isEditingEndDate) {\n isDayOutOfRange =\n startDate != null &&\n differenceInCalendarDays(day, startDate) >= rangeLimit\n }\n }\n\n onChangeDate(day, isDayOutOfRange, disabled)\n }\n\n useEffect(() => {\n // on Date selection...\n if (selectedDate) {\n if (isEditingStartDate) {\n onSelectDate(\n selectedDate,\n isRangeExceeded(selectedDate, endDate, rangeLimit)\n )\n } else {\n onSelectDate(\n selectedDate,\n isRangeExceeded(startDate, selectedDate, rangeLimit)\n )\n }\n }\n }, [selectedDate])\n\n return (\n <div\n className={classNames(\"cobalt-CalendarRangePicker__month\", {\n \"cobalt-CalendarRangePicker__month--invalid\":\n isOutOfRange && !isEditingStartDate,\n })}\n data-month={format(date, \"yyyy-MM\")}\n >\n <div className=\"cobalt-CalendarRangePicker__month-header\">\n {format(date, \"MMMM yyyy\", { locale })}\n </div>\n <div className=\"cobalt-CalendarRangePicker__month__weeks-container\">\n <div className=\"cobalt-CalendarRangePicker__month__week-header\">\n {weekdays.map((weekday) => (\n <div\n key={weekday.getTime()}\n className=\"cobalt-CalendarRangePicker__month__day-header\"\n >\n {format(weekday, \"iiiiii\", { locale })}\n </div>\n ))}\n </div>\n {byWeeks.map((week, index) => (\n <div key={index} className=\"cobalt-CalendarRangePicker__month__week\">\n {week.map((day) => {\n const isStartDay = startDate != null && isSameDay(day, startDate)\n const isEndDay = endDate != null && isSameDay(day, endDate)\n return (\n <CalendarRangePickerDay\n key={day.getTime()}\n isEditingStartDate={!!isEditingStartDate}\n isEditingEndDate={!!isEditingEndDate}\n date={day}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onLeaveDate}\n onSelect={setSelectedDate}\n isToday={isSameDay(day, today)}\n isStartDay={isStartDay}\n isEndDay={isEndDay}\n isFirstDayOfMonth={isSameDay(day, firstDayOfMonth)}\n isLastDayOfMonth={isSameDay(day, lastDayOfMonth)}\n isRange={isRange(startDate, endDate, isOutOfRangeStartDate)}\n invalid={isInvalid(\n day,\n startDate,\n rangeLimit,\n isOutOfRange,\n isEditingEndDate\n )}\n subdued={\n (isStartDay && isEditingEndDate) ||\n (isEndDay && isEditingStartDate)\n }\n disabled={isDisabled(\n day,\n firstAvailableDate,\n lastAvailableDate\n )}\n selected={isSelected(\n day,\n startDate,\n endDate,\n isStartDay,\n isEndDay,\n isOutOfRangeStartDate\n )}\n />\n )\n })}\n </div>\n ))}\n </div>\n </div>\n )\n}\n"],"names":["classNames","CalendarRangePickerDay"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CalendarRangePickerMonth.js","sources":["../../../../src/components/Calendar/CalendarRangePicker/CalendarRangePickerMonth.tsx"],"sourcesContent":["import React, { useEffect, useMemo, useState } from \"react\"\nimport { CalendarRangePickerDay } from \"./CalendarRangePickerDay\"\nimport classNames from \"classnames\"\nimport {\n startOfMonth,\n endOfMonth,\n format,\n isSameDay,\n differenceInCalendarDays,\n} from \"date-fns\"\nimport { getMonthDaysByWeeks, getWeekDays } from \"../utils\"\n\ntype Props = {\n date: Date\n startDate?: Date\n endDate?: Date\n onSelectDate: (date: Date, isOutOfRange?: boolean) => void\n onChangeDate: (date: Date, isOutOfRange: boolean, disabled: boolean) => void\n onLeaveDate?: (date: Date) => void\n isEditingStartDate?: boolean\n isEditingEndDate?: boolean\n rangeLimit?: number\n firstAvailableDate: Date\n lastAvailableDate?: Date\n locale: any\n}\n\nfunction isDisabled(\n day: Date,\n firstAvailableDate: Date,\n lastAvailableDate: Date | undefined\n) {\n return (\n day.getTime() < firstAvailableDate.getTime() ||\n (lastAvailableDate != null && day.getTime() > lastAvailableDate.getTime())\n )\n}\n\nfunction isInvalid(\n day: Date,\n startDate: Date | undefined,\n rangeLimit: number | undefined,\n isOutOfRange: boolean,\n isEditingEndDate: boolean | undefined\n) {\n return (\n rangeLimit != null &&\n isOutOfRange &&\n isEditingEndDate &&\n startDate != null &&\n differenceInCalendarDays(day, startDate) >= rangeLimit\n )\n}\n\nfunction isRange(\n startDate: Date | undefined,\n endDate: Date | undefined,\n isOutOfRangeStartDate: boolean\n) {\n return !!(startDate && endDate) && !isOutOfRangeStartDate\n}\n\nfunction isSelected(\n day: Date,\n startDate: Date | undefined,\n endDate: Date | undefined,\n isStartDay: boolean,\n isEndDay: boolean,\n isOutOfRangeStartDate: boolean\n) {\n return (\n isStartDay ||\n isEndDay ||\n (!isOutOfRangeStartDate &&\n endDate &&\n day.getTime() <= endDate.getTime() &&\n startDate &&\n day.getTime() > startDate.getTime())\n )\n}\n\nfunction isRangeExceeded(\n startDate: Date | undefined,\n endDate: Date | undefined,\n rangeLimit: number | undefined\n) {\n return (\n rangeLimit != null &&\n startDate != null &&\n endDate != null &&\n differenceInCalendarDays(endDate, startDate) >= rangeLimit\n )\n}\n\nexport function CalendarRangePickerMonth({\n date,\n onSelectDate,\n onChangeDate,\n onLeaveDate,\n startDate,\n endDate,\n isEditingStartDate = false,\n isEditingEndDate = false,\n rangeLimit,\n firstAvailableDate,\n lastAvailableDate,\n locale,\n}: Props) {\n const firstDayOfMonth = useMemo(() => startOfMonth(date), [])\n const lastDayOfMonth = useMemo(() => endOfMonth(date), [])\n const byWeeks = useMemo(() => getMonthDaysByWeeks(date), [])\n\n // we use a state for the selected Date to allow the onSelect event to be memoized then still triggering some logic with updated data thanks to the setter+useEffect dependency mechanism\n const [selectedDate, setSelectedDate] = useState<Date | null>(null)\n\n const today = new Date().setHours(0, 0, 0, 0)\n\n const weekdays: Date[] = useMemo(() => getWeekDays(), [])\n\n const isOutOfRange = isRangeExceeded(startDate, endDate, rangeLimit)\n\n const isOutOfRangeStartDate = !!isEditingStartDate && isOutOfRange\n\n const onMouseEnter = (day: Date, disabled: boolean) => {\n let isDayOutOfRange = false\n if (rangeLimit != null) {\n if (isEditingStartDate) {\n isDayOutOfRange =\n endDate != null &&\n differenceInCalendarDays(endDate, day) >= rangeLimit\n } else if (isEditingEndDate) {\n isDayOutOfRange =\n startDate != null &&\n differenceInCalendarDays(day, startDate) >= rangeLimit\n }\n }\n\n onChangeDate(day, isDayOutOfRange, disabled)\n }\n\n useEffect(() => {\n // on Date selection...\n if (selectedDate) {\n if (isEditingStartDate) {\n onSelectDate(\n selectedDate,\n isRangeExceeded(selectedDate, endDate, rangeLimit)\n )\n } else {\n onSelectDate(\n selectedDate,\n isRangeExceeded(startDate, selectedDate, rangeLimit)\n )\n }\n }\n }, [selectedDate])\n\n return (\n <div\n className={classNames(\"cobalt-CalendarRangePicker__month\", {\n \"cobalt-CalendarRangePicker__month--invalid\":\n isOutOfRange && !isEditingStartDate,\n })}\n data-month={format(date, \"yyyy-MM\")}\n >\n <div className=\"cobalt-CalendarRangePicker__month-header\">\n {format(date, \"MMMM yyyy\", { locale })}\n </div>\n <div className=\"cobalt-CalendarRangePicker__month__weeks-container\">\n <div className=\"cobalt-CalendarRangePicker__month__week-header\">\n {weekdays.map((weekday) => (\n <div\n key={weekday.getTime()}\n className=\"cobalt-CalendarRangePicker__month__day-header\"\n >\n {format(weekday, \"iiiiii\", { locale })}\n </div>\n ))}\n </div>\n {byWeeks.map((week, index) => (\n <div key={index} className=\"cobalt-CalendarRangePicker__month__week\">\n {week.map((day) => {\n const isStartDay = startDate != null && isSameDay(day, startDate)\n const isEndDay = endDate != null && isSameDay(day, endDate)\n return (\n <CalendarRangePickerDay\n key={day.getTime()}\n isEditingStartDate={!!isEditingStartDate}\n isEditingEndDate={!!isEditingEndDate}\n date={day}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onLeaveDate}\n onSelect={setSelectedDate}\n isToday={isSameDay(day, today)}\n isStartDay={isStartDay}\n isEndDay={isEndDay}\n isFirstDayOfMonth={isSameDay(day, firstDayOfMonth)}\n isLastDayOfMonth={isSameDay(day, lastDayOfMonth)}\n isRange={isRange(startDate, endDate, isOutOfRangeStartDate)}\n invalid={isInvalid(\n day,\n startDate,\n rangeLimit,\n isOutOfRange,\n isEditingEndDate\n )}\n subdued={\n (isStartDay && isEditingEndDate) ||\n (isEndDay && isEditingStartDate)\n }\n disabled={isDisabled(\n day,\n firstAvailableDate,\n lastAvailableDate\n )}\n selected={isSelected(\n day,\n startDate,\n endDate,\n isStartDay,\n isEndDay,\n isOutOfRangeStartDate\n )}\n />\n )\n })}\n </div>\n ))}\n </div>\n </div>\n )\n}\n"],"names":["classNames","CalendarRangePickerDay"],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import setISODay from 'date-fns/setISODay';
|
|
2
|
+
import startOfMonth from 'date-fns/startOfMonth';
|
|
3
|
+
import getDay from 'date-fns/getDay';
|
|
4
|
+
import endOfMonth from 'date-fns/endOfMonth';
|
|
5
|
+
import eachDayOfInterval from 'date-fns/eachDayOfInterval';
|
|
6
|
+
|
|
7
|
+
const getWeekDays = () => {
|
|
8
|
+
const now = new Date().setHours(0, 0, 0, 0);
|
|
9
|
+
return [...Array(7).keys()].map((index) => setISODay(now, index + 1));
|
|
10
|
+
};
|
|
11
|
+
const getMonthDaysByWeeks = (monthDate) => {
|
|
12
|
+
const firstDayOfMonth = startOfMonth(monthDate);
|
|
13
|
+
const firstDayOfMonthOffset = getDay(firstDayOfMonth) - 1;
|
|
14
|
+
const lastDayOfMonth = endOfMonth(monthDate);
|
|
15
|
+
const days = eachDayOfInterval({
|
|
16
|
+
start: firstDayOfMonth,
|
|
17
|
+
end: lastDayOfMonth,
|
|
18
|
+
});
|
|
19
|
+
return days.reduce((acc, day, index) => {
|
|
20
|
+
if (index === 0 || (index + firstDayOfMonthOffset) % 7 === 0) {
|
|
21
|
+
acc.push([]);
|
|
22
|
+
}
|
|
23
|
+
acc[acc.length - 1].push(day);
|
|
24
|
+
return acc;
|
|
25
|
+
}, []);
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export { getMonthDaysByWeeks, getWeekDays };
|
|
29
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sources":["../../../src/components/Calendar/utils.ts"],"sourcesContent":["import setISODay from \"date-fns/setISODay\"\nimport startOfMonth from \"date-fns/startOfMonth\"\nimport getDay from \"date-fns/getDay\"\nimport endOfMonth from \"date-fns/endOfMonth\"\nimport eachDayOfInterval from \"date-fns/eachDayOfInterval\"\n\nexport const getWeekDays = () => {\n const now = new Date().setHours(0, 0, 0, 0)\n return [...Array(7).keys()].map((index) => setISODay(now, index + 1))\n}\n\nexport const getMonthDaysByWeeks = (monthDate: Date): Date[][] => {\n const firstDayOfMonth = startOfMonth(monthDate)\n const firstDayOfMonthOffset = getDay(firstDayOfMonth) - 1\n const lastDayOfMonth = endOfMonth(monthDate)\n const days = eachDayOfInterval({\n start: firstDayOfMonth,\n end: lastDayOfMonth,\n })\n\n return days.reduce((acc: Date[][], day, index) => {\n if (index === 0 || (index + firstDayOfMonthOffset) % 7 === 0) {\n acc.push([])\n }\n acc[acc.length - 1].push(day)\n return acc\n }, [])\n}\n"],"names":[],"mappings":";;;;;;AAMO,MAAM,WAAW,GAAG,MAAK;AAC9B,IAAA,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IAC3C,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAA;AACvE,EAAC;AAEY,MAAA,mBAAmB,GAAG,CAAC,SAAe,KAAc;AAC/D,IAAA,MAAM,eAAe,GAAG,YAAY,CAAC,SAAS,CAAC,CAAA;IAC/C,MAAM,qBAAqB,GAAG,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,CAAA;AACzD,IAAA,MAAM,cAAc,GAAG,UAAU,CAAC,SAAS,CAAC,CAAA;IAC5C,MAAM,IAAI,GAAG,iBAAiB,CAAC;AAC7B,QAAA,KAAK,EAAE,eAAe;AACtB,QAAA,GAAG,EAAE,cAAc;AACpB,KAAA,CAAC,CAAA;IAEF,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,GAAa,EAAE,GAAG,EAAE,KAAK,KAAI;AAC/C,QAAA,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,qBAAqB,IAAI,CAAC,KAAK,CAAC,EAAE;AAC5D,YAAA,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;AACb,SAAA;AACD,QAAA,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAC7B,QAAA,OAAO,GAAG,CAAA;KACX,EAAE,EAAE,CAAC,CAAA;AACR;;;;"}
|
|
@@ -12,7 +12,7 @@ import { getScrollbarWidth } from '../utils/dom.js';
|
|
|
12
12
|
// Only for the API, render nothing, we use ModalFooterInternal internally
|
|
13
13
|
const ModalFooterAPI = (_props) => null;
|
|
14
14
|
const isModalFooterAPIComponent = (component) => React.isValidElement(component) && component.type === ModalFooterAPI;
|
|
15
|
-
const _Modal = forwardRef(({ ["aria-label"]: ariaLabel, children, isOpen, close, overflowHidden = true, initialFocusRef, bodySpacing, onDismissAttempt, onHidden, onShow, title, skipAnimation = { enter: false, leave: false }, fullHeight, fullWidth, }, ref) => {
|
|
15
|
+
const _Modal = forwardRef(({ ["aria-label"]: ariaLabel, children, isOpen, className, close, overflowHidden = true, initialFocusRef, bodySpacing, onDismissAttempt, onHidden, onShow, title, skipAnimation = { enter: false, leave: false }, fullHeight, fullWidth, }, ref) => {
|
|
16
16
|
const defaultBodyStyle = useRef({
|
|
17
17
|
paddingRight: document.body.style.paddingRight,
|
|
18
18
|
overflow: document.body.style.overflow,
|
|
@@ -91,7 +91,7 @@ const _Modal = forwardRef(({ ["aria-label"]: ariaLabel, children, isOpen, close,
|
|
|
91
91
|
return;
|
|
92
92
|
};
|
|
93
93
|
return (React.createElement(React.Fragment, null, transition((styles, isOpenState) => isOpenState && (React.createElement(AnimatedDialogOverlay, { initialFocusRef: initialFocusRef, onDismiss: getDismissHandler(close), className: "cobalt-modal__overlay", style: { opacity: styles.overlayOpacity }, onTouchEnd: (e) => e.stopPropagation(), onMouseUp: (e) => e.stopPropagation(), dangerouslyBypassScrollLock: true },
|
|
94
|
-
React.createElement(AnimatedDialogContent, { className: cx("cobalt-modal", {
|
|
94
|
+
React.createElement(AnimatedDialogContent, { className: cx("cobalt-modal", className, {
|
|
95
95
|
"cobalt-modal--desktop": !isMobile,
|
|
96
96
|
"cobalt-modal--mobile": isMobile,
|
|
97
97
|
"cobalt-modal--overflowHidden": overflowHidden,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/components/Modal/index.tsx"],"sourcesContent":["import React, { forwardRef, useEffect, useRef } from \"react\"\nimport cx from \"classnames\"\nimport { DialogOverlay, DialogContent } from \"@reach/dialog\"\nimport { useTransition, animated } from \"@react-spring/web\"\n\nimport useBreakpoint from \"../../hooks/useBreakpoint\"\nimport ModalHeader from \"./ModalHeader\"\nimport ModalBody from \"./ModalBody\"\nimport ModalFooter, { ModalFooterPropsType } from \"./ModalFooter\"\nimport { getScrollbarWidth } from \"../utils/\"\n\nexport type ModalPropsType = {\n /**\n * mandatory for A11y\n */\n [\"aria-label\"]: string\n /**\n * Function called to close the modal, providing it make the modal closeable\n */\n close?: () => void\n /**\n * React.ref of the element to focus first when the modal opens\n */\n initialFocusRef?: React.RefObject<HTMLElement>\n /**\n * State to show or hide the modal/dialog\n */\n isOpen: boolean\n /**\n * Action to fire if the user try to dismiss when the modal is not closeable\n */\n onDismissAttempt?: () => void\n /**\n * Listener called when the modal has been fully hidden\n */\n onHidden?: () => void\n /**\n * Listener called when the modal begins to show\n */\n onShow?: () => void\n /**\n * Modal title\n */\n title?: string\n /**\n * Disable/Enable body paddings (enabled by default)\n */\n bodySpacing?: boolean\n /**\n * Disable/Enable hidding overflowing absolute elements (enabled by default)\n */\n overflowHidden?: boolean\n /**\n * Disable enter/leave animation (animation enabled by default)\n */\n skipAnimation?: {\n enter: boolean\n leave: boolean\n }\n /**\n * Disable modal max-width limit\n */\n fullWidth?: boolean\n /**\n * Always take the full height of the screen\n */\n fullHeight?: boolean\n /**\n * Modal body content\n */\n children: React.ReactNode\n}\n\n// Only for the API, render nothing, we use ModalFooterInternal internally\nexport const ModalFooterAPI = (_props: ModalFooterPropsType) => null\n\nexport const isModalFooterAPIComponent = (\n component: React.ReactNode\n): component is React.ReactElement<ModalFooterPropsType> =>\n React.isValidElement(component) && component.type === ModalFooterAPI\n\nconst _Modal = forwardRef<HTMLDivElement, ModalPropsType>(\n (\n {\n [\"aria-label\"]: ariaLabel,\n children,\n isOpen,\n close,\n overflowHidden = true,\n initialFocusRef,\n bodySpacing,\n onDismissAttempt,\n onHidden,\n onShow,\n title,\n skipAnimation = { enter: false, leave: false },\n fullHeight,\n fullWidth,\n }: ModalPropsType,\n ref\n ) => {\n const defaultBodyStyle = useRef({\n paddingRight: document.body.style.paddingRight,\n overflow: document.body.style.overflow,\n isRestored: false,\n })\n\n const restoreDefaultBodyStyle = () => {\n if (defaultBodyStyle.current && !defaultBodyStyle.current.isRestored) {\n const { overflow, paddingRight } = defaultBodyStyle.current\n\n document.body.style.overflow = overflow\n document.body.style.paddingRight = paddingRight\n\n defaultBodyStyle.current.isRestored = true\n }\n }\n\n useEffect(() => {\n // disable / enable body scroll\n // default reach ui solution to lock body scroll is broken with range inputs on mobile (no drag)\n // https://github.com/reach/reach-ui/issues/678\n // dangerouslyBypassScrollLock is used to disabled it\n // + fake scrollbar width to avoid visual layout shift\n if (isOpen) {\n defaultBodyStyle.current.isRestored = false\n\n document.body.style.paddingRight = `${\n getScrollbarWidth() +\n parseInt(window.getComputedStyle(document.body).paddingRight, 10)\n }px` // to avoid visual shift due to removing an existing scrollbar\n\n document.body.style.overflow = \"hidden\"\n }\n return () => {\n isOpen && restoreDefaultBodyStyle()\n }\n }, [isOpen])\n\n const { isMobile } = useBreakpoint()\n\n const transformTransitionOut = isMobile ? 500 : -20\n\n const springConfig = { tension: 300, friction: 30, clamp: true }\n\n const transition = useTransition(isOpen, {\n from: {\n overlayOpacity: 0,\n modalTransform: transformTransitionOut,\n },\n enter: {\n immediate: skipAnimation.enter,\n overlayOpacity: 1,\n modalTransform: 0,\n config: springConfig,\n },\n leave: {\n immediate: skipAnimation.leave,\n overlayOpacity: 0,\n modalTransform: transformTransitionOut,\n config: springConfig,\n },\n onStart: (_a: unknown, _b: unknown, isReady: boolean) => {\n isReady && isOpen && onShow && onShow()\n },\n onDestroyed: (isTransitioned) => {\n !isOpen && restoreDefaultBodyStyle()\n if (onHidden && isTransitioned) onHidden()\n },\n })\n\n const AnimatedDialogOverlay = animated(DialogOverlay)\n const AnimatedDialogContent = animated(DialogContent)\n\n const modalFooter = React.Children.toArray(children).find((c) =>\n isModalFooterAPIComponent(c)\n )\n\n let header: React.ReactNode = null\n if (title || close) {\n header = <ModalHeader title={title} {...(close ? { close } : {})} />\n }\n const hasHeader = !!title || !!close\n\n let footer: React.ReactNode = null\n if (React.isValidElement(modalFooter)) {\n footer = <ModalFooter {...modalFooter.props} />\n }\n\n const getDismissHandler = (onClose?: ModalPropsType[\"close\"]) => {\n if (onClose) return onClose\n if (onDismissAttempt) return onDismissAttempt\n return\n }\n\n return (\n <>\n {transition(\n (styles, isOpenState) =>\n isOpenState && (\n <AnimatedDialogOverlay\n initialFocusRef={initialFocusRef}\n onDismiss={getDismissHandler(close)}\n className=\"cobalt-modal__overlay\"\n style={{ opacity: styles.overlayOpacity }}\n onTouchEnd={(e) => e.stopPropagation()}\n onMouseUp={(e) => e.stopPropagation()}\n dangerouslyBypassScrollLock\n >\n <AnimatedDialogContent\n className={cx(\"cobalt-modal\", {\n \"cobalt-modal--desktop\": !isMobile,\n \"cobalt-modal--mobile\": isMobile,\n \"cobalt-modal--overflowHidden\": overflowHidden,\n \"cobalt-modal--fullHeight\": fullHeight,\n \"cobalt-modal--fullWidth\": fullWidth,\n })}\n aria-label={ariaLabel}\n style={{ translateY: styles.modalTransform }}\n ref={ref}\n >\n {header}\n <ModalBody\n bodySpacing={bodySpacing}\n hasHeader={hasHeader}\n hasFooter={!!footer}\n >\n {children}\n </ModalBody>\n {footer}\n </AnimatedDialogContent>\n </AnimatedDialogOverlay>\n )\n )}\n </>\n )\n }\n)\n\n_Modal.displayName = \"Modal\"\n\nconst Modal = Object.assign(_Modal, { Footer: ModalFooterAPI })\n\nexport default Modal\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/components/Modal/index.tsx"],"sourcesContent":["import React, { forwardRef, useEffect, useRef } from \"react\"\nimport cx from \"classnames\"\nimport { DialogOverlay, DialogContent } from \"@reach/dialog\"\nimport { useTransition, animated } from \"@react-spring/web\"\n\nimport useBreakpoint from \"../../hooks/useBreakpoint\"\nimport ModalHeader from \"./ModalHeader\"\nimport ModalBody from \"./ModalBody\"\nimport ModalFooter, { ModalFooterPropsType } from \"./ModalFooter\"\nimport { getScrollbarWidth } from \"../utils/\"\n\nexport type ModalPropsType = {\n /**\n * mandatory for A11y\n */\n [\"aria-label\"]: string\n /**\n * Function called to close the modal, providing it make the modal closeable\n */\n close?: () => void\n /**\n * React.ref of the element to focus first when the modal opens\n */\n initialFocusRef?: React.RefObject<HTMLElement>\n /**\n * State to show or hide the modal/dialog\n */\n isOpen: boolean\n /**\n * Custom css classes to add to the modal\n */\n className?: string\n /**\n * Action to fire if the user try to dismiss when the modal is not closeable\n */\n onDismissAttempt?: () => void\n /**\n * Listener called when the modal has been fully hidden\n */\n onHidden?: () => void\n /**\n * Listener called when the modal begins to show\n */\n onShow?: () => void\n /**\n * Modal title\n */\n title?: string\n /**\n * Disable/Enable body paddings (enabled by default)\n */\n bodySpacing?: boolean\n /**\n * Disable/Enable hidding overflowing absolute elements (enabled by default)\n */\n overflowHidden?: boolean\n /**\n * Disable enter/leave animation (animation enabled by default)\n */\n skipAnimation?: {\n enter: boolean\n leave: boolean\n }\n /**\n * Disable modal max-width limit\n */\n fullWidth?: boolean\n /**\n * Always take the full height of the screen\n */\n fullHeight?: boolean\n /**\n * Modal body content\n */\n children: React.ReactNode\n}\n\n// Only for the API, render nothing, we use ModalFooterInternal internally\nexport const ModalFooterAPI = (_props: ModalFooterPropsType) => null\n\nexport const isModalFooterAPIComponent = (\n component: React.ReactNode\n): component is React.ReactElement<ModalFooterPropsType> =>\n React.isValidElement(component) && component.type === ModalFooterAPI\n\nconst _Modal = forwardRef<HTMLDivElement, ModalPropsType>(\n (\n {\n [\"aria-label\"]: ariaLabel,\n children,\n isOpen,\n className,\n close,\n overflowHidden = true,\n initialFocusRef,\n bodySpacing,\n onDismissAttempt,\n onHidden,\n onShow,\n title,\n skipAnimation = { enter: false, leave: false },\n fullHeight,\n fullWidth,\n }: ModalPropsType,\n ref\n ) => {\n const defaultBodyStyle = useRef({\n paddingRight: document.body.style.paddingRight,\n overflow: document.body.style.overflow,\n isRestored: false,\n })\n\n const restoreDefaultBodyStyle = () => {\n if (defaultBodyStyle.current && !defaultBodyStyle.current.isRestored) {\n const { overflow, paddingRight } = defaultBodyStyle.current\n\n document.body.style.overflow = overflow\n document.body.style.paddingRight = paddingRight\n\n defaultBodyStyle.current.isRestored = true\n }\n }\n\n useEffect(() => {\n // disable / enable body scroll\n // default reach ui solution to lock body scroll is broken with range inputs on mobile (no drag)\n // https://github.com/reach/reach-ui/issues/678\n // dangerouslyBypassScrollLock is used to disabled it\n // + fake scrollbar width to avoid visual layout shift\n if (isOpen) {\n defaultBodyStyle.current.isRestored = false\n\n document.body.style.paddingRight = `${\n getScrollbarWidth() +\n parseInt(window.getComputedStyle(document.body).paddingRight, 10)\n }px` // to avoid visual shift due to removing an existing scrollbar\n\n document.body.style.overflow = \"hidden\"\n }\n return () => {\n isOpen && restoreDefaultBodyStyle()\n }\n }, [isOpen])\n\n const { isMobile } = useBreakpoint()\n\n const transformTransitionOut = isMobile ? 500 : -20\n\n const springConfig = { tension: 300, friction: 30, clamp: true }\n\n const transition = useTransition(isOpen, {\n from: {\n overlayOpacity: 0,\n modalTransform: transformTransitionOut,\n },\n enter: {\n immediate: skipAnimation.enter,\n overlayOpacity: 1,\n modalTransform: 0,\n config: springConfig,\n },\n leave: {\n immediate: skipAnimation.leave,\n overlayOpacity: 0,\n modalTransform: transformTransitionOut,\n config: springConfig,\n },\n onStart: (_a: unknown, _b: unknown, isReady: boolean) => {\n isReady && isOpen && onShow && onShow()\n },\n onDestroyed: (isTransitioned) => {\n !isOpen && restoreDefaultBodyStyle()\n if (onHidden && isTransitioned) onHidden()\n },\n })\n\n const AnimatedDialogOverlay = animated(DialogOverlay)\n const AnimatedDialogContent = animated(DialogContent)\n\n const modalFooter = React.Children.toArray(children).find((c) =>\n isModalFooterAPIComponent(c)\n )\n\n let header: React.ReactNode = null\n if (title || close) {\n header = <ModalHeader title={title} {...(close ? { close } : {})} />\n }\n const hasHeader = !!title || !!close\n\n let footer: React.ReactNode = null\n if (React.isValidElement(modalFooter)) {\n footer = <ModalFooter {...modalFooter.props} />\n }\n\n const getDismissHandler = (onClose?: ModalPropsType[\"close\"]) => {\n if (onClose) return onClose\n if (onDismissAttempt) return onDismissAttempt\n return\n }\n\n return (\n <>\n {transition(\n (styles, isOpenState) =>\n isOpenState && (\n <AnimatedDialogOverlay\n initialFocusRef={initialFocusRef}\n onDismiss={getDismissHandler(close)}\n className=\"cobalt-modal__overlay\"\n style={{ opacity: styles.overlayOpacity }}\n onTouchEnd={(e) => e.stopPropagation()}\n onMouseUp={(e) => e.stopPropagation()}\n dangerouslyBypassScrollLock\n >\n <AnimatedDialogContent\n className={cx(\"cobalt-modal\", className, {\n \"cobalt-modal--desktop\": !isMobile,\n \"cobalt-modal--mobile\": isMobile,\n \"cobalt-modal--overflowHidden\": overflowHidden,\n \"cobalt-modal--fullHeight\": fullHeight,\n \"cobalt-modal--fullWidth\": fullWidth,\n })}\n aria-label={ariaLabel}\n style={{ translateY: styles.modalTransform }}\n ref={ref}\n >\n {header}\n <ModalBody\n bodySpacing={bodySpacing}\n hasHeader={hasHeader}\n hasFooter={!!footer}\n >\n {children}\n </ModalBody>\n {footer}\n </AnimatedDialogContent>\n </AnimatedDialogOverlay>\n )\n )}\n </>\n )\n }\n)\n\n_Modal.displayName = \"Modal\"\n\nconst Modal = Object.assign(_Modal, { Footer: ModalFooterAPI })\n\nexport default Modal\n"],"names":[],"mappings":";;;;;;;;;;;AA6EA;AACa,MAAA,cAAc,GAAG,CAAC,MAA4B,KAAK,KAAI;MAEvD,yBAAyB,GAAG,CACvC,SAA0B,KAE1B,KAAK,CAAC,cAAc,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,IAAI,KAAK,eAAc;AAEtE,MAAM,MAAM,GAAG,UAAU,CACvB,CACE,EACE,CAAC,YAAY,GAAG,SAAS,EACzB,QAAQ,EACR,MAAM,EACN,SAAS,EACT,KAAK,EACL,cAAc,GAAG,IAAI,EACrB,eAAe,EACf,WAAW,EACX,gBAAgB,EAChB,QAAQ,EACR,MAAM,EACN,KAAK,EACL,aAAa,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,EAC9C,UAAU,EACV,SAAS,GACM,EACjB,GAAG,KACD;IACF,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAC9B,QAAA,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY;AAC9C,QAAA,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ;AACtC,QAAA,UAAU,EAAE,KAAK;AAClB,KAAA,CAAC,CAAA;IAEF,MAAM,uBAAuB,GAAG,MAAK;QACnC,IAAI,gBAAgB,CAAC,OAAO,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,UAAU,EAAE;YACpE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,gBAAgB,CAAC,OAAO,CAAA;YAE3D,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAA;YACvC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,YAAY,CAAA;AAE/C,YAAA,gBAAgB,CAAC,OAAO,CAAC,UAAU,GAAG,IAAI,CAAA;AAC3C,SAAA;AACH,KAAC,CAAA;IAED,SAAS,CAAC,MAAK;;;;;;AAMb,QAAA,IAAI,MAAM,EAAE;AACV,YAAA,gBAAgB,CAAC,OAAO,CAAC,UAAU,GAAG,KAAK,CAAA;YAE3C,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,CACjC,EAAA,iBAAiB,EAAE;AACnB,gBAAA,QAAQ,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,EAAE,CAClE,CAAI,EAAA,CAAA,CAAA;YAEJ,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAA;AACxC,SAAA;AACD,QAAA,OAAO,MAAK;YACV,MAAM,IAAI,uBAAuB,EAAE,CAAA;AACrC,SAAC,CAAA;AACH,KAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAA;AAEZ,IAAA,MAAM,EAAE,QAAQ,EAAE,GAAG,aAAa,EAAE,CAAA;AAEpC,IAAA,MAAM,sBAAsB,GAAG,QAAQ,GAAG,GAAG,GAAG,CAAC,EAAE,CAAA;AAEnD,IAAA,MAAM,YAAY,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAA;AAEhE,IAAA,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,EAAE;AACvC,QAAA,IAAI,EAAE;AACJ,YAAA,cAAc,EAAE,CAAC;AACjB,YAAA,cAAc,EAAE,sBAAsB;AACvC,SAAA;AACD,QAAA,KAAK,EAAE;YACL,SAAS,EAAE,aAAa,CAAC,KAAK;AAC9B,YAAA,cAAc,EAAE,CAAC;AACjB,YAAA,cAAc,EAAE,CAAC;AACjB,YAAA,MAAM,EAAE,YAAY;AACrB,SAAA;AACD,QAAA,KAAK,EAAE;YACL,SAAS,EAAE,aAAa,CAAC,KAAK;AAC9B,YAAA,cAAc,EAAE,CAAC;AACjB,YAAA,cAAc,EAAE,sBAAsB;AACtC,YAAA,MAAM,EAAE,YAAY;AACrB,SAAA;QACD,OAAO,EAAE,CAAC,EAAW,EAAE,EAAW,EAAE,OAAgB,KAAI;AACtD,YAAA,OAAO,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,EAAE,CAAA;SACxC;AACD,QAAA,WAAW,EAAE,CAAC,cAAc,KAAI;AAC9B,YAAA,CAAC,MAAM,IAAI,uBAAuB,EAAE,CAAA;YACpC,IAAI,QAAQ,IAAI,cAAc;AAAE,gBAAA,QAAQ,EAAE,CAAA;SAC3C;AACF,KAAA,CAAC,CAAA;AAEF,IAAA,MAAM,qBAAqB,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAA;AACrD,IAAA,MAAM,qBAAqB,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAA;IAErD,MAAM,WAAW,GAAG,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAC1D,yBAAyB,CAAC,CAAC,CAAC,CAC7B,CAAA;IAED,IAAI,MAAM,GAAoB,IAAI,CAAA;IAClC,IAAI,KAAK,IAAI,KAAK,EAAE;QAClB,MAAM,GAAG,oBAAC,WAAW,EAAA,EAAC,KAAK,EAAE,KAAK,EAAM,IAAC,KAAK,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,EAAA,CAAI,CAAA;AACrE,KAAA;IACD,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,CAAA;IAEpC,IAAI,MAAM,GAAoB,IAAI,CAAA;AAClC,IAAA,IAAI,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE;QACrC,MAAM,GAAG,oBAAC,WAAW,EAAA,EAAA,GAAK,WAAW,CAAC,KAAK,GAAI,CAAA;AAChD,KAAA;AAED,IAAA,MAAM,iBAAiB,GAAG,CAAC,OAAiC,KAAI;AAC9D,QAAA,IAAI,OAAO;AAAE,YAAA,OAAO,OAAO,CAAA;AAC3B,QAAA,IAAI,gBAAgB;AAAE,YAAA,OAAO,gBAAgB,CAAA;QAC7C,OAAM;AACR,KAAC,CAAA;AAED,IAAA,QACE,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,EACG,UAAU,CACT,CAAC,MAAM,EAAE,WAAW,KAClB,WAAW,KACT,KAAA,CAAA,aAAA,CAAC,qBAAqB,EAAA,EACpB,eAAe,EAAE,eAAe,EAChC,SAAS,EAAE,iBAAiB,CAAC,KAAK,CAAC,EACnC,SAAS,EAAC,uBAAuB,EACjC,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,cAAc,EAAE,EACzC,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,eAAe,EAAE,EACtC,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,eAAe,EAAE,EACrC,2BAA2B,EAAA,IAAA,EAAA;QAE3B,KAAC,CAAA,aAAA,CAAA,qBAAqB,IACpB,SAAS,EAAE,EAAE,CAAC,cAAc,EAAE,SAAS,EAAE;gBACvC,uBAAuB,EAAE,CAAC,QAAQ;AAClC,gBAAA,sBAAsB,EAAE,QAAQ;AAChC,gBAAA,8BAA8B,EAAE,cAAc;AAC9C,gBAAA,0BAA0B,EAAE,UAAU;AACtC,gBAAA,yBAAyB,EAAE,SAAS;AACrC,aAAA,CAAC,EACU,YAAA,EAAA,SAAS,EACrB,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,CAAC,cAAc,EAAE,EAC5C,GAAG,EAAE,GAAG,EAAA;YAEP,MAAM;AACP,YAAA,KAAA,CAAA,aAAA,CAAC,SAAS,EACR,EAAA,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAA,EAElB,QAAQ,CACC;AACX,YAAA,MAAM,CACe,CACF,CACzB,CACJ,CACA,EACJ;AACH,CAAC,CACF,CAAA;AAED,MAAM,CAAC,WAAW,GAAG,OAAO,CAAA;AAE5B,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE;;;;"}
|
package/index.js
CHANGED
|
@@ -13,6 +13,7 @@ export { Flag } from './components/Flag/index.js';
|
|
|
13
13
|
export { Flash } from './components/Flash/index.js';
|
|
14
14
|
export { default as Helper } from './components/Helper/index.js';
|
|
15
15
|
export { CalendarRangePicker } from './components/Calendar/CalendarRangePicker/CalendarRangePicker.js';
|
|
16
|
+
export { CalendarDayPicker } from './components/Calendar/CalendarDayPicker/CalendarDayPicker.js';
|
|
16
17
|
export { Card, CardSection } from './components/Card/index.js';
|
|
17
18
|
export { BUNDLED_ICONS, Icon, iconColors, isIconSource } from './components/Icon/index.js';
|
|
18
19
|
export { default as Modal } from './components/Modal/index.js';
|
|
@@ -45,6 +46,7 @@ export { CalendarView } from './components/Calendar/CalendarView/index.js';
|
|
|
45
46
|
export { default as Popover } from './components/Popover/index.js';
|
|
46
47
|
export { default as HorizontalList, HorizontalListPaddingBlock } from './components/HorizontalList/index.js';
|
|
47
48
|
export { default as useBreakpoint } from './hooks/useBreakpoint.js';
|
|
49
|
+
export { getMonthDaysByWeeks, getWeekDays } from './components/Calendar/utils.js';
|
|
48
50
|
export { default as AccountDetailsIcon } from './components/Icon/__generated__/AccountDetailsIcon.js';
|
|
49
51
|
export { default as AddPictureIcon } from './components/Icon/__generated__/AddPictureIcon.js';
|
|
50
52
|
export { default as AirConditioningIcon } from './components/Icon/__generated__/AirConditioningIcon.js';
|
package/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@drivy/cobalt",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.36.0",
|
|
4
4
|
"description": "Opinionated design system for Drivy's projects.",
|
|
5
5
|
"main": "src/index.js",
|
|
6
6
|
"types": "types/index.d.ts",
|
|
@@ -34,8 +34,8 @@
|
|
|
34
34
|
"date-fns": "2.30.0",
|
|
35
35
|
"lodash.throttle": "4.1.1",
|
|
36
36
|
"media-typer": "1.1.0",
|
|
37
|
-
"nanoid": "
|
|
38
|
-
"postcss": "8.4.
|
|
37
|
+
"nanoid": "5.0.1",
|
|
38
|
+
"postcss": "8.4.30",
|
|
39
39
|
"tailwindcss": "2.2.19",
|
|
40
40
|
"tippy.js": "6.3.7"
|
|
41
41
|
},
|
|
@@ -44,42 +44,42 @@
|
|
|
44
44
|
"react-dom": "^18.2.0"
|
|
45
45
|
},
|
|
46
46
|
"devDependencies": {
|
|
47
|
-
"@getaround-eu/babel-preset-app": "1.4.
|
|
48
|
-
"@getaround-eu/eslint-config": "
|
|
47
|
+
"@getaround-eu/babel-preset-app": "1.4.4",
|
|
48
|
+
"@getaround-eu/eslint-config": "3.0.0",
|
|
49
49
|
"@getaround-eu/prettier-config": "1.2.0",
|
|
50
|
-
"@getaround-eu/stylelint-config": "
|
|
50
|
+
"@getaround-eu/stylelint-config": "3.0.0",
|
|
51
51
|
"@getaround-eu/ts-config": "2.2.0",
|
|
52
52
|
"@percy/storybook": "4.3.6",
|
|
53
53
|
"@rollup/plugin-json": "6.0.0",
|
|
54
|
-
"@rushstack/eslint-patch": "1.
|
|
55
|
-
"@storybook/addon-essentials": "7.
|
|
56
|
-
"@storybook/addons": "7.
|
|
57
|
-
"@storybook/blocks": "7.
|
|
58
|
-
"@storybook/react": "7.
|
|
59
|
-
"@storybook/react-webpack5": "7.
|
|
54
|
+
"@rushstack/eslint-patch": "1.4.0",
|
|
55
|
+
"@storybook/addon-essentials": "7.4.2",
|
|
56
|
+
"@storybook/addons": "7.4.2",
|
|
57
|
+
"@storybook/blocks": "7.4.2",
|
|
58
|
+
"@storybook/react": "7.4.2",
|
|
59
|
+
"@storybook/react-webpack5": "7.4.2",
|
|
60
60
|
"@svgr/cli": "7.0.0",
|
|
61
61
|
"@testing-library/jest-dom": "5.17.0",
|
|
62
62
|
"@testing-library/react": "14.0.0",
|
|
63
63
|
"@testing-library/react-hooks": "8.0.1",
|
|
64
64
|
"@types/classnames": "2.3.1",
|
|
65
|
-
"@types/jest": "29.5.
|
|
65
|
+
"@types/jest": "29.5.5",
|
|
66
66
|
"@types/lodash.throttle": "4.1.7",
|
|
67
67
|
"@types/media-typer": "1.1.1",
|
|
68
|
-
"@types/prettier": "
|
|
68
|
+
"@types/prettier": "3.0.0",
|
|
69
69
|
"@types/react-dom": "18.2.7",
|
|
70
70
|
"autoprefixer": "10.4.15",
|
|
71
|
-
"core-js": "3.32.
|
|
71
|
+
"core-js": "3.32.2",
|
|
72
72
|
"css-loader": "6.8.1",
|
|
73
|
-
"eslint": "8.
|
|
73
|
+
"eslint": "8.49.0",
|
|
74
74
|
"eslint-plugin-storybook": "^0.6.13",
|
|
75
75
|
"file-loader": "6.2.0",
|
|
76
|
-
"jest": "29.
|
|
77
|
-
"jest-environment-jsdom": "29.
|
|
76
|
+
"jest": "29.7.0",
|
|
77
|
+
"jest-environment-jsdom": "29.7.0",
|
|
78
78
|
"nested-object-access": "^0.2.5",
|
|
79
79
|
"np": "8.0.4",
|
|
80
80
|
"postcss-flexbugs-fixes": "5.0.2",
|
|
81
81
|
"postcss-loader": "7.3.3",
|
|
82
|
-
"prettier": "
|
|
82
|
+
"prettier": "3.0.3",
|
|
83
83
|
"raw-loader": "4.0.2",
|
|
84
84
|
"react": "18.2.0",
|
|
85
85
|
"react-dom": "18.2.0",
|
|
@@ -88,22 +88,22 @@
|
|
|
88
88
|
"regenerator-runtime": "0.14.0",
|
|
89
89
|
"remark-gfm": "^3.0.1",
|
|
90
90
|
"rollup": "2.79.1",
|
|
91
|
-
"rollup-plugin-copy": "3.
|
|
91
|
+
"rollup-plugin-copy": "3.5.0",
|
|
92
92
|
"rollup-plugin-postcss": "4.0.2",
|
|
93
93
|
"rollup-plugin-svgo": "2.0.0",
|
|
94
94
|
"rollup-plugin-typescript2": "0.35.0",
|
|
95
|
-
"sass": "1.
|
|
95
|
+
"sass": "1.67.0",
|
|
96
96
|
"sass-loader": "13.3.2",
|
|
97
|
-
"sharp": "0.32.
|
|
97
|
+
"sharp": "0.32.6",
|
|
98
98
|
"sharp-cli": "4.1.1",
|
|
99
|
-
"storybook": "7.
|
|
99
|
+
"storybook": "7.4.2",
|
|
100
100
|
"style-loader": "3.3.3",
|
|
101
101
|
"stylelint": "15.10.3",
|
|
102
102
|
"svg2vectordrawable": "2.9.1",
|
|
103
103
|
"svgo": "3.0.2",
|
|
104
104
|
"ts-jest": "29.1.1",
|
|
105
105
|
"ts-node": "10.9.1",
|
|
106
|
-
"typescript": "5.
|
|
106
|
+
"typescript": "5.2.2"
|
|
107
107
|
},
|
|
108
108
|
"scripts": {
|
|
109
109
|
"build": "./scripts/build.sh",
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
@use "sass:math";
|
|
2
|
+
|
|
3
|
+
.cobalt-CalendarDayPicker {
|
|
4
|
+
$calendar-day-inner-height: 24px;
|
|
5
|
+
$calendar-day-padding: 6px;
|
|
6
|
+
$calendar-day-size: $calendar-day-inner-height + ($calendar-day-padding * 2);
|
|
7
|
+
$calendar-selected-size: $calendar-day-inner-height + 8px;
|
|
8
|
+
|
|
9
|
+
@mixin disk {
|
|
10
|
+
position: absolute;
|
|
11
|
+
z-index: -1;
|
|
12
|
+
top: math.div($calendar-day-inner-height - $calendar-selected-size, 2);
|
|
13
|
+
left: 0;
|
|
14
|
+
right: 0;
|
|
15
|
+
|
|
16
|
+
margin: auto;
|
|
17
|
+
|
|
18
|
+
height: $calendar-selected-size;
|
|
19
|
+
width: $calendar-selected-size;
|
|
20
|
+
|
|
21
|
+
content: "";
|
|
22
|
+
|
|
23
|
+
border-radius: 50%;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
position: relative;
|
|
27
|
+
|
|
28
|
+
@include breakpoint($until: sm) {
|
|
29
|
+
&__months-container {
|
|
30
|
+
flex-direction: column;
|
|
31
|
+
|
|
32
|
+
gap: spacing(sm);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
&__months-container {
|
|
37
|
+
display: flex;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
&__months-container > &__month {
|
|
41
|
+
margin: 0 8px;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
&__month {
|
|
45
|
+
@include bg-color(secondary);
|
|
46
|
+
flex: 1;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
&__month-header {
|
|
50
|
+
@include c-text-title-sm;
|
|
51
|
+
@include text-color(base);
|
|
52
|
+
margin-bottom: 12px;
|
|
53
|
+
padding: 4px;
|
|
54
|
+
|
|
55
|
+
text-align: center;
|
|
56
|
+
font-weight: 600;
|
|
57
|
+
text-transform: capitalize;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
&__month__week {
|
|
61
|
+
display: flex;
|
|
62
|
+
justify-content: flex-end;
|
|
63
|
+
width: 100%;
|
|
64
|
+
margin: 0;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
&__month__week ~ &__month__week {
|
|
68
|
+
justify-content: flex-start;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
&__month__week-header {
|
|
72
|
+
display: flex;
|
|
73
|
+
margin-bottom: 6px;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
&__month__day-header {
|
|
77
|
+
@include text-color(subdued);
|
|
78
|
+
flex: 1;
|
|
79
|
+
|
|
80
|
+
text-align: center;
|
|
81
|
+
text-transform: capitalize;
|
|
82
|
+
font-weight: 400;
|
|
83
|
+
font-size: 14px;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
&__day {
|
|
87
|
+
position: relative;
|
|
88
|
+
|
|
89
|
+
z-index: 1;
|
|
90
|
+
|
|
91
|
+
padding: $calendar-day-padding 0;
|
|
92
|
+
|
|
93
|
+
box-sizing: border-box;
|
|
94
|
+
|
|
95
|
+
flex-basis: calc(100% / 7);
|
|
96
|
+
|
|
97
|
+
min-width: $calendar-selected-size;
|
|
98
|
+
|
|
99
|
+
text-align: center;
|
|
100
|
+
|
|
101
|
+
font-size: 13px;
|
|
102
|
+
|
|
103
|
+
line-height: $calendar-day-inner-height;
|
|
104
|
+
|
|
105
|
+
cursor: pointer;
|
|
106
|
+
|
|
107
|
+
.cobalt-CalendarDayPicker__day-inner {
|
|
108
|
+
position: relative;
|
|
109
|
+
|
|
110
|
+
z-index: 1;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
&--today {
|
|
114
|
+
@include text-color(accent);
|
|
115
|
+
font-weight: 600;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
&:not(&--disabled):not(&--selected):hover
|
|
119
|
+
.cobalt-CalendarDayPicker__day-inner {
|
|
120
|
+
font-weight: 600;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
&:not(&--disabled):not(&--selected):hover
|
|
124
|
+
.cobalt-CalendarDayPicker__day-inner:after {
|
|
125
|
+
@include disk;
|
|
126
|
+
@include bg-color(accentAlt);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
&--selected .cobalt-CalendarDayPicker__day-inner:after {
|
|
130
|
+
@include disk;
|
|
131
|
+
@include bg-color(accent);
|
|
132
|
+
|
|
133
|
+
box-shadow: var(--c-background-accentAlt) 0 2px 6px 0;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
&--selected .cobalt-CalendarDayPicker__day-inner {
|
|
137
|
+
@include text-color(inversed);
|
|
138
|
+
font-weight: 600;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
&--disabled {
|
|
142
|
+
color: var(--c-navy-200);
|
|
143
|
+
|
|
144
|
+
cursor: auto;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
&__message {
|
|
149
|
+
display: flex;
|
|
150
|
+
justify-content: center;
|
|
151
|
+
align-items: center;
|
|
152
|
+
|
|
153
|
+
margin: 0;
|
|
154
|
+
|
|
155
|
+
padding: 0 spacing(sm);
|
|
156
|
+
|
|
157
|
+
height: 0;
|
|
158
|
+
|
|
159
|
+
opacity: 0;
|
|
160
|
+
|
|
161
|
+
transition:
|
|
162
|
+
height 350ms,
|
|
163
|
+
opacity 350ms;
|
|
164
|
+
|
|
165
|
+
&--show {
|
|
166
|
+
height: 40px;
|
|
167
|
+
|
|
168
|
+
opacity: 1;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
.cobalt-Hint {
|
|
172
|
+
margin: 0;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
@@ -135,7 +135,8 @@
|
|
|
135
135
|
}
|
|
136
136
|
|
|
137
137
|
&--disabled {
|
|
138
|
-
|
|
138
|
+
color: var(--c-navy-200);
|
|
139
|
+
|
|
139
140
|
cursor: auto;
|
|
140
141
|
}
|
|
141
142
|
|
|
@@ -172,7 +173,8 @@
|
|
|
172
173
|
.cobalt-CalendarRangePicker__day-inner:before {
|
|
173
174
|
@include start-end-day;
|
|
174
175
|
|
|
175
|
-
box-shadow:
|
|
176
|
+
box-shadow:
|
|
177
|
+
var(--c-background-secondary) 0 0 0 2px,
|
|
176
178
|
var(--c-background-accent) 0 0 0 4px;
|
|
177
179
|
}
|
|
178
180
|
|
|
@@ -350,7 +352,9 @@
|
|
|
350
352
|
|
|
351
353
|
opacity: 0;
|
|
352
354
|
|
|
353
|
-
transition:
|
|
355
|
+
transition:
|
|
356
|
+
height 350ms,
|
|
357
|
+
opacity 350ms;
|
|
354
358
|
|
|
355
359
|
&--show {
|
|
356
360
|
height: 40px;
|
|
@@ -42,7 +42,9 @@
|
|
|
42
42
|
|
|
43
43
|
background-color: color(white);
|
|
44
44
|
|
|
45
|
-
box-shadow:
|
|
45
|
+
box-shadow:
|
|
46
|
+
0 2px 2px 0 rgba(0, 0, 0, 0.06),
|
|
47
|
+
0 6px 6px 0 rgba(0, 0, 0, 0.04),
|
|
46
48
|
0 8px 8px 0 rgba(0, 0, 0, 0.06);
|
|
47
49
|
|
|
48
50
|
border-top-width: 0;
|
package/styles/components.scss
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
@import "./components/BulletList/index";
|
|
4
4
|
@import "./components/Buttons/index";
|
|
5
5
|
@import "./components/Calendar/CalendarRangePicker/index";
|
|
6
|
+
@import "./components/Calendar/CalendarDayPicker/index";
|
|
6
7
|
@import "./components/Callout/index";
|
|
7
8
|
@import "./components/Card/index";
|
|
8
9
|
@import "./components/Cell/index";
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { FormElementStatus } from "../../Form/form";
|
|
3
|
+
type CalendarDayPickerPropsType = {
|
|
4
|
+
numberOfMonths?: number;
|
|
5
|
+
firstMonthDate?: Date;
|
|
6
|
+
firstAvailableDate?: Date;
|
|
7
|
+
lastAvailableDate?: Date;
|
|
8
|
+
selectedDate?: Date | null;
|
|
9
|
+
hint?: {
|
|
10
|
+
status?: FormElementStatus;
|
|
11
|
+
html: string;
|
|
12
|
+
};
|
|
13
|
+
onChangeDate?: (date: Date, disabled: boolean) => boolean;
|
|
14
|
+
onLeaveDate?: (date: Date) => void;
|
|
15
|
+
onSelectDate?: (date: Date) => void;
|
|
16
|
+
locale?: Record<string, unknown>;
|
|
17
|
+
};
|
|
18
|
+
export declare function CalendarDayPicker({ firstMonthDate, numberOfMonths, hint, firstAvailableDate, lastAvailableDate, selectedDate, onChangeDate, onLeaveDate, onSelectDate, locale, }: CalendarDayPickerPropsType): React.JSX.Element;
|
|
19
|
+
export {};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
type CalendarDayPickerDayPropsType = {
|
|
3
|
+
date: Date;
|
|
4
|
+
isToday?: boolean;
|
|
5
|
+
selected?: boolean;
|
|
6
|
+
disabled?: boolean;
|
|
7
|
+
onSelect: (date: Date) => void;
|
|
8
|
+
onMouseEnter?: (date: Date, disabled: boolean) => void;
|
|
9
|
+
onMouseLeave?: (date: Date) => void;
|
|
10
|
+
};
|
|
11
|
+
declare function CalendarDayPickerDay({ date, isToday, selected, disabled, onSelect, onMouseEnter, onMouseLeave, }: CalendarDayPickerDayPropsType): React.JSX.Element;
|
|
12
|
+
declare const MemoizedComponent: React.MemoExoticComponent<typeof CalendarDayPickerDay>;
|
|
13
|
+
export { MemoizedComponent as CalendarDayPickerDay };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
type CalendarDayPickerMonthPropsType = {
|
|
3
|
+
month: Date;
|
|
4
|
+
selectedDate?: Date | null;
|
|
5
|
+
onSelectDate: (date: Date) => void;
|
|
6
|
+
onChangeDate: (date: Date, disabled: boolean) => void;
|
|
7
|
+
onLeaveDate?: (date: Date) => void;
|
|
8
|
+
firstAvailableDate: Date;
|
|
9
|
+
lastAvailableDate?: Date;
|
|
10
|
+
locale: any;
|
|
11
|
+
};
|
|
12
|
+
export declare function CalendarDayPickerMonth({ month, selectedDate, onSelectDate, onChangeDate, onLeaveDate, firstAvailableDate, lastAvailableDate, locale, }: CalendarDayPickerMonthPropsType): React.JSX.Element;
|
|
13
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { CalendarDayPicker } from "./CalendarDayPicker";
|
|
@@ -17,6 +17,10 @@ export type ModalPropsType = {
|
|
|
17
17
|
* State to show or hide the modal/dialog
|
|
18
18
|
*/
|
|
19
19
|
isOpen: boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Custom css classes to add to the modal
|
|
22
|
+
*/
|
|
23
|
+
className?: string;
|
|
20
24
|
/**
|
|
21
25
|
* Action to fire if the user try to dismiss when the modal is not closeable
|
|
22
26
|
*/
|
package/types/index.d.ts
CHANGED
|
@@ -13,6 +13,7 @@ export { Flag } from "./components/Flag";
|
|
|
13
13
|
export { Flash } from "./components/Flash";
|
|
14
14
|
export { default as Helper } from "./components/Helper";
|
|
15
15
|
export { CalendarRangePicker } from "./components/Calendar/CalendarRangePicker";
|
|
16
|
+
export { CalendarDayPicker } from "./components/Calendar/CalendarDayPicker";
|
|
16
17
|
export { Card, CardSection } from "./components/Card";
|
|
17
18
|
export * from "./components/Icon";
|
|
18
19
|
export { default as Modal } from "./components/Modal";
|
|
@@ -46,3 +47,5 @@ export { default as Popover } from "./components/Popover";
|
|
|
46
47
|
export { default as HorizontalList, HorizontalListPaddingBlock, } from "./components/HorizontalList";
|
|
47
48
|
/** HOOKS */
|
|
48
49
|
export { default as useBreakpoint } from "./hooks/useBreakpoint";
|
|
50
|
+
/** utils **/
|
|
51
|
+
export * from "./components/Calendar/utils";
|