@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 
     | 
    
         
            +
             
     |