@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,298 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2021 Google LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ import ViewingConditions from './ViewingConditions.js';
19
+ import * as utils from './colorUtils.js';
20
+ import * as math from './mathUtils.js';
21
+
22
+ /**
23
+ * CAM16, a color appearance model. Colors are not just defined by their hex
24
+ * code, but rather, a hex code and viewing conditions.
25
+ *
26
+ * CAM16 instances also have coordinates in the CAM16-UCS space, called J*, a*,
27
+ * b*, or jstar, astar, bstar in code. CAM16-UCS is included in the CAM16
28
+ * specification, and should be used when measuring distances between colors.
29
+ *
30
+ * In traditional color spaces, a color can be identified solely by the
31
+ * observer's measurement of the color. Color appearance models such as CAM16
32
+ * also use information about the environment where the color was
33
+ * observed, known as the viewing conditions.
34
+ *
35
+ * For example, white under the traditional assumption of a midday sun white
36
+ * point is accurately measured as a slightly chromatic blue by CAM16. (roughly,
37
+ * hue 203, chroma 3, lightness 100)
38
+ */
39
+ export default class Cam16 {
40
+ /**
41
+ * All of the CAM16 dimensions can be calculated from 3 of the dimensions, in
42
+ * the following combinations:
43
+ * - {j or q} and {c, m, or s} and hue
44
+ * - jstar, astar, bstar
45
+ * Prefer using a static method that constructs from 3 of those dimensions.
46
+ * This constructor is intended for those methods to use to return all
47
+ * possible dimensions.
48
+ * @param {number} hue
49
+ * @param {number} chroma informally, colorfulness / color intensity. like saturation
50
+ * in HSL, except perceptually accurate.
51
+ * @param {number} j lightness
52
+ * @param {number} q brightness; ratio of lightness to white point's lightness
53
+ * @param {number} m colorfulness
54
+ * @param {number} s saturation; ratio of chroma to white point's chroma
55
+ * @param {number} jstar CAM16-UCS J coordinate
56
+ * @param {number} astar CAM16-UCS a coordinate
57
+ * @param {number} bstar CAM16-UCS b coordinate
58
+ */
59
+ constructor(hue, chroma, j, q, m, s, jstar, astar, bstar) {
60
+ /** @readonly */
61
+ this.hue = hue;
62
+ /** @readonly */
63
+ this.chroma = chroma;
64
+ /** @readonly */
65
+ this.j = j;
66
+ /** @readonly */
67
+ this.q = q;
68
+ /** @readonly */
69
+ this.m = m;
70
+ /** @readonly */
71
+ this.s = s;
72
+ /** @readonly */
73
+ this.jstar = jstar;
74
+ /** @readonly */
75
+ this.astar = astar;
76
+ /** @readonly */
77
+ this.bstar = bstar;
78
+ }
79
+
80
+ /**
81
+ * CAM16 instances also have coordinates in the CAM16-UCS space, called J*,
82
+ * a*, b*, or jstar, astar, bstar in code. CAM16-UCS is included in the CAM16
83
+ * specification, and is used to measure distances between colors.
84
+ * @param {Cam16} other
85
+ * @return {number}
86
+ */
87
+ distance(other) {
88
+ const dJ = this.jstar - other.jstar;
89
+ const dA = this.astar - other.astar;
90
+ const dB = this.bstar - other.bstar;
91
+ const dEPrime = Math.sqrt(dJ * dJ + dA * dA + dB * dB);
92
+ const dE = 1.41 * dEPrime ** 0.63;
93
+ return dE;
94
+ }
95
+
96
+ /**
97
+ * @param {number} argb ARGB representation of a color.
98
+ * @return {Cam16} CAM16 color, assuming the color was viewed in default viewing
99
+ * conditions.
100
+ */
101
+ static fromInt(argb) {
102
+ return Cam16.fromIntInViewingConditions(argb, ViewingConditions.DEFAULT);
103
+ }
104
+
105
+ /**
106
+ * @param {number} argb ARGB representation of a color.
107
+ * @param {ViewingConditions} viewingConditions Information about the environment where the color
108
+ * was observed.
109
+ * @return {Cam16} CAM16 color.
110
+ */
111
+ static fromIntInViewingConditions(argb, viewingConditions) {
112
+ const red = (argb & 0x00_FF_00_00) >> 16;
113
+ const green = (argb & 0x00_00_FF_00) >> 8;
114
+ const blue = (argb & 0x00_00_00_FF);
115
+ const redL = utils.linearized(red);
116
+ const greenL = utils.linearized(green);
117
+ const blueL = utils.linearized(blue);
118
+ const x = 0.412_338_95 * redL + 0.357_620_64 * greenL + 0.180_510_42 * blueL;
119
+ const y = 0.2126 * redL + 0.7152 * greenL + 0.0722 * blueL;
120
+ const z = 0.019_321_41 * redL + 0.119_163_82 * greenL + 0.950_344_78 * blueL;
121
+
122
+ const rC = 0.401_288 * x + 0.650_173 * y - 0.051_461 * z;
123
+ const gC = -0.250_268 * x + 1.204_414 * y + 0.045_854 * z;
124
+ const bC = -0.002_079 * x + 0.048_952 * y + 0.953_127 * z;
125
+
126
+ const rD = viewingConditions.rgbD[0] * rC;
127
+ const gD = viewingConditions.rgbD[1] * gC;
128
+ const bD = viewingConditions.rgbD[2] * bC;
129
+
130
+ const rAF = ((viewingConditions.fl * Math.abs(rD)) / 100) ** 0.42;
131
+ const gAF = ((viewingConditions.fl * Math.abs(gD)) / 100) ** 0.42;
132
+ const bAF = ((viewingConditions.fl * Math.abs(bD)) / 100) ** 0.42;
133
+
134
+ const rA = (math.signum(rD) * 400 * rAF) / (rAF + 27.13);
135
+ const gA = (math.signum(gD) * 400 * gAF) / (gAF + 27.13);
136
+ const bA = (math.signum(bD) * 400 * bAF) / (bAF + 27.13);
137
+
138
+ const a = (11 * rA + -12 * gA + bA) / 11;
139
+ const b = (rA + gA - 2 * bA) / 9;
140
+ const u = (20 * rA + 20 * gA + 21 * bA) / 20;
141
+ const p2 = (40 * rA + 20 * gA + bA) / 20;
142
+ const atan2 = Math.atan2(b, a);
143
+ const atanDegrees = (atan2 * 180) / Math.PI;
144
+ const hue = atanDegrees < 0 ? atanDegrees + 360
145
+ : (atanDegrees >= 360 ? atanDegrees - 360
146
+ : atanDegrees);
147
+ const hueRadians = (hue * Math.PI) / 180;
148
+
149
+ const ac = p2 * viewingConditions.nbb;
150
+ const j = 100
151
+ * (ac / viewingConditions.aw) ** (viewingConditions.c * viewingConditions.z);
152
+ const q = (4 / viewingConditions.c) * Math.sqrt(j / 100)
153
+ * (viewingConditions.aw + 4) * viewingConditions.fLRoot;
154
+ const huePrime = hue < 20.14 ? hue + 360 : hue;
155
+ const eHue = 0.25 * (Math.cos((huePrime * Math.PI) / 180 + 2) + 3.8);
156
+ const p1 = (50_000 / 13) * eHue * viewingConditions.nc * viewingConditions.ncb;
157
+ const t = (p1 * Math.sqrt(a * a + b * b)) / (u + 0.305);
158
+ const alpha = t ** 0.9
159
+ * (1.64 - 0.29 ** viewingConditions.n) ** 0.73;
160
+ const c = alpha * Math.sqrt(j / 100);
161
+ const m = c * viewingConditions.fLRoot;
162
+ const s = 50
163
+ * Math.sqrt((alpha * viewingConditions.c) / (viewingConditions.aw + 4));
164
+ const jstar = ((1 + 100 * 0.007) * j) / (1 + 0.007 * j);
165
+ const mstar = (1 / 0.0228) * Math.log(1 + 0.0228 * m);
166
+ const astar = mstar * Math.cos(hueRadians);
167
+ const bstar = mstar * Math.sin(hueRadians);
168
+
169
+ return new Cam16(hue, c, j, q, m, s, jstar, astar, bstar);
170
+ }
171
+
172
+ /**
173
+ * @param {number} j CAM16 lightness
174
+ * @param {number} c CAM16 chroma
175
+ * @param {number} h CAM16 hue
176
+ * @return {Cam16}
177
+ */
178
+ static fromJch(j, c, h) {
179
+ return Cam16.fromJchInViewingConditions(j, c, h, ViewingConditions.DEFAULT);
180
+ }
181
+
182
+ /**
183
+ * @param {number} j CAM16 lightness
184
+ * @param {number} c CAM16 chroma
185
+ * @param {number} h CAM16 hue
186
+ * @param {ViewingConditions} viewingConditions Information about the environment where the color
187
+ * was observed.
188
+ */
189
+ static fromJchInViewingConditions(j, c, h, viewingConditions) {
190
+ const q = (4 / viewingConditions.c) * Math.sqrt(j / 100)
191
+ * (viewingConditions.aw + 4) * viewingConditions.fLRoot;
192
+ const m = c * viewingConditions.fLRoot;
193
+ const alpha = c / Math.sqrt(j / 100);
194
+ const s = 50
195
+ * Math.sqrt((alpha * viewingConditions.c) / (viewingConditions.aw + 4));
196
+ const hueRadians = (h * Math.PI) / 180;
197
+ const jstar = ((1 + 100 * 0.007) * j) / (1 + 0.007 * j);
198
+ const mstar = (1 / 0.0228) * Math.log(1 + 0.0228 * m);
199
+ const astar = mstar * Math.cos(hueRadians);
200
+ const bstar = mstar * Math.sin(hueRadians);
201
+ return new Cam16(h, c, j, q, m, s, jstar, astar, bstar);
202
+ }
203
+
204
+ /**
205
+ * @param {number} jstar CAM16-UCS lightness.
206
+ * @param {number} astar CAM16-UCS a dimension. Like a* in L*a*b*, it is a Cartesian
207
+ * coordinate on the Y axis.
208
+ * @param {number} bstar CAM16-UCS b dimension. Like a* in L*a*b*, it is a Cartesian
209
+ * coordinate on the X axis.
210
+ * @return {Cam16}
211
+ */
212
+ static fromUcs(jstar, astar, bstar) {
213
+ return Cam16.fromUcsInViewingConditions(jstar, astar, bstar, ViewingConditions.DEFAULT);
214
+ }
215
+
216
+ /**
217
+ * @param {number} jstar CAM16-UCS lightness.
218
+ * @param {number} astar CAM16-UCS a dimension. Like a* in L*a*b*, it is a Cartesian
219
+ * coordinate on the Y axis.
220
+ * @param {number} bstar CAM16-UCS b dimension. Like a* in L*a*b*, it is a Cartesian
221
+ * coordinate on the X axis.
222
+ * @param {ViewingConditions} viewingConditions Information about the environment where the color
223
+ * was observed.
224
+ */
225
+ static fromUcsInViewingConditions(jstar, astar, bstar, viewingConditions) {
226
+ const a = astar;
227
+ const b = bstar;
228
+ const m = Math.sqrt(a * a + b * b);
229
+ const M = (Math.exp(m * 0.0228) - 1) / 0.0228;
230
+ const c = M / viewingConditions.fLRoot;
231
+ let h = Math.atan2(b, a) * (180 / Math.PI);
232
+ if (h < 0) {
233
+ h += 360;
234
+ }
235
+ const j = jstar / (1 - (jstar - 100) * 0.007);
236
+ return Cam16.fromJchInViewingConditions(j, c, h, viewingConditions);
237
+ }
238
+
239
+ /**
240
+ * @return {number} ARGB representation of color, assuming the color was viewed in
241
+ * default viewing conditions, which are near-identical to the default
242
+ * viewing conditions for sRGB.
243
+ */
244
+ toInt() {
245
+ return this.viewed(ViewingConditions.DEFAULT);
246
+ }
247
+
248
+ /**
249
+ * @param {ViewingConditions} viewingConditions Information about the environment where the color
250
+ * will be viewed.
251
+ * @return {number} ARGB representation of color
252
+ */
253
+ viewed(viewingConditions) {
254
+ const alpha = this.chroma === 0 || this.j === 0
255
+ ? 0
256
+ : this.chroma / Math.sqrt(this.j / 100);
257
+
258
+ const t = (alpha / (1.64 - 0.29 ** viewingConditions.n) ** 0.73) ** (1 / 0.9);
259
+ const hRad = (this.hue * Math.PI) / 180;
260
+
261
+ const eHue = 0.25 * (Math.cos(hRad + 2) + 3.8);
262
+ const ac = viewingConditions.aw
263
+ * (this.j / 100) ** (1 / viewingConditions.c / viewingConditions.z);
264
+ const p1 = eHue * (50_000 / 13) * viewingConditions.nc * viewingConditions.ncb;
265
+ const p2 = ac / viewingConditions.nbb;
266
+
267
+ const hSin = Math.sin(hRad);
268
+ const hCos = Math.cos(hRad);
269
+
270
+ const gamma = (23 * (p2 + 0.305) * t)
271
+ / (23 * p1 + 11 * t * hCos + 108 * t * hSin);
272
+ const a = gamma * hCos;
273
+ const b = gamma * hSin;
274
+ const rA = (460 * p2 + 451 * a + 288 * b) / 1403;
275
+ const gA = (460 * p2 - 891 * a - 261 * b) / 1403;
276
+ const bA = (460 * p2 - 220 * a - 6300 * b) / 1403;
277
+
278
+ const rCBase = Math.max(0, (27.13 * Math.abs(rA)) / (400 - Math.abs(rA)));
279
+ const rC = math.signum(rA) * (100 / viewingConditions.fl)
280
+ * rCBase ** (1 / 0.42);
281
+ const gCBase = Math.max(0, (27.13 * Math.abs(gA)) / (400 - Math.abs(gA)));
282
+ const gC = math.signum(gA) * (100 / viewingConditions.fl)
283
+ * gCBase ** (1 / 0.42);
284
+ const bCBase = Math.max(0, (27.13 * Math.abs(bA)) / (400 - Math.abs(bA)));
285
+ const bC = math.signum(bA) * (100 / viewingConditions.fl)
286
+ * bCBase ** (1 / 0.42);
287
+ const rF = rC / viewingConditions.rgbD[0];
288
+ const gF = gC / viewingConditions.rgbD[1];
289
+ const bF = bC / viewingConditions.rgbD[2];
290
+
291
+ const x = 1.862_067_86 * rF - 1.011_254_63 * gF + 0.149_186_77 * bF;
292
+ const y = 0.387_526_54 * rF + 0.621_447_44 * gF - 0.008_973_98 * bF;
293
+ const z = -0.015_841_5 * rF - 0.034_122_94 * gF + 1.049_964_44 * bF;
294
+
295
+ const argb = utils.argbFromXyz(x, y, z);
296
+ return argb;
297
+ }
298
+ }
@@ -0,0 +1,84 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2021 Google LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ import Hct from './Hct.js';
19
+ import TonalPalette from './TonalPalette.js';
20
+
21
+ /**
22
+ * An intermediate concept between the key color for a UI theme, and a full
23
+ * color scheme. 5 sets of tones are generated, all except one use the same hue
24
+ * as the key color, and all vary in chroma.
25
+ */
26
+ export default class CorePalette {
27
+ /** @type {TonalPalette} */
28
+ a1;
29
+
30
+ /** @type {TonalPalette} */
31
+ a2;
32
+
33
+ /** @type {TonalPalette} */
34
+ a3;
35
+
36
+ /** @type {TonalPalette} */
37
+ n1;
38
+
39
+ /** @type {TonalPalette} */
40
+ n2;
41
+
42
+ /** @type {TonalPalette} */
43
+ error;
44
+
45
+ /**
46
+ * @param {number} argb ARGB representation of a color
47
+ * @return {CorePalette}
48
+ */
49
+ static of(argb) {
50
+ return new CorePalette(argb, false);
51
+ }
52
+
53
+ /**
54
+ * @param {number} argb ARGB representation of a color
55
+ * @return {CorePalette}
56
+ */
57
+ static contentOf(argb) {
58
+ return new CorePalette(argb, true);
59
+ }
60
+
61
+ /**
62
+ * @param {number} argb
63
+ * @param {boolean} isContent
64
+ */
65
+ constructor(argb, isContent) {
66
+ const hct = Hct.fromInt(argb);
67
+ const { hue } = hct;
68
+ const { chroma } = hct;
69
+ if (isContent) {
70
+ this.a1 = TonalPalette.fromHueAndChroma(hue, chroma);
71
+ this.a2 = TonalPalette.fromHueAndChroma(hue, chroma / 3);
72
+ this.a3 = TonalPalette.fromHueAndChroma(hue + 60, chroma / 2);
73
+ this.n1 = TonalPalette.fromHueAndChroma(hue, Math.min(chroma / 12, 4));
74
+ this.n2 = TonalPalette.fromHueAndChroma(hue, Math.min(chroma / 6, 8));
75
+ } else {
76
+ this.a1 = TonalPalette.fromHueAndChroma(hue, Math.max(48, chroma));
77
+ this.a2 = TonalPalette.fromHueAndChroma(hue, 16);
78
+ this.a3 = TonalPalette.fromHueAndChroma(hue + 60, 24);
79
+ this.n1 = TonalPalette.fromHueAndChroma(hue, 4);
80
+ this.n2 = TonalPalette.fromHueAndChroma(hue, 8);
81
+ }
82
+ this.error = TonalPalette.fromHueAndChroma(25, 84);
83
+ }
84
+ }
@@ -0,0 +1,172 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2021 Google LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ /**
19
+ * A color system built using CAM16 hue and chroma, and L* from
20
+ * L*a*b*.
21
+ *
22
+ * Using L* creates a link between the color system, contrast, and thus
23
+ * accessibility. Contrast ratio depends on relative luminance, or Y in the XYZ
24
+ * color space. L*, or perceptual luminance can be calculated from Y.
25
+ *
26
+ * Unlike Y, L* is linear to human perception, allowing trivial creation of
27
+ * accurate color tones.
28
+ *
29
+ * Unlike contrast ratio, measuring contrast in L* is linear, and simple to
30
+ * calculate. A difference of 40 in HCT tone guarantees a contrast ratio >= 3.0,
31
+ * and a difference of 50 guarantees a contrast ratio >= 4.5.
32
+ */
33
+
34
+ import Cam16 from './Cam16.js';
35
+ import * as utils from './colorUtils.js';
36
+ import * as hctSolver from './hctSolver.js';
37
+
38
+ /**
39
+ * HCT, hue, chroma, and tone. A color system that provides a perceptually
40
+ * accurate color measurement system that can also accurately render what colors
41
+ * will appear as in different lighting environments.
42
+ */
43
+ export default class Hct {
44
+ /**
45
+ * @param hue 0 <= hue < 360; invalid values are corrected.
46
+ * @param chroma 0 <= chroma < ?; Informally, colorfulness. The color
47
+ * returned may be lower than the requested chroma. Chroma has a different
48
+ * maximum for any given hue and tone.
49
+ * @param tone 0 <= tone <= 100; invalid values are corrected.
50
+ * @return HCT representation of a color in default viewing conditions.
51
+ */
52
+
53
+ /** @type {number} */
54
+ internalHue;
55
+
56
+ /** @type {number} */
57
+ internalChroma;
58
+
59
+ /** @type {number} */
60
+ internalTone;
61
+
62
+ /**
63
+ * @param {number} hue
64
+ * @param {number} chroma
65
+ * @param {number} tone
66
+ * @return {Hct}
67
+ */
68
+ static from(hue, chroma, tone) {
69
+ return new Hct(hctSolver.solveToInt(hue, chroma, tone));
70
+ }
71
+
72
+ /**
73
+ * @param {number} argb ARGB representation of a color.
74
+ * @return {Hct} HCT representation of a color in default viewing conditions
75
+ */
76
+ static fromInt(argb) {
77
+ return new Hct(argb);
78
+ }
79
+
80
+ /** @return {number} */
81
+ toInt() {
82
+ return this.argb;
83
+ }
84
+
85
+ /**
86
+ * A number, in degrees, representing ex. red, orange, yellow, etc.
87
+ * Ranges from 0 <= hue < 360.
88
+ * @return {number}
89
+ */
90
+ get hue() {
91
+ return this.internalHue;
92
+ }
93
+
94
+ /**
95
+ * @param {number} newHue 0 <= newHue < 360; invalid values are corrected.
96
+ * Chroma may decrease because chroma has a different maximum for any given
97
+ * hue and tone.
98
+ */
99
+ set hue(newHue) {
100
+ this.setInternalState(
101
+ hctSolver.solveToInt(
102
+ newHue,
103
+ this.internalChroma,
104
+ this.internalTone,
105
+ ),
106
+ );
107
+ }
108
+
109
+ /** @return {number} */
110
+ get chroma() {
111
+ return this.internalChroma;
112
+ }
113
+
114
+ /**
115
+ * @param {number} newChroma 0 <= newChroma < ?
116
+ * Chroma may decrease because chroma has a different maximum for any given
117
+ * hue and tone.
118
+ */
119
+ set chroma(newChroma) {
120
+ this.setInternalState(
121
+ hctSolver.solveToInt(
122
+ this.internalHue,
123
+ newChroma,
124
+ this.internalTone,
125
+ ),
126
+ );
127
+ }
128
+
129
+ /**
130
+ * Lightness. Ranges from 0 to 100.
131
+ * @return {number}
132
+ */
133
+ get tone() {
134
+ return this.internalTone;
135
+ }
136
+
137
+ /**
138
+ * @param {number} newTone 0 <= newTone <= 100; invalid valids are corrected.
139
+ * Chroma may decrease because chroma has a different maximum for any given
140
+ * hue and tone.
141
+ */
142
+ set tone(newTone) {
143
+ this.setInternalState(
144
+ hctSolver.solveToInt(
145
+ this.internalHue,
146
+ this.internalChroma,
147
+ newTone,
148
+ ),
149
+ );
150
+ }
151
+
152
+ /** @param {number} argb */
153
+ constructor(argb) {
154
+ const cam = Cam16.fromInt(argb);
155
+ this.internalHue = cam.hue;
156
+ this.internalChroma = cam.chroma;
157
+ this.internalTone = utils.lstarFromArgb(argb);
158
+ this.argb = argb;
159
+ }
160
+
161
+ /**
162
+ * @private
163
+ * @param {number} argb
164
+ */
165
+ setInternalState(argb) {
166
+ const cam = Cam16.fromInt(argb);
167
+ this.internalHue = cam.hue;
168
+ this.internalChroma = cam.chroma;
169
+ this.internalTone = utils.lstarFromArgb(argb);
170
+ this.argb = argb;
171
+ }
172
+ }