@shortfuse/materialdesignweb 0.5.0 → 0.7.0

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