@thednp/color-picker 1.0.1 → 2.0.0-alpha2
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.
- package/.eslintrc.cjs +199 -0
- package/.lgtm.yml +9 -0
- package/.prettierrc.json +15 -0
- package/.stylelintrc.json +236 -0
- package/LICENSE +0 -0
- package/README.md +55 -72
- package/compile.js +48 -0
- package/cypress/e2e/color-palette.cy.ts +128 -0
- package/cypress/e2e/color-picker.cy.ts +920 -0
- package/cypress/fixtures/colorNamesFrench.js +3 -0
- package/cypress/fixtures/componentLabelsFrench.js +21 -0
- package/cypress/fixtures/format.js +3 -0
- package/cypress/fixtures/getCEMarkup.js +29 -0
- package/cypress/fixtures/getMarkup.js +28 -0
- package/cypress/fixtures/getRandomInt.js +6 -0
- package/cypress/fixtures/sampleWebcolors.js +18 -0
- package/cypress/fixtures/testSample.js +8 -0
- package/cypress/plugins/esbuild-istanbul.ts +50 -0
- package/cypress/plugins/tsCompile.ts +34 -0
- package/cypress/support/commands.ts +0 -0
- package/cypress/support/e2e.ts +21 -0
- package/cypress/test.html +23 -0
- package/cypress.config.ts +29 -0
- package/dist/css/color-picker.css +16 -40
- package/dist/css/color-picker.min.css +2 -2
- package/dist/css/color-picker.rtl.css +16 -40
- package/dist/css/color-picker.rtl.min.css +2 -2
- package/dist/js/color-picker.cjs +8 -0
- package/dist/js/color-picker.cjs.map +1 -0
- package/dist/js/color-picker.d.ts +278 -0
- package/dist/js/color-picker.js +5 -3570
- package/dist/js/color-picker.js.map +1 -0
- package/dist/js/color-picker.mjs +2631 -0
- package/dist/js/color-picker.mjs.map +1 -0
- package/dts.config.ts +15 -0
- package/package.json +64 -74
- package/src/scss/_variables.scss +0 -1
- package/src/scss/color-picker.rtl.scss +4 -0
- package/src/scss/color-picker.scss +80 -40
- package/src/ts/colorPalette.ts +89 -0
- package/src/{js/color-picker.js → ts/index.ts} +489 -486
- package/src/ts/interface/colorPickerLabels.ts +20 -0
- package/src/ts/interface/colorPickerOptions.ts +11 -0
- package/src/ts/interface/paletteOptions.ts +6 -0
- package/src/ts/util/colorNames.ts +21 -0
- package/src/{js/util/colorPickerLabels.js → ts/util/colorPickerLabels.ts} +4 -2
- package/src/ts/util/getColorControls.ts +90 -0
- package/src/{js/util/getColorForm.js → ts/util/getColorForm.ts} +28 -18
- package/src/{js/util/getColorMenu.js → ts/util/getColorMenu.ts} +21 -30
- package/src/ts/util/isValidJSON.ts +19 -0
- package/src/{js/util/setMarkup.js → ts/util/setMarkup.ts} +57 -48
- package/src/{js/util/vHidden.js → ts/util/vHidden.ts} +0 -0
- package/tsconfig.json +29 -0
- package/vite.config.ts +34 -0
- package/dist/js/color-esm.js +0 -1164
- package/dist/js/color-esm.min.js +0 -2
- package/dist/js/color-palette-esm.js +0 -1235
- package/dist/js/color-palette-esm.min.js +0 -2
- package/dist/js/color-palette.js +0 -1243
- package/dist/js/color-palette.min.js +0 -2
- package/dist/js/color-picker-element-esm.js +0 -3718
- package/dist/js/color-picker-element-esm.min.js +0 -2
- package/dist/js/color-picker-element.js +0 -3726
- package/dist/js/color-picker-element.min.js +0 -2
- package/dist/js/color-picker-esm.js +0 -3565
- package/dist/js/color-picker-esm.min.js +0 -2
- package/dist/js/color-picker.min.js +0 -2
- package/dist/js/color.js +0 -1172
- package/dist/js/color.min.js +0 -2
- package/src/js/color-palette.js +0 -75
- package/src/js/color-picker-element.js +0 -107
- package/src/js/color.js +0 -1104
- package/src/js/index.js +0 -8
- package/src/js/util/colorNames.js +0 -6
- package/src/js/util/getColorControls.js +0 -103
- package/src/js/util/isValidJSON.js +0 -13
- package/src/js/util/nonColors.js +0 -5
- package/src/js/util/roundPart.js +0 -9
- package/src/js/util/setCSSProperties.js +0 -12
- package/src/js/util/tabindex.js +0 -3
- package/src/js/util/toggleCEAttr.js +0 -70
- package/src/js/util/version.js +0 -5
- package/src/js/version.js +0 -5
- package/types/cp.d.ts +0 -558
- package/types/index.d.ts +0 -44
- package/types/source/source.ts +0 -4
- package/types/source/types.d.ts +0 -92
@@ -0,0 +1,20 @@
|
|
1
|
+
export default interface ColorPickerLabels {
|
2
|
+
pickerLabel: string;
|
3
|
+
appearanceLabel: string;
|
4
|
+
valueLabel: string;
|
5
|
+
toggleLabel: string;
|
6
|
+
presetsLabel: string;
|
7
|
+
defaultsLabel: string;
|
8
|
+
formatLabel: string;
|
9
|
+
alphaLabel: string;
|
10
|
+
hexLabel: string;
|
11
|
+
hueLabel: string;
|
12
|
+
whitenessLabel: string;
|
13
|
+
blacknessLabel: string;
|
14
|
+
saturationLabel: string;
|
15
|
+
lightnessLabel: string;
|
16
|
+
redLabel: string;
|
17
|
+
greenLabel: string;
|
18
|
+
blueLabel: string;
|
19
|
+
[key: string]: string;
|
20
|
+
}
|
@@ -0,0 +1,11 @@
|
|
1
|
+
import type { ColorFormats } from '@thednp/color';
|
2
|
+
import ColorPickerLabels from './colorPickerLabels';
|
3
|
+
import ColorPalette from '../colorPalette';
|
4
|
+
|
5
|
+
export default interface ColorPickerOptions {
|
6
|
+
colorLabels: string | string[];
|
7
|
+
componentLabels: ColorPickerLabels;
|
8
|
+
format: ColorFormats;
|
9
|
+
colorPresets: string | string[] | ColorPalette | false;
|
10
|
+
colorKeywords: string | string[] | false;
|
11
|
+
}
|
@@ -0,0 +1,21 @@
|
|
1
|
+
/** A list of 17 color names used for WAI-ARIA compliance. */
|
2
|
+
const colorNames: string[] = [
|
3
|
+
'white',
|
4
|
+
'black',
|
5
|
+
'grey',
|
6
|
+
'red',
|
7
|
+
'orange',
|
8
|
+
'brown',
|
9
|
+
'gold',
|
10
|
+
'olive',
|
11
|
+
'yellow',
|
12
|
+
'lime',
|
13
|
+
'green',
|
14
|
+
'teal',
|
15
|
+
'cyan',
|
16
|
+
'blue',
|
17
|
+
'violet',
|
18
|
+
'magenta',
|
19
|
+
'pink',
|
20
|
+
];
|
21
|
+
export default colorNames;
|
@@ -1,5 +1,7 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
import ColorPickerLabels from '../interface/colorPickerLabels';
|
2
|
+
|
3
|
+
/** The labels presented to the user. */
|
4
|
+
const colorPickerLabels: ColorPickerLabels = {
|
3
5
|
pickerLabel: 'Colour Picker',
|
4
6
|
appearanceLabel: 'Colour Appearance',
|
5
7
|
valueLabel: 'Colour Value',
|
@@ -0,0 +1,90 @@
|
|
1
|
+
import { createElement } from '@thednp/shorty';
|
2
|
+
|
3
|
+
import ColorPicker from '..';
|
4
|
+
|
5
|
+
/**
|
6
|
+
* Returns all color controls for `ColorPicker`.
|
7
|
+
*
|
8
|
+
* @param self the `ColorPicker` instance
|
9
|
+
* @returns color controls
|
10
|
+
*/
|
11
|
+
const getColorControls = (self: ColorPicker): HTMLElement => {
|
12
|
+
const { format, componentLabels } = self;
|
13
|
+
const { hueLabel, alphaLabel, lightnessLabel, saturationLabel, whitenessLabel, blacknessLabel } = componentLabels;
|
14
|
+
|
15
|
+
const max1 = format === 'hsl' ? 360 : 100;
|
16
|
+
const max2 = format === 'hsl' ? 100 : 360;
|
17
|
+
const max3 = 100;
|
18
|
+
|
19
|
+
let ctrl1Label = format === 'hsl' ? `${hueLabel} & ${lightnessLabel}` : `${lightnessLabel} & ${saturationLabel}`;
|
20
|
+
|
21
|
+
ctrl1Label = format === 'hwb' ? `${whitenessLabel} & ${blacknessLabel}` : ctrl1Label;
|
22
|
+
|
23
|
+
const ctrl2Label = format === 'hsl' ? `${saturationLabel}` : `${hueLabel}`;
|
24
|
+
|
25
|
+
const colorControls = createElement({
|
26
|
+
tagName: 'div',
|
27
|
+
className: `color-controls ${format}`,
|
28
|
+
}) as HTMLElement;
|
29
|
+
|
30
|
+
const colorPointer = 'color-pointer';
|
31
|
+
const colorSlider = 'color-slider';
|
32
|
+
|
33
|
+
const controls = [
|
34
|
+
{
|
35
|
+
i: 1,
|
36
|
+
c: colorPointer,
|
37
|
+
l: ctrl1Label,
|
38
|
+
min: 0,
|
39
|
+
max: max1,
|
40
|
+
},
|
41
|
+
{
|
42
|
+
i: 2,
|
43
|
+
c: colorSlider,
|
44
|
+
l: ctrl2Label,
|
45
|
+
min: 0,
|
46
|
+
max: max2,
|
47
|
+
},
|
48
|
+
{
|
49
|
+
i: 3,
|
50
|
+
c: colorSlider,
|
51
|
+
l: alphaLabel,
|
52
|
+
min: 0,
|
53
|
+
max: max3,
|
54
|
+
},
|
55
|
+
];
|
56
|
+
|
57
|
+
controls.forEach(template => {
|
58
|
+
const { i, c, l, min, max } = template;
|
59
|
+
const control = createElement({
|
60
|
+
tagName: 'div',
|
61
|
+
className: 'color-control',
|
62
|
+
role: 'presentation',
|
63
|
+
}) as HTMLElement;
|
64
|
+
|
65
|
+
control.append(
|
66
|
+
createElement({
|
67
|
+
tagName: 'div',
|
68
|
+
className: `visual-control visual-control${i}`,
|
69
|
+
}) as HTMLElement,
|
70
|
+
);
|
71
|
+
|
72
|
+
const knob = createElement({
|
73
|
+
tagName: 'div',
|
74
|
+
className: `${c} knob`,
|
75
|
+
ariaLive: 'polite',
|
76
|
+
ariaLabel: l,
|
77
|
+
role: 'slider',
|
78
|
+
tabIndex: 0,
|
79
|
+
ariaValueMin: `${min}`,
|
80
|
+
ariaValueMax: `${max}`,
|
81
|
+
}) as HTMLElement;
|
82
|
+
|
83
|
+
control.append(knob);
|
84
|
+
colorControls.append(control);
|
85
|
+
});
|
86
|
+
|
87
|
+
return colorControls;
|
88
|
+
};
|
89
|
+
|
90
|
+
export default getColorControls;
|
@@ -1,37 +1,43 @@
|
|
1
|
-
import createElement from '
|
2
|
-
import setAttribute from 'shorter-js/src/attr/setAttribute';
|
3
|
-
import ObjectAssign from 'shorter-js/src/misc/ObjectAssign';
|
4
|
-
import toUpperCase from 'shorter-js/src/misc/toUpperCase';
|
1
|
+
import { createElement, setAttribute, ObjectAssign, toUpperCase } from '@thednp/shorty';
|
5
2
|
|
6
3
|
import vHidden from './vHidden';
|
4
|
+
import ColorPicker from '../index';
|
7
5
|
|
8
6
|
/**
|
9
7
|
* Returns the color form for `ColorPicker`.
|
10
8
|
*
|
11
|
-
* @param
|
12
|
-
* @returns
|
9
|
+
* @param self the `ColorPicker` instance
|
10
|
+
* @returns a new `<div>` element with color component `<input>`
|
13
11
|
*/
|
14
|
-
|
12
|
+
const getColorForm = (self: ColorPicker): HTMLElement => {
|
15
13
|
const { format, id, componentLabels } = self;
|
16
14
|
const colorForm = createElement({
|
17
15
|
tagName: 'div',
|
18
16
|
className: `color-form ${format}`,
|
19
|
-
});
|
17
|
+
}) as HTMLElement;
|
20
18
|
|
21
19
|
let components = ['hex'];
|
22
20
|
if (format === 'rgb') components = ['red', 'green', 'blue', 'alpha'];
|
23
21
|
else if (format === 'hsl') components = ['hue', 'saturation', 'lightness', 'alpha'];
|
24
22
|
else if (format === 'hwb') components = ['hue', 'whiteness', 'blackness', 'alpha'];
|
25
23
|
|
26
|
-
components.forEach((c) => {
|
24
|
+
components.forEach((c: string): void => {
|
27
25
|
const [C] = format === 'hex' ? ['#'] : toUpperCase(c).split('');
|
28
26
|
const cID = `color_${format}_${c}_${id}`;
|
29
27
|
const formatLabel = componentLabels[`${c}Label`];
|
30
|
-
const cInputLabel = createElement({ tagName: 'label' });
|
28
|
+
const cInputLabel = createElement({ tagName: 'label' }) as HTMLElement;
|
31
29
|
setAttribute(cInputLabel, 'for', cID);
|
32
30
|
cInputLabel.append(
|
33
|
-
createElement({
|
34
|
-
|
31
|
+
createElement({
|
32
|
+
tagName: 'span',
|
33
|
+
ariaHidden: 'true',
|
34
|
+
innerText: `${C}:`,
|
35
|
+
}) as HTMLElement,
|
36
|
+
createElement({
|
37
|
+
tagName: 'span',
|
38
|
+
className: vHidden,
|
39
|
+
innerText: formatLabel,
|
40
|
+
}) as HTMLElement,
|
35
41
|
);
|
36
42
|
const cInput = createElement({
|
37
43
|
tagName: 'input',
|
@@ -40,18 +46,20 @@ export default function getColorForm(self) {
|
|
40
46
|
type: format === 'hex' ? 'text' : 'number',
|
41
47
|
value: c === 'alpha' ? '100' : '0',
|
42
48
|
className: `color-input ${c}`,
|
43
|
-
|
44
|
-
|
45
|
-
|
49
|
+
autocomplete: 'off',
|
50
|
+
spellcheck: false,
|
51
|
+
} as Partial<HTMLInputElement>) as HTMLInputElement;
|
46
52
|
|
47
53
|
// alpha
|
48
54
|
let max = '100';
|
49
55
|
let step = '1';
|
50
56
|
if (c !== 'alpha') {
|
51
57
|
if (format === 'rgb') {
|
52
|
-
max = '255';
|
58
|
+
max = '255';
|
59
|
+
step = '1';
|
53
60
|
} else if (c === 'hue') {
|
54
|
-
max = '360';
|
61
|
+
max = '360';
|
62
|
+
step = '1';
|
55
63
|
}
|
56
64
|
}
|
57
65
|
ObjectAssign(cInput, {
|
@@ -62,4 +70,6 @@ export default function getColorForm(self) {
|
|
62
70
|
colorForm.append(cInputLabel, cInput);
|
63
71
|
});
|
64
72
|
return colorForm;
|
65
|
-
}
|
73
|
+
};
|
74
|
+
|
75
|
+
export default getColorForm;
|
@@ -1,23 +1,13 @@
|
|
1
|
-
import
|
2
|
-
import ariaSelected from 'shorter-js/src/strings/ariaSelected';
|
3
|
-
import setAttribute from 'shorter-js/src/attr/setAttribute';
|
4
|
-
import getAttribute from 'shorter-js/src/attr/getAttribute';
|
5
|
-
import createElement from 'shorter-js/src/misc/createElement';
|
6
|
-
import setElementStyle from 'shorter-js/src/misc/setElementStyle';
|
1
|
+
import { setAttribute, getAttribute, createElement, setElementStyle } from '@thednp/shorty';
|
7
2
|
|
8
|
-
import
|
9
|
-
import
|
10
|
-
import
|
11
|
-
import ColorPalette from '../color-palette';
|
3
|
+
import Color from '@thednp/color';
|
4
|
+
import ColorPalette from '../colorPalette';
|
5
|
+
import ColorPicker from '../index';
|
12
6
|
|
13
7
|
/**
|
14
8
|
* Returns a color-defaults with given values and class.
|
15
|
-
* @param {CP.ColorPicker} self
|
16
|
-
* @param {CP.ColorPalette | string[]} colorsSource
|
17
|
-
* @param {string} menuClass
|
18
|
-
* @returns {HTMLElement | Element}
|
19
9
|
*/
|
20
|
-
|
10
|
+
const getColorMenu = (self: ColorPicker, colorsSource: ColorPalette | string[], menuClass: string): HTMLElement => {
|
21
11
|
const { input, format, componentLabels } = self;
|
22
12
|
const { defaultsLabel, presetsLabel } = componentLabels;
|
23
13
|
const isOptionsMenu = menuClass === 'color-options';
|
@@ -26,7 +16,7 @@ export default function getColorMenu(self, colorsSource, menuClass) {
|
|
26
16
|
const colorsArray = isPalette ? colorsSource.colors : colorsSource;
|
27
17
|
const colorsCount = colorsArray.length;
|
28
18
|
const { lightSteps } = isPalette ? colorsSource : { lightSteps: null };
|
29
|
-
const fit = lightSteps || [9, 10].find(
|
19
|
+
const fit = lightSteps || [9, 10].find(x => colorsCount >= x * 2 && !(colorsCount % x)) || 5;
|
30
20
|
const isMultiLine = isOptionsMenu && colorsCount > fit;
|
31
21
|
let rowCountHover = 2;
|
32
22
|
rowCountHover = isMultiLine && colorsCount > fit * 2 ? 3 : rowCountHover;
|
@@ -42,26 +32,26 @@ export default function getColorMenu(self, colorsSource, menuClass) {
|
|
42
32
|
optionSize = fit > 5 && isMultiLine ? 1.5 : optionSize;
|
43
33
|
const menuHeight = `${rowCount * optionSize}rem`;
|
44
34
|
const menuHeightHover = `calc(${rowCountHover} * ${optionSize}rem + ${rowCountHover - 1} * ${gap})`;
|
45
|
-
|
46
|
-
//
|
35
|
+
|
36
|
+
// <UL> is an `HTMLElement`
|
47
37
|
const menu = createElement({
|
48
38
|
tagName: 'ul',
|
49
39
|
className: finalClass,
|
50
|
-
|
51
|
-
|
52
|
-
|
40
|
+
role: 'listbox',
|
41
|
+
ariaLabel: menuLabel,
|
42
|
+
}) as HTMLElement;
|
53
43
|
|
54
44
|
if (isScrollable) {
|
55
|
-
|
45
|
+
setElementStyle(menu, {
|
56
46
|
'--grid-item-size': `${optionSize}rem`,
|
57
|
-
'--grid-fit': fit
|
47
|
+
'--grid-fit': `${fit}`,
|
58
48
|
'--grid-gap': gap,
|
59
49
|
'--grid-height': menuHeight,
|
60
50
|
'--grid-hover-height': menuHeightHover,
|
61
51
|
});
|
62
52
|
}
|
63
53
|
|
64
|
-
colorsArray.forEach(
|
54
|
+
colorsArray.forEach(x => {
|
65
55
|
let [value, label] = typeof x === 'string' ? x.trim().split(':') : [];
|
66
56
|
if (x instanceof Color) {
|
67
57
|
value = x.toHexString();
|
@@ -75,12 +65,11 @@ export default function getColorMenu(self, colorsSource, menuClass) {
|
|
75
65
|
tagName: 'li',
|
76
66
|
className: `color-option${active}`,
|
77
67
|
innerText: `${label || value}`,
|
78
|
-
|
79
|
-
|
80
|
-
|
68
|
+
tabIndex: 0,
|
69
|
+
role: 'option',
|
70
|
+
ariaSelected: isActive ? 'true' : 'false',
|
71
|
+
}) as HTMLElement;
|
81
72
|
setAttribute(option, 'data-value', `${value}`);
|
82
|
-
setAttribute(option, 'role', 'option');
|
83
|
-
setAttribute(option, ariaSelected, isActive ? 'true' : 'false');
|
84
73
|
|
85
74
|
if (isOptionsMenu) {
|
86
75
|
setElementStyle(option, { backgroundColor: value });
|
@@ -89,4 +78,6 @@ export default function getColorMenu(self, colorsSource, menuClass) {
|
|
89
78
|
menu.append(option);
|
90
79
|
});
|
91
80
|
return menu;
|
92
|
-
}
|
81
|
+
};
|
82
|
+
|
83
|
+
export default getColorMenu;
|
@@ -0,0 +1,19 @@
|
|
1
|
+
import { isString } from '@thednp/shorty';
|
2
|
+
|
3
|
+
/**
|
4
|
+
* Check if a string is valid JSON string.
|
5
|
+
*
|
6
|
+
* @param str the string input
|
7
|
+
* @returns the query result
|
8
|
+
*/
|
9
|
+
const isValidJSON = (str: unknown): str is string => {
|
10
|
+
if (!isString(str)) return false;
|
11
|
+
try {
|
12
|
+
JSON.parse(str);
|
13
|
+
} catch (e) {
|
14
|
+
return false;
|
15
|
+
}
|
16
|
+
return true;
|
17
|
+
};
|
18
|
+
|
19
|
+
export default isValidJSON;
|
@@ -1,36 +1,33 @@
|
|
1
|
-
import
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
1
|
+
import {
|
2
|
+
getAttribute,
|
3
|
+
setAttribute,
|
4
|
+
toUpperCase,
|
5
|
+
ariaHidden,
|
6
|
+
tabindex,
|
7
|
+
createElement,
|
8
|
+
createElementNS,
|
9
|
+
} from '@thednp/shorty';
|
10
|
+
|
11
|
+
import Color from '@thednp/color';
|
11
12
|
|
12
13
|
import getColorForm from './getColorForm';
|
13
14
|
import getColorControls from './getColorControls';
|
14
15
|
import getColorMenu from './getColorMenu';
|
15
|
-
import nonColors from './nonColors';
|
16
16
|
import vHidden from './vHidden';
|
17
|
-
import tabIndex from './tabindex';
|
18
17
|
|
19
|
-
import
|
18
|
+
import ColorPicker from '../index';
|
20
19
|
|
21
20
|
/**
|
22
|
-
* Generate HTML markup and update instance properties.
|
23
|
-
*
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
} = self;
|
21
|
+
* Generate HTML markup and update instance properties.
|
22
|
+
*
|
23
|
+
* @param self
|
24
|
+
*/
|
25
|
+
const setMarkup = (self: ColorPicker) => {
|
26
|
+
const { input, parent, format, id, componentLabels, colorKeywords, colorPresets } = self;
|
29
27
|
const colorValue = getAttribute(input, 'value') || '#fff';
|
28
|
+
const { nonColors } = Color;
|
30
29
|
|
31
|
-
const {
|
32
|
-
toggleLabel, pickerLabel, formatLabel, hexLabel,
|
33
|
-
} = componentLabels;
|
30
|
+
const { toggleLabel, pickerLabel, formatLabel, hexLabel } = componentLabels;
|
34
31
|
|
35
32
|
// update color
|
36
33
|
const color = nonColors.includes(colorValue) ? '#fff' : colorValue;
|
@@ -43,21 +40,24 @@ export default function setMarkup(self) {
|
|
43
40
|
id: `picker-btn-${id}`,
|
44
41
|
tagName: 'button',
|
45
42
|
className: 'picker-toggle btn-appearance',
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
43
|
+
ariaExpanded: 'false',
|
44
|
+
ariaHasPopup: 'true',
|
45
|
+
}) as HTMLElement;
|
46
|
+
|
47
|
+
pickerBtn.append(
|
48
|
+
createElement({
|
49
|
+
tagName: 'span',
|
50
|
+
className: vHidden,
|
51
|
+
innerText: `${pickerLabel}. ${formatLabel}: ${formatString}`,
|
52
|
+
}) as HTMLElement,
|
53
|
+
);
|
54
54
|
|
55
55
|
const pickerDropdown = createElement({
|
56
56
|
tagName: 'div',
|
57
57
|
className: 'color-dropdown picker',
|
58
|
-
|
59
|
-
|
60
|
-
|
58
|
+
role: 'group',
|
59
|
+
ariaLabelledBy: `picker-btn-${id}`,
|
60
|
+
} as Partial<HTMLElement> & { ariaLabelledBy: string }) as HTMLElement;
|
61
61
|
|
62
62
|
const colorControls = getColorControls(self);
|
63
63
|
const colorForm = getColorForm(self);
|
@@ -71,7 +71,7 @@ export default function setMarkup(self) {
|
|
71
71
|
const presetsDropdown = createElement({
|
72
72
|
tagName: 'div',
|
73
73
|
className: 'color-dropdown scrollable menu',
|
74
|
-
});
|
74
|
+
}) as HTMLElement;
|
75
75
|
|
76
76
|
// color presets
|
77
77
|
if (colorPresets) {
|
@@ -87,26 +87,33 @@ export default function setMarkup(self) {
|
|
87
87
|
const presetsBtn = createElement({
|
88
88
|
tagName: 'button',
|
89
89
|
className: 'menu-toggle btn-appearance',
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
90
|
+
tabIndex: -1,
|
91
|
+
ariaExpanded: 'false',
|
92
|
+
ariaHasPopup: 'true',
|
93
|
+
}) as HTMLElement;
|
94
94
|
|
95
95
|
const xmlns = encodeURI('http://www.w3.org/2000/svg');
|
96
|
-
const presetsIcon = createElementNS(xmlns, {
|
96
|
+
const presetsIcon = createElementNS(xmlns, {
|
97
|
+
tagName: 'svg',
|
98
|
+
}) as HTMLElement;
|
97
99
|
setAttribute(presetsIcon, 'xmlns', xmlns);
|
98
100
|
setAttribute(presetsIcon, 'viewBox', '0 0 512 512');
|
99
101
|
setAttribute(presetsIcon, ariaHidden, 'true');
|
100
102
|
|
101
|
-
const path = createElementNS(xmlns, {
|
103
|
+
const path = createElementNS(xmlns, {
|
104
|
+
tagName: 'path',
|
105
|
+
}) as HTMLElement;
|
102
106
|
setAttribute(path, 'd', 'M98,158l157,156L411,158l27,27L255,368L71,185L98,158z');
|
103
107
|
setAttribute(path, 'fill', '#fff');
|
104
108
|
presetsIcon.append(path);
|
105
|
-
presetsBtn.append(
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
109
|
+
presetsBtn.append(
|
110
|
+
createElement({
|
111
|
+
tagName: 'span',
|
112
|
+
className: vHidden,
|
113
|
+
innerText: `${toggleLabel}`,
|
114
|
+
}) as HTMLElement,
|
115
|
+
presetsIcon,
|
116
|
+
);
|
110
117
|
|
111
118
|
parent.append(presetsBtn, presetsDropdown);
|
112
119
|
}
|
@@ -115,5 +122,7 @@ export default function setMarkup(self) {
|
|
115
122
|
if (colorKeywords && nonColors.includes(colorValue)) {
|
116
123
|
self.value = colorValue;
|
117
124
|
}
|
118
|
-
setAttribute(input,
|
119
|
-
}
|
125
|
+
setAttribute(input, tabindex, '-1');
|
126
|
+
};
|
127
|
+
|
128
|
+
export default setMarkup;
|
File without changes
|
package/tsconfig.json
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
{
|
2
|
+
// https://janessagarrow.com/blog/typescript-and-esbuild/
|
3
|
+
"compilerOptions": {
|
4
|
+
"lib": ["DOM", "ESNext", "DOM.Iterable"],
|
5
|
+
"types": ["vite", "vite/client", "cypress", "@thednp/shorty", "@thednp/event-listener", "@thednp/color"],
|
6
|
+
"rootDir": "./",
|
7
|
+
"baseUrl": "./",
|
8
|
+
"module": "ESNext",
|
9
|
+
"target": "ESNext",
|
10
|
+
"moduleResolution": "Node",
|
11
|
+
"allowJs": true,
|
12
|
+
"forceConsistentCasingInFileNames": true,
|
13
|
+
"useDefineForClassFields": true,
|
14
|
+
"strict": true,
|
15
|
+
"sourceMap": true,
|
16
|
+
"resolveJsonModule": true,
|
17
|
+
"esModuleInterop": true,
|
18
|
+
"isolatedModules": true,
|
19
|
+
"noUnusedLocals": true,
|
20
|
+
"noUnusedParameters": true,
|
21
|
+
"noImplicitReturns": true,
|
22
|
+
"removeComments": false,
|
23
|
+
"allowSyntheticDefaultImports": true,
|
24
|
+
"noEmit": true,
|
25
|
+
"skipLibCheck": true // allows dts-bundle-generator to import from package.json
|
26
|
+
},
|
27
|
+
"include": ["src/*", "src/**/*"],
|
28
|
+
"exclude": ["node_modules", "experiments", "coverage", "dist"],
|
29
|
+
}
|
package/vite.config.ts
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
"use strict";
|
2
|
+
import { resolve } from 'path';
|
3
|
+
import { defineConfig } from 'vite';
|
4
|
+
import { name } from './package.json';
|
5
|
+
|
6
|
+
const getPackageName = () => {
|
7
|
+
return name.includes('@') ? name.split('/')[1] : name;
|
8
|
+
};
|
9
|
+
|
10
|
+
const NAME = 'ColorPicker';
|
11
|
+
|
12
|
+
const fileName = {
|
13
|
+
es: `${getPackageName()}.mjs`,
|
14
|
+
cjs: `${getPackageName()}.cjs`,
|
15
|
+
iife: `${getPackageName()}.js`,
|
16
|
+
};
|
17
|
+
|
18
|
+
export default defineConfig({
|
19
|
+
base: './',
|
20
|
+
build: {
|
21
|
+
emptyOutDir: true,
|
22
|
+
outDir: 'dist/js',
|
23
|
+
lib: {
|
24
|
+
entry: resolve(__dirname, 'src/ts/index.ts'),
|
25
|
+
name: NAME,
|
26
|
+
formats: ['es', 'cjs', 'iife'],
|
27
|
+
fileName: (format: string) => fileName[format],
|
28
|
+
},
|
29
|
+
target: 'ESNext',
|
30
|
+
sourcemap: true,
|
31
|
+
minify: true,
|
32
|
+
},
|
33
|
+
});
|
34
|
+
|