UNPKG

@wordpress/components

Version:
8 lines (7 loc) 10.4 kB
{ "version": 3, "sources": ["../../src/unit-control/index.tsx"], "sourcesContent": ["/**\n * External dependencies\n */\n\nimport clsx from 'clsx';\n\n/**\n * WordPress dependencies\n */\nimport deprecated from '@wordpress/deprecated';\nimport { forwardRef, useMemo, useRef, useEffect } from '@wordpress/element';\nimport { __ } from '@wordpress/i18n';\n\n/**\n * Internal dependencies\n */\n\nimport { ValueInput } from './styles/unit-control-styles';\nimport UnitSelectControl from './unit-select-control';\nimport { CSS_UNITS, getParsedQuantityAndUnit, getUnitsWithCurrentUnit, getValidParsedQuantityAndUnit } from './utils';\nimport { useControlledState } from '../utils/hooks';\nimport { escapeRegExp } from '../utils/strings';\nimport { useDeprecated36pxDefaultSizeProp } from '../utils/use-deprecated-props';\nimport { maybeWarnDeprecated36pxSize } from '../utils/deprecated-36px-size';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nfunction UnforwardedUnitControl(unitControlProps, forwardedRef) {\n const {\n __unstableStateReducer,\n autoComplete = 'off',\n // @ts-expect-error Ensure that children is omitted from restProps\n children,\n className,\n disabled = false,\n disableUnits = false,\n isPressEnterToChange = false,\n isResetValueOnUnitChange = false,\n isUnitSelectTabbable = true,\n label,\n onChange: onChangeProp,\n onUnitChange,\n size = 'default',\n unit: unitProp,\n units: unitsProp = CSS_UNITS,\n value: valueProp,\n onFocus: onFocusProp,\n __shouldNotWarnDeprecated36pxSize,\n ...props\n } = useDeprecated36pxDefaultSizeProp(unitControlProps);\n maybeWarnDeprecated36pxSize({\n componentName: 'UnitControl',\n __next40pxDefaultSize: props.__next40pxDefaultSize,\n size,\n __shouldNotWarnDeprecated36pxSize\n });\n if ('unit' in unitControlProps) {\n deprecated('UnitControl unit prop', {\n since: '5.6',\n hint: 'The unit should be provided within the `value` prop.',\n version: '6.2'\n });\n }\n\n // The `value` prop, in theory, should not be `null`, but the following line\n // ensures it fallback to `undefined` in case a consumer of `UnitControl`\n // still passes `null` as a `value`.\n const nonNullValueProp = valueProp ?? undefined;\n const [units, reFirstCharacterOfUnits] = useMemo(() => {\n const list = getUnitsWithCurrentUnit(nonNullValueProp, unitProp, unitsProp);\n const [{\n value: firstUnitValue = ''\n } = {}, ...rest] = list;\n const firstCharacters = rest.reduce((carry, {\n value\n }) => {\n const first = escapeRegExp(value?.substring(0, 1) || '');\n return carry.includes(first) ? carry : `${carry}|${first}`;\n }, escapeRegExp(firstUnitValue.substring(0, 1)));\n return [list, new RegExp(`^(?:${firstCharacters})$`, 'i')];\n }, [nonNullValueProp, unitProp, unitsProp]);\n const [parsedQuantity, parsedUnit] = getParsedQuantityAndUnit(nonNullValueProp, unitProp, units);\n const [unit, setUnit] = useControlledState(units.length === 1 ? units[0].value : unitProp, {\n initial: parsedUnit,\n fallback: ''\n });\n useEffect(() => {\n if (parsedUnit !== undefined) {\n setUnit(parsedUnit);\n }\n }, [parsedUnit, setUnit]);\n const classes = clsx('components-unit-control',\n // This class is added for legacy purposes to maintain it on the outer\n // wrapper. See: https://github.com/WordPress/gutenberg/pull/45139\n 'components-unit-control-wrapper', className);\n const handleOnQuantityChange = (nextQuantityValue, changeProps) => {\n if (nextQuantityValue === '' || typeof nextQuantityValue === 'undefined' || nextQuantityValue === null) {\n onChangeProp?.('', changeProps);\n return;\n }\n\n /*\n * Customizing the onChange callback.\n * This allows as to broadcast a combined value+unit to onChange.\n */\n const onChangeValue = getValidParsedQuantityAndUnit(nextQuantityValue, units, parsedQuantity, unit).join('');\n onChangeProp?.(onChangeValue, changeProps);\n };\n const handleOnUnitChange = (nextUnitValue, changeProps) => {\n const {\n data\n } = changeProps;\n let nextValue = `${parsedQuantity ?? ''}${nextUnitValue}`;\n if (isResetValueOnUnitChange && data?.default !== undefined) {\n nextValue = `${data.default}${nextUnitValue}`;\n }\n onChangeProp?.(nextValue, changeProps);\n onUnitChange?.(nextUnitValue, changeProps);\n setUnit(nextUnitValue);\n };\n let handleOnKeyDown;\n if (!disableUnits && isUnitSelectTabbable && units.length) {\n handleOnKeyDown = event => {\n props.onKeyDown?.(event);\n // Unless the meta or ctrl key was pressed (to avoid interfering with\n // shortcuts, e.g. pastes), move focus to the unit select if a key\n // matches the first character of a unit.\n if (!event.metaKey && !event.ctrlKey && reFirstCharacterOfUnits.test(event.key)) {\n refInputSuffix.current?.focus();\n }\n };\n }\n const refInputSuffix = useRef(null);\n const inputSuffix = !disableUnits ? /*#__PURE__*/_jsx(UnitSelectControl, {\n ref: refInputSuffix,\n \"aria-label\": __('Select unit'),\n disabled: disabled,\n isUnitSelectTabbable: isUnitSelectTabbable,\n onChange: handleOnUnitChange,\n size: ['small', 'compact'].includes(size) || size === 'default' && !props.__next40pxDefaultSize ? 'small' : 'default',\n unit: unit,\n units: units,\n onFocus: onFocusProp,\n onBlur: unitControlProps.onBlur\n }) : null;\n let step = props.step;\n\n /*\n * If no step prop has been passed, lookup the active unit and\n * try to get step from `units`, or default to a value of `1`\n */\n if (!step && units) {\n const activeUnit = units.find(option => option.value === unit);\n step = activeUnit?.step ?? 1;\n }\n return /*#__PURE__*/_jsx(ValueInput, {\n ...props,\n __shouldNotWarnDeprecated36pxSize: true,\n autoComplete: autoComplete,\n className: classes,\n disabled: disabled,\n spinControls: \"none\",\n isPressEnterToChange: isPressEnterToChange,\n label: label,\n onKeyDown: handleOnKeyDown,\n onChange: handleOnQuantityChange,\n ref: forwardedRef,\n size: size,\n suffix: inputSuffix,\n type: isPressEnterToChange ? 'text' : 'number',\n value: parsedQuantity ?? '',\n step: step,\n onFocus: onFocusProp,\n __unstableStateReducer: __unstableStateReducer\n });\n}\n\n/**\n * `UnitControl` allows the user to set a numeric quantity as well as a unit (e.g. `px`).\n *\n *\n * ```jsx\n * import { __experimentalUnitControl as UnitControl } from '@wordpress/components';\n * import { useState } from '@wordpress/element';\n *\n * const Example = () => {\n * const [ value, setValue ] = useState( '10px' );\n *\n * return <UnitControl __next40pxDefaultSize onChange={ setValue } value={ value } />;\n * };\n * ```\n */\nexport const UnitControl = forwardRef(UnforwardedUnitControl);\nUnitControl.displayName = 'UnitControl';\nexport { parseQuantityAndUnitFromRawValue, useCustomUnits } from './utils';\nexport default UnitControl;"], "mappings": "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", "names": ["import_utils", "deprecated", "clsx", "_jsx", "UnitSelectControl"] }