UNPKG

@music-loopy/loops

Version:

A React component library for Music Loopy Applications and websites

157 lines (156 loc) 12.4 kB
"use strict"; exports.__esModule = true; exports["default"] = exports.CheckboxSelect = void 0; var _react = _interopRequireWildcard(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var _styledComponents = _interopRequireDefault(require("styled-components")); var _Icon = _interopRequireDefault(require("../Icon")); var _lia = require("react-icons/lia"); var _excluded = ["color", "label", "options", "onChange", "firstRow", "icon", "selectedOptions"]; var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7, _templateObject8, _templateObject9, _templateObject10; function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; } function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); } function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; } function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); } function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (e.indexOf(n) >= 0) continue; t[n] = r[n]; } return t; } function _taggedTemplateLiteralLoose(e, t) { return t || (t = e.slice(0)), e.raw = t, e; } var StyledContainer = _styledComponents["default"].div(_templateObject || (_templateObject = _taggedTemplateLiteralLoose(["\n width: 100%;\n border: 1px solid\n ", ";\n padding: 5px;\n background: ", ";\n border-radius: 5px;\n overflow: hidden;\n transition:\n max-height 0.25s ease-in-out,\n opacity 0.25s ease-in-out;\n max-height: ", ";\n ", "\n"])), function (props) { return props.theme.colors[props.color.border || 'primary'].color; }, function (props) { return props.theme.colors[props.color.background || 'primary'].color; }, function (props) { return props.isOpen ? '50vh' : '100px'; }, function (props) { return props.isOpen && "position: relative;\n overflow: scroll;\n box-shadow: 1px 1px 11px 1px #00000057;\n "; }); var IconContainer = _styledComponents["default"].div(_templateObject2 || (_templateObject2 = _taggedTemplateLiteralLoose(["\n display: flex;\n align-items: center;\n justify-content: center;\n width: 5%;\n margin-left: 1%;\n svg {\n color: ", ";\n }\n"])), function (props) { return props.theme.colors[props.color || 'primary'].color; }); var LabelContainer = _styledComponents["default"].div(_templateObject3 || (_templateObject3 = _taggedTemplateLiteralLoose(["\n display: flex;\n align-items: center;\n justify-content: flex-start;\n width: 80%;\n margin-left: 2%;\n color: ", ";\n"])), function (props) { return props.theme.colors[props.color || 'primary'].color; }); var Circle = _styledComponents["default"].div(_templateObject4 || (_templateObject4 = _taggedTemplateLiteralLoose(["\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 50%;\n width: 15px;\n height: 15px;\n font-weight: 600;\n border: 2px solid\n ", ";\n transition: transform 0.25s ease-in-out;\n svg {\n stroke-width: 2.5px;\n }\n &:hover {\n cursor: pointer;\n transform: scale(1.1);\n }\n"])), function (props) { return props.theme.colors[props.color || 'primary'].color; }); var Rows = _styledComponents["default"].div(_templateObject5 || (_templateObject5 = _taggedTemplateLiteralLoose(["\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 5px;\n flex-direction: column;\n padding-top: ", ";\n padding-bottom: ", ";\n margin-left: 7%;\n width: 100%;\n margin-top: ", ";\n transition: all 0.25s ease-in-out;\n"])), function (props) { return props.isOpen ? '10px' : '0'; }, function (props) { return props.isOpen ? '10px' : '0'; }, function (props) { return props.isOpen ? '5%' : '0'; }); var Row = _styledComponents["default"].div(_templateObject6 || (_templateObject6 = _taggedTemplateLiteralLoose(["\n display: flex;\n align-items: center;\n justify-content: flex-start;\n flex-direction: row;\n transition: all 0.25s ease-in-out;\n"]))); var RadioButtonContainer = _styledComponents["default"].div(_templateObject7 || (_templateObject7 = _taggedTemplateLiteralLoose(["\n display: flex;\n align-items: center;\n justify-content: flex-start;\n gap: 10px;\n flex-direction: row;\n transition: all 0.25s ease-in-out;\n"]))); var Checkbox = _styledComponents["default"].input(_templateObject8 || (_templateObject8 = _taggedTemplateLiteralLoose(["\n width: 10px;\n transition: all 0.25s ease-in-out;\n visibility: hidden;\n position: absolute;\n &::after {\n --color-border: ", ";\n --color-dot: var(--color-border);\n content: '';\n visibility: visible;\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n left: calc(var(--padding) * -1);\n width: var(--size);\n height: var(--size);\n border-radius: 1px;\n color: lightgray;\n\n box-shadow: 0 0 0 2px var(--color-border);\n pointer-events: none;\n }\n\n &:checked::after {\n content: '\u2713';\n color: var(--color-dot);\n display: flex;\n justify-content: center;\n align-items: center;\n }\n"])), function (props) { var _props$color; return props.theme.colors[((_props$color = props.color) === null || _props$color === void 0 ? void 0 : _props$color.text) || 'darkGrey'].color; }); var Label = _styledComponents["default"].label(_templateObject9 || (_templateObject9 = _taggedTemplateLiteralLoose(["\n color: ", ";\n font-size: 12px;\n --size: 10px;\n --padding: calc(var(--size) + 1em);\n position: relative;\n margin: 0.25em;\n min-height: var(--size);\n padding-left: var(--padding);\n cursor: pointer;\n display: flex;\n justify-content: flex-start;\n align-items: center;\n transition: all 0.25s ease-in-out;\n"])), function (props) { var _props$color2; return props.theme.colors[((_props$color2 = props.color) === null || _props$color2 === void 0 ? void 0 : _props$color2.text) || 'darkGrey' || 'primary'].color; }); var FirstRow = _styledComponents["default"].div(_templateObject10 || (_templateObject10 = _taggedTemplateLiteralLoose(["\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 5px;\n z-index: 1;\n flex-direction: row;\n ", "\n"])), function (props) { return props.isOpen && "\n position: sticky;\n background: hsl(\n from " + props.theme.colors[props.background || 'primary'].color + " h s calc(l - 5)\n );\n top: -10px;\n left: -10px;\n right: -2px;\n z-index: 10;\n padding: 5px;\n margin: -5px;\n "; }); var CheckboxSelect = exports.CheckboxSelect = function CheckboxSelect(_ref) { var color = _ref.color, label = _ref.label, options = _ref.options, onChange = _ref.onChange, firstRow = _ref.firstRow, icon = _ref.icon, selectedOptions = _ref.selectedOptions, rest = _objectWithoutPropertiesLoose(_ref, _excluded); var _useState = (0, _react.useState)(false), isOpen = _useState[0], setIsOpen = _useState[1]; var _useState2 = (0, _react.useState)(selectedOptions || []), _selectedOptions = _useState2[0], setSelectedOptions = _useState2[1]; var openSelect = function openSelect() { setIsOpen(!isOpen); }; var handleCheckboxSelect = function handleCheckboxSelect(e) { var checked = e.target.checked; if (checked) { var option = options.find(function (option) { return option.id === e.target.id; }); var newSelectedOptions = [].concat(_selectedOptions, [option]); onChange(newSelectedOptions); setSelectedOptions(newSelectedOptions); } else { var _newSelectedOptions = _selectedOptions.filter(function (option) { return option.id !== e.target.id; }); onChange(_newSelectedOptions); setSelectedOptions(_newSelectedOptions); } }; return /*#__PURE__*/_react["default"].createElement(StyledContainer, _extends({ color: color, isOpen: isOpen }, rest), /*#__PURE__*/_react["default"].createElement(FirstRow, { isOpen: isOpen, style: { display: 'flex', alignItems: 'center', justifyContent: 'space-between' }, background: isOpen ? (firstRow === null || firstRow === void 0 ? void 0 : firstRow.background) || 'light' : (color === null || color === void 0 ? void 0 : color.icon) || 'darkGrey' }, /*#__PURE__*/_react["default"].createElement(IconContainer, { color: isOpen ? (firstRow === null || firstRow === void 0 ? void 0 : firstRow.text) || 'darkGrey' : (color === null || color === void 0 ? void 0 : color.icon) || 'darkGrey' }, /*#__PURE__*/_react["default"].createElement(_Icon["default"], { name: icon, fill: isOpen ? (firstRow === null || firstRow === void 0 ? void 0 : firstRow.text) || 'darkGrey' : (color === null || color === void 0 ? void 0 : color.icon) || 'darkGrey' })), /*#__PURE__*/_react["default"].createElement(LabelContainer, { color: isOpen ? (firstRow === null || firstRow === void 0 ? void 0 : firstRow.text) || 'darkGrey' : (color === null || color === void 0 ? void 0 : color.text) || 'darkGrey' }, label), /*#__PURE__*/_react["default"].createElement(IconContainer, { color: isOpen ? (firstRow === null || firstRow === void 0 ? void 0 : firstRow.text) || 'darkGrey' : (color === null || color === void 0 ? void 0 : color.icon) || 'darkGrey', onClick: function onClick() { return openSelect(); } }, isOpen ? /*#__PURE__*/_react["default"].createElement(Circle, { color: isOpen ? (firstRow === null || firstRow === void 0 ? void 0 : firstRow.text) || 'darkGrey' : (color === null || color === void 0 ? void 0 : color.icon) || 'darkGrey' }, ' ', /*#__PURE__*/_react["default"].createElement(_lia.LiaAngleUpSolid, { size: "2em" })) : /*#__PURE__*/_react["default"].createElement(Circle, { color: isOpen ? (firstRow === null || firstRow === void 0 ? void 0 : firstRow.text) || 'darkGrey' : (color === null || color === void 0 ? void 0 : color.icon) || 'darkGrey' }, /*#__PURE__*/_react["default"].createElement(_lia.LiaAngleDownSolid, { size: "2em" })))), /*#__PURE__*/_react["default"].createElement(Row, null, /*#__PURE__*/_react["default"].createElement(Rows, { isOpen: isOpen, color: color }, isOpen && options.map(function (option) { return /*#__PURE__*/_react["default"].createElement(Row, { key: option.label }, /*#__PURE__*/_react["default"].createElement(RadioButtonContainer, null, /*#__PURE__*/_react["default"].createElement(Label, { className: "radio", color: color, htmlFor: option.id }, /*#__PURE__*/_react["default"].createElement(Checkbox, { type: "checkbox", id: option.id, name: option.name, onClick: handleCheckboxSelect, checked: _selectedOptions.some(function (selectedOption) { return selectedOption.id === option.id; }), color: color }), option.label))); })))); }; CheckboxSelect.propTypes = process.env.NODE_ENV !== "production" ? { color: _propTypes["default"].shape({ border: _propTypes["default"].string, text: _propTypes["default"].string, icon: _propTypes["default"].string }), label: _propTypes["default"].string.isRequired, options: _propTypes["default"].arrayOf(_propTypes["default"].shape({ id: _propTypes["default"].string, name: _propTypes["default"].string, label: _propTypes["default"].string })) } : {}; var _default = exports["default"] = CheckboxSelect;