@codefast/ui 0.3.10 → 0.3.11-canary.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/CHANGELOG.md +19 -0
- package/README.md +277 -167
- package/dist/components/accordion.cjs +5 -5
- package/dist/components/accordion.d.ts +4 -4
- package/dist/components/accordion.js +5 -5
- package/dist/components/alert-dialog.cjs +9 -9
- package/dist/components/alert-dialog.d.ts +11 -11
- package/dist/components/alert-dialog.js +9 -9
- package/dist/components/alert.cjs +5 -5
- package/dist/components/alert.d.ts +5 -5
- package/dist/components/alert.js +5 -5
- package/dist/components/aspect-ratio.d.ts +2 -2
- package/dist/components/avatar.cjs +3 -3
- package/dist/components/avatar.d.ts +2 -2
- package/dist/components/avatar.js +3 -3
- package/dist/components/badge.cjs +7 -7
- package/dist/components/badge.d.ts +3 -3
- package/dist/components/badge.js +7 -7
- package/dist/components/breadcrumb.cjs +6 -8
- package/dist/components/breadcrumb.d.ts +8 -8
- package/dist/components/breadcrumb.js +6 -8
- package/dist/components/button-group.cjs +8 -8
- package/dist/components/button-group.d.ts +5 -5
- package/dist/components/button-group.js +8 -8
- package/dist/components/button.cjs +17 -17
- package/dist/components/button.d.ts +6 -6
- package/dist/components/button.js +17 -17
- package/dist/components/calendar.cjs +35 -35
- package/dist/components/calendar.d.ts +5 -5
- package/dist/components/calendar.js +35 -35
- package/dist/components/card.cjs +7 -7
- package/dist/components/card.d.ts +8 -8
- package/dist/components/card.js +7 -7
- package/dist/components/carousel.cjs +20 -20
- package/dist/components/carousel.d.ts +10 -10
- package/dist/components/carousel.js +20 -20
- package/dist/components/chart.cjs +42 -42
- package/dist/components/chart.d.ts +12 -11
- package/dist/components/chart.js +42 -42
- package/dist/components/checkbox-cards.cjs +2 -2
- package/dist/components/checkbox-cards.d.ts +2 -2
- package/dist/components/checkbox-cards.js +2 -2
- package/dist/components/checkbox-group.cjs +2 -2
- package/dist/components/checkbox-group.d.ts +2 -2
- package/dist/components/checkbox-group.js +2 -2
- package/dist/components/checkbox.cjs +1 -1
- package/dist/components/checkbox.d.ts +2 -2
- package/dist/components/checkbox.js +1 -1
- package/dist/components/collapsible.d.ts +2 -2
- package/dist/components/command.cjs +10 -10
- package/dist/components/command.d.ts +4 -4
- package/dist/components/command.js +10 -10
- package/dist/components/context-menu.cjs +10 -10
- package/dist/components/context-menu.d.ts +4 -4
- package/dist/components/context-menu.js +10 -10
- package/dist/components/dialog.cjs +12 -12
- package/dist/components/dialog.d.ts +10 -10
- package/dist/components/dialog.js +12 -12
- package/dist/components/drawer.cjs +9 -9
- package/dist/components/drawer.d.ts +9 -9
- package/dist/components/drawer.js +9 -9
- package/dist/components/dropdown-menu.cjs +10 -10
- package/dist/components/dropdown-menu.d.ts +4 -4
- package/dist/components/dropdown-menu.js +10 -10
- package/dist/components/empty.cjs +10 -10
- package/dist/components/empty.d.ts +9 -9
- package/dist/components/empty.js +10 -10
- package/dist/components/field.cjs +17 -17
- package/dist/components/field.d.ts +14 -14
- package/dist/components/field.js +17 -17
- package/dist/components/form.cjs +8 -8
- package/dist/components/form.d.ts +10 -10
- package/dist/components/form.js +8 -8
- package/dist/components/hover-card.cjs +3 -3
- package/dist/components/hover-card.d.ts +2 -2
- package/dist/components/hover-card.js +3 -3
- package/dist/components/input-group.cjs +20 -20
- package/dist/components/input-group.d.ts +15 -15
- package/dist/components/input-group.js +20 -20
- package/dist/components/input-number.cjs +7 -7
- package/dist/components/input-number.d.ts +2 -2
- package/dist/components/input-number.js +7 -7
- package/dist/components/input-otp.cjs +4 -4
- package/dist/components/input-otp.d.ts +6 -6
- package/dist/components/input-otp.js +4 -4
- package/dist/components/input-password.cjs +6 -6
- package/dist/components/input-password.d.ts +3 -3
- package/dist/components/input-password.js +6 -6
- package/dist/components/input-search.cjs +4 -4
- package/dist/components/input-search.d.ts +3 -3
- package/dist/components/input-search.js +4 -4
- package/dist/components/input.cjs +1 -1
- package/dist/components/input.d.ts +2 -2
- package/dist/components/input.js +1 -1
- package/dist/components/item.cjs +23 -23
- package/dist/components/item.d.ts +12 -12
- package/dist/components/item.js +23 -23
- package/dist/components/kbd.cjs +2 -2
- package/dist/components/kbd.d.ts +3 -3
- package/dist/components/kbd.js +2 -2
- package/dist/components/label.cjs +1 -1
- package/dist/components/label.d.ts +2 -2
- package/dist/components/label.js +1 -1
- package/dist/components/menubar.cjs +13 -13
- package/dist/components/menubar.d.ts +4 -4
- package/dist/components/menubar.js +13 -13
- package/dist/components/native-select.cjs +2 -2
- package/dist/components/native-select.d.ts +4 -4
- package/dist/components/native-select.js +2 -2
- package/dist/components/navigation-menu.cjs +10 -10
- package/dist/components/navigation-menu.d.ts +2 -2
- package/dist/components/navigation-menu.js +10 -10
- package/dist/components/pagination.cjs +6 -6
- package/dist/components/pagination.d.ts +10 -10
- package/dist/components/pagination.js +6 -6
- package/dist/components/popover.cjs +3 -3
- package/dist/components/popover.d.ts +3 -3
- package/dist/components/popover.js +3 -3
- package/dist/components/progress-circle.cjs +22 -22
- package/dist/components/progress-circle.d.ts +5 -5
- package/dist/components/progress-circle.js +22 -22
- package/dist/components/progress.cjs +2 -2
- package/dist/components/progress.d.ts +2 -2
- package/dist/components/progress.js +2 -2
- package/dist/components/radio-cards.cjs +3 -3
- package/dist/components/radio-cards.d.ts +2 -2
- package/dist/components/radio-cards.js +3 -3
- package/dist/components/radio-group.cjs +3 -3
- package/dist/components/radio-group.d.ts +2 -2
- package/dist/components/radio-group.js +3 -3
- package/dist/components/radio.cjs +1 -1
- package/dist/components/radio.d.ts +2 -2
- package/dist/components/radio.js +1 -1
- package/dist/components/resizable.cjs +3 -3
- package/dist/components/resizable.d.ts +2 -2
- package/dist/components/resizable.js +3 -3
- package/dist/components/scroll-area.cjs +31 -31
- package/dist/components/scroll-area.d.ts +5 -5
- package/dist/components/scroll-area.js +31 -31
- package/dist/components/select.cjs +9 -9
- package/dist/components/select.d.ts +5 -5
- package/dist/components/select.js +9 -9
- package/dist/components/separator.cjs +9 -9
- package/dist/components/separator.d.ts +5 -5
- package/dist/components/separator.js +9 -9
- package/dist/components/sheet.cjs +17 -17
- package/dist/components/sheet.d.ts +9 -9
- package/dist/components/sheet.js +17 -17
- package/dist/components/sidebar.cjs +65 -65
- package/dist/components/sidebar.d.ts +31 -31
- package/dist/components/sidebar.js +65 -65
- package/dist/components/skeleton.cjs +1 -1
- package/dist/components/skeleton.d.ts +2 -2
- package/dist/components/skeleton.js +1 -1
- package/dist/components/slider.cjs +4 -4
- package/dist/components/slider.d.ts +2 -2
- package/dist/components/slider.js +4 -4
- package/dist/components/sonner.cjs +4 -4
- package/dist/components/sonner.d.ts +3 -3
- package/dist/components/sonner.js +4 -4
- package/dist/components/spinner.cjs +5 -5
- package/dist/components/spinner.d.ts +2 -2
- package/dist/components/spinner.js +5 -5
- package/dist/components/switch.cjs +2 -2
- package/dist/components/switch.d.ts +2 -2
- package/dist/components/switch.js +2 -2
- package/dist/components/table.cjs +8 -8
- package/dist/components/table.d.ts +9 -9
- package/dist/components/table.js +8 -8
- package/dist/components/tabs.cjs +4 -4
- package/dist/components/tabs.d.ts +2 -2
- package/dist/components/tabs.js +4 -4
- package/dist/components/textarea.cjs +1 -1
- package/dist/components/textarea.d.ts +2 -2
- package/dist/components/textarea.js +1 -1
- package/dist/components/toggle-group.cjs +5 -5
- package/dist/components/toggle-group.d.ts +4 -4
- package/dist/components/toggle-group.js +5 -5
- package/dist/components/toggle.cjs +8 -8
- package/dist/components/toggle.d.ts +3 -3
- package/dist/components/toggle.js +8 -8
- package/dist/components/tooltip.cjs +2 -2
- package/dist/components/tooltip.d.ts +3 -3
- package/dist/components/tooltip.js +2 -2
- package/dist/css/preset.css +4 -4
- package/dist/css/style.css +3 -3
- package/dist/hooks/use-copy-to-clipboard.cjs +1 -1
- package/dist/hooks/use-copy-to-clipboard.d.ts +1 -1
- package/dist/hooks/use-copy-to-clipboard.js +1 -1
- package/dist/hooks/use-media-query.cjs +3 -3
- package/dist/hooks/use-media-query.js +3 -3
- package/dist/hooks/use-mutation-observer.d.ts +1 -1
- package/dist/hooks/use-pagination.cjs +1 -1
- package/dist/hooks/use-pagination.js +1 -1
- package/dist/index.d.ts +130 -130
- package/dist/primitives/checkbox-group.cjs +3 -3
- package/dist/primitives/checkbox-group.d.ts +11 -11
- package/dist/primitives/checkbox-group.js +3 -3
- package/dist/primitives/input-number.cjs +46 -46
- package/dist/primitives/input-number.d.ts +8 -8
- package/dist/primitives/input-number.js +46 -46
- package/dist/primitives/input.cjs +7 -7
- package/dist/primitives/input.d.ts +4 -4
- package/dist/primitives/input.js +7 -7
- package/dist/primitives/progress-circle.cjs +8 -8
- package/dist/primitives/progress-circle.d.ts +7 -7
- package/dist/primitives/progress-circle.js +8 -8
- package/package.json +38 -42
|
@@ -40,7 +40,7 @@ const react_context_namespaceObject = require("@radix-ui/react-context");
|
|
|
40
40
|
const react_use_controllable_state_namespaceObject = require("@radix-ui/react-use-controllable-state");
|
|
41
41
|
const external_react_namespaceObject = require("react");
|
|
42
42
|
const external_input_cjs_namespaceObject = require("./input.cjs");
|
|
43
|
-
const NUMBER_INPUT_NAME =
|
|
43
|
+
const NUMBER_INPUT_NAME = "InputNumber";
|
|
44
44
|
const [createInputNumberContext, createInputNumberScope] = (0, react_context_namespaceObject.createContextScope)(NUMBER_INPUT_NAME, [
|
|
45
45
|
external_input_cjs_namespaceObject.createInputScope
|
|
46
46
|
]);
|
|
@@ -49,7 +49,7 @@ const [InputNumberContextProvider, useInputNumberContext] = createInputNumberCon
|
|
|
49
49
|
function InputNumber(numberInputProps) {
|
|
50
50
|
const { __scopeInputNumber, ariaDecrementLabel, ariaIncrementLabel, defaultValue, formatOptions = {
|
|
51
51
|
minimumFractionDigits: 0,
|
|
52
|
-
style:
|
|
52
|
+
style: "decimal"
|
|
53
53
|
}, id, locale, max, min, onChange, step = 1, value: valueProperty, ...props } = numberInputProps;
|
|
54
54
|
const inputScope = useInputScope(__scopeInputNumber);
|
|
55
55
|
const inputRef = (0, external_react_namespaceObject.useRef)(null);
|
|
@@ -62,20 +62,20 @@ function InputNumber(numberInputProps) {
|
|
|
62
62
|
locale
|
|
63
63
|
]);
|
|
64
64
|
const formatValue = (0, external_react_namespaceObject.useCallback)((inputValue)=>{
|
|
65
|
-
if (void 0 === inputValue || Number.isNaN(inputValue)) return
|
|
65
|
+
if (void 0 === inputValue || Number.isNaN(inputValue)) return "";
|
|
66
66
|
return new Intl.NumberFormat(locale, formatOptions).format(inputValue);
|
|
67
67
|
}, [
|
|
68
68
|
formatOptions,
|
|
69
69
|
locale
|
|
70
70
|
]);
|
|
71
71
|
const parseValue = (0, external_react_namespaceObject.useCallback)((inputValue)=>{
|
|
72
|
-
if (
|
|
73
|
-
if (
|
|
74
|
-
const cleanedValue = inputValue.trim().replaceAll(/[^\d.,\-()]/g,
|
|
75
|
-
if (
|
|
72
|
+
if ("number" == typeof inputValue) return clamp(inputValue, min, max);
|
|
73
|
+
if ("string" != typeof inputValue) return NaN;
|
|
74
|
+
const cleanedValue = inputValue.trim().replaceAll(/[^\d.,\-()]/g, "");
|
|
75
|
+
if ("" === cleanedValue) return NaN;
|
|
76
76
|
const normalizedValue = normalizeInputValue(cleanedValue, thousandSeparator, decimalSeparator);
|
|
77
77
|
let parsedValue = Number.parseFloat(normalizedValue);
|
|
78
|
-
if (
|
|
78
|
+
if ("percent" === formatOptions.style) parsedValue /= 100;
|
|
79
79
|
return Number.isNaN(parsedValue) ? 0 : clamp(parsedValue, min, max);
|
|
80
80
|
}, [
|
|
81
81
|
decimalSeparator,
|
|
@@ -152,7 +152,7 @@ function InputNumber(numberInputProps) {
|
|
|
152
152
|
})
|
|
153
153
|
});
|
|
154
154
|
}
|
|
155
|
-
const NUMBER_INPUT_FIELD_NAME =
|
|
155
|
+
const NUMBER_INPUT_FIELD_NAME = "InputNumberField";
|
|
156
156
|
function InputNumberField({ __scopeInputNumber, onBlur, onKeyDown, ...props }) {
|
|
157
157
|
const inputScope = useInputScope(__scopeInputNumber);
|
|
158
158
|
const { defaultValue, disabled, formatValue, id, inputRef, max, min, onChange, onDecrement, onDecrementToMin, onIncrement, onIncrementToMax, parseValue, readOnly, step, value } = useInputNumberContext(NUMBER_INPUT_FIELD_NAME, __scopeInputNumber);
|
|
@@ -168,19 +168,19 @@ function InputNumberField({ __scopeInputNumber, onBlur, onKeyDown, ...props }) {
|
|
|
168
168
|
]);
|
|
169
169
|
const handleKeyDown = (0, external_react_namespaceObject.useCallback)((event)=>{
|
|
170
170
|
switch(event.key){
|
|
171
|
-
case
|
|
171
|
+
case "ArrowUp":
|
|
172
172
|
onIncrement();
|
|
173
173
|
event.preventDefault();
|
|
174
174
|
break;
|
|
175
|
-
case
|
|
175
|
+
case "PageUp":
|
|
176
176
|
onIncrementToMax();
|
|
177
177
|
event.preventDefault();
|
|
178
178
|
break;
|
|
179
|
-
case
|
|
179
|
+
case "ArrowDown":
|
|
180
180
|
onDecrement();
|
|
181
181
|
event.preventDefault();
|
|
182
182
|
break;
|
|
183
|
-
case
|
|
183
|
+
case "PageDown":
|
|
184
184
|
onDecrementToMin();
|
|
185
185
|
event.preventDefault();
|
|
186
186
|
break;
|
|
@@ -195,23 +195,23 @@ function InputNumberField({ __scopeInputNumber, onBlur, onKeyDown, ...props }) {
|
|
|
195
195
|
]);
|
|
196
196
|
const handleKeyDownPrevent = (0, external_react_namespaceObject.useCallback)((event)=>{
|
|
197
197
|
switch(event.key){
|
|
198
|
-
case
|
|
199
|
-
case
|
|
200
|
-
case
|
|
201
|
-
case
|
|
202
|
-
case
|
|
203
|
-
case
|
|
204
|
-
case
|
|
205
|
-
case
|
|
206
|
-
case
|
|
207
|
-
case
|
|
208
|
-
case
|
|
209
|
-
case
|
|
210
|
-
case
|
|
211
|
-
case
|
|
212
|
-
case
|
|
213
|
-
case
|
|
214
|
-
case
|
|
198
|
+
case "ArrowUp":
|
|
199
|
+
case "ArrowDown":
|
|
200
|
+
case "ArrowLeft":
|
|
201
|
+
case "ArrowRight":
|
|
202
|
+
case "PageUp":
|
|
203
|
+
case "PageDown":
|
|
204
|
+
case "Tab":
|
|
205
|
+
case "Escape":
|
|
206
|
+
case "Enter":
|
|
207
|
+
case "Backspace":
|
|
208
|
+
case "Delete":
|
|
209
|
+
case "Home":
|
|
210
|
+
case "End":
|
|
211
|
+
case ".":
|
|
212
|
+
case ",":
|
|
213
|
+
case "-":
|
|
214
|
+
case "%":
|
|
215
215
|
return;
|
|
216
216
|
default:
|
|
217
217
|
if (isNumberKey(event.key) || isModifierKey(event) || isFunctionKey(event.key)) return;
|
|
@@ -220,7 +220,7 @@ function InputNumberField({ __scopeInputNumber, onBlur, onKeyDown, ...props }) {
|
|
|
220
220
|
}, []);
|
|
221
221
|
const handleKeyDownEnter = (0, external_react_namespaceObject.useCallback)((event)=>{
|
|
222
222
|
const inputElement = inputRef.current;
|
|
223
|
-
if (
|
|
223
|
+
if ("Enter" !== event.key || !inputElement) return;
|
|
224
224
|
const numericValue = parseValue(inputElement.value);
|
|
225
225
|
const formattedValue = formatValue(numericValue);
|
|
226
226
|
if (formattedValue !== inputElement.value) inputElement.value = formattedValue;
|
|
@@ -248,9 +248,9 @@ function InputNumberField({ __scopeInputNumber, onBlur, onKeyDown, ...props }) {
|
|
|
248
248
|
else onDecrement();
|
|
249
249
|
};
|
|
250
250
|
const inputElement = inputRef.current;
|
|
251
|
-
inputElement?.addEventListener(
|
|
251
|
+
inputElement?.addEventListener("wheel", handleWheel);
|
|
252
252
|
return ()=>{
|
|
253
|
-
inputElement?.removeEventListener(
|
|
253
|
+
inputElement?.removeEventListener("wheel", handleWheel);
|
|
254
254
|
};
|
|
255
255
|
}, [
|
|
256
256
|
onIncrement,
|
|
@@ -274,9 +274,9 @@ function InputNumberField({ __scopeInputNumber, onBlur, onKeyDown, ...props }) {
|
|
|
274
274
|
onChange(parseValue(defaultValue));
|
|
275
275
|
};
|
|
276
276
|
const form = inputElement.form;
|
|
277
|
-
form?.addEventListener(
|
|
277
|
+
form?.addEventListener("reset", handleReset);
|
|
278
278
|
return ()=>{
|
|
279
|
-
form?.removeEventListener(
|
|
279
|
+
form?.removeEventListener("reset", handleReset);
|
|
280
280
|
};
|
|
281
281
|
}, [
|
|
282
282
|
defaultValue,
|
|
@@ -300,7 +300,7 @@ function InputNumberField({ __scopeInputNumber, onBlur, onKeyDown, ...props }) {
|
|
|
300
300
|
...props
|
|
301
301
|
});
|
|
302
302
|
}
|
|
303
|
-
const NUMBER_STEPPER_BUTTON_NAME =
|
|
303
|
+
const NUMBER_STEPPER_BUTTON_NAME = "NumberStepperButton";
|
|
304
304
|
function NumberStepperButton({ __scopeInputNumber, operation, ...props }) {
|
|
305
305
|
const { ariaDecrementLabel, ariaIncrementLabel, disabled, id, max, min, onDecrement, onIncrement, value } = useInputNumberContext(NUMBER_STEPPER_BUTTON_NAME, __scopeInputNumber);
|
|
306
306
|
const isDisabled = (0, external_react_namespaceObject.useMemo)(()=>{
|
|
@@ -330,7 +330,7 @@ function NumberStepperButton({ __scopeInputNumber, operation, ...props }) {
|
|
|
330
330
|
}
|
|
331
331
|
}, []);
|
|
332
332
|
const handlePointerDown = (0, external_react_namespaceObject.useCallback)(()=>{
|
|
333
|
-
const action =
|
|
333
|
+
const action = "increment" === operation ? onIncrement : onDecrement;
|
|
334
334
|
startActionInterval(action);
|
|
335
335
|
}, [
|
|
336
336
|
onDecrement,
|
|
@@ -342,9 +342,9 @@ function NumberStepperButton({ __scopeInputNumber, operation, ...props }) {
|
|
|
342
342
|
event.preventDefault();
|
|
343
343
|
}, []);
|
|
344
344
|
const handleKeyDown = (0, external_react_namespaceObject.useCallback)((event)=>{
|
|
345
|
-
if (
|
|
345
|
+
if ("Enter" === event.key || " " === event.key) {
|
|
346
346
|
event.preventDefault();
|
|
347
|
-
const action =
|
|
347
|
+
const action = "increment" === operation ? onIncrement : onDecrement;
|
|
348
348
|
action();
|
|
349
349
|
}
|
|
350
350
|
}, [
|
|
@@ -354,7 +354,7 @@ function NumberStepperButton({ __scopeInputNumber, operation, ...props }) {
|
|
|
354
354
|
]);
|
|
355
355
|
return /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)("button", {
|
|
356
356
|
"aria-controls": id,
|
|
357
|
-
"aria-label":
|
|
357
|
+
"aria-label": "increment" === operation ? ariaIncrementLabel : ariaDecrementLabel,
|
|
358
358
|
"aria-live": "polite",
|
|
359
359
|
disabled: isDisabled,
|
|
360
360
|
type: "button",
|
|
@@ -387,11 +387,11 @@ function chain(...callbacks) {
|
|
|
387
387
|
function getNumberFormatSeparators(locale) {
|
|
388
388
|
const numberFormat = new Intl.NumberFormat(locale);
|
|
389
389
|
const parts = numberFormat.formatToParts(12345.6);
|
|
390
|
-
let thousandSeparator =
|
|
391
|
-
let decimalSeparator =
|
|
390
|
+
let thousandSeparator = "";
|
|
391
|
+
let decimalSeparator = "";
|
|
392
392
|
for (const part of parts){
|
|
393
|
-
if (
|
|
394
|
-
if (
|
|
393
|
+
if ("group" === part.type) thousandSeparator = part.value;
|
|
394
|
+
if ("decimal" === part.type) decimalSeparator = part.value;
|
|
395
395
|
if (thousandSeparator && decimalSeparator) break;
|
|
396
396
|
}
|
|
397
397
|
return {
|
|
@@ -400,13 +400,13 @@ function getNumberFormatSeparators(locale) {
|
|
|
400
400
|
};
|
|
401
401
|
}
|
|
402
402
|
function normalizeInputValue(value, thousandSeparator, decimalSeparator) {
|
|
403
|
-
return value.replaceAll(new RegExp(`\\${thousandSeparator}`,
|
|
403
|
+
return value.replaceAll(new RegExp(`\\${thousandSeparator}`, "g"), "").replace(new RegExp(`\\${decimalSeparator}`), ".").replaceAll(/[()]/g, "-");
|
|
404
404
|
}
|
|
405
405
|
function isModifierKey(event) {
|
|
406
406
|
return event.ctrlKey || event.altKey || event.metaKey || event.shiftKey;
|
|
407
407
|
}
|
|
408
408
|
function isFunctionKey(key) {
|
|
409
|
-
return key.startsWith(
|
|
409
|
+
return key.startsWith("F") && key.length > 1;
|
|
410
410
|
}
|
|
411
411
|
function isNumberKey(key) {
|
|
412
412
|
return !Number.isNaN(Number(key));
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { Scope } from
|
|
2
|
-
import type { ComponentProps, JSX } from
|
|
3
|
-
import * as InputPrimitive from
|
|
1
|
+
import type { Scope } from "@radix-ui/react-context";
|
|
2
|
+
import type { ComponentProps, JSX } from "react";
|
|
3
|
+
import * as InputPrimitive from "./input";
|
|
4
4
|
/**
|
|
5
5
|
* Props that include an optional scope for the InputNumber component.
|
|
6
6
|
*/
|
|
@@ -40,23 +40,23 @@ declare function InputNumber(numberInputProps: ScopedProps<InputNumberProps>): J
|
|
|
40
40
|
/**
|
|
41
41
|
* Defines the props for the `InputNumberField` component.
|
|
42
42
|
*/
|
|
43
|
-
type InputNumberFieldProps = Omit<ComponentProps<typeof InputPrimitive.Field>,
|
|
43
|
+
type InputNumberFieldProps = Omit<ComponentProps<typeof InputPrimitive.Field>, "defaultValue" | "disabled" | "id" | "max" | "min" | "onChange" | "prefix" | "readOnly" | "step" | "value">;
|
|
44
44
|
declare function InputNumberField({ __scopeInputNumber, onBlur, onKeyDown, ...props }: ScopedProps<InputNumberFieldProps>): JSX.Element;
|
|
45
45
|
/**
|
|
46
46
|
* Props for the NumberStepperButton component.
|
|
47
47
|
*/
|
|
48
|
-
interface NumberStepperButtonProps extends ComponentProps<
|
|
48
|
+
interface NumberStepperButtonProps extends ComponentProps<"button"> {
|
|
49
49
|
/**
|
|
50
50
|
* The operation to perform when the button is pressed.
|
|
51
51
|
* - `'increment'`: Increases the value.
|
|
52
52
|
* - `'decrement'`: Decreases the value.
|
|
53
53
|
*/
|
|
54
|
-
operation:
|
|
54
|
+
operation: "decrement" | "increment";
|
|
55
55
|
}
|
|
56
56
|
declare function NumberStepperButton({ __scopeInputNumber, operation, ...props }: ScopedProps<NumberStepperButtonProps>): JSX.Element;
|
|
57
|
-
type InputNumberIncrementButtonProps = Omit<ComponentProps<typeof NumberStepperButton>,
|
|
57
|
+
type InputNumberIncrementButtonProps = Omit<ComponentProps<typeof NumberStepperButton>, "operation">;
|
|
58
58
|
declare function InputNumberIncrementButton(props: InputNumberIncrementButtonProps): JSX.Element;
|
|
59
|
-
type InputNumberDecrementButtonProps = Omit<ComponentProps<typeof NumberStepperButton>,
|
|
59
|
+
type InputNumberDecrementButtonProps = Omit<ComponentProps<typeof NumberStepperButton>, "operation">;
|
|
60
60
|
declare function InputNumberDecrementButton(props: InputNumberDecrementButtonProps): JSX.Element;
|
|
61
61
|
export { createInputNumberScope, InputNumberDecrementButton as DecrementButton, InputNumberField as Field, InputNumberIncrementButton as IncrementButton, InputNumber, InputNumberDecrementButton, InputNumberField, InputNumberIncrementButton, InputNumber as Root, };
|
|
62
62
|
export type { InputNumberDecrementButtonProps, InputNumberFieldProps, InputNumberIncrementButtonProps, InputNumberProps, };
|
|
@@ -4,7 +4,7 @@ import { createContextScope } from "@radix-ui/react-context";
|
|
|
4
4
|
import { useControllableState } from "@radix-ui/react-use-controllable-state";
|
|
5
5
|
import { useCallback, useEffect, useMemo, useRef } from "react";
|
|
6
6
|
import { Field, Root, createInputScope } from "./input.js";
|
|
7
|
-
const NUMBER_INPUT_NAME =
|
|
7
|
+
const NUMBER_INPUT_NAME = "InputNumber";
|
|
8
8
|
const [createInputNumberContext, createInputNumberScope] = createContextScope(NUMBER_INPUT_NAME, [
|
|
9
9
|
createInputScope
|
|
10
10
|
]);
|
|
@@ -13,7 +13,7 @@ const [InputNumberContextProvider, useInputNumberContext] = createInputNumberCon
|
|
|
13
13
|
function InputNumber(numberInputProps) {
|
|
14
14
|
const { __scopeInputNumber, ariaDecrementLabel, ariaIncrementLabel, defaultValue, formatOptions = {
|
|
15
15
|
minimumFractionDigits: 0,
|
|
16
|
-
style:
|
|
16
|
+
style: "decimal"
|
|
17
17
|
}, id, locale, max, min, onChange, step = 1, value: valueProperty, ...props } = numberInputProps;
|
|
18
18
|
const inputScope = useInputScope(__scopeInputNumber);
|
|
19
19
|
const inputRef = useRef(null);
|
|
@@ -26,20 +26,20 @@ function InputNumber(numberInputProps) {
|
|
|
26
26
|
locale
|
|
27
27
|
]);
|
|
28
28
|
const formatValue = useCallback((inputValue)=>{
|
|
29
|
-
if (void 0 === inputValue || Number.isNaN(inputValue)) return
|
|
29
|
+
if (void 0 === inputValue || Number.isNaN(inputValue)) return "";
|
|
30
30
|
return new Intl.NumberFormat(locale, formatOptions).format(inputValue);
|
|
31
31
|
}, [
|
|
32
32
|
formatOptions,
|
|
33
33
|
locale
|
|
34
34
|
]);
|
|
35
35
|
const parseValue = useCallback((inputValue)=>{
|
|
36
|
-
if (
|
|
37
|
-
if (
|
|
38
|
-
const cleanedValue = inputValue.trim().replaceAll(/[^\d.,\-()]/g,
|
|
39
|
-
if (
|
|
36
|
+
if ("number" == typeof inputValue) return clamp(inputValue, min, max);
|
|
37
|
+
if ("string" != typeof inputValue) return NaN;
|
|
38
|
+
const cleanedValue = inputValue.trim().replaceAll(/[^\d.,\-()]/g, "");
|
|
39
|
+
if ("" === cleanedValue) return NaN;
|
|
40
40
|
const normalizedValue = normalizeInputValue(cleanedValue, thousandSeparator, decimalSeparator);
|
|
41
41
|
let parsedValue = Number.parseFloat(normalizedValue);
|
|
42
|
-
if (
|
|
42
|
+
if ("percent" === formatOptions.style) parsedValue /= 100;
|
|
43
43
|
return Number.isNaN(parsedValue) ? 0 : clamp(parsedValue, min, max);
|
|
44
44
|
}, [
|
|
45
45
|
decimalSeparator,
|
|
@@ -116,7 +116,7 @@ function InputNumber(numberInputProps) {
|
|
|
116
116
|
})
|
|
117
117
|
});
|
|
118
118
|
}
|
|
119
|
-
const NUMBER_INPUT_FIELD_NAME =
|
|
119
|
+
const NUMBER_INPUT_FIELD_NAME = "InputNumberField";
|
|
120
120
|
function InputNumberField({ __scopeInputNumber, onBlur, onKeyDown, ...props }) {
|
|
121
121
|
const inputScope = useInputScope(__scopeInputNumber);
|
|
122
122
|
const { defaultValue, disabled, formatValue, id, inputRef, max, min, onChange, onDecrement, onDecrementToMin, onIncrement, onIncrementToMax, parseValue, readOnly, step, value } = useInputNumberContext(NUMBER_INPUT_FIELD_NAME, __scopeInputNumber);
|
|
@@ -132,19 +132,19 @@ function InputNumberField({ __scopeInputNumber, onBlur, onKeyDown, ...props }) {
|
|
|
132
132
|
]);
|
|
133
133
|
const handleKeyDown = useCallback((event)=>{
|
|
134
134
|
switch(event.key){
|
|
135
|
-
case
|
|
135
|
+
case "ArrowUp":
|
|
136
136
|
onIncrement();
|
|
137
137
|
event.preventDefault();
|
|
138
138
|
break;
|
|
139
|
-
case
|
|
139
|
+
case "PageUp":
|
|
140
140
|
onIncrementToMax();
|
|
141
141
|
event.preventDefault();
|
|
142
142
|
break;
|
|
143
|
-
case
|
|
143
|
+
case "ArrowDown":
|
|
144
144
|
onDecrement();
|
|
145
145
|
event.preventDefault();
|
|
146
146
|
break;
|
|
147
|
-
case
|
|
147
|
+
case "PageDown":
|
|
148
148
|
onDecrementToMin();
|
|
149
149
|
event.preventDefault();
|
|
150
150
|
break;
|
|
@@ -159,23 +159,23 @@ function InputNumberField({ __scopeInputNumber, onBlur, onKeyDown, ...props }) {
|
|
|
159
159
|
]);
|
|
160
160
|
const handleKeyDownPrevent = useCallback((event)=>{
|
|
161
161
|
switch(event.key){
|
|
162
|
-
case
|
|
163
|
-
case
|
|
164
|
-
case
|
|
165
|
-
case
|
|
166
|
-
case
|
|
167
|
-
case
|
|
168
|
-
case
|
|
169
|
-
case
|
|
170
|
-
case
|
|
171
|
-
case
|
|
172
|
-
case
|
|
173
|
-
case
|
|
174
|
-
case
|
|
175
|
-
case
|
|
176
|
-
case
|
|
177
|
-
case
|
|
178
|
-
case
|
|
162
|
+
case "ArrowUp":
|
|
163
|
+
case "ArrowDown":
|
|
164
|
+
case "ArrowLeft":
|
|
165
|
+
case "ArrowRight":
|
|
166
|
+
case "PageUp":
|
|
167
|
+
case "PageDown":
|
|
168
|
+
case "Tab":
|
|
169
|
+
case "Escape":
|
|
170
|
+
case "Enter":
|
|
171
|
+
case "Backspace":
|
|
172
|
+
case "Delete":
|
|
173
|
+
case "Home":
|
|
174
|
+
case "End":
|
|
175
|
+
case ".":
|
|
176
|
+
case ",":
|
|
177
|
+
case "-":
|
|
178
|
+
case "%":
|
|
179
179
|
return;
|
|
180
180
|
default:
|
|
181
181
|
if (isNumberKey(event.key) || isModifierKey(event) || isFunctionKey(event.key)) return;
|
|
@@ -184,7 +184,7 @@ function InputNumberField({ __scopeInputNumber, onBlur, onKeyDown, ...props }) {
|
|
|
184
184
|
}, []);
|
|
185
185
|
const handleKeyDownEnter = useCallback((event)=>{
|
|
186
186
|
const inputElement = inputRef.current;
|
|
187
|
-
if (
|
|
187
|
+
if ("Enter" !== event.key || !inputElement) return;
|
|
188
188
|
const numericValue = parseValue(inputElement.value);
|
|
189
189
|
const formattedValue = formatValue(numericValue);
|
|
190
190
|
if (formattedValue !== inputElement.value) inputElement.value = formattedValue;
|
|
@@ -212,9 +212,9 @@ function InputNumberField({ __scopeInputNumber, onBlur, onKeyDown, ...props }) {
|
|
|
212
212
|
else onDecrement();
|
|
213
213
|
};
|
|
214
214
|
const inputElement = inputRef.current;
|
|
215
|
-
inputElement?.addEventListener(
|
|
215
|
+
inputElement?.addEventListener("wheel", handleWheel);
|
|
216
216
|
return ()=>{
|
|
217
|
-
inputElement?.removeEventListener(
|
|
217
|
+
inputElement?.removeEventListener("wheel", handleWheel);
|
|
218
218
|
};
|
|
219
219
|
}, [
|
|
220
220
|
onIncrement,
|
|
@@ -238,9 +238,9 @@ function InputNumberField({ __scopeInputNumber, onBlur, onKeyDown, ...props }) {
|
|
|
238
238
|
onChange(parseValue(defaultValue));
|
|
239
239
|
};
|
|
240
240
|
const form = inputElement.form;
|
|
241
|
-
form?.addEventListener(
|
|
241
|
+
form?.addEventListener("reset", handleReset);
|
|
242
242
|
return ()=>{
|
|
243
|
-
form?.removeEventListener(
|
|
243
|
+
form?.removeEventListener("reset", handleReset);
|
|
244
244
|
};
|
|
245
245
|
}, [
|
|
246
246
|
defaultValue,
|
|
@@ -264,7 +264,7 @@ function InputNumberField({ __scopeInputNumber, onBlur, onKeyDown, ...props }) {
|
|
|
264
264
|
...props
|
|
265
265
|
});
|
|
266
266
|
}
|
|
267
|
-
const NUMBER_STEPPER_BUTTON_NAME =
|
|
267
|
+
const NUMBER_STEPPER_BUTTON_NAME = "NumberStepperButton";
|
|
268
268
|
function NumberStepperButton({ __scopeInputNumber, operation, ...props }) {
|
|
269
269
|
const { ariaDecrementLabel, ariaIncrementLabel, disabled, id, max, min, onDecrement, onIncrement, value } = useInputNumberContext(NUMBER_STEPPER_BUTTON_NAME, __scopeInputNumber);
|
|
270
270
|
const isDisabled = useMemo(()=>{
|
|
@@ -294,7 +294,7 @@ function NumberStepperButton({ __scopeInputNumber, operation, ...props }) {
|
|
|
294
294
|
}
|
|
295
295
|
}, []);
|
|
296
296
|
const handlePointerDown = useCallback(()=>{
|
|
297
|
-
const action =
|
|
297
|
+
const action = "increment" === operation ? onIncrement : onDecrement;
|
|
298
298
|
startActionInterval(action);
|
|
299
299
|
}, [
|
|
300
300
|
onDecrement,
|
|
@@ -306,9 +306,9 @@ function NumberStepperButton({ __scopeInputNumber, operation, ...props }) {
|
|
|
306
306
|
event.preventDefault();
|
|
307
307
|
}, []);
|
|
308
308
|
const handleKeyDown = useCallback((event)=>{
|
|
309
|
-
if (
|
|
309
|
+
if ("Enter" === event.key || " " === event.key) {
|
|
310
310
|
event.preventDefault();
|
|
311
|
-
const action =
|
|
311
|
+
const action = "increment" === operation ? onIncrement : onDecrement;
|
|
312
312
|
action();
|
|
313
313
|
}
|
|
314
314
|
}, [
|
|
@@ -318,7 +318,7 @@ function NumberStepperButton({ __scopeInputNumber, operation, ...props }) {
|
|
|
318
318
|
]);
|
|
319
319
|
return /*#__PURE__*/ jsx("button", {
|
|
320
320
|
"aria-controls": id,
|
|
321
|
-
"aria-label":
|
|
321
|
+
"aria-label": "increment" === operation ? ariaIncrementLabel : ariaDecrementLabel,
|
|
322
322
|
"aria-live": "polite",
|
|
323
323
|
disabled: isDisabled,
|
|
324
324
|
type: "button",
|
|
@@ -351,11 +351,11 @@ function chain(...callbacks) {
|
|
|
351
351
|
function getNumberFormatSeparators(locale) {
|
|
352
352
|
const numberFormat = new Intl.NumberFormat(locale);
|
|
353
353
|
const parts = numberFormat.formatToParts(12345.6);
|
|
354
|
-
let thousandSeparator =
|
|
355
|
-
let decimalSeparator =
|
|
354
|
+
let thousandSeparator = "";
|
|
355
|
+
let decimalSeparator = "";
|
|
356
356
|
for (const part of parts){
|
|
357
|
-
if (
|
|
358
|
-
if (
|
|
357
|
+
if ("group" === part.type) thousandSeparator = part.value;
|
|
358
|
+
if ("decimal" === part.type) decimalSeparator = part.value;
|
|
359
359
|
if (thousandSeparator && decimalSeparator) break;
|
|
360
360
|
}
|
|
361
361
|
return {
|
|
@@ -364,13 +364,13 @@ function getNumberFormatSeparators(locale) {
|
|
|
364
364
|
};
|
|
365
365
|
}
|
|
366
366
|
function normalizeInputValue(value, thousandSeparator, decimalSeparator) {
|
|
367
|
-
return value.replaceAll(new RegExp(`\\${thousandSeparator}`,
|
|
367
|
+
return value.replaceAll(new RegExp(`\\${thousandSeparator}`, "g"), "").replace(new RegExp(`\\${decimalSeparator}`), ".").replaceAll(/[()]/g, "-");
|
|
368
368
|
}
|
|
369
369
|
function isModifierKey(event) {
|
|
370
370
|
return event.ctrlKey || event.altKey || event.metaKey || event.shiftKey;
|
|
371
371
|
}
|
|
372
372
|
function isFunctionKey(key) {
|
|
373
|
-
return key.startsWith(
|
|
373
|
+
return key.startsWith("F") && key.length > 1;
|
|
374
374
|
}
|
|
375
375
|
function isNumberKey(key) {
|
|
376
376
|
return !Number.isNaN(Number(key));
|
|
@@ -34,20 +34,20 @@ const jsx_runtime_namespaceObject = require("react/jsx-runtime");
|
|
|
34
34
|
const react_compose_refs_namespaceObject = require("@radix-ui/react-compose-refs");
|
|
35
35
|
const react_context_namespaceObject = require("@radix-ui/react-context");
|
|
36
36
|
const external_react_namespaceObject = require("react");
|
|
37
|
-
const INPUT_NAME =
|
|
37
|
+
const INPUT_NAME = "Input";
|
|
38
38
|
const [createInputContext, createInputScope] = (0, react_context_namespaceObject.createContextScope)(INPUT_NAME);
|
|
39
39
|
const [InputContextProvider, useInputContext] = createInputContext(INPUT_NAME);
|
|
40
40
|
function Input(inputProps) {
|
|
41
|
-
const { __scopeInput, children, disabled, loaderPosition =
|
|
41
|
+
const { __scopeInput, children, disabled, loaderPosition = "prefix", loading, prefix, readOnly, spinner, suffix, ...props } = inputProps;
|
|
42
42
|
const inputRef = (0, external_react_namespaceObject.useRef)(null);
|
|
43
43
|
const handlePointerDown = (event)=>{
|
|
44
44
|
const target = event.target;
|
|
45
|
-
if (
|
|
45
|
+
if ("input" === target.tagName.toLowerCase() || target.closest("input, a, button")) return void event.stopPropagation();
|
|
46
46
|
const inputElement = inputRef.current;
|
|
47
47
|
if (!inputElement) return;
|
|
48
48
|
if (document.activeElement === inputElement) return void event.preventDefault();
|
|
49
49
|
requestAnimationFrame(()=>{
|
|
50
|
-
if (
|
|
50
|
+
if ("file" === inputElement.type) return void inputElement.click();
|
|
51
51
|
if (document.activeElement !== inputElement) inputElement.focus();
|
|
52
52
|
});
|
|
53
53
|
};
|
|
@@ -63,14 +63,14 @@ function Input(inputProps) {
|
|
|
63
63
|
onPointerDown: handlePointerDown,
|
|
64
64
|
...props,
|
|
65
65
|
children: [
|
|
66
|
-
loading &&
|
|
66
|
+
loading && "prefix" === loaderPosition ? spinner : prefix,
|
|
67
67
|
children,
|
|
68
|
-
loading &&
|
|
68
|
+
loading && "suffix" === loaderPosition ? spinner : suffix
|
|
69
69
|
]
|
|
70
70
|
})
|
|
71
71
|
});
|
|
72
72
|
}
|
|
73
|
-
const INPUT_FIELD_NAME =
|
|
73
|
+
const INPUT_FIELD_NAME = "InputField";
|
|
74
74
|
function InputField({ __scopeInput, ...props }) {
|
|
75
75
|
const { disabled, inputRef, readOnly } = useInputContext(INPUT_FIELD_NAME, __scopeInput);
|
|
76
76
|
const composedInputRef = (0, react_compose_refs_namespaceObject.useComposedRefs)(inputRef);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { Scope } from
|
|
2
|
-
import type { ComponentProps, JSX, PropsWithChildren, ReactNode } from
|
|
1
|
+
import type { Scope } from "@radix-ui/react-context";
|
|
2
|
+
import type { ComponentProps, JSX, PropsWithChildren, ReactNode } from "react";
|
|
3
3
|
/**
|
|
4
4
|
* Type for adding scope to component props
|
|
5
5
|
*/
|
|
@@ -42,7 +42,7 @@ interface InputBehaviorProps {
|
|
|
42
42
|
/**
|
|
43
43
|
* Position of the loading spinner - either before or after the input
|
|
44
44
|
*/
|
|
45
|
-
loaderPosition?:
|
|
45
|
+
loaderPosition?: "prefix" | "suffix";
|
|
46
46
|
/**
|
|
47
47
|
* Whether the input is in the loading state
|
|
48
48
|
*/
|
|
@@ -60,7 +60,7 @@ declare function Input(inputProps: ScopedProps<InputProps>): JSX.Element;
|
|
|
60
60
|
/**
|
|
61
61
|
* Props for the InputField component
|
|
62
62
|
*/
|
|
63
|
-
type InputFieldProps = ComponentProps<
|
|
63
|
+
type InputFieldProps = ComponentProps<"input">;
|
|
64
64
|
declare function InputField({ __scopeInput, ...props }: ScopedProps<InputFieldProps>): JSX.Element;
|
|
65
65
|
export { createInputScope, InputField as Field, Input, InputField, Input as Root };
|
|
66
66
|
export type { InputFieldProps, InputProps };
|
package/dist/primitives/input.js
CHANGED
|
@@ -2,20 +2,20 @@ import { jsx, jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import { useComposedRefs } from "@radix-ui/react-compose-refs";
|
|
3
3
|
import { createContextScope } from "@radix-ui/react-context";
|
|
4
4
|
import { useRef } from "react";
|
|
5
|
-
const INPUT_NAME =
|
|
5
|
+
const INPUT_NAME = "Input";
|
|
6
6
|
const [createInputContext, createInputScope] = createContextScope(INPUT_NAME);
|
|
7
7
|
const [InputContextProvider, useInputContext] = createInputContext(INPUT_NAME);
|
|
8
8
|
function Input(inputProps) {
|
|
9
|
-
const { __scopeInput, children, disabled, loaderPosition =
|
|
9
|
+
const { __scopeInput, children, disabled, loaderPosition = "prefix", loading, prefix, readOnly, spinner, suffix, ...props } = inputProps;
|
|
10
10
|
const inputRef = useRef(null);
|
|
11
11
|
const handlePointerDown = (event)=>{
|
|
12
12
|
const target = event.target;
|
|
13
|
-
if (
|
|
13
|
+
if ("input" === target.tagName.toLowerCase() || target.closest("input, a, button")) return void event.stopPropagation();
|
|
14
14
|
const inputElement = inputRef.current;
|
|
15
15
|
if (!inputElement) return;
|
|
16
16
|
if (document.activeElement === inputElement) return void event.preventDefault();
|
|
17
17
|
requestAnimationFrame(()=>{
|
|
18
|
-
if (
|
|
18
|
+
if ("file" === inputElement.type) return void inputElement.click();
|
|
19
19
|
if (document.activeElement !== inputElement) inputElement.focus();
|
|
20
20
|
});
|
|
21
21
|
};
|
|
@@ -31,14 +31,14 @@ function Input(inputProps) {
|
|
|
31
31
|
onPointerDown: handlePointerDown,
|
|
32
32
|
...props,
|
|
33
33
|
children: [
|
|
34
|
-
loading &&
|
|
34
|
+
loading && "prefix" === loaderPosition ? spinner : prefix,
|
|
35
35
|
children,
|
|
36
|
-
loading &&
|
|
36
|
+
loading && "suffix" === loaderPosition ? spinner : suffix
|
|
37
37
|
]
|
|
38
38
|
})
|
|
39
39
|
});
|
|
40
40
|
}
|
|
41
|
-
const INPUT_FIELD_NAME =
|
|
41
|
+
const INPUT_FIELD_NAME = "InputField";
|
|
42
42
|
function InputField({ __scopeInput, ...props }) {
|
|
43
43
|
const { disabled, inputRef, readOnly } = useInputContext(INPUT_FIELD_NAME, __scopeInput);
|
|
44
44
|
const composedInputRef = useComposedRefs(inputRef);
|