@acusti/css-value-input 2.1.1 → 2.2.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.
@@ -1,5 +1,5 @@
1
1
  import { CSSValueType } from '../../css-values/src';
2
- import { ChangeEvent, FocusEvent, KeyboardEvent, ReactNode } from 'react';
2
+ import { ChangeEvent, FocusEvent, KeyboardEvent, ReactNode, Ref } from 'react';
3
3
  export type Props = {
4
4
  /**
5
5
  * Boolean indicating if the user can submit an empty value (i.e. clear
@@ -31,6 +31,7 @@ export type Props = {
31
31
  */
32
32
  onSubmitValue: (value: string) => unknown;
33
33
  placeholder?: string;
34
+ ref?: Ref<HTMLInputElement>;
34
35
  step?: number;
35
36
  tabIndex?: number;
36
37
  title?: string;
@@ -39,5 +40,4 @@ export type Props = {
39
40
  validator?: ((value: string) => boolean) | RegExp;
40
41
  value?: string;
41
42
  };
42
- declare const _default: import('react').ForwardRefExoticComponent<Props & import('react').RefAttributes<HTMLInputElement>>;
43
- export default _default;
43
+ export default function CSSValueInput({ allowEmpty, className, cssValueType, disabled, getValueAsNumber, icon, label, max, min, name, onBlur, onChange, onFocus, onKeyDown, onKeyUp, onSubmitValue, placeholder, ref, step, tabIndex, title, unit, validator, value: valueFromProps, }: Props): import("react/jsx-runtime").JSX.Element;
@@ -3,10 +3,10 @@ import { c } from "react/compiler-runtime";
3
3
  import { DEFAULT_UNIT_BY_CSS_VALUE_TYPE, DEFAULT_CSS_VALUE_TYPE, getCSSValueAsNumber, getUnitFromCSSValue, getCSSValueWithUnit, roundToPrecision } from "@acusti/css-values";
4
4
  import InputText from "@acusti/input-text";
5
5
  import clsx from "clsx";
6
- import { forwardRef, useRef, useImperativeHandle, useEffect } from "react";
6
+ import { useRef, useImperativeHandle, useState, useEffect } from "react";
7
7
  const ROOT_CLASS_NAME = "cssvalueinput";
8
- const CSSValueInput = forwardRef(function CSSValueInput2(t0, ref) {
9
- const $ = c(56);
8
+ function CSSValueInput(t0) {
9
+ const $ = c(57);
10
10
  const {
11
11
  allowEmpty: t1,
12
12
  className,
@@ -25,6 +25,7 @@ const CSSValueInput = forwardRef(function CSSValueInput2(t0, ref) {
25
25
  onKeyUp,
26
26
  onSubmitValue,
27
27
  placeholder,
28
+ ref,
28
29
  step: t4,
29
30
  tabIndex,
30
31
  title,
@@ -47,12 +48,12 @@ const CSSValueInput = forwardRef(function CSSValueInput2(t0, ref) {
47
48
  }
48
49
  useImperativeHandle(ref, t6);
49
50
  const value = typeof valueFromProps === "number" && !Number.isNaN(valueFromProps) ? `${valueFromProps}` : valueFromProps;
50
- const submittedValueRef = useRef(value ?? "");
51
+ const [submittedValue, setSubmittedValue] = useState(value ?? "");
51
52
  let t7;
52
53
  let t8;
53
54
  if ($[1] !== value) {
54
55
  t7 = () => {
55
- submittedValueRef.current = value ?? "";
56
+ setSubmittedValue(value ?? "");
56
57
  };
57
58
  t8 = [value];
58
59
  $[1] = value;
@@ -67,7 +68,7 @@ const CSSValueInput = forwardRef(function CSSValueInput2(t0, ref) {
67
68
  if ($[4] !== onSubmitValue) {
68
69
  t9 = (event) => {
69
70
  const currentValue = event.currentTarget.value;
70
- submittedValueRef.current = currentValue;
71
+ setSubmittedValue(currentValue);
71
72
  onSubmitValue(currentValue);
72
73
  };
73
74
  $[4] = onSubmitValue;
@@ -77,7 +78,7 @@ const CSSValueInput = forwardRef(function CSSValueInput2(t0, ref) {
77
78
  }
78
79
  const handleSubmitValue = t9;
79
80
  let t10;
80
- if ($[6] !== allowEmpty || $[7] !== cssValueType || $[8] !== getValueAsNumber || $[9] !== handleSubmitValue || $[10] !== max || $[11] !== min || $[12] !== onBlur || $[13] !== unit || $[14] !== validator) {
81
+ if ($[6] !== allowEmpty || $[7] !== cssValueType || $[8] !== getValueAsNumber || $[9] !== handleSubmitValue || $[10] !== max || $[11] !== min || $[12] !== onBlur || $[13] !== submittedValue || $[14] !== unit || $[15] !== validator) {
81
82
  t10 = (event_0) => {
82
83
  const input = event_0.currentTarget;
83
84
  inputRef.current = input;
@@ -94,7 +95,7 @@ const CSSValueInput = forwardRef(function CSSValueInput2(t0, ref) {
94
95
  const defaultUnit = unit ? getUnitFromCSSValue({
95
96
  cssValueType,
96
97
  defaultUnit: unit,
97
- value: submittedValueRef.current
98
+ value: submittedValue
98
99
  }) : "";
99
100
  if (!isCurrentValueFinite) {
100
101
  let isValid = false;
@@ -108,7 +109,7 @@ const CSSValueInput = forwardRef(function CSSValueInput2(t0, ref) {
108
109
  if (isValid) {
109
110
  handleSubmitValue(event_0);
110
111
  } else {
111
- input.value = submittedValueRef.current;
112
+ input.value = submittedValue;
112
113
  }
113
114
  return;
114
115
  }
@@ -149,15 +150,16 @@ const CSSValueInput = forwardRef(function CSSValueInput2(t0, ref) {
149
150
  $[10] = max;
150
151
  $[11] = min;
151
152
  $[12] = onBlur;
152
- $[13] = unit;
153
- $[14] = validator;
154
- $[15] = t10;
153
+ $[13] = submittedValue;
154
+ $[14] = unit;
155
+ $[15] = validator;
156
+ $[16] = t10;
155
157
  } else {
156
- t10 = $[15];
158
+ t10 = $[16];
157
159
  }
158
160
  const handleBlur = t10;
159
161
  let t11;
160
- if ($[16] !== cssValueType || $[17] !== getValueAsNumber || $[18] !== max || $[19] !== min || $[20] !== step || $[21] !== unit) {
162
+ if ($[17] !== cssValueType || $[18] !== getValueAsNumber || $[19] !== max || $[20] !== min || $[21] !== step || $[22] !== unit) {
161
163
  t11 = (t122) => {
162
164
  const {
163
165
  currentValue: currentValue_1,
@@ -190,64 +192,52 @@ const CSSValueInput = forwardRef(function CSSValueInput2(t0, ref) {
190
192
  });
191
193
  return `${nextValue}${nextUnit}`;
192
194
  };
193
- $[16] = cssValueType;
194
- $[17] = getValueAsNumber;
195
- $[18] = max;
196
- $[19] = min;
197
- $[20] = step;
198
- $[21] = unit;
199
- $[22] = t11;
195
+ $[17] = cssValueType;
196
+ $[18] = getValueAsNumber;
197
+ $[19] = max;
198
+ $[20] = min;
199
+ $[21] = step;
200
+ $[22] = unit;
201
+ $[23] = t11;
200
202
  } else {
201
- t11 = $[22];
203
+ t11 = $[23];
202
204
  }
203
205
  const getNextValue = t11;
204
206
  let t12;
205
- if ($[23] !== getNextValue || $[24] !== onKeyDown || $[25] !== placeholder || $[26] !== unit) {
207
+ if ($[24] !== getNextValue || $[25] !== onKeyDown || $[26] !== placeholder || $[27] !== unit) {
206
208
  t12 = (event_1) => {
207
209
  const input_0 = event_1.currentTarget;
208
210
  inputRef.current = input_0;
209
211
  if (onKeyDown) {
210
212
  onKeyDown(event_1);
211
213
  }
214
+ if (event_1.key !== "ArrowDown" && event_1.key !== "ArrowUp") {
215
+ return;
216
+ }
212
217
  const currentValue_2 = input_0.value ?? placeholder ?? `0${unit}`;
213
- let nextValue_0;
214
- switch (event_1.key) {
215
- case "ArrowDown":
216
- case "ArrowUp": {
217
- nextValue_0 = getNextValue({
218
- currentValue: currentValue_2,
219
- multiplier: event_1.shiftKey ? 10 : 1,
220
- signum: event_1.key === "ArrowUp" ? 1 : -1
221
- });
222
- if (nextValue_0 === currentValue_2) {
223
- return;
224
- }
225
- event_1.stopPropagation();
226
- event_1.preventDefault();
227
- input_0.value = nextValue_0;
228
- return;
229
- }
230
- case "Enter":
231
- case "Escape": {
232
- if (event_1.key === "Escape") {
233
- input_0.value = submittedValueRef.current;
234
- }
235
- input_0.blur();
236
- return;
237
- }
218
+ const nextValue_0 = getNextValue({
219
+ currentValue: currentValue_2,
220
+ multiplier: event_1.shiftKey ? 10 : 1,
221
+ signum: event_1.key === "ArrowUp" ? 1 : -1
222
+ });
223
+ if (nextValue_0 === currentValue_2) {
224
+ return;
238
225
  }
226
+ event_1.stopPropagation();
227
+ event_1.preventDefault();
228
+ input_0.value = nextValue_0;
239
229
  };
240
- $[23] = getNextValue;
241
- $[24] = onKeyDown;
242
- $[25] = placeholder;
243
- $[26] = unit;
244
- $[27] = t12;
230
+ $[24] = getNextValue;
231
+ $[25] = onKeyDown;
232
+ $[26] = placeholder;
233
+ $[27] = unit;
234
+ $[28] = t12;
245
235
  } else {
246
- t12 = $[27];
236
+ t12 = $[28];
247
237
  }
248
238
  const handleKeyDown = t12;
249
239
  let t13;
250
- if ($[28] !== handleSubmitValue || $[29] !== onKeyUp) {
240
+ if ($[29] !== handleSubmitValue || $[30] !== onKeyUp) {
251
241
  t13 = (event_2) => {
252
242
  if (onKeyUp) {
253
243
  onKeyUp(event_2);
@@ -256,77 +246,77 @@ const CSSValueInput = forwardRef(function CSSValueInput2(t0, ref) {
256
246
  handleSubmitValue(event_2);
257
247
  }
258
248
  };
259
- $[28] = handleSubmitValue;
260
- $[29] = onKeyUp;
261
- $[30] = t13;
249
+ $[29] = handleSubmitValue;
250
+ $[30] = onKeyUp;
251
+ $[31] = t13;
262
252
  } else {
263
- t13 = $[30];
253
+ t13 = $[31];
264
254
  }
265
255
  const handleKeyUp = t13;
266
256
  const t14 = label ? void 0 : title;
267
257
  let t15;
268
- if ($[31] !== className || $[32] !== disabled) {
258
+ if ($[32] !== className || $[33] !== disabled) {
269
259
  t15 = clsx(ROOT_CLASS_NAME, className, {
270
260
  disabled
271
261
  });
272
- $[31] = className;
273
- $[32] = disabled;
274
- $[33] = t15;
262
+ $[32] = className;
263
+ $[33] = disabled;
264
+ $[34] = t15;
275
265
  } else {
276
- t15 = $[33];
266
+ t15 = $[34];
277
267
  }
278
268
  let t16;
279
- if ($[34] !== icon) {
269
+ if ($[35] !== icon) {
280
270
  t16 = icon == null ? null : /* @__PURE__ */ jsx("div", { className: `${ROOT_CLASS_NAME}-icon`, children: icon });
281
- $[34] = icon;
282
- $[35] = t16;
271
+ $[35] = icon;
272
+ $[36] = t16;
283
273
  } else {
284
- t16 = $[35];
274
+ t16 = $[36];
285
275
  }
286
276
  let t17;
287
- if ($[36] !== label) {
277
+ if ($[37] !== label) {
288
278
  t17 = label ? /* @__PURE__ */ jsx("div", { className: `${ROOT_CLASS_NAME}-label`, children: /* @__PURE__ */ jsx("p", { className: `${ROOT_CLASS_NAME}-label-text`, children: label }) }) : null;
289
- $[36] = label;
290
- $[37] = t17;
279
+ $[37] = label;
280
+ $[38] = t17;
291
281
  } else {
292
- t17 = $[37];
282
+ t17 = $[38];
293
283
  }
294
284
  let t18;
295
- if ($[38] !== disabled || $[39] !== handleBlur || $[40] !== handleKeyDown || $[41] !== handleKeyUp || $[42] !== name || $[43] !== onChange || $[44] !== onFocus || $[45] !== placeholder || $[46] !== tabIndex || $[47] !== value) {
296
- t18 = /* @__PURE__ */ jsx("div", { className: `${ROOT_CLASS_NAME}-value`, children: /* @__PURE__ */ jsx(InputText, { disabled, initialValue: value, name, onBlur: handleBlur, onChange, onFocus, onKeyDown: handleKeyDown, onKeyUp: handleKeyUp, placeholder, ref: inputRef, selectTextOnFocus: true, tabIndex }) });
297
- $[38] = disabled;
298
- $[39] = handleBlur;
299
- $[40] = handleKeyDown;
300
- $[41] = handleKeyUp;
301
- $[42] = name;
302
- $[43] = onChange;
303
- $[44] = onFocus;
304
- $[45] = placeholder;
305
- $[46] = tabIndex;
306
- $[47] = value;
307
- $[48] = t18;
285
+ if ($[39] !== disabled || $[40] !== handleBlur || $[41] !== handleKeyDown || $[42] !== handleKeyUp || $[43] !== name || $[44] !== onChange || $[45] !== onFocus || $[46] !== placeholder || $[47] !== submittedValue || $[48] !== tabIndex) {
286
+ t18 = /* @__PURE__ */ jsx("div", { className: `${ROOT_CLASS_NAME}-value`, children: /* @__PURE__ */ jsx(InputText, { disabled, discardOnEscape: true, initialValue: submittedValue, name, onBlur: handleBlur, onChange, onFocus, onKeyDown: handleKeyDown, onKeyUp: handleKeyUp, placeholder, ref: inputRef, selectTextOnFocus: true, tabIndex }) });
287
+ $[39] = disabled;
288
+ $[40] = handleBlur;
289
+ $[41] = handleKeyDown;
290
+ $[42] = handleKeyUp;
291
+ $[43] = name;
292
+ $[44] = onChange;
293
+ $[45] = onFocus;
294
+ $[46] = placeholder;
295
+ $[47] = submittedValue;
296
+ $[48] = tabIndex;
297
+ $[49] = t18;
308
298
  } else {
309
- t18 = $[48];
299
+ t18 = $[49];
310
300
  }
311
301
  let t19;
312
- if ($[49] !== t14 || $[50] !== t15 || $[51] !== t16 || $[52] !== t17 || $[53] !== t18 || $[54] !== title) {
302
+ if ($[50] !== t14 || $[51] !== t15 || $[52] !== t16 || $[53] !== t17 || $[54] !== t18 || $[55] !== title) {
313
303
  t19 = /* @__PURE__ */ jsxs("label", { "aria-label": t14, className: t15, title, children: [
314
304
  t16,
315
305
  t17,
316
306
  t18
317
307
  ] });
318
- $[49] = t14;
319
- $[50] = t15;
320
- $[51] = t16;
321
- $[52] = t17;
322
- $[53] = t18;
323
- $[54] = title;
324
- $[55] = t19;
308
+ $[50] = t14;
309
+ $[51] = t15;
310
+ $[52] = t16;
311
+ $[53] = t17;
312
+ $[54] = t18;
313
+ $[55] = title;
314
+ $[56] = t19;
325
315
  } else {
326
- t19 = $[55];
316
+ t19 = $[56];
327
317
  }
328
318
  return t19;
329
- });
319
+ }
330
320
  export {
331
321
  CSSValueInput as default
332
322
  };
@@ -1 +1 @@
1
- {"version":3,"file":"CSSValueInput.js","sources":["../src/CSSValueInput.tsx"],"sourcesContent":["import {\n type CSSValueType,\n DEFAULT_CSS_VALUE_TYPE,\n DEFAULT_UNIT_BY_CSS_VALUE_TYPE,\n getCSSValueAsNumber,\n getCSSValueWithUnit,\n getUnitFromCSSValue,\n roundToPrecision,\n} from '@acusti/css-values';\nimport InputText from '@acusti/input-text';\nimport clsx from 'clsx';\nimport {\n type ChangeEvent,\n type FocusEvent,\n forwardRef,\n type KeyboardEvent,\n type ReactNode,\n type SyntheticEvent,\n useEffect,\n useImperativeHandle,\n useRef,\n} from 'react';\n\nexport type Props = {\n /**\n * Boolean indicating if the user can submit an empty value (i.e. clear\n * the value). Defaults to true.\n */\n allowEmpty?: boolean;\n className?: string;\n cssValueType?: CSSValueType;\n disabled?: boolean;\n /**\n * Function that receives a value and converts it to its numerical equivalent\n * (i.e. '12px' → 12). Defaults to parseFloat().\n */\n getValueAsNumber?: (value: number | string) => number;\n icon?: ReactNode;\n label?: string;\n max?: number;\n min?: number;\n name?: string;\n onBlur?: (event: FocusEvent<HTMLInputElement>) => unknown;\n onChange?: (event: ChangeEvent<HTMLInputElement>) => unknown;\n onFocus?: (event: FocusEvent<HTMLInputElement>) => unknown;\n onKeyDown?: (event: KeyboardEvent<HTMLInputElement>) => unknown;\n onKeyUp?: (event: KeyboardEvent<HTMLInputElement>) => unknown;\n /**\n * Custom event handler triggered when the user presses enter/return\n * or blurs the input after making a change. Hitting esc will restore\n * the previous submitted value or original value.\n */\n onSubmitValue: (value: string) => unknown;\n placeholder?: string;\n step?: number;\n tabIndex?: number;\n title?: string;\n unit?: string;\n /** Regex or validator function to validate non-numeric values */\n validator?: ((value: string) => boolean) | RegExp;\n value?: string;\n};\n\ntype InputRef = HTMLInputElement | null;\n\nconst ROOT_CLASS_NAME = 'cssvalueinput';\n\nexport default forwardRef<HTMLInputElement, Props>(function CSSValueInput(\n {\n allowEmpty = true,\n className,\n cssValueType = DEFAULT_CSS_VALUE_TYPE,\n disabled,\n getValueAsNumber = getCSSValueAsNumber,\n icon,\n label,\n max,\n min,\n name,\n onBlur,\n onChange,\n onFocus,\n onKeyDown,\n onKeyUp,\n onSubmitValue,\n placeholder,\n step = 1,\n tabIndex,\n title,\n unit = DEFAULT_UNIT_BY_CSS_VALUE_TYPE[cssValueType],\n validator,\n value: valueFromProps,\n }: Props,\n ref,\n) {\n const inputRef = useRef<InputRef>(null);\n useImperativeHandle<InputRef, InputRef>(ref, () => inputRef.current);\n // props.value should be a string; if it’s a number, convert it here\n const value =\n typeof valueFromProps === 'number' && !Number.isNaN(valueFromProps)\n ? `${valueFromProps}`\n : valueFromProps;\n const submittedValueRef = useRef<string>(value ?? '');\n\n useEffect(() => {\n submittedValueRef.current = value ?? '';\n }, [value]);\n\n const handleSubmitValue = (event: SyntheticEvent<HTMLInputElement>) => {\n const currentValue = event.currentTarget.value;\n // Store last submittedValue (used to reset value on invalid input)\n submittedValueRef.current = currentValue;\n onSubmitValue(currentValue);\n };\n\n const handleBlur = (event: FocusEvent<HTMLInputElement>) => {\n const input = event.currentTarget;\n inputRef.current = input;\n if (onBlur) onBlur(event);\n\n const currentValue = input.value.trim();\n\n // If allowEmpty and value is empty, skip all validation + normalization\n if (allowEmpty && !currentValue) {\n handleSubmitValue(event);\n return;\n }\n\n const currentValueAsNumber = getValueAsNumber(currentValue);\n const isCurrentValueFinite = Number.isFinite(currentValueAsNumber);\n // Inherit unit from last submitted value unless default is unitless;\n // ensures that submitting a new value with no unit doesn’t add a unit\n const defaultUnit = unit\n ? getUnitFromCSSValue({\n cssValueType,\n defaultUnit: unit,\n value: submittedValueRef.current,\n })\n : '';\n\n if (!isCurrentValueFinite) {\n let isValid = false;\n if (validator instanceof RegExp) {\n isValid = validator.test(currentValue);\n } else if (validator) {\n isValid = validator(currentValue);\n }\n\n if (isValid) {\n handleSubmitValue(event);\n } else {\n // If current value isn’t valid, revert to last submitted value\n input.value = submittedValueRef.current;\n }\n\n return;\n }\n\n // Normalize value by applying min/max and integer constraints\n let normalizedValueAsNumber = currentValueAsNumber;\n\n if (isCurrentValueFinite) {\n if (min != null && currentValueAsNumber < min) {\n normalizedValueAsNumber = min;\n } else if (max != null && currentValueAsNumber > max) {\n normalizedValueAsNumber = max;\n } else if (cssValueType === 'integer') {\n normalizedValueAsNumber = Math.floor(currentValueAsNumber);\n }\n }\n\n if (normalizedValueAsNumber !== currentValueAsNumber) {\n const currentUnit = getUnitFromCSSValue({\n cssValueType,\n defaultUnit,\n value: currentValue,\n });\n input.value = normalizedValueAsNumber + currentUnit;\n } else {\n input.value = getCSSValueWithUnit({\n cssValueType,\n defaultUnit,\n value: currentValue,\n });\n }\n\n handleSubmitValue(event);\n };\n\n const getNextValue = ({\n currentValue,\n multiplier = 1,\n signum = 1,\n }: {\n currentValue: number | string;\n multiplier?: number;\n signum?: number;\n }) => {\n const modifier = multiplier * step * signum;\n const currentValueAsNumber = getValueAsNumber(currentValue);\n // If currentValue isn’t numeric, don’t try to increment/decrement it\n if (typeof currentValue === 'string' && Number.isNaN(currentValueAsNumber)) {\n return currentValue;\n }\n\n let nextValue = currentValueAsNumber + modifier;\n if (cssValueType === 'integer') {\n nextValue = Math.floor(nextValue);\n } else {\n nextValue = roundToPrecision(nextValue, 5);\n }\n\n if (typeof max === 'number' && Number.isFinite(max)) {\n nextValue = Math.min(max, nextValue);\n }\n\n if (typeof min === 'number' && Number.isFinite(min)) {\n nextValue = Math.max(min, nextValue);\n }\n\n const nextUnit = getUnitFromCSSValue({\n cssValueType,\n defaultUnit: unit,\n value: currentValue,\n });\n return `${nextValue}${nextUnit}`;\n };\n\n const handleKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n const input = event.currentTarget;\n inputRef.current = input;\n if (onKeyDown) onKeyDown(event);\n\n const currentValue = input.value ?? placeholder ?? `0${unit}`;\n let nextValue = '';\n\n switch (event.key) {\n case 'ArrowDown':\n case 'ArrowUp':\n nextValue = getNextValue({\n currentValue,\n multiplier: event.shiftKey ? 10 : 1,\n signum: event.key === 'ArrowUp' ? 1 : -1,\n });\n\n if (nextValue === currentValue) return;\n\n event.stopPropagation();\n event.preventDefault();\n\n input.value = nextValue;\n return;\n case 'Enter':\n case 'Escape':\n if (event.key === 'Escape') {\n input.value = submittedValueRef.current;\n }\n input.blur();\n return;\n default:\n // No default key handling\n }\n };\n\n const handleKeyUp = (event: KeyboardEvent<HTMLInputElement>) => {\n if (onKeyUp) onKeyUp(event);\n // If this is the key up from ↑ or ↓ keys, time to handleSubmitValue\n if (event.key === 'ArrowUp' || event.key === 'ArrowDown') {\n handleSubmitValue(event);\n }\n };\n\n return (\n <label\n aria-label={label ? undefined : title}\n className={clsx(ROOT_CLASS_NAME, className, { disabled })}\n title={title}\n >\n {icon == null ? null : (\n <div className={`${ROOT_CLASS_NAME}-icon`}>{icon}</div>\n )}\n {label ? (\n <div className={`${ROOT_CLASS_NAME}-label`}>\n <p className={`${ROOT_CLASS_NAME}-label-text`}>{label}</p>\n </div>\n ) : null}\n <div className={`${ROOT_CLASS_NAME}-value`}>\n <InputText\n disabled={disabled}\n initialValue={value}\n name={name}\n onBlur={handleBlur}\n onChange={onChange}\n onFocus={onFocus}\n onKeyDown={handleKeyDown}\n onKeyUp={handleKeyUp}\n placeholder={placeholder}\n ref={inputRef}\n selectTextOnFocus\n tabIndex={tabIndex}\n />\n </div>\n </label>\n );\n});\n"],"names":["ROOT_CLASS_NAME","forwardRef","CSSValueInput","t0","ref","$","_c","allowEmpty","t1","className","cssValueType","t2","disabled","getValueAsNumber","t3","icon","label","max","min","name","onBlur","onChange","onFocus","onKeyDown","onKeyUp","onSubmitValue","placeholder","step","t4","tabIndex","title","unit","t5","validator","value","valueFromProps","undefined","DEFAULT_CSS_VALUE_TYPE","getCSSValueAsNumber","DEFAULT_UNIT_BY_CSS_VALUE_TYPE","inputRef","useRef","t6","Symbol","for","current","useImperativeHandle","Number","isNaN","submittedValueRef","t7","t8","useEffect","t9","event","currentValue","currentTarget","handleSubmitValue","t10","event_0","input","currentValue_0","trim","currentValueAsNumber","isCurrentValueFinite","isFinite","defaultUnit","getUnitFromCSSValue","isValid","RegExp","test","normalizedValueAsNumber","currentUnit","getCSSValueWithUnit","handleBlur","t11","t12","currentValue_1","multiplier","t13","signum","t14","modifier","currentValueAsNumber_0","nextValue","nextUnit","getNextValue","event_1","input_0","currentValue_2","nextValue_0","key","shiftKey","stopPropagation","preventDefault","blur","handleKeyDown","event_2","handleKeyUp","t15","clsx","t16","t17","t18","t19"],"mappings":"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"}
1
+ {"version":3,"file":"CSSValueInput.js","sources":["../src/CSSValueInput.tsx"],"sourcesContent":["import {\n type CSSValueType,\n DEFAULT_CSS_VALUE_TYPE,\n DEFAULT_UNIT_BY_CSS_VALUE_TYPE,\n getCSSValueAsNumber,\n getCSSValueWithUnit,\n getUnitFromCSSValue,\n roundToPrecision,\n} from '@acusti/css-values';\nimport InputText from '@acusti/input-text';\nimport clsx from 'clsx';\nimport {\n type ChangeEvent,\n type FocusEvent,\n type KeyboardEvent,\n type ReactNode,\n type Ref,\n type SyntheticEvent,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from 'react';\n\nexport type Props = {\n /**\n * Boolean indicating if the user can submit an empty value (i.e. clear\n * the value). Defaults to true.\n */\n allowEmpty?: boolean;\n className?: string;\n cssValueType?: CSSValueType;\n disabled?: boolean;\n /**\n * Function that receives a value and converts it to its numerical equivalent\n * (i.e. '12px' → 12). Defaults to parseFloat().\n */\n getValueAsNumber?: (value: number | string) => number;\n icon?: ReactNode;\n label?: string;\n max?: number;\n min?: number;\n name?: string;\n onBlur?: (event: FocusEvent<HTMLInputElement>) => unknown;\n onChange?: (event: ChangeEvent<HTMLInputElement>) => unknown;\n onFocus?: (event: FocusEvent<HTMLInputElement>) => unknown;\n onKeyDown?: (event: KeyboardEvent<HTMLInputElement>) => unknown;\n onKeyUp?: (event: KeyboardEvent<HTMLInputElement>) => unknown;\n /**\n * Custom event handler triggered when the user presses enter/return\n * or blurs the input after making a change. Hitting esc will restore\n * the previous submitted value or original value.\n */\n onSubmitValue: (value: string) => unknown;\n placeholder?: string;\n ref?: Ref<HTMLInputElement>;\n step?: number;\n tabIndex?: number;\n title?: string;\n unit?: string;\n /** Regex or validator function to validate non-numeric values */\n validator?: ((value: string) => boolean) | RegExp;\n value?: string;\n};\n\ntype InputRef = HTMLInputElement | null;\n\nconst ROOT_CLASS_NAME = 'cssvalueinput';\n\nexport default function CSSValueInput({\n allowEmpty = true,\n className,\n cssValueType = DEFAULT_CSS_VALUE_TYPE,\n disabled,\n getValueAsNumber = getCSSValueAsNumber,\n icon,\n label,\n max,\n min,\n name,\n onBlur,\n onChange,\n onFocus,\n onKeyDown,\n onKeyUp,\n onSubmitValue,\n placeholder,\n ref,\n step = 1,\n tabIndex,\n title,\n unit = DEFAULT_UNIT_BY_CSS_VALUE_TYPE[cssValueType],\n validator,\n value: valueFromProps,\n}: Props) {\n const inputRef = useRef<InputRef>(null);\n\n useImperativeHandle<InputRef, InputRef>(ref, () => inputRef.current);\n\n // props.value should be a string; if it’s a number, convert it here\n const value =\n typeof valueFromProps === 'number' && !Number.isNaN(valueFromProps)\n ? `${valueFromProps}`\n : valueFromProps;\n const [submittedValue, setSubmittedValue] = useState(value ?? '');\n\n useEffect(() => {\n setSubmittedValue(value ?? '');\n }, [value]);\n\n const handleSubmitValue = (event: SyntheticEvent<HTMLInputElement>) => {\n const currentValue = event.currentTarget.value;\n // Store last submittedValue (used to reset value on invalid input)\n setSubmittedValue(currentValue);\n onSubmitValue(currentValue);\n };\n\n const handleBlur = (event: FocusEvent<HTMLInputElement>) => {\n const input = event.currentTarget;\n inputRef.current = input;\n if (onBlur) onBlur(event);\n\n const currentValue = input.value.trim();\n\n // If allowEmpty and value is empty, skip all validation + normalization\n if (allowEmpty && !currentValue) {\n handleSubmitValue(event);\n return;\n }\n\n const currentValueAsNumber = getValueAsNumber(currentValue);\n const isCurrentValueFinite = Number.isFinite(currentValueAsNumber);\n // Inherit unit from last submitted value unless default is unitless;\n // ensures that submitting a new value with no unit doesn’t add a unit\n const defaultUnit = unit\n ? getUnitFromCSSValue({\n cssValueType,\n defaultUnit: unit,\n value: submittedValue,\n })\n : '';\n\n if (!isCurrentValueFinite) {\n let isValid = false;\n if (validator instanceof RegExp) {\n isValid = validator.test(currentValue);\n } else if (validator) {\n isValid = validator(currentValue);\n }\n\n if (isValid) {\n handleSubmitValue(event);\n } else {\n // If current value isn’t valid, revert to last submitted value\n input.value = submittedValue;\n }\n\n return;\n }\n\n // Normalize value by applying min/max and integer constraints\n let normalizedValueAsNumber = currentValueAsNumber;\n\n if (isCurrentValueFinite) {\n if (min != null && currentValueAsNumber < min) {\n normalizedValueAsNumber = min;\n } else if (max != null && currentValueAsNumber > max) {\n normalizedValueAsNumber = max;\n } else if (cssValueType === 'integer') {\n normalizedValueAsNumber = Math.floor(currentValueAsNumber);\n }\n }\n\n if (normalizedValueAsNumber !== currentValueAsNumber) {\n const currentUnit = getUnitFromCSSValue({\n cssValueType,\n defaultUnit,\n value: currentValue,\n });\n input.value = normalizedValueAsNumber + currentUnit;\n } else {\n input.value = getCSSValueWithUnit({\n cssValueType,\n defaultUnit,\n value: currentValue,\n });\n }\n\n handleSubmitValue(event);\n };\n\n const getNextValue = ({\n currentValue,\n multiplier = 1,\n signum = 1,\n }: {\n currentValue: number | string;\n multiplier?: number;\n signum?: number;\n }) => {\n const modifier = multiplier * step * signum;\n const currentValueAsNumber = getValueAsNumber(currentValue);\n // If currentValue isn’t numeric, don’t try to increment/decrement it\n if (typeof currentValue === 'string' && Number.isNaN(currentValueAsNumber)) {\n return currentValue;\n }\n\n let nextValue = currentValueAsNumber + modifier;\n if (cssValueType === 'integer') {\n nextValue = Math.floor(nextValue);\n } else {\n nextValue = roundToPrecision(nextValue, 5);\n }\n\n if (typeof max === 'number' && Number.isFinite(max)) {\n nextValue = Math.min(max, nextValue);\n }\n\n if (typeof min === 'number' && Number.isFinite(min)) {\n nextValue = Math.max(min, nextValue);\n }\n\n const nextUnit = getUnitFromCSSValue({\n cssValueType,\n defaultUnit: unit,\n value: currentValue,\n });\n return `${nextValue}${nextUnit}`;\n };\n\n const handleKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n const input = event.currentTarget;\n inputRef.current = input;\n if (onKeyDown) onKeyDown(event);\n if (event.key !== 'ArrowDown' && event.key !== 'ArrowUp') return;\n\n const currentValue = input.value ?? placeholder ?? `0${unit}`;\n const nextValue = getNextValue({\n currentValue,\n multiplier: event.shiftKey ? 10 : 1,\n signum: event.key === 'ArrowUp' ? 1 : -1,\n });\n\n if (nextValue === currentValue) return;\n\n event.stopPropagation();\n event.preventDefault();\n\n input.value = nextValue;\n };\n\n const handleKeyUp = (event: KeyboardEvent<HTMLInputElement>) => {\n if (onKeyUp) onKeyUp(event);\n // If this is the key up from ↑ or ↓ keys, time to handleSubmitValue\n if (event.key === 'ArrowUp' || event.key === 'ArrowDown') {\n handleSubmitValue(event);\n }\n };\n\n return (\n <label\n aria-label={label ? undefined : title}\n className={clsx(ROOT_CLASS_NAME, className, { disabled })}\n title={title}\n >\n {icon == null ? null : (\n <div className={`${ROOT_CLASS_NAME}-icon`}>{icon}</div>\n )}\n {label ? (\n <div className={`${ROOT_CLASS_NAME}-label`}>\n <p className={`${ROOT_CLASS_NAME}-label-text`}>{label}</p>\n </div>\n ) : null}\n <div className={`${ROOT_CLASS_NAME}-value`}>\n <InputText\n disabled={disabled}\n discardOnEscape\n initialValue={submittedValue}\n name={name}\n onBlur={handleBlur}\n onChange={onChange}\n onFocus={onFocus}\n onKeyDown={handleKeyDown}\n onKeyUp={handleKeyUp}\n placeholder={placeholder}\n ref={inputRef}\n selectTextOnFocus\n tabIndex={tabIndex}\n />\n </div>\n </label>\n );\n}\n"],"names":["ROOT_CLASS_NAME","CSSValueInput","t0","$","_c","allowEmpty","t1","className","cssValueType","t2","disabled","getValueAsNumber","t3","icon","label","max","min","name","onBlur","onChange","onFocus","onKeyDown","onKeyUp","onSubmitValue","placeholder","ref","step","t4","tabIndex","title","unit","t5","validator","value","valueFromProps","undefined","DEFAULT_CSS_VALUE_TYPE","getCSSValueAsNumber","DEFAULT_UNIT_BY_CSS_VALUE_TYPE","inputRef","useRef","t6","Symbol","for","current","useImperativeHandle","Number","isNaN","submittedValue","setSubmittedValue","useState","t7","t8","useEffect","t9","event","currentValue","currentTarget","handleSubmitValue","t10","event_0","input","currentValue_0","trim","currentValueAsNumber","isCurrentValueFinite","isFinite","defaultUnit","getUnitFromCSSValue","isValid","RegExp","test","normalizedValueAsNumber","Math","floor","currentUnit","getCSSValueWithUnit","handleBlur","t11","t12","currentValue_1","multiplier","t13","signum","t14","modifier","currentValueAsNumber_0","nextValue","roundToPrecision","nextUnit","getNextValue","event_1","input_0","key","currentValue_2","nextValue_0","shiftKey","stopPropagation","preventDefault","handleKeyDown","event_2","handleKeyUp","t15","clsx","t16","t17","t18","t19"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@acusti/css-value-input",
3
- "version": "2.1.1",
3
+ "version": "2.2.0",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "exports": "./dist/CSSValueInput.js",
@@ -38,23 +38,23 @@
38
38
  },
39
39
  "homepage": "https://github.com/acusti/uikit/tree/main/packages/css-value-input#readme",
40
40
  "devDependencies": {
41
- "@testing-library/dom": "^10.4.0",
41
+ "@testing-library/dom": "^10.4.1",
42
42
  "@testing-library/react": "^16.3.0",
43
43
  "@testing-library/user-event": "^14.6.1",
44
- "@types/react": "^19.1.8",
45
- "@vitejs/plugin-react": "^4.6.0",
46
- "babel-plugin-react-compiler": "rc",
47
- "happy-dom": "^18.0.1",
48
- "react": "^19.0.0",
49
- "react-dom": "^19.0.0",
50
- "typescript": "5.8.3",
51
- "unplugin-dts": "^1.0.0-beta.2",
52
- "vite": "^7.0.0-0",
44
+ "@types/react": "^19.2.0",
45
+ "@vitejs/plugin-react": "^5.0.4",
46
+ "babel-plugin-react-compiler": "^1",
47
+ "happy-dom": "^20.0.0",
48
+ "react": "^19.2.0",
49
+ "react-dom": "^19.2.0",
50
+ "typescript": "5.9.2",
51
+ "unplugin-dts": "^1.0.0-beta.6",
52
+ "vite": "^7.1.8",
53
53
  "vitest": "^3.2.4"
54
54
  },
55
55
  "dependencies": {
56
56
  "@acusti/css-values": "^1.2.0",
57
- "@acusti/input-text": "^2.1.0",
57
+ "@acusti/input-text": "^2.2.0",
58
58
  "clsx": "^2"
59
59
  },
60
60
  "peerDependencies": {