@basic-ui/core 0.0.51 → 0.0.53

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 (104) hide show
  1. package/build/cjs/index.js +19 -3
  2. package/build/cjs/index.js.map +1 -1
  3. package/build/esm/Carousel/Carousel.d.ts +9 -0
  4. package/build/esm/Carousel/Carousel.js +38 -0
  5. package/build/esm/Carousel/Carousel.js.map +1 -0
  6. package/build/esm/Carousel/Fader.d.ts +14 -0
  7. package/build/esm/Carousel/Fader.js +76 -0
  8. package/build/esm/Carousel/Fader.js.map +1 -0
  9. package/build/esm/Carousel/FaderItem.d.ts +5 -0
  10. package/build/esm/Carousel/FaderItem.js +16 -0
  11. package/build/esm/Carousel/FaderItem.js.map +1 -0
  12. package/build/esm/Carousel/Preloader.d.ts +7 -0
  13. package/build/esm/Carousel/Preloader.js +70 -0
  14. package/build/esm/Carousel/Preloader.js.map +1 -0
  15. package/build/esm/Carousel/Slider.d.ts +14 -0
  16. package/build/esm/Carousel/Slider.js +212 -0
  17. package/build/esm/Carousel/Slider.js.map +1 -0
  18. package/build/esm/Carousel/SliderItem.d.ts +12 -0
  19. package/build/esm/Carousel/SliderItem.js +41 -0
  20. package/build/esm/Carousel/SliderItem.js.map +1 -0
  21. package/build/esm/Carousel/context.d.ts +10 -0
  22. package/build/esm/Carousel/context.js +8 -0
  23. package/build/esm/Carousel/context.js.map +1 -0
  24. package/build/esm/Carousel/getSliderParams.d.ts +9 -0
  25. package/build/esm/Carousel/getSliderParams.js +85 -0
  26. package/build/esm/Carousel/getSliderParams.js.map +1 -0
  27. package/build/esm/Carousel/index.d.ts +7 -0
  28. package/build/esm/Carousel/index.js +8 -0
  29. package/build/esm/Carousel/index.js.map +1 -0
  30. package/build/esm/Carousel/useCarouselGestures.d.ts +30 -0
  31. package/build/esm/Carousel/useCarouselGestures.js +33 -0
  32. package/build/esm/Carousel/useCarouselGestures.js.map +1 -0
  33. package/build/esm/DatePicker/DatePicker.d.ts +24 -0
  34. package/build/esm/DatePicker/DatePicker.js +101 -0
  35. package/build/esm/DatePicker/DatePicker.js.map +1 -0
  36. package/build/esm/DatePicker/DatePickerSelect.d.ts +8 -0
  37. package/build/esm/DatePicker/DatePickerSelect.js +201 -0
  38. package/build/esm/DatePicker/DatePickerSelect.js.map +1 -0
  39. package/build/esm/DatePicker/RangeDatePicker.d.ts +28 -0
  40. package/build/esm/DatePicker/RangeDatePicker.js +94 -0
  41. package/build/esm/DatePicker/RangeDatePicker.js.map +1 -0
  42. package/build/esm/DatePicker/adjustDates.d.ts +4 -0
  43. package/build/esm/DatePicker/adjustDates.js +18 -0
  44. package/build/esm/DatePicker/adjustDates.js.map +1 -0
  45. package/build/esm/DatePicker/contexts.d.ts +31 -0
  46. package/build/esm/DatePicker/contexts.js +15 -0
  47. package/build/esm/DatePicker/contexts.js.map +1 -0
  48. package/build/esm/DatePicker/dateTypes.d.ts +2 -0
  49. package/build/esm/DatePicker/dateTypes.js +2 -0
  50. package/build/esm/DatePicker/dateTypes.js.map +1 -0
  51. package/build/esm/DatePicker/hooks.d.ts +36 -0
  52. package/build/esm/DatePicker/hooks.js +98 -0
  53. package/build/esm/DatePicker/hooks.js.map +1 -0
  54. package/build/esm/DatePicker/index.d.ts +5 -0
  55. package/build/esm/DatePicker/index.js +6 -0
  56. package/build/esm/DatePicker/index.js.map +1 -0
  57. package/build/esm/Portal/Portal.d.ts +3 -2
  58. package/build/esm/Portal/Portal.js +6 -3
  59. package/build/esm/Portal/Portal.js.map +1 -1
  60. package/build/esm/Portal/PortalSelectorProvider.d.ts +8 -0
  61. package/build/esm/Portal/PortalSelectorProvider.js +13 -0
  62. package/build/esm/Portal/PortalSelectorProvider.js.map +1 -0
  63. package/build/esm/Portal/index.d.ts +1 -0
  64. package/build/esm/Portal/index.js +1 -0
  65. package/build/esm/Portal/index.js.map +1 -1
  66. package/build/esm/hooks/useControlledState.js +1 -1
  67. package/build/esm/hooks/useControlledState.js.map +1 -1
  68. package/build/esm/hooks/useId.d.ts +1 -0
  69. package/build/esm/hooks/useId.js +25 -0
  70. package/build/esm/hooks/useId.js.map +1 -0
  71. package/build/esm/utils/assignRef.d.ts +3 -0
  72. package/build/esm/utils/assignRef.js +25 -0
  73. package/build/esm/utils/assignRef.js.map +1 -0
  74. package/build/esm/utils/getCircularIndex.d.ts +1 -0
  75. package/build/esm/utils/getCircularIndex.js +8 -0
  76. package/build/esm/utils/getCircularIndex.js.map +1 -0
  77. package/build/esm/utils/rubberBandClamp.d.ts +2 -0
  78. package/build/esm/utils/rubberBandClamp.js +20 -0
  79. package/build/esm/utils/rubberBandClamp.js.map +1 -0
  80. package/build/esm/utils/wrapEvent.d.ts +3 -0
  81. package/build/esm/utils/wrapEvent.js +16 -0
  82. package/build/esm/utils/wrapEvent.js.map +1 -0
  83. package/build/tsconfig-build.tsbuildinfo +1 -1
  84. package/build/tsconfig.tsbuildinfo +7270 -0
  85. package/package.json +2 -2
  86. package/src/Portal/Portal.tsx +15 -4
  87. package/src/Portal/PortalSelectorProvider.tsx +24 -0
  88. package/src/Portal/index.ts +5 -0
  89. package/src/hooks/useControlledState.ts +3 -3
  90. package/build/esm/TimerField/clamp.d.ts +0 -1
  91. package/build/esm/TimerField/clamp.js +0 -2
  92. package/build/esm/TimerField/clamp.js.map +0 -1
  93. package/build/esm/TimerField/index.d.ts +0 -1
  94. package/build/esm/TimerField/index.js +0 -2
  95. package/build/esm/TimerField/index.js.map +0 -1
  96. package/build/esm/TimerField/useControlledState.d.ts +0 -1
  97. package/build/esm/TimerField/useControlledState.js +0 -2
  98. package/build/esm/TimerField/useControlledState.js.map +0 -1
  99. package/build/esm/TimerField/useTimerField.d.ts +0 -44
  100. package/build/esm/TimerField/useTimerField.js +0 -430
  101. package/build/esm/TimerField/useTimerField.js.map +0 -1
  102. package/build/esm/TimerField/wrapEvent.d.ts +0 -1
  103. package/build/esm/TimerField/wrapEvent.js +0 -2
  104. package/build/esm/TimerField/wrapEvent.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@basic-ui/core",
3
- "version": "0.0.51",
3
+ "version": "0.0.53",
4
4
  "description": "Accessible React Components used as building blocks for UI patterns",
5
5
  "author": "Lucas Terra <lucasterra7@gmail.com>",
6
6
  "license": "MIT",
@@ -35,5 +35,5 @@
35
35
  "react": "^16.14.0 || ^17.0.0 || ^18.0.0",
36
36
  "react-dom": "^16.14.0 || ^17.0.0 || ^18.0.0"
37
37
  },
38
- "gitHead": "5442c3e57c390b7f69adab60118d7d6df9f55df0"
38
+ "gitHead": "7feff13ea6d8ec28acbb8d3007121111d8d92063"
39
39
  }
@@ -1,17 +1,28 @@
1
- import type { FC, ReactNode } from 'react';
1
+ import { useContext, type FC, type ReactNode } from 'react';
2
2
  import { createPortal } from 'react-dom';
3
3
 
4
+ import type { PortalSelectorFn } from './PortalSelectorProvider';
5
+ import { PortalSelectorContext } from './PortalSelectorProvider';
6
+
4
7
  export interface PortalProps {
5
8
  children?: ReactNode;
6
- selector?: string;
9
+ selector?: PortalSelectorFn;
7
10
  }
8
11
 
9
- export const Portal: FC<PortalProps> = ({ children, selector = 'body' }) => {
12
+ export const Portal: FC<PortalProps> = ({
13
+ children,
14
+ selector: selectorProp,
15
+ }) => {
16
+ const selectorCtx = useContext(PortalSelectorContext);
10
17
  if (typeof window === 'undefined') {
11
18
  return null;
12
19
  }
13
20
 
14
- const dom = document.querySelector(selector);
21
+ const selector = selectorProp || selectorCtx || 'body';
22
+ const dom =
23
+ typeof selector === 'string'
24
+ ? document.querySelector(selector)
25
+ : selector();
15
26
  if (dom) {
16
27
  return createPortal(<div data-portal="">{children}</div>, dom);
17
28
  }
@@ -0,0 +1,24 @@
1
+ import { createContext } from 'react';
2
+ import type { ReactNode } from 'react';
3
+
4
+ export type PortalSelectorFn = string | (() => Element | null);
5
+ export const PortalSelectorContext = createContext<PortalSelectorFn | null>(
6
+ null
7
+ );
8
+ PortalSelectorContext.displayName = 'PortalSelectorContext';
9
+
10
+ export type PortalSelectorProviderProps = {
11
+ selector: PortalSelectorFn;
12
+ children?: ReactNode | ReactNode[];
13
+ };
14
+
15
+ export const PortalSelectorProvider = ({
16
+ selector,
17
+ children,
18
+ }: PortalSelectorProviderProps) => {
19
+ return (
20
+ <PortalSelectorContext.Provider value={selector}>
21
+ {children}
22
+ </PortalSelectorContext.Provider>
23
+ );
24
+ };
@@ -1 +1,6 @@
1
1
  export * from './Portal';
2
+ export {
3
+ PortalSelectorProvider,
4
+ type PortalSelectorProviderProps,
5
+ type PortalSelectorFn,
6
+ } from './PortalSelectorProvider';
@@ -23,9 +23,9 @@ export function useControlledState<
23
23
 
24
24
  if (isControlled) {
25
25
  if (
26
- wasControlled.current &&
27
- process.env.NODE_ENV !== 'production' &&
28
- !hasWarned.current
26
+ !wasControlled.current &&
27
+ !hasWarned.current &&
28
+ process.env.NODE_ENV !== 'production'
29
29
  ) {
30
30
  console.warn('Trying to change from controlled to uncontrolled.');
31
31
  hasWarned.current = true;
@@ -1 +0,0 @@
1
- export * from '../utils/clamp';
@@ -1,2 +0,0 @@
1
- export * from '../utils/clamp';
2
- //# sourceMappingURL=clamp.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"clamp.js","names":[],"sources":["../../../src/TimerField/clamp.ts"],"sourcesContent":["export * from '../utils/clamp';\n"],"mappings":"AAAA,cAAc,gBAAd"}
@@ -1 +0,0 @@
1
- export * from './useTimerField';
@@ -1,2 +0,0 @@
1
- export * from './useTimerField';
2
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/TimerField/index.ts"],"sourcesContent":["export * from './useTimerField';\n"],"mappings":"AAAA,cAAc,iBAAd"}
@@ -1 +0,0 @@
1
- export * from '../hooks/useControlledState';
@@ -1,2 +0,0 @@
1
- export * from '../hooks/useControlledState';
2
- //# sourceMappingURL=useControlledState.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useControlledState.js","names":[],"sources":["../../../src/TimerField/useControlledState.ts"],"sourcesContent":["export * from '../hooks/useControlledState';\n"],"mappings":"AAAA,cAAc,6BAAd"}
@@ -1,44 +0,0 @@
1
- import type { RefObject, HTMLAttributes, PointerEvent } from 'react';
2
- export interface UseTimerFieldProps {
3
- value?: number | null;
4
- defaultValue?: number | null;
5
- onChange?: (value: number | null) => void;
6
- label?: string;
7
- ref: RefObject<HTMLElement | null>;
8
- }
9
- export interface TimerFieldSegmentType {
10
- isEditable?: boolean;
11
- value: number | null;
12
- minValue: number;
13
- maxValue: number;
14
- maxTempValue: number;
15
- type: 'hour' | 'minute' | 'second';
16
- }
17
- export interface TimerFieldState {
18
- parentRef: RefObject<HTMLElement | null>;
19
- hasFocusWithin: boolean;
20
- isReadOnly: boolean;
21
- isDisabled: boolean;
22
- value: number | null;
23
- clear: () => void;
24
- segments: TimerFieldSegmentType[];
25
- simplifySegments(): void;
26
- setSegment(part: 'hour' | 'minute' | 'second', value: number | undefined | ((curValue: number | null) => number | null)): void;
27
- validationState?: 'invalid' | 'valid';
28
- }
29
- export declare function useHasFocusWithin<ElementType extends HTMLElement>(ref: RefObject<ElementType | null>): boolean;
30
- export declare function useTimerField(props: UseTimerFieldProps): {
31
- state: TimerFieldState;
32
- labelProps: {};
33
- fieldProps: {
34
- role: string;
35
- onPointerDown: (e: PointerEvent<HTMLDivElement>) => void;
36
- };
37
- };
38
- export declare function useTimerFieldSegment(segment: TimerFieldSegmentType, state: TimerFieldState, ref: RefObject<HTMLElement>): {
39
- state: {
40
- isPlaceholder: boolean;
41
- text: string;
42
- };
43
- segmentProps: HTMLAttributes<HTMLDivElement>;
44
- };
@@ -1,430 +0,0 @@
1
- import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
- import _extends from "@babel/runtime/helpers/extends";
3
- import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
4
- import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
5
- import { useEffect, useRef, useMemo, useState, useCallback, version } from 'react';
6
- import { unstable_batchedUpdates } from 'react-dom';
7
- import { useControlledState } from './useControlledState';
8
- import { clamp as clampFunc } from './clamp';
9
-
10
- function isValidPartialNumber(value) {
11
- // Sanitize
12
- var sanitizedValue = (value || '').replace(/[^0-9]+/g, '');
13
- return value.length === sanitizedValue.length;
14
- }
15
-
16
- function getSegmentText(nextValue) {
17
- if (nextValue === undefined) {
18
- return '00';
19
- }
20
-
21
- var padLength = 2;
22
- return String(nextValue).padStart(padLength, '0');
23
- }
24
-
25
- var segmentOrdering = ['hour', 'minute', 'second'];
26
-
27
- function getNextSegment(segmentType, dir) {
28
- var nextSegmentTypeIdx = segmentOrdering.findIndex(function (c) {
29
- return c === segmentType;
30
- }) + (dir === 'next' ? 1 : -1);
31
- return nextSegmentTypeIdx >= 0 && nextSegmentTypeIdx < segmentOrdering.length ? segmentOrdering[nextSegmentTypeIdx] : null;
32
- }
33
-
34
- function focusOnSegment(parentEl, segmentType) {
35
- var el = parentEl && parentEl.querySelector("[data-timer-field-segment=\"".concat(segmentType, "\"]"));
36
-
37
- if (el instanceof HTMLElement) {
38
- el.focus();
39
- return;
40
- }
41
- }
42
-
43
- export function useHasFocusWithin(ref) {
44
- var _useState = useState(false),
45
- _useState2 = _slicedToArray(_useState, 2),
46
- hasFocusWithin = _useState2[0],
47
- setHasFocusWithin = _useState2[1];
48
-
49
- useEffect(function () {
50
- if (!ref.current) {
51
- return;
52
- }
53
-
54
- var el = ref.current;
55
-
56
- var onFocus = function onFocus() {
57
- setHasFocusWithin(true);
58
- };
59
-
60
- var onBlur = function onBlur(e) {
61
- // Is the new element receiving focus contained within the wrapped element?
62
- if (!e.relatedTarget || !(e.relatedTarget instanceof Node) || !el.contains(e.relatedTarget)) {
63
- setHasFocusWithin(false);
64
- }
65
- };
66
-
67
- el.addEventListener('focusin', onFocus);
68
- el.addEventListener('focusout', onBlur);
69
- return function () {
70
- el.removeEventListener('focusout', onBlur);
71
- el.removeEventListener('focusin', onFocus);
72
- };
73
- }, [ref]);
74
- return hasFocusWithin;
75
- }
76
-
77
- function segmentStatesFromValue(value) {
78
- var hour = value !== null ? Math.floor(value / 3600) : null;
79
- var minute = value !== null ? Math.floor(value / 60) % 60 : null;
80
- var second = value !== null ? value % 60 : null;
81
- return [{
82
- type: 'hour',
83
- value: hour,
84
- minValue: 0,
85
- maxValue: 999,
86
- maxTempValue: 999,
87
- isEditable: true
88
- }, {
89
- type: 'minute',
90
- value: minute,
91
- minValue: 0,
92
- maxValue: 59,
93
- maxTempValue: 99,
94
- isEditable: true
95
- }, {
96
- type: 'second',
97
- value: second,
98
- minValue: 0,
99
- maxValue: 59,
100
- maxTempValue: 99,
101
- isEditable: true
102
- }];
103
- }
104
-
105
- export function useTimerField(props) {
106
- var valueProp = props.value,
107
- defaultValueProp = props.defaultValue,
108
- onChangeProp = props.onChange;
109
-
110
- var _useControlledState = useControlledState(valueProp, function (e, value) {
111
- return onChangeProp && onChangeProp(value);
112
- }, defaultValueProp, function (setState) {
113
- return function (e, value) {
114
- setState(value);
115
- };
116
- }),
117
- _useControlledState2 = _slicedToArray(_useControlledState, 2),
118
- value = _useControlledState2[0],
119
- onChange = _useControlledState2[1];
120
-
121
- var hasFocusWithin = useHasFocusWithin(props.ref);
122
-
123
- var _useState3 = useState(segmentStatesFromValue(value || null)),
124
- _useState4 = _slicedToArray(_useState3, 2),
125
- segments = _useState4[0],
126
- setSegmentState = _useState4[1];
127
-
128
- var prevValue = useRef(value);
129
-
130
- if (value !== prevValue.current) {
131
- prevValue.current = value;
132
- setSegmentState(segmentStatesFromValue(value || null));
133
- }
134
-
135
- var labelProps = {};
136
- var fieldProps = {
137
- role: 'group',
138
- onPointerDown: function onPointerDown(e) {
139
- if (!hasFocusWithin && e.currentTarget === e.target) {
140
- e.preventDefault();
141
- focusOnSegment(props.ref.current, 'second');
142
- }
143
- }
144
- };
145
- var state = useMemo(function () {
146
- var handleChangeSegment = function handleChangeSegment(seg, newValue) {
147
- if (newValue === null) {
148
- seg.value = null;
149
- } else {
150
- seg.value = newValue;
151
- }
152
- };
153
-
154
- return {
155
- parentRef: props.ref,
156
- isReadOnly: false,
157
- isDisabled: false,
158
- hasFocusWithin: hasFocusWithin,
159
- segments: segments,
160
- value: value,
161
- clear: function clear() {
162
- focusOnSegment(props.ref.current, 'second');
163
- unstable_batchedUpdates(function () {
164
- setSegmentState(segmentStatesFromValue(null));
165
- onChange({}, undefined);
166
- });
167
- },
168
- simplifySegments: function simplifySegments() {
169
- setSegmentState(function (curState) {
170
- var newState = _toConsumableArray(curState);
171
-
172
- var carryOver = 0;
173
-
174
- for (var i = newState.length - 1; i >= 0; i--) {
175
- var segment = _extends({}, newState[i]);
176
-
177
- if (carryOver > 0) {
178
- handleChangeSegment(segment, (segment.value || 0) + carryOver);
179
- carryOver = 0;
180
- }
181
-
182
- if (segment.value && segment.value > segment.maxValue) {
183
- carryOver = Math.floor(segment.value / (segment.maxValue + 1));
184
- handleChangeSegment(segment, segment.value % (segment.maxValue + 1));
185
- }
186
-
187
- newState[i] = segment;
188
- }
189
-
190
- return newState;
191
- });
192
- },
193
- setSegment: function setSegment(part, value) {
194
- var ret = _toConsumableArray(segments);
195
-
196
- var idx = ret.findIndex(function (v) {
197
- return v.type === part;
198
- });
199
-
200
- if (idx === -1) {
201
- return;
202
- }
203
-
204
- var field = _extends({}, ret[idx]);
205
-
206
- if (typeof value === 'function') {
207
- handleChangeSegment(field, value(ret[idx].value));
208
- } else {
209
- handleChangeSegment(field, value || null);
210
- }
211
-
212
- ret[idx] = field;
213
- var newValueInSeconds = (ret[0].value || 0) * 3600 + (ret[1].value || 0) * 60 + (ret[2].value || 0);
214
- prevValue.current = newValueInSeconds;
215
- unstable_batchedUpdates(function () {
216
- onChange({}, newValueInSeconds);
217
- setSegmentState(ret);
218
- });
219
- },
220
- validationState: 'valid'
221
- };
222
- }, [props.ref, hasFocusWithin, segments, onChange, value]);
223
- return {
224
- state: state,
225
- labelProps: labelProps,
226
- fieldProps: fieldProps
227
- };
228
- }
229
- export function useTimerFieldSegment(segment, state, ref) {
230
- var _segmentProps;
231
-
232
- var stepSize = segment.type === 'hour' ? 2 : 15;
233
- var segmentText = getSegmentText(segment.value);
234
- var enteredKeys = useRef('');
235
-
236
- var handleKeyDown = function handleKeyDown(e) {
237
- var nextValue = segment.value || 0;
238
-
239
- switch (e.key) {
240
- case 'ArrowUp':
241
- nextValue += 1;
242
- break;
243
-
244
- case 'ArrowDown':
245
- nextValue -= 1;
246
- break;
247
-
248
- case 'ArrowRight':
249
- case 'ArrowLeft':
250
- var nextSegment = getNextSegment(segment.type, e.key === 'ArrowRight' ? 'next' : 'prev');
251
-
252
- if (nextSegment) {
253
- focusOnSegment(state.parentRef.current, nextSegment);
254
- }
255
-
256
- e.preventDefault();
257
- return;
258
-
259
- case 'End':
260
- nextValue = segment.maxValue;
261
- break;
262
-
263
- case 'Home':
264
- nextValue = segment.minValue;
265
- break;
266
-
267
- case 'PageUp':
268
- if (segment.type !== 'hour') {
269
- nextValue = Math.ceil((nextValue + 1) / stepSize) * stepSize % 60;
270
- } else {
271
- nextValue += stepSize;
272
- }
273
-
274
- break;
275
-
276
- case 'PageDown':
277
- if (segment.type !== 'hour') {
278
- nextValue = Math.floor((nextValue - 1) / stepSize) * stepSize % 60;
279
- } else {
280
- nextValue -= stepSize;
281
- }
282
-
283
- break;
284
-
285
- default:
286
- return;
287
- }
288
-
289
- e.preventDefault(); // prevent scrolling
290
-
291
- nextValue = clampFunc(nextValue || 0, segment.minValue, segment.maxTempValue);
292
-
293
- if (nextValue !== segment.value) {
294
- state.setSegment(segment.type, nextValue);
295
- }
296
- };
297
-
298
- var onInput = useCallback(function (key) {
299
- if (state.isDisabled || state.isReadOnly) {
300
- return;
301
- }
302
-
303
- var newTextValue = enteredKeys.current + key;
304
-
305
- if (newTextValue.length > String(segment.maxTempValue).length) {
306
- newTextValue = newTextValue.slice(-String(segment.maxTempValue).length);
307
- }
308
-
309
- switch (segment.type) {
310
- case 'hour':
311
- case 'minute':
312
- case 'second':
313
- {
314
- if (!isValidPartialNumber(newTextValue)) {
315
- return;
316
- }
317
-
318
- var numberValue = parseInt(newTextValue, 10);
319
- var segmentValue = numberValue;
320
- var allowsZero = segment.minValue === 0;
321
-
322
- if (numberValue > segment.maxTempValue) {
323
- segmentValue = parseInt(key);
324
- }
325
-
326
- if (isNaN(numberValue)) {
327
- return;
328
- }
329
-
330
- var shouldSetValue = segmentValue !== 0 || allowsZero;
331
-
332
- if (shouldSetValue) {
333
- state.setSegment(segment.type, segmentValue);
334
- }
335
-
336
- enteredKeys.current = newTextValue;
337
- break;
338
- }
339
- }
340
- }, [segment.maxTempValue, segment.minValue, segment.type, state]);
341
- var backspace = useCallback(function () {
342
- if (isValidPartialNumber(segmentText) && !state.isReadOnly) {
343
- var newValue = segmentText.slice(0, -1);
344
- var parsed = parseInt(newValue, 10);
345
-
346
- if (newValue.length === 0 || parsed === 0) {
347
- state.setSegment(segment.type, undefined);
348
- } else {
349
- state.setSegment(segment.type, parsed);
350
- }
351
-
352
- enteredKeys.current = newValue;
353
- }
354
- }, [segmentText, segment.type, state]);
355
- var compositionRef = useRef('');
356
- useEffect(function () {
357
- var el = ref.current;
358
-
359
- if (el) {
360
- var handleBeforeInput = function handleBeforeInput(e) {
361
- e.preventDefault();
362
-
363
- switch (e.inputType) {
364
- case 'deleteContentBackward':
365
- case 'deleteContentForward':
366
- if (isValidPartialNumber(segmentText) && !state.isReadOnly) {
367
- backspace();
368
- }
369
-
370
- break;
371
-
372
- case 'insertCompositionText':
373
- // insertCompositionText cannot be canceled.
374
- // Record the current state of the element so we can restore it in the `input` event below.
375
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
376
- compositionRef.current = el.textContent; // Safari gets stuck in a composition state unless we also assign to the value here.
377
- // eslint-disable-next-line no-self-assign
378
-
379
- el.textContent = el.textContent;
380
- break;
381
-
382
- default:
383
- if (e.data !== null) {
384
- onInput(e.data);
385
- }
386
-
387
- break;
388
- }
389
- };
390
-
391
- var handleInput = function handleInput(e) {
392
- if (e.inputType === 'insertCompositionText') {
393
- // Reset the DOM to how it was in the beforeinput event.
394
- el.textContent = compositionRef.current;
395
- }
396
- };
397
-
398
- el.addEventListener('beforeinput', handleBeforeInput);
399
- el.addEventListener('input', handleInput);
400
- return function () {
401
- el.removeEventListener('input', handleInput);
402
- el.removeEventListener('beforeinput', handleBeforeInput);
403
- };
404
- }
405
- }, [backspace, onInput, ref, segmentText, state.isReadOnly]);
406
- var simplifySegments = state.simplifySegments;
407
- var handleBlur = useCallback(function () {
408
- enteredKeys.current = '';
409
-
410
- if (segment.value && segment.value > segment.maxValue) {
411
- simplifySegments();
412
- }
413
- }, [segment.maxValue, segment.value, simplifySegments]);
414
- return {
415
- state: {
416
- isPlaceholder: segment.value === undefined && state.hasFocusWithin || state.value === undefined && !state.hasFocusWithin,
417
- text: segmentText
418
- },
419
- segmentProps: (_segmentProps = {
420
- role: 'spinbutton',
421
- 'aria-valuenow': segment.value,
422
- 'aria-valuemin': segment.minValue,
423
- 'aria-valuemax': segment.maxValue,
424
- 'aria-label': segment.type
425
- }, _defineProperty(_segmentProps, 'data-timer-field-segment', segment.type), _defineProperty(_segmentProps, "contentEditable", true), _defineProperty(_segmentProps, "suppressContentEditableWarning", true), _defineProperty(_segmentProps, "spellCheck", false), _defineProperty(_segmentProps, "autoCapitalize", 'off'), _defineProperty(_segmentProps, "autoCorrect", 'off'), _defineProperty(_segmentProps, parseInt(version, 10) >= 17 ? 'enterKeyHint' : 'enterkeyhint', 'next'), _defineProperty(_segmentProps, "inputMode", 'numeric'), _defineProperty(_segmentProps, "tabIndex", 0), _defineProperty(_segmentProps, "style", {
426
- caretColor: 'transparent'
427
- }), _defineProperty(_segmentProps, "onKeyDown", handleKeyDown), _defineProperty(_segmentProps, "onBlur", handleBlur), _segmentProps)
428
- };
429
- }
430
- //# sourceMappingURL=useTimerField.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useTimerField.js","names":["useEffect","useRef","useMemo","useState","useCallback","version","unstable_batchedUpdates","useControlledState","clamp","clampFunc","isValidPartialNumber","value","sanitizedValue","replace","length","getSegmentText","nextValue","undefined","padLength","String","padStart","segmentOrdering","getNextSegment","segmentType","dir","nextSegmentTypeIdx","findIndex","c","focusOnSegment","parentEl","el","querySelector","HTMLElement","focus","useHasFocusWithin","ref","hasFocusWithin","setHasFocusWithin","current","onFocus","onBlur","e","relatedTarget","Node","contains","addEventListener","removeEventListener","segmentStatesFromValue","hour","Math","floor","minute","second","type","minValue","maxValue","maxTempValue","isEditable","useTimerField","props","valueProp","defaultValueProp","defaultValue","onChangeProp","onChange","setState","segments","setSegmentState","prevValue","labelProps","fieldProps","role","onPointerDown","currentTarget","target","preventDefault","state","handleChangeSegment","seg","newValue","parentRef","isReadOnly","isDisabled","clear","simplifySegments","curState","newState","carryOver","i","segment","setSegment","part","ret","idx","v","field","newValueInSeconds","validationState","useTimerFieldSegment","stepSize","segmentText","enteredKeys","handleKeyDown","key","nextSegment","ceil","onInput","newTextValue","slice","numberValue","parseInt","segmentValue","allowsZero","isNaN","shouldSetValue","backspace","parsed","compositionRef","handleBeforeInput","inputType","textContent","data","handleInput","handleBlur","isPlaceholder","text","segmentProps","caretColor"],"sources":["../../../src/TimerField/useTimerField.tsx"],"sourcesContent":["import type {\n RefObject,\n KeyboardEvent,\n HTMLAttributes,\n PointerEvent,\n} from 'react';\nimport {\n useEffect,\n useRef,\n useMemo,\n useState,\n useCallback,\n version,\n} from 'react';\nimport { unstable_batchedUpdates } from 'react-dom';\n\nimport { useControlledState } from './useControlledState';\nimport { clamp as clampFunc } from './clamp';\n\nexport interface UseTimerFieldProps {\n value?: number | null;\n defaultValue?: number | null;\n onChange?: (value: number | null) => void;\n label?: string;\n ref: RefObject<HTMLElement | null>;\n}\n\nexport interface TimerFieldSegmentType {\n isEditable?: boolean;\n value: number | null;\n minValue: number;\n maxValue: number;\n maxTempValue: number;\n type: 'hour' | 'minute' | 'second';\n}\n\nexport interface TimerFieldState {\n parentRef: RefObject<HTMLElement | null>;\n hasFocusWithin: boolean;\n isReadOnly: boolean;\n isDisabled: boolean;\n value: number | null;\n clear: () => void;\n segments: TimerFieldSegmentType[];\n simplifySegments(): void;\n setSegment(\n part: 'hour' | 'minute' | 'second',\n value: number | undefined | ((curValue: number | null) => number | null)\n ): void;\n validationState?: 'invalid' | 'valid';\n}\n\nfunction isValidPartialNumber(value: string): boolean {\n // Sanitize\n const sanitizedValue = (value || '').replace(/[^0-9]+/g, '');\n return value.length === sanitizedValue.length;\n}\n\nfunction getSegmentText(nextValue: number | null): string {\n if (nextValue === undefined) {\n return '00';\n }\n const padLength = 2;\n return String(nextValue).padStart(padLength, '0');\n}\n\nconst segmentOrdering = ['hour' as const, 'minute' as const, 'second' as const];\nfunction getNextSegment(\n segmentType: TimerFieldSegmentType['type'],\n dir: 'next' | 'prev'\n) {\n const nextSegmentTypeIdx =\n segmentOrdering.findIndex((c) => c === segmentType) +\n (dir === 'next' ? 1 : -1);\n return nextSegmentTypeIdx >= 0 && nextSegmentTypeIdx < segmentOrdering.length\n ? segmentOrdering[nextSegmentTypeIdx]\n : null;\n}\n\nfunction focusOnSegment(\n parentEl: HTMLElement | null,\n segmentType: TimerFieldSegmentType['type']\n) {\n const el =\n parentEl &&\n parentEl.querySelector(`[data-timer-field-segment=\"${segmentType}\"]`);\n if (el instanceof HTMLElement) {\n el.focus();\n return;\n }\n}\n\nexport function useHasFocusWithin<ElementType extends HTMLElement>(\n ref: RefObject<ElementType | null>\n) {\n const [hasFocusWithin, setHasFocusWithin] = useState(false);\n useEffect(() => {\n if (!ref.current) {\n return;\n }\n\n const el = ref.current;\n const onFocus = () => {\n setHasFocusWithin(true);\n };\n const onBlur = (e: FocusEvent) => {\n // Is the new element receiving focus contained within the wrapped element?\n if (\n !e.relatedTarget ||\n !(e.relatedTarget instanceof Node) ||\n !el.contains(e.relatedTarget)\n ) {\n setHasFocusWithin(false);\n }\n };\n el.addEventListener('focusin', onFocus);\n el.addEventListener('focusout', onBlur);\n return () => {\n el.removeEventListener('focusout', onBlur);\n el.removeEventListener('focusin', onFocus);\n };\n }, [ref]);\n return hasFocusWithin;\n}\n\nfunction segmentStatesFromValue(value: number | null): TimerFieldSegmentType[] {\n const hour = value !== null ? Math.floor(value / 3600) : null;\n const minute = value !== null ? Math.floor(value / 60) % 60 : null;\n const second = value !== null ? value % 60 : null;\n return [\n {\n type: 'hour' as const,\n value: hour,\n minValue: 0,\n maxValue: 999,\n maxTempValue: 999,\n isEditable: true,\n },\n {\n type: 'minute',\n value: minute,\n minValue: 0,\n maxValue: 59,\n maxTempValue: 99,\n isEditable: true,\n },\n {\n type: 'second',\n value: second,\n minValue: 0,\n maxValue: 59,\n maxTempValue: 99,\n isEditable: true,\n },\n ];\n}\n\nexport function useTimerField(props: UseTimerFieldProps) {\n const {\n value: valueProp,\n defaultValue: defaultValueProp,\n onChange: onChangeProp,\n } = props;\n const [value, onChange] = useControlledState(\n valueProp,\n (e: KeyboardEvent<HTMLDivElement>, value: number | null) =>\n onChangeProp && onChangeProp(value),\n defaultValueProp,\n (setState) => (e: KeyboardEvent<HTMLDivElement>, value: number | null) => {\n setState(value);\n }\n );\n const hasFocusWithin = useHasFocusWithin(props.ref);\n\n const [segments, setSegmentState] = useState<TimerFieldSegmentType[]>(\n segmentStatesFromValue(value || null)\n );\n const prevValue = useRef(value);\n if (value !== prevValue.current) {\n prevValue.current = value;\n setSegmentState(segmentStatesFromValue(value || null));\n }\n\n const labelProps = {};\n const fieldProps = {\n role: 'group',\n onPointerDown: (e: PointerEvent<HTMLDivElement>) => {\n if (!hasFocusWithin && e.currentTarget === e.target) {\n e.preventDefault();\n focusOnSegment(props.ref.current, 'second');\n }\n },\n };\n const state: TimerFieldState = useMemo(() => {\n const handleChangeSegment = (\n seg: TimerFieldSegmentType,\n newValue: number | null\n ): void => {\n if (newValue === null) {\n seg.value = null;\n } else {\n seg.value = newValue;\n }\n };\n\n return {\n parentRef: props.ref,\n isReadOnly: false,\n isDisabled: false,\n hasFocusWithin,\n segments,\n value: value,\n clear: () => {\n focusOnSegment(props.ref.current, 'second');\n unstable_batchedUpdates(() => {\n setSegmentState(segmentStatesFromValue(null));\n onChange({} as any, undefined as any);\n });\n },\n simplifySegments: () => {\n setSegmentState((curState) => {\n const newState = [...curState];\n let carryOver = 0;\n for (let i = newState.length - 1; i >= 0; i--) {\n const segment = { ...newState[i] };\n if (carryOver > 0) {\n handleChangeSegment(segment, (segment.value || 0) + carryOver);\n carryOver = 0;\n }\n if (segment.value && segment.value > segment.maxValue) {\n carryOver = Math.floor(segment.value / (segment.maxValue + 1));\n handleChangeSegment(\n segment,\n segment.value % (segment.maxValue + 1)\n );\n }\n newState[i] = segment;\n }\n return newState;\n });\n },\n setSegment: (\n part: 'hour' | 'minute' | 'second',\n value: number | undefined | ((curValue: number | null) => number | null)\n ): void => {\n const ret = [...segments];\n const idx = ret.findIndex((v) => v.type === part);\n if (idx === -1) {\n return;\n }\n\n const field = { ...ret[idx] };\n if (typeof value === 'function') {\n handleChangeSegment(field, value(ret[idx].value));\n } else {\n handleChangeSegment(field, value || null);\n }\n ret[idx] = field;\n const newValueInSeconds =\n (ret[0].value || 0) * 3600 +\n (ret[1].value || 0) * 60 +\n (ret[2].value || 0);\n\n prevValue.current = newValueInSeconds;\n unstable_batchedUpdates(() => {\n onChange({} as any, newValueInSeconds);\n setSegmentState(ret);\n });\n },\n validationState: 'valid',\n };\n }, [props.ref, hasFocusWithin, segments, onChange, value]);\n\n return { state, labelProps, fieldProps };\n}\n\nexport function useTimerFieldSegment(\n segment: TimerFieldSegmentType,\n state: TimerFieldState,\n ref: RefObject<HTMLElement>\n): {\n state: {\n isPlaceholder: boolean;\n text: string;\n };\n segmentProps: HTMLAttributes<HTMLDivElement>;\n} {\n const stepSize = segment.type === 'hour' ? 2 : 15;\n const segmentText = getSegmentText(segment.value);\n const enteredKeys = useRef('');\n\n const handleKeyDown = (e: KeyboardEvent<HTMLElement>) => {\n let nextValue: number | null = segment.value || 0;\n switch (e.key) {\n case 'ArrowUp':\n nextValue += 1;\n break;\n case 'ArrowDown':\n nextValue -= 1;\n break;\n case 'ArrowRight':\n case 'ArrowLeft':\n const nextSegment = getNextSegment(\n segment.type,\n e.key === 'ArrowRight' ? 'next' : 'prev'\n );\n if (nextSegment) {\n focusOnSegment(state.parentRef.current, nextSegment);\n }\n e.preventDefault();\n return;\n case 'End':\n nextValue = segment.maxValue;\n break;\n case 'Home':\n nextValue = segment.minValue;\n break;\n case 'PageUp':\n if (segment.type !== 'hour') {\n nextValue = (Math.ceil((nextValue + 1) / stepSize) * stepSize) % 60;\n } else {\n nextValue += stepSize;\n }\n break;\n case 'PageDown':\n if (segment.type !== 'hour') {\n nextValue = (Math.floor((nextValue - 1) / stepSize) * stepSize) % 60;\n } else {\n nextValue -= stepSize;\n }\n break;\n default:\n return;\n }\n\n e.preventDefault(); // prevent scrolling\n nextValue = clampFunc(\n nextValue || 0,\n segment.minValue,\n segment.maxTempValue\n );\n if (nextValue !== segment.value) {\n state.setSegment(segment.type, nextValue);\n }\n };\n\n const onInput = useCallback(\n (key: string) => {\n if (state.isDisabled || state.isReadOnly) {\n return;\n }\n\n let newTextValue = enteredKeys.current + key;\n if (newTextValue.length > String(segment.maxTempValue).length) {\n newTextValue = newTextValue.slice(-String(segment.maxTempValue).length);\n }\n\n switch (segment.type) {\n case 'hour':\n case 'minute':\n case 'second': {\n if (!isValidPartialNumber(newTextValue)) {\n return;\n }\n\n const numberValue = parseInt(newTextValue, 10);\n let segmentValue = numberValue;\n const allowsZero = segment.minValue === 0;\n if (numberValue > segment.maxTempValue) {\n segmentValue = parseInt(key);\n }\n\n if (isNaN(numberValue)) {\n return;\n }\n\n const shouldSetValue = segmentValue !== 0 || allowsZero;\n if (shouldSetValue) {\n state.setSegment(segment.type, segmentValue);\n }\n\n enteredKeys.current = newTextValue;\n break;\n }\n }\n },\n [segment.maxTempValue, segment.minValue, segment.type, state]\n );\n\n const backspace = useCallback(() => {\n if (isValidPartialNumber(segmentText) && !state.isReadOnly) {\n const newValue = segmentText.slice(0, -1);\n const parsed = parseInt(newValue, 10);\n if (newValue.length === 0 || parsed === 0) {\n state.setSegment(segment.type, undefined);\n } else {\n state.setSegment(segment.type, parsed);\n }\n enteredKeys.current = newValue;\n }\n }, [segmentText, segment.type, state]);\n\n const compositionRef = useRef('');\n useEffect(() => {\n const el = ref.current;\n if (el) {\n const handleBeforeInput = (e: InputEvent) => {\n e.preventDefault();\n\n switch (e.inputType) {\n case 'deleteContentBackward':\n case 'deleteContentForward':\n if (isValidPartialNumber(segmentText) && !state.isReadOnly) {\n backspace();\n }\n break;\n case 'insertCompositionText':\n // insertCompositionText cannot be canceled.\n // Record the current state of the element so we can restore it in the `input` event below.\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n compositionRef.current = el.textContent!;\n\n // Safari gets stuck in a composition state unless we also assign to the value here.\n // eslint-disable-next-line no-self-assign\n el.textContent = el.textContent;\n break;\n default:\n if (e.data !== null) {\n onInput(e.data);\n }\n break;\n }\n };\n\n const handleInput = (e: InputEvent) => {\n if (e.inputType === 'insertCompositionText') {\n // Reset the DOM to how it was in the beforeinput event.\n el.textContent = compositionRef.current;\n }\n };\n\n el.addEventListener('beforeinput', handleBeforeInput);\n el.addEventListener('input', handleInput as any);\n return () => {\n el.removeEventListener('input', handleInput as any);\n el.removeEventListener('beforeinput', handleBeforeInput);\n };\n }\n }, [backspace, onInput, ref, segmentText, state.isReadOnly]);\n\n const simplifySegments = state.simplifySegments;\n const handleBlur = useCallback(() => {\n enteredKeys.current = '';\n if (segment.value && segment.value > segment.maxValue) {\n simplifySegments();\n }\n }, [segment.maxValue, segment.value, simplifySegments]);\n\n return {\n state: {\n isPlaceholder:\n (segment.value === undefined && state.hasFocusWithin) ||\n (state.value === undefined && !state.hasFocusWithin),\n text: segmentText,\n },\n segmentProps: {\n role: 'spinbutton',\n 'aria-valuenow': segment.value,\n 'aria-valuemin': segment.minValue,\n 'aria-valuemax': segment.maxValue,\n 'aria-label': segment.type,\n ['data-timer-field-segment' as any]: segment.type,\n contentEditable: true,\n suppressContentEditableWarning: true,\n spellCheck: false,\n autoCapitalize: 'off',\n autoCorrect: 'off',\n [parseInt(version, 10) >= 17 ? 'enterKeyHint' : 'enterkeyhint']: 'next', // Capitalization was changed in React 17...\n inputMode: 'numeric',\n tabIndex: 0,\n style: {\n caretColor: 'transparent',\n },\n onKeyDown: handleKeyDown,\n onBlur: handleBlur,\n },\n };\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- export * from '../utils/wrap-event';