@thednp/color-picker 1.0.1 → 2.0.0-alpha10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (86) hide show
  1. package/.eslintrc.cjs +199 -0
  2. package/.lgtm.yml +9 -0
  3. package/.prettierrc.json +15 -0
  4. package/.stylelintrc.json +236 -0
  5. package/README.md +55 -72
  6. package/compile.js +51 -0
  7. package/cypress/e2e/color-palette.cy.ts +128 -0
  8. package/cypress/e2e/color-picker.cy.ts +909 -0
  9. package/cypress/fixtures/colorNamesFrench.js +3 -0
  10. package/cypress/fixtures/componentLabelsFrench.js +21 -0
  11. package/cypress/fixtures/format.js +3 -0
  12. package/cypress/fixtures/getMarkup.js +35 -0
  13. package/cypress/fixtures/getRandomInt.js +6 -0
  14. package/cypress/fixtures/sampleWebcolors.js +18 -0
  15. package/cypress/fixtures/testSample.js +8 -0
  16. package/cypress/plugins/esbuild-istanbul.ts +50 -0
  17. package/cypress/plugins/tsCompile.ts +34 -0
  18. package/cypress/support/commands.ts +0 -0
  19. package/cypress/support/e2e.ts +21 -0
  20. package/cypress/test.html +23 -0
  21. package/cypress.config.ts +29 -0
  22. package/dist/css/color-picker.css +25 -54
  23. package/dist/css/color-picker.min.css +2 -2
  24. package/dist/css/color-picker.rtl.css +25 -54
  25. package/dist/css/color-picker.rtl.min.css +2 -2
  26. package/dist/js/color-picker.cjs +8 -0
  27. package/dist/js/color-picker.cjs.map +1 -0
  28. package/dist/js/color-picker.d.ts +296 -0
  29. package/dist/js/color-picker.js +5 -3570
  30. package/dist/js/color-picker.js.map +1 -0
  31. package/dist/js/color-picker.mjs +2618 -0
  32. package/dist/js/color-picker.mjs.map +1 -0
  33. package/dts.config.ts +15 -0
  34. package/package.json +116 -108
  35. package/src/scss/_variables.scss +0 -1
  36. package/src/scss/color-picker.rtl.scss +4 -0
  37. package/src/scss/color-picker.scss +93 -51
  38. package/src/ts/colorPalette.ts +89 -0
  39. package/src/{js/color-picker.js → ts/index.ts} +498 -509
  40. package/src/ts/interface/ColorNames.ts +20 -0
  41. package/src/ts/interface/colorPickerLabels.ts +20 -0
  42. package/src/ts/interface/colorPickerOptions.ts +11 -0
  43. package/src/ts/interface/paletteOptions.ts +6 -0
  44. package/src/ts/util/colorNames.ts +21 -0
  45. package/src/{js/util/colorPickerLabels.js → ts/util/colorPickerLabels.ts} +4 -2
  46. package/src/ts/util/getColorControls.ts +90 -0
  47. package/src/{js/util/getColorForm.js → ts/util/getColorForm.ts} +28 -18
  48. package/src/{js/util/getColorMenu.js → ts/util/getColorMenu.ts} +21 -30
  49. package/src/ts/util/isValidJSON.ts +19 -0
  50. package/src/{js/util/setMarkup.js → ts/util/setMarkup.ts} +61 -50
  51. package/tsconfig.json +29 -0
  52. package/vite.config.ts +34 -0
  53. package/dist/js/color-esm.js +0 -1164
  54. package/dist/js/color-esm.min.js +0 -2
  55. package/dist/js/color-palette-esm.js +0 -1235
  56. package/dist/js/color-palette-esm.min.js +0 -2
  57. package/dist/js/color-palette.js +0 -1243
  58. package/dist/js/color-palette.min.js +0 -2
  59. package/dist/js/color-picker-element-esm.js +0 -3718
  60. package/dist/js/color-picker-element-esm.min.js +0 -2
  61. package/dist/js/color-picker-element.js +0 -3726
  62. package/dist/js/color-picker-element.min.js +0 -2
  63. package/dist/js/color-picker-esm.js +0 -3565
  64. package/dist/js/color-picker-esm.min.js +0 -2
  65. package/dist/js/color-picker.min.js +0 -2
  66. package/dist/js/color.js +0 -1172
  67. package/dist/js/color.min.js +0 -2
  68. package/src/js/color-palette.js +0 -75
  69. package/src/js/color-picker-element.js +0 -107
  70. package/src/js/color.js +0 -1104
  71. package/src/js/index.js +0 -8
  72. package/src/js/util/colorNames.js +0 -6
  73. package/src/js/util/getColorControls.js +0 -103
  74. package/src/js/util/isValidJSON.js +0 -13
  75. package/src/js/util/nonColors.js +0 -5
  76. package/src/js/util/roundPart.js +0 -9
  77. package/src/js/util/setCSSProperties.js +0 -12
  78. package/src/js/util/tabindex.js +0 -3
  79. package/src/js/util/toggleCEAttr.js +0 -70
  80. package/src/js/util/version.js +0 -5
  81. package/src/js/version.js +0 -5
  82. package/types/cp.d.ts +0 -558
  83. package/types/index.d.ts +0 -44
  84. package/types/source/source.ts +0 -4
  85. package/types/source/types.d.ts +0 -92
  86. /package/src/{js/util/vHidden.js → ts/util/vHidden.ts} +0 -0
@@ -0,0 +1,20 @@
1
+ export default interface ColorNames {
2
+ white: string;
3
+ black: string;
4
+ grey: string;
5
+ red: string;
6
+ orange: string;
7
+ brown: string;
8
+ gold: string;
9
+ olive: string;
10
+ yellow: string;
11
+ lime: string;
12
+ green: string;
13
+ teal: string;
14
+ cyan: string;
15
+ blue: string;
16
+ violet: string;
17
+ magenta: string;
18
+ pink: string;
19
+ [key: string]: string;
20
+ }
@@ -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,6 @@
1
+ export default interface PaletteOptions {
2
+ hue: number;
3
+ hueSteps: number;
4
+ lightSteps: number;
5
+ saturation: number;
6
+ }
@@ -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
- /** @type {Record<string, string>} */
2
- const colorPickerLabels = {
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 'shorter-js/src/misc/createElement';
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 {CP.ColorPicker} self the `ColorPicker` instance
12
- * @returns {HTMLElement | Element} a new `<div>` element with color component `<input>`
9
+ * @param self the `ColorPicker` instance
10
+ * @returns a new `<div>` element with color component `<input>`
13
11
  */
14
- export default function getColorForm(self) {
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({ tagName: 'span', ariaHidden: 'true', innerText: `${C}:` }),
34
- createElement({ tagName: 'span', className: vHidden, innerText: formatLabel }),
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
- setAttribute(cInput, 'autocomplete', 'off');
45
- setAttribute(cInput, 'spellcheck', 'false');
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'; step = '1';
58
+ max = '255';
59
+ step = '1';
53
60
  } else if (c === 'hue') {
54
- max = '360'; step = '1';
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 ariaLabel from 'shorter-js/src/strings/ariaLabel';
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 setCSSProperties from './setCSSProperties';
9
- import tabIndex from './tabindex';
10
- import Color from '../color';
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
- export default function getColorMenu(self, colorsSource, menuClass) {
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((x) => colorsCount >= x * 2 && !(colorsCount % x)) || 5;
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
- /** @type {HTMLUListElement} */
46
- // @ts-ignore -- <UL> is an `HTMLElement`
35
+
36
+ // <UL> is an `HTMLElement`
47
37
  const menu = createElement({
48
38
  tagName: 'ul',
49
39
  className: finalClass,
50
- });
51
- setAttribute(menu, 'role', 'listbox');
52
- setAttribute(menu, ariaLabel, menuLabel);
40
+ role: 'listbox',
41
+ ariaLabel: menuLabel,
42
+ }) as HTMLElement;
53
43
 
54
44
  if (isScrollable) {
55
- setCSSProperties(menu, {
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((x) => {
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
- setAttribute(option, tabIndex, '0');
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 getAttribute from 'shorter-js/src/attr/getAttribute';
2
- import setAttribute from 'shorter-js/src/attr/setAttribute';
3
- import toUpperCase from 'shorter-js/src/misc/toUpperCase';
4
- // import ariaLabel from 'shorter-js/src/strings/ariaLabel';
5
- import ariaExpanded from 'shorter-js/src/strings/ariaExpanded';
6
- import ariaHasPopup from 'shorter-js/src/strings/ariaHasPopup';
7
- import ariaHidden from 'shorter-js/src/strings/ariaHidden';
8
- import ariaLabelledBy from 'shorter-js/src/strings/ariaLabelledBy';
9
- import createElement from 'shorter-js/src/misc/createElement';
10
- import createElementNS from 'shorter-js/src/misc/createElementNS';
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 Color from '../color';
18
+ import ColorPicker from '../index';
20
19
 
21
20
  /**
22
- * Generate HTML markup and update instance properties.
23
- * @param {CP.ColorPicker} self
24
- */
25
- export default function setMarkup(self) {
26
- const {
27
- input, parent, format, id, componentLabels, colorKeywords, colorPresets,
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;
@@ -39,25 +36,29 @@ export default function setMarkup(self) {
39
36
  // set initial controls dimensions
40
37
  const formatString = format === 'hex' ? hexLabel : toUpperCase(format);
41
38
 
42
- const pickerBtn = createElement({
39
+ const pickerBtn = createElement<HTMLButtonElement>({
43
40
  id: `picker-btn-${id}`,
44
41
  tagName: 'button',
42
+ type: 'button',
45
43
  className: 'picker-toggle btn-appearance',
46
- });
47
- setAttribute(pickerBtn, ariaExpanded, 'false');
48
- setAttribute(pickerBtn, ariaHasPopup, 'true');
49
- pickerBtn.append(createElement({
50
- tagName: 'span',
51
- className: vHidden,
52
- innerText: `${pickerLabel}. ${formatLabel}: ${formatString}`,
53
- }));
44
+ ariaExpanded: 'false',
45
+ ariaHasPopup: 'true',
46
+ }) as HTMLButtonElement;
47
+
48
+ pickerBtn.append(
49
+ createElement({
50
+ tagName: 'span',
51
+ className: vHidden,
52
+ innerText: `${pickerLabel}. ${formatLabel}: ${formatString}`,
53
+ }) as HTMLElement,
54
+ );
54
55
 
55
56
  const pickerDropdown = createElement({
56
57
  tagName: 'div',
57
58
  className: 'color-dropdown picker',
58
- });
59
- setAttribute(pickerDropdown, ariaLabelledBy, `picker-btn-${id}`);
60
- setAttribute(pickerDropdown, 'role', 'group');
59
+ role: 'group',
60
+ ariaLabelledBy: `picker-btn-${id}`,
61
+ } as Partial<HTMLElement> & { ariaLabelledBy: string }) as HTMLElement;
61
62
 
62
63
  const colorControls = getColorControls(self);
63
64
  const colorForm = getColorForm(self);
@@ -71,7 +72,7 @@ export default function setMarkup(self) {
71
72
  const presetsDropdown = createElement({
72
73
  tagName: 'div',
73
74
  className: 'color-dropdown scrollable menu',
74
- });
75
+ }) as HTMLElement;
75
76
 
76
77
  // color presets
77
78
  if (colorPresets) {
@@ -84,29 +85,37 @@ export default function setMarkup(self) {
84
85
  presetsDropdown.append(getColorMenu(self, colorKeywords, 'color-defaults'));
85
86
  }
86
87
 
87
- const presetsBtn = createElement({
88
+ const presetsBtn = createElement<HTMLButtonElement>({
88
89
  tagName: 'button',
90
+ type: 'button',
89
91
  className: 'menu-toggle btn-appearance',
90
- });
91
- setAttribute(presetsBtn, tabIndex, '-1');
92
- setAttribute(presetsBtn, ariaExpanded, 'false');
93
- setAttribute(presetsBtn, ariaHasPopup, 'true');
92
+ tabIndex: -1,
93
+ ariaExpanded: 'false',
94
+ ariaHasPopup: 'true',
95
+ }) as HTMLButtonElement;
94
96
 
95
97
  const xmlns = encodeURI('http://www.w3.org/2000/svg');
96
- const presetsIcon = createElementNS(xmlns, { tagName: 'svg' });
98
+ const presetsIcon = createElementNS(xmlns, {
99
+ tagName: 'svg',
100
+ }) as HTMLElement;
97
101
  setAttribute(presetsIcon, 'xmlns', xmlns);
98
102
  setAttribute(presetsIcon, 'viewBox', '0 0 512 512');
99
103
  setAttribute(presetsIcon, ariaHidden, 'true');
100
104
 
101
- const path = createElementNS(xmlns, { tagName: 'path' });
105
+ const path = createElementNS(xmlns, {
106
+ tagName: 'path',
107
+ }) as HTMLElement;
102
108
  setAttribute(path, 'd', 'M98,158l157,156L411,158l27,27L255,368L71,185L98,158z');
103
109
  setAttribute(path, 'fill', '#fff');
104
110
  presetsIcon.append(path);
105
- presetsBtn.append(createElement({
106
- tagName: 'span',
107
- className: vHidden,
108
- innerText: `${toggleLabel}`,
109
- }), presetsIcon);
111
+ presetsBtn.append(
112
+ createElement({
113
+ tagName: 'span',
114
+ className: vHidden,
115
+ innerText: `${toggleLabel}`,
116
+ }) as HTMLElement,
117
+ presetsIcon,
118
+ );
110
119
 
111
120
  parent.append(presetsBtn, presetsDropdown);
112
121
  }
@@ -115,5 +124,7 @@ export default function setMarkup(self) {
115
124
  if (colorKeywords && nonColors.includes(colorValue)) {
116
125
  self.value = colorValue;
117
126
  }
118
- setAttribute(input, tabIndex, '-1');
119
- }
127
+ setAttribute(input, tabindex, '-1');
128
+ };
129
+
130
+ export default setMarkup;
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", "@thednp/shorty", "@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
+