@os-design/core 1.0.280 → 1.0.281

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (198) hide show
  1. package/dist/Avatar/utils/nameToInitials.d.ts.map +1 -1
  2. package/dist/Avatar/utils/strToHue.d.ts.map +1 -1
  3. package/dist/Button/index.d.ts.map +1 -1
  4. package/dist/Button/index.js +1 -1
  5. package/dist/Button/utils/useButtonColors.d.ts.map +1 -1
  6. package/dist/ButtonLink/index.d.ts.map +1 -1
  7. package/dist/ButtonLink/index.js +0 -5
  8. package/dist/Checkbox/index.d.ts.map +1 -1
  9. package/dist/Checkbox/index.js +1 -6
  10. package/dist/DateCalendar/Calendar.d.ts +25 -0
  11. package/dist/DateCalendar/Calendar.d.ts.map +1 -0
  12. package/dist/DateCalendar/Calendar.js +271 -0
  13. package/dist/DateCalendar/MonthPicker.d.ts +12 -0
  14. package/dist/DateCalendar/MonthPicker.d.ts.map +1 -0
  15. package/dist/DateCalendar/MonthPicker.js +159 -0
  16. package/dist/DateCalendar/index.d.ts +41 -0
  17. package/dist/DateCalendar/index.d.ts.map +1 -0
  18. package/dist/DateCalendar/index.js +77 -0
  19. package/dist/DateCalendar/locale.d.ts +6 -0
  20. package/dist/DateCalendar/locale.d.ts.map +1 -0
  21. package/dist/DateCalendar/locale.js +4 -0
  22. package/dist/DateCalendar/utils/calendarDays.d.ts +10 -0
  23. package/dist/DateCalendar/utils/calendarDays.d.ts.map +1 -0
  24. package/dist/DateCalendar/utils/calendarDays.js +46 -0
  25. package/dist/DateCalendar/utils/dayOfWeek.d.ts +8 -0
  26. package/dist/DateCalendar/utils/dayOfWeek.d.ts.map +1 -0
  27. package/dist/DateCalendar/utils/dayOfWeek.js +6 -0
  28. package/dist/DateCalendar/utils/daysInMonth.d.ts +7 -0
  29. package/dist/DateCalendar/utils/daysInMonth.d.ts.map +1 -0
  30. package/dist/DateCalendar/utils/daysInMonth.js +14 -0
  31. package/dist/DateCalendar/utils/month.d.ts +14 -0
  32. package/dist/DateCalendar/utils/month.d.ts.map +1 -0
  33. package/dist/DateCalendar/utils/month.js +24 -0
  34. package/dist/DateCalendar/utils/shift.d.ts +3 -0
  35. package/dist/DateCalendar/utils/shift.d.ts.map +1 -0
  36. package/dist/DateCalendar/utils/shift.js +12 -0
  37. package/dist/DatePicker/index.d.ts +68 -62
  38. package/dist/DatePicker/index.d.ts.map +1 -1
  39. package/dist/DatePicker/index.js +359 -265
  40. package/dist/DatePicker/utils/createTimes.d.ts +7 -0
  41. package/dist/DatePicker/utils/createTimes.d.ts.map +1 -0
  42. package/dist/DatePicker/utils/createTimes.js +15 -0
  43. package/dist/GlobalStyles/resetStyles.d.ts.map +1 -1
  44. package/dist/GlobalStyles/typographyStyles.d.ts.map +1 -1
  45. package/dist/Input/index.d.ts +15 -0
  46. package/dist/Input/index.d.ts.map +1 -1
  47. package/dist/Input/index.js +5 -5
  48. package/dist/Input/utils/getFocusableElements.d.ts.map +1 -1
  49. package/dist/InputDateUnstyled/index.d.ts +94 -0
  50. package/dist/InputDateUnstyled/index.d.ts.map +1 -0
  51. package/dist/InputDateUnstyled/index.js +406 -0
  52. package/dist/InputDateUnstyled/utils/convertHours.d.ts +4 -0
  53. package/dist/InputDateUnstyled/utils/convertHours.d.ts.map +1 -0
  54. package/dist/InputDateUnstyled/utils/convertHours.js +12 -0
  55. package/dist/InputDateUnstyled/utils/convertToFullYear.d.ts +3 -0
  56. package/dist/InputDateUnstyled/utils/convertToFullYear.d.ts.map +1 -0
  57. package/dist/InputDateUnstyled/utils/convertToFullYear.js +10 -0
  58. package/dist/InputDateUnstyled/utils/dateToString.d.ts +3 -0
  59. package/dist/InputDateUnstyled/utils/dateToString.d.ts.map +1 -0
  60. package/dist/InputDateUnstyled/utils/dateToString.js +10 -0
  61. package/dist/InputDateUnstyled/utils/daysInMonth.d.ts +7 -0
  62. package/dist/InputDateUnstyled/utils/daysInMonth.d.ts.map +1 -0
  63. package/dist/InputDateUnstyled/utils/daysInMonth.js +14 -0
  64. package/dist/InputDateUnstyled/utils/ensureCaretVisible.d.ts +3 -0
  65. package/dist/InputDateUnstyled/utils/ensureCaretVisible.d.ts.map +1 -0
  66. package/dist/InputDateUnstyled/utils/ensureCaretVisible.js +32 -0
  67. package/dist/InputDateUnstyled/utils/eraseSelectedTokens.d.ts +10 -0
  68. package/dist/InputDateUnstyled/utils/eraseSelectedTokens.d.ts.map +1 -0
  69. package/dist/InputDateUnstyled/utils/eraseSelectedTokens.js +29 -0
  70. package/dist/InputDateUnstyled/utils/replaceSubstring.d.ts +3 -0
  71. package/dist/InputDateUnstyled/utils/replaceSubstring.d.ts.map +1 -0
  72. package/dist/InputDateUnstyled/utils/replaceSubstring.js +9 -0
  73. package/dist/InputDateUnstyled/utils/same.d.ts +6 -0
  74. package/dist/InputDateUnstyled/utils/same.d.ts.map +1 -0
  75. package/dist/InputDateUnstyled/utils/same.js +3 -0
  76. package/dist/InputDateUnstyled/utils/stringToDay.d.ts +12 -0
  77. package/dist/InputDateUnstyled/utils/stringToDay.d.ts.map +1 -0
  78. package/dist/InputDateUnstyled/utils/stringToDay.js +55 -0
  79. package/dist/InputDateUnstyled/utils/stringToTime.d.ts +7 -0
  80. package/dist/InputDateUnstyled/utils/stringToTime.d.ts.map +1 -0
  81. package/dist/InputDateUnstyled/utils/stringToTime.js +40 -0
  82. package/dist/InputDateUnstyled/utils/token.d.ts +9 -0
  83. package/dist/InputDateUnstyled/utils/token.d.ts.map +1 -0
  84. package/dist/InputDateUnstyled/utils/token.js +66 -0
  85. package/dist/Link/index.d.ts.map +1 -1
  86. package/dist/Link/index.js +3 -8
  87. package/dist/LinkButton/index.d.ts.map +1 -1
  88. package/dist/LinkButton/index.js +0 -5
  89. package/dist/List/utils/bodyPointerEvents.d.ts.map +1 -1
  90. package/dist/List/utils/frameTimeout.d.ts.map +1 -1
  91. package/dist/List/utils/useRWLoadNext.d.ts.map +1 -1
  92. package/dist/LogoLink/index.d.ts.map +1 -1
  93. package/dist/LogoLink/index.js +1 -6
  94. package/dist/Menu/utils/useFocusWithArrows.d.ts.map +1 -1
  95. package/dist/Modal/index.d.ts +5 -0
  96. package/dist/Modal/index.d.ts.map +1 -1
  97. package/dist/Modal/index.js +53 -48
  98. package/dist/Navigation/utils/useScrollFlags.d.ts.map +1 -1
  99. package/dist/NavigationItem/index.d.ts.map +1 -1
  100. package/dist/NavigationItem/index.js +1 -6
  101. package/dist/Popover/utils/usePopoverPosition.d.ts.map +1 -1
  102. package/dist/ScrollButton/utils/useContainerPosition.d.ts.map +1 -1
  103. package/dist/ScrollButton/utils/useVisibility.d.ts.map +1 -1
  104. package/dist/Select/index.d.ts.map +1 -1
  105. package/dist/Select/index.js +2 -3
  106. package/dist/Switch/index.d.ts.map +1 -1
  107. package/dist/Switch/index.js +1 -7
  108. package/dist/TagLink/index.d.ts.map +1 -1
  109. package/dist/TagLink/index.js +1 -6
  110. package/dist/TimeGrid/index.d.ts +63 -0
  111. package/dist/TimeGrid/index.d.ts.map +1 -0
  112. package/dist/TimeGrid/index.js +111 -0
  113. package/dist/TimeGrid/utils/convertHours.d.ts +4 -0
  114. package/dist/TimeGrid/utils/convertHours.d.ts.map +1 -0
  115. package/dist/TimeGrid/utils/convertHours.js +12 -0
  116. package/dist/TimeGrid/utils/createTimes.d.ts +7 -0
  117. package/dist/TimeGrid/utils/createTimes.d.ts.map +1 -0
  118. package/dist/TimeGrid/utils/createTimes.js +15 -0
  119. package/dist/TimeGrid/utils/timeToString.d.ts +4 -0
  120. package/dist/TimeGrid/utils/timeToString.d.ts.map +1 -0
  121. package/dist/TimeGrid/utils/timeToString.js +12 -0
  122. package/dist/TimeGridSkeleton/index.d.ts +18 -0
  123. package/dist/TimeGridSkeleton/index.d.ts.map +1 -0
  124. package/dist/TimeGridSkeleton/index.js +33 -0
  125. package/dist/TimeList/index.d.ts +45 -0
  126. package/dist/TimeList/index.d.ts.map +1 -0
  127. package/dist/TimeList/index.js +80 -0
  128. package/dist/TimeList/utils/convertHours.d.ts +4 -0
  129. package/dist/TimeList/utils/convertHours.d.ts.map +1 -0
  130. package/dist/TimeList/utils/convertHours.js +12 -0
  131. package/dist/TimeList/utils/createTimes.d.ts +7 -0
  132. package/dist/TimeList/utils/createTimes.d.ts.map +1 -0
  133. package/dist/TimeList/utils/createTimes.js +15 -0
  134. package/dist/TimeList/utils/timeToString.d.ts +4 -0
  135. package/dist/TimeList/utils/timeToString.d.ts.map +1 -0
  136. package/dist/TimeList/utils/timeToString.js +12 -0
  137. package/dist/TimeListSkeleton/index.d.ts +13 -0
  138. package/dist/TimeListSkeleton/index.d.ts.map +1 -0
  139. package/dist/TimeListSkeleton/index.js +30 -0
  140. package/dist/index.d.ts +12 -0
  141. package/dist/index.d.ts.map +1 -1
  142. package/dist/index.js +12 -0
  143. package/dist/message/styles.d.ts.map +1 -1
  144. package/package.json +8 -8
  145. package/src/Button/index.tsx +1 -1
  146. package/src/ButtonLink/index.tsx +0 -5
  147. package/src/Checkbox/index.tsx +1 -6
  148. package/src/DateCalendar/Calendar.tsx +400 -0
  149. package/src/DateCalendar/MonthPicker.tsx +212 -0
  150. package/src/DateCalendar/index.tsx +135 -0
  151. package/src/DateCalendar/locale.ts +22 -0
  152. package/src/DateCalendar/utils/calendarDays.ts +61 -0
  153. package/src/DateCalendar/utils/dayOfWeek.ts +14 -0
  154. package/src/DateCalendar/utils/daysInMonth.ts +22 -0
  155. package/src/DateCalendar/utils/month.ts +30 -0
  156. package/src/DateCalendar/utils/shift.ts +14 -0
  157. package/src/DatePicker/index.tsx +506 -417
  158. package/src/DatePicker/utils/createTimes.ts +20 -0
  159. package/src/Input/index.tsx +11 -8
  160. package/src/InputDateUnstyled/index.tsx +533 -0
  161. package/src/InputDateUnstyled/utils/convertHours.ts +15 -0
  162. package/src/InputDateUnstyled/utils/convertToFullYear.ts +11 -0
  163. package/src/InputDateUnstyled/utils/dateToString.ts +21 -0
  164. package/src/InputDateUnstyled/utils/daysInMonth.ts +22 -0
  165. package/src/InputDateUnstyled/utils/ensureCaretVisible.ts +37 -0
  166. package/src/InputDateUnstyled/utils/eraseSelectedTokens.ts +38 -0
  167. package/src/InputDateUnstyled/utils/replaceSubstring.ts +10 -0
  168. package/src/InputDateUnstyled/utils/same.ts +15 -0
  169. package/src/InputDateUnstyled/utils/stringToDay.ts +69 -0
  170. package/src/InputDateUnstyled/utils/stringToTime.ts +48 -0
  171. package/src/InputDateUnstyled/utils/token.ts +102 -0
  172. package/src/Link/index.tsx +5 -25
  173. package/src/LinkButton/index.tsx +2 -15
  174. package/src/LogoLink/index.tsx +2 -6
  175. package/src/Modal/index.tsx +71 -60
  176. package/src/NavigationItem/index.tsx +2 -16
  177. package/src/Select/index.tsx +2 -3
  178. package/src/Switch/index.tsx +1 -11
  179. package/src/TagLink/index.tsx +3 -11
  180. package/src/TimeGrid/index.tsx +189 -0
  181. package/src/TimeGrid/utils/convertHours.ts +15 -0
  182. package/src/TimeGrid/utils/createTimes.ts +20 -0
  183. package/src/TimeGrid/utils/timeToString.ts +17 -0
  184. package/src/TimeGridSkeleton/index.tsx +50 -0
  185. package/src/TimeList/index.tsx +135 -0
  186. package/src/TimeList/utils/convertHours.ts +15 -0
  187. package/src/TimeList/utils/createTimes.ts +20 -0
  188. package/src/TimeList/utils/timeToString.ts +17 -0
  189. package/src/TimeListSkeleton/index.tsx +44 -0
  190. package/src/index.ts +12 -0
  191. package/dist/DatePicker/DatePickerCalendar.d.ts +0 -11
  192. package/dist/DatePicker/DatePickerCalendar.d.ts.map +0 -1
  193. package/dist/DatePicker/DatePickerCalendar.js +0 -178
  194. package/dist/TimePicker/index.d.ts +0 -29
  195. package/dist/TimePicker/index.d.ts.map +0 -1
  196. package/dist/TimePicker/index.js +0 -100
  197. package/src/DatePicker/DatePickerCalendar.tsx +0 -230
  198. package/src/TimePicker/index.tsx +0 -144
@@ -1,178 +0,0 @@
1
- import styled from '@emotion/styled';
2
- import { getAccessibilityDateLabel, useDatePickerCalendar } from '@os-design/date-picker-utils';
3
- import { Left, Right } from '@os-design/icons';
4
- import { ellipsisStyles, resetFocusStyles, transitionStyles } from '@os-design/styles';
5
- import { clr } from '@os-design/theming';
6
- import React, { useCallback, useEffect, useRef } from 'react';
7
- import Button from '../Button/index.js';
8
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
9
- const MonthContainer = styled.div`
10
- display: flex;
11
- align-items: center;
12
- margin-bottom: 0.5em;
13
- `;
14
- const Month = styled.div`
15
- flex-grow: 1;
16
- font-weight: 500;
17
- text-align: center;
18
- padding: 0 0.4em;
19
- ${ellipsisStyles};
20
- `;
21
- const Calendar = styled.div`
22
- display: grid;
23
- grid-template-columns: repeat(7, ${p => p.theme.datePickerCellSize}em);
24
- grid-auto-rows: ${p => p.theme.datePickerCellSize}em;
25
- justify-content: space-between;
26
- overflow-x: auto;
27
- `;
28
- const DayOfWeek = styled.div`
29
- justify-self: center;
30
- align-self: center;
31
- color: ${p => clr(p.theme.datePickerDayOfWeekColorText)};
32
- font-size: ${p => p.theme.sizes.small}em;
33
- `;
34
- const Day = styled.div`
35
- ${resetFocusStyles};
36
- justify-self: center;
37
- align-self: center;
38
-
39
- width: ${p => p.theme.datePickerDaySize}em;
40
- height: ${p => p.theme.datePickerDaySize}em;
41
-
42
- display: flex;
43
- justify-content: center;
44
- align-items: center;
45
-
46
- border-radius: ${p => p.theme.borderRadius}em;
47
- cursor: pointer;
48
-
49
- @media (hover: hover) {
50
- &:hover,
51
- &:focus {
52
- background-color: ${p => clr(p.theme.datePickerDayColorBgHover)};
53
- color: ${p => clr(p.theme.datePickerDayColorTextHover)};
54
- }
55
- }
56
-
57
- ${transitionStyles('background-color', 'color')};
58
- `;
59
- const DayAnotherMonth = styled(Day)`
60
- color: ${p => clr(p.theme.datePickerDayAnotherMonthColorText)};
61
- `;
62
- const Today = styled(Day)`
63
- background-color: ${p => clr(p.theme.datePickerTodayColorBg)};
64
- color: ${p => clr(p.theme.datePickerTodayColorText)};
65
- border: 1px solid ${p => clr(p.theme.datePickerTodayColorBorder)};
66
- box-sizing: border-box;
67
- `;
68
- const SelectedDay = styled(Day)`
69
- background-color: ${p => clr(p.theme.datePickerSelectedDayColorBg)};
70
- color: ${p => clr(p.theme.datePickerSelectedDayColorText)};
71
- `;
72
- const DayInRange = styled(Day)`
73
- background-color: ${p => clr([...p.theme.colorText.slice(0, 3), (p.theme.colorText[3] || 1) * 0.05])};
74
- `;
75
- const firstDayOfWeekIndexesMap = {
76
- monday: [6, 0, 1, 2, 3, 4, 5],
77
- saturday: [1, 2, 3, 4, 5, 6, 0],
78
- sunday: [0, 1, 2, 3, 4, 5, 6]
79
- };
80
- const DatePickerCalendar = ({
81
- firstDayOfWeek,
82
- locale,
83
- value,
84
- onSelect = () => {}
85
- }) => {
86
- const valueRef = useRef(value);
87
- useEffect(() => {
88
- valueRef.current = value;
89
- }, [value]);
90
- const onSelectRef = useRef(onSelect);
91
- useEffect(() => {
92
- onSelectRef.current = onSelect;
93
- }, [onSelect]);
94
- const {
95
- selectedMonth,
96
- updateMonth,
97
- days
98
- } = useDatePickerCalendar({
99
- value,
100
- firstDayOfWeek
101
- });
102
- const getDayProps = useCallback(date => ({
103
- tabIndex: 0,
104
- role: 'button',
105
- 'aria-label': getAccessibilityDateLabel(date, locale),
106
- onClick: () => {
107
- onSelectRef.current(date);
108
- },
109
- onKeyDown: e => {
110
- if (['Enter', ' '].includes(e.key)) {
111
- onSelectRef.current(date);
112
- e.preventDefault();
113
- }
114
- },
115
- onMouseDown: e => e.preventDefault()
116
- }), [locale]);
117
- return /*#__PURE__*/_jsxs(_Fragment, {
118
- children: [/*#__PURE__*/_jsxs(MonthContainer, {
119
- children: [/*#__PURE__*/_jsx(Button, {
120
- type: "ghost",
121
- wide: "never",
122
- size: "small",
123
- onClick: () => updateMonth(-1),
124
- "aria-label": locale.prevMonthLabel,
125
- children: /*#__PURE__*/_jsx(Left, {})
126
- }), /*#__PURE__*/_jsxs(Month, {
127
- children: [locale.months[selectedMonth.month], " ", selectedMonth.year]
128
- }), /*#__PURE__*/_jsx(Button, {
129
- type: "ghost",
130
- wide: "never",
131
- size: "small",
132
- onClick: () => updateMonth(1),
133
- "aria-label": locale.nextMonthLabel,
134
- children: /*#__PURE__*/_jsx(Right, {})
135
- })]
136
- }), /*#__PURE__*/_jsxs(Calendar, {
137
- children: [Array(7).fill(0).map((_, index) => {
138
- const item = firstDayOfWeekIndexesMap[firstDayOfWeek][index];
139
- return /*#__PURE__*/_jsx(DayOfWeek, {
140
- children: item
141
- }, item);
142
- }), days.map(({
143
- type,
144
- date
145
- }) => {
146
- if (type === 'dayAnotherMonth') {
147
- return /*#__PURE__*/_jsx(DayAnotherMonth, {
148
- ...getDayProps(date),
149
- children: date.getDate()
150
- }, date.toISOString());
151
- }
152
- if (type === 'selectedDay') {
153
- return /*#__PURE__*/_jsx(SelectedDay, {
154
- ...getDayProps(date),
155
- children: date.getDate()
156
- }, date.toISOString());
157
- }
158
- if (type === 'dayInRange') {
159
- return /*#__PURE__*/_jsx(DayInRange, {
160
- ...getDayProps(date),
161
- children: date.getDate()
162
- }, date.toISOString());
163
- }
164
- if (type === 'today') {
165
- return /*#__PURE__*/_jsx(Today, {
166
- ...getDayProps(date),
167
- children: date.getDate()
168
- }, date.toISOString());
169
- }
170
- return /*#__PURE__*/_jsx(Day, {
171
- ...getDayProps(date),
172
- children: date.getDate()
173
- }, date.toISOString());
174
- })]
175
- })]
176
- });
177
- };
178
- export default DatePickerCalendar;
@@ -1,29 +0,0 @@
1
- import { type InputProps } from '../Input/index.js';
2
- export interface TimePickerProps extends Omit<InputProps, 'type' | 'value' | 'defaultValue' | 'onChange'> {
3
- /**
4
- * The time notation.
5
- * @default 12-hour
6
- */
7
- notation?: '12-hour' | '24-hour';
8
- /**
9
- * The selected date.
10
- * @default undefined
11
- */
12
- value?: Date;
13
- /**
14
- * The default value.
15
- * @default undefined
16
- */
17
- defaultValue?: Date;
18
- /**
19
- * The change event handler.
20
- * @default undefined
21
- */
22
- onChange?: (value: Date) => void;
23
- }
24
- /**
25
- * The component to choose a time.
26
- */
27
- declare const TimePicker: import("react").ForwardRefExoticComponent<TimePickerProps & import("react").RefAttributes<HTMLInputElement>>;
28
- export default TimePicker;
29
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/TimePicker/index.tsx"],"names":[],"mappings":"AAIA,OAAc,EAAE,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE3D,MAAM,WAAW,eACf,SAAQ,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,GAAG,cAAc,GAAG,UAAU,CAAC;IACxE;;;OAGG;IACH,QAAQ,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IACjC;;;OAGG;IACH,KAAK,CAAC,EAAE,IAAI,CAAC;IACb;;;OAGG;IACH,YAAY,CAAC,EAAE,IAAI,CAAC;IACpB;;;OAGG;IACH,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,KAAK,IAAI,CAAC;CAClC;AAOD;;GAEG;AACH,QAAA,MAAM,UAAU,8GAqGf,CAAC;AAIF,eAAe,UAAU,CAAC"}
@@ -1,100 +0,0 @@
1
- import { useTime } from '@os-design/time-picker-utils';
2
- import { useForwardedRef, useForwardedState } from '@os-design/utils';
3
- import { forwardRef, useCallback, useEffect, useMemo, useState } from 'react';
4
- import Button from '../Button/index.js';
5
- import Input from '../Input/index.js';
6
- import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
7
- /**
8
- * The component to choose a time.
9
- */
10
- const TimePicker = /*#__PURE__*/forwardRef(({
11
- notation = '12-hour',
12
- value,
13
- defaultValue,
14
- onChange = () => {},
15
- onSelect = () => {},
16
- onKeyDown = () => {},
17
- disabled = false,
18
- right,
19
- ...rest
20
- }, ref) => {
21
- const [inputRef, mergedInputRef] = useForwardedRef(ref);
22
- const [forwardedValue, setForwardedValue] = useForwardedState({
23
- value,
24
- defaultValue,
25
- onChange
26
- });
27
- const [selection, setSelection] = useState({
28
- start: 0,
29
- end: 0
30
- });
31
- const {
32
- time,
33
- isPm,
34
- changePeriod,
35
- keyHandler
36
- } = useTime({
37
- notation,
38
- selection,
39
- setSelection: nextSelection => {
40
- if (inputRef.current) {
41
- inputRef.current.setSelectionRange(nextSelection.start, nextSelection.end);
42
- }
43
- setSelection(nextSelection);
44
- },
45
- forwardedValue,
46
- setForwardedValue
47
- });
48
- const rightComponent = useMemo(() => {
49
- if (notation !== '12-hour' && !right) return null;
50
- return /*#__PURE__*/_jsxs(_Fragment, {
51
- children: [notation === '12-hour' && /*#__PURE__*/_jsx(Button, {
52
- type: "ghost",
53
- wide: "never",
54
- size: "small",
55
- disabled: disabled,
56
- onClick: changePeriod,
57
- children: isPm ? 'PM' : 'AM'
58
- }), right]
59
- });
60
- }, [changePeriod, disabled, isPm, notation, right]);
61
- const keyDownHandler = useCallback(e => {
62
- keyHandler(e.key, e.metaKey);
63
- onKeyDown(e);
64
- e.preventDefault();
65
- }, [keyHandler, onKeyDown]);
66
-
67
- // Update the selection
68
- useEffect(() => {
69
- if (!inputRef.current) return;
70
- inputRef.current.setSelectionRange(selection.start, selection.end);
71
- }, [inputRef, selection]);
72
- const selectHandler = useCallback(e => {
73
- // Update the selection state.
74
- const {
75
- selectionStart,
76
- selectionEnd
77
- } = e.currentTarget;
78
- setSelection({
79
- start: selectionStart || 0,
80
- end: selectionEnd || 0
81
- });
82
- onSelect(e);
83
- }, [onSelect]);
84
- return /*#__PURE__*/_jsx(Input, {
85
- type: "text",
86
- inputMode: "decimal",
87
- role: "spinbutton",
88
- minLength: 5,
89
- maxLength: 5,
90
- disabled: disabled,
91
- value: time,
92
- right: rightComponent,
93
- onSelect: selectHandler,
94
- onKeyDown: keyDownHandler,
95
- ...rest,
96
- ref: mergedInputRef
97
- });
98
- });
99
- TimePicker.displayName = 'TimePicker';
100
- export default TimePicker;
@@ -1,230 +0,0 @@
1
- import styled from '@emotion/styled';
2
- import {
3
- type DatePickerLocale,
4
- getAccessibilityDateLabel,
5
- useDatePickerCalendar,
6
- } from '@os-design/date-picker-utils';
7
- import { Left, Right } from '@os-design/icons';
8
- import {
9
- ellipsisStyles,
10
- resetFocusStyles,
11
- transitionStyles,
12
- } from '@os-design/styles';
13
- import { type Color, clr } from '@os-design/theming';
14
- import React, {
15
- type HTMLAttributes,
16
- useCallback,
17
- useEffect,
18
- useRef,
19
- } from 'react';
20
- import Button from '../Button/index.js';
21
-
22
- interface DatePickerCalendarProps {
23
- firstDayOfWeek: 'monday' | 'saturday' | 'sunday';
24
- locale: DatePickerLocale;
25
- value?: Date | [Date, Date] | null;
26
- onSelect?: (value: Date) => void;
27
- }
28
-
29
- const MonthContainer = styled.div`
30
- display: flex;
31
- align-items: center;
32
- margin-bottom: 0.5em;
33
- `;
34
-
35
- const Month = styled.div`
36
- flex-grow: 1;
37
- font-weight: 500;
38
- text-align: center;
39
- padding: 0 0.4em;
40
- ${ellipsisStyles};
41
- `;
42
-
43
- const Calendar = styled.div`
44
- display: grid;
45
- grid-template-columns: repeat(7, ${(p) => p.theme.datePickerCellSize}em);
46
- grid-auto-rows: ${(p) => p.theme.datePickerCellSize}em;
47
- justify-content: space-between;
48
- overflow-x: auto;
49
- `;
50
-
51
- const DayOfWeek = styled.div`
52
- justify-self: center;
53
- align-self: center;
54
- color: ${(p) => clr(p.theme.datePickerDayOfWeekColorText)};
55
- font-size: ${(p) => p.theme.sizes.small}em;
56
- `;
57
-
58
- const Day = styled.div`
59
- ${resetFocusStyles};
60
- justify-self: center;
61
- align-self: center;
62
-
63
- width: ${(p) => p.theme.datePickerDaySize}em;
64
- height: ${(p) => p.theme.datePickerDaySize}em;
65
-
66
- display: flex;
67
- justify-content: center;
68
- align-items: center;
69
-
70
- border-radius: ${(p) => p.theme.borderRadius}em;
71
- cursor: pointer;
72
-
73
- @media (hover: hover) {
74
- &:hover,
75
- &:focus {
76
- background-color: ${(p) => clr(p.theme.datePickerDayColorBgHover)};
77
- color: ${(p) => clr(p.theme.datePickerDayColorTextHover)};
78
- }
79
- }
80
-
81
- ${transitionStyles('background-color', 'color')};
82
- `;
83
-
84
- const DayAnotherMonth = styled(Day)`
85
- color: ${(p) => clr(p.theme.datePickerDayAnotherMonthColorText)};
86
- `;
87
-
88
- const Today = styled(Day)`
89
- background-color: ${(p) => clr(p.theme.datePickerTodayColorBg)};
90
- color: ${(p) => clr(p.theme.datePickerTodayColorText)};
91
- border: 1px solid ${(p) => clr(p.theme.datePickerTodayColorBorder)};
92
- box-sizing: border-box;
93
- `;
94
-
95
- const SelectedDay = styled(Day)`
96
- background-color: ${(p) => clr(p.theme.datePickerSelectedDayColorBg)};
97
- color: ${(p) => clr(p.theme.datePickerSelectedDayColorText)};
98
- `;
99
-
100
- const DayInRange = styled(Day)`
101
- background-color: ${(p) =>
102
- clr([
103
- ...p.theme.colorText.slice(0, 3),
104
- (p.theme.colorText[3] || 1) * 0.05,
105
- ] as Color)};
106
- `;
107
-
108
- const firstDayOfWeekIndexesMap = {
109
- monday: [6, 0, 1, 2, 3, 4, 5],
110
- saturday: [1, 2, 3, 4, 5, 6, 0],
111
- sunday: [0, 1, 2, 3, 4, 5, 6],
112
- };
113
-
114
- const DatePickerCalendar: React.FC<DatePickerCalendarProps> = ({
115
- firstDayOfWeek,
116
- locale,
117
- value,
118
- onSelect = () => {},
119
- }) => {
120
- const valueRef = useRef(value);
121
- useEffect(() => {
122
- valueRef.current = value;
123
- }, [value]);
124
-
125
- const onSelectRef = useRef(onSelect);
126
- useEffect(() => {
127
- onSelectRef.current = onSelect;
128
- }, [onSelect]);
129
-
130
- const { selectedMonth, updateMonth, days } = useDatePickerCalendar({
131
- value,
132
- firstDayOfWeek,
133
- });
134
-
135
- const getDayProps = useCallback<
136
- (date: Date) => HTMLAttributes<HTMLDivElement>
137
- >(
138
- (date: Date) => ({
139
- tabIndex: 0,
140
- role: 'button',
141
- 'aria-label': getAccessibilityDateLabel(date, locale),
142
- onClick: () => {
143
- onSelectRef.current(date);
144
- },
145
- onKeyDown: (e) => {
146
- if (['Enter', ' '].includes(e.key)) {
147
- onSelectRef.current(date);
148
- e.preventDefault();
149
- }
150
- },
151
- onMouseDown: (e) => e.preventDefault(),
152
- }),
153
- [locale]
154
- );
155
-
156
- return (
157
- <>
158
- <MonthContainer>
159
- <Button
160
- type='ghost'
161
- wide='never'
162
- size='small'
163
- onClick={() => updateMonth(-1)}
164
- aria-label={locale.prevMonthLabel}
165
- >
166
- <Left />
167
- </Button>
168
- <Month>
169
- {locale.months[selectedMonth.month]} {selectedMonth.year}
170
- </Month>
171
- <Button
172
- type='ghost'
173
- wide='never'
174
- size='small'
175
- onClick={() => updateMonth(1)}
176
- aria-label={locale.nextMonthLabel}
177
- >
178
- <Right />
179
- </Button>
180
- </MonthContainer>
181
-
182
- <Calendar>
183
- {Array(7)
184
- .fill(0)
185
- .map((_, index) => {
186
- const item = firstDayOfWeekIndexesMap[firstDayOfWeek][index];
187
- return <DayOfWeek key={item}>{item}</DayOfWeek>;
188
- })}
189
-
190
- {days.map(({ type, date }) => {
191
- if (type === 'dayAnotherMonth') {
192
- return (
193
- <DayAnotherMonth key={date.toISOString()} {...getDayProps(date)}>
194
- {date.getDate()}
195
- </DayAnotherMonth>
196
- );
197
- }
198
- if (type === 'selectedDay') {
199
- return (
200
- <SelectedDay key={date.toISOString()} {...getDayProps(date)}>
201
- {date.getDate()}
202
- </SelectedDay>
203
- );
204
- }
205
- if (type === 'dayInRange') {
206
- return (
207
- <DayInRange key={date.toISOString()} {...getDayProps(date)}>
208
- {date.getDate()}
209
- </DayInRange>
210
- );
211
- }
212
- if (type === 'today') {
213
- return (
214
- <Today key={date.toISOString()} {...getDayProps(date)}>
215
- {date.getDate()}
216
- </Today>
217
- );
218
- }
219
- return (
220
- <Day key={date.toISOString()} {...getDayProps(date)}>
221
- {date.getDate()}
222
- </Day>
223
- );
224
- })}
225
- </Calendar>
226
- </>
227
- );
228
- };
229
-
230
- export default DatePickerCalendar;
@@ -1,144 +0,0 @@
1
- import { useTime } from '@os-design/time-picker-utils';
2
- import { useForwardedRef, useForwardedState } from '@os-design/utils';
3
- import { forwardRef, useCallback, useEffect, useMemo, useState } from 'react';
4
- import Button from '../Button/index.js';
5
- import Input, { type InputProps } from '../Input/index.js';
6
-
7
- export interface TimePickerProps
8
- extends Omit<InputProps, 'type' | 'value' | 'defaultValue' | 'onChange'> {
9
- /**
10
- * The time notation.
11
- * @default 12-hour
12
- */
13
- notation?: '12-hour' | '24-hour';
14
- /**
15
- * The selected date.
16
- * @default undefined
17
- */
18
- value?: Date;
19
- /**
20
- * The default value.
21
- * @default undefined
22
- */
23
- defaultValue?: Date;
24
- /**
25
- * The change event handler.
26
- * @default undefined
27
- */
28
- onChange?: (value: Date) => void;
29
- }
30
-
31
- interface Selection {
32
- start: number;
33
- end: number;
34
- }
35
-
36
- /**
37
- * The component to choose a time.
38
- */
39
- const TimePicker = forwardRef<HTMLInputElement, TimePickerProps>(
40
- (
41
- {
42
- notation = '12-hour',
43
- value,
44
- defaultValue,
45
- onChange = () => {},
46
- onSelect = () => {},
47
- onKeyDown = () => {},
48
- disabled = false,
49
- right,
50
- ...rest
51
- },
52
- ref
53
- ) => {
54
- const [inputRef, mergedInputRef] = useForwardedRef(ref);
55
- const [forwardedValue, setForwardedValue] = useForwardedState({
56
- value,
57
- defaultValue,
58
- onChange,
59
- });
60
- const [selection, setSelection] = useState<Selection>({ start: 0, end: 0 });
61
-
62
- const { time, isPm, changePeriod, keyHandler } = useTime({
63
- notation,
64
- selection,
65
- setSelection: (nextSelection) => {
66
- if (inputRef.current) {
67
- inputRef.current.setSelectionRange(
68
- nextSelection.start,
69
- nextSelection.end
70
- );
71
- }
72
- setSelection(nextSelection);
73
- },
74
- forwardedValue,
75
- setForwardedValue,
76
- });
77
-
78
- const rightComponent = useMemo(() => {
79
- if (notation !== '12-hour' && !right) return null;
80
- return (
81
- <>
82
- {notation === '12-hour' && (
83
- <Button
84
- type='ghost'
85
- wide='never'
86
- size='small'
87
- disabled={disabled}
88
- onClick={changePeriod}
89
- >
90
- {isPm ? 'PM' : 'AM'}
91
- </Button>
92
- )}
93
- {right}
94
- </>
95
- );
96
- }, [changePeriod, disabled, isPm, notation, right]);
97
-
98
- const keyDownHandler = useCallback(
99
- (e) => {
100
- keyHandler(e.key, e.metaKey);
101
- onKeyDown(e);
102
- e.preventDefault();
103
- },
104
- [keyHandler, onKeyDown]
105
- );
106
-
107
- // Update the selection
108
- useEffect(() => {
109
- if (!inputRef.current) return;
110
- inputRef.current.setSelectionRange(selection.start, selection.end);
111
- }, [inputRef, selection]);
112
-
113
- const selectHandler = useCallback(
114
- (e) => {
115
- // Update the selection state.
116
- const { selectionStart, selectionEnd } = e.currentTarget;
117
- setSelection({ start: selectionStart || 0, end: selectionEnd || 0 });
118
- onSelect(e);
119
- },
120
- [onSelect]
121
- );
122
-
123
- return (
124
- <Input
125
- type='text'
126
- inputMode='decimal'
127
- role='spinbutton'
128
- minLength={5}
129
- maxLength={5}
130
- disabled={disabled}
131
- value={time}
132
- right={rightComponent}
133
- onSelect={selectHandler}
134
- onKeyDown={keyDownHandler}
135
- {...rest}
136
- ref={mergedInputRef}
137
- />
138
- );
139
- }
140
- );
141
-
142
- TimePicker.displayName = 'TimePicker';
143
-
144
- export default TimePicker;