@vimeo/iris
Version:
Vimeo Design System
545 lines (543 loc) • 28.7 kB
JavaScript
import { g as __awaiter, c as __assign, h as __generator } from '../../../tslib.es6-7f0e734f.js';
import React__default from 'react';
import { s as screen, r as render, a as act, f as fireEvent, w as waitForWrapper } from '../../../react.esm-edf204b5.js';
import { u as userEvent } from '../../../index-cff9b439.js';
import { ColorSelect2 } from './ColorSelect2.esm.js';
import { ThemeProvider } from 'styled-components';
import { themes } from '../../../themes/index.esm.js';
import '../../../es.typed-array.set-c204e812.js';
import 'os';
import 'tty';
import 'react-dom';
import 'util';
import 'polished';
import './ColorSelect2.state.esm.js';
import '../../../color/colorUtils.esm.js';
import './ColorSelect2Input.esm.js';
import './ColorSelect2.style.esm.js';
import '../InnerButton.esm.js';
import '../../Button/Button.esm.js';
import '../../Button/Button.style.esm.js';
import '../../Button/Button.config.esm.js';
import '../../Button/FeaturedIcon.esm.js';
import '../../../color/colors.esm.js';
import '../../../tokens/core.esm.js';
import '../../../tokens/color/index.esm.js';
import '../../../tokens/color/background/background.esm.js';
import '../../../tokens/util/readToken.esm.js';
import '../../../tokens/util/clamp.esm.js';
import '../../../tokens/color/format/format.esm.js';
import '../../../tokens/color/format/primary.esm.js';
import '../../../tokens/color/format/secondary.esm.js';
import '../../../tokens/color/format/tertiary.esm.js';
import '../../../tokens/color/rainbow/rainbow.esm.js';
import '../../../tokens/color/rainbow/conic/index.esm.js';
import '../../../tokens/color/rainbow/conic/sm.esm.js';
import '../../../tokens/color/rainbow/conic/xl.esm.js';
import '../../../tokens/color/rainbow/linear/index.esm.js';
import '../../../tokens/color/rainbow/linear/sm.esm.js';
import '../../../tokens/color/rainbow/linear/xl.esm.js';
import '../../../tokens/color/livestream/livestream.esm.js';
import '../../../tokens/color/status/status.esm.js';
import '../../../tokens/color/status/caution.esm.js';
import '../../../tokens/color/status/negative.esm.js';
import '../../../tokens/color/status/positive.esm.js';
import '../../../tokens/color/stroke/stroke.esm.js';
import '../../../tokens/color/surface/surface.esm.js';
import '../../../tokens/color/text/text.esm.js';
import '../../../tokens/util/round.esm.js';
import '../../../tokens/color/upsell/upsell.esm.js';
import '../../../tokens/color/upsell/sm.esm.js';
import '../../../tokens/color/upsell/xl.esm.js';
import '../../../tokens/color/upsell/new.esm.js';
import '../../../tokens/edge/edge.esm.js';
import '../../../tokens/space/space.esm.js';
import '../../../tokens/typography/index.esm.js';
import '../../../tokens/typography/size/size.esm.js';
import '../../LoaderCircular/LoaderCircular.esm.js';
import '../../LoaderCircular/LoaderCircular.style.esm.js';
import '../../../utils/HOCs/withIris.esm.js';
import '../../../utils/hooks/useDeprecate.esm.js';
import '../../../utils/general/mergeReactRefs.esm.js';
import '../../../utils/css.esm.js';
import '../../Tip/Tip.esm.js';
import '../../Tip/Tip.settings.esm.js';
import '../../Tip/Tip.style.esm.js';
import '../../../utils/hooks/usePortal_DEPRECATED/usePortal_DEPRECATED.esm.js';
import '../../../utils/hooks/usePortal_DEPRECATED/usePortal_DEPRECATED.style.esm.js';
import '../../../utils/hooks/usePortal_DEPRECATED/useMountAnimations.esm.js';
import '../../../utils/hooks/useIsomorphicEffect.esm.js';
import '../../../utils/DOM/getComputedStyles.esm.js';
import '../../../utils/DOM/animate.esm.js';
import '../../../utils/events/onEvent.esm.js';
import '../../../utils/hooks/usePortal_DEPRECATED/coordinates.esm.js';
import '../../../utils/hooks/usePortal_DEPRECATED/Anchor.esm.js';
import '../../../utils/hooks/useOutsideClick.esm.js';
import '../../../utils/DOM/SSR.esm.js';
import '../../../utils/DOM/createPortalOutlet.esm.js';
import '../../../utils/DOM/createElement.esm.js';
import '../../../utils/hooks/useIrisError.esm.js';
import '../../../utils/general/generateUID.esm.js';
import '../../../typography/Paragraph/Paragraph.esm.js';
import '../../../typography/Paragraph/Paragraph.style.esm.js';
import '../../../typography/Text/Text.esm.js';
import '../../../typography/Text/Text.style.esm.js';
import '../../../typography/typography.esm.js';
import '../../../typography/Text/EditableText.esm.js';
import '../../../utils/hooks/useLayoutStyles.esm.js';
import '../../../utils/DOM/geometry.esm.js';
import '../Input/Input.esm.js';
import '../Input/Text.esm.js';
import '../Input/Input.style.esm.js';
import '../Shared.esm.js';
import '../Input/useSuggestions.esm.js';
import '../../../typography/Header/Header.esm.js';
import '../../../typography/Header/Header.style.esm.js';
import '../Wrapper/Wrapper.esm.js';
import '../../PopOver/PopOver.esm.js';
import '../../PopOver/PopOver.style.esm.js';
import '../../PopOver/PopOver.error.esm.js';
import '../Input/Mark.esm.js';
import '../../../icons/ui/History.esm.js';
import './ColorSelect2PopoverContent.esm.js';
import './Presets.esm.js';
import '../../../icons/ui/Pencil.esm.js';
import './ColorSelect2Picker.esm.js';
import '../../../utils/general/throttle.esm.js';
import './Inputs.esm.js';
var Provider = function (_a) {
var children = _a.children;
return (React__default.createElement(ThemeProvider, { theme: themes['light'] }, children));
};
var renderWithThemeProvider = function (ui, options) { return render(ui, __assign({ wrapper: Provider }, options)); };
var TEST_COLOR = '#CCCCCC';
describe('ColorSelect2', function () {
it('Renders ColorSelect2 input', function () {
renderWithThemeProvider(React__default.createElement(ColorSelect2, null));
var input = screen.getByLabelText('color');
expect(input).toBeInTheDocument();
});
it('Renders ColorSelect2 picker using input', function () { return __awaiter(void 0, void 0, void 0, function () {
var input, picker;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
renderWithThemeProvider(React__default.createElement(ColorSelect2, null));
input = screen.getByLabelText('color');
return [4 /*yield*/, act(function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, userEvent.click(input)];
case 1: return [2 /*return*/, _a.sent()];
}
}); }); })];
case 1:
_a.sent();
picker = screen.getByLabelText('color picker');
expect(picker).toBeInTheDocument();
return [2 /*return*/];
}
});
}); });
it('Renders ColorSelect2 picker using children', function () { return __awaiter(void 0, void 0, void 0, function () {
var trigger, picker;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
renderWithThemeProvider(React__default.createElement(ColorSelect2, null,
React__default.createElement("button", { "data-testid": "trigger" })));
trigger = screen.getByTestId('trigger');
return [4 /*yield*/, act(function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, userEvent.click(trigger)];
case 1: return [2 /*return*/, _a.sent()];
}
}); }); })];
case 1:
_a.sent();
picker = screen.getByLabelText('color picker');
expect(picker).toBeInTheDocument();
return [2 /*return*/];
}
});
}); });
it('Set ColorSelect2 color using value prop', function () { return __awaiter(void 0, void 0, void 0, function () {
var input;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
renderWithThemeProvider(React__default.createElement(ColorSelect2, { value: TEST_COLOR }));
input = screen.getByLabelText('color');
return [4 /*yield*/, act(function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, userEvent.click(input)];
case 1: return [2 /*return*/, _a.sent()];
}
}); }); })];
case 1:
_a.sent();
expect(input.value).toBe(TEST_COLOR);
return [2 /*return*/];
}
});
}); });
it('Change ColorSelect2 color using input', function () { return __awaiter(void 0, void 0, void 0, function () {
var input;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
renderWithThemeProvider(React__default.createElement(ColorSelect2, null));
input = screen.getByLabelText('color');
return [4 /*yield*/, act(function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, userEvent.click(input)];
case 1: return [2 /*return*/, _a.sent()];
}
}); }); })];
case 1:
_a.sent();
fireEvent.change(input, { target: { value: TEST_COLOR } });
expect(input.value).toBe(TEST_COLOR);
return [2 /*return*/];
}
});
}); });
it('Fires onChange callback', function () { return __awaiter(void 0, void 0, void 0, function () {
var mockFn, input;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
mockFn = jest.fn();
renderWithThemeProvider(React__default.createElement(ColorSelect2, { onChange: mockFn }));
input = screen.getByLabelText('color');
return [4 /*yield*/, act(function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, userEvent.click(input)];
case 1: return [2 /*return*/, _a.sent()];
}
}); }); })];
case 1:
_a.sent();
return [4 /*yield*/, fireEvent.change(input, { target: { value: TEST_COLOR } })];
case 2:
_a.sent();
expect(mockFn).toBeCalledWith(TEST_COLOR);
return [2 /*return*/];
}
});
}); });
it('Fires onClose callback', function () { return __awaiter(void 0, void 0, void 0, function () {
var mockFn, input;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
mockFn = jest.fn();
renderWithThemeProvider(React__default.createElement(ColorSelect2, { onClose: mockFn }));
input = screen.getByLabelText('color');
return [4 /*yield*/, act(function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, userEvent.click(input)];
case 1: return [2 /*return*/, _a.sent()];
}
}); }); })];
case 1:
_a.sent();
return [4 /*yield*/, act(function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, userEvent.click(input)];
case 1: return [2 /*return*/, _a.sent()];
}
}); }); })];
case 2:
_a.sent(); // Another click to close the picker
expect(mockFn).toBeCalled();
return [2 /*return*/];
}
});
}); });
it('Resets ColorSelect2 color using reset button', function () { return __awaiter(void 0, void 0, void 0, function () {
var reset, input, resetButton;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
reset = { color: '#FFFFFF', label: 'My Reset' };
renderWithThemeProvider(React__default.createElement(ColorSelect2, { reset: reset }));
input = screen.getByLabelText('color');
return [4 /*yield*/, act(function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, userEvent.click(input)];
case 1: return [2 /*return*/, _a.sent()];
}
}); }); })];
case 1:
_a.sent();
fireEvent.change(input, { target: { value: TEST_COLOR } });
resetButton = screen.getByLabelText('reset');
return [4 /*yield*/, act(function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, userEvent.click(resetButton)];
case 1: return [2 /*return*/, _a.sent()];
}
}); }); })];
case 2:
_a.sent();
expect(input.value).toBe(reset.color);
return [2 /*return*/];
}
});
}); });
it('Change size', function () { return __awaiter(void 0, void 0, void 0, function () {
var rerender, label;
return __generator(this, function (_a) {
rerender = renderWithThemeProvider(React__default.createElement(ColorSelect2, { size: "sm" })).rerender;
label = screen.getByLabelText('color');
expect(label).toHaveStyle({ 'font-size': '0.75rem' });
rerender(React__default.createElement(ColorSelect2, { size: "md" }));
expect(label).toHaveStyle({ 'font-size': '1rem' });
rerender(React__default.createElement(ColorSelect2, { size: "lg" }));
expect(label).toHaveStyle({ 'font-size': '1.5rem' });
rerender(React__default.createElement(ColorSelect2, { size: "xl" }));
expect(label).toHaveStyle({ 'font-size': '1.75rem' });
return [2 /*return*/];
});
}); });
/*
This test is skipped because ColorSelect2
doesn't implement adding required attribute
to the color picker div
*/
xit('Make ColorSelect2 required', function () { return __awaiter(void 0, void 0, void 0, function () {
var input, picker, pickerInner;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
renderWithThemeProvider(React__default.createElement(ColorSelect2, { required: true }));
input = screen.getByLabelText('color');
return [4 /*yield*/, act(function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, userEvent.click(input)];
case 1: return [2 /*return*/, _a.sent()];
}
}); }); })];
case 1:
_a.sent();
picker = screen.getByLabelText('color picker');
pickerInner = picker.querySelector('div');
expect(pickerInner).toHaveAttribute('required');
return [2 /*return*/];
}
});
}); });
/*
This test is skipped because ColorSelect2
doesn't implement adding name attribute
to the color picker div
*/
xit('Has a name', function () { return __awaiter(void 0, void 0, void 0, function () {
var name, input, picker, pickerInner, nameAttribute;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
name = 'hello';
renderWithThemeProvider(React__default.createElement(ColorSelect2, { name: name }));
input = screen.getByLabelText('color');
return [4 /*yield*/, act(function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, userEvent.click(input)];
case 1: return [2 /*return*/, _a.sent()];
}
}); }); })];
case 1:
_a.sent();
picker = screen.getByLabelText('color picker');
pickerInner = picker.querySelector('div');
nameAttribute = pickerInner.getAttribute('name');
expect(nameAttribute).toBe(name);
return [2 /*return*/];
}
});
}); });
it('Render a label for ColorSelect2', function () { return __awaiter(void 0, void 0, void 0, function () {
var label, renderedLabel;
return __generator(this, function (_a) {
label = 'My Label';
renderWithThemeProvider(React__default.createElement(ColorSelect2, { label: label }));
renderedLabel = document.querySelector('label');
expect(renderedLabel.innerHTML).toBe(label);
return [2 /*return*/];
});
}); });
it('Render with initial color', function () { return __awaiter(void 0, void 0, void 0, function () {
var initial, input;
return __generator(this, function (_a) {
initial = { color: TEST_COLOR };
renderWithThemeProvider(React__default.createElement(ColorSelect2, { initial: initial }));
input = screen.getByLabelText('color');
expect(input.value).toBe(TEST_COLOR);
return [2 /*return*/];
});
}); });
it('Render ColorSelect2 without hue slider', function () { return __awaiter(void 0, void 0, void 0, function () {
var input, hueSlider;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
renderWithThemeProvider(React__default.createElement(ColorSelect2, { showHueSlider: false }));
input = screen.getByLabelText('color');
return [4 /*yield*/, act(function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, userEvent.click(input)];
case 1: return [2 /*return*/, _a.sent()];
}
}); }); })];
case 1:
_a.sent();
hueSlider = document.querySelector('[kind=hue]');
expect(hueSlider).not.toBeInTheDocument();
return [2 /*return*/];
}
});
}); });
it('Select color from presets', function () { return __awaiter(void 0, void 0, void 0, function () {
var palette, mockFn, input, preset;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
palette = ['#909CDC', '#7BD8DB', '#78DD89'];
mockFn = jest.fn();
renderWithThemeProvider(React__default.createElement(ColorSelect2, { onChange: mockFn, presets: { palette: palette } }));
input = screen.getByLabelText('color');
return [4 /*yield*/, act(function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, userEvent.click(input)];
case 1: return [2 /*return*/, _a.sent()];
}
}); }); })];
case 1:
_a.sent();
preset = screen.getByLabelText(palette[1]);
return [4 /*yield*/, act(function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, userEvent.click(preset)];
case 1: return [2 /*return*/, _a.sent()];
}
}); }); })];
case 2:
_a.sent();
expect(mockFn).toBeCalledWith(palette[1]);
return [2 /*return*/];
}
});
}); });
it('Render a label for presets', function () { return __awaiter(void 0, void 0, void 0, function () {
var palette, label, input, renderedLabel;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
palette = ['#909CDC', '#7BD8DB', '#78DD89'];
label = 'My Label';
renderWithThemeProvider(React__default.createElement(ColorSelect2, { presets: { palette: palette, label: label } }));
input = screen.getByLabelText('color');
return [4 /*yield*/, act(function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, userEvent.click(input)];
case 1: return [2 /*return*/, _a.sent()];
}
}); }); })];
case 1:
_a.sent();
renderedLabel = document.querySelector('p');
expect(renderedLabel.innerHTML).toBe(label);
return [2 /*return*/];
}
});
}); });
it('Closes the color picker on outside click', function () { return __awaiter(void 0, void 0, void 0, function () {
var mockFn, input, button;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
mockFn = jest.fn();
renderWithThemeProvider(React__default.createElement(React__default.Fragment, null,
React__default.createElement(ColorSelect2, { onClose: mockFn }),
React__default.createElement("button", { id: "test_button" }, "Test Button")));
input = screen.getByLabelText('color');
button = screen.getByText('Test Button');
return [4 /*yield*/, act(function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, userEvent.click(input)];
case 1: return [2 /*return*/, _a.sent()];
}
}); }); })];
case 1:
_a.sent(); // Open the color picker.
return [4 /*yield*/, act(function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, userEvent.click(button)];
case 1: return [2 /*return*/, _a.sent()];
}
}); }); })];
case 2:
_a.sent(); // Trigger an outside click to close the picker.
return [4 /*yield*/, waitForWrapper(function () { return expect(mockFn).toBeCalled(); })];
case 3:
_a.sent();
return [2 /*return*/];
}
});
}); });
it('Closes the color picker on outside click, with stopPropagation() called on click target', function () { return __awaiter(void 0, void 0, void 0, function () {
var mockFn, input, button;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
mockFn = jest.fn();
renderWithThemeProvider(React__default.createElement(React__default.Fragment, null,
React__default.createElement(ColorSelect2, { onClose: mockFn }),
React__default.createElement("button", { id: "test_button" }, "Test Button")));
input = screen.getByLabelText('color');
button = screen.getByText('Test Button');
button.addEventListener('click', function (event) {
return event.stopPropagation();
});
return [4 /*yield*/, act(function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, userEvent.click(input)];
case 1: return [2 /*return*/, _a.sent()];
}
}); }); })];
case 1:
_a.sent(); // Open the color picker.
return [4 /*yield*/, act(function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, userEvent.click(button)];
case 1: return [2 /*return*/, _a.sent()];
}
}); }); })];
case 2:
_a.sent(); // Trigger an outside click to close the picker.
return [4 /*yield*/, waitForWrapper(function () { return expect(mockFn).toBeCalled(); })];
case 3:
_a.sent();
return [2 /*return*/];
}
});
}); });
it('ColorSelect2 input should be disabled', function () { return __awaiter(void 0, void 0, void 0, function () {
var input;
return __generator(this, function (_a) {
renderWithThemeProvider(React__default.createElement(ColorSelect2, { disabled: true }));
input = screen.getByLabelText('color');
expect(input).toBeDisabled();
return [2 /*return*/];
});
}); });
it('ColorSelect2 reset button should be disabled', function () { return __awaiter(void 0, void 0, void 0, function () {
var resetButton;
return __generator(this, function (_a) {
renderWithThemeProvider(React__default.createElement(ColorSelect2, { disabled: true }));
resetButton = screen.getByLabelText('reset');
expect(resetButton).toBeDisabled();
return [2 /*return*/];
});
}); });
});