@shortfuse/materialdesignweb 0.5.0 → 0.7.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.
Files changed (418) hide show
  1. package/README.md +155 -77
  2. package/bin/generate-css.js +12 -0
  3. package/components/Badge.css +30 -0
  4. package/components/Badge.js +15 -0
  5. package/components/Body.css +14 -0
  6. package/components/Body.js +7 -0
  7. package/components/BottomAppBar.css +23 -0
  8. package/components/BottomAppBar.js +25 -0
  9. package/components/Box.css +31 -0
  10. package/components/Box.js +24 -0
  11. package/components/Button.css +146 -0
  12. package/components/Button.js +95 -0
  13. package/components/Button.md +61 -0
  14. package/components/Card.css +109 -0
  15. package/components/Card.js +82 -0
  16. package/components/Checkbox.css +77 -0
  17. package/components/Checkbox.js +59 -0
  18. package/components/CheckboxIcon.css +89 -0
  19. package/components/CheckboxIcon.js +41 -0
  20. package/components/Chip.css +35 -0
  21. package/components/Chip.js +22 -0
  22. package/components/Dialog.css +235 -0
  23. package/components/Dialog.js +327 -0
  24. package/components/DialogActions.js +13 -0
  25. package/components/Divider.css +41 -0
  26. package/components/Divider.js +13 -0
  27. package/components/ExtendedFab.css +24 -0
  28. package/components/ExtendedFab.js +11 -0
  29. package/components/Fab.css +23 -0
  30. package/components/Fab.js +26 -0
  31. package/components/FilterChip.css +80 -0
  32. package/components/FilterChip.js +51 -0
  33. package/components/Headline.css +14 -0
  34. package/components/Headline.js +33 -0
  35. package/components/Icon.css +76 -0
  36. package/components/Icon.js +174 -0
  37. package/components/IconButton.css +151 -0
  38. package/components/IconButton.js +65 -0
  39. package/components/Input.js +16 -0
  40. package/components/Label.css +14 -0
  41. package/components/Label.js +7 -0
  42. package/components/Layout.css +19 -0
  43. package/components/Layout.js +12 -0
  44. package/components/List.css +12 -0
  45. package/components/List.js +17 -0
  46. package/components/ListItem.css +224 -0
  47. package/components/ListItem.js +112 -0
  48. package/components/ListOption.css +34 -0
  49. package/components/ListOption.js +122 -0
  50. package/components/ListSelect.css +9 -0
  51. package/components/ListSelect.js +206 -0
  52. package/components/Menu.css +171 -0
  53. package/components/Menu.js +470 -0
  54. package/components/MenuItem.css +53 -0
  55. package/components/MenuItem.js +215 -0
  56. package/components/Nav.css +17 -0
  57. package/components/Nav.js +23 -0
  58. package/components/NavBar.css +34 -0
  59. package/components/NavBar.js +88 -0
  60. package/components/NavBarItem.css +41 -0
  61. package/components/NavBarItem.js +7 -0
  62. package/components/NavDrawer.css +31 -0
  63. package/components/NavDrawer.js +13 -0
  64. package/components/NavDrawerItem.css +42 -0
  65. package/components/NavDrawerItem.js +12 -0
  66. package/components/NavItem.css +181 -0
  67. package/components/NavItem.js +83 -0
  68. package/components/NavRail.css +47 -0
  69. package/components/NavRail.js +17 -0
  70. package/components/NavRailItem.css +25 -0
  71. package/components/NavRailItem.js +7 -0
  72. package/components/Option.js +91 -0
  73. package/components/Outline.css +138 -0
  74. package/components/Pane.css +261 -0
  75. package/components/Pane.js +21 -0
  76. package/components/Progress.css +74 -0
  77. package/components/Progress.js +67 -0
  78. package/components/ProgressCircle.css +226 -0
  79. package/components/ProgressLine.css +155 -0
  80. package/components/Radio.css +83 -0
  81. package/components/Radio.js +42 -0
  82. package/components/RadioIcon.css +73 -0
  83. package/components/RadioIcon.js +37 -0
  84. package/components/Ripple.css +74 -0
  85. package/components/Ripple.js +114 -0
  86. package/components/SegmentedButton.css +94 -0
  87. package/components/SegmentedButton.js +49 -0
  88. package/components/SegmentedButtonGroup.css +12 -0
  89. package/components/SegmentedButtonGroup.js +44 -0
  90. package/components/Select.css +52 -0
  91. package/components/Select.js +71 -0
  92. package/components/Shape.css +132 -0
  93. package/components/Shape.js +25 -0
  94. package/components/Slider.css +306 -0
  95. package/components/Slider.js +206 -0
  96. package/components/Snackbar.css +80 -0
  97. package/components/Snackbar.js +75 -0
  98. package/components/Surface.css +10 -0
  99. package/components/Surface.js +23 -0
  100. package/components/Switch.css +63 -0
  101. package/components/Switch.js +127 -0
  102. package/components/SwitchIcon.css +177 -0
  103. package/components/SwitchIcon.js +89 -0
  104. package/components/SwitchIconAnimations.css +89 -0
  105. package/components/Tab.css +85 -0
  106. package/components/Tab.js +103 -0
  107. package/components/TabContent.js +151 -0
  108. package/components/TabList.css +129 -0
  109. package/components/TabList.js +309 -0
  110. package/components/TabPanel.js +37 -0
  111. package/components/TextArea.css +93 -0
  112. package/components/TextArea.js +229 -0
  113. package/components/Title.css +14 -0
  114. package/components/Title.js +15 -0
  115. package/components/Tooltip.css +40 -0
  116. package/components/Tooltip.js +22 -0
  117. package/components/TopAppBar.css +209 -0
  118. package/components/TopAppBar.js +201 -0
  119. package/core/Composition.js +988 -0
  120. package/core/CustomElement.js +844 -0
  121. package/core/ICustomElement.d.ts +288 -0
  122. package/core/ICustomElement.js +1 -0
  123. package/core/css.js +51 -0
  124. package/core/customTypes.js +125 -0
  125. package/core/dom.js +56 -154
  126. package/core/identify.js +40 -0
  127. package/core/observe.js +410 -0
  128. package/core/template.js +121 -0
  129. package/core/typings.d.ts +135 -0
  130. package/core/typings.js +1 -0
  131. package/mixins/AriaReflectorMixin.js +42 -0
  132. package/mixins/AriaToolbarMixin.js +13 -0
  133. package/mixins/ControlMixin.css +57 -0
  134. package/mixins/ControlMixin.js +212 -0
  135. package/mixins/DensityMixin.css +40 -0
  136. package/mixins/DensityMixin.js +11 -0
  137. package/mixins/FlexableMixin.css +79 -0
  138. package/mixins/FlexableMixin.js +32 -0
  139. package/mixins/FormAssociatedMixin.js +170 -0
  140. package/mixins/InputMixin.js +335 -0
  141. package/mixins/KeyboardNavMixin.js +244 -0
  142. package/mixins/RTLObserverMixin.js +35 -0
  143. package/mixins/ResizeObserverMixin.js +38 -0
  144. package/mixins/RippleMixin.css +12 -0
  145. package/mixins/RippleMixin.js +115 -0
  146. package/mixins/ScrollListenerMixin.js +100 -0
  147. package/mixins/ShapeMixin.css +135 -0
  148. package/mixins/ShapeMixin.js +31 -0
  149. package/mixins/StateMixin.css +82 -0
  150. package/mixins/StateMixin.js +114 -0
  151. package/mixins/SurfaceMixin.css +150 -0
  152. package/mixins/SurfaceMixin.js +32 -0
  153. package/mixins/TextFieldMixin.css +657 -0
  154. package/mixins/TextFieldMixin.js +121 -0
  155. package/mixins/ThemableMixin.css +204 -0
  156. package/mixins/ThemableMixin.js +16 -0
  157. package/mixins/TooltipTriggerMixin.css +27 -0
  158. package/mixins/TooltipTriggerMixin.js +366 -0
  159. package/mixins/TouchTargetMixin.css +26 -0
  160. package/mixins/TouchTargetMixin.js +9 -0
  161. package/package.json +54 -49
  162. package/theming/index.js +594 -0
  163. package/theming/loader.js +24 -0
  164. package/utils/cli.js +11 -0
  165. package/utils/color_keywords.js +151 -0
  166. package/utils/hct/Cam16.js +298 -0
  167. package/utils/hct/CorePalette.js +84 -0
  168. package/utils/hct/Hct.js +172 -0
  169. package/utils/hct/Scheme.js +587 -0
  170. package/utils/hct/TonalPalette.js +68 -0
  171. package/utils/hct/ViewingConditions.js +136 -0
  172. package/utils/hct/blend.js +93 -0
  173. package/utils/hct/colorUtils.js +302 -0
  174. package/utils/hct/hctSolver.js +559 -0
  175. package/utils/hct/helper.js +182 -0
  176. package/utils/hct/mathUtils.js +153 -0
  177. package/utils/jsonMergePatch.js +100 -0
  178. package/utils/jsx-runtime.js +101 -0
  179. package/utils/popup.js +117 -0
  180. package/utils/svg.js +129 -0
  181. package/.browserslistrc +0 -4
  182. package/.eslintrc.json +0 -204
  183. package/.stylelintrc.json +0 -645
  184. package/.vscode/launch.json +0 -31
  185. package/.vscode/settings.json +0 -3
  186. package/.vscode/tasks.json +0 -32
  187. package/CHANGELOG.md +0 -36
  188. package/CODE_OF_CONDUCT.md +0 -46
  189. package/adapters/datatable/column.js +0 -176
  190. package/adapters/datatable/index.js +0 -960
  191. package/adapters/dom/index.js +0 -586
  192. package/adapters/list/index.js +0 -69
  193. package/adapters/search/index.js +0 -495
  194. package/components/appbar/_spec.scss +0 -165
  195. package/components/appbar/_theme.scss +0 -0
  196. package/components/appbar/index.scss +0 -2
  197. package/components/banner/_spec.scss +0 -83
  198. package/components/banner/_theme.scss +0 -0
  199. package/components/banner/index.scss +0 -2
  200. package/components/bottomnav/README.md +0 -85
  201. package/components/bottomnav/_spec.scss +0 -149
  202. package/components/bottomnav/_theme.scss +0 -0
  203. package/components/bottomnav/index.js +0 -117
  204. package/components/bottomnav/index.scss +0 -2
  205. package/components/bottomnav/item.js +0 -88
  206. package/components/button/README.md +0 -61
  207. package/components/button/_spec.scss +0 -162
  208. package/components/button/_theme.scss +0 -42
  209. package/components/button/index.eta +0 -32
  210. package/components/button/index.js +0 -43
  211. package/components/button/index.pug +0 -18
  212. package/components/button/index.scss +0 -2
  213. package/components/card/_spec.scss +0 -241
  214. package/components/card/_theme.scss +0 -0
  215. package/components/card/index.scss +0 -2
  216. package/components/chip/_spec.scss +0 -111
  217. package/components/chip/_theme.scss +0 -105
  218. package/components/chip/index.js +0 -23
  219. package/components/chip/index.scss +0 -2
  220. package/components/chip/item.js +0 -20
  221. package/components/datatable/_spec.scss +0 -225
  222. package/components/datatable/_theme.scss +0 -128
  223. package/components/datatable/cell.js +0 -44
  224. package/components/datatable/columnheader.js +0 -46
  225. package/components/datatable/index.js +0 -374
  226. package/components/datatable/index.scss +0 -2
  227. package/components/datatable/row.js +0 -48
  228. package/components/datatable/rowheader.js +0 -18
  229. package/components/dialog/_spec.scss +0 -203
  230. package/components/dialog/_theme.scss +0 -7
  231. package/components/dialog/index.js +0 -601
  232. package/components/dialog/index.scss +0 -2
  233. package/components/divider/_spec.scss +0 -11
  234. package/components/divider/_theme.scss +0 -0
  235. package/components/divider/index.scss +0 -2
  236. package/components/elevation/_spec.scss +0 -9
  237. package/components/elevation/_theme.scss +0 -0
  238. package/components/elevation/index.scss +0 -2
  239. package/components/fab/_spec.scss +0 -210
  240. package/components/fab/_theme.scss +0 -0
  241. package/components/fab/index.js +0 -99
  242. package/components/fab/index.scss +0 -2
  243. package/components/grid/_spec.scss +0 -169
  244. package/components/grid/_theme.scss +0 -0
  245. package/components/grid/index.scss +0 -2
  246. package/components/layout/_mixins.scss +0 -11
  247. package/components/layout/_spec.scss +0 -916
  248. package/components/layout/_theme.scss +0 -19
  249. package/components/layout/index.js +0 -454
  250. package/components/layout/index.scss +0 -2
  251. package/components/list/_spec.scss +0 -363
  252. package/components/list/_theme.scss +0 -102
  253. package/components/list/content.js +0 -106
  254. package/components/list/index.js +0 -256
  255. package/components/list/index.scss +0 -2
  256. package/components/list/item.js +0 -167
  257. package/components/list/secondary.js +0 -45
  258. package/components/menu/_spec.scss +0 -329
  259. package/components/menu/_theme.scss +0 -0
  260. package/components/menu/index.js +0 -705
  261. package/components/menu/index.scss +0 -2
  262. package/components/menu/item.js +0 -231
  263. package/components/progress/_spec.scss +0 -156
  264. package/components/progress/_theme.scss +0 -0
  265. package/components/progress/index.js +0 -36
  266. package/components/progress/index.scss +0 -2
  267. package/components/selection/_spec.scss +0 -376
  268. package/components/selection/_theme.scss +0 -134
  269. package/components/selection/index.eta +0 -60
  270. package/components/selection/index.js +0 -70
  271. package/components/selection/index.pug +0 -30
  272. package/components/selection/index.scss +0 -2
  273. package/components/selection/input.js +0 -54
  274. package/components/selection/radiogroup.js +0 -40
  275. package/components/slider/_spec.scss +0 -59
  276. package/components/slider/_theme.scss +0 -0
  277. package/components/slider/index.scss +0 -2
  278. package/components/snackbar/_spec.scss +0 -150
  279. package/components/snackbar/_theme.scss +0 -0
  280. package/components/snackbar/index.js +0 -338
  281. package/components/snackbar/index.scss +0 -2
  282. package/components/tab/_spec.scss +0 -220
  283. package/components/tab/_theme.scss +0 -0
  284. package/components/tab/content.js +0 -210
  285. package/components/tab/index.js +0 -257
  286. package/components/tab/index.scss +0 -2
  287. package/components/tab/item.js +0 -88
  288. package/components/tab/list.js +0 -196
  289. package/components/tab/panel.js +0 -54
  290. package/components/textfield/README.md +0 -179
  291. package/components/textfield/_spec.scss +0 -763
  292. package/components/textfield/_theme.scss +0 -264
  293. package/components/textfield/index.eta +0 -74
  294. package/components/textfield/index.js +0 -160
  295. package/components/textfield/index.pug +0 -30
  296. package/components/textfield/index.scss +0 -2
  297. package/components/tooltip/_spec.scss +0 -185
  298. package/components/tooltip/_theme.scss +0 -0
  299. package/components/tooltip/index.scss +0 -2
  300. package/components/type/_spec.scss +0 -227
  301. package/components/type/_theme.scss +0 -0
  302. package/components/type/index.scss +0 -2
  303. package/core/_breakpoint.scss +0 -189
  304. package/core/_elevation.scss +0 -78
  305. package/core/_length.scss +0 -8
  306. package/core/_motion.scss +0 -31
  307. package/core/_platform.scss +0 -12
  308. package/core/_type.scss +0 -128
  309. package/core/aria/attributes.js +0 -141
  310. package/core/aria/button.js +0 -49
  311. package/core/aria/keyboard.js +0 -92
  312. package/core/aria/rovingtabindex.js +0 -175
  313. package/core/aria/tab.js +0 -59
  314. package/core/document/index.js +0 -39
  315. package/core/overlay/_spec.scss +0 -28
  316. package/core/overlay/_theme.scss +0 -147
  317. package/core/overlay/index.js +0 -95
  318. package/core/overlay/index.scss +0 -2
  319. package/core/ripple/_spec.scss +0 -196
  320. package/core/ripple/_theme.scss +0 -20
  321. package/core/ripple/index.js +0 -286
  322. package/core/ripple/index.scss +0 -2
  323. package/core/theme/_aliases.scss +0 -15
  324. package/core/theme/_config.scss +0 -8
  325. package/core/theme/_functions.scss +0 -22
  326. package/core/theme/_palettes.scss +0 -405
  327. package/core/theme/_spec.scss +0 -0
  328. package/core/theme/_theme.scss +0 -268
  329. package/core/theme/index.js +0 -50
  330. package/core/theme/index.scss +0 -4
  331. package/core/throttler.js +0 -42
  332. package/core/transition/index.js +0 -465
  333. package/docs/_flex.scss +0 -28
  334. package/docs/_menuoptions.js +0 -183
  335. package/docs/_partials/_androidnavbar.eta +0 -5
  336. package/docs/_partials/_androidstatusbar.eta +0 -13
  337. package/docs/_partials/_appbar.eta +0 -27
  338. package/docs/_partials/_buttontest.eta +0 -31
  339. package/docs/_partials/_header.eta +0 -146
  340. package/docs/_partials/_navlistitem.eta +0 -16
  341. package/docs/_partials/_target.eta +0 -1
  342. package/docs/_sample-utils.js +0 -88
  343. package/docs/_storage.js +0 -33
  344. package/docs/docs.scss +0 -331
  345. package/docs/framework.scss +0 -26
  346. package/docs/index.eta +0 -12
  347. package/docs/index.js +0 -7
  348. package/docs/pages/appbar.eta +0 -108
  349. package/docs/pages/appbar.js +0 -0
  350. package/docs/pages/bottomnav.eta +0 -188
  351. package/docs/pages/bottomnav.js +0 -118
  352. package/docs/pages/button.eta +0 -124
  353. package/docs/pages/button.js +0 -224
  354. package/docs/pages/card.eta +0 -90
  355. package/docs/pages/card.js +0 -175
  356. package/docs/pages/chip.eta +0 -122
  357. package/docs/pages/chip.js +0 -80
  358. package/docs/pages/color.eta +0 -143
  359. package/docs/pages/color.js +0 -261
  360. package/docs/pages/datatable.eta +0 -323
  361. package/docs/pages/datatable.js +0 -160
  362. package/docs/pages/dialog.eta +0 -184
  363. package/docs/pages/dialog.js +0 -174
  364. package/docs/pages/dom.eta +0 -26
  365. package/docs/pages/dom.js +0 -140
  366. package/docs/pages/elevation.eta +0 -35
  367. package/docs/pages/elevation.js +0 -0
  368. package/docs/pages/fab.eta +0 -99
  369. package/docs/pages/fab.js +0 -43
  370. package/docs/pages/grid.eta +0 -135
  371. package/docs/pages/grid.js +0 -128
  372. package/docs/pages/layout.eta +0 -8
  373. package/docs/pages/layout.js +0 -0
  374. package/docs/pages/list.eta +0 -465
  375. package/docs/pages/list.js +0 -8
  376. package/docs/pages/menu.eta +0 -274
  377. package/docs/pages/menu.js +0 -213
  378. package/docs/pages/overlay.eta +0 -69
  379. package/docs/pages/overlay.js +0 -3
  380. package/docs/pages/progress.eta +0 -23
  381. package/docs/pages/progress.js +0 -12
  382. package/docs/pages/ripple.eta +0 -27
  383. package/docs/pages/ripple.js +0 -3
  384. package/docs/pages/search.eta +0 -242
  385. package/docs/pages/search.js +0 -226
  386. package/docs/pages/selection.eta +0 -107
  387. package/docs/pages/selection.js +0 -12
  388. package/docs/pages/slider.eta +0 -23
  389. package/docs/pages/slider.js +0 -0
  390. package/docs/pages/snackbar.eta +0 -83
  391. package/docs/pages/snackbar.js +0 -157
  392. package/docs/pages/tab.eta +0 -407
  393. package/docs/pages/tab.js +0 -152
  394. package/docs/pages/textfield.eta +0 -487
  395. package/docs/pages/textfield.js +0 -257
  396. package/docs/pages/tooltip.eta +0 -92
  397. package/docs/pages/tooltip.js +0 -0
  398. package/docs/pages/transition.eta +0 -117
  399. package/docs/pages/transition.js +0 -52
  400. package/docs/pages/type.eta +0 -31
  401. package/docs/pages/type.js +0 -0
  402. package/docs/postrender.js +0 -41
  403. package/docs/prerender.js +0 -16
  404. package/docs/pwa/_dialogs.eta +0 -143
  405. package/docs/pwa/_menus.eta +0 -16
  406. package/docs/pwa/pwa-prerender.js +0 -3
  407. package/docs/pwa/pwa.eta +0 -478
  408. package/docs/pwa/pwa.js +0 -298
  409. package/docs/pwa/pwa.scss +0 -31
  410. package/docs/themes/theme-colored.scss +0 -15
  411. package/docs/themes/theme-default.scss +0 -3
  412. package/index.scss +0 -27
  413. package/jsconfig.json +0 -16
  414. package/scripts/deploy-docs.sh +0 -9
  415. package/templates/index.eta +0 -2
  416. package/templates/index.pug +0 -3
  417. package/tsconfig.json +0 -16
  418. package/webpack.config.js +0 -304
@@ -0,0 +1,151 @@
1
+ // https://developer.mozilla.org/en-US/docs/Web/CSS/color_value/color_keywords
2
+ export const COLOR_KEYWORDS = new Map([
3
+ ['black', '#000000'],
4
+ ['silver', '#c0c0c0'],
5
+ ['gray', '#808080'],
6
+ ['white', '#ffffff'],
7
+ ['maroon', '#800000'],
8
+ ['red', '#ff0000'],
9
+ ['purple', '#800080'],
10
+ ['fuchsia', '#ff00ff'],
11
+ ['green', '#008000'],
12
+ ['lime', '#00ff00'],
13
+ ['olive', '#808000'],
14
+ ['yellow', '#ffff00'],
15
+ ['navy', '#000080'],
16
+ ['blue', '#0000ff'],
17
+ ['teal', '#008080'],
18
+ ['aqua', '#00ffff'],
19
+ ['orange', '#ffa500'],
20
+ ['aliceblue', '#f0f8ff'],
21
+ ['antiquewhite', '#faebd7'],
22
+ ['aquamarine', '#7fffd4'],
23
+ ['azure', '#f0ffff'],
24
+ ['beige', '#f5f5dc'],
25
+ ['bisque', '#ffe4c4'],
26
+ ['blanchedalmond', '#ffebcd'],
27
+ ['blueviolet', '#8a2be2'],
28
+ ['brown', '#a52a2a'],
29
+ ['burlywood', '#deb887'],
30
+ ['cadetblue', '#5f9ea0'],
31
+ ['chartreuse', '#7fff00'],
32
+ ['chocolate', '#d2691e'],
33
+ ['coral', '#ff7f50'],
34
+ ['cornflowerblue', '#6495ed'],
35
+ ['cornsilk', '#fff8dc'],
36
+ ['crimson', '#dc143c'],
37
+ ['cyan', '00ffff'],
38
+ ['darkblue', '#00008b'],
39
+ ['darkcyan', '#008b8b'],
40
+ ['darkgoldenrod', '#b8860b'],
41
+ ['darkgray', '#a9a9a9'],
42
+ ['darkgreen', '#006400'],
43
+ ['darkgrey', '#a9a9a9'],
44
+ ['darkkhaki', '#bdb76b'],
45
+ ['darkmagenta', '#8b008b'],
46
+ ['darkolivegreen', '#556b2f'],
47
+ ['darkorange', '#ff8c00'],
48
+ ['darkorchid', '#9932cc'],
49
+ ['darkred', '#8b0000'],
50
+ ['darksalmon', '#e9967a'],
51
+ ['darkseagreen', '#8fbc8f'],
52
+ ['darkslateblue', '#483d8b'],
53
+ ['darkslategray', '#2f4f4f'],
54
+ ['darkslategrey', '#2f4f4f'],
55
+ ['darkturquoise', '#00ced1'],
56
+ ['darkviolet', '#9400d3'],
57
+ ['deeppink', '#ff1493'],
58
+ ['deepskyblue', '#00bfff'],
59
+ ['dimgray', '#696969'],
60
+ ['dimgrey', '#696969'],
61
+ ['dodgerblue', '#1e90ff'],
62
+ ['firebrick', '#b22222'],
63
+ ['floralwhite', '#fffaf0'],
64
+ ['forestgreen', '#228b22'],
65
+ ['gainsboro', '#dcdcdc'],
66
+ ['ghostwhite', '#f8f8ff'],
67
+ ['gold', '#ffd700'],
68
+ ['goldenrod', '#daa520'],
69
+ ['greenyellow', '#adff2f'],
70
+ ['grey', '#808080'],
71
+ ['honeydew', '#f0fff0'],
72
+ ['hotpink', '#ff69b4'],
73
+ ['indianred', '#cd5c5c'],
74
+ ['indigo', '#4b0082'],
75
+ ['ivory', '#fffff0'],
76
+ ['khaki', '#f0e68c'],
77
+ ['lavender', '#e6e6fa'],
78
+ ['lavenderblush', '#fff0f5'],
79
+ ['lawngreen', '#7cfc00'],
80
+ ['lemonchiffon', '#fffacd'],
81
+ ['lightblue', '#add8e6'],
82
+ ['lightcoral', '#f08080'],
83
+ ['lightcyan', '#e0ffff'],
84
+ ['lightgoldenrodyellow', '#fafad2'],
85
+ ['lightgray', '#d3d3d3'],
86
+ ['lightgreen', '#90ee90'],
87
+ ['lightgrey', '#d3d3d3'],
88
+ ['lightpink', '#ffb6c1'],
89
+ ['lightsalmon', '#ffa07a'],
90
+ ['lightseagreen', '#20b2aa'],
91
+ ['lightskyblue', '#87cefa'],
92
+ ['lightslategray', '#778899'],
93
+ ['lightslategrey', '#778899'],
94
+ ['lightsteelblue', '#b0c4de'],
95
+ ['lightyellow', '#ffffe0'],
96
+ ['limegreen', '#32cd32'],
97
+ ['linen', '#faf0e6'],
98
+ ['magenta', '#ff00ff'],
99
+ ['mediumaquamarine', '#66cdaa'],
100
+ ['mediumblue', '#0000cd'],
101
+ ['mediumorchid', '#ba55d3'],
102
+ ['mediumpurple', '#9370db'],
103
+ ['mediumseagreen', '#3cb371'],
104
+ ['mediumslateblue', '#7b68ee'],
105
+ ['mediumspringgreen', '#00fa9a'],
106
+ ['mediumturquoise', '#48d1cc'],
107
+ ['mediumvioletred', '#c71585'],
108
+ ['midnightblue', '#191970'],
109
+ ['mintcream', '#f5fffa'],
110
+ ['mistyrose', '#ffe4e1'],
111
+ ['moccasin', '#ffe4b5'],
112
+ ['navajowhite', '#ffdead'],
113
+ ['oldlace', '#fdf5e6'],
114
+ ['olivedrab', '#6b8e23'],
115
+ ['orangered', '#ff4500'],
116
+ ['orchid', '#da70d6'],
117
+ ['palegoldenrod', '#eee8aa'],
118
+ ['palegreen', '#98fb98'],
119
+ ['paleturquoise', '#afeeee'],
120
+ ['palevioletred', '#db7093'],
121
+ ['papayawhip', '#ffefd5'],
122
+ ['peachpuff', '#ffdab9'],
123
+ ['peru', '#cd853f'],
124
+ ['pink', '#ffc0cb'],
125
+ ['plum', '#dda0dd'],
126
+ ['powderblue', '#b0e0e6'],
127
+ ['rosybrown', '#bc8f8f'],
128
+ ['royalblue', '#4169e1'],
129
+ ['saddlebrown', '#8b4513'],
130
+ ['salmon', '#fa8072'],
131
+ ['sandybrown', '#f4a460'],
132
+ ['seagreen', '#2e8b57'],
133
+ ['seashell', '#fff5ee'],
134
+ ['sienna', '#a0522d'],
135
+ ['skyblue', '#87ceeb'],
136
+ ['slateblue', '#6a5acd'],
137
+ ['slategray', '#708090'],
138
+ ['slategrey', '#708090'],
139
+ ['snow', '#fffafa'],
140
+ ['springgreen', '#00ff7f'],
141
+ ['steelblue', '#4682b4'],
142
+ ['tan', '#d2b48c'],
143
+ ['thistle', '#d8bfd8'],
144
+ ['tomato', '#ff6347'],
145
+ ['turquoise', '#40e0d0'],
146
+ ['violet', '#ee82ee'],
147
+ ['wheat', '#f5deb3'],
148
+ ['whitesmoke', '#f5f5f5'],
149
+ ['yellowgreen', '#9acd32'],
150
+ ['rebeccapurple', '#663399'],
151
+ ]);
@@ -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
+ }
@@ -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
+ }