@shortfuse/materialdesignweb 0.4.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 (452) hide show
  1. package/README.md +155 -79
  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 -245
  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 +57 -41
  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 -3
  182. package/.eslintrc.json +0 -153
  183. package/.stylelintrc.json +0 -600
  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 -24
  188. package/CODE_OF_CONDUCT.md +0 -46
  189. package/adapters/datatable/column.js +0 -203
  190. package/adapters/datatable/index.js +0 -972
  191. package/adapters/dom/index.js +0 -601
  192. package/adapters/list/index.js +0 -69
  193. package/adapters/search/index.js +0 -521
  194. package/components/appbar/_spec.scss +0 -225
  195. package/components/appbar/_theme.scss +0 -0
  196. package/components/appbar/index.scss +0 -2
  197. package/components/banner/_spec.scss +0 -118
  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 -157
  202. package/components/bottomnav/_theme.scss +0 -0
  203. package/components/bottomnav/index.js +0 -122
  204. package/components/bottomnav/index.scss +0 -2
  205. package/components/bottomnav/item.js +0 -89
  206. package/components/button/README.md +0 -61
  207. package/components/button/_spec.scss +0 -161
  208. package/components/button/_theme.scss +0 -65
  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 -249
  214. package/components/card/_theme.scss +0 -0
  215. package/components/card/index.scss +0 -2
  216. package/components/chip/_spec.scss +0 -134
  217. package/components/chip/_theme.scss +0 -177
  218. package/components/chip/index.js +0 -21
  219. package/components/chip/index.scss +0 -2
  220. package/components/chip/item.js +0 -20
  221. package/components/datatable/_spec.scss +0 -288
  222. package/components/datatable/_theme.scss +0 -154
  223. package/components/datatable/cell.js +0 -45
  224. package/components/datatable/columnheader.js +0 -47
  225. package/components/datatable/index.js +0 -388
  226. package/components/datatable/index.scss +0 -2
  227. package/components/datatable/row.js +0 -49
  228. package/components/datatable/rowheader.js +0 -18
  229. package/components/dialog/_spec.scss +0 -213
  230. package/components/dialog/_theme.scss +0 -0
  231. package/components/dialog/index.js +0 -627
  232. package/components/dialog/index.scss +0 -2
  233. package/components/divider/_spec.scss +0 -13
  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 -222
  240. package/components/fab/_theme.scss +0 -0
  241. package/components/fab/index.js +0 -103
  242. package/components/fab/index.scss +0 -2
  243. package/components/grid/_spec.scss +0 -312
  244. package/components/grid/_theme.scss +0 -0
  245. package/components/grid/index.scss +0 -2
  246. package/components/layout/_mixins.scss +0 -33
  247. package/components/layout/_spec.scss +0 -1012
  248. package/components/layout/_theme.scss +0 -44
  249. package/components/layout/index.js +0 -464
  250. package/components/layout/index.scss +0 -2
  251. package/components/list/_spec.scss +0 -397
  252. package/components/list/_theme.scss +0 -111
  253. package/components/list/content.js +0 -110
  254. package/components/list/index.js +0 -260
  255. package/components/list/index.scss +0 -2
  256. package/components/list/item.js +0 -170
  257. package/components/list/secondary.js +0 -46
  258. package/components/menu/_spec.scss +0 -362
  259. package/components/menu/_theme.scss +0 -0
  260. package/components/menu/index.js +0 -721
  261. package/components/menu/index.scss +0 -2
  262. package/components/menu/item.js +0 -239
  263. package/components/progress/_spec.scss +0 -147
  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 -386
  268. package/components/selection/_theme.scss +0 -166
  269. package/components/selection/index.eta +0 -60
  270. package/components/selection/index.js +0 -76
  271. package/components/selection/index.pug +0 -30
  272. package/components/selection/index.scss +0 -2
  273. package/components/selection/input.js +0 -56
  274. package/components/selection/radiogroup.js +0 -47
  275. package/components/slider/_spec.scss +0 -64
  276. package/components/slider/_theme.scss +0 -0
  277. package/components/slider/index.scss +0 -2
  278. package/components/snackbar/_spec.scss +0 -195
  279. package/components/snackbar/_theme.scss +0 -0
  280. package/components/snackbar/index.js +0 -344
  281. package/components/snackbar/index.scss +0 -2
  282. package/components/tab/_spec.scss +0 -235
  283. package/components/tab/_theme.scss +0 -0
  284. package/components/tab/content.js +0 -205
  285. package/components/tab/index.js +0 -260
  286. package/components/tab/index.scss +0 -2
  287. package/components/tab/item.js +0 -89
  288. package/components/tab/list.js +0 -210
  289. package/components/tab/panel.js +0 -54
  290. package/components/template/_theme.scss +0 -27
  291. package/components/textfield/README.md +0 -179
  292. package/components/textfield/_mixins.scss +0 -52
  293. package/components/textfield/_spec.scss +0 -809
  294. package/components/textfield/_theme.scss +0 -299
  295. package/components/textfield/index.eta +0 -74
  296. package/components/textfield/index.js +0 -168
  297. package/components/textfield/index.pug +0 -30
  298. package/components/textfield/index.scss +0 -2
  299. package/components/tooltip/_spec.scss +0 -188
  300. package/components/tooltip/_theme.scss +0 -0
  301. package/components/tooltip/index.scss +0 -2
  302. package/components/type/_spec.scss +0 -224
  303. package/components/type/_theme.scss +0 -0
  304. package/components/type/index.scss +0 -2
  305. package/core/_breakpoint.scss +0 -189
  306. package/core/_elevation.scss +0 -38
  307. package/core/_length.scss +0 -9
  308. package/core/_motion.scss +0 -31
  309. package/core/_platform.scss +0 -34
  310. package/core/_type.scss +0 -127
  311. package/core/aria/attributes.js +0 -141
  312. package/core/aria/button.js +0 -50
  313. package/core/aria/keyboard.js +0 -93
  314. package/core/aria/rovingtabindex.js +0 -178
  315. package/core/aria/tab.js +0 -60
  316. package/core/color/_spec.scss +0 -0
  317. package/core/color/_theme.scss +0 -390
  318. package/core/color/index.scss +0 -2
  319. package/core/document/index.js +0 -39
  320. package/core/overlay/_spec.scss +0 -31
  321. package/core/overlay/_theme.scss +0 -171
  322. package/core/overlay/index.js +0 -108
  323. package/core/overlay/index.scss +0 -2
  324. package/core/ripple/_spec.scss +0 -197
  325. package/core/ripple/_theme.scss +0 -40
  326. package/core/ripple/index.js +0 -294
  327. package/core/ripple/index.scss +0 -2
  328. package/core/theme/_config.scss +0 -2
  329. package/core/theme/_mixins.scss +0 -172
  330. package/core/theme/_palettes.scss +0 -406
  331. package/core/theme/_variables.scss +0 -24
  332. package/core/theme/index.js +0 -50
  333. package/core/throttler.js +0 -42
  334. package/core/transition/index.js +0 -468
  335. package/docs/_flex.scss +0 -22
  336. package/docs/_menuoptions.js +0 -183
  337. package/docs/_mixins.pug +0 -155
  338. package/docs/_partials/_androidnavbar.eta +0 -5
  339. package/docs/_partials/_androidstatusbar.eta +0 -13
  340. package/docs/_partials/_appbar.eta +0 -29
  341. package/docs/_partials/_buttontest.eta +0 -31
  342. package/docs/_partials/_header.eta +0 -149
  343. package/docs/_partials/_navlistitem.eta +0 -16
  344. package/docs/_partials/_target.eta +0 -1
  345. package/docs/_sample-utils.js +0 -93
  346. package/docs/_storage.js +0 -33
  347. package/docs/docs.scss +0 -295
  348. package/docs/index.eta +0 -16
  349. package/docs/index.js +0 -0
  350. package/docs/pages/appbar.eta +0 -114
  351. package/docs/pages/appbar.js +0 -0
  352. package/docs/pages/appbar.pug +0 -78
  353. package/docs/pages/bottomnav.eta +0 -188
  354. package/docs/pages/bottomnav.js +0 -115
  355. package/docs/pages/bottomnav.pug +0 -137
  356. package/docs/pages/button.eta +0 -124
  357. package/docs/pages/button.js +0 -224
  358. package/docs/pages/button.pug +0 -121
  359. package/docs/pages/card.eta +0 -90
  360. package/docs/pages/card.js +0 -177
  361. package/docs/pages/card.pug +0 -74
  362. package/docs/pages/chip.eta +0 -122
  363. package/docs/pages/chip.js +0 -82
  364. package/docs/pages/chip.pug +0 -91
  365. package/docs/pages/color.eta +0 -143
  366. package/docs/pages/color.js +0 -262
  367. package/docs/pages/color.pug +0 -121
  368. package/docs/pages/datatable.eta +0 -323
  369. package/docs/pages/datatable.js +0 -164
  370. package/docs/pages/datatable.pug +0 -283
  371. package/docs/pages/dialog.eta +0 -186
  372. package/docs/pages/dialog.js +0 -177
  373. package/docs/pages/dialog.pug +0 -132
  374. package/docs/pages/dom.eta +0 -26
  375. package/docs/pages/dom.js +0 -143
  376. package/docs/pages/dom.pug +0 -22
  377. package/docs/pages/elevation.eta +0 -35
  378. package/docs/pages/elevation.js +0 -0
  379. package/docs/pages/elevation.pug +0 -25
  380. package/docs/pages/fab.eta +0 -99
  381. package/docs/pages/fab.js +0 -44
  382. package/docs/pages/fab.pug +0 -66
  383. package/docs/pages/grid.eta +0 -135
  384. package/docs/pages/grid.js +0 -128
  385. package/docs/pages/grid.pug +0 -95
  386. package/docs/pages/layout.eta +0 -8
  387. package/docs/pages/layout.js +0 -0
  388. package/docs/pages/layout.pug +0 -7
  389. package/docs/pages/list.eta +0 -465
  390. package/docs/pages/list.js +0 -9
  391. package/docs/pages/list.pug +0 -326
  392. package/docs/pages/menu.eta +0 -276
  393. package/docs/pages/menu.js +0 -217
  394. package/docs/pages/menu.pug +0 -205
  395. package/docs/pages/overlay.eta +0 -69
  396. package/docs/pages/overlay.js +0 -4
  397. package/docs/pages/overlay.pug +0 -55
  398. package/docs/pages/progress.eta +0 -23
  399. package/docs/pages/progress.js +0 -12
  400. package/docs/pages/progress.pug +0 -16
  401. package/docs/pages/ripple.eta +0 -27
  402. package/docs/pages/ripple.js +0 -4
  403. package/docs/pages/ripple.pug +0 -21
  404. package/docs/pages/search.eta +0 -246
  405. package/docs/pages/search.js +0 -243
  406. package/docs/pages/search.pug +0 -165
  407. package/docs/pages/selection.eta +0 -111
  408. package/docs/pages/selection.js +0 -13
  409. package/docs/pages/selection.pug +0 -74
  410. package/docs/pages/slider.eta +0 -23
  411. package/docs/pages/slider.js +0 -0
  412. package/docs/pages/slider.pug +0 -17
  413. package/docs/pages/snackbar.eta +0 -83
  414. package/docs/pages/snackbar.js +0 -158
  415. package/docs/pages/snackbar.pug +0 -60
  416. package/docs/pages/tab.eta +0 -421
  417. package/docs/pages/tab.js +0 -151
  418. package/docs/pages/tab.pug +0 -304
  419. package/docs/pages/textfield.eta +0 -486
  420. package/docs/pages/textfield.js +0 -254
  421. package/docs/pages/textfield.pug +0 -360
  422. package/docs/pages/tooltip.eta +0 -94
  423. package/docs/pages/tooltip.js +0 -0
  424. package/docs/pages/tooltip.pug +0 -78
  425. package/docs/pages/transition.eta +0 -117
  426. package/docs/pages/transition.js +0 -54
  427. package/docs/pages/transition.pug +0 -76
  428. package/docs/pages/type.eta +0 -31
  429. package/docs/pages/type.js +0 -0
  430. package/docs/pages/type.pug +0 -29
  431. package/docs/postrender.js +0 -39
  432. package/docs/prerender.js +0 -16
  433. package/docs/pwa/_dialogs.eta +0 -143
  434. package/docs/pwa/_dialogs.pug +0 -96
  435. package/docs/pwa/_menus.eta +0 -16
  436. package/docs/pwa/_menus.pug +0 -11
  437. package/docs/pwa/pwa-prerender.js +0 -3
  438. package/docs/pwa/pwa.eta +0 -480
  439. package/docs/pwa/pwa.js +0 -306
  440. package/docs/pwa/pwa.pug +0 -325
  441. package/docs/pwa/pwa.scss +0 -26
  442. package/docs/spec.scss +0 -26
  443. package/docs/themes/_component-themes.scss +0 -26
  444. package/docs/themes/theme-colored-fallbacks.scss +0 -17
  445. package/docs/themes/theme-colored.scss +0 -17
  446. package/docs/themes/theme-default-fallbacks.scss +0 -17
  447. package/docs/themes/theme-default.scss +0 -17
  448. package/jsconfig.json +0 -12
  449. package/scripts/deploy-docs.sh +0 -9
  450. package/templates/index.eta +0 -2
  451. package/templates/index.pug +0 -3
  452. package/webpack.config.cjs +0 -257
@@ -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
+ }