From 64336f421156492e594cd18bd4be9d30679b4b8e Mon Sep 17 00:00:00 2001 From: Mathieu Puech Date: Thu, 30 Jul 2020 11:18:55 -0400 Subject: [PATCH] test: add visual regression testing with playwright --- .gitignore | 2 + package.json | 11 +- .../button/test/demos.screenshots-test.js | 60 ++++ packages/providence-analytics/package.json | 2 +- .../test/demos.screenshots-test.js | 131 ++++++++ screenshots/buttons/button/disabled.png | Bin 0 -> 898 bytes screenshots/buttons/button/handler.png | Bin 0 -> 2068 bytes screenshots/buttons/button/icon-button.png | Bin 0 -> 1221 bytes .../buttons/button/icon-only-focused.png | Bin 0 -> 771 bytes .../buttons/button/icon-only-hovered.png | Bin 0 -> 829 bytes screenshots/buttons/button/icon-only.png | Bin 0 -> 739 bytes screenshots/buttons/button/main-focused.png | Bin 0 -> 820 bytes screenshots/buttons/button/main-hovered.png | Bin 0 -> 843 bytes screenshots/buttons/button/main.png | Bin 0 -> 783 bytes screenshots/buttons/button/within-form.png | Bin 0 -> 817 bytes .../select-rich/disabled-option-opened.png | Bin 0 -> 4376 bytes .../forms/select-rich/disabled-select.png | Bin 0 -> 2405 bytes .../select-rich/interaction-mode-mac.png | Bin 0 -> 2751 bytes .../interaction-mode-windows-linux.png | Bin 0 -> 3011 bytes screenshots/forms/select-rich/main-opened.png | Bin 0 -> 3361 bytes screenshots/forms/select-rich/main.png | Bin 0 -> 2456 bytes .../many-options-with-scrolling-opened.png | Bin 0 -> 5189 bytes .../select-rich/no-default-selection.png | Bin 0 -> 1838 bytes .../select-rich/options-with-html-opened.png | Bin 0 -> 7879 bytes .../forms/select-rich/options-with-html.png | Bin 0 -> 4152 bytes .../forms/select-rich/read-only-prefilled.png | Bin 0 -> 2742 bytes .../forms/select-rich/render-options.png | Bin 0 -> 2554 bytes .../forms/select-rich/single-option.png | Bin 0 -> 2264 bytes screenshots/forms/select-rich/validation.png | Bin 0 -> 4531 bytes scripts/screenshots/bootstrap.js | 5 + scripts/screenshots/index.js | 282 ++++++++++++++++++ yarn.lock | 178 ++++++++++- 32 files changed, 655 insertions(+), 16 deletions(-) create mode 100644 packages/button/test/demos.screenshots-test.js create mode 100644 packages/select-rich/test/demos.screenshots-test.js create mode 100644 screenshots/buttons/button/disabled.png create mode 100644 screenshots/buttons/button/handler.png create mode 100644 screenshots/buttons/button/icon-button.png create mode 100644 screenshots/buttons/button/icon-only-focused.png create mode 100644 screenshots/buttons/button/icon-only-hovered.png create mode 100644 screenshots/buttons/button/icon-only.png create mode 100644 screenshots/buttons/button/main-focused.png create mode 100644 screenshots/buttons/button/main-hovered.png create mode 100644 screenshots/buttons/button/main.png create mode 100644 screenshots/buttons/button/within-form.png create mode 100644 screenshots/forms/select-rich/disabled-option-opened.png create mode 100644 screenshots/forms/select-rich/disabled-select.png create mode 100644 screenshots/forms/select-rich/interaction-mode-mac.png create mode 100644 screenshots/forms/select-rich/interaction-mode-windows-linux.png create mode 100644 screenshots/forms/select-rich/main-opened.png create mode 100644 screenshots/forms/select-rich/main.png create mode 100644 screenshots/forms/select-rich/many-options-with-scrolling-opened.png create mode 100644 screenshots/forms/select-rich/no-default-selection.png create mode 100644 screenshots/forms/select-rich/options-with-html-opened.png create mode 100644 screenshots/forms/select-rich/options-with-html.png create mode 100644 screenshots/forms/select-rich/read-only-prefilled.png create mode 100644 screenshots/forms/select-rich/render-options.png create mode 100644 screenshots/forms/select-rich/single-option.png create mode 100644 screenshots/forms/select-rich/validation.png create mode 100644 scripts/screenshots/bootstrap.js create mode 100644 scripts/screenshots/index.js diff --git a/.gitignore b/.gitignore index c0ec93709..e14c49060 100644 --- a/.gitignore +++ b/.gitignore @@ -28,6 +28,8 @@ yarn-error.log /.tmp/ /coverage/ /storybook-static/ +/screenshots/.current/ +/screenshots/.diff/ ## temp files local.log diff --git a/package.json b/package.json index ea2718728..1f2477848 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,9 @@ "test:browser:all": "wtr \"packages/**/*/test/**/*.test.js\" --playwright --browsers webkit chromium firefox --coverage", "test:browser:watch": "wtr \"packages/**/*/test/**/*.test.js\" --watch", "test:browserstack": "wtr --config ./web-test-runner-browserstack.config.js \"packages/form-core/test/**/*.test.js\"", - "test:node": "node scripts/workspaces-scripts.mjs run test:node" + "test:node": "node scripts/workspaces-scripts.mjs run test:node", + "test:screenshots": "rimraf screenshots/.diff/ && rimraf screenshots/.current/ && mocha --require scripts/screenshots/bootstrap.js --exit --timeout 10000 \"packages/**/test/*.screenshots-test.js\"", + "test:screenshots:update": "cross-env UPDATE_SCREENSHOTS=true npm run test:screenshots" }, "devDependencies": { "@changesets/cli": "^2.9.2", @@ -55,14 +57,21 @@ "chai": "^4.2.0", "chalk": "^4.1.0", "concurrently": "^5.2.0", + "cross-env": "^7.0.2", "eclint": "^2.8.1", + "es-dev-server": "^1.57.1", + "es6-promisify": "^6.1.1", "eslint": "^6.1.0", "eslint-config-prettier": "^6.11.0", "husky": "^1.0.0", "lint-staged": "^10.0.0", + "looks-same": "^7.2.3", "markdownlint-cli": "^0.17.0", + "minimist": "^1.2.5", + "mkdirp-promise": "^5.0.1", "mocha": "^7.1.1", "npm-run-all": "^4.1.5", + "playwright": "^1.2.1", "prettier": "^2.0.5", "prettier-package-json": "^2.1.3", "rimraf": "^2.6.3", diff --git a/packages/button/test/demos.screenshots-test.js b/packages/button/test/demos.screenshots-test.js new file mode 100644 index 000000000..a903eca51 --- /dev/null +++ b/packages/button/test/demos.screenshots-test.js @@ -0,0 +1,60 @@ +/* globals capture getStoryPage */ + +const selector = 'lion-button'; + +describe('buttons-button', () => { + it('main', async () => { + const id = 'buttons-button--main'; + const page = await getStoryPage(id); + await capture({ selector, id, page }); + }); + it('main-hovered', async () => { + const id = 'buttons-button--main'; + const page = await getStoryPage(id); + await page.hover(selector); + await capture({ selector, id: `${id}-hovered`, page }); + }); + it('main-focused', async () => { + const id = 'buttons-button--main'; + const page = await getStoryPage(id); + await page.focus(selector); + await capture({ selector, id: `${id}-focused`, page }); + }); + it('handler', async () => { + const id = 'buttons-button--handler'; + const page = await getStoryPage(id); + await capture({ selector, id, page }); + }); + it('icon-button', async () => { + const id = 'buttons-button--icon-button'; + const page = await getStoryPage(id); + await capture({ selector, id, page }); + }); + it('icon-only', async () => { + const id = 'buttons-button--icon-only'; + const page = await getStoryPage(id); + await capture({ selector, id, page }); + }); + it('icon-only-hovered', async () => { + const id = 'buttons-button--icon-only'; + const page = await getStoryPage(id); + await page.hover(selector); + await capture({ selector, id: `${id}-hovered`, page }); + }); + it('icon-only-focused', async () => { + const id = 'buttons-button--icon-only'; + const page = await getStoryPage(id); + await page.focus(selector); + await capture({ selector, id: `${id}-focused`, page }); + }); + it('disabled', async () => { + const id = 'buttons-button--disabled'; + const page = await getStoryPage(id); + await capture({ selector, id, page }); + }); + it('within-form', async () => { + const id = 'buttons-button--within-form'; + const page = await getStoryPage(id); + await capture({ selector, id, page }); + }); +}); diff --git a/packages/providence-analytics/package.json b/packages/providence-analytics/package.json index b044e4da7..f380645fd 100644 --- a/packages/providence-analytics/package.json +++ b/packages/providence-analytics/package.json @@ -39,7 +39,7 @@ "chalk": "^4.1.0", "commander": "^2.20.0", "deepmerge": "^4.0.0", - "es-dev-server": "^1.18.1", + "es-dev-server": "^1.57.1", "es-module-lexer": "^0.3.6", "glob": "^7.1.6", "htm": "^3.0.3", diff --git a/packages/select-rich/test/demos.screenshots-test.js b/packages/select-rich/test/demos.screenshots-test.js new file mode 100644 index 000000000..e04ffcdf5 --- /dev/null +++ b/packages/select-rich/test/demos.screenshots-test.js @@ -0,0 +1,131 @@ +/* globals capture getStoryPage */ + +const selector = 'lion-select-rich'; + +describe('forms-select-rich', () => { + it('main', async () => { + const id = `forms-select-rich--main`; + const page = await getStoryPage(id); + await capture({ selector, id, page }); + }); + it('main-opened', async () => { + const id = `forms-select-rich--main`; + const page = await getStoryPage(id); + await page.evaluate(() => { + const el = document.querySelector('lion-select-rich'); + el.opened = true; + }); + await capture({ + selector, + id: `${id}-opened`, + page, + endClipSelector: 'lion-options', + }); + }); + it('options-with-html', async () => { + const id = `forms-select-rich--options-with-html`; + const page = await getStoryPage(id); + await capture({ selector, id, page }); + }); + it('options-with-html-opened', async () => { + const id = `forms-select-rich--options-with-html`; + const page = await getStoryPage(id); + await page.evaluate(() => { + const el = document.querySelector('lion-select-rich'); + el.opened = true; + }); + await capture({ + selector, + id: `${id}-opened`, + page, + endClipSelector: 'lion-options', + }); + }); + it('many-options-with-scrolling-opened', async () => { + const id = `forms-select-rich--many-options-with-scrolling`; + const page = await getStoryPage(id); + await page.evaluate(() => { + const el = document.querySelector('lion-select-rich'); + el.opened = true; + }); + await capture({ + selector, + id: `${id}-opened`, + page, + endClipSelector: 'lion-options', + }); + }); + it('read-only-prefilled', async () => { + const id = `forms-select-rich--read-only-prefilled`; + const page = await getStoryPage(id); + await capture({ selector, id, page }); + }); + it('disabled-select', async () => { + const id = `forms-select-rich--disabled-select`; + const page = await getStoryPage(id); + await capture({ selector, id, page }); + }); + it('disabled-option-opened', async () => { + const id = `forms-select-rich--disabled-option`; + const page = await getStoryPage(id); + await page.evaluate(() => { + const el = document.querySelector('lion-select-rich'); + el.opened = true; + }); + await capture({ + selector, + id: `${id}-opened`, + page, + endClipSelector: 'lion-options', + }); + }); + it('validation', async () => { + const id = `forms-select-rich--validation`; + const page = await getStoryPage(id); + await page.evaluate(() => { + const el = document.querySelector('lion-select-rich'); + el.updateComplete.then(() => { + el.touched = true; + el.dirty = true; + }); + }); + await capture({ selector, id, page }); + }); + it('render-options', async () => { + const id = `forms-select-rich--render-options`; + const page = await getStoryPage(id); + await capture({ selector, id, page }); + }); + it('interaction-mode-mac', async () => { + const id = `forms-select-rich--interaction-mode`; + const page = await getStoryPage(id); + await page.click('lion-select-rich'); + await page.keyboard.press('ArrowDown'); + await capture({ + selector, + id: `${id}-mac`, + page, + }); + }); + it('interaction-mode-windows-linux', async () => { + const id = `forms-select-rich--interaction-mode`; + const page = await getStoryPage(id); + await page.click('lion-select-rich:last-of-type'); + await page.keyboard.press('ArrowDown'); + await capture({ + selector: 'lion-select-rich:last-of-type', + id: `${id}-windows-linux`, + page, + }); + }); + it('no-default-selection', async () => { + const id = `forms-select-rich--no-default-selection`; + const page = await getStoryPage(id); + await capture({ selector, id, page }); + }); + it('single-option', async () => { + const id = `forms-select-rich--single-option`; + const page = await getStoryPage(id); + await capture({ selector, id, page }); + }); +}); diff --git a/screenshots/buttons/button/disabled.png b/screenshots/buttons/button/disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..0127134d9faeab69ebbe4a6615564249ff4745bb GIT binary patch literal 898 zcmeAS@N?(olHy`uVBq!ia0vp^5kPFg!3HEN6YcYW6k~CayA#8@b22X(7?^E5T^vIy z=DeMCF>A4dNZbE)lU($9R7#QlzkP!3X;Z|#76+Yb5xzXRWqNe7L z@cEDapFeyska)}kl}J2zWJ5v{hI)vw-@n;qT{@>1Y?bTbR{XZ^?DJxV1AqViz4=|Y zi)r;$F3(9aJ>HrhzkFf2|6Q={;r8R_Kg-NMn^y4W{?nv`o|6{nc!z|xTJ$}%;A>bf z?sHjW-gCvSMeEM1CN=u+ER8+9X-#us@%!SFpJjY6^Ys0fJ>k{z*h0YRz$Tq5rM ztv4$Zas6QP{>9$M7IxKtZsxFEFFpTmKW`=PzP)={8&-4uo4#X*%bY`>ZA4rf&!%0D zJ-vzN@kfcxH+c?RpCaGuHp544hTrl68TQiH#Ts4f?q`_X($-&QGqXB(`Xal(moCod z{QOhKOEY3x>&J?ko8A8(^}kWtmK|9iI3*})Z=5p+a^2O55^w8eOr3VHIK_B&wpiY zJ@osx^^~ByZ-CBT_xjzLUB!yxIYxOIr)ExHxr!?^^z9TzluYSFe`LJas(dw%Fv8PZG{-%UyH* z_2R!vr`$FB95vx;f~M*vlh$ie``+{0?U=I3x=bIadC0GA}*U;hAK6;{+KN{p8WA|-QT-Sne{p0m)<95eRx0TNnfpa;l_kEdz+uDai>0{ qMEUH={i$bC3)nzO88yY8@t54+^XFWc@-kqiV(@hJb6Mw<&;$V6p0A_; literal 0 HcmV?d00001 diff --git a/screenshots/buttons/button/handler.png b/screenshots/buttons/button/handler.png new file mode 100644 index 0000000000000000000000000000000000000000..5b1d60ece8c827c45bbcd731a02a54d98ca23891 GIT binary patch literal 2068 zcma)-eKZqnAIDdjme*BcWk`=`c^h_@<1H3350fcrgwjHZ$vds}B1wiDjntHt32n;5iP}?*E{o;HIp%UThH!)p8GuK+0rfVj6uVu7o4GuXY(QyWD>)X} zW_pfzeRPkcOVGi>xxb5MP4Plo$df|B<)M#jquRTsQhQ2GlaI8!en~WN%Cpy zd&l}J{PK;8y^K3pQS=q!j%B%NaL-_fSL@d~oxl~lx2&kgDT~nQdg->w;4ms2s$m6D z%cH>xF-JX56Nv^K4#(IBk^vzd@qdY~*i^1%M?vFsbA$+-1)xRhpyU$zT`!jpMj{5@ z#Eq>weMA5OuD)kW51U}T$+$k~x?Wps_N&mjz>6Kdnfttqw|l^Tr@^pv^2-s?BG_#! zkN8XD&)997UFOCUOCC(4@EIOx_)l%GGB#G~AD%`Ht`is(=?wO?8Y_UdRfRN!s5~*}=~>c=&eP{J>Ll6+3M_ z9{(JXD_Q-w5L#7hHm>Eqr)?CTusvx4ynpP&#*SJ+K8)xc>1iTq*UB@1q zr30thsykR}nwpw@^&SDN=uP2V1ELsqdis) zR*n-TJ1EaFnW=GciqG>E|k*({fWd zfY#FrZ!%*>0fqR&F^K92~p{ zw9#*Nd|b)I!~`HGg=^_Z#A0zln|iVuVup2+d{XuJ(pQ;`y|pfp!)5WRt4(X4N~eJz z#fe3;U~+v59uMeGc+aKN&8xj?%)P&${X$HYRqQD_HB5-`V>Um`1NPprM@nYXm*>82 zvaqzIFDDZSq;K(!V8Ab#SeMOapC{F@eS1ZV*?CK;j$P+$UNA0{mW@huuhC6a>XTH` z($WA&E7>Az3ffdUee=ZBd#nSa%YFV3QQlPdAjd6YK?YYlZ0b>YqZ+4(7MWM{?mu{8 zJC^Q0L1m7~|?5;yk`w9arjG@Fe2B};o+N;l9JQ|>!HI$ zkvzD4iQoY%$~v;+ep8#`b5GDBbjpUKExQc8w}%D!H)uEeR|8??v1vEKB#QoTmsb8< zbqeZlpPh}4d^EAJ5HD`b$;~xPe?9|C3*b_!;@+5*2Z45xj{FO%r+0Fh!C-Vv{YcK< z4eB!LHeD&Q4C$J>(yR$9uh+dTgrM>t^?qwf7zWlvt$2J`A}p+~lir;@nPHm~8y{Z> z*XUVqW$XrdIXKr=`7FHdRt!Ns+T_olkjH`!hx;0cNrH^3ZWl9xb98VBf(VUJV1BIF z%E{h7@abxAg^#Vhy^VOf7%k+yNCA3Q*872#;sE}hy>$ybQKNKUmZ#JcMi=>Nz3)ZT zGf*)4iUI<%Cy{nV81g^~?VCdu6{t(y$C}>|Fn|^qQ+g7HUt-Q*iHobnHwPp+(P#P- zR_!0w=`loDnNH`#YEThO_pjMP93C1f9Ps}<$x2NJU-kHP z^A2mTfh=(~;AlsV6_-+iq)<|CXMv-Lo+q iZw4m)Gco_Z_|rfuvu`B3B;$qx^8l0^+LeI}z5XBCL+UjE literal 0 HcmV?d00001 diff --git a/screenshots/buttons/button/icon-button.png b/screenshots/buttons/button/icon-button.png new file mode 100644 index 0000000000000000000000000000000000000000..8418c0d82aeca432780875f40508d9c084ce2bff GIT binary patch literal 1221 zcmeAS@N?(olHy`uVBq!ia0vp^AZ)?G1|;*G*DnWBjKx9jP7LeL$-HD>V5#?XaSW-L z^LCcKhjhHm0sFr{Uti*D|Cr^dxY*^(g6cL0R`$6pti|24%Nf64;OUAz#oOeec*Im; zk@Jg$HV4hdT^3b`90j=8T|1snEiMqQZ@y!i`FHY+@}Cz!*%dh7+r6jy=acID@2ij7 z?%ug`r{g8#|9|ca|A?NT#H#4Z<_C!T;^F8qu?eotCEg`!+SS0@^L^eZ<=$4C>-YcKJip~Xe|^oqGyT2v#%>?A$v3v~ zItZ}rSjT;b>zaw~yVKu$Z@BDQ*PVM?qwCPqr>c$u0U9DV?%Yw~VA9jq4-{d&y^XU; zVO{1Ipfa_|o~y2EG5oBVmt%H%x&Qndw{ItBW_H%t@jGmdat)kPeLONIMrESMoys@w z-yb*qyRP%=wRtmVK78Kic@;m^1&>V*aw~qb9yOr=6~sy1BVk{QF~>e}CW6O*%f8-(rU`_t^tx!_J)rS79j49}lG54?TzrlhsCHN%sloqflpq@}Ze$7oHBh=^ct z2o0^duRhVkUGbzZ`&s3T2wK6^{QK6E%qzfxT{S*sqwz`_nV@fXSV0xUsNn} zd|`~9v883_>s`6`U$z;f`}z8A-P*o=)nkh(UQ1Whrlz)j{aRXc|NXD1e!=XGoZIWl zU1vSE*i-pgO{h}7ySw{Jmg$4+m;+r;X5D5Jg9~ioI?WOjLdG34T`n%2t zcWljKcWhXsQ66?QZFA=$joR9Ti@QX!Qj?Pxt9J?{yKLh!@|_&DRxI@0!i5XB#rkU4 zRKWML$I_s{c&({j*QV}T=idFfPGFsLbbp-q zV}|o`)spd7yhFC-Zr-zp=fJmb-{gM=d|xPx%y-7qtRA_Tc1_Od1kSsw~P;1R- zGydg81IZ7#!uH8pe&^d?Jnr5^4D7L=7j@G)`f<;lF zlwvZOJc>;w6O>Y-gEj~X-Y?u3L#x#)Ket+~2UCosq?lm8-!C_Dtu?;ymoeY>%Y88n z!*bJ?K=dhkpFGdm+S&r(@bK{6hU}M~qT-|49IZ7cCnt+aS5lvePZ&rxvU_ zOE381B=ge$Q2uq6zJt#W+snezcd!<$I<;Wc`2`dj2A_^8=#2mX002ovPDHLkV1njV Bao7L= literal 0 HcmV?d00001 diff --git a/screenshots/buttons/button/icon-only-hovered.png b/screenshots/buttons/button/icon-only-hovered.png new file mode 100644 index 0000000000000000000000000000000000000000..2c2c4283d04a8a9fd5e161cff7231202b8fecdce GIT binary patch literal 829 zcmV-D1H$}?P)Px%_en%SRA_u{S=4c20v9j*HD2{I=nHxsU(oCL zf?mfL^g3rEm>wMXr!g5w7qm>1=H`||=)9518mqfhGEE+6lK`n**(^0Wo=yy4G)WKE-$us zc11Fk64_i{gu`J02tYJ8UK80|UL;c~vAwe^vbnq%8XguaYwO3(R}QI*jAfd*uFK-$ zBB|uFKVpOF7lf~b(KH=ZRZpDbTwfcyt_x7=KM%6Hx`J{^VdIEcC6Ov<+cr&_MlcvS z6l-W`ph?q?l&>U`XV5`W6bgmHp;)0%_|=HZYqUY4;K36@EEXpe3YETxLLp+Y_>tFE z8fk)4lM|&)T+?+Tkw_^Pi9||0Xs6Lt+Vo{`CaoImuc+PKcL5k5e^aq0`@iT#W#a$4 zblwHX#uxNDzM$9f1-(wy3zqFPx%ok>JNRA_>s3cn@uaoq_zkIv9L>L7x4pv zmDp^)z{*NC3w9O*BCLqa7Tbxh5QCz;eW+L8EID1~4w-wHotZn?rN_s|M;4f0Kb?Ry zt)TC;g1*xV`p)lp9q#Y%zax(iv$nSO*Z9KEU@Pc5t)TC;g1*xV`p&lq=6U{4Z4!tJ z)^$y<*L&06>-9K0JChz>UN8s(>beHNIfu0tcoNrIOAjw6XsxBLYm`zH-b#;|ar$fKr2VguN zi?73_c^`g1d*OA?ad>!09LH>KZnCnn!twDjWm#g3K`HgA_s_fViVMP%aj3`3G6 zA&z6RER#$@PB6|CTJk*S?(VLMU0+|5=Q-9|27`g9W3Q&knl z7|zenn?9q_2xAOYRW;{iQ4~#;^OcBhGS5}Y#l;1CdwZ{9`}_NBY;2&lCJ2HLkMX0Q z4WCP}_h#nu@)D(#$gI6YRM1+B)|yVI^Cq^wzK+(~Z$alAN+~9j$(z_@GC?UNT4;ly z;LF5~F?74#=DFMLVvKpW?^h!xSe9jTh-BL=sT^T@3exxv+#m*D;eKe_!(>keWw-lomS9y{s1Z5 V6;vadir@eM002ovPDHLkV1iCpUgrP+ literal 0 HcmV?d00001 diff --git a/screenshots/buttons/button/main-focused.png b/screenshots/buttons/button/main-focused.png new file mode 100644 index 0000000000000000000000000000000000000000..68375f48ab05ead10f7d1850b36c53aae068c958 GIT binary patch literal 820 zcmeAS@N?(olHy`uVBq!ia0vp^{y=QO!3HGv2rvB)q!^2X+?^QKos)UVz`*p*)5S5Q zV$R#yhS|3rM2`R0oV)AmhijVN3N1Wyg#}6kA~*k(mT9bE)aU#7NPof8Yd(y;QN0IR zn={@$XmIqNmUimnuF_EU;;z`pjf>SSHEZoH3QBf;zO4U#o{Qg2?XE=)7drU!We@D{ zIgzaJNutAsO{xFj@m+oI`*-s^{`>i@_tzOIa?Q8Se6IQXC0o33Pjua%e=)b!XC8NW zVkl6_<08jA5eKtDcm4hM&YGdOZ_OyTn{Phvcog?ikvYY^&sQ|-zW?@3%ySY0!zUYd z!N!gW&n+1oG+QnD;!U3?7#uiyl(mB+D*MizJ0@Lcqq;wT{_K{#ec|TR+poVmxNsa6 zhnp>eFCp0>8JVPUv)_wLl=HL|~U>$wHCOr9*vaNyuU$D88EKc4!zkLSlO z3D-c&IL+3&{rkLpUl}~ICbgc zInL{^ukQJ}RX8FgEZTb=uhn^*`o$KuwyX>`Ha1ftx7@kb`T57wikg}|-`GBcmFT_y z^-GH3)Y6^%_xJz){d?{4=xjq7K1UahrUjEFW?!0V^IT?1kjG^a&q-5emX?);RhD!< zu6Vq-`ThK}X;b$dKmJ^{YOU!dleK#@bw1yEexA#f_wxL1Hy8bF20Yvh+0hbh*~cZ4 z!_FBW6LAUYaa%m~an$QmEakt zG3V_pdmpJlndAG-WVupPbCZuJJ-Sr3d19~j+$$^n4m_Ff#wK&+%0V~Tlmm`)8$>5> z6J}TAbAPo=@5qA)rovBaukX&ge(;X=mjj1?7v56a@BeAi<9pTntG_?odw+L9PsFs; z#*ar9x62*)&vRP&z$cCkHcUGG3}B{BS@ws^e@f*a|46Tts<^bhFI|ptntQ`j!Gubd z2wcofduG1WY-wuTmnu=HFU@uBiBK?zR^te40zkM=K&wR?v7uDx(-}u49U}0w` zw_@*(ecy^LcI23B*tW}PO2od?)smeI41Rw5P8XNS{j%17_pGSm^Dj|`gfBmhBg-SS zO1Eym+%Q+Xyx8)ly$DZ2TGguO5m~dYiPl?AR=j(A@0)Fgt`m=&`a188o4&KKI6L~@ zn;@&+%bSZC>OU%Q6YjsCAE%hy61|^o zwV|-K-H@kmRj6h_XsFDa_mI?_kZ$>g4c=3WeCMJgG&i-YY5z(=Yc{6~4 zQ7gGPyk@d`i-U&5fxxX@o1!KfYs>Xp%f<3}t6q0!-@Pwxz4fbg>()If)S3xYaI5_C zizn;O&*#$-FFCwt>k*NoOcypE5m}l(zh>c$t9tPoQM(eOW=G$Seg6EJxXkqzIhS*` zt_AwqUFY|%)UB67ujg#ly=(CF`KGACz58!V6#gz&-v8y<^n3eI6BSbWLSpXtr*ia5 eJC^kIgI93E)g@9v(KCU$gTd3)&t;ucLK6VHhmS1) literal 0 HcmV?d00001 diff --git a/screenshots/buttons/button/main.png b/screenshots/buttons/button/main.png new file mode 100644 index 0000000000000000000000000000000000000000..4b35d9b14a7189fafa5ade56a8a2f4b3cae8a3a9 GIT binary patch literal 783 zcmeAS@N?(olHy`uVBq!ia0vp^{y=QO!3HGv2rvB)q!^2X+?^QKos)UVz`%6U)5S5Q zV$R!HhFOmtMB4uAR5$YMbC7E0v~1*k8TGjEV+Uv+3Vk&xVU+e&K`cYl(T0pzxaGcI`QWsjV>l9<+|GM4FA$y!HnYbVb{mPJyC#B9*bH<5DGEZs6k`CZ!POqt_R z+)G8~6!#{}H0!?q_)*Yv5(C308+O6QjtS2#85}fQE&A+5i;ZR`*vK_^EZBPN@L}i0 z8zZv~W%#7O+O}Ssmb?5iqo5*>bH-Z#dA8>)C6WtjYk3(Wbi{zD_m}`nJ#p*V86xzi|BIQ~{_kvepvc1e z@0l5P-Cei7`*Fqk+L>&p_DHx+e7}Cmp$ro%3$g6Caeq#x9NM*A|7PxCgD=OgMXd?b zo-h6U^UnP@cki}NiDY|_|F7hnV|K63X$KdBV-DH84{YyGJDysfeCA>yi{l3I{h3x8 zD{I>e`7W7!Wtu;4UP8}G9ogqHR&)K9=FhZl{64dEooYE>)cne)ZiW&(3=I1E`gLM& zr#V0JI`y=oxVX50`G;QA^z!<8eulctxY*dly>avJ+>h#hS;D2{B*3z^XQSrYlf~y8 zHCs)5C#rPLkKDd}`&9So7Jb?BvZsDs%?e#vU0eJ0cvSY1%&L;hH=b@jKVP&3>px_8-|pYqPHe0i5kslV|=vce~c4jVRHOvktWL5B)cp25=+EQvJRuPDEK V{d4Mq8ej@%@O1TaS?83{1ON-5SnU7+ literal 0 HcmV?d00001 diff --git a/screenshots/buttons/button/within-form.png b/screenshots/buttons/button/within-form.png new file mode 100644 index 0000000000000000000000000000000000000000..8e7b74147f79546216bc50ea1f8324616c64b072 GIT binary patch literal 817 zcmeAS@N?(olHy`uVBq!ia0vp^en4!&!3HFQFP=LHq!^2X+?^QKos)UVz`*p{)5S5Q zV$R!{8?#;;h_wBW`^6->%=??eg4kVYFP5cWxDx99j7?u^%M8A|dotdpyqK`HLbL4| zrxnYl^i=`!2g`T39O=!UJZHuB?FDumM<$h8{HrOMWTBpWds_nEv+L#RAA%DLT_R)z z#oSwt3WAvvFUP9y*}wmPx6ME6bLY<4&3)dbeCScf1`8#fK8|i=W|7rgzsCpf-o0zS z?9*n8n>8hNbN#kI`RKo{u41(i(5y+F)ipIO0!&UEPb&EsG)@=2|5`auzU1FN!|OYj zsCDjGmbqZ-v7((W9E|4X<^oP{_S&5HhL30?p(esyk_f(O*{++ zQoS2u^uEW%i?D9FrWy2876GMow^MA@TMi^`?0EcI?uLnPdfmo|Bai#9E}7Dm?4@b( zJfY`im#<>y4xQ5iP7PCp&h1>=y<*j>&7$g)J@fsIk3IPGNl1|;BHK`||KZ+#+Y1uS z*RO}S2mpOiVRP*8VP+?e8E4bxt_t^BxbF2@nKfHE6cbFOWJ}Ll|1Y*^S+(lH-s1%p zErx8XufAIFENAV}uU}0Y?2CF0E9&a{4B46;@B9l751$ZpZ0G0CpV!9x(y|iu)XLku z>)O@ywXMbLE`R59^_r=)S6}hw_Z|JV$+g?>-@A9h@b#`^M~@y2tgID1d1USHi?dd( zQds)t%cQGWqW81c23{{sx8A#F&ynw`kxtpQCHk)pSNAW=?Bl+aS5RGjyH2HL!{?`S zvYk2BPT9nIfhl9@l)1&vK3C3RzF_ry+qsKT$1AgQW$yQ^-kP^|>)eRVH`f%~%s+3P zeQo2M;=Mb+?kzj$@BWX;UiPOFECoIMFVj(C7yA2w|5a!rfXTp;S;}+qgk|#UFjLbf Z>AtH^Vr1<8tper&22WQ%mvv4FO#mm=gNpzF literal 0 HcmV?d00001 diff --git a/screenshots/forms/select-rich/disabled-option-opened.png b/screenshots/forms/select-rich/disabled-option-opened.png new file mode 100644 index 0000000000000000000000000000000000000000..da9eebbefdcbf737301deee260121238089dfed4 GIT binary patch literal 4376 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 Qjygcv>IRSM9@xSE0T{`X7XSbN literal 0 HcmV?d00001 diff --git a/screenshots/forms/select-rich/disabled-select.png b/screenshots/forms/select-rich/disabled-select.png new file mode 100644 index 0000000000000000000000000000000000000000..7a862a8c38043f5a66bc4a86f6be109c2975318b GIT binary patch literal 2405 zcmbtVd00~E9zHIOtrD%K8TTfccPgtJMuvz@E@5e#p^0LnlWR8<4J1+Q*3-~6@yW8q zwI{cXkhtWEfTrn~xs)+3g)%vY3yMaHDB=B%&CGxE&zlZzoK;h0E}W!czg$ywrw1Spd~1x>j9tm>@j)!Ve)A! zvx#EfGuUNhY|;c@&?N*rk*@`0iV=c_vySQUG6WoRLHZ^~k8{qc=;)Rab2)r}eZ zm*QLDt9XLmJ{^P4sBO3kEa>It6HrMWC}3Zcr|1U(B<+H z2;O*5YnluII(Ej`1ps8X%jj<~uDJ)TgmLK+Xfce7Y=1j$C60LB+v{Ht(Mzv+9UhQS zE|F|PBKbj5N$mGoSy?gh@fO>*ZNoR+LSM&5_ceU@5d3y@Dw@Iy39;d%rOlPH*4O_G zCjx258lekk&u+!su;`1M1+bx%iD<0mtb0?TaqbZ_6 zH~JZ0eEAeN9!aE`6E7!so@x!LWHLF1$;>7IOlfXzj-MJi<*H98pa%zU&c!FJ(`YouOMHUqbZmKf z`6sQdt!=3_s*Qv4Xei5X^bN#co10Tho8G?;(Nzvw>=B*WoK`kkciP+$oJ z6cQQTFKIP-cJ3UAjri#eCKXKtz4-NjqPyF#{TnM{dP5$|aR0}%pk|O-Fv$1Y49_Qg zep6@h(SfPaF2=;(Ax>SA1E0rxfnw>A8J=5$l=cp8t~CseEy5Iw#pZ)##FRAmd?Xl7 z=5;uuUC$DhK%JP@`ezv#8GdB)sAY7;yVvLT=2Q6ev7cJ@Pte9cjrx3>@hR}?)Fr&R zx%mf$;z5|*bXO3|Ewe~aUEMpSS4-zPG?Dcf4c8y&2L?#uUL5nUdFe_Vep$VhnBG4?zeRCqZ)wN=i!Nl`=Fj7>s+fWK%3iWz3R*$EULSO~L$^J+~G zycTbZ17ieT*o(z#!a(i1-F@t#$bHnfxHS=(6kMs(qmNZpRe%9HztE77fvl*P&l}nV zp~Cy>M=B;Q>%tm%AeR_a27}=k{#;hHDaW($L{eH1UsvY8V`S+9>u z{Jhq@`}eO41OkbsyrLpHu-+>Q7RK5Ti~Uf5pC3C7MQ~3?2mZYqu&E|~a4F*FJ5RZ6+o}p5y8it0#Z*Vw`&CSFv95QBXF;!{JGBY!aiHSkl z*w_f3KJ5_Zwk0g*_YL~;NCTfgW8PrI)46gM>|Q@K?f}*FezrLYnA(1NpZ3Fx6gIoG zgYVCCFYy_P><|crt0OYqGmDPf-_;~60;(RAq}$@mGQ7WdG$^dHQYuC5*|SHd1YM#m zQ~lRvH@En%XW<)7pNnW74lwgt9tCxCSD*jc6nzU#^sVPamRSN;0VRDOiw#to*Q&-P z!^6YfeSMsPfdT#Lb;hAl{Y5S6$;p`PygaRZ!#&X9n`mN}{qG((IL%lm_Z)xcou8kN z&qGj8#&X{61JlHKMawP}oG6J)te8W9(8+mq`4}Td0zo>hBAbW-9WAV_&zlUqdUfPR zT3S+O&(gG)sG(hNjr@WB#wpV+F>CCp6DW=~E|-UH@Bp)ktpKv7ZA!vK4_ zgMmFXK4gUyh{f_LCy~k1J*Fy|D|$05$lyBY>dhG_JW(=gFD)r40d##if3PZ`O}$n% zI5BZSG2=y%Fd0fZ{A()6E36^stJ|Shw9zlGOq0PU$f>}i%49(q<1GkGXvXkm?ocO2 z!qic@3A3<4GHXSbyVhv?_U%qzFSd!!*JJ$M>o#6b5Zr-k?-<|pQ{{U6~A!Gmm literal 0 HcmV?d00001 diff --git a/screenshots/forms/select-rich/interaction-mode-mac.png b/screenshots/forms/select-rich/interaction-mode-mac.png new file mode 100644 index 0000000000000000000000000000000000000000..550131dcb3f69abc5bed5df2895fb40bd98ad78f GIT binary patch literal 2751 zcmb7Gc~p~E7XK76mRf0)K`NV?Or@aE6pkQEQ<(?`7nCYmmOzaQ1cp@>3B^=J!WJqN zfd*kTLZz5Q3_%b{unMVFi9kb)N!V9IfKZb_0?E9Onf@_z&YUy-C->!j_uc*8-_1R8 z*#85wEoKk|eSqJO3xXh1aD)QZtp&fM_KP8atV#~@_k~zpHd7E}b^(vudn~0R;MvxcUp2{(@Px6{e%*(1$QhItZ7I|F zHGoiTHbJWa{et%1zn`bBhnz|SEX=YUEX=y2+?s5}vAa2m*}mICn0-~2I+lpUy>ra5 z&DjK&qWO)sYVb0`{8V)GC)>Bj4e;8=nzOUBsZ=X_`yw>{*2$eSM{{Qh%;5ZM*RB!D zR%|B6i9;y@fq+3^r-hroCUJ+m8U9C|%e0Nn%b$6B+l-8i{2^V&GHLJqF;MX8)e-S= zN`8KR;<8Tdvui!9I-Sf;S@+B0?-M|dKSwg%oHf-`V`XC_bIT$|w3E1R68XXPXS7WU zepy#9iF?25%2b$$l=7T+S*d;avbulZtz5ZmJ~2Mtbk`h~x8WzT8H7L}7-7zW8(wMm zV+#F<&y^haI2lzUk?b!<2L}hAN=o|dee)P@$kO6O^))mejo+xwXp8x!FLw9HZ*^ZH zk=;5NNf?M1E39QBz8KdMMr%!*Ju5t3FIt#n6y0A$-9k;)2iL2Ha_s$z(HK`( zP8}k$CMdU}q5^2?6N^WBY7R*4F2QMm5Zz?9zFn;lk4#HAiDSQ(I+O+^>NU#pii#;u z&Ev}mq$+TKx@KB3ol!5!13^9+5g}yNY?J%d1bqT59tLJL@OX9|r!ZcTr$LqiYJzY$ z8*G+0xmFU}IXZe;Pzel%?Jo2~>GXQ9na%kfaQ6I*?9K?q3iYHyp|~^ltYk;{2~XIh z_Py#5CkVCu{q`AI%chrSU1|1M-dHXlJU7es^}aBF8#PTfEG=4JZ}pOo2gWSvXZdNF z#@{D|#Hc8TP@nRwt2sFX_%_(PIo6|8$O?(^^0F=|DM=jZENo613lL+N!A@OOKGsf7 zPV`G0gTX*e*X|wcBxECz0-CMjP6PdX_Ez}4O=`RaM0k{r(R;}+wU)Y#l6CK*Q<*1s zc7lrOle&PI_usBO)I-Qt{_eh|(4p)(#>1nWd1^@`jpyi5DAZB5m=RQmt2>sL)FM;A z+6W8vIB51P_@&nHBlyrpD56r6S}N6QI-Qb2M25IE+Ua2Dv8<|`E){|N~M~f zt*L=)uK<)?LyxmkC5{`B9XN2n)+p@i>MX(<%0(V-ZWfz1ZIbrcsf2I&8oP_p=It6x zw(m{Gb=xe*6}<_d_23SnJW&)jK`Z^0bNRozR?~mjgwU43wNF`!vDuS!Tl`n}>72_c z)2;B~|L*cN6qx-_4~e!ED1GSXY>$k0QJRV$e#oOzH@gtdhhf40yDSzj<*^(leM?gd z;6BzXj<_uSCiRE+VO<$FzeD5i%PA+=1f|Eb`T3;GC6%C|smXGdZ_E<3)z#I3GX6^T zFh!wsl%wkF>l4RcR8Xlbb<+X9`0&gC-`>Q;q&35M4dtJD!U2{z{jEuhX*!AY_6GBg z*M<4h-dRiOCy0o(Ylmem$x_;$v>6%e2^Qvj9glE^!otG~**x7(;xngN;jNlrEgb8A zlx1v$YJC=Zguo))5@&3;yox;hG}p@3wvbBg?(QxJUM?;!9unRba~N(=w>pDNxvm)`FV3IAE%AkfH~zD# z5drMgUF^W*WYodHK!4oRckj+W%3S=cwzl?u)n&fXK=!ZZf$G?CxRT1{a;Im<#>NhP z8=jG{KP1q-%q60W6m?E*4=X~*t5{H2XlOpTP0j4=?DXuEwWhIA2d%BFs0|Gb3kLmc zYu5!uAG0|_O)4lX?ATGAxeX|S) zKla?#7`luA{Ow=ADzT&R4LU__4BL8gm$S29M8rU-2+lZ>NR;ILtZZbjZq&iEm-6J) zfJu9dnAHKI@j@s(C(be~POzNbz7aH5ulL4c`RBHUZ86j!Xt6uOO&8SS2)>#O8x@JQ zC`RL(tmoc}>i@o@Ibq0Gppl>7C(qyPvfI{denB@wp4XV3wz6F>2#^iy!MZ0H?lUKaLxpn0U~}FG2a! z9;rA$DKz)6-xHFVM?=kY=0n7dl@6sW{|4NJzqT9F*<#b_+u!7?IOl}JeauiF)(YZo zDEeE2sYhV!DtM2G#7b7Lz}Wx9;WZS%_UAkFFCZWp;V`sAb8#nE{U_E-G0
8OLn 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 F{Tp69eL4UD literal 0 HcmV?d00001 diff --git a/screenshots/forms/select-rich/main-opened.png b/screenshots/forms/select-rich/main-opened.png new file mode 100644 index 0000000000000000000000000000000000000000..c5e3fd0238d0c91802239c3a1d598c42e3f7ff80 GIT binary patch literal 3361 zcmaJ^c{r3^AAYoG7&6w7$Sylcl*rhVA%(0B8DrlK*(Pfl+n0R_*@~EAX6!|>8yZ=& z49aUK#MqZ_`j+ecuIqiT?~ms>=RD`PJ=eLf`~IC6BbW{&JvTi70E~LNn#R=8nfhda zXsK_8px`L#K;vVq0|nlF;aQ}98rRcQe-Q9;H3#i@ah|KA$zq@i?P|R`44d$kvThd2 z(b9coq~wva5=j-98%yGqgmh(oqCG@%sD1r zE3=DFOn(JlBSSef5KN62fR6%0zkCx5jNuvaFWa0 z!g~Fqy#hqs7i}QRV9|HXSFPQJi|DW%F{Yn*e|+&)8q^$G$&T=E8HA9d7!I~X;!|%E zkrDzBP{uoCkH&l3iRx?Tl80zd-B|^V9tB{c42Mp9Dl3)kHEu?4zGnie&R0&B+|fXyxPsj zIadUg?;W3F9FrIPE9Qzpk`VFmtK;Cd#jNqrb=IvbjlPRXiw|{l&I##3WjR~lSvL@T z-;aRxlBQ7&RSG61{CY_Fa|}g*`<~Ha4ni7T&Wi3i>&ryhWj~ ze+V@+WC9k#)0xx`Avj4FCZkcd<%`04I0k|8UzMSl)g9KD$l}uo()H~lg`DjJS6P|} znX6-+w1RM+VE(u#=Hu}+sdE329ZvkJUFKW3hX1VfoHMHR^p9f6-&p+(W35NsleJ!j zyeL=htgI}a98rsZ!TA3m{Ld|D8`RI=zp$>(eB7>*6PO;Wa;e{%n{(*t?KN@rlV+OYeKDNxv3T&p)4zL;>8Pw8^wn`a&mHEM+ZBC$z9WvL2E;oV%zL$11aLP=gvvs z33sUewri6g0i!+}j=)E4x+2Nz0V=}QXpN&D=GZpp?Z}@Kb*#zB$-=Xg0F{NMC0y^o z(2xmEH?_|b+Dr9?!{Hx$`;@%@(ADZFYpVxog`6Rah=>5?sA~jEXAch@F}71cB$U6^ zPL6?zDf>(Qd}U}jMSbuY%HQ8|tYzQ)vHo^|%KE|4SyGvq%PH|gbjpkE?d|Zzm3U*m z7o>Tb@;#a{k|7LcN3AmJ1QZ2*-Z29_4Nyr4R!w{;`FgLFm@cz?2%8rN(_bQ6Qhm@N4gbJNQ{ky$X_)J47aQ%&05zw09+og42|h zlt4{WiJnSv$lNEifali2J>b*su96BbQ&Lw^S{_CHfos`Q+u&dxs%zWc=DgdQ%lwy| z*QO?<;WOnLBQ+Hj@H^x6eiH5N?cL&UGLmJ^Qo{wP*ceZH@2=aDLvLBKR=`x9ot?W= zOx@cO#xCf3x)##{y?&E0l*xaM(sJhe@byA#eBR|?YsiDGK^Kr_qBi0R8+MOL^ z!Ac)h5puAdR9~Wv)cBYQ$tYdgDY57yld)Qn@mpUiCOyAW+=MhoYMPnc7^b8s> z+=#d(^OzVhd^Kq_&32@q@kl=E@SLHtq7nS{Ud+9Tz3F5`9&)^(G1DUCe#pFGZo742 zBSy*~Q3>y!jQ5`5+ua{v-QAAeS??WmNr=QTinv?n(E|L&QLavbXZ&yNiv!ccy-#!y z-{`eWkFnOeMqGsRUFh--rZN7{KL3@OZjNquO180srnD(a$}H}CCN2tRaTNW9u=1ch zu$;5ys>$-c4f@Cr__Vb}DBQeXnzE|$Bm2_#LZy6h=&ZMLE!kZ+$=>2V=AGu_*^YA4 z2Z&YpcertF7<5aQR1sFDgxBkhkH~Kr1Yo9*{BLtDyhZ%WN zWx-h|a}=wM9>zPP5tcSVqEV%>;`YhP$U6i8_}Td8>=Ju8_>DkkD8-P6vFV=Q z<10+73r_=!2~)ltbI6V0Hw_NegR#*I`_eBlgDXyGN1bzD#1^wstPO{)OQQD7ThZf9 zlMV_he$1GCP`!cm0~+A|1rx00jfyh%%CO78WkpD9)O}{LHKxqp1gHA!H^DXb&)^Bq zDEJS%SPU(k_nS$;v|#Z)JP$J z@75A)Q%1Hr+W$>yursOC*YrTe?_L|#I>$``xH8mnjh?-#|aP2018j|FpUAOr2;nI)7 zxf6F@DNFY@ba_HSou8!^D()`wyPCAdv7ZO^AhdgFTc0$voZz)1FmqXNsV-O75Vxq@eyf#O(1NFGknWkM6(EM?&qS-!|aQxMX zrmsKw*$f;TD~4BgV>f9s5MUFg5~HofDX|9vgZ1d|>?ztUQhT3J*s4%uCo7{UTjG@0 zQrN=&{{RrG*W5~~9vO@4Z8l?nDe-qo-OX{w#Du7fD3hyk6=De^A#a5{;*G0~s4Y-E zSBsEdxFm6`QIh!3#s+17SBOO&-NZR#2Ga2$#pA7TTU%Rj2Z#0-avcfSW24=#I(*7E z(1Q0-u{c&bz{0|U(8Y3gsL-J~l5B-*hF84ZEcT#v7D%D4-o6#!j(6@j6$ZfaRIR~R z71^#aV{-I|XT9_BK7J4SdU_Z>*vKpda8r9=M+FNot0K=e=5BXsbGX~+^P0&(Fi!Hq z6$4;USFEAVUhoBoH+0t)0`2QJ4v4G$bk`tqX=w?nz}?o@H`X~aI%;0BwDbu1O%JUl zW+MQbzm1rWD86`;t76Cs=L?0)`t<)e@#*U)!RLy|y3dsn%IZB=8tDFP*5MK<%LxuZ znZ#AFc*HP2cEG!meQCSFY~J;d%F_?MY6b9cH#%=P7DjASR5{ruvi;&yneDluuAY^5 zDDg9RItE9=v(rChU(PO_`fhqG--&&H>0)iBS4b0G&2_bKzMoIH{8iSA@bVZsVMhkd g!H&ON79vk*pu{V9S&w!}>YWGB(}HQfgTllA2@R5R0RR91 literal 0 HcmV?d00001 diff --git a/screenshots/forms/select-rich/main.png b/screenshots/forms/select-rich/main.png new file mode 100644 index 0000000000000000000000000000000000000000..848b1e3c149dd72c86c724fad90c662d147774ba GIT binary patch literal 2456 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 BOvC^H literal 0 HcmV?d00001 diff --git a/screenshots/forms/select-rich/many-options-with-scrolling-opened.png b/screenshots/forms/select-rich/many-options-with-scrolling-opened.png new file mode 100644 index 0000000000000000000000000000000000000000..a55ccaec318a9541769cdf15822929790672c3f2 GIT binary patch literal 5189 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 literal 0 HcmV?d00001 diff --git a/screenshots/forms/select-rich/no-default-selection.png b/screenshots/forms/select-rich/no-default-selection.png new file mode 100644 index 0000000000000000000000000000000000000000..c58c17a52df86bcadad8327277b9971b7795a615 GIT binary patch literal 1838 zcmb_cYfw{17+rh-0)nWG4Du9;h*6L#pdcUy11d-Bz=yW>MnNG()_k6qG_w7A<&h8e5 z1fy3Pm>U29Rt5&3LIGF~g-DBL`+U?zw)K=d-@m_Q>v7A~sDK`0|BDs}%I)>fOc@6F8VPp=l#4re_+1@YnR>pH zSG70Mb$<0!oa58HLY5El(DoeTGLvO*i;C38YWqo8&f%AJNJE%{P2l3)G#xl%E|`KP z5c>YM3 zVdxfmQNqsin|FJ}m;0koRbiJp(>zOq!zetx<7?oGq+w15&~8E}ql?+2ktBEu~^;ldIM2bZcNReA3;ATx=}pds95z?s+yRR%2?Uvsx^enWywU=pYVF3g9J_bN4 zm6D@&%jCR$&hvI#hGE8)7SNCt9lp zT3cJa9((QFSy)+FsdFDWY{Vrocv(%vU=7X!kP2(m~KZLq<)IikIDZf;J%(97Sm-JCF{RI3E> zyUVHCpaMMtThu3cBE)WL>qiOZs6AdWBVCSDu2 zBqk=RYKH=YgM+sccISNjqk44IR{XORlX^F0O086oSWd;Si)Z^M=jsz-vzdFFu)yP0 z3SY?Oaw|I^eaN9zC_07+onXmuW#}fS;{C`iTSiaPG0t#jj5z2DVGqn5YZoiF#6kN? zsP8MrHa0X=2$P6u-rgP_O*8rmiR28bEu!mYvgn!rlipOmHSCqiI14&VA!fRRa(j{cQk*;bX zkNn0Xp+4$1d(>msuJ2=O&HDTMzozh5&F`zJ)F4eMjYcC$jPqMUtJVsW+}+&VW;z-g z8fI{HQB>BucQJ!wCo|D8G$BWd);!Caj%^onLrh_252!Z?=`=V3w_JI4OgLbc`Tyg= zuo7;62i*wU@us(s(Fgf@P!(>`)f2!<+QcmJg#ZMUfK@QAb^yyDz+GPPS<>Ga0_cR8 z6Rmxo@#Mqp#I7g={Ff$H_Yx+*Cc1rme4H>Fe&opTf?D}kE{q5mS;{0QEL@6{l_Y?s zy1EOKTbVo_FCsGXN69TX!QAm+aM?)fRg)vRXOy3e^7^$(57$xVLu^bIVayxVCUBY6 zVE0lc9?#Hzl)o(z=D}0b(^Fr9mL|i_DIa)PLdaSH>{uB(eG9NO;K}>3XI5U#e@hzz zI|tG7PtUN|J-<7rd(+l%Iy$T$-6@nnC#KmO?$VHi{gya5VorP>?Uwk$tNp7n1xR*X jpHHyh@;dFsj<`#CLxJX!`w< literal 0 HcmV?d00001 diff --git a/screenshots/forms/select-rich/options-with-html-opened.png b/screenshots/forms/select-rich/options-with-html-opened.png new file mode 100644 index 0000000000000000000000000000000000000000..d30eb671ec0697c5d87e9aafeb02bc81a7c65fa7 GIT binary patch literal 7879 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 literal 0 HcmV?d00001 diff --git a/screenshots/forms/select-rich/options-with-html.png b/screenshots/forms/select-rich/options-with-html.png new file mode 100644 index 0000000000000000000000000000000000000000..ade0b201f9b03b18c602baefd9b25b55237deb42 GIT binary patch literal 4152 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 literal 0 HcmV?d00001 diff --git a/screenshots/forms/select-rich/read-only-prefilled.png b/screenshots/forms/select-rich/read-only-prefilled.png new file mode 100644 index 0000000000000000000000000000000000000000..2d51299e9e4d7ca57adf66dd046622aea54556f0 GIT binary patch literal 2742 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 NcNa9O(K+nL{{W@RY0Urt literal 0 HcmV?d00001 diff --git a/screenshots/forms/select-rich/single-option.png b/screenshots/forms/select-rich/single-option.png new file mode 100644 index 0000000000000000000000000000000000000000..851eee2aa43f0877bec247ac6bd5719447de3c36 GIT binary patch literal 2264 zcmbVNdt6d!8a_C7Qxm&^qJ^V&(^6_G%@iCX2`y@@E%RF1GI;~FP0b5v?FQtn!AKoK z#xb+jlKd4am|&wtDtx_5ra@uyq z7{Sf3BJxIu1fhwXaHh?Ia%ka56>g_orLP>8=+zw?s5utE^l1V;1 zY-xq@Ht~TLFEKEC2+tP-RuJw!0<474W(!~nLYBokzyw5}YpVbli1y8jb)lsm=OU5P<-py3!5imF^WgpYLL{|Tk~o2pWa@7Ju=a*n{nG<0@4SC zgyhhqxTMU)#9a;!>XDK10UZI$N2g2DXGZh9H$gPU)h~i!K@U$2y(--5sCcbPy4k9_ zzy8vhtIzCDojzS2F5siO|K`kLGE=8N_XJH$r8NeHh4C)rL1)LXU>exeG5gxu+72VV z(q{U-t;O;+YuaOkgX%VJw3{^46`AK3HSA8%n_1%Asr_D$^UE*t6m%+`j&pFR4r@sM z&5(gbcg5_b8KxA>*$AApd;+fdnB4FwdBnHO3QWFIq8sBCyh~Z=#~IL&S4?!&vMg27 zex-j%RTpXU7fo^lR3I8v82n9DS7dCgi^MpuIm~wQYvHlBP@>l=v zia~u0YfQUzUIM1xQWQZep-IzcD4$11OXn7n8+g^eKdX|Wfte9Lz0^8=;mpW(M2;hD zU@VN=rY`BF6-cQq4QD60R0&av%b3N0d|v6(aSs;1fE?dF_xVH?18kT$Qdh~RiN~%| zmEyf?AH`Ft1*TVITCMib;~u;H?e0YO3B8qNvk=@lF@myKULzD<8l5om50d1;&u8XF z_%g0L^+o9lh;&Q*10bQ>MR)I9L{pA)QESc9r?;y=_JY@x0Y{haH@+9fe!DzPrka?$ zr_j{Y)+WbzC@6J~4uk!T>EFu7X9nm5Vem%H<%9HvaTzO?pE=#LxOa*9NJn=_RsmW* zKK!Z>Jd30yRCQessiRc5%*lT{N>fxyX_!b*5A21Bc%cXy}bNZFX)zSV&TaN$cBvEME z!*D^R%XI#x>tM?U+sg^#%9Mdac)V*-4yp31q(xP0QB7SPQW&gldHj7F`J^*vPd%5< zFCbMGZhEonzyYq2a{2Q9Qfy`#S^0*KJ9bR%?F?2^rqgOGqPT5jabtbZj=RDXPu@CR zuWqJuF*5as!z~S^SLQOXs60Qha_+%m)T{+m*y1~(NvBZz{{HZk3j&FhNw7zo3$qy6 z8=-IKpM#~@dS9X8iRY>HnTRF(T=-f5k@Nh*KJF)ⅇ_FoN>1Q^x~xkWJL_SR7c2pfx%Rj)blFvtK{&}7`$*#xbc^k4otUHhxDSY!zx z5r{}KS^f5nTrRH|G5*RxyM{PG&NH64ZUiWCaV=^!8IOOOHsx#yhYyX7VVpVsH~lNj z8CmA$=IxX^w~!@G%6NOXcG)c0FHlM}Q?8Txyu7@7C!Gs-tb)j}o@xJ6=A)YdFAoo9 z;QjSrzeoE-7YF+ZcpymEVb&Ui0r{s%U;Wca)wyzx3Hg+hY+K!MiZVNqd{#38>20)b51Ti40S zJgC>}Yb27=YQT;LT1V39^o|P1wuwM>_6Br)qICfQ0f~!7!*`m~g7CZn`l8|Ifkv7k z4W;_sEHJ*>d{H}fNc zgRjd9(0ps@lPBv15z>4&$?RZ@|4*Hvq9hes2C+8D)E%%7(trIvLP_7hN1TPWKQ#ZJ z;rUlDnTZcX|HtSKawW2d4;x>$b#^X0sUuv7?2SUO@p`oFwB6C6AzK_)xKx1 F{1=Z*)+GP{ literal 0 HcmV?d00001 diff --git a/screenshots/forms/select-rich/validation.png b/screenshots/forms/select-rich/validation.png new file mode 100644 index 0000000000000000000000000000000000000000..33efa904c79a2183539d1bf1467b6135ded473ca GIT binary patch literal 4531 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 literal 0 HcmV?d00001 diff --git a/scripts/screenshots/bootstrap.js b/scripts/screenshots/bootstrap.js new file mode 100644 index 000000000..9e867848c --- /dev/null +++ b/scripts/screenshots/bootstrap.js @@ -0,0 +1,5 @@ +const { createCapture, getPage, getStoryPage } = require('./index.js'); + +global.capture = createCapture(); +global.getPage = getPage; +global.getStoryPage = getStoryPage; diff --git a/scripts/screenshots/index.js b/scripts/screenshots/index.js new file mode 100644 index 000000000..5058b6372 --- /dev/null +++ b/scripts/screenshots/index.js @@ -0,0 +1,282 @@ +/* eslint-disable import/no-extraneous-dependencies */ +const { chromium } = require('playwright'); +const looksSame = require('looks-same'); +const { join } = require('path'); +const mkdirp = require('mkdirp-promise'); +const fs = require('fs'); +const { promisify } = require('es6-promisify'); +const minimist = require('minimist'); +const { mdjsTransformer } = require('@mdjs/core'); +const { createConfig, startServer } = require('es-dev-server'); +const nodePath = require('path'); + +const access = promisify(fs.access); +const compareScreenshots = promisify(looksSame); +const createScreenshotsDiff = promisify(looksSame.createDiff); +const args = minimist(process.argv); + +const DIFF_FOLDER_PREFIX = '.diff'; +const CURRENT_FOLDER_PREFIX = '.current'; +const ROOT = 'screenshots'; + +// eslint-disable-next-line no-unused-vars +function log(line) { + // console.info(line); +} + +/** + * @param {string} root + * @param {string} id + * @param {string} selector + * @return {{file: string, folder: string, path: string}} + */ +async function buildPath({ root, id, selector }) { + log(`Building path for ${id} - ${selector}`); + + const [, category, component, file] = /(\w*)-(.*)--(.*)$/g.exec(id); + + const extension = '.png'; + + const paths = { + file, + folder: join(root, category, component), + path: join(root, category, component, file + extension), + }; + + log(`Path is ${paths.path}`); + + return paths; +} + +const PATHS = { + root: ROOT, + diffRoot: join(ROOT, DIFF_FOLDER_PREFIX), + currentRoot: join(ROOT, CURRENT_FOLDER_PREFIX), +}; + +async function start() { + const config = createConfig({ + nodeResolve: true, + preserveSymlinks: true, + rootDir: nodePath.join(__dirname, '../../storybook-static/'), + responseTransformers: [mdjsTransformer], + }); + console.log('⚠️ Screenshots tests are made with builded storybook'); + try { + return await startServer(config); + } catch (e) { + return start(); + } +} + +const serverPromise = start(); + +const browserPromise = chromium.launch({ + ignoreDefaultArgs: ['--hide-scrollbars'], +}); + +process.on('beforeExit', () => { + browserPromise.then(browser => browser.close()); + serverPromise.then(server => server.close()); +}); + +async function getPage(path) { + const browser = await browserPromise; + const server = await serverPromise; + const url = `http://127.0.0.1:${server.server.address().port}${path}`; + log(`Creating a page for ${url}`); + const page = await browser.newPage(); + + // eslint-disable-next-line no-unused-vars + page.on('console', msg => { + if (msg._type !== 'debug') { + if (msg._type === 'warning') { + console.warn(`PAGE console.warn:`, msg._text); + } else { + console[msg._type](`PAGE console.${msg._type}:`, msg._text); + } + } + }); + + await page.goto(url); + await page.waitForTimeout(500); + + log(`Page has been created`); + + return page; +} + +async function getStoryPage(id) { + return getPage(`/iframe.html?id=${id}&viewMode=story`); +} + +async function getClip({ page, selector, endClipSelector }) { + log(`Getting clip for ${selector}`); + + const clip = await page.evaluate( + ([sel, endSel]) => { + const el = document.querySelector(sel); + + if (!el) { + throw new Error(`An el matching selector \`${sel}\` wasn't found`); + } + + const range = document.createRange(); + + range.setStartBefore(el); + range.setEndAfter(endSel ? document.querySelector(endSel) : el); + + const rect = range.getBoundingClientRect(); + const margin = 8; + + const x = rect.left - margin < 0 ? 0 : rect.left - margin; + const y = rect.top - margin < 0 ? 0 : rect.top - margin; + + return { + x, + y, + width: rect.width + (rect.left - x) * 2, + height: rect.height + (rect.top - y) * 2, + }; + }, + [selector, endClipSelector], + ); + + log(`Clip has been retrieved: ${JSON.stringify(clip)}`); + + return clip; +} + +async function getScreenshot({ root, id, selector, page, clip }) { + log(`Making a screenshot`); + + const { path, folder } = await buildPath({ root, id, selector }); + + mkdirp(folder); + + // Remove caret from screenshots to avoid caret diff + await page.evaluate(() => { + document.body.style.caretColor = 'transparent'; + }); + + await page.screenshot({ path, clip }); + + log(`Screenshot was saved in ${path}`); + + return { + path, + }; +} + +async function getReference({ root, id, selector }) { + log(`Searching for the reference`); + + const { path } = await buildPath({ root, id, selector }); + + try { + await access(path); + + log(`Reference is in ${path}`); + + return { + path, + }; + } catch (e) { + log(e); + log(`Reference was not found`); + return {}; + } +} + +const screenshotsCompareOptions = { + highlightColor: '#ff00ff', + tolerance: 0, +}; + +async function invalidateScreenshots({ diffRoot: root, id, selector, reference, current }) { + const { path, folder } = await buildPath({ root, id, selector }); + + mkdirp(folder); + + await createScreenshotsDiff({ + ...screenshotsCompareOptions, + reference: reference.path, + current: current.path, + diff: path, + }); + + log(`Screenshot is invalid. Diff saved in ${path}`); + + return { + path, + }; +} + +async function validateScreenshot(suite) { + const { current, reference } = suite; + log(`Validating screenshot`); + + if (!reference.path) { + throw new Error('No reference screenshot was found.'); + } + const { equal } = await compareScreenshots( + current.path, + reference.path, + screenshotsCompareOptions, + ); + + if (!equal) { + const { path } = await invalidateScreenshots(suite); + throw new Error(`Screenshots mismatch. Diff saved in ${path}`); + } else { + log(`Screenshot is valid`); + } +} + +let updateScreenshots = args['update-screenshots'] || process.env.UPDATE_SCREENSHOTS; + +try { + const avaConfig = JSON.parse(args._[2]); + updateScreenshots = avaConfig.updateScreenshots; +} catch (e) { + log('Could not parse config'); +} + +/** + * @return {capture} + */ +function createCapture() { + return async function capture({ url = '', selector = 'body', endClipSelector, page, id }) { + const suite = { + ...PATHS, + url, + id, + selector, + page, + endClipSelector, + }; + + if (!suite.page) { + suite.page = await getPage(url); + } + await page.waitForTimeout(500); + suite.clip = await getClip(suite); + + if (updateScreenshots) { + await getScreenshot(suite); + } else { + suite.current = await getScreenshot({ ...suite, root: suite.currentRoot }); + suite.reference = await getReference(suite); + + if (suite.reference) { + await validateScreenshot(suite); + } else { + throw new Error('No reference screenshot was found.'); + } + } + }; +} + +exports.createCapture = createCapture; +exports.getPage = getPage; +exports.getStoryPage = getStoryPage; diff --git a/yarn.lock b/yarn.lock index 0e50d30a1..8ab2cfa3c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1651,9 +1651,9 @@ integrity sha512-1HpblP5edeENi0SKms7B+PKYdxHMBIQpaf0nAgTVsZeYgM9OJ3r9nrK/0MOUBZODAOZ1quvO3wlpuljq2hZPWA== "@open-wc/demoing-storybook@^2.0.2": - version "2.3.13" - resolved "https://registry.yarnpkg.com/@open-wc/demoing-storybook/-/demoing-storybook-2.3.13.tgz#d258c3d09c4fb4fd3f587d72cf40428792c72066" - integrity sha512-zQ8HJs4DmyStRA3rOlTYyvxvJnDCi41+xRGLVwEyRZ+/bN+rChUwUz+A+2i9qcuxmc8Fkw0cvPJtak0IwDAmkg== + version "2.3.14" + resolved "https://registry.yarnpkg.com/@open-wc/demoing-storybook/-/demoing-storybook-2.3.14.tgz#a99c4f1709bacd14a69bbd3669d4ea1ad4e22920" + integrity sha512-UzgJXuSSywfEJ3lmBmldm9MEiP3XGZ8m5hRfa7dymGqOAMXMHzQaS5PAmC5RdPIcLtUmd7CeFW3feDBadTr0wA== dependencies: "@babel/core" "^7.9.0" "@babel/generator" "^7.9.6" @@ -1671,7 +1671,7 @@ command-line-args "^5.0.2" command-line-usage "^6.1.0" deepmerge "^4.2.2" - es-dev-server "^1.57.0" + es-dev-server "^1.57.1" es-module-lexer "^0.3.13" fs-extra "^8.1.0" glob "^7.1.3" @@ -3812,6 +3812,16 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" +color-convert@~0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-0.5.3.tgz#bdb6c69ce660fadffe0b0007cc447e1b9f7282bd" + integrity sha1-vbbGnOZg+t/+CwAHzER+G59ygr0= + +color-diff@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/color-diff/-/color-diff-1.2.0.tgz#01a7c806de47dbd5ae571da49e65489666c999a7" + integrity sha512-FN7iLBCfb97ElJU2AQXbBAFXPbKmu0XJjPU9GWWmUkIbXka+Im8Q5w1geiL9GB+AktJ4pIA6nRZD1+TlEG6/rA== + color-name@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" @@ -3904,6 +3914,16 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= +concat-stream@^1.6.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + concurrently@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-5.2.0.tgz#ead55121d08a0fc817085584c123cedec2e08975" @@ -4047,6 +4067,13 @@ create-react-context@0.3.0, create-react-context@^0.3.0: gud "^1.0.0" warning "^4.0.3" +cross-env@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.2.tgz#bd5ed31339a93a3418ac4f3ca9ca3403082ae5f9" + integrity sha512-KZP/bMEOJEDCkDQAyRhu3RL2ZO/SUVrxQVI0G3YEQ+OLbRA3c6zgixe8Mq8a/z7+HKlNEjo8oiLUs8iRijY2Rw== + dependencies: + cross-spawn "^7.0.1" + cross-spawn@^4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41" @@ -4075,7 +4102,7 @@ cross-spawn@^6.0.0, cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^7.0.0: +cross-spawn@^7.0.0, cross-spawn@^7.0.1: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -4866,7 +4893,7 @@ es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.5: string.prototype.trimend "^1.0.1" string.prototype.trimstart "^1.0.1" -es-dev-server@^1.18.1, es-dev-server@^1.57.0: +es-dev-server@^1.18.1: version "1.57.0" resolved "https://registry.yarnpkg.com/es-dev-server/-/es-dev-server-1.57.0.tgz#79a30dcaec7a2cd0aa998baa572551794c21ef45" integrity sha512-vCQuXNir9L7HAxIStt2JpWHCKmudpSilhdLngWDbmkLDT+fAgy9YFLYRbs/ppU0VlrhUpjftpVvmEjRsFpib7Q== @@ -4936,6 +4963,76 @@ es-dev-server@^1.18.1, es-dev-server@^1.57.0: useragent "^2.3.0" whatwg-url "^7.0.0" +es-dev-server@^1.57.1: + version "1.57.1" + resolved "https://registry.yarnpkg.com/es-dev-server/-/es-dev-server-1.57.1.tgz#c6ed4d8f4961215ce9c50f3c58604f047737eebe" + integrity sha512-wdYZCVNdCJxM9Z8V+lAqw6XfUTQZRhjbkU4Fdk/UcZqB6gJ2VaaafdBBwue9L3EWu6zVJz63btpA4Xe+kVqGUw== + dependencies: + "@babel/core" "^7.9.0" + "@babel/plugin-proposal-dynamic-import" "^7.8.3" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-proposal-optional-chaining" "^7.9.0" + "@babel/plugin-syntax-class-properties" "^7.8.3" + "@babel/plugin-syntax-import-meta" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-transform-template-literals" "^7.8.3" + "@babel/preset-env" "^7.9.0" + "@koa/cors" "^3.1.0" + "@open-wc/building-utils" "^2.18.0" + "@rollup/plugin-node-resolve" "^7.1.1" + "@rollup/pluginutils" "^3.0.0" + "@types/babel__core" "^7.1.3" + "@types/browserslist" "^4.8.0" + "@types/browserslist-useragent" "^3.0.0" + "@types/caniuse-api" "^3.0.0" + "@types/command-line-args" "^5.0.0" + "@types/command-line-usage" "^5.0.1" + "@types/debounce" "^1.2.0" + "@types/koa" "^2.0.48" + "@types/koa-compress" "^2.0.9" + "@types/koa-etag" "^3.0.0" + "@types/koa-static" "^4.0.1" + "@types/koa__cors" "^3.0.1" + "@types/lru-cache" "^5.1.0" + "@types/minimatch" "^3.0.3" + "@types/path-is-inside" "^1.0.0" + "@types/whatwg-url" "^6.4.0" + browserslist "^4.9.1" + browserslist-useragent "^3.0.2" + builtin-modules "^3.1.0" + camelcase "^5.3.1" + caniuse-api "^3.0.0" + caniuse-lite "^1.0.30001033" + chokidar "^3.0.0" + command-line-args "^5.0.2" + command-line-usage "^6.1.0" + debounce "^1.2.0" + deepmerge "^4.2.2" + es-module-lexer "^0.3.13" + get-stream "^5.1.0" + is-stream "^2.0.0" + isbinaryfile "^4.0.2" + koa "^2.7.0" + koa-compress "^3.0.0" + koa-etag "^3.0.0" + koa-static "^5.0.0" + lru-cache "^5.1.1" + mime-types "^2.1.27" + minimatch "^3.0.4" + open "^7.0.3" + parse5 "^5.1.1" + path-is-inside "^1.0.2" + polyfills-loader "^1.6.1" + portfinder "^1.0.21" + rollup "^2.7.2" + strip-ansi "^5.2.0" + systemjs "^6.3.1" + tslib "^1.11.1" + useragent "^2.3.0" + whatwg-url "^7.0.0" + es-module-lexer@^0.3.13, es-module-lexer@^0.3.24, es-module-lexer@^0.3.6: version "0.3.24" resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.3.24.tgz#e6b2900758e9e210d23aec2092efc13ca235adea" @@ -4960,6 +5057,11 @@ es6-error@^4.0.1: resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== +es6-promisify@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-6.1.1.tgz#46837651b7b06bf6fff893d03f29393668d01621" + integrity sha512-HBL8I3mIki5C1Cc9QjKUenHtnG0A5/xA8Q/AllRcfiwl2CZFXGK7ddBiCoRwAix4i2KxcQfjtIVcrVbB3vbmwg== + escalade@^3.0.1: version "3.0.2" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.0.2.tgz#6a580d70edb87880f22b4c91d0d56078df6962c4" @@ -6888,6 +6990,11 @@ js-beautify@^1.8.9: mkdirp "~1.0.3" nopt "^4.0.3" +js-graph-algorithms@1.0.18: + version "1.0.18" + resolved "https://registry.yarnpkg.com/js-graph-algorithms/-/js-graph-algorithms-1.0.18.tgz#f96ec87bf194f5c0a31365fa0e1d07b7b962d891" + integrity sha1-+W7Ie/GU9cCjE2X6Dh0Ht7li2JE= + js-levenshtein-esm@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/js-levenshtein-esm/-/js-levenshtein-esm-1.2.0.tgz#96532c34e0c90df198c9419963c64ca3cf43ae92" @@ -7378,12 +7485,12 @@ lodash@4.17.11: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== -lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.2.0, lodash@^4.2.1: +lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== -lodash@^4.17.19: +lodash@^4.17.19, lodash@^4.17.3, lodash@^4.2.0, lodash@^4.2.1: version "4.17.19" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== @@ -7443,6 +7550,20 @@ longest-streak@^2.0.1: resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-2.0.4.tgz#b8599957da5b5dab64dee3fe316fa774597d90e4" integrity sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg== +looks-same@^7.2.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/looks-same/-/looks-same-7.2.3.tgz#ded12be01b7848591a32694a8fba48b41baba55c" + integrity sha512-e67WnUOWLpLC0+4iOsbtMx1eUBgyx7NDUOq8esSxaSO63YTwrmoppkia+9w9oR1W+QLTw4eTKHv2pVLkGdkVrw== + dependencies: + color-diff "^1.1.0" + concat-stream "^1.6.2" + fs-extra "^8.1.0" + js-graph-algorithms "1.0.18" + lodash "^4.17.3" + nested-error-stacks "^2.1.0" + parse-color "^1.0.0" + pngjs "^3.3.3" + loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" @@ -7882,6 +8003,18 @@ mkdirp-classic@^0.5.2: resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== +mkdirp-promise@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz#e9b8f68e552c68a9c1713b84883f7a1dd039b8a1" + integrity sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE= + dependencies: + mkdirp "*" + +mkdirp@*, mkdirp@~1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + mkdirp@0.5.4: version "0.5.4" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.4.tgz#fd01504a6797ec5c9be81ff43d204961ed64a512" @@ -7896,11 +8029,6 @@ mkdirp@0.5.5, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3: dependencies: minimist "^1.2.5" -mkdirp@~1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - mocha@^6.2.2: version "6.2.3" resolved "https://registry.yarnpkg.com/mocha/-/mocha-6.2.3.tgz#e648432181d8b99393410212664450a4c1e31912" @@ -8029,6 +8157,11 @@ negotiator@0.6.2: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== +nested-error-stacks@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz#0fbdcf3e13fe4994781280524f8b96b0cdff9c61" + integrity sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug== + nice-try@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" @@ -8543,6 +8676,13 @@ parse-author@^2.0.0: dependencies: author-regex "^1.0.0" +parse-color@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parse-color/-/parse-color-1.0.0.tgz#7b748b95a83f03f16a94f535e52d7f3d94658619" + integrity sha1-e3SLlag/A/FqlPU15S1/PZRlhhk= + dependencies: + color-convert "~0.5.0" + parse-entities@^1.0.2, parse-entities@^1.1.0, parse-entities@^1.1.2: version "1.2.2" resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-1.2.2.tgz#c31bf0f653b6661354f8973559cb86dd1d5edf50" @@ -8829,6 +8969,11 @@ plugin-error@^1.0.1: arr-union "^3.1.0" extend-shallow "^3.0.2" +pngjs@^3.3.3: + version "3.4.0" + resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.4.0.tgz#99ca7d725965fb655814eaf65f38f12bbdbf555f" + integrity sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w== + pngjs@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-5.0.0.tgz#e79dd2b215767fd9c04561c01236df960bce7fbb" @@ -9327,7 +9472,7 @@ read-yaml-file@^1.1.0: string_decoder "^1.1.1" util-deprecate "^1.0.1" -readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: +readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== @@ -10998,6 +11143,11 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + typescript@^3.8.3: version "3.9.6" resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.6.tgz#8f3e0198a34c3ae17091b35571d3afd31999365a"