UNPKG

@dnanpm/styleguide

Version:

DNA Styleguide repository provides the set of components and theme object used in various DNA projects.

161 lines (145 loc) 6.87 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var tslib = require('tslib'); var icons = require('@dnanpm/icons'); var React = require('react'); var styledComponents = require('styled-components'); var theme = require('../../themes/theme.js'); var styledUtils = require('../../utils/styledUtils.js'); var ButtonArrow = require('../ButtonArrow/ButtonArrow.js'); function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; } var React__default = /*#__PURE__*/_interopDefaultCompat(React); const Container = styledComponents.styled.div ` display: flex; width: ${styledUtils.getMultipliedSize(theme.default.base.baseWidth, 12)}; `; const Button = styledComponents.styled(ButtonArrow.default) ` display: inline-flex; width: ${styledUtils.getMultipliedSize(theme.default.base.baseWidth, 4)}; height: ${styledUtils.getMultipliedSize(theme.default.base.baseHeight, 4)}; border-radius: 0; &:first-of-type { border-top-left-radius: ${theme.default.radius.s}; border-bottom-left-radius: ${theme.default.radius.s}; &:focus { z-index: 2; } } &:last-of-type { border-top-right-radius: ${theme.default.radius.s}; border-bottom-right-radius: ${theme.default.radius.s}; } &:disabled, &[disabled] { background-color: ${theme.default.color.background.sand.E02 + theme.default.color.transparency.T30}; border: 1px solid ${theme.default.color.line.L01}; pointer-events: auto; cursor: not-allowed; svg { opacity: 0.3; } } `; const Input = styledComponents.styled.input ` width: ${styledUtils.getMultipliedSize(theme.default.base.baseWidth, 4)}; height: ${styledUtils.getMultipliedSize(theme.default.base.baseHeight, 4)}; font-family: ${theme.default.fontFamily.default}; font-size: ${theme.default.fontSize.default}; text-align: center; border: 0 none; border-radius: 0; border-top: 1px solid ${theme.default.color.line.L01}; border-bottom: 1px solid ${theme.default.color.line.L01}; &:focus { border: 2px solid ${theme.default.color.focus.light}; box-shadow: 0px 0px 0px 2px ${theme.default.color.focus.dark}; outline: none; z-index: 2; } &:disabled, &[disabled] { background-color: ${theme.default.color.background.sand.E02 + theme.default.color.transparency.T30}; border: 1px solid ${theme.default.color.transparency.T30 + theme.default.color.line.L01}; svg { opacity: 0.3; } } &:read-only { pointer-events: none; } &::-webkit-outer-spin-button, &::-webkit-inner-spin-button { display: none; } -webkit-appearance: none; -moz-appearance: textfield; `; /** @visibleName Amount Selector */ const AmountSelector = (_a) => { var { onChange, value = 1, step = 1, min = 1, max, disabled = false, readonly = true, 'data-testid': dataTestId, increaseButtonAriaLabel, decreaseButtonAriaLabel, removeButtonAriaLabel, inputAriaLabel } = _a, props = tslib.__rest(_a, ["onChange", "value", "step", "min", "max", "disabled", "readonly", 'data-testid', "increaseButtonAriaLabel", "decreaseButtonAriaLabel", "removeButtonAriaLabel", "inputAriaLabel"]); const isMinReached = (val) => val < min; const isMaxReached = (val) => Boolean(max && val > max); const isInRange = (val) => !isMinReached(val) && !isMaxReached(val); const increase = () => { const newValue = value + step; if (!isMaxReached(newValue) && !disabled) { onChange(newValue); } }; const decrease = () => { const newValue = value - step; if (!disabled && (!isMinReached(newValue) || props.removable)) { onChange(newValue); } }; const handleChange = (event) => { if (event.target.value) { const integerInputValue = parseInt(event.target.value, 10); if (isInRange(integerInputValue)) { onChange(integerInputValue); } else { onChange(max && isMaxReached(integerInputValue) ? max : min); } } else { onChange(min); } }; const getMinButtonAriaLabel = () => { if (props.removable && isMinReached(value - step)) { return removeButtonAriaLabel; } if (decreaseButtonAriaLabel) { return decreaseButtonAriaLabel; } return undefined; }; const handleKeyDown = (e) => { const allowedKeys = new Set(['Tab', 'Backspace', 'Delete', 'ArrowLeft', 'ArrowRight']); if (/^[0-9]$/.test(e.key) || allowedKeys.has(e.key)) { return; } if (e.key === 'ArrowUp') { e.preventDefault(); if (!isMaxReached(value + step)) { onChange(value + step); } return; } if (e.key === 'ArrowDown') { e.preventDefault(); if (!isMinReached(value - step)) { onChange(value - step); } return; } e.preventDefault(); }; return (React__default.default.createElement(Container, { "data-testid": dataTestId, className: props.className }, React__default.default.createElement(Button, { icon: props.removable && isMinReached(value - step) ? (React__default.default.createElement(icons.Trash, { size: styledUtils.getMultipliedSize(theme.default.base.baseWidth, 2) })) : (React__default.default.createElement(icons.Minus, { size: styledUtils.getMultipliedSize(theme.default.base.baseWidth, 2) })), variant: "secondary", onClick: decrease, disabled: disabled || (isMinReached(value - step) && !props.removable), type: "button", "aria-label": getMinButtonAriaLabel(), "data-testid": dataTestId && `${dataTestId}${props.removable && isMinReached(value - step) ? '-remove' : '-decrease'}` }), React__default.default.createElement(Input, { id: props.id, name: props.name, type: "number", onChange: handleChange, value: value, min: min, max: max, step: step, readOnly: readonly || disabled, disabled: disabled, "aria-label": inputAriaLabel, onKeyDown: handleKeyDown, "aria-valuemin": min, "aria-valuemax": max, "aria-valuenow": value }), React__default.default.createElement(Button, { icon: React__default.default.createElement(icons.Plus, { size: styledUtils.getMultipliedSize(theme.default.base.baseWidth, 2) }), variant: "secondary", onClick: increase, disabled: disabled || isMaxReached(value + step), type: "button", "aria-label": increaseButtonAriaLabel || undefined, "data-testid": dataTestId ? `${dataTestId}-increase` : undefined }))); }; exports.default = AmountSelector;