@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
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-alpha2",
|
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.7",
|
67
|
+
"@thednp/event-listener": "^2.0.1",
|
68
|
+
"@thednp/shorty": "^2.0.0-alpha15"
|
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.7",
|
73
|
+
"@types/istanbul-lib-instrument": "^1.7.4",
|
74
|
+
"@typescript-eslint/eslint-plugin": "^5.59.9",
|
75
|
+
"@typescript-eslint/parser": "^5.59.9",
|
76
|
+
"cypress": "^12.14.0",
|
77
|
+
"dts-bundle-generator": "^8.0.1",
|
78
|
+
"eslint": "^8.42.0",
|
79
|
+
"eslint-plugin-jsdoc": "^46.2.6",
|
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.8",
|
88
|
+
"rimraf": "^5.0.1",
|
89
|
+
"sass": "^1.63.3",
|
90
|
+
"stylelint": "^15.7.0",
|
91
|
+
"stylelint-config-standard": "^33.0.0",
|
92
|
+
"stylelint-config-standard-scss": "^9.0.0",
|
93
|
+
"stylelint-order": "^6.0.3",
|
94
|
+
"stylelint-scss": "^5.0.1",
|
95
|
+
"typescript": "^5.1.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,11 @@ color-picker:focus,
|
|
62
64
|
}
|
63
65
|
|
64
66
|
.color-dropdown.picker { left: 0; }
|
65
|
-
|
67
|
+
|
68
|
+
.color-dropdown.menu {
|
69
|
+
right: 0;
|
70
|
+
max-height: 230px;
|
71
|
+
}
|
66
72
|
|
67
73
|
.open .color-dropdown.top {
|
68
74
|
top: auto;
|
@@ -100,10 +106,12 @@ color-picker:focus,
|
|
100
106
|
border-radius: .25rem;
|
101
107
|
outline: none;
|
102
108
|
appearance: none;
|
109
|
+
|
103
110
|
// transition-duration: .33s;
|
104
111
|
// transition-property: box-shadow, border;
|
105
112
|
transition: var(--btn-transition);
|
106
113
|
}
|
114
|
+
|
107
115
|
.btn-appearance:focus,
|
108
116
|
.btn-appearance:hover {
|
109
117
|
box-shadow: 0 0 0 3px var(--black-15);
|
@@ -111,26 +119,31 @@ color-picker:focus,
|
|
111
119
|
|
112
120
|
/* color-preview */
|
113
121
|
.color-preview {
|
114
|
-
box-shadow: 0 0 0 1px rgba(120,120,120
|
122
|
+
box-shadow: 0 0 0 1px rgba(120,120,120,33%) inset;
|
115
123
|
direction: ltr; /* color value can never be rtl */
|
116
124
|
}
|
117
125
|
|
118
126
|
.txt-dark .color-preview {
|
119
127
|
color: var(--white-75);
|
120
128
|
}
|
129
|
+
|
121
130
|
.txt-dark .color-preview:focus {
|
122
131
|
box-shadow: 0 0 0 1px #fff inset, 0 0 0 3px var(--black-15);
|
123
132
|
}
|
133
|
+
|
124
134
|
.txt-dark .color-preview::placeholder {
|
125
135
|
color: var(--white-50);
|
126
136
|
}
|
137
|
+
|
127
138
|
.txt-light .color-preview {
|
128
139
|
color: var(--black-75);
|
129
140
|
}
|
141
|
+
|
130
142
|
.txt-light .color-preview:focus {
|
131
143
|
color: var(--black-75);
|
132
144
|
box-shadow: 0 0 0 1px #000 inset, 0 0 0 3px var(--black-15);
|
133
145
|
}
|
146
|
+
|
134
147
|
.txt-light .color-preview::placeholder {
|
135
148
|
color: var(--black-50);
|
136
149
|
}
|
@@ -163,20 +176,23 @@ color-picker:focus,
|
|
163
176
|
border: 0;
|
164
177
|
border-radius: 0 .25rem .25rem 0;
|
165
178
|
}
|
179
|
+
|
166
180
|
.txt-light .menu-toggle {
|
167
181
|
background: var(--black-50);
|
182
|
+
|
183
|
+
&:focus {
|
184
|
+
background: var(--black-75);
|
185
|
+
}
|
168
186
|
}
|
169
|
-
|
170
|
-
.txt-light .menu-toggle:focus {
|
171
|
-
background: var(--black-75);
|
172
|
-
}
|
187
|
+
|
173
188
|
.txt-dark .menu-toggle {
|
174
189
|
background: var(--white-33);
|
190
|
+
|
191
|
+
&:focus {
|
192
|
+
background: var(--white-50);
|
193
|
+
}
|
175
194
|
}
|
176
|
-
|
177
|
-
.txt-dark .menu-toggle:focus {
|
178
|
-
background: var(--white-50);
|
179
|
-
}
|
195
|
+
|
180
196
|
.menu-toggle svg {
|
181
197
|
width: auto;
|
182
198
|
height: 100%;
|
@@ -188,6 +204,7 @@ color-picker:focus,
|
|
188
204
|
overflow-y: auto;
|
189
205
|
scrollbar-width: thin;
|
190
206
|
}
|
207
|
+
|
191
208
|
.scrollable::-webkit-scrollbar {
|
192
209
|
width: .5rem;
|
193
210
|
}
|
@@ -214,8 +231,9 @@ color-picker:focus,
|
|
214
231
|
/* color-defaults */
|
215
232
|
.color-defaults {
|
216
233
|
display: none;
|
217
|
-
|
218
|
-
flex-
|
234
|
+
|
235
|
+
// flex-wrap: ;
|
236
|
+
flex-flow: column wrap;
|
219
237
|
margin: 0;
|
220
238
|
list-style: none;
|
221
239
|
padding-inline: 0; // Firefox
|
@@ -226,9 +244,9 @@ color-picker:focus,
|
|
226
244
|
display: flex;
|
227
245
|
}
|
228
246
|
|
229
|
-
.color-dropdown.menu {
|
230
|
-
|
231
|
-
}
|
247
|
+
// .color-dropdown.menu {
|
248
|
+
// max-height: 230px;
|
249
|
+
// }
|
232
250
|
|
233
251
|
.color-defaults .color-option {
|
234
252
|
padding: .25rem .5rem;
|
@@ -259,6 +277,7 @@ color-picker:focus,
|
|
259
277
|
--grid-gap: .25rem; // grid vertical / horizontal spacing
|
260
278
|
--grid-height: auto; // default height
|
261
279
|
--grid-hover-height: auto; // height on hover
|
280
|
+
|
262
281
|
display: grid;
|
263
282
|
padding: 0;
|
264
283
|
margin: 0;
|
@@ -267,25 +286,30 @@ color-picker:focus,
|
|
267
286
|
grid-template-rows: repeat(auto-fill, var(--grid-item-size));
|
268
287
|
gap: var(--grid-gap);
|
269
288
|
}
|
289
|
+
|
270
290
|
.color-options.scrollable {
|
271
291
|
height: var(--grid-height);
|
272
292
|
margin: 0 -.5rem 0 0; // 0.5rem is the scrollbar width
|
273
293
|
overflow-y: scroll;
|
274
294
|
transition: var(--options-transition);
|
275
295
|
}
|
296
|
+
|
276
297
|
.color-options.scrollable:hover {
|
277
298
|
height: var(--grid-hover-height);
|
278
299
|
}
|
300
|
+
|
279
301
|
.color-options + .color-defaults {
|
280
302
|
margin-top: .25rem;
|
281
303
|
}
|
304
|
+
|
282
305
|
.multiline + .color-defaults {
|
283
|
-
flex-
|
284
|
-
|
306
|
+
flex-flow: row wrap;
|
307
|
+
|
285
308
|
.color-option {
|
286
309
|
padding: .25rem .33rem; font-size: 12px;
|
287
310
|
}
|
288
311
|
}
|
312
|
+
|
289
313
|
.color-options .color-option {
|
290
314
|
// hide any text
|
291
315
|
position: relative;
|
@@ -293,18 +317,23 @@ color-picker:focus,
|
|
293
317
|
height: var(--grid-item-size);
|
294
318
|
overflow: hidden;
|
295
319
|
text-indent: 2.1rem;
|
320
|
+
|
321
|
+
&:active, &:focus {
|
322
|
+
outline: none;
|
323
|
+
box-shadow: 0 0 0 4px rgba(125,125,125,75%) inset;
|
324
|
+
}
|
296
325
|
}
|
297
|
-
|
298
|
-
.color-options .color-option:
|
299
|
-
|
300
|
-
|
326
|
+
|
327
|
+
// .color-options .color-option:active,
|
328
|
+
// .color-options .color-option:focus {
|
329
|
+
// outline: none;
|
330
|
+
// }
|
331
|
+
|
301
332
|
.color-options .color-option::before {
|
302
333
|
position: absolute;
|
303
|
-
|
304
|
-
right: 0;
|
305
|
-
bottom: 0;
|
306
|
-
left: 0;
|
334
|
+
inset: 0;
|
307
335
|
}
|
336
|
+
|
308
337
|
.color-options .color-option:hover::before,
|
309
338
|
.color-options .color-option:active::before,
|
310
339
|
.color-options .color-option:focus::before {
|
@@ -313,13 +342,15 @@ color-picker:focus,
|
|
313
342
|
mix-blend-mode: difference;
|
314
343
|
}
|
315
344
|
|
316
|
-
.color-options .color-option
|
317
|
-
|
318
|
-
|
319
|
-
|
345
|
+
// .color-options .color-option {
|
346
|
+
// &:active, &:focus {
|
347
|
+
// outline: none;
|
348
|
+
// box-shadow: 0 0 0 4px rgba(125,125,125,75%) inset;
|
349
|
+
// }
|
350
|
+
// }
|
320
351
|
|
321
352
|
.color-options .color-option.active {
|
322
|
-
|
353
|
+
&::after {
|
323
354
|
position: absolute;
|
324
355
|
top: 50%;
|
325
356
|
left: 50%;
|
@@ -330,18 +361,19 @@ color-picker:focus,
|
|
330
361
|
border-radius: 4px;
|
331
362
|
}
|
332
363
|
}
|
333
|
-
|
364
|
+
|
365
|
+
.txt-dark .color-options .color-option.active::after {
|
334
366
|
box-shadow: 0 0 0 4px var(--white-90);
|
335
367
|
}
|
336
|
-
|
368
|
+
|
369
|
+
.txt-light .color-options .color-option.active::after {
|
337
370
|
box-shadow: 0 0 0 4px var(--black-90);
|
338
371
|
}
|
339
372
|
|
340
373
|
/* color-form */
|
341
374
|
.color-form {
|
342
375
|
display: flex;
|
343
|
-
flex-
|
344
|
-
flex-wrap: wrap;
|
376
|
+
flex-flow: row wrap;
|
345
377
|
align-items: center;
|
346
378
|
padding: .25rem 0 0;
|
347
379
|
font: 12px sans-serif;
|
@@ -383,6 +415,7 @@ color-picker:focus,
|
|
383
415
|
/* visual control */
|
384
416
|
.visual-control {
|
385
417
|
height: 150px;
|
418
|
+
|
386
419
|
/* important for mobile devices */
|
387
420
|
touch-action: none;
|
388
421
|
box-shadow: var(--visual-shadow);
|
@@ -391,18 +424,19 @@ color-picker:focus,
|
|
391
424
|
.visual-control1 {
|
392
425
|
width: 150px;
|
393
426
|
}
|
427
|
+
|
394
428
|
.visual-control2,
|
395
429
|
.visual-control3 {
|
396
430
|
width: 21px;
|
397
431
|
cursor: ns-resize;
|
398
432
|
}
|
399
433
|
|
400
|
-
@media (
|
434
|
+
@media (width >= 578px) {
|
401
435
|
.visual-control { height: 230px; }
|
402
436
|
.visual-control1 { width: 230px; }
|
403
437
|
}
|
404
438
|
|
405
|
-
@media (
|
439
|
+
@media (width >= 1200px) {
|
406
440
|
.visual-control { height: 300px; }
|
407
441
|
.visual-control1 { width: 300px; }
|
408
442
|
}
|
@@ -428,6 +462,7 @@ color-picker:focus,
|
|
428
462
|
top: 0;
|
429
463
|
left: 0;
|
430
464
|
height: 7px;
|
465
|
+
|
431
466
|
/* important for mobile devices */
|
432
467
|
touch-action: none;
|
433
468
|
user-select: none;
|
@@ -437,9 +472,11 @@ color-picker:focus,
|
|
437
472
|
outline: none;
|
438
473
|
will-change: transform;
|
439
474
|
}
|
475
|
+
|
440
476
|
.knob:hover {
|
441
477
|
box-shadow: var(--knob-shadow-hover);
|
442
478
|
}
|
479
|
+
|
443
480
|
.knob:focus,
|
444
481
|
.knob:active {
|
445
482
|
z-index: 1;
|
@@ -456,6 +493,7 @@ color-picker:focus,
|
|
456
493
|
.txt-dark .color-pointer {
|
457
494
|
box-shadow: 0 0 0 5px var(--white-50);
|
458
495
|
}
|
496
|
+
|
459
497
|
.txt-light .color-pointer {
|
460
498
|
box-shadow: 0 0 0 5px var(--black-50);
|
461
499
|
}
|
@@ -463,6 +501,7 @@ color-picker:focus,
|
|
463
501
|
.txt-dark .color-pointer:hover {
|
464
502
|
box-shadow: 0 0 0 5px var(--white-75);
|
465
503
|
}
|
504
|
+
|
466
505
|
.txt-light .color-pointer:hover {
|
467
506
|
box-shadow: 0 0 0 5px var(--black-75);
|
468
507
|
}
|
@@ -471,6 +510,7 @@ color-picker:focus,
|
|
471
510
|
.txt-dark .color-pointer:active {
|
472
511
|
box-shadow: 0 0 0 5px var(--white-90);
|
473
512
|
}
|
513
|
+
|
474
514
|
.txt-light .color-pointer:focus,
|
475
515
|
.txt-light .color-pointer:active {
|
476
516
|
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
|
+
}
|