@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,136 @@
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 * as utils from './colorUtils.js';
19
+ import * as math from './mathUtils.js';
20
+
21
+ /**
22
+ * In traditional color spaces, a color can be identified solely by the
23
+ * observer's measurement of the color. Color appearance models such as CAM16
24
+ * also use information about the environment where the color was
25
+ * observed, known as the viewing conditions.
26
+ *
27
+ * For example, white under the traditional assumption of a midday sun white
28
+ * point is accurately measured as a slightly chromatic blue by CAM16. (roughly,
29
+ * hue 203, chroma 3, lightness 100)
30
+ *
31
+ * This class caches intermediate values of the CAM16 conversion process that
32
+ * depend only on viewing conditions, enabling speed ups.
33
+ */
34
+ export default class ViewingConditions {
35
+ /** sRGB-like viewing conditions. */
36
+ static DEFAULT = ViewingConditions.make();
37
+
38
+ /**
39
+ * Create ViewingConditions from a simple, physically relevant, set of
40
+ * parameters.
41
+ * @param whitePoint White point, measured in the XYZ color space.
42
+ * default = D65, or sunny day afternoon
43
+ * @param {number} adaptingLuminance The luminance of the adapting field. Informally,
44
+ * how bright it is in the room where the color is viewed. Can be
45
+ * calculated from lux by multiplying lux by 0.0586. default = 11.72,
46
+ * or 200 lux.
47
+ * @param {number} backgroundLstar The lightness of the area surrounding the color.
48
+ * measured by L* in L*a*b*. default = 50.0
49
+ * @param {number} surround A general description of the lighting surrounding the
50
+ * color. 0 is pitch dark, like watching a movie in a theater. 1.0 is a
51
+ * dimly light room, like watching TV at home at night. 2.0 means there
52
+ * is no difference between the lighting on the color and around it.
53
+ * default = 2.0
54
+ * @param {boolean} discountingIlluminant Whether the eye accounts for the tint of the
55
+ * ambient lighting, such as knowing an apple is still red in green light.
56
+ * default = false, the eye does not perform this process on
57
+ * self-luminous objects like displays.
58
+ * @return {ViewingConditions}
59
+ */
60
+ static make(
61
+ whitePoint = utils.whitePointD65(),
62
+ adaptingLuminance = ((200 / Math.PI) * utils.yFromLstar(50)) / 100,
63
+ backgroundLstar = 50,
64
+ surround = 2,
65
+ discountingIlluminant = false,
66
+ ) {
67
+ const xyz = whitePoint;
68
+ const rW = xyz[0] * 0.401_288 + xyz[1] * 0.650_173 + xyz[2] * -0.051_461;
69
+ const gW = xyz[0] * -0.250_268 + xyz[1] * 1.204_414 + xyz[2] * 0.045_854;
70
+ const bW = xyz[0] * -0.002_079 + xyz[1] * 0.048_952 + xyz[2] * 0.953_127;
71
+ const f = 0.8 + surround / 10;
72
+ const c = f >= 0.9 ? math.lerp(0.59, 0.69, (f - 0.9) * 10)
73
+ : math.lerp(0.525, 0.59, (f - 0.8) * 10);
74
+ let d = discountingIlluminant
75
+ ? 1
76
+ : f * (1 - (1 / 3.6) * Math.exp((-adaptingLuminance - 42) / 92));
77
+ d = d > 1 ? 1 : (d < 0 ? 0 : d);
78
+ const nc = f;
79
+ const rgbD = [
80
+ d * (100 / rW) + 1 - d,
81
+ d * (100 / gW) + 1 - d,
82
+ d * (100 / bW) + 1 - d,
83
+ ];
84
+ const k = 1 / (5 * adaptingLuminance + 1);
85
+ const k4 = k * k * k * k;
86
+ const k4F = 1 - k4;
87
+ const fl = k4 * adaptingLuminance
88
+ + 0.1 * k4F * k4F * Math.cbrt(5 * adaptingLuminance);
89
+ const n = utils.yFromLstar(backgroundLstar) / whitePoint[1];
90
+ const z = 1.48 + Math.sqrt(n);
91
+ const nbb = 0.725 / n ** 0.2;
92
+ const ncb = nbb;
93
+ const rgbAFactors = [
94
+ ((fl * rgbD[0] * rW) / 100) ** 0.42,
95
+ ((fl * rgbD[1] * gW) / 100) ** 0.42,
96
+ ((fl * rgbD[2] * bW) / 100) ** 0.42,
97
+ ];
98
+ const rgbA = [
99
+ (400 * rgbAFactors[0]) / (rgbAFactors[0] + 27.13),
100
+ (400 * rgbAFactors[1]) / (rgbAFactors[1] + 27.13),
101
+ (400 * rgbAFactors[2]) / (rgbAFactors[2] + 27.13),
102
+ ];
103
+ const aw = (2 * rgbA[0] + rgbA[1] + 0.05 * rgbA[2]) * nbb;
104
+ return new ViewingConditions(n, aw, nbb, ncb, c, nc, rgbD, fl, fl ** 0.25, z);
105
+ }
106
+
107
+ /**
108
+ * Parameters are intermediate values of the CAM16 conversion process. Their
109
+ * names are shorthand for technical color science terminology, this class
110
+ * would not benefit from documenting them individually. A brief overview
111
+ * is available in the CAM16 specification, and a complete overview requires
112
+ * a color science textbook, such as Fairchild's Color Appearance Models.
113
+ * @param {number} n
114
+ * @param {number} aw
115
+ * @param {number} nbb
116
+ * @param {number} ncb
117
+ * @param {number} c
118
+ * @param {number} nc
119
+ * @param {number[]} rgbD
120
+ * @param {number} fl
121
+ * @param {number} fLRoot
122
+ * @param {number} z
123
+ */
124
+ constructor(n, aw, nbb, ncb, c, nc, rgbD, fl, fLRoot, z) {
125
+ this.n = n;
126
+ this.aw = aw;
127
+ this.nbb = nbb;
128
+ this.ncb = ncb;
129
+ this.c = c;
130
+ this.nc = nc;
131
+ this.rgbD = rgbD;
132
+ this.fl = fl;
133
+ this.fLRoot = fLRoot;
134
+ this.z = z;
135
+ }
136
+ }
@@ -0,0 +1,93 @@
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
+ // libmonet is designed to have a consistent API across platforms
19
+ // and modular components that can be moved around easily. Using a class as a
20
+ // namespace facilitates this.
21
+ //
22
+ // tslint:disable:class-as-namespace
23
+
24
+ import Cam16 from './Cam16.js';
25
+ import Hct from './Hct.js';
26
+ import * as colorUtils from './colorUtils.js';
27
+ import * as mathUtils from './mathUtils.js';
28
+
29
+ /**
30
+ * Blend the design color's HCT hue towards the key color's HCT
31
+ * hue, in a way that leaves the original color recognizable and
32
+ * recognizably shifted towards the key color.
33
+ * @param {number} designColor ARGB representation of an arbitrary color.
34
+ * @param {number} sourceColor ARGB representation of the main theme color.
35
+ * @return {number} The design color with a hue shifted towards the
36
+ * system's color, a slightly warmer/cooler variant of the design
37
+ * color's hue.
38
+ */
39
+ export function harmonize(designColor, sourceColor) {
40
+ const fromHct = Hct.fromInt(designColor);
41
+ const toHct = Hct.fromInt(sourceColor);
42
+ const differenceDegrees = mathUtils.differenceDegrees(fromHct.hue, toHct.hue);
43
+ const rotationDegrees = Math.min(differenceDegrees * 0.5, 15);
44
+ const outputHue = mathUtils.sanitizeDegreesDouble(
45
+ fromHct.hue
46
+ + rotationDegrees * mathUtils.rotationDirection(fromHct.hue, toHct.hue),
47
+ );
48
+ return Hct.from(outputHue, fromHct.chroma, fromHct.tone).toInt();
49
+ }
50
+
51
+ /**
52
+ * Blend in CAM16-UCS space.
53
+ * @param {number} from ARGB representation of color
54
+ * @param {number} to ARGB representation of color
55
+ * @param {number} amount how much blending to perform; 0.0 >= and <= 1.0
56
+ * @return {number} from, blended towards to. Hue, chroma, and tone will
57
+ * change.
58
+ */
59
+ export function cam16Ucs(from, to, amount) {
60
+ const fromCam = Cam16.fromInt(from);
61
+ const toCam = Cam16.fromInt(to);
62
+ const fromJ = fromCam.jstar;
63
+ const fromA = fromCam.astar;
64
+ const fromB = fromCam.bstar;
65
+ const toJ = toCam.jstar;
66
+ const toA = toCam.astar;
67
+ const toB = toCam.bstar;
68
+ const jstar = fromJ + (toJ - fromJ) * amount;
69
+ const astar = fromA + (toA - fromA) * amount;
70
+ const bstar = fromB + (toB - fromB) * amount;
71
+ return Cam16.fromUcs(jstar, astar, bstar).toInt();
72
+ }
73
+
74
+ /**
75
+ * Blends hue from one color into another. The chroma and tone of
76
+ * the original color are maintained.
77
+ * @param {number} from ARGB representation of color
78
+ * @param {number} to ARGB representation of color
79
+ * @param {number} amount how much blending to perform; 0.0 >= and <= 1.0
80
+ * @return {number} from, with a hue blended towards to. Chroma and tone
81
+ * are constant.
82
+ */
83
+ export function hctHue(from, to, amount) {
84
+ const ucs = cam16Ucs(from, to, amount);
85
+ const ucsCam = Cam16.fromInt(ucs);
86
+ const fromCam = Cam16.fromInt(from);
87
+ const blended = Hct.from(
88
+ ucsCam.hue,
89
+ fromCam.chroma,
90
+ colorUtils.lstarFromArgb(from),
91
+ );
92
+ return blended.toInt();
93
+ }
@@ -0,0 +1,302 @@
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
+ // This file is automatically generated. Do not modify it.
19
+
20
+ import * as mathUtils from './mathUtils.js';
21
+
22
+ /**
23
+ * Color science utilities.
24
+ *
25
+ * Utility methods for color science constants and color space
26
+ * conversions that aren't HCT or CAM16.
27
+ */
28
+
29
+ const SRGB_TO_XYZ = [
30
+ [0.412_338_95, 0.357_620_64, 0.180_510_42],
31
+ [0.2126, 0.7152, 0.0722],
32
+ [0.019_321_41, 0.119_163_82, 0.950_344_78],
33
+ ];
34
+
35
+ const XYZ_TO_SRGB = [
36
+ [
37
+ 3.241_377_479_238_868_5,
38
+ -1.537_665_240_285_185_1,
39
+ -0.498_853_668_462_680_53,
40
+ ],
41
+ [
42
+ -0.969_145_251_300_532_1,
43
+ 1.875_885_345_106_787_2,
44
+ 0.041_565_856_169_120_61,
45
+ ],
46
+ [
47
+ 0.055_620_936_896_913_05,
48
+ -0.203_955_245_647_421_23,
49
+ 1.057_179_911_122_033_5,
50
+ ],
51
+ ];
52
+
53
+ const WHITE_POINT_D65 = [95.047, 100, 108.883];
54
+
55
+ /**
56
+ * Converts a color from RGB components to ARGB format.
57
+ * @param {number} red
58
+ * @param {number} green
59
+ * @param {number} blue
60
+ * @return {number}
61
+ */
62
+ export function argbFromRgb(red, green, blue) {
63
+ return (255 << 24 | (red & 255) << 16 | (green & 255) << 8 | blue & 255)
64
+ >>> 0;
65
+ }
66
+
67
+ /**
68
+ * Converts a color from linear RGB components to ARGB format.
69
+ * @param {number[]} linrgb
70
+ * @return {number}
71
+ */
72
+ export function argbFromLinrgb(linrgb) {
73
+ const r = delinearized(linrgb[0]);
74
+ const g = delinearized(linrgb[1]);
75
+ const b = delinearized(linrgb[2]);
76
+ return argbFromRgb(r, g, b);
77
+ }
78
+
79
+ /**
80
+ * Returns the alpha component of a color in ARGB format.
81
+ * @param {number} argb
82
+ * @return {number}
83
+ */
84
+ export function alphaFromArgb(argb) {
85
+ return argb >> 24 & 255;
86
+ }
87
+
88
+ /**
89
+ * Returns the red component of a color in ARGB format.
90
+ * @param {number} argb
91
+ * @return {number}
92
+ */
93
+ export function redFromArgb(argb) {
94
+ return argb >> 16 & 255;
95
+ }
96
+
97
+ /**
98
+ * Returns the green component of a color in ARGB format.
99
+ * @param {number} argb
100
+ * @return {number}
101
+ */
102
+ export function greenFromArgb(argb) {
103
+ return argb >> 8 & 255;
104
+ }
105
+
106
+ /**
107
+ * Returns the blue component of a color in ARGB format.
108
+ * @param {number} argb
109
+ * @return {number}
110
+ */
111
+ export function blueFromArgb(argb) {
112
+ return argb & 255;
113
+ }
114
+
115
+ /**
116
+ * Returns whether a color in ARGB format is opaque.
117
+ * @param {number} argb
118
+ * @return {boolean}
119
+ */
120
+ export function isOpaque(argb) {
121
+ return alphaFromArgb(argb) >= 255;
122
+ }
123
+
124
+ /**
125
+ * Converts a color from ARGB to XYZ.
126
+ * @param {number} x
127
+ * @param {number} y
128
+ * @param {number} z
129
+ * @return {number}
130
+ */
131
+ export function argbFromXyz(x, y, z) {
132
+ const matrix = XYZ_TO_SRGB;
133
+ const linearR = matrix[0][0] * x + matrix[0][1] * y + matrix[0][2] * z;
134
+ const linearG = matrix[1][0] * x + matrix[1][1] * y + matrix[1][2] * z;
135
+ const linearB = matrix[2][0] * x + matrix[2][1] * y + matrix[2][2] * z;
136
+ const r = delinearized(linearR);
137
+ const g = delinearized(linearG);
138
+ const b = delinearized(linearB);
139
+ return argbFromRgb(r, g, b);
140
+ }
141
+
142
+ /**
143
+ * Converts a color from XYZ to ARGB.
144
+ * @param {number} argb
145
+ * @return {number[]}
146
+ */
147
+ export function xyzFromArgb(argb) {
148
+ const r = linearized(redFromArgb(argb));
149
+ const g = linearized(greenFromArgb(argb));
150
+ const b = linearized(blueFromArgb(argb));
151
+ return mathUtils.matrixMultiply([r, g, b], SRGB_TO_XYZ);
152
+ }
153
+
154
+ /**
155
+ * Converts a color represented in Lab color space into an ARGB
156
+ * integer.
157
+ * @param {number} l
158
+ * @param {number} a
159
+ * @param {number} b
160
+ * @return {number}
161
+ */
162
+ export function argbFromLab(l, a, b) {
163
+ const whitePoint = WHITE_POINT_D65;
164
+ const fy = (l + 16) / 116;
165
+ const fx = a / 500 + fy;
166
+ const fz = fy - b / 200;
167
+ const xNormalized = labInvf(fx);
168
+ const yNormalized = labInvf(fy);
169
+ const zNormalized = labInvf(fz);
170
+ const x = xNormalized * whitePoint[0];
171
+ const y = yNormalized * whitePoint[1];
172
+ const z = zNormalized * whitePoint[2];
173
+ return argbFromXyz(x, y, z);
174
+ }
175
+
176
+ /**
177
+ * Converts a color from ARGB representation to L*a*b*
178
+ * representation.
179
+ * @param {number} argb the ARGB representation of a color
180
+ * @return {number[]} a Lab object representing the color
181
+ */
182
+ export function labFromArgb(argb) {
183
+ const linearR = linearized(redFromArgb(argb));
184
+ const linearG = linearized(greenFromArgb(argb));
185
+ const linearB = linearized(blueFromArgb(argb));
186
+ const matrix = SRGB_TO_XYZ;
187
+ const x = matrix[0][0] * linearR + matrix[0][1] * linearG + matrix[0][2] * linearB;
188
+ const y = matrix[1][0] * linearR + matrix[1][1] * linearG + matrix[1][2] * linearB;
189
+ const z = matrix[2][0] * linearR + matrix[2][1] * linearG + matrix[2][2] * linearB;
190
+ const whitePoint = WHITE_POINT_D65;
191
+ const xNormalized = x / whitePoint[0];
192
+ const yNormalized = y / whitePoint[1];
193
+ const zNormalized = z / whitePoint[2];
194
+ const fx = labF(xNormalized);
195
+ const fy = labF(yNormalized);
196
+ const fz = labF(zNormalized);
197
+ const l = 116 * fy - 16;
198
+ const a = 500 * (fx - fy);
199
+ const b = 200 * (fy - fz);
200
+ return [l, a, b];
201
+ }
202
+
203
+ /**
204
+ * Converts an L* value to an ARGB representation.
205
+ * @param {number} lstar L* in L*a*b*
206
+ * @return {number} ARGB representation of grayscale color with lightness
207
+ * matching L*
208
+ */
209
+ export function argbFromLstar(lstar) {
210
+ const y = yFromLstar(lstar);
211
+ const component = delinearized(y);
212
+ return argbFromRgb(component, component, component);
213
+ }
214
+
215
+ /**
216
+ * Computes the L* value of a color in ARGB representation.
217
+ * @param {number} argb ARGB representation of a color
218
+ * @return {number} L*, from L*a*b*, coordinate of the color
219
+ */
220
+ export function lstarFromArgb(argb) {
221
+ const y = xyzFromArgb(argb)[1];
222
+ return 116 * labF(y / 100) - 16;
223
+ }
224
+
225
+ /**
226
+ * Converts an L* value to a Y value.
227
+ *
228
+ * L* in L*a*b* and Y in XYZ measure the same quantity, luminance.
229
+ *
230
+ * L* measures perceptual luminance, a linear scale. Y in XYZ
231
+ * measures relative luminance, a logarithmic scale.
232
+ * @param {number} lstar L* in L*a*b*
233
+ * @return {number} Y in XYZ
234
+ */
235
+ export function yFromLstar(lstar) {
236
+ return 100 * labInvf((lstar + 16) / 116);
237
+ }
238
+
239
+ /**
240
+ * Linearizes an RGB component.
241
+ * @param {number} rgbComponent 0 <= rgb_component <= 255, represents R/G/B
242
+ * channel
243
+ * @return {number} 0.0 <= output <= 100.0, color channel converted to
244
+ * linear RGB space
245
+ */
246
+ export function linearized(rgbComponent) {
247
+ const normalized = rgbComponent / 255;
248
+ if (normalized <= 0.040_449_936) {
249
+ return (normalized / 12.92) * 100;
250
+ }
251
+ return ((normalized + 0.055) / 1.055) ** 2.4 * 100;
252
+ }
253
+
254
+ /**
255
+ * Delinearizes an RGB component.
256
+ * @param {number} rgbComponent 0.0 <= rgb_component <= 100.0, represents
257
+ * linear R/G/B channel
258
+ * @return {number} 0 <= output <= 255, color channel converted to regular
259
+ * RGB space
260
+ */
261
+ export function delinearized(rgbComponent) {
262
+ const normalized = rgbComponent / 100;
263
+ let delinearized = 0;
264
+ delinearized = normalized <= 0.003_130_8 ? normalized * 12.92 : 1.055 * normalized ** (1 / 2.4) - 0.055;
265
+ return mathUtils.clampInt(0, 255, Math.round(delinearized * 255));
266
+ }
267
+
268
+ /**
269
+ * Returns the standard white point; white on a sunny day.
270
+ * @return {number[]} The white point
271
+ */
272
+ export function whitePointD65() {
273
+ return WHITE_POINT_D65;
274
+ }
275
+
276
+ /**
277
+ * @param {number} t
278
+ * @return {number}
279
+ */
280
+ function labF(t) {
281
+ const e = 216 / 24_389;
282
+ const kappa = 24_389 / 27;
283
+ if (t > e) {
284
+ return t ** (1 / 3);
285
+ }
286
+ return (kappa * t + 16) / 116;
287
+ }
288
+
289
+ /**
290
+ *
291
+ * @param {number} ft
292
+ * @return {number}
293
+ */
294
+ function labInvf(ft) {
295
+ const e = 216 / 24_389;
296
+ const kappa = 24_389 / 27;
297
+ const ft3 = ft * ft * ft;
298
+ if (ft3 > e) {
299
+ return ft3;
300
+ }
301
+ return (116 * ft - 16) / kappa;
302
+ }