@shortfuse/materialdesignweb 0.5.0 → 0.7.1-0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (419) hide show
  1. package/README.md +155 -77
  2. package/bin/generate-css.js +12 -0
  3. package/components/Badge.css +38 -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 +147 -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 +89 -0
  17. package/components/Checkbox.js +59 -0
  18. package/components/CheckboxIcon.css +90 -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 +150 -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 +75 -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 +95 -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 +307 -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 +64 -0
  101. package/components/Switch.js +127 -0
  102. package/components/SwitchIcon.css +178 -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/index.js +77 -0
  132. package/mixins/AriaReflectorMixin.js +42 -0
  133. package/mixins/AriaToolbarMixin.js +13 -0
  134. package/mixins/ControlMixin.css +57 -0
  135. package/mixins/ControlMixin.js +212 -0
  136. package/mixins/DensityMixin.css +40 -0
  137. package/mixins/DensityMixin.js +11 -0
  138. package/mixins/FlexableMixin.css +79 -0
  139. package/mixins/FlexableMixin.js +32 -0
  140. package/mixins/FormAssociatedMixin.js +170 -0
  141. package/mixins/InputMixin.js +335 -0
  142. package/mixins/KeyboardNavMixin.js +244 -0
  143. package/mixins/RTLObserverMixin.js +35 -0
  144. package/mixins/ResizeObserverMixin.js +38 -0
  145. package/mixins/RippleMixin.css +12 -0
  146. package/mixins/RippleMixin.js +115 -0
  147. package/mixins/ScrollListenerMixin.js +100 -0
  148. package/mixins/ShapeMixin.css +135 -0
  149. package/mixins/ShapeMixin.js +31 -0
  150. package/mixins/StateMixin.css +82 -0
  151. package/mixins/StateMixin.js +114 -0
  152. package/mixins/SurfaceMixin.css +150 -0
  153. package/mixins/SurfaceMixin.js +32 -0
  154. package/mixins/TextFieldMixin.css +657 -0
  155. package/mixins/TextFieldMixin.js +121 -0
  156. package/mixins/ThemableMixin.css +204 -0
  157. package/mixins/ThemableMixin.js +16 -0
  158. package/mixins/TooltipTriggerMixin.css +27 -0
  159. package/mixins/TooltipTriggerMixin.js +366 -0
  160. package/mixins/TouchTargetMixin.css +26 -0
  161. package/mixins/TouchTargetMixin.js +9 -0
  162. package/package.json +55 -49
  163. package/theming/index.js +473 -0
  164. package/theming/loader.js +24 -0
  165. package/utils/cli.js +11 -0
  166. package/utils/color_keywords.js +151 -0
  167. package/utils/hct/Cam16.js +298 -0
  168. package/utils/hct/CorePalette.js +84 -0
  169. package/utils/hct/Hct.js +172 -0
  170. package/utils/hct/Scheme.js +587 -0
  171. package/utils/hct/TonalPalette.js +68 -0
  172. package/utils/hct/ViewingConditions.js +136 -0
  173. package/utils/hct/blend.js +93 -0
  174. package/utils/hct/colorUtils.js +302 -0
  175. package/utils/hct/hctSolver.js +559 -0
  176. package/utils/hct/helper.js +182 -0
  177. package/utils/hct/mathUtils.js +153 -0
  178. package/utils/jsonMergePatch.js +100 -0
  179. package/utils/jsx-runtime.js +101 -0
  180. package/utils/popup.js +117 -0
  181. package/utils/svg.js +12 -0
  182. package/.browserslistrc +0 -4
  183. package/.eslintrc.json +0 -204
  184. package/.stylelintrc.json +0 -645
  185. package/.vscode/launch.json +0 -31
  186. package/.vscode/settings.json +0 -3
  187. package/.vscode/tasks.json +0 -32
  188. package/CHANGELOG.md +0 -36
  189. package/CODE_OF_CONDUCT.md +0 -46
  190. package/adapters/datatable/column.js +0 -176
  191. package/adapters/datatable/index.js +0 -960
  192. package/adapters/dom/index.js +0 -586
  193. package/adapters/list/index.js +0 -69
  194. package/adapters/search/index.js +0 -495
  195. package/components/appbar/_spec.scss +0 -165
  196. package/components/appbar/_theme.scss +0 -0
  197. package/components/appbar/index.scss +0 -2
  198. package/components/banner/_spec.scss +0 -83
  199. package/components/banner/_theme.scss +0 -0
  200. package/components/banner/index.scss +0 -2
  201. package/components/bottomnav/README.md +0 -85
  202. package/components/bottomnav/_spec.scss +0 -149
  203. package/components/bottomnav/_theme.scss +0 -0
  204. package/components/bottomnav/index.js +0 -117
  205. package/components/bottomnav/index.scss +0 -2
  206. package/components/bottomnav/item.js +0 -88
  207. package/components/button/README.md +0 -61
  208. package/components/button/_spec.scss +0 -162
  209. package/components/button/_theme.scss +0 -42
  210. package/components/button/index.eta +0 -32
  211. package/components/button/index.js +0 -43
  212. package/components/button/index.pug +0 -18
  213. package/components/button/index.scss +0 -2
  214. package/components/card/_spec.scss +0 -241
  215. package/components/card/_theme.scss +0 -0
  216. package/components/card/index.scss +0 -2
  217. package/components/chip/_spec.scss +0 -111
  218. package/components/chip/_theme.scss +0 -105
  219. package/components/chip/index.js +0 -23
  220. package/components/chip/index.scss +0 -2
  221. package/components/chip/item.js +0 -20
  222. package/components/datatable/_spec.scss +0 -225
  223. package/components/datatable/_theme.scss +0 -128
  224. package/components/datatable/cell.js +0 -44
  225. package/components/datatable/columnheader.js +0 -46
  226. package/components/datatable/index.js +0 -374
  227. package/components/datatable/index.scss +0 -2
  228. package/components/datatable/row.js +0 -48
  229. package/components/datatable/rowheader.js +0 -18
  230. package/components/dialog/_spec.scss +0 -203
  231. package/components/dialog/_theme.scss +0 -7
  232. package/components/dialog/index.js +0 -601
  233. package/components/dialog/index.scss +0 -2
  234. package/components/divider/_spec.scss +0 -11
  235. package/components/divider/_theme.scss +0 -0
  236. package/components/divider/index.scss +0 -2
  237. package/components/elevation/_spec.scss +0 -9
  238. package/components/elevation/_theme.scss +0 -0
  239. package/components/elevation/index.scss +0 -2
  240. package/components/fab/_spec.scss +0 -210
  241. package/components/fab/_theme.scss +0 -0
  242. package/components/fab/index.js +0 -99
  243. package/components/fab/index.scss +0 -2
  244. package/components/grid/_spec.scss +0 -169
  245. package/components/grid/_theme.scss +0 -0
  246. package/components/grid/index.scss +0 -2
  247. package/components/layout/_mixins.scss +0 -11
  248. package/components/layout/_spec.scss +0 -916
  249. package/components/layout/_theme.scss +0 -19
  250. package/components/layout/index.js +0 -454
  251. package/components/layout/index.scss +0 -2
  252. package/components/list/_spec.scss +0 -363
  253. package/components/list/_theme.scss +0 -102
  254. package/components/list/content.js +0 -106
  255. package/components/list/index.js +0 -256
  256. package/components/list/index.scss +0 -2
  257. package/components/list/item.js +0 -167
  258. package/components/list/secondary.js +0 -45
  259. package/components/menu/_spec.scss +0 -329
  260. package/components/menu/_theme.scss +0 -0
  261. package/components/menu/index.js +0 -705
  262. package/components/menu/index.scss +0 -2
  263. package/components/menu/item.js +0 -231
  264. package/components/progress/_spec.scss +0 -156
  265. package/components/progress/_theme.scss +0 -0
  266. package/components/progress/index.js +0 -36
  267. package/components/progress/index.scss +0 -2
  268. package/components/selection/_spec.scss +0 -376
  269. package/components/selection/_theme.scss +0 -134
  270. package/components/selection/index.eta +0 -60
  271. package/components/selection/index.js +0 -70
  272. package/components/selection/index.pug +0 -30
  273. package/components/selection/index.scss +0 -2
  274. package/components/selection/input.js +0 -54
  275. package/components/selection/radiogroup.js +0 -40
  276. package/components/slider/_spec.scss +0 -59
  277. package/components/slider/_theme.scss +0 -0
  278. package/components/slider/index.scss +0 -2
  279. package/components/snackbar/_spec.scss +0 -150
  280. package/components/snackbar/_theme.scss +0 -0
  281. package/components/snackbar/index.js +0 -338
  282. package/components/snackbar/index.scss +0 -2
  283. package/components/tab/_spec.scss +0 -220
  284. package/components/tab/_theme.scss +0 -0
  285. package/components/tab/content.js +0 -210
  286. package/components/tab/index.js +0 -257
  287. package/components/tab/index.scss +0 -2
  288. package/components/tab/item.js +0 -88
  289. package/components/tab/list.js +0 -196
  290. package/components/tab/panel.js +0 -54
  291. package/components/textfield/README.md +0 -179
  292. package/components/textfield/_spec.scss +0 -763
  293. package/components/textfield/_theme.scss +0 -264
  294. package/components/textfield/index.eta +0 -74
  295. package/components/textfield/index.js +0 -160
  296. package/components/textfield/index.pug +0 -30
  297. package/components/textfield/index.scss +0 -2
  298. package/components/tooltip/_spec.scss +0 -185
  299. package/components/tooltip/_theme.scss +0 -0
  300. package/components/tooltip/index.scss +0 -2
  301. package/components/type/_spec.scss +0 -227
  302. package/components/type/_theme.scss +0 -0
  303. package/components/type/index.scss +0 -2
  304. package/core/_breakpoint.scss +0 -189
  305. package/core/_elevation.scss +0 -78
  306. package/core/_length.scss +0 -8
  307. package/core/_motion.scss +0 -31
  308. package/core/_platform.scss +0 -12
  309. package/core/_type.scss +0 -128
  310. package/core/aria/attributes.js +0 -141
  311. package/core/aria/button.js +0 -49
  312. package/core/aria/keyboard.js +0 -92
  313. package/core/aria/rovingtabindex.js +0 -175
  314. package/core/aria/tab.js +0 -59
  315. package/core/document/index.js +0 -39
  316. package/core/overlay/_spec.scss +0 -28
  317. package/core/overlay/_theme.scss +0 -147
  318. package/core/overlay/index.js +0 -95
  319. package/core/overlay/index.scss +0 -2
  320. package/core/ripple/_spec.scss +0 -196
  321. package/core/ripple/_theme.scss +0 -20
  322. package/core/ripple/index.js +0 -286
  323. package/core/ripple/index.scss +0 -2
  324. package/core/theme/_aliases.scss +0 -15
  325. package/core/theme/_config.scss +0 -8
  326. package/core/theme/_functions.scss +0 -22
  327. package/core/theme/_palettes.scss +0 -405
  328. package/core/theme/_spec.scss +0 -0
  329. package/core/theme/_theme.scss +0 -268
  330. package/core/theme/index.js +0 -50
  331. package/core/theme/index.scss +0 -4
  332. package/core/throttler.js +0 -42
  333. package/core/transition/index.js +0 -465
  334. package/docs/_flex.scss +0 -28
  335. package/docs/_menuoptions.js +0 -183
  336. package/docs/_partials/_androidnavbar.eta +0 -5
  337. package/docs/_partials/_androidstatusbar.eta +0 -13
  338. package/docs/_partials/_appbar.eta +0 -27
  339. package/docs/_partials/_buttontest.eta +0 -31
  340. package/docs/_partials/_header.eta +0 -146
  341. package/docs/_partials/_navlistitem.eta +0 -16
  342. package/docs/_partials/_target.eta +0 -1
  343. package/docs/_sample-utils.js +0 -88
  344. package/docs/_storage.js +0 -33
  345. package/docs/docs.scss +0 -331
  346. package/docs/framework.scss +0 -26
  347. package/docs/index.eta +0 -12
  348. package/docs/index.js +0 -7
  349. package/docs/pages/appbar.eta +0 -108
  350. package/docs/pages/appbar.js +0 -0
  351. package/docs/pages/bottomnav.eta +0 -188
  352. package/docs/pages/bottomnav.js +0 -118
  353. package/docs/pages/button.eta +0 -124
  354. package/docs/pages/button.js +0 -224
  355. package/docs/pages/card.eta +0 -90
  356. package/docs/pages/card.js +0 -175
  357. package/docs/pages/chip.eta +0 -122
  358. package/docs/pages/chip.js +0 -80
  359. package/docs/pages/color.eta +0 -143
  360. package/docs/pages/color.js +0 -261
  361. package/docs/pages/datatable.eta +0 -323
  362. package/docs/pages/datatable.js +0 -160
  363. package/docs/pages/dialog.eta +0 -184
  364. package/docs/pages/dialog.js +0 -174
  365. package/docs/pages/dom.eta +0 -26
  366. package/docs/pages/dom.js +0 -140
  367. package/docs/pages/elevation.eta +0 -35
  368. package/docs/pages/elevation.js +0 -0
  369. package/docs/pages/fab.eta +0 -99
  370. package/docs/pages/fab.js +0 -43
  371. package/docs/pages/grid.eta +0 -135
  372. package/docs/pages/grid.js +0 -128
  373. package/docs/pages/layout.eta +0 -8
  374. package/docs/pages/layout.js +0 -0
  375. package/docs/pages/list.eta +0 -465
  376. package/docs/pages/list.js +0 -8
  377. package/docs/pages/menu.eta +0 -274
  378. package/docs/pages/menu.js +0 -213
  379. package/docs/pages/overlay.eta +0 -69
  380. package/docs/pages/overlay.js +0 -3
  381. package/docs/pages/progress.eta +0 -23
  382. package/docs/pages/progress.js +0 -12
  383. package/docs/pages/ripple.eta +0 -27
  384. package/docs/pages/ripple.js +0 -3
  385. package/docs/pages/search.eta +0 -242
  386. package/docs/pages/search.js +0 -226
  387. package/docs/pages/selection.eta +0 -107
  388. package/docs/pages/selection.js +0 -12
  389. package/docs/pages/slider.eta +0 -23
  390. package/docs/pages/slider.js +0 -0
  391. package/docs/pages/snackbar.eta +0 -83
  392. package/docs/pages/snackbar.js +0 -157
  393. package/docs/pages/tab.eta +0 -407
  394. package/docs/pages/tab.js +0 -152
  395. package/docs/pages/textfield.eta +0 -487
  396. package/docs/pages/textfield.js +0 -257
  397. package/docs/pages/tooltip.eta +0 -92
  398. package/docs/pages/tooltip.js +0 -0
  399. package/docs/pages/transition.eta +0 -117
  400. package/docs/pages/transition.js +0 -52
  401. package/docs/pages/type.eta +0 -31
  402. package/docs/pages/type.js +0 -0
  403. package/docs/postrender.js +0 -41
  404. package/docs/prerender.js +0 -16
  405. package/docs/pwa/_dialogs.eta +0 -143
  406. package/docs/pwa/_menus.eta +0 -16
  407. package/docs/pwa/pwa-prerender.js +0 -3
  408. package/docs/pwa/pwa.eta +0 -478
  409. package/docs/pwa/pwa.js +0 -298
  410. package/docs/pwa/pwa.scss +0 -31
  411. package/docs/themes/theme-colored.scss +0 -15
  412. package/docs/themes/theme-default.scss +0 -3
  413. package/index.scss +0 -27
  414. package/jsconfig.json +0 -16
  415. package/scripts/deploy-docs.sh +0 -9
  416. package/templates/index.eta +0 -2
  417. package/templates/index.pug +0 -3
  418. package/tsconfig.json +0 -16
  419. package/webpack.config.js +0 -304
@@ -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
+ }