@shortfuse/materialdesignweb 0.5.0 → 0.7.1-0
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/README.md +155 -77
- package/bin/generate-css.js +12 -0
- package/components/Badge.css +38 -0
- package/components/Badge.js +15 -0
- package/components/Body.css +14 -0
- package/components/Body.js +7 -0
- package/components/BottomAppBar.css +23 -0
- package/components/BottomAppBar.js +25 -0
- package/components/Box.css +31 -0
- package/components/Box.js +24 -0
- package/components/Button.css +147 -0
- package/components/Button.js +95 -0
- package/components/Button.md +61 -0
- package/components/Card.css +109 -0
- package/components/Card.js +82 -0
- package/components/Checkbox.css +89 -0
- package/components/Checkbox.js +59 -0
- package/components/CheckboxIcon.css +90 -0
- package/components/CheckboxIcon.js +41 -0
- package/components/Chip.css +35 -0
- package/components/Chip.js +22 -0
- package/components/Dialog.css +235 -0
- package/components/Dialog.js +327 -0
- package/components/DialogActions.js +13 -0
- package/components/Divider.css +41 -0
- package/components/Divider.js +13 -0
- package/components/ExtendedFab.css +24 -0
- package/components/ExtendedFab.js +11 -0
- package/components/Fab.css +23 -0
- package/components/Fab.js +26 -0
- package/components/FilterChip.css +80 -0
- package/components/FilterChip.js +51 -0
- package/components/Headline.css +14 -0
- package/components/Headline.js +33 -0
- package/components/Icon.css +76 -0
- package/components/Icon.js +174 -0
- package/components/IconButton.css +150 -0
- package/components/IconButton.js +65 -0
- package/components/Input.js +16 -0
- package/components/Label.css +14 -0
- package/components/Label.js +7 -0
- package/components/Layout.css +19 -0
- package/components/Layout.js +12 -0
- package/components/List.css +12 -0
- package/components/List.js +17 -0
- package/components/ListItem.css +224 -0
- package/components/ListItem.js +112 -0
- package/components/ListOption.css +34 -0
- package/components/ListOption.js +122 -0
- package/components/ListSelect.css +9 -0
- package/components/ListSelect.js +206 -0
- package/components/Menu.css +171 -0
- package/components/Menu.js +470 -0
- package/components/MenuItem.css +53 -0
- package/components/MenuItem.js +215 -0
- package/components/Nav.css +17 -0
- package/components/Nav.js +23 -0
- package/components/NavBar.css +34 -0
- package/components/NavBar.js +88 -0
- package/components/NavBarItem.css +41 -0
- package/components/NavBarItem.js +7 -0
- package/components/NavDrawer.css +31 -0
- package/components/NavDrawer.js +13 -0
- package/components/NavDrawerItem.css +42 -0
- package/components/NavDrawerItem.js +12 -0
- package/components/NavItem.css +181 -0
- package/components/NavItem.js +83 -0
- package/components/NavRail.css +47 -0
- package/components/NavRail.js +17 -0
- package/components/NavRailItem.css +25 -0
- package/components/NavRailItem.js +7 -0
- package/components/Option.js +91 -0
- package/components/Outline.css +138 -0
- package/components/Pane.css +261 -0
- package/components/Pane.js +21 -0
- package/components/Progress.css +75 -0
- package/components/Progress.js +67 -0
- package/components/ProgressCircle.css +226 -0
- package/components/ProgressLine.css +155 -0
- package/components/Radio.css +95 -0
- package/components/Radio.js +42 -0
- package/components/RadioIcon.css +73 -0
- package/components/RadioIcon.js +37 -0
- package/components/Ripple.css +74 -0
- package/components/Ripple.js +114 -0
- package/components/SegmentedButton.css +94 -0
- package/components/SegmentedButton.js +49 -0
- package/components/SegmentedButtonGroup.css +12 -0
- package/components/SegmentedButtonGroup.js +44 -0
- package/components/Select.css +52 -0
- package/components/Select.js +71 -0
- package/components/Shape.css +132 -0
- package/components/Shape.js +25 -0
- package/components/Slider.css +307 -0
- package/components/Slider.js +206 -0
- package/components/Snackbar.css +80 -0
- package/components/Snackbar.js +75 -0
- package/components/Surface.css +10 -0
- package/components/Surface.js +23 -0
- package/components/Switch.css +64 -0
- package/components/Switch.js +127 -0
- package/components/SwitchIcon.css +178 -0
- package/components/SwitchIcon.js +89 -0
- package/components/SwitchIconAnimations.css +89 -0
- package/components/Tab.css +85 -0
- package/components/Tab.js +103 -0
- package/components/TabContent.js +151 -0
- package/components/TabList.css +129 -0
- package/components/TabList.js +309 -0
- package/components/TabPanel.js +37 -0
- package/components/TextArea.css +93 -0
- package/components/TextArea.js +229 -0
- package/components/Title.css +14 -0
- package/components/Title.js +15 -0
- package/components/Tooltip.css +40 -0
- package/components/Tooltip.js +22 -0
- package/components/TopAppBar.css +209 -0
- package/components/TopAppBar.js +201 -0
- package/core/Composition.js +988 -0
- package/core/CustomElement.js +844 -0
- package/core/ICustomElement.d.ts +288 -0
- package/core/ICustomElement.js +1 -0
- package/core/css.js +51 -0
- package/core/customTypes.js +125 -0
- package/core/dom.js +56 -154
- package/core/identify.js +40 -0
- package/core/observe.js +410 -0
- package/core/template.js +121 -0
- package/core/typings.d.ts +135 -0
- package/core/typings.js +1 -0
- package/index.js +77 -0
- package/mixins/AriaReflectorMixin.js +42 -0
- package/mixins/AriaToolbarMixin.js +13 -0
- package/mixins/ControlMixin.css +57 -0
- package/mixins/ControlMixin.js +212 -0
- package/mixins/DensityMixin.css +40 -0
- package/mixins/DensityMixin.js +11 -0
- package/mixins/FlexableMixin.css +79 -0
- package/mixins/FlexableMixin.js +32 -0
- package/mixins/FormAssociatedMixin.js +170 -0
- package/mixins/InputMixin.js +335 -0
- package/mixins/KeyboardNavMixin.js +244 -0
- package/mixins/RTLObserverMixin.js +35 -0
- package/mixins/ResizeObserverMixin.js +38 -0
- package/mixins/RippleMixin.css +12 -0
- package/mixins/RippleMixin.js +115 -0
- package/mixins/ScrollListenerMixin.js +100 -0
- package/mixins/ShapeMixin.css +135 -0
- package/mixins/ShapeMixin.js +31 -0
- package/mixins/StateMixin.css +82 -0
- package/mixins/StateMixin.js +114 -0
- package/mixins/SurfaceMixin.css +150 -0
- package/mixins/SurfaceMixin.js +32 -0
- package/mixins/TextFieldMixin.css +657 -0
- package/mixins/TextFieldMixin.js +121 -0
- package/mixins/ThemableMixin.css +204 -0
- package/mixins/ThemableMixin.js +16 -0
- package/mixins/TooltipTriggerMixin.css +27 -0
- package/mixins/TooltipTriggerMixin.js +366 -0
- package/mixins/TouchTargetMixin.css +26 -0
- package/mixins/TouchTargetMixin.js +9 -0
- package/package.json +55 -49
- package/theming/index.js +473 -0
- package/theming/loader.js +24 -0
- package/utils/cli.js +11 -0
- package/utils/color_keywords.js +151 -0
- package/utils/hct/Cam16.js +298 -0
- package/utils/hct/CorePalette.js +84 -0
- package/utils/hct/Hct.js +172 -0
- package/utils/hct/Scheme.js +587 -0
- package/utils/hct/TonalPalette.js +68 -0
- package/utils/hct/ViewingConditions.js +136 -0
- package/utils/hct/blend.js +93 -0
- package/utils/hct/colorUtils.js +302 -0
- package/utils/hct/hctSolver.js +559 -0
- package/utils/hct/helper.js +182 -0
- package/utils/hct/mathUtils.js +153 -0
- package/utils/jsonMergePatch.js +100 -0
- package/utils/jsx-runtime.js +101 -0
- package/utils/popup.js +117 -0
- package/utils/svg.js +12 -0
- package/.browserslistrc +0 -4
- package/.eslintrc.json +0 -204
- package/.stylelintrc.json +0 -645
- package/.vscode/launch.json +0 -31
- package/.vscode/settings.json +0 -3
- package/.vscode/tasks.json +0 -32
- package/CHANGELOG.md +0 -36
- package/CODE_OF_CONDUCT.md +0 -46
- package/adapters/datatable/column.js +0 -176
- package/adapters/datatable/index.js +0 -960
- package/adapters/dom/index.js +0 -586
- package/adapters/list/index.js +0 -69
- package/adapters/search/index.js +0 -495
- package/components/appbar/_spec.scss +0 -165
- package/components/appbar/_theme.scss +0 -0
- package/components/appbar/index.scss +0 -2
- package/components/banner/_spec.scss +0 -83
- package/components/banner/_theme.scss +0 -0
- package/components/banner/index.scss +0 -2
- package/components/bottomnav/README.md +0 -85
- package/components/bottomnav/_spec.scss +0 -149
- package/components/bottomnav/_theme.scss +0 -0
- package/components/bottomnav/index.js +0 -117
- package/components/bottomnav/index.scss +0 -2
- package/components/bottomnav/item.js +0 -88
- package/components/button/README.md +0 -61
- package/components/button/_spec.scss +0 -162
- package/components/button/_theme.scss +0 -42
- package/components/button/index.eta +0 -32
- package/components/button/index.js +0 -43
- package/components/button/index.pug +0 -18
- package/components/button/index.scss +0 -2
- package/components/card/_spec.scss +0 -241
- package/components/card/_theme.scss +0 -0
- package/components/card/index.scss +0 -2
- package/components/chip/_spec.scss +0 -111
- package/components/chip/_theme.scss +0 -105
- package/components/chip/index.js +0 -23
- package/components/chip/index.scss +0 -2
- package/components/chip/item.js +0 -20
- package/components/datatable/_spec.scss +0 -225
- package/components/datatable/_theme.scss +0 -128
- package/components/datatable/cell.js +0 -44
- package/components/datatable/columnheader.js +0 -46
- package/components/datatable/index.js +0 -374
- package/components/datatable/index.scss +0 -2
- package/components/datatable/row.js +0 -48
- package/components/datatable/rowheader.js +0 -18
- package/components/dialog/_spec.scss +0 -203
- package/components/dialog/_theme.scss +0 -7
- package/components/dialog/index.js +0 -601
- package/components/dialog/index.scss +0 -2
- package/components/divider/_spec.scss +0 -11
- package/components/divider/_theme.scss +0 -0
- package/components/divider/index.scss +0 -2
- package/components/elevation/_spec.scss +0 -9
- package/components/elevation/_theme.scss +0 -0
- package/components/elevation/index.scss +0 -2
- package/components/fab/_spec.scss +0 -210
- package/components/fab/_theme.scss +0 -0
- package/components/fab/index.js +0 -99
- package/components/fab/index.scss +0 -2
- package/components/grid/_spec.scss +0 -169
- package/components/grid/_theme.scss +0 -0
- package/components/grid/index.scss +0 -2
- package/components/layout/_mixins.scss +0 -11
- package/components/layout/_spec.scss +0 -916
- package/components/layout/_theme.scss +0 -19
- package/components/layout/index.js +0 -454
- package/components/layout/index.scss +0 -2
- package/components/list/_spec.scss +0 -363
- package/components/list/_theme.scss +0 -102
- package/components/list/content.js +0 -106
- package/components/list/index.js +0 -256
- package/components/list/index.scss +0 -2
- package/components/list/item.js +0 -167
- package/components/list/secondary.js +0 -45
- package/components/menu/_spec.scss +0 -329
- package/components/menu/_theme.scss +0 -0
- package/components/menu/index.js +0 -705
- package/components/menu/index.scss +0 -2
- package/components/menu/item.js +0 -231
- package/components/progress/_spec.scss +0 -156
- package/components/progress/_theme.scss +0 -0
- package/components/progress/index.js +0 -36
- package/components/progress/index.scss +0 -2
- package/components/selection/_spec.scss +0 -376
- package/components/selection/_theme.scss +0 -134
- package/components/selection/index.eta +0 -60
- package/components/selection/index.js +0 -70
- package/components/selection/index.pug +0 -30
- package/components/selection/index.scss +0 -2
- package/components/selection/input.js +0 -54
- package/components/selection/radiogroup.js +0 -40
- package/components/slider/_spec.scss +0 -59
- package/components/slider/_theme.scss +0 -0
- package/components/slider/index.scss +0 -2
- package/components/snackbar/_spec.scss +0 -150
- package/components/snackbar/_theme.scss +0 -0
- package/components/snackbar/index.js +0 -338
- package/components/snackbar/index.scss +0 -2
- package/components/tab/_spec.scss +0 -220
- package/components/tab/_theme.scss +0 -0
- package/components/tab/content.js +0 -210
- package/components/tab/index.js +0 -257
- package/components/tab/index.scss +0 -2
- package/components/tab/item.js +0 -88
- package/components/tab/list.js +0 -196
- package/components/tab/panel.js +0 -54
- package/components/textfield/README.md +0 -179
- package/components/textfield/_spec.scss +0 -763
- package/components/textfield/_theme.scss +0 -264
- package/components/textfield/index.eta +0 -74
- package/components/textfield/index.js +0 -160
- package/components/textfield/index.pug +0 -30
- package/components/textfield/index.scss +0 -2
- package/components/tooltip/_spec.scss +0 -185
- package/components/tooltip/_theme.scss +0 -0
- package/components/tooltip/index.scss +0 -2
- package/components/type/_spec.scss +0 -227
- package/components/type/_theme.scss +0 -0
- package/components/type/index.scss +0 -2
- package/core/_breakpoint.scss +0 -189
- package/core/_elevation.scss +0 -78
- package/core/_length.scss +0 -8
- package/core/_motion.scss +0 -31
- package/core/_platform.scss +0 -12
- package/core/_type.scss +0 -128
- package/core/aria/attributes.js +0 -141
- package/core/aria/button.js +0 -49
- package/core/aria/keyboard.js +0 -92
- package/core/aria/rovingtabindex.js +0 -175
- package/core/aria/tab.js +0 -59
- package/core/document/index.js +0 -39
- package/core/overlay/_spec.scss +0 -28
- package/core/overlay/_theme.scss +0 -147
- package/core/overlay/index.js +0 -95
- package/core/overlay/index.scss +0 -2
- package/core/ripple/_spec.scss +0 -196
- package/core/ripple/_theme.scss +0 -20
- package/core/ripple/index.js +0 -286
- package/core/ripple/index.scss +0 -2
- package/core/theme/_aliases.scss +0 -15
- package/core/theme/_config.scss +0 -8
- package/core/theme/_functions.scss +0 -22
- package/core/theme/_palettes.scss +0 -405
- package/core/theme/_spec.scss +0 -0
- package/core/theme/_theme.scss +0 -268
- package/core/theme/index.js +0 -50
- package/core/theme/index.scss +0 -4
- package/core/throttler.js +0 -42
- package/core/transition/index.js +0 -465
- package/docs/_flex.scss +0 -28
- package/docs/_menuoptions.js +0 -183
- package/docs/_partials/_androidnavbar.eta +0 -5
- package/docs/_partials/_androidstatusbar.eta +0 -13
- package/docs/_partials/_appbar.eta +0 -27
- package/docs/_partials/_buttontest.eta +0 -31
- package/docs/_partials/_header.eta +0 -146
- package/docs/_partials/_navlistitem.eta +0 -16
- package/docs/_partials/_target.eta +0 -1
- package/docs/_sample-utils.js +0 -88
- package/docs/_storage.js +0 -33
- package/docs/docs.scss +0 -331
- package/docs/framework.scss +0 -26
- package/docs/index.eta +0 -12
- package/docs/index.js +0 -7
- package/docs/pages/appbar.eta +0 -108
- package/docs/pages/appbar.js +0 -0
- package/docs/pages/bottomnav.eta +0 -188
- package/docs/pages/bottomnav.js +0 -118
- package/docs/pages/button.eta +0 -124
- package/docs/pages/button.js +0 -224
- package/docs/pages/card.eta +0 -90
- package/docs/pages/card.js +0 -175
- package/docs/pages/chip.eta +0 -122
- package/docs/pages/chip.js +0 -80
- package/docs/pages/color.eta +0 -143
- package/docs/pages/color.js +0 -261
- package/docs/pages/datatable.eta +0 -323
- package/docs/pages/datatable.js +0 -160
- package/docs/pages/dialog.eta +0 -184
- package/docs/pages/dialog.js +0 -174
- package/docs/pages/dom.eta +0 -26
- package/docs/pages/dom.js +0 -140
- package/docs/pages/elevation.eta +0 -35
- package/docs/pages/elevation.js +0 -0
- package/docs/pages/fab.eta +0 -99
- package/docs/pages/fab.js +0 -43
- package/docs/pages/grid.eta +0 -135
- package/docs/pages/grid.js +0 -128
- package/docs/pages/layout.eta +0 -8
- package/docs/pages/layout.js +0 -0
- package/docs/pages/list.eta +0 -465
- package/docs/pages/list.js +0 -8
- package/docs/pages/menu.eta +0 -274
- package/docs/pages/menu.js +0 -213
- package/docs/pages/overlay.eta +0 -69
- package/docs/pages/overlay.js +0 -3
- package/docs/pages/progress.eta +0 -23
- package/docs/pages/progress.js +0 -12
- package/docs/pages/ripple.eta +0 -27
- package/docs/pages/ripple.js +0 -3
- package/docs/pages/search.eta +0 -242
- package/docs/pages/search.js +0 -226
- package/docs/pages/selection.eta +0 -107
- package/docs/pages/selection.js +0 -12
- package/docs/pages/slider.eta +0 -23
- package/docs/pages/slider.js +0 -0
- package/docs/pages/snackbar.eta +0 -83
- package/docs/pages/snackbar.js +0 -157
- package/docs/pages/tab.eta +0 -407
- package/docs/pages/tab.js +0 -152
- package/docs/pages/textfield.eta +0 -487
- package/docs/pages/textfield.js +0 -257
- package/docs/pages/tooltip.eta +0 -92
- package/docs/pages/tooltip.js +0 -0
- package/docs/pages/transition.eta +0 -117
- package/docs/pages/transition.js +0 -52
- package/docs/pages/type.eta +0 -31
- package/docs/pages/type.js +0 -0
- package/docs/postrender.js +0 -41
- package/docs/prerender.js +0 -16
- package/docs/pwa/_dialogs.eta +0 -143
- package/docs/pwa/_menus.eta +0 -16
- package/docs/pwa/pwa-prerender.js +0 -3
- package/docs/pwa/pwa.eta +0 -478
- package/docs/pwa/pwa.js +0 -298
- package/docs/pwa/pwa.scss +0 -31
- package/docs/themes/theme-colored.scss +0 -15
- package/docs/themes/theme-default.scss +0 -3
- package/index.scss +0 -27
- package/jsconfig.json +0 -16
- package/scripts/deploy-docs.sh +0 -9
- package/templates/index.eta +0 -2
- package/templates/index.pug +0 -3
- package/tsconfig.json +0 -16
- package/webpack.config.js +0 -304
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2021 Google LLC
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import ViewingConditions from './ViewingConditions.js';
|
|
19
|
+
import * as utils from './colorUtils.js';
|
|
20
|
+
import * as math from './mathUtils.js';
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* CAM16, a color appearance model. Colors are not just defined by their hex
|
|
24
|
+
* code, but rather, a hex code and viewing conditions.
|
|
25
|
+
*
|
|
26
|
+
* CAM16 instances also have coordinates in the CAM16-UCS space, called J*, a*,
|
|
27
|
+
* b*, or jstar, astar, bstar in code. CAM16-UCS is included in the CAM16
|
|
28
|
+
* specification, and should be used when measuring distances between colors.
|
|
29
|
+
*
|
|
30
|
+
* In traditional color spaces, a color can be identified solely by the
|
|
31
|
+
* observer's measurement of the color. Color appearance models such as CAM16
|
|
32
|
+
* also use information about the environment where the color was
|
|
33
|
+
* observed, known as the viewing conditions.
|
|
34
|
+
*
|
|
35
|
+
* For example, white under the traditional assumption of a midday sun white
|
|
36
|
+
* point is accurately measured as a slightly chromatic blue by CAM16. (roughly,
|
|
37
|
+
* hue 203, chroma 3, lightness 100)
|
|
38
|
+
*/
|
|
39
|
+
export default class Cam16 {
|
|
40
|
+
/**
|
|
41
|
+
* All of the CAM16 dimensions can be calculated from 3 of the dimensions, in
|
|
42
|
+
* the following combinations:
|
|
43
|
+
* - {j or q} and {c, m, or s} and hue
|
|
44
|
+
* - jstar, astar, bstar
|
|
45
|
+
* Prefer using a static method that constructs from 3 of those dimensions.
|
|
46
|
+
* This constructor is intended for those methods to use to return all
|
|
47
|
+
* possible dimensions.
|
|
48
|
+
* @param {number} hue
|
|
49
|
+
* @param {number} chroma informally, colorfulness / color intensity. like saturation
|
|
50
|
+
* in HSL, except perceptually accurate.
|
|
51
|
+
* @param {number} j lightness
|
|
52
|
+
* @param {number} q brightness; ratio of lightness to white point's lightness
|
|
53
|
+
* @param {number} m colorfulness
|
|
54
|
+
* @param {number} s saturation; ratio of chroma to white point's chroma
|
|
55
|
+
* @param {number} jstar CAM16-UCS J coordinate
|
|
56
|
+
* @param {number} astar CAM16-UCS a coordinate
|
|
57
|
+
* @param {number} bstar CAM16-UCS b coordinate
|
|
58
|
+
*/
|
|
59
|
+
constructor(hue, chroma, j, q, m, s, jstar, astar, bstar) {
|
|
60
|
+
/** @readonly */
|
|
61
|
+
this.hue = hue;
|
|
62
|
+
/** @readonly */
|
|
63
|
+
this.chroma = chroma;
|
|
64
|
+
/** @readonly */
|
|
65
|
+
this.j = j;
|
|
66
|
+
/** @readonly */
|
|
67
|
+
this.q = q;
|
|
68
|
+
/** @readonly */
|
|
69
|
+
this.m = m;
|
|
70
|
+
/** @readonly */
|
|
71
|
+
this.s = s;
|
|
72
|
+
/** @readonly */
|
|
73
|
+
this.jstar = jstar;
|
|
74
|
+
/** @readonly */
|
|
75
|
+
this.astar = astar;
|
|
76
|
+
/** @readonly */
|
|
77
|
+
this.bstar = bstar;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* CAM16 instances also have coordinates in the CAM16-UCS space, called J*,
|
|
82
|
+
* a*, b*, or jstar, astar, bstar in code. CAM16-UCS is included in the CAM16
|
|
83
|
+
* specification, and is used to measure distances between colors.
|
|
84
|
+
* @param {Cam16} other
|
|
85
|
+
* @return {number}
|
|
86
|
+
*/
|
|
87
|
+
distance(other) {
|
|
88
|
+
const dJ = this.jstar - other.jstar;
|
|
89
|
+
const dA = this.astar - other.astar;
|
|
90
|
+
const dB = this.bstar - other.bstar;
|
|
91
|
+
const dEPrime = Math.sqrt(dJ * dJ + dA * dA + dB * dB);
|
|
92
|
+
const dE = 1.41 * dEPrime ** 0.63;
|
|
93
|
+
return dE;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* @param {number} argb ARGB representation of a color.
|
|
98
|
+
* @return {Cam16} CAM16 color, assuming the color was viewed in default viewing
|
|
99
|
+
* conditions.
|
|
100
|
+
*/
|
|
101
|
+
static fromInt(argb) {
|
|
102
|
+
return Cam16.fromIntInViewingConditions(argb, ViewingConditions.DEFAULT);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* @param {number} argb ARGB representation of a color.
|
|
107
|
+
* @param {ViewingConditions} viewingConditions Information about the environment where the color
|
|
108
|
+
* was observed.
|
|
109
|
+
* @return {Cam16} CAM16 color.
|
|
110
|
+
*/
|
|
111
|
+
static fromIntInViewingConditions(argb, viewingConditions) {
|
|
112
|
+
const red = (argb & 0x00_FF_00_00) >> 16;
|
|
113
|
+
const green = (argb & 0x00_00_FF_00) >> 8;
|
|
114
|
+
const blue = (argb & 0x00_00_00_FF);
|
|
115
|
+
const redL = utils.linearized(red);
|
|
116
|
+
const greenL = utils.linearized(green);
|
|
117
|
+
const blueL = utils.linearized(blue);
|
|
118
|
+
const x = 0.412_338_95 * redL + 0.357_620_64 * greenL + 0.180_510_42 * blueL;
|
|
119
|
+
const y = 0.2126 * redL + 0.7152 * greenL + 0.0722 * blueL;
|
|
120
|
+
const z = 0.019_321_41 * redL + 0.119_163_82 * greenL + 0.950_344_78 * blueL;
|
|
121
|
+
|
|
122
|
+
const rC = 0.401_288 * x + 0.650_173 * y - 0.051_461 * z;
|
|
123
|
+
const gC = -0.250_268 * x + 1.204_414 * y + 0.045_854 * z;
|
|
124
|
+
const bC = -0.002_079 * x + 0.048_952 * y + 0.953_127 * z;
|
|
125
|
+
|
|
126
|
+
const rD = viewingConditions.rgbD[0] * rC;
|
|
127
|
+
const gD = viewingConditions.rgbD[1] * gC;
|
|
128
|
+
const bD = viewingConditions.rgbD[2] * bC;
|
|
129
|
+
|
|
130
|
+
const rAF = ((viewingConditions.fl * Math.abs(rD)) / 100) ** 0.42;
|
|
131
|
+
const gAF = ((viewingConditions.fl * Math.abs(gD)) / 100) ** 0.42;
|
|
132
|
+
const bAF = ((viewingConditions.fl * Math.abs(bD)) / 100) ** 0.42;
|
|
133
|
+
|
|
134
|
+
const rA = (math.signum(rD) * 400 * rAF) / (rAF + 27.13);
|
|
135
|
+
const gA = (math.signum(gD) * 400 * gAF) / (gAF + 27.13);
|
|
136
|
+
const bA = (math.signum(bD) * 400 * bAF) / (bAF + 27.13);
|
|
137
|
+
|
|
138
|
+
const a = (11 * rA + -12 * gA + bA) / 11;
|
|
139
|
+
const b = (rA + gA - 2 * bA) / 9;
|
|
140
|
+
const u = (20 * rA + 20 * gA + 21 * bA) / 20;
|
|
141
|
+
const p2 = (40 * rA + 20 * gA + bA) / 20;
|
|
142
|
+
const atan2 = Math.atan2(b, a);
|
|
143
|
+
const atanDegrees = (atan2 * 180) / Math.PI;
|
|
144
|
+
const hue = atanDegrees < 0 ? atanDegrees + 360
|
|
145
|
+
: (atanDegrees >= 360 ? atanDegrees - 360
|
|
146
|
+
: atanDegrees);
|
|
147
|
+
const hueRadians = (hue * Math.PI) / 180;
|
|
148
|
+
|
|
149
|
+
const ac = p2 * viewingConditions.nbb;
|
|
150
|
+
const j = 100
|
|
151
|
+
* (ac / viewingConditions.aw) ** (viewingConditions.c * viewingConditions.z);
|
|
152
|
+
const q = (4 / viewingConditions.c) * Math.sqrt(j / 100)
|
|
153
|
+
* (viewingConditions.aw + 4) * viewingConditions.fLRoot;
|
|
154
|
+
const huePrime = hue < 20.14 ? hue + 360 : hue;
|
|
155
|
+
const eHue = 0.25 * (Math.cos((huePrime * Math.PI) / 180 + 2) + 3.8);
|
|
156
|
+
const p1 = (50_000 / 13) * eHue * viewingConditions.nc * viewingConditions.ncb;
|
|
157
|
+
const t = (p1 * Math.sqrt(a * a + b * b)) / (u + 0.305);
|
|
158
|
+
const alpha = t ** 0.9
|
|
159
|
+
* (1.64 - 0.29 ** viewingConditions.n) ** 0.73;
|
|
160
|
+
const c = alpha * Math.sqrt(j / 100);
|
|
161
|
+
const m = c * viewingConditions.fLRoot;
|
|
162
|
+
const s = 50
|
|
163
|
+
* Math.sqrt((alpha * viewingConditions.c) / (viewingConditions.aw + 4));
|
|
164
|
+
const jstar = ((1 + 100 * 0.007) * j) / (1 + 0.007 * j);
|
|
165
|
+
const mstar = (1 / 0.0228) * Math.log(1 + 0.0228 * m);
|
|
166
|
+
const astar = mstar * Math.cos(hueRadians);
|
|
167
|
+
const bstar = mstar * Math.sin(hueRadians);
|
|
168
|
+
|
|
169
|
+
return new Cam16(hue, c, j, q, m, s, jstar, astar, bstar);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* @param {number} j CAM16 lightness
|
|
174
|
+
* @param {number} c CAM16 chroma
|
|
175
|
+
* @param {number} h CAM16 hue
|
|
176
|
+
* @return {Cam16}
|
|
177
|
+
*/
|
|
178
|
+
static fromJch(j, c, h) {
|
|
179
|
+
return Cam16.fromJchInViewingConditions(j, c, h, ViewingConditions.DEFAULT);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* @param {number} j CAM16 lightness
|
|
184
|
+
* @param {number} c CAM16 chroma
|
|
185
|
+
* @param {number} h CAM16 hue
|
|
186
|
+
* @param {ViewingConditions} viewingConditions Information about the environment where the color
|
|
187
|
+
* was observed.
|
|
188
|
+
*/
|
|
189
|
+
static fromJchInViewingConditions(j, c, h, viewingConditions) {
|
|
190
|
+
const q = (4 / viewingConditions.c) * Math.sqrt(j / 100)
|
|
191
|
+
* (viewingConditions.aw + 4) * viewingConditions.fLRoot;
|
|
192
|
+
const m = c * viewingConditions.fLRoot;
|
|
193
|
+
const alpha = c / Math.sqrt(j / 100);
|
|
194
|
+
const s = 50
|
|
195
|
+
* Math.sqrt((alpha * viewingConditions.c) / (viewingConditions.aw + 4));
|
|
196
|
+
const hueRadians = (h * Math.PI) / 180;
|
|
197
|
+
const jstar = ((1 + 100 * 0.007) * j) / (1 + 0.007 * j);
|
|
198
|
+
const mstar = (1 / 0.0228) * Math.log(1 + 0.0228 * m);
|
|
199
|
+
const astar = mstar * Math.cos(hueRadians);
|
|
200
|
+
const bstar = mstar * Math.sin(hueRadians);
|
|
201
|
+
return new Cam16(h, c, j, q, m, s, jstar, astar, bstar);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* @param {number} jstar CAM16-UCS lightness.
|
|
206
|
+
* @param {number} astar CAM16-UCS a dimension. Like a* in L*a*b*, it is a Cartesian
|
|
207
|
+
* coordinate on the Y axis.
|
|
208
|
+
* @param {number} bstar CAM16-UCS b dimension. Like a* in L*a*b*, it is a Cartesian
|
|
209
|
+
* coordinate on the X axis.
|
|
210
|
+
* @return {Cam16}
|
|
211
|
+
*/
|
|
212
|
+
static fromUcs(jstar, astar, bstar) {
|
|
213
|
+
return Cam16.fromUcsInViewingConditions(jstar, astar, bstar, ViewingConditions.DEFAULT);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* @param {number} jstar CAM16-UCS lightness.
|
|
218
|
+
* @param {number} astar CAM16-UCS a dimension. Like a* in L*a*b*, it is a Cartesian
|
|
219
|
+
* coordinate on the Y axis.
|
|
220
|
+
* @param {number} bstar CAM16-UCS b dimension. Like a* in L*a*b*, it is a Cartesian
|
|
221
|
+
* coordinate on the X axis.
|
|
222
|
+
* @param {ViewingConditions} viewingConditions Information about the environment where the color
|
|
223
|
+
* was observed.
|
|
224
|
+
*/
|
|
225
|
+
static fromUcsInViewingConditions(jstar, astar, bstar, viewingConditions) {
|
|
226
|
+
const a = astar;
|
|
227
|
+
const b = bstar;
|
|
228
|
+
const m = Math.sqrt(a * a + b * b);
|
|
229
|
+
const M = (Math.exp(m * 0.0228) - 1) / 0.0228;
|
|
230
|
+
const c = M / viewingConditions.fLRoot;
|
|
231
|
+
let h = Math.atan2(b, a) * (180 / Math.PI);
|
|
232
|
+
if (h < 0) {
|
|
233
|
+
h += 360;
|
|
234
|
+
}
|
|
235
|
+
const j = jstar / (1 - (jstar - 100) * 0.007);
|
|
236
|
+
return Cam16.fromJchInViewingConditions(j, c, h, viewingConditions);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* @return {number} ARGB representation of color, assuming the color was viewed in
|
|
241
|
+
* default viewing conditions, which are near-identical to the default
|
|
242
|
+
* viewing conditions for sRGB.
|
|
243
|
+
*/
|
|
244
|
+
toInt() {
|
|
245
|
+
return this.viewed(ViewingConditions.DEFAULT);
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
/**
|
|
249
|
+
* @param {ViewingConditions} viewingConditions Information about the environment where the color
|
|
250
|
+
* will be viewed.
|
|
251
|
+
* @return {number} ARGB representation of color
|
|
252
|
+
*/
|
|
253
|
+
viewed(viewingConditions) {
|
|
254
|
+
const alpha = this.chroma === 0 || this.j === 0
|
|
255
|
+
? 0
|
|
256
|
+
: this.chroma / Math.sqrt(this.j / 100);
|
|
257
|
+
|
|
258
|
+
const t = (alpha / (1.64 - 0.29 ** viewingConditions.n) ** 0.73) ** (1 / 0.9);
|
|
259
|
+
const hRad = (this.hue * Math.PI) / 180;
|
|
260
|
+
|
|
261
|
+
const eHue = 0.25 * (Math.cos(hRad + 2) + 3.8);
|
|
262
|
+
const ac = viewingConditions.aw
|
|
263
|
+
* (this.j / 100) ** (1 / viewingConditions.c / viewingConditions.z);
|
|
264
|
+
const p1 = eHue * (50_000 / 13) * viewingConditions.nc * viewingConditions.ncb;
|
|
265
|
+
const p2 = ac / viewingConditions.nbb;
|
|
266
|
+
|
|
267
|
+
const hSin = Math.sin(hRad);
|
|
268
|
+
const hCos = Math.cos(hRad);
|
|
269
|
+
|
|
270
|
+
const gamma = (23 * (p2 + 0.305) * t)
|
|
271
|
+
/ (23 * p1 + 11 * t * hCos + 108 * t * hSin);
|
|
272
|
+
const a = gamma * hCos;
|
|
273
|
+
const b = gamma * hSin;
|
|
274
|
+
const rA = (460 * p2 + 451 * a + 288 * b) / 1403;
|
|
275
|
+
const gA = (460 * p2 - 891 * a - 261 * b) / 1403;
|
|
276
|
+
const bA = (460 * p2 - 220 * a - 6300 * b) / 1403;
|
|
277
|
+
|
|
278
|
+
const rCBase = Math.max(0, (27.13 * Math.abs(rA)) / (400 - Math.abs(rA)));
|
|
279
|
+
const rC = math.signum(rA) * (100 / viewingConditions.fl)
|
|
280
|
+
* rCBase ** (1 / 0.42);
|
|
281
|
+
const gCBase = Math.max(0, (27.13 * Math.abs(gA)) / (400 - Math.abs(gA)));
|
|
282
|
+
const gC = math.signum(gA) * (100 / viewingConditions.fl)
|
|
283
|
+
* gCBase ** (1 / 0.42);
|
|
284
|
+
const bCBase = Math.max(0, (27.13 * Math.abs(bA)) / (400 - Math.abs(bA)));
|
|
285
|
+
const bC = math.signum(bA) * (100 / viewingConditions.fl)
|
|
286
|
+
* bCBase ** (1 / 0.42);
|
|
287
|
+
const rF = rC / viewingConditions.rgbD[0];
|
|
288
|
+
const gF = gC / viewingConditions.rgbD[1];
|
|
289
|
+
const bF = bC / viewingConditions.rgbD[2];
|
|
290
|
+
|
|
291
|
+
const x = 1.862_067_86 * rF - 1.011_254_63 * gF + 0.149_186_77 * bF;
|
|
292
|
+
const y = 0.387_526_54 * rF + 0.621_447_44 * gF - 0.008_973_98 * bF;
|
|
293
|
+
const z = -0.015_841_5 * rF - 0.034_122_94 * gF + 1.049_964_44 * bF;
|
|
294
|
+
|
|
295
|
+
const argb = utils.argbFromXyz(x, y, z);
|
|
296
|
+
return argb;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2021 Google LLC
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import Hct from './Hct.js';
|
|
19
|
+
import TonalPalette from './TonalPalette.js';
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* An intermediate concept between the key color for a UI theme, and a full
|
|
23
|
+
* color scheme. 5 sets of tones are generated, all except one use the same hue
|
|
24
|
+
* as the key color, and all vary in chroma.
|
|
25
|
+
*/
|
|
26
|
+
export default class CorePalette {
|
|
27
|
+
/** @type {TonalPalette} */
|
|
28
|
+
a1;
|
|
29
|
+
|
|
30
|
+
/** @type {TonalPalette} */
|
|
31
|
+
a2;
|
|
32
|
+
|
|
33
|
+
/** @type {TonalPalette} */
|
|
34
|
+
a3;
|
|
35
|
+
|
|
36
|
+
/** @type {TonalPalette} */
|
|
37
|
+
n1;
|
|
38
|
+
|
|
39
|
+
/** @type {TonalPalette} */
|
|
40
|
+
n2;
|
|
41
|
+
|
|
42
|
+
/** @type {TonalPalette} */
|
|
43
|
+
error;
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* @param {number} argb ARGB representation of a color
|
|
47
|
+
* @return {CorePalette}
|
|
48
|
+
*/
|
|
49
|
+
static of(argb) {
|
|
50
|
+
return new CorePalette(argb, false);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* @param {number} argb ARGB representation of a color
|
|
55
|
+
* @return {CorePalette}
|
|
56
|
+
*/
|
|
57
|
+
static contentOf(argb) {
|
|
58
|
+
return new CorePalette(argb, true);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* @param {number} argb
|
|
63
|
+
* @param {boolean} isContent
|
|
64
|
+
*/
|
|
65
|
+
constructor(argb, isContent) {
|
|
66
|
+
const hct = Hct.fromInt(argb);
|
|
67
|
+
const { hue } = hct;
|
|
68
|
+
const { chroma } = hct;
|
|
69
|
+
if (isContent) {
|
|
70
|
+
this.a1 = TonalPalette.fromHueAndChroma(hue, chroma);
|
|
71
|
+
this.a2 = TonalPalette.fromHueAndChroma(hue, chroma / 3);
|
|
72
|
+
this.a3 = TonalPalette.fromHueAndChroma(hue + 60, chroma / 2);
|
|
73
|
+
this.n1 = TonalPalette.fromHueAndChroma(hue, Math.min(chroma / 12, 4));
|
|
74
|
+
this.n2 = TonalPalette.fromHueAndChroma(hue, Math.min(chroma / 6, 8));
|
|
75
|
+
} else {
|
|
76
|
+
this.a1 = TonalPalette.fromHueAndChroma(hue, Math.max(48, chroma));
|
|
77
|
+
this.a2 = TonalPalette.fromHueAndChroma(hue, 16);
|
|
78
|
+
this.a3 = TonalPalette.fromHueAndChroma(hue + 60, 24);
|
|
79
|
+
this.n1 = TonalPalette.fromHueAndChroma(hue, 4);
|
|
80
|
+
this.n2 = TonalPalette.fromHueAndChroma(hue, 8);
|
|
81
|
+
}
|
|
82
|
+
this.error = TonalPalette.fromHueAndChroma(25, 84);
|
|
83
|
+
}
|
|
84
|
+
}
|
package/utils/hct/Hct.js
ADDED
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2021 Google LLC
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* A color system built using CAM16 hue and chroma, and L* from
|
|
20
|
+
* L*a*b*.
|
|
21
|
+
*
|
|
22
|
+
* Using L* creates a link between the color system, contrast, and thus
|
|
23
|
+
* accessibility. Contrast ratio depends on relative luminance, or Y in the XYZ
|
|
24
|
+
* color space. L*, or perceptual luminance can be calculated from Y.
|
|
25
|
+
*
|
|
26
|
+
* Unlike Y, L* is linear to human perception, allowing trivial creation of
|
|
27
|
+
* accurate color tones.
|
|
28
|
+
*
|
|
29
|
+
* Unlike contrast ratio, measuring contrast in L* is linear, and simple to
|
|
30
|
+
* calculate. A difference of 40 in HCT tone guarantees a contrast ratio >= 3.0,
|
|
31
|
+
* and a difference of 50 guarantees a contrast ratio >= 4.5.
|
|
32
|
+
*/
|
|
33
|
+
|
|
34
|
+
import Cam16 from './Cam16.js';
|
|
35
|
+
import * as utils from './colorUtils.js';
|
|
36
|
+
import * as hctSolver from './hctSolver.js';
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* HCT, hue, chroma, and tone. A color system that provides a perceptually
|
|
40
|
+
* accurate color measurement system that can also accurately render what colors
|
|
41
|
+
* will appear as in different lighting environments.
|
|
42
|
+
*/
|
|
43
|
+
export default class Hct {
|
|
44
|
+
/**
|
|
45
|
+
* @param hue 0 <= hue < 360; invalid values are corrected.
|
|
46
|
+
* @param chroma 0 <= chroma < ?; Informally, colorfulness. The color
|
|
47
|
+
* returned may be lower than the requested chroma. Chroma has a different
|
|
48
|
+
* maximum for any given hue and tone.
|
|
49
|
+
* @param tone 0 <= tone <= 100; invalid values are corrected.
|
|
50
|
+
* @return HCT representation of a color in default viewing conditions.
|
|
51
|
+
*/
|
|
52
|
+
|
|
53
|
+
/** @type {number} */
|
|
54
|
+
internalHue;
|
|
55
|
+
|
|
56
|
+
/** @type {number} */
|
|
57
|
+
internalChroma;
|
|
58
|
+
|
|
59
|
+
/** @type {number} */
|
|
60
|
+
internalTone;
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* @param {number} hue
|
|
64
|
+
* @param {number} chroma
|
|
65
|
+
* @param {number} tone
|
|
66
|
+
* @return {Hct}
|
|
67
|
+
*/
|
|
68
|
+
static from(hue, chroma, tone) {
|
|
69
|
+
return new Hct(hctSolver.solveToInt(hue, chroma, tone));
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* @param {number} argb ARGB representation of a color.
|
|
74
|
+
* @return {Hct} HCT representation of a color in default viewing conditions
|
|
75
|
+
*/
|
|
76
|
+
static fromInt(argb) {
|
|
77
|
+
return new Hct(argb);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/** @return {number} */
|
|
81
|
+
toInt() {
|
|
82
|
+
return this.argb;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* A number, in degrees, representing ex. red, orange, yellow, etc.
|
|
87
|
+
* Ranges from 0 <= hue < 360.
|
|
88
|
+
* @return {number}
|
|
89
|
+
*/
|
|
90
|
+
get hue() {
|
|
91
|
+
return this.internalHue;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* @param {number} newHue 0 <= newHue < 360; invalid values are corrected.
|
|
96
|
+
* Chroma may decrease because chroma has a different maximum for any given
|
|
97
|
+
* hue and tone.
|
|
98
|
+
*/
|
|
99
|
+
set hue(newHue) {
|
|
100
|
+
this.setInternalState(
|
|
101
|
+
hctSolver.solveToInt(
|
|
102
|
+
newHue,
|
|
103
|
+
this.internalChroma,
|
|
104
|
+
this.internalTone,
|
|
105
|
+
),
|
|
106
|
+
);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/** @return {number} */
|
|
110
|
+
get chroma() {
|
|
111
|
+
return this.internalChroma;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* @param {number} newChroma 0 <= newChroma < ?
|
|
116
|
+
* Chroma may decrease because chroma has a different maximum for any given
|
|
117
|
+
* hue and tone.
|
|
118
|
+
*/
|
|
119
|
+
set chroma(newChroma) {
|
|
120
|
+
this.setInternalState(
|
|
121
|
+
hctSolver.solveToInt(
|
|
122
|
+
this.internalHue,
|
|
123
|
+
newChroma,
|
|
124
|
+
this.internalTone,
|
|
125
|
+
),
|
|
126
|
+
);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Lightness. Ranges from 0 to 100.
|
|
131
|
+
* @return {number}
|
|
132
|
+
*/
|
|
133
|
+
get tone() {
|
|
134
|
+
return this.internalTone;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* @param {number} newTone 0 <= newTone <= 100; invalid valids are corrected.
|
|
139
|
+
* Chroma may decrease because chroma has a different maximum for any given
|
|
140
|
+
* hue and tone.
|
|
141
|
+
*/
|
|
142
|
+
set tone(newTone) {
|
|
143
|
+
this.setInternalState(
|
|
144
|
+
hctSolver.solveToInt(
|
|
145
|
+
this.internalHue,
|
|
146
|
+
this.internalChroma,
|
|
147
|
+
newTone,
|
|
148
|
+
),
|
|
149
|
+
);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/** @param {number} argb */
|
|
153
|
+
constructor(argb) {
|
|
154
|
+
const cam = Cam16.fromInt(argb);
|
|
155
|
+
this.internalHue = cam.hue;
|
|
156
|
+
this.internalChroma = cam.chroma;
|
|
157
|
+
this.internalTone = utils.lstarFromArgb(argb);
|
|
158
|
+
this.argb = argb;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* @private
|
|
163
|
+
* @param {number} argb
|
|
164
|
+
*/
|
|
165
|
+
setInternalState(argb) {
|
|
166
|
+
const cam = Cam16.fromInt(argb);
|
|
167
|
+
this.internalHue = cam.hue;
|
|
168
|
+
this.internalChroma = cam.chroma;
|
|
169
|
+
this.internalTone = utils.lstarFromArgb(argb);
|
|
170
|
+
this.argb = argb;
|
|
171
|
+
}
|
|
172
|
+
}
|