@thednp/color-picker 1.0.1 → 2.0.0-alpha1
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 +54 -72
- package/compile.js +48 -0
- package/cypress/downloads/downloads.htm +0 -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 +14 -38
- package/dist/css/color-picker.min.css +2 -2
- package/dist/css/color-picker.rtl.css +14 -38
- 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 +74 -38
- 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
package/package.json
CHANGED
@@ -1,60 +1,54 @@
|
|
1
1
|
{
|
2
2
|
"name": "@thednp/color-picker",
|
3
|
-
"version": "
|
4
|
-
"
|
5
|
-
"
|
6
|
-
"
|
7
|
-
"
|
8
|
-
"
|
9
|
-
"
|
10
|
-
"
|
11
|
-
"
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
3
|
+
"version": "2.0.0-alpha1",
|
4
|
+
"author": "thednp",
|
5
|
+
"license": "MIT",
|
6
|
+
"description": "🎨 Modern Color Picker Component",
|
7
|
+
"homepage": "http://thednp.github.io/color-picker",
|
8
|
+
"source": "./src/ts/index.ts",
|
9
|
+
"main": "./dist/js/color-picker.js",
|
10
|
+
"module": "./dist/js/color-picker.mjs",
|
11
|
+
"types": "./dist/js/color-picker.d.ts",
|
12
|
+
"style": "./dist/css/color-picker.css",
|
13
|
+
"sass": "./src/scss/color-picker.scss",
|
14
|
+
"exports": {
|
15
|
+
".": {
|
16
|
+
"require": "./dist/color-picker.cjs",
|
17
|
+
"import": "./dist/color-picker.mjs"
|
18
|
+
}
|
19
19
|
},
|
20
20
|
"scripts": {
|
21
|
-
"test": "
|
22
|
-
"
|
21
|
+
"pre-test": "npm run clean-coverage",
|
22
|
+
"test": "npm run pre-test && cypress run",
|
23
|
+
"cypress": "npm run pre-test && npx cypress open",
|
24
|
+
"clean-coverage": "rimraf coverage .nyc_output",
|
23
25
|
"coverage:report": "nyc report --reporter=lcov --reporter=json --reporter=text --reporter=json-summary",
|
24
|
-
"
|
25
|
-
"
|
26
|
-
"
|
27
|
-
"
|
28
|
-
"
|
29
|
-
"build": "npm run lint:
|
30
|
-
"build
|
31
|
-
"
|
32
|
-
"
|
33
|
-
"
|
34
|
-
"build-ce-esm": "rollup --environment FORMAT:esm,MIN:false,NAME:ColorPickerElement,INPUTFILE:src/js/color-picker-element.js,OUTPUTFILE:dist/js/color-picker-element-esm.js -c",
|
35
|
-
"build-ce-esm-min": "rollup --environment FORMAT:esm,MIN:true,NAME:ColorPickerElement,INPUTFILE:src/js/color-picker-element.js,OUTPUTFILE:dist/js/color-picker-element-esm.min.js -c",
|
36
|
-
"build-cl": "rollup --environment FORMAT:umd,MIN:false,NAME:Color,INPUTFILE:src/js/color.js,OUTPUTFILE:dist/js/color.js -c",
|
37
|
-
"build-cl-min": "rollup --environment FORMAT:umd,MIN:true,NAME:Color,INPUTFILE:src/js/color.js,OUTPUTFILE:dist/js/color.min.js -c",
|
38
|
-
"build-cl-esm": "rollup --environment FORMAT:esm,MIN:false,NAME:Color,INPUTFILE:src/js/color.js,OUTPUTFILE:dist/js/color-esm.js -c",
|
39
|
-
"build-cl-esm-min": "rollup --environment FORMAT:esm,MIN:true,NAME:Color,INPUTFILE:src/js/color.js,OUTPUTFILE:dist/js/color-esm.min.js -c",
|
40
|
-
"build-cpl": "rollup --environment FORMAT:umd,MIN:false,NAME:ColorPalette,INPUTFILE:src/js/color-palette.js,OUTPUTFILE:dist/js/color-palette.js -c",
|
41
|
-
"build-cpl-min": "rollup --environment FORMAT:umd,MIN:true,NAME:ColorPalette,INPUTFILE:src/js/color-palette.js,OUTPUTFILE:dist/js/color-palette.min.js -c",
|
42
|
-
"build-cpl-esm": "rollup --environment FORMAT:esm,MIN:false,NAME:ColorPalette,INPUTFILE:src/js/color-palette.js,OUTPUTFILE:dist/js/color-palette-esm.js -c",
|
43
|
-
"build-cpl-esm-min": "rollup --environment FORMAT:esm,MIN:true,NAME:ColorPalette,INPUTFILE:src/js/color-palette.js,OUTPUTFILE:dist/js/color-palette-esm.min.js -c",
|
44
|
-
"build-minjs": "rollup --environment FORMAT:umd,MIN:true -c",
|
45
|
-
"build-esm": "rollup --environment FORMAT:esm,MIN:false -c",
|
46
|
-
"build-esmjs": "rollup --environment FORMAT:esm,MIN:true -c",
|
26
|
+
"format": "prettier --write \"src/**/*.ts\"",
|
27
|
+
"fix:ts": "eslint src --config .eslintrc.cjs --fix",
|
28
|
+
"lint:ts": "eslint src --config .eslintrc.cjs",
|
29
|
+
"fix:css": "stylelint --config .stylelintrc.json --fix scss \"src/scss/*.scss\"",
|
30
|
+
"lint:css": "stylelint --config .stylelintrc.json scss \"src/scss/*.scss\"",
|
31
|
+
"build": "npm run lint:ts && npm run build-vite && npm run dts",
|
32
|
+
"build-vite": "vite build && npm run docs",
|
33
|
+
"dev": "vite --open ./docs/index.html --port 8577",
|
34
|
+
"dts": "dts-bundle-generator --config ./dts.config.ts",
|
35
|
+
"docs": "ncp dist/js/color-picker.js docs/js/color-picker.js && ncp dist/js/color-picker.js.map docs/js/color-picker.js.map",
|
47
36
|
"copy": "npm-run-all --parallel copy-*",
|
48
|
-
"copy-js-cp": "ncp dist/js/color-picker.js docs/js/color-picker.js",
|
49
|
-
"copy-js-ce": "ncp dist/js/color-picker-element.js docs/js/color-picker-element.js",
|
50
37
|
"copy-css-cp": "ncp dist/css/color-picker.css docs/css/color-picker.css",
|
51
38
|
"copy-css-rtl": "ncp dist/css/color-picker.rtl.css docs/css/color-picker.rtl.css",
|
52
|
-
"compile": "npm run lint:css && npm-run-all --parallel compile-* && npm
|
39
|
+
"compile": "npm run lint:css && npm-run-all --parallel compile-* && npm run copy",
|
53
40
|
"compile-scss": "node compile.js",
|
54
41
|
"compile-scss-min": "node compile.js MIN:true",
|
55
42
|
"compile-scss-rtl": "node compile.js MIN:false,DIR:rtl",
|
56
43
|
"compile-scss-rtl-min": "node compile.js MIN:true,DIR:rtl"
|
57
44
|
},
|
45
|
+
"bugs": {
|
46
|
+
"url": "https://github.com/thednp/color-picker/issues"
|
47
|
+
},
|
48
|
+
"publishConfig": {
|
49
|
+
"access": "public",
|
50
|
+
"registry": "https://registry.npmjs.org/"
|
51
|
+
},
|
58
52
|
"repository": {
|
59
53
|
"type": "git",
|
60
54
|
"url": "git+https://github.com/thednp/color-picker.git"
|
@@ -66,43 +60,39 @@
|
|
66
60
|
"colorpicker",
|
67
61
|
"palette",
|
68
62
|
"color-palette",
|
69
|
-
"
|
63
|
+
"typescript"
|
70
64
|
],
|
71
|
-
"author": "thednp",
|
72
|
-
"license": "MIT",
|
73
|
-
"bugs": {
|
74
|
-
"url": "https://github.com/thednp/color-picker/issues"
|
75
|
-
},
|
76
|
-
"homepage": "http://thednp.github.io/color-picker",
|
77
65
|
"dependencies": {
|
78
|
-
"@thednp/
|
79
|
-
"
|
66
|
+
"@thednp/color": "^1.0.6",
|
67
|
+
"@thednp/event-listener": "^2.0.0",
|
68
|
+
"@thednp/shorty": "^2.0.0-alpha14"
|
80
69
|
},
|
81
70
|
"devDependencies": {
|
82
|
-
"@bahmutov/cypress-esbuild-preprocessor": "^2.
|
83
|
-
"@cypress/code-coverage": "^3.
|
84
|
-
"@
|
85
|
-
"@
|
86
|
-
"@
|
87
|
-
"
|
88
|
-
"
|
89
|
-
"
|
90
|
-
"eslint": "^
|
91
|
-
"eslint-
|
92
|
-
"eslint-plugin-
|
93
|
-
"eslint-plugin-vue": "^7.7.0",
|
71
|
+
"@bahmutov/cypress-esbuild-preprocessor": "^2.2.0",
|
72
|
+
"@cypress/code-coverage": "^3.10.3",
|
73
|
+
"@types/istanbul-lib-instrument": "^1.7.4",
|
74
|
+
"@typescript-eslint/eslint-plugin": "^5.57.1",
|
75
|
+
"@typescript-eslint/parser": "^5.57.1",
|
76
|
+
"cypress": "^12.9.0",
|
77
|
+
"dts-bundle-generator": "^8.0.0",
|
78
|
+
"eslint": "^8.37.0",
|
79
|
+
"eslint-plugin-jsdoc": "^40.1.1",
|
80
|
+
"eslint-plugin-prefer-arrow": "^1.2.3",
|
81
|
+
"eslint-plugin-prettier": "^4.2.1",
|
94
82
|
"istanbul-lib-coverage": "^3.2.0",
|
95
|
-
"istanbul-lib-instrument": "^5.2.
|
83
|
+
"istanbul-lib-instrument": "^5.2.1",
|
96
84
|
"ncp": "^2.0.0",
|
97
85
|
"npm-run-all": "^4.1.5",
|
98
86
|
"nyc": "^15.1.0",
|
99
|
-
"
|
100
|
-
"
|
101
|
-
"sass": "^1.
|
102
|
-
"stylelint": "^
|
103
|
-
"stylelint-config-standard": "^
|
104
|
-
"stylelint-
|
105
|
-
"stylelint-
|
106
|
-
"
|
87
|
+
"prettier": "^2.8.7",
|
88
|
+
"rimraf": "^4.4.1",
|
89
|
+
"sass": "^1.60.0",
|
90
|
+
"stylelint": "^15.4.0",
|
91
|
+
"stylelint-config-standard": "^32.0.0",
|
92
|
+
"stylelint-config-standard-scss": "^7.0.1",
|
93
|
+
"stylelint-order": "^6.0.3",
|
94
|
+
"stylelint-scss": "^4.6.0",
|
95
|
+
"typescript": "^5.0.3",
|
96
|
+
"vite": "^4.3.9"
|
107
97
|
}
|
108
98
|
}
|
package/src/scss/_variables.scss
CHANGED
@@ -7,16 +7,20 @@
|
|
7
7
|
right: auto; left: 0;
|
8
8
|
border-radius: .25rem 0 0 .25rem;
|
9
9
|
}
|
10
|
+
|
10
11
|
.color-dropdown.picker {
|
11
12
|
right: 0; left: auto;
|
12
13
|
}
|
14
|
+
|
13
15
|
.color-dropdown.menu {
|
14
16
|
right: auto; left: 0;
|
15
17
|
}
|
18
|
+
|
16
19
|
.color-control + .color-control {
|
17
20
|
margin-right: .5rem;
|
18
21
|
margin-left: 0;
|
19
22
|
}
|
23
|
+
|
20
24
|
.color-options.scrollable {
|
21
25
|
margin: 0 0 0 -.5rem;
|
22
26
|
}
|
@@ -1,23 +1,26 @@
|
|
1
1
|
@import "variables";
|
2
2
|
|
3
3
|
/* :host */
|
4
|
-
color-picker,
|
5
4
|
.color-picker {
|
6
5
|
position: relative;
|
7
6
|
display: flex;
|
8
7
|
|
9
8
|
@each $name in "white", "black" {
|
10
9
|
@each $lvl in $transparency-levels {
|
11
|
-
@if
|
10
|
+
@if type-of($name) == "string" and type-of($lvl) == "number" {
|
12
11
|
$color: #fff;
|
12
|
+
|
13
13
|
@if $name == "black" {
|
14
14
|
$color: #000;
|
15
15
|
}
|
16
|
-
|
16
|
+
|
17
|
+
$rgba: rgba($color, $lvl * 1%);
|
18
|
+
|
17
19
|
--#{$name}-#{$lvl}: #{$rgba};
|
18
20
|
}
|
19
21
|
}
|
20
22
|
}
|
23
|
+
|
21
24
|
--dropdown-transition: #{$dropdown-transition};
|
22
25
|
--btn-transition: #{$btn-transition};
|
23
26
|
--options-transition: #{$options-transition};
|
@@ -40,7 +43,6 @@ color-picker,
|
|
40
43
|
--visual-shadow: 0 0 0 1px var(--white-15) inset;
|
41
44
|
}
|
42
45
|
|
43
|
-
color-picker:focus,
|
44
46
|
.color-picker:focus {
|
45
47
|
outline: none;
|
46
48
|
}
|
@@ -62,7 +64,7 @@ color-picker:focus,
|
|
62
64
|
}
|
63
65
|
|
64
66
|
.color-dropdown.picker { left: 0; }
|
65
|
-
.color-dropdown.menu { right: 0; }
|
67
|
+
.color-dropdown.menu { right: 0; max-height: 230px; }
|
66
68
|
|
67
69
|
.open .color-dropdown.top {
|
68
70
|
top: auto;
|
@@ -100,10 +102,12 @@ color-picker:focus,
|
|
100
102
|
border-radius: .25rem;
|
101
103
|
outline: none;
|
102
104
|
appearance: none;
|
105
|
+
|
103
106
|
// transition-duration: .33s;
|
104
107
|
// transition-property: box-shadow, border;
|
105
108
|
transition: var(--btn-transition);
|
106
109
|
}
|
110
|
+
|
107
111
|
.btn-appearance:focus,
|
108
112
|
.btn-appearance:hover {
|
109
113
|
box-shadow: 0 0 0 3px var(--black-15);
|
@@ -111,26 +115,31 @@ color-picker:focus,
|
|
111
115
|
|
112
116
|
/* color-preview */
|
113
117
|
.color-preview {
|
114
|
-
box-shadow: 0 0 0 1px rgba(120,120,120
|
118
|
+
box-shadow: 0 0 0 1px rgba(120,120,120,33%) inset;
|
115
119
|
direction: ltr; /* color value can never be rtl */
|
116
120
|
}
|
117
121
|
|
118
122
|
.txt-dark .color-preview {
|
119
123
|
color: var(--white-75);
|
120
124
|
}
|
125
|
+
|
121
126
|
.txt-dark .color-preview:focus {
|
122
127
|
box-shadow: 0 0 0 1px #fff inset, 0 0 0 3px var(--black-15);
|
123
128
|
}
|
129
|
+
|
124
130
|
.txt-dark .color-preview::placeholder {
|
125
131
|
color: var(--white-50);
|
126
132
|
}
|
133
|
+
|
127
134
|
.txt-light .color-preview {
|
128
135
|
color: var(--black-75);
|
129
136
|
}
|
137
|
+
|
130
138
|
.txt-light .color-preview:focus {
|
131
139
|
color: var(--black-75);
|
132
140
|
box-shadow: 0 0 0 1px #000 inset, 0 0 0 3px var(--black-15);
|
133
141
|
}
|
142
|
+
|
134
143
|
.txt-light .color-preview::placeholder {
|
135
144
|
color: var(--black-50);
|
136
145
|
}
|
@@ -163,20 +172,23 @@ color-picker:focus,
|
|
163
172
|
border: 0;
|
164
173
|
border-radius: 0 .25rem .25rem 0;
|
165
174
|
}
|
175
|
+
|
166
176
|
.txt-light .menu-toggle {
|
167
177
|
background: var(--black-50);
|
178
|
+
|
179
|
+
&:focus {
|
180
|
+
background: var(--black-75);
|
181
|
+
}
|
168
182
|
}
|
169
|
-
|
170
|
-
.txt-light .menu-toggle:focus {
|
171
|
-
background: var(--black-75);
|
172
|
-
}
|
183
|
+
|
173
184
|
.txt-dark .menu-toggle {
|
174
185
|
background: var(--white-33);
|
186
|
+
|
187
|
+
&:focus {
|
188
|
+
background: var(--white-50);
|
189
|
+
}
|
175
190
|
}
|
176
|
-
|
177
|
-
.txt-dark .menu-toggle:focus {
|
178
|
-
background: var(--white-50);
|
179
|
-
}
|
191
|
+
|
180
192
|
.menu-toggle svg {
|
181
193
|
width: auto;
|
182
194
|
height: 100%;
|
@@ -188,6 +200,7 @@ color-picker:focus,
|
|
188
200
|
overflow-y: auto;
|
189
201
|
scrollbar-width: thin;
|
190
202
|
}
|
203
|
+
|
191
204
|
.scrollable::-webkit-scrollbar {
|
192
205
|
width: .5rem;
|
193
206
|
}
|
@@ -214,8 +227,9 @@ color-picker:focus,
|
|
214
227
|
/* color-defaults */
|
215
228
|
.color-defaults {
|
216
229
|
display: none;
|
217
|
-
|
218
|
-
flex-
|
230
|
+
|
231
|
+
// flex-wrap: ;
|
232
|
+
flex-flow: column wrap;
|
219
233
|
margin: 0;
|
220
234
|
list-style: none;
|
221
235
|
padding-inline: 0; // Firefox
|
@@ -226,9 +240,9 @@ color-picker:focus,
|
|
226
240
|
display: flex;
|
227
241
|
}
|
228
242
|
|
229
|
-
.color-dropdown.menu {
|
230
|
-
|
231
|
-
}
|
243
|
+
// .color-dropdown.menu {
|
244
|
+
// max-height: 230px;
|
245
|
+
// }
|
232
246
|
|
233
247
|
.color-defaults .color-option {
|
234
248
|
padding: .25rem .5rem;
|
@@ -259,6 +273,7 @@ color-picker:focus,
|
|
259
273
|
--grid-gap: .25rem; // grid vertical / horizontal spacing
|
260
274
|
--grid-height: auto; // default height
|
261
275
|
--grid-hover-height: auto; // height on hover
|
276
|
+
|
262
277
|
display: grid;
|
263
278
|
padding: 0;
|
264
279
|
margin: 0;
|
@@ -267,25 +282,30 @@ color-picker:focus,
|
|
267
282
|
grid-template-rows: repeat(auto-fill, var(--grid-item-size));
|
268
283
|
gap: var(--grid-gap);
|
269
284
|
}
|
285
|
+
|
270
286
|
.color-options.scrollable {
|
271
287
|
height: var(--grid-height);
|
272
288
|
margin: 0 -.5rem 0 0; // 0.5rem is the scrollbar width
|
273
289
|
overflow-y: scroll;
|
274
290
|
transition: var(--options-transition);
|
275
291
|
}
|
292
|
+
|
276
293
|
.color-options.scrollable:hover {
|
277
294
|
height: var(--grid-hover-height);
|
278
295
|
}
|
296
|
+
|
279
297
|
.color-options + .color-defaults {
|
280
298
|
margin-top: .25rem;
|
281
299
|
}
|
300
|
+
|
282
301
|
.multiline + .color-defaults {
|
283
|
-
flex-
|
284
|
-
|
302
|
+
flex-flow: row wrap;
|
303
|
+
|
285
304
|
.color-option {
|
286
305
|
padding: .25rem .33rem; font-size: 12px;
|
287
306
|
}
|
288
307
|
}
|
308
|
+
|
289
309
|
.color-options .color-option {
|
290
310
|
// hide any text
|
291
311
|
position: relative;
|
@@ -293,18 +313,23 @@ color-picker:focus,
|
|
293
313
|
height: var(--grid-item-size);
|
294
314
|
overflow: hidden;
|
295
315
|
text-indent: 2.1rem;
|
316
|
+
|
317
|
+
&:active, &:focus {
|
318
|
+
outline: none;
|
319
|
+
box-shadow: 0 0 0 4px rgba(125,125,125,75%) inset;
|
320
|
+
}
|
296
321
|
}
|
297
|
-
|
298
|
-
.color-options .color-option:
|
299
|
-
|
300
|
-
|
322
|
+
|
323
|
+
// .color-options .color-option:active,
|
324
|
+
// .color-options .color-option:focus {
|
325
|
+
// outline: none;
|
326
|
+
// }
|
327
|
+
|
301
328
|
.color-options .color-option::before {
|
302
329
|
position: absolute;
|
303
|
-
|
304
|
-
right: 0;
|
305
|
-
bottom: 0;
|
306
|
-
left: 0;
|
330
|
+
inset: 0;
|
307
331
|
}
|
332
|
+
|
308
333
|
.color-options .color-option:hover::before,
|
309
334
|
.color-options .color-option:active::before,
|
310
335
|
.color-options .color-option:focus::before {
|
@@ -313,13 +338,15 @@ color-picker:focus,
|
|
313
338
|
mix-blend-mode: difference;
|
314
339
|
}
|
315
340
|
|
316
|
-
.color-options .color-option
|
317
|
-
|
318
|
-
|
319
|
-
|
341
|
+
// .color-options .color-option {
|
342
|
+
// &:active, &:focus {
|
343
|
+
// outline: none;
|
344
|
+
// box-shadow: 0 0 0 4px rgba(125,125,125,75%) inset;
|
345
|
+
// }
|
346
|
+
// }
|
320
347
|
|
321
348
|
.color-options .color-option.active {
|
322
|
-
|
349
|
+
&::after {
|
323
350
|
position: absolute;
|
324
351
|
top: 50%;
|
325
352
|
left: 50%;
|
@@ -330,18 +357,19 @@ color-picker:focus,
|
|
330
357
|
border-radius: 4px;
|
331
358
|
}
|
332
359
|
}
|
333
|
-
|
360
|
+
|
361
|
+
.txt-dark .color-options .color-option.active::after {
|
334
362
|
box-shadow: 0 0 0 4px var(--white-90);
|
335
363
|
}
|
336
|
-
|
364
|
+
|
365
|
+
.txt-light .color-options .color-option.active::after {
|
337
366
|
box-shadow: 0 0 0 4px var(--black-90);
|
338
367
|
}
|
339
368
|
|
340
369
|
/* color-form */
|
341
370
|
.color-form {
|
342
371
|
display: flex;
|
343
|
-
flex-
|
344
|
-
flex-wrap: wrap;
|
372
|
+
flex-flow: row wrap;
|
345
373
|
align-items: center;
|
346
374
|
padding: .25rem 0 0;
|
347
375
|
font: 12px sans-serif;
|
@@ -383,6 +411,7 @@ color-picker:focus,
|
|
383
411
|
/* visual control */
|
384
412
|
.visual-control {
|
385
413
|
height: 150px;
|
414
|
+
|
386
415
|
/* important for mobile devices */
|
387
416
|
touch-action: none;
|
388
417
|
box-shadow: var(--visual-shadow);
|
@@ -391,6 +420,7 @@ color-picker:focus,
|
|
391
420
|
.visual-control1 {
|
392
421
|
width: 150px;
|
393
422
|
}
|
423
|
+
|
394
424
|
.visual-control2,
|
395
425
|
.visual-control3 {
|
396
426
|
width: 21px;
|
@@ -428,6 +458,7 @@ color-picker:focus,
|
|
428
458
|
top: 0;
|
429
459
|
left: 0;
|
430
460
|
height: 7px;
|
461
|
+
|
431
462
|
/* important for mobile devices */
|
432
463
|
touch-action: none;
|
433
464
|
user-select: none;
|
@@ -437,9 +468,11 @@ color-picker:focus,
|
|
437
468
|
outline: none;
|
438
469
|
will-change: transform;
|
439
470
|
}
|
471
|
+
|
440
472
|
.knob:hover {
|
441
473
|
box-shadow: var(--knob-shadow-hover);
|
442
474
|
}
|
475
|
+
|
443
476
|
.knob:focus,
|
444
477
|
.knob:active {
|
445
478
|
z-index: 1;
|
@@ -456,6 +489,7 @@ color-picker:focus,
|
|
456
489
|
.txt-dark .color-pointer {
|
457
490
|
box-shadow: 0 0 0 5px var(--white-50);
|
458
491
|
}
|
492
|
+
|
459
493
|
.txt-light .color-pointer {
|
460
494
|
box-shadow: 0 0 0 5px var(--black-50);
|
461
495
|
}
|
@@ -463,6 +497,7 @@ color-picker:focus,
|
|
463
497
|
.txt-dark .color-pointer:hover {
|
464
498
|
box-shadow: 0 0 0 5px var(--white-75);
|
465
499
|
}
|
500
|
+
|
466
501
|
.txt-light .color-pointer:hover {
|
467
502
|
box-shadow: 0 0 0 5px var(--black-75);
|
468
503
|
}
|
@@ -471,6 +506,7 @@ color-picker:focus,
|
|
471
506
|
.txt-dark .color-pointer:active {
|
472
507
|
box-shadow: 0 0 0 5px var(--white-90);
|
473
508
|
}
|
509
|
+
|
474
510
|
.txt-light .color-pointer:focus,
|
475
511
|
.txt-light .color-pointer:active {
|
476
512
|
box-shadow: 0 0 0 5px var(--black-90);
|
@@ -0,0 +1,89 @@
|
|
1
|
+
import Color from '@thednp/color';
|
2
|
+
// import { isNumber } from '@thednp/shorty';
|
3
|
+
|
4
|
+
/**
|
5
|
+
* Returns a color palette with a given set of parameters.
|
6
|
+
*
|
7
|
+
* @example
|
8
|
+
* new ColorPalette(0, 12, 10, 80);
|
9
|
+
* // => { hue: 0, hueSteps: 12, lightSteps: 10, saturation: 80, colors: Array<Color> }
|
10
|
+
*/
|
11
|
+
export default class ColorPalette {
|
12
|
+
public static Color = Color;
|
13
|
+
hue: number;
|
14
|
+
hueSteps: number;
|
15
|
+
lightSteps: number;
|
16
|
+
saturation: number;
|
17
|
+
colors: Color[];
|
18
|
+
/**
|
19
|
+
* The `hue` parameter is optional, which would be set to 0.
|
20
|
+
* * `args.hue` the starting Hue [0, 360]
|
21
|
+
* * `args.hueSteps` Hue Steps Count [5, 24]
|
22
|
+
* * `args.lightSteps` Lightness Steps Count [5, 12]
|
23
|
+
* * `args.saturation` Saturation [0, 100]
|
24
|
+
*/
|
25
|
+
constructor(...args: [number?, number?, number?, number?]) {
|
26
|
+
let hue = 0;
|
27
|
+
let hueSteps = 12;
|
28
|
+
let lightSteps = 10;
|
29
|
+
let lightnessArray = [0.5];
|
30
|
+
let saturation = 100;
|
31
|
+
// if (!args.every(n => isNumber(n))) throw TypeError('ColorPalette only accepts numbers.');
|
32
|
+
|
33
|
+
if (args.length === 4) {
|
34
|
+
[hue, hueSteps, lightSteps, saturation] = args as [number, number, number, number];
|
35
|
+
} else if (args.length === 3) {
|
36
|
+
[hue, hueSteps, lightSteps] = args as [number, number, number];
|
37
|
+
} else if (args.length === 2) {
|
38
|
+
[hueSteps, lightSteps] = args as [number, number];
|
39
|
+
if ([hueSteps, lightSteps].some(n => n < 1)) {
|
40
|
+
throw TypeError('ColorPalette: the two minimum arguments must be numbers higher than 0.');
|
41
|
+
}
|
42
|
+
}
|
43
|
+
|
44
|
+
const colors: Color[] = [];
|
45
|
+
const hueStep = 360 / hueSteps;
|
46
|
+
const half = Color.roundPart((lightSteps - (lightSteps % 2 ? 1 : 0)) / 2);
|
47
|
+
const steps1To13 = [0.25, 0.2, 0.15, 0.11, 0.09, 0.075];
|
48
|
+
const lightSets = [
|
49
|
+
[1, 2, 3],
|
50
|
+
[4, 5],
|
51
|
+
[6, 7],
|
52
|
+
[8, 9],
|
53
|
+
[10, 11],
|
54
|
+
[12, 13],
|
55
|
+
];
|
56
|
+
const closestSet = lightSets.find(set => set.includes(lightSteps));
|
57
|
+
|
58
|
+
// find a lightStep that won't go beyond black and white
|
59
|
+
// something within the [10-90] range of lightness
|
60
|
+
const lightStep = closestSet
|
61
|
+
? steps1To13[lightSets.indexOf(closestSet)]
|
62
|
+
: 100 / (lightSteps + (lightSteps % 2 ? 0 : 1)) / 100;
|
63
|
+
|
64
|
+
// light tints
|
65
|
+
for (let i = 1; i < half + 1; i += 1) {
|
66
|
+
lightnessArray = [...lightnessArray, 0.5 + lightStep * i];
|
67
|
+
}
|
68
|
+
|
69
|
+
// dark tints
|
70
|
+
for (let i = 1; i < lightSteps - half; i += 1) {
|
71
|
+
lightnessArray = [0.5 - lightStep * i, ...lightnessArray];
|
72
|
+
}
|
73
|
+
|
74
|
+
// feed `colors` Array
|
75
|
+
for (let i = 0; i < hueSteps; i += 1) {
|
76
|
+
const currentHue = ((hue + i * hueStep) % 360) / 360;
|
77
|
+
lightnessArray.forEach(l => {
|
78
|
+
const newColor = new Color({ h: currentHue, s: 1, l });
|
79
|
+
colors.push(saturation < 100 ? newColor.saturate(saturation - 100) : newColor);
|
80
|
+
});
|
81
|
+
}
|
82
|
+
|
83
|
+
this.hue = hue;
|
84
|
+
this.hueSteps = hueSteps;
|
85
|
+
this.lightSteps = lightSteps;
|
86
|
+
this.saturation = saturation;
|
87
|
+
this.colors = colors;
|
88
|
+
}
|
89
|
+
}
|