@spectrum-web-components/vrt-compare 1.1.0 → 1.1.1

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.
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ import { OnionSkinner } from "./src/OnionSkinner.dev.js";
3
+ customElements.define("onion-skinner", OnionSkinner);
4
+ //# sourceMappingURL=onion-skinner.dev.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["onion-skinner.ts"],
4
+ "sourcesContent": ["/*\nCopyright 2020 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\n\nimport { OnionSkinner } from './src/OnionSkinner.dev.js'\n\ncustomElements.define('onion-skinner', OnionSkinner);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'onion-skinner': OnionSkinner;\n }\n}\n"],
5
+ "mappings": ";AAYA,SAAS,oBAAoB;AAE7B,eAAe,OAAO,iBAAiB,YAAY;",
6
+ "names": []
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";import{OnionSkinner as n}from"./src/OnionSkinner.js";customElements.define("onion-skinner",n);
2
+ //# sourceMappingURL=onion-skinner.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["onion-skinner.ts"],
4
+ "sourcesContent": ["/*\nCopyright 2020 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\n\nimport { OnionSkinner } from './src/OnionSkinner.js';\n\ncustomElements.define('onion-skinner', OnionSkinner);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'onion-skinner': OnionSkinner;\n }\n}\n"],
5
+ "mappings": "aAYA,OAAS,gBAAAA,MAAoB,wBAE7B,eAAe,OAAO,gBAAiBA,CAAY",
6
+ "names": ["OnionSkinner"]
7
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spectrum-web-components/vrt-compare",
3
- "version": "1.1.0",
3
+ "version": "1.1.1",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -60,15 +60,15 @@
60
60
  "lit-html"
61
61
  ],
62
62
  "dependencies": {
63
- "@spectrum-web-components/action-bar": "^1.1.0",
64
- "@spectrum-web-components/action-button": "^1.1.0",
65
- "@spectrum-web-components/action-group": "^1.1.0",
66
- "@spectrum-web-components/base": "^1.1.0",
67
- "@spectrum-web-components/icons-workflow": "^1.1.0",
68
- "@spectrum-web-components/shared": "^1.1.0",
69
- "@spectrum-web-components/split-view": "^1.1.0",
70
- "@spectrum-web-components/styles": "^1.1.0",
71
- "@spectrum-web-components/theme": "^1.1.0"
63
+ "@spectrum-web-components/action-bar": "^1.1.1",
64
+ "@spectrum-web-components/action-button": "^1.1.1",
65
+ "@spectrum-web-components/action-group": "^1.1.1",
66
+ "@spectrum-web-components/base": "^1.1.1",
67
+ "@spectrum-web-components/icons-workflow": "^1.1.1",
68
+ "@spectrum-web-components/shared": "^1.1.1",
69
+ "@spectrum-web-components/split-view": "^1.1.1",
70
+ "@spectrum-web-components/styles": "^1.1.1",
71
+ "@spectrum-web-components/theme": "^1.1.1"
72
72
  },
73
73
  "types": "./src/index.d.ts",
74
74
  "customElements": "custom-elements.json",
@@ -78,5 +78,5 @@
78
78
  "./vrt-compare.js",
79
79
  "./vrt-compare.ts"
80
80
  ],
81
- "gitHead": "e3c6e52501451acc6fa85b10dd718267b80a01ab"
81
+ "gitHead": "44870aa95001c1b995456d994ae31bbe7277fac9"
82
82
  }
@@ -0,0 +1,129 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __decorateClass = (decorators, target, key, kind) => {
5
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
6
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
7
+ if (decorator = decorators[i])
8
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
9
+ if (kind && result) __defProp(target, key, result);
10
+ return result;
11
+ };
12
+ import { css, html, SpectrumElement } from "@spectrum-web-components/base";
13
+ import {
14
+ property,
15
+ queryAssignedNodes
16
+ } from "@spectrum-web-components/base/src/decorators.js";
17
+ import "@spectrum-web-components/slider/sp-slider.js";
18
+ import "@spectrum-web-components/thumbnail/sp-thumbnail.js";
19
+ import "@spectrum-web-components/overlay/sync/overlay-trigger.js";
20
+ import "@spectrum-web-components/tooltip/sp-tooltip.js";
21
+ export class OnionSkinner extends SpectrumElement {
22
+ constructor() {
23
+ super(...arguments);
24
+ this.onionLevel = 0.5;
25
+ }
26
+ handleOnionInput(event) {
27
+ this.onionLevel = event.target.value;
28
+ }
29
+ handleSlotchange() {
30
+ const images = [...this.assignments].filter(
31
+ (node) => node.tagName && node.matches("img")
32
+ );
33
+ if (images[0]) {
34
+ this.leftThumbnail = images[0].cloneNode();
35
+ this.leftThumbnail.removeAttribute("slot");
36
+ }
37
+ if (images[1]) {
38
+ this.rightThumbnail = images[1].cloneNode();
39
+ this.rightThumbnail.removeAttribute("slot");
40
+ }
41
+ if (images.length) {
42
+ this.requestUpdate();
43
+ }
44
+ }
45
+ allLeft() {
46
+ this.onionLevel = 0;
47
+ }
48
+ allRight() {
49
+ this.onionLevel = 1;
50
+ }
51
+ render() {
52
+ return html`
53
+ <slot
54
+ @slotchange=${this.handleSlotchange}
55
+ style="--onion-level: ${this.onionLevel}"
56
+ ></slot>
57
+ <div class="controls">
58
+ <overlay-trigger placement="top">
59
+ <sp-thumbnail
60
+ slot="trigger"
61
+ size="xl"
62
+ @click=${this.allLeft}
63
+ >
64
+ ${this.leftThumbnail}
65
+ </sp-thumbnail>
66
+ <sp-tooltip slot="hover-content">
67
+ Baseline screenshot
68
+ </sp-tooltip>
69
+ </overlay-trigger>
70
+ <sp-slider
71
+ min="0"
72
+ max="1"
73
+ step="0.001"
74
+ .value=${this.onionLevel}
75
+ .getAriaValueText=${() => ""}
76
+ @input=${this.handleOnionInput}
77
+ ></sp-slider>
78
+ <overlay-trigger placement="top">
79
+ <sp-thumbnail
80
+ slot="trigger"
81
+ size="xl"
82
+ @click=${this.allRight}
83
+ >
84
+ ${this.rightThumbnail}
85
+ </sp-thumbnail>
86
+ <sp-tooltip slot="hover-content">
87
+ Current screenshot
88
+ </sp-tooltip>
89
+ </overlay-trigger>
90
+ </div>
91
+ `;
92
+ }
93
+ }
94
+ OnionSkinner.styles = [
95
+ css`
96
+ :host {
97
+ display: grid;
98
+ grid-template-areas: 'main';
99
+ }
100
+ ::slotted(*) {
101
+ grid-area: main;
102
+ }
103
+ ::slotted(:first-child) {
104
+ opacity: calc(1 - var(--onion-level));
105
+ }
106
+ ::slotted(:last-child) {
107
+ opacity: var(--onion-level);
108
+ }
109
+ .controls {
110
+ display: flex;
111
+ gap: 1em;
112
+ margin: 0.25em;
113
+ align-items: center;
114
+ }
115
+ sp-slider {
116
+ flex-grow: 1;
117
+ }
118
+ `
119
+ ];
120
+ __decorateClass([
121
+ property({ type: Number })
122
+ ], OnionSkinner.prototype, "onionLevel", 2);
123
+ __decorateClass([
124
+ queryAssignedNodes({
125
+ slot: "",
126
+ flatten: true
127
+ })
128
+ ], OnionSkinner.prototype, "assignments", 2);
129
+ //# sourceMappingURL=OnionSkinner.dev.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["OnionSkinner.ts"],
4
+ "sourcesContent": ["/*\nCopyright 2020 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\nimport { css, html, SpectrumElement } from '@spectrum-web-components/base';\nimport {\n property,\n queryAssignedNodes,\n} from '@spectrum-web-components/base/src/decorators.js';\nimport { Slider } from '@spectrum-web-components/slider';\nimport '@spectrum-web-components/slider/sp-slider.js';\nimport '@spectrum-web-components/thumbnail/sp-thumbnail.js';\nimport '@spectrum-web-components/overlay/sync/overlay-trigger.js';\nimport '@spectrum-web-components/tooltip/sp-tooltip.js';\n\nexport class OnionSkinner extends SpectrumElement {\n @property({ type: Number }) public onionLevel = 0.5;\n\n @queryAssignedNodes({\n slot: '',\n flatten: true,\n })\n private assignments!: NodeListOf<HTMLImageElement>;\n\n private leftThumbnail?: HTMLImageElement;\n private rightThumbnail?: HTMLImageElement;\n\n private handleOnionInput(event: Event & { target: Slider }) {\n this.onionLevel = event.target.value;\n }\n\n private handleSlotchange() {\n const images = [...this.assignments].filter(\n (node) => node.tagName && node.matches('img')\n );\n if (images[0]) {\n this.leftThumbnail = images[0].cloneNode() as HTMLImageElement;\n this.leftThumbnail.removeAttribute('slot');\n }\n if (images[1]) {\n this.rightThumbnail = images[1].cloneNode() as HTMLImageElement;\n this.rightThumbnail.removeAttribute('slot');\n }\n if (images.length) {\n this.requestUpdate();\n }\n }\n\n private allLeft() {\n this.onionLevel = 0;\n }\n\n private allRight() {\n this.onionLevel = 1;\n }\n\n override render() {\n return html`\n <slot\n @slotchange=${this.handleSlotchange}\n style=\"--onion-level: ${this.onionLevel}\"\n ></slot>\n <div class=\"controls\">\n <overlay-trigger placement=\"top\">\n <sp-thumbnail\n slot=\"trigger\"\n size=\"xl\"\n @click=${this.allLeft}\n >\n ${this.leftThumbnail}\n </sp-thumbnail>\n <sp-tooltip slot=\"hover-content\">\n Baseline screenshot\n </sp-tooltip>\n </overlay-trigger>\n <sp-slider\n min=\"0\"\n max=\"1\"\n step=\"0.001\"\n .value=${this.onionLevel}\n .getAriaValueText=${() => ''}\n @input=${this.handleOnionInput}\n ></sp-slider>\n <overlay-trigger placement=\"top\">\n <sp-thumbnail\n slot=\"trigger\"\n size=\"xl\"\n @click=${this.allRight}\n >\n ${this.rightThumbnail}\n </sp-thumbnail>\n <sp-tooltip slot=\"hover-content\">\n Current screenshot\n </sp-tooltip>\n </overlay-trigger>\n </div>\n `;\n }\n\n static override styles = [\n css`\n :host {\n display: grid;\n grid-template-areas: 'main';\n }\n ::slotted(*) {\n grid-area: main;\n }\n ::slotted(:first-child) {\n opacity: calc(1 - var(--onion-level));\n }\n ::slotted(:last-child) {\n opacity: var(--onion-level);\n }\n .controls {\n display: flex;\n gap: 1em;\n margin: 0.25em;\n align-items: center;\n }\n sp-slider {\n flex-grow: 1;\n }\n `,\n ];\n}\n"],
5
+ "mappings": ";;;;;;;;;;;AAWA,SAAS,KAAK,MAAM,uBAAuB;AAC3C;AAAA,EACI;AAAA,EACA;AAAA,OACG;AAEP,OAAO;AACP,OAAO;AACP,OAAO;AACP,OAAO;AAEA,aAAM,qBAAqB,gBAAgB;AAAA,EAA3C;AAAA;AACyB,SAAO,aAAa;AAAA;AAAA,EAWxC,iBAAiB,OAAmC;AACxD,SAAK,aAAa,MAAM,OAAO;AAAA,EACnC;AAAA,EAEQ,mBAAmB;AACvB,UAAM,SAAS,CAAC,GAAG,KAAK,WAAW,EAAE;AAAA,MACjC,CAAC,SAAS,KAAK,WAAW,KAAK,QAAQ,KAAK;AAAA,IAChD;AACA,QAAI,OAAO,CAAC,GAAG;AACX,WAAK,gBAAgB,OAAO,CAAC,EAAE,UAAU;AACzC,WAAK,cAAc,gBAAgB,MAAM;AAAA,IAC7C;AACA,QAAI,OAAO,CAAC,GAAG;AACX,WAAK,iBAAiB,OAAO,CAAC,EAAE,UAAU;AAC1C,WAAK,eAAe,gBAAgB,MAAM;AAAA,IAC9C;AACA,QAAI,OAAO,QAAQ;AACf,WAAK,cAAc;AAAA,IACvB;AAAA,EACJ;AAAA,EAEQ,UAAU;AACd,SAAK,aAAa;AAAA,EACtB;AAAA,EAEQ,WAAW;AACf,SAAK,aAAa;AAAA,EACtB;AAAA,EAES,SAAS;AACd,WAAO;AAAA;AAAA,8BAEe,KAAK,gBAAgB;AAAA,wCACX,KAAK,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iCAOtB,KAAK,OAAO;AAAA;AAAA,0BAEnB,KAAK,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6BAUf,KAAK,UAAU;AAAA,wCACJ,MAAM,EAAE;AAAA,6BACnB,KAAK,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iCAMjB,KAAK,QAAQ;AAAA;AAAA,0BAEpB,KAAK,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQzC;AA4BJ;AA9Ga,aAoFO,SAAS;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAwBJ;AA5GmC;AAAA,EAAlC,SAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GADjB,aAC0B;AAM3B;AAAA,EAJP,mBAAmB;AAAA,IAChB,MAAM;AAAA,IACN,SAAS;AAAA,EACb,CAAC;AAAA,GANQ,aAOD;",
6
+ "names": []
7
+ }
@@ -0,0 +1,64 @@
1
+ "use strict";var n=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var a=(s,l,e,t)=>{for(var i=t>1?void 0:t?m(l,e):l,o=s.length-1,r;o>=0;o--)(r=s[o])&&(i=(t?r(l,e,i):r(i))||i);return t&&i&&n(l,e,i),i};import{css as h,html as p,SpectrumElement as g}from"@spectrum-web-components/base";import{property as v,queryAssignedNodes as c}from"@spectrum-web-components/base/src/decorators.js";import"@spectrum-web-components/slider/sp-slider.js";import"@spectrum-web-components/thumbnail/sp-thumbnail.js";import"@spectrum-web-components/overlay/sync/overlay-trigger.js";import"@spectrum-web-components/tooltip/sp-tooltip.js";export class OnionSkinner extends g{constructor(){super(...arguments);this.onionLevel=.5}handleOnionInput(e){this.onionLevel=e.target.value}handleSlotchange(){const e=[...this.assignments].filter(t=>t.tagName&&t.matches("img"));e[0]&&(this.leftThumbnail=e[0].cloneNode(),this.leftThumbnail.removeAttribute("slot")),e[1]&&(this.rightThumbnail=e[1].cloneNode(),this.rightThumbnail.removeAttribute("slot")),e.length&&this.requestUpdate()}allLeft(){this.onionLevel=0}allRight(){this.onionLevel=1}render(){return p`
2
+ <slot
3
+ @slotchange=${this.handleSlotchange}
4
+ style="--onion-level: ${this.onionLevel}"
5
+ ></slot>
6
+ <div class="controls">
7
+ <overlay-trigger placement="top">
8
+ <sp-thumbnail
9
+ slot="trigger"
10
+ size="xl"
11
+ @click=${this.allLeft}
12
+ >
13
+ ${this.leftThumbnail}
14
+ </sp-thumbnail>
15
+ <sp-tooltip slot="hover-content">
16
+ Baseline screenshot
17
+ </sp-tooltip>
18
+ </overlay-trigger>
19
+ <sp-slider
20
+ min="0"
21
+ max="1"
22
+ step="0.001"
23
+ .value=${this.onionLevel}
24
+ .getAriaValueText=${()=>""}
25
+ @input=${this.handleOnionInput}
26
+ ></sp-slider>
27
+ <overlay-trigger placement="top">
28
+ <sp-thumbnail
29
+ slot="trigger"
30
+ size="xl"
31
+ @click=${this.allRight}
32
+ >
33
+ ${this.rightThumbnail}
34
+ </sp-thumbnail>
35
+ <sp-tooltip slot="hover-content">
36
+ Current screenshot
37
+ </sp-tooltip>
38
+ </overlay-trigger>
39
+ </div>
40
+ `}}OnionSkinner.styles=[h`
41
+ :host {
42
+ display: grid;
43
+ grid-template-areas: 'main';
44
+ }
45
+ ::slotted(*) {
46
+ grid-area: main;
47
+ }
48
+ ::slotted(:first-child) {
49
+ opacity: calc(1 - var(--onion-level));
50
+ }
51
+ ::slotted(:last-child) {
52
+ opacity: var(--onion-level);
53
+ }
54
+ .controls {
55
+ display: flex;
56
+ gap: 1em;
57
+ margin: 0.25em;
58
+ align-items: center;
59
+ }
60
+ sp-slider {
61
+ flex-grow: 1;
62
+ }
63
+ `],a([v({type:Number})],OnionSkinner.prototype,"onionLevel",2),a([c({slot:"",flatten:!0})],OnionSkinner.prototype,"assignments",2);
64
+ //# sourceMappingURL=OnionSkinner.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["OnionSkinner.ts"],
4
+ "sourcesContent": ["/*\nCopyright 2020 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\nimport { css, html, SpectrumElement } from '@spectrum-web-components/base';\nimport {\n property,\n queryAssignedNodes,\n} from '@spectrum-web-components/base/src/decorators.js';\nimport { Slider } from '@spectrum-web-components/slider';\nimport '@spectrum-web-components/slider/sp-slider.js';\nimport '@spectrum-web-components/thumbnail/sp-thumbnail.js';\nimport '@spectrum-web-components/overlay/sync/overlay-trigger.js';\nimport '@spectrum-web-components/tooltip/sp-tooltip.js';\n\nexport class OnionSkinner extends SpectrumElement {\n @property({ type: Number }) public onionLevel = 0.5;\n\n @queryAssignedNodes({\n slot: '',\n flatten: true,\n })\n private assignments!: NodeListOf<HTMLImageElement>;\n\n private leftThumbnail?: HTMLImageElement;\n private rightThumbnail?: HTMLImageElement;\n\n private handleOnionInput(event: Event & { target: Slider }) {\n this.onionLevel = event.target.value;\n }\n\n private handleSlotchange() {\n const images = [...this.assignments].filter(\n (node) => node.tagName && node.matches('img')\n );\n if (images[0]) {\n this.leftThumbnail = images[0].cloneNode() as HTMLImageElement;\n this.leftThumbnail.removeAttribute('slot');\n }\n if (images[1]) {\n this.rightThumbnail = images[1].cloneNode() as HTMLImageElement;\n this.rightThumbnail.removeAttribute('slot');\n }\n if (images.length) {\n this.requestUpdate();\n }\n }\n\n private allLeft() {\n this.onionLevel = 0;\n }\n\n private allRight() {\n this.onionLevel = 1;\n }\n\n override render() {\n return html`\n <slot\n @slotchange=${this.handleSlotchange}\n style=\"--onion-level: ${this.onionLevel}\"\n ></slot>\n <div class=\"controls\">\n <overlay-trigger placement=\"top\">\n <sp-thumbnail\n slot=\"trigger\"\n size=\"xl\"\n @click=${this.allLeft}\n >\n ${this.leftThumbnail}\n </sp-thumbnail>\n <sp-tooltip slot=\"hover-content\">\n Baseline screenshot\n </sp-tooltip>\n </overlay-trigger>\n <sp-slider\n min=\"0\"\n max=\"1\"\n step=\"0.001\"\n .value=${this.onionLevel}\n .getAriaValueText=${() => ''}\n @input=${this.handleOnionInput}\n ></sp-slider>\n <overlay-trigger placement=\"top\">\n <sp-thumbnail\n slot=\"trigger\"\n size=\"xl\"\n @click=${this.allRight}\n >\n ${this.rightThumbnail}\n </sp-thumbnail>\n <sp-tooltip slot=\"hover-content\">\n Current screenshot\n </sp-tooltip>\n </overlay-trigger>\n </div>\n `;\n }\n\n static override styles = [\n css`\n :host {\n display: grid;\n grid-template-areas: 'main';\n }\n ::slotted(*) {\n grid-area: main;\n }\n ::slotted(:first-child) {\n opacity: calc(1 - var(--onion-level));\n }\n ::slotted(:last-child) {\n opacity: var(--onion-level);\n }\n .controls {\n display: flex;\n gap: 1em;\n margin: 0.25em;\n align-items: center;\n }\n sp-slider {\n flex-grow: 1;\n }\n `,\n ];\n}\n"],
5
+ "mappings": "qNAWA,OAAS,OAAAA,EAAK,QAAAC,EAAM,mBAAAC,MAAuB,gCAC3C,OACI,YAAAC,EACA,sBAAAC,MACG,kDAEP,MAAO,+CACP,MAAO,qDACP,MAAO,2DACP,MAAO,iDAEA,aAAM,qBAAqBF,CAAgB,CAA3C,kCACyB,KAAO,WAAa,GAWxC,iBAAiBG,EAAmC,CACxD,KAAK,WAAaA,EAAM,OAAO,KACnC,CAEQ,kBAAmB,CACvB,MAAMC,EAAS,CAAC,GAAG,KAAK,WAAW,EAAE,OAChCC,GAASA,EAAK,SAAWA,EAAK,QAAQ,KAAK,CAChD,EACID,EAAO,CAAC,IACR,KAAK,cAAgBA,EAAO,CAAC,EAAE,UAAU,EACzC,KAAK,cAAc,gBAAgB,MAAM,GAEzCA,EAAO,CAAC,IACR,KAAK,eAAiBA,EAAO,CAAC,EAAE,UAAU,EAC1C,KAAK,eAAe,gBAAgB,MAAM,GAE1CA,EAAO,QACP,KAAK,cAAc,CAE3B,CAEQ,SAAU,CACd,KAAK,WAAa,CACtB,CAEQ,UAAW,CACf,KAAK,WAAa,CACtB,CAES,QAAS,CACd,OAAOL;AAAA;AAAA,8BAEe,KAAK,gBAAgB;AAAA,wCACX,KAAK,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iCAOtB,KAAK,OAAO;AAAA;AAAA,0BAEnB,KAAK,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6BAUf,KAAK,UAAU;AAAA,wCACJ,IAAM,EAAE;AAAA,6BACnB,KAAK,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iCAMjB,KAAK,QAAQ;AAAA;AAAA,0BAEpB,KAAK,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAQzC,CA4BJ,CA9Ga,aAoFO,OAAS,CACrBD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAwBJ,EA5GmCQ,EAAA,CAAlCL,EAAS,CAAE,KAAM,MAAO,CAAC,GADjB,aAC0B,0BAM3BK,EAAA,CAJPJ,EAAmB,CAChB,KAAM,GACN,QAAS,EACb,CAAC,GANQ,aAOD",
6
+ "names": ["css", "html", "SpectrumElement", "property", "queryAssignedNodes", "event", "images", "node", "__decorateClass"]
7
+ }
@@ -0,0 +1,402 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __decorateClass = (decorators, target, key, kind) => {
5
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
6
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
7
+ if (decorator = decorators[i])
8
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
9
+ if (kind && result) __defProp(target, key, result);
10
+ return result;
11
+ };
12
+ import {
13
+ css,
14
+ html,
15
+ nothing,
16
+ SpectrumElement
17
+ } from "@spectrum-web-components/base";
18
+ import { property } from "@spectrum-web-components/base/src/decorators.js";
19
+ import { ObserveSlotPresence } from "@spectrum-web-components/shared";
20
+ import bodyStyles from "@spectrum-web-components/styles/body.js";
21
+ import "@spectrum-web-components/action-button/sp-action-button.js";
22
+ import "@spectrum-web-components/action-group/sp-action-group.js";
23
+ import "@spectrum-web-components/split-view/sp-split-view.js";
24
+ import "@spectrum-web-components/icons-workflow/icons/sp-icon-alert.js";
25
+ import "@spectrum-web-components/icons-workflow/icons/sp-icon-zoom-in.js";
26
+ import "@spectrum-web-components/icons-workflow/icons/sp-icon-zoom-out.js";
27
+ import "@spectrum-web-components/icons-workflow/icons/sp-icon-refresh.js";
28
+ import "@spectrum-web-components/action-bar/sp-action-bar.js";
29
+ import "@spectrum-web-components/progress-circle/sp-progress-circle.js";
30
+ import "../onion-skinner.dev.js";
31
+ export class VrtCompare extends ObserveSlotPresence(SpectrumElement, [
32
+ '[slot="actual"]',
33
+ '[slot="baseline"]',
34
+ '[slot="diff"]'
35
+ ]) {
36
+ constructor() {
37
+ super(...arguments);
38
+ this.view = "scrubber";
39
+ this.zoom = 1;
40
+ this.imagesLoaded = false;
41
+ this._loadingImages = false;
42
+ }
43
+ get hasActual() {
44
+ return this.getSlotContentPresence('[slot="actual"]');
45
+ }
46
+ get hasBaseline() {
47
+ return this.getSlotContentPresence('[slot="baseline"]');
48
+ }
49
+ get hasDiff() {
50
+ return this.getSlotContentPresence('[slot="diff"]');
51
+ }
52
+ get canCompare() {
53
+ return this.hasActual && this.hasBaseline;
54
+ }
55
+ handleChange(event) {
56
+ const view = event.target.selected[0];
57
+ if (view) {
58
+ this.view = view;
59
+ }
60
+ }
61
+ handleZoomIn() {
62
+ this.zoom += 0.1;
63
+ }
64
+ handleZoomClear() {
65
+ this.zoom = 1;
66
+ }
67
+ handleZoomOut() {
68
+ this.zoom -= 0.1;
69
+ }
70
+ get error() {
71
+ return html`
72
+ <sp-icon-alert class="icon" size="xl"></sp-icon-alert>
73
+ <p class="spectrum-Body spectrum-Body--sizeXL">
74
+ Please be sure to supply some combination of actual, baseline,
75
+ and diff screenshots for review.
76
+ </p>
77
+ `;
78
+ }
79
+ get actual() {
80
+ return html`
81
+ <div class="view actual">
82
+ <slot name="actual"></slot>
83
+ </div>
84
+ `;
85
+ }
86
+ get baseline() {
87
+ return html`
88
+ <div class="view baseline">
89
+ <slot name="baseline"></slot>
90
+ </div>
91
+ `;
92
+ }
93
+ get diff() {
94
+ return html`
95
+ <div class="view diff">
96
+ <slot name="diff"></slot>
97
+ </div>
98
+ `;
99
+ }
100
+ get scrubber() {
101
+ return html`
102
+ <sp-split-view resizable primary-size="50%">
103
+ ${this.baseline} ${this.actual}
104
+ </sp-split-view>
105
+ `;
106
+ }
107
+ get sidebyside() {
108
+ return html`
109
+ ${this.baseline} ${this.actual}
110
+ `;
111
+ }
112
+ get onion() {
113
+ return html`
114
+ <onion-skinner>
115
+ <slot name="baseline"></slot>
116
+ <slot name="actual"></slot>
117
+ </onion-skinner>
118
+ `;
119
+ }
120
+ get renderView() {
121
+ switch (this.view) {
122
+ case "error":
123
+ return this.error;
124
+ case "actual":
125
+ return this.actual;
126
+ case "baseline":
127
+ return this.baseline;
128
+ case "diff":
129
+ return this.diff;
130
+ case "onion":
131
+ return this.onion;
132
+ case "sidebyside":
133
+ return this.sidebyside;
134
+ case "scrubber":
135
+ default:
136
+ return this.scrubber;
137
+ }
138
+ }
139
+ get viewFallback() {
140
+ if (this.canCompare) {
141
+ return "scrubber";
142
+ } else if (this.hasActual) {
143
+ return "actual";
144
+ } else if (this.hasBaseline) {
145
+ return "baseline";
146
+ } else if (this.hasDiff) {
147
+ return "diff";
148
+ } else {
149
+ return "error";
150
+ }
151
+ }
152
+ async prepImages(event) {
153
+ const slot = event.target;
154
+ if (this._loadingImages || !slot.assignedNodes().length) {
155
+ return;
156
+ }
157
+ this._loadingImages = true;
158
+ this.imagesLoaded = false;
159
+ const images = [...this.querySelectorAll("img")];
160
+ if (!images.length) {
161
+ this.imagesLoaded = true;
162
+ this._loadingImages = false;
163
+ return;
164
+ }
165
+ const imageLoadPromises = images.map((img) => {
166
+ if (img.naturalWidth) {
167
+ this.style.setProperty(
168
+ "--image-width",
169
+ `${img.naturalWidth}px`
170
+ );
171
+ return Promise.resolve();
172
+ }
173
+ return new Promise((resolve) => {
174
+ img.addEventListener("load", () => {
175
+ this.style.setProperty(
176
+ "--image-width",
177
+ `${img.naturalWidth}px`
178
+ );
179
+ resolve(true);
180
+ });
181
+ });
182
+ });
183
+ await Promise.all(imageLoadPromises);
184
+ this.imagesLoaded = true;
185
+ this._loadingImages = false;
186
+ }
187
+ shouldUpdate() {
188
+ if (this.view === "error" || this.view === "actual" && !this.hasActual || this.view === "baseline" && !this.hasBaseline || this.view === "diff" && !this.hasDiff || (this.view === "onion" || this.view === "sidebyside" || this.view === "scrubber") && !this.canCompare) {
189
+ this.view = this.viewFallback;
190
+ }
191
+ return true;
192
+ }
193
+ render() {
194
+ if (this._loadingImages) {
195
+ return html`
196
+ <sp-progress-circle indeterminate></sp-progress-circle>
197
+ <slot
198
+ name="actual"
199
+ @slotchange=${this.prepImages}
200
+ hidden
201
+ ></slot>
202
+ <slot
203
+ name="baseline"
204
+ @slotchange=${this.prepImages}
205
+ hidden
206
+ ></slot>
207
+ <slot name="diff" @slotchange=${this.prepImages} hidden></slot>
208
+ `;
209
+ }
210
+ if (!this.imagesLoaded) {
211
+ return html`
212
+ <p class="spectrum-Body spectrum-Body--sizeXL">
213
+ Choose a test to review on the left...
214
+ </p>
215
+ <slot
216
+ name="actual"
217
+ @slotchange=${this.prepImages}
218
+ hidden
219
+ ></slot>
220
+ <slot
221
+ name="baseline"
222
+ @slotchange=${this.prepImages}
223
+ hidden
224
+ ></slot>
225
+ <slot name="diff" @slotchange=${this.prepImages} hidden></slot>
226
+ `;
227
+ }
228
+ return html`
229
+ <sp-action-group
230
+ selects="single"
231
+ compact
232
+ emphasized
233
+ @change=${this.handleChange}
234
+ >
235
+ ${this.view !== "error" ? nothing : html`
236
+ <sp-action-button value="error" disabled>
237
+ Error
238
+ </sp-action-button>
239
+ `}
240
+ ${!this.canCompare ? nothing : html`
241
+ <sp-action-button
242
+ value="scrubber"
243
+ ?selected=${this.view === "scrubber"}
244
+ >
245
+ Scrubber
246
+ </sp-action-button>
247
+ <sp-action-button
248
+ value="onion"
249
+ ?selected=${this.view === "onion"}
250
+ >
251
+ Onion skin
252
+ </sp-action-button>
253
+ <sp-action-button
254
+ value="sidebyside"
255
+ ?selected=${this.view === "sidebyside"}
256
+ >
257
+ Side by side
258
+ </sp-action-button>
259
+ `}
260
+ ${!this.hasDiff ? nothing : html`
261
+ <sp-action-button
262
+ value="diff"
263
+ ?selected=${this.view === "diff"}
264
+ >
265
+ Diff
266
+ </sp-action-button>
267
+ `}
268
+ ${!this.hasActual ? nothing : html`
269
+ <sp-action-button
270
+ value="actual"
271
+ ?selected=${this.view === "actual"}
272
+ >
273
+ Actual
274
+ </sp-action-button>
275
+ `}
276
+ ${!this.hasBaseline ? nothing : html`
277
+ <sp-action-button
278
+ value="baseline"
279
+ ?selected=${this.view === "baseline"}
280
+ >
281
+ Baseline
282
+ </sp-action-button>
283
+ `}
284
+ </sp-action-group>
285
+ <div class="review ${this.view}">${this.renderView}</div>
286
+ <sp-action-group compact class="zoom-controls">
287
+ <sp-action-button
288
+ @click=${this.handleZoomOut}
289
+ ?disabled=${this.zoom <= 0.5}
290
+ >
291
+ <sp-icon-zoom-out slot="icon"></sp-icon-zoom-out>
292
+ </sp-action-button>
293
+ <sp-action-button @click=${this.handleZoomClear}>
294
+ <sp-icon-refresh slot="icon"></sp-icon-refresh>
295
+ </sp-action-button>
296
+ <sp-action-button
297
+ @click=${this.handleZoomIn}
298
+ ?disabled=${this.zoom >= 2}
299
+ >
300
+ <sp-icon-zoom-in slot="icon"></sp-icon-zoom-in>
301
+ </sp-action-button>
302
+ </sp-action-group>
303
+ `;
304
+ }
305
+ updated(changes) {
306
+ if (changes.has("zoom")) {
307
+ let zoom = Math.min(this.zoom, 2);
308
+ zoom = Math.min(zoom, 0.5);
309
+ this.style.setProperty("--zoom-level", `${this.zoom}`);
310
+ }
311
+ }
312
+ }
313
+ VrtCompare.styles = [
314
+ css`
315
+ :host {
316
+ display: grid;
317
+ max-width: 100%;
318
+ overflow: auto;
319
+ margin: 0 auto;
320
+ position: relative;
321
+
322
+ --image-display-width: calc(
323
+ var(--zoom-level, 1) * var(--image-width, 500px)
324
+ );
325
+ }
326
+ sp-progress-circle {
327
+ margin: auto;
328
+ place-self: center;
329
+ }
330
+ .review {
331
+ margin: 100px auto 0;
332
+ display: flex;
333
+ width: var(--image-display-width);
334
+ place-self: start;
335
+ }
336
+ .error {
337
+ flex-direction: column;
338
+ }
339
+ ::slotted(img) {
340
+ display: flex;
341
+ pointer-events: none;
342
+ }
343
+ sp-action-group[selects] {
344
+ margin-bottom: 1em;
345
+ justify-content: center;
346
+ position: fixed;
347
+ top: calc(var(--swc-scale-factor) * 8px);
348
+ right: calc(var(--swc-scale-factor) * 8px);
349
+ }
350
+ .sidebyside {
351
+ display: flex;
352
+ gap: 2px;
353
+ }
354
+ .sidebyside ::slotted(img) {
355
+ width: 100%;
356
+ }
357
+ .view {
358
+ overflow: hidden;
359
+ }
360
+ .review:is(.baseline, .actual, .diff) .view,
361
+ .review:is(.baseline, .actual, .diff) ::slotted(img) {
362
+ width: 100%;
363
+ }
364
+ sp-split-view {
365
+ width: var(--image-display-width);
366
+ }
367
+ sp-split-view ::slotted(img) {
368
+ width: var(--image-display-width);
369
+ height: auto;
370
+ flex-shrink: 0;
371
+ }
372
+ sp-split-view .actual ::slotted(img) {
373
+ float: right;
374
+ }
375
+ p {
376
+ text-align: center;
377
+ margin: 0 3em;
378
+ }
379
+ .icon {
380
+ margin: 0 auto 2em;
381
+ display: flex;
382
+ color: var(--spectrum-semantic-negative-color-background);
383
+ }
384
+ .zoom-controls {
385
+ position: fixed;
386
+ bottom: calc(var(--swc-scale-factor) * 8px);
387
+ left: calc(var(--swc-scale-factor) * 8px);
388
+ z-index: 1;
389
+ }
390
+ `,
391
+ bodyStyles
392
+ ];
393
+ __decorateClass([
394
+ property()
395
+ ], VrtCompare.prototype, "view", 2);
396
+ __decorateClass([
397
+ property({ type: Number })
398
+ ], VrtCompare.prototype, "zoom", 2);
399
+ __decorateClass([
400
+ property({ type: Boolean, attribute: false })
401
+ ], VrtCompare.prototype, "imagesLoaded", 2);
402
+ //# sourceMappingURL=VrtCompare.dev.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["VrtCompare.ts"],
4
+ "sourcesContent": ["/*\nCopyright 2020 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\n\nimport {\n css,\n html,\n nothing,\n PropertyValues,\n SpectrumElement,\n TemplateResult,\n} from '@spectrum-web-components/base';\nimport { property } from '@spectrum-web-components/base/src/decorators.js';\nimport { ObserveSlotPresence } from '@spectrum-web-components/shared';\nimport { ActionGroup } from '@spectrum-web-components/action-group';\nimport bodyStyles from '@spectrum-web-components/styles/body.js';\nimport '@spectrum-web-components/action-button/sp-action-button.js';\nimport '@spectrum-web-components/action-group/sp-action-group.js';\nimport '@spectrum-web-components/split-view/sp-split-view.js';\nimport '@spectrum-web-components/icons-workflow/icons/sp-icon-alert.js';\nimport '@spectrum-web-components/icons-workflow/icons/sp-icon-zoom-in.js';\nimport '@spectrum-web-components/icons-workflow/icons/sp-icon-zoom-out.js';\nimport '@spectrum-web-components/icons-workflow/icons/sp-icon-refresh.js';\nimport '@spectrum-web-components/action-bar/sp-action-bar.js';\nimport '@spectrum-web-components/progress-circle/sp-progress-circle.js';\nimport '../onion-skinner.dev.js'\n\nexport class VrtCompare extends ObserveSlotPresence(SpectrumElement, [\n '[slot=\"actual\"]',\n '[slot=\"baseline\"]',\n '[slot=\"diff\"]',\n]) {\n @property()\n public view = 'scrubber';\n\n @property({ type: Number })\n public zoom = 1;\n\n @property({ type: Boolean, attribute: false })\n public imagesLoaded = false;\n\n private get hasActual(): boolean {\n return this.getSlotContentPresence('[slot=\"actual\"]');\n }\n\n private get hasBaseline(): boolean {\n return this.getSlotContentPresence('[slot=\"baseline\"]');\n }\n\n private get hasDiff(): boolean {\n return this.getSlotContentPresence('[slot=\"diff\"]');\n }\n\n private get canCompare(): boolean {\n return this.hasActual && this.hasBaseline;\n }\n\n private handleChange(event: Event & { target: ActionGroup }) {\n const view = event.target.selected[0];\n if (view) {\n this.view = view;\n }\n }\n\n private handleZoomIn() {\n this.zoom += 0.1;\n }\n\n private handleZoomClear() {\n this.zoom = 1;\n }\n\n private handleZoomOut() {\n this.zoom -= 0.1;\n }\n\n protected get error() {\n return html`\n <sp-icon-alert class=\"icon\" size=\"xl\"></sp-icon-alert>\n <p class=\"spectrum-Body spectrum-Body--sizeXL\">\n Please be sure to supply some combination of actual, baseline,\n and diff screenshots for review.\n </p>\n `;\n }\n\n protected get actual() {\n return html`\n <div class=\"view actual\">\n <slot name=\"actual\"></slot>\n </div>\n `;\n }\n\n protected get baseline() {\n return html`\n <div class=\"view baseline\">\n <slot name=\"baseline\"></slot>\n </div>\n `;\n }\n\n protected get diff() {\n return html`\n <div class=\"view diff\">\n <slot name=\"diff\"></slot>\n </div>\n `;\n }\n\n protected get scrubber() {\n return html`\n <sp-split-view resizable primary-size=\"50%\">\n ${this.baseline} ${this.actual}\n </sp-split-view>\n `;\n }\n\n protected get sidebyside() {\n return html`\n ${this.baseline} ${this.actual}\n `;\n }\n\n protected get onion() {\n return html`\n <onion-skinner>\n <slot name=\"baseline\"></slot>\n <slot name=\"actual\"></slot>\n </onion-skinner>\n `;\n }\n\n protected get renderView() {\n switch (this.view) {\n case 'error':\n return this.error;\n case 'actual':\n return this.actual;\n case 'baseline':\n return this.baseline;\n case 'diff':\n return this.diff;\n case 'onion':\n return this.onion;\n case 'sidebyside':\n return this.sidebyside;\n case 'scrubber':\n default:\n return this.scrubber;\n }\n }\n\n private get viewFallback() {\n if (this.canCompare) {\n return 'scrubber';\n } else if (this.hasActual) {\n return 'actual';\n } else if (this.hasBaseline) {\n return 'baseline';\n } else if (this.hasDiff) {\n return 'diff';\n } else {\n return 'error';\n }\n }\n\n _loadingImages = false;\n\n async prepImages(event: Event) {\n const slot = event.target as HTMLSlotElement;\n if (this._loadingImages || !slot.assignedNodes().length) {\n return;\n }\n this._loadingImages = true;\n this.imagesLoaded = false;\n const images = [...this.querySelectorAll('img')];\n if (!images.length) {\n this.imagesLoaded = true;\n this._loadingImages = false;\n return;\n }\n const imageLoadPromises = images.map((img) => {\n if (img.naturalWidth) {\n this.style.setProperty(\n '--image-width',\n `${img.naturalWidth}px`\n );\n return Promise.resolve();\n }\n return new Promise((resolve) => {\n img.addEventListener('load', () => {\n this.style.setProperty(\n '--image-width',\n `${img.naturalWidth}px`\n );\n resolve(true);\n });\n });\n });\n await Promise.all(imageLoadPromises);\n this.imagesLoaded = true;\n this._loadingImages = false;\n }\n\n protected override shouldUpdate() {\n if (\n this.view === 'error' ||\n (this.view === 'actual' && !this.hasActual) ||\n (this.view === 'baseline' && !this.hasBaseline) ||\n (this.view === 'diff' && !this.hasDiff) ||\n ((this.view === 'onion' ||\n this.view === 'sidebyside' ||\n this.view === 'scrubber') &&\n !this.canCompare)\n ) {\n this.view = this.viewFallback;\n }\n return true;\n }\n\n protected override render(): TemplateResult {\n if (this._loadingImages) {\n return html`\n <sp-progress-circle indeterminate></sp-progress-circle>\n <slot\n name=\"actual\"\n @slotchange=${this.prepImages}\n hidden\n ></slot>\n <slot\n name=\"baseline\"\n @slotchange=${this.prepImages}\n hidden\n ></slot>\n <slot name=\"diff\" @slotchange=${this.prepImages} hidden></slot>\n `;\n }\n if (!this.imagesLoaded) {\n return html`\n <p class=\"spectrum-Body spectrum-Body--sizeXL\">\n Choose a test to review on the left...\n </p>\n <slot\n name=\"actual\"\n @slotchange=${this.prepImages}\n hidden\n ></slot>\n <slot\n name=\"baseline\"\n @slotchange=${this.prepImages}\n hidden\n ></slot>\n <slot name=\"diff\" @slotchange=${this.prepImages} hidden></slot>\n `;\n }\n return html`\n <sp-action-group\n selects=\"single\"\n compact\n emphasized\n @change=${this.handleChange}\n >\n ${this.view !== 'error'\n ? nothing\n : html`\n <sp-action-button value=\"error\" disabled>\n Error\n </sp-action-button>\n `}\n ${!this.canCompare\n ? nothing\n : html`\n <sp-action-button\n value=\"scrubber\"\n ?selected=${this.view === 'scrubber'}\n >\n Scrubber\n </sp-action-button>\n <sp-action-button\n value=\"onion\"\n ?selected=${this.view === 'onion'}\n >\n Onion skin\n </sp-action-button>\n <sp-action-button\n value=\"sidebyside\"\n ?selected=${this.view === 'sidebyside'}\n >\n Side by side\n </sp-action-button>\n `}\n ${!this.hasDiff\n ? nothing\n : html`\n <sp-action-button\n value=\"diff\"\n ?selected=${this.view === 'diff'}\n >\n Diff\n </sp-action-button>\n `}\n ${!this.hasActual\n ? nothing\n : html`\n <sp-action-button\n value=\"actual\"\n ?selected=${this.view === 'actual'}\n >\n Actual\n </sp-action-button>\n `}\n ${!this.hasBaseline\n ? nothing\n : html`\n <sp-action-button\n value=\"baseline\"\n ?selected=${this.view === 'baseline'}\n >\n Baseline\n </sp-action-button>\n `}\n </sp-action-group>\n <div class=\"review ${this.view}\">${this.renderView}</div>\n <sp-action-group compact class=\"zoom-controls\">\n <sp-action-button\n @click=${this.handleZoomOut}\n ?disabled=${this.zoom <= 0.5}\n >\n <sp-icon-zoom-out slot=\"icon\"></sp-icon-zoom-out>\n </sp-action-button>\n <sp-action-button @click=${this.handleZoomClear}>\n <sp-icon-refresh slot=\"icon\"></sp-icon-refresh>\n </sp-action-button>\n <sp-action-button\n @click=${this.handleZoomIn}\n ?disabled=${this.zoom >= 2}\n >\n <sp-icon-zoom-in slot=\"icon\"></sp-icon-zoom-in>\n </sp-action-button>\n </sp-action-group>\n `;\n }\n\n protected override updated(changes: PropertyValues) {\n if (changes.has('zoom')) {\n let zoom = Math.min(this.zoom, 2);\n zoom = Math.min(zoom, 0.5);\n this.style.setProperty('--zoom-level', `${this.zoom}`);\n }\n }\n\n static override styles = [\n css`\n :host {\n display: grid;\n max-width: 100%;\n overflow: auto;\n margin: 0 auto;\n position: relative;\n\n --image-display-width: calc(\n var(--zoom-level, 1) * var(--image-width, 500px)\n );\n }\n sp-progress-circle {\n margin: auto;\n place-self: center;\n }\n .review {\n margin: 100px auto 0;\n display: flex;\n width: var(--image-display-width);\n place-self: start;\n }\n .error {\n flex-direction: column;\n }\n ::slotted(img) {\n display: flex;\n pointer-events: none;\n }\n sp-action-group[selects] {\n margin-bottom: 1em;\n justify-content: center;\n position: fixed;\n top: calc(var(--swc-scale-factor) * 8px);\n right: calc(var(--swc-scale-factor) * 8px);\n }\n .sidebyside {\n display: flex;\n gap: 2px;\n }\n .sidebyside ::slotted(img) {\n width: 100%;\n }\n .view {\n overflow: hidden;\n }\n .review:is(.baseline, .actual, .diff) .view,\n .review:is(.baseline, .actual, .diff) ::slotted(img) {\n width: 100%;\n }\n sp-split-view {\n width: var(--image-display-width);\n }\n sp-split-view ::slotted(img) {\n width: var(--image-display-width);\n height: auto;\n flex-shrink: 0;\n }\n sp-split-view .actual ::slotted(img) {\n float: right;\n }\n p {\n text-align: center;\n margin: 0 3em;\n }\n .icon {\n margin: 0 auto 2em;\n display: flex;\n color: var(--spectrum-semantic-negative-color-background);\n }\n .zoom-controls {\n position: fixed;\n bottom: calc(var(--swc-scale-factor) * 8px);\n left: calc(var(--swc-scale-factor) * 8px);\n z-index: 1;\n }\n `,\n bodyStyles,\n ];\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,210 @@
1
+ "use strict";var h=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var l=(c,a,s,t)=>{for(var i=t>1?void 0:t?u(a,s):a,r=c.length-1,o;r>=0;r--)(o=c[r])&&(i=(t?o(a,s,i):o(i))||i);return t&&i&&h(a,s,i),i};import{css as m,html as e,nothing as n,SpectrumElement as g}from"@spectrum-web-components/base";import{property as d}from"@spectrum-web-components/base/src/decorators.js";import{ObserveSlotPresence as f}from"@spectrum-web-components/shared";import b from"@spectrum-web-components/styles/body.js";import"@spectrum-web-components/action-button/sp-action-button.js";import"@spectrum-web-components/action-group/sp-action-group.js";import"@spectrum-web-components/split-view/sp-split-view.js";import"@spectrum-web-components/icons-workflow/icons/sp-icon-alert.js";import"@spectrum-web-components/icons-workflow/icons/sp-icon-zoom-in.js";import"@spectrum-web-components/icons-workflow/icons/sp-icon-zoom-out.js";import"@spectrum-web-components/icons-workflow/icons/sp-icon-refresh.js";import"@spectrum-web-components/action-bar/sp-action-bar.js";import"@spectrum-web-components/progress-circle/sp-progress-circle.js";import"../onion-skinner.js";export class VrtCompare extends f(g,['[slot="actual"]','[slot="baseline"]','[slot="diff"]']){constructor(){super(...arguments);this.view="scrubber";this.zoom=1;this.imagesLoaded=!1;this._loadingImages=!1}get hasActual(){return this.getSlotContentPresence('[slot="actual"]')}get hasBaseline(){return this.getSlotContentPresence('[slot="baseline"]')}get hasDiff(){return this.getSlotContentPresence('[slot="diff"]')}get canCompare(){return this.hasActual&&this.hasBaseline}handleChange(s){const t=s.target.selected[0];t&&(this.view=t)}handleZoomIn(){this.zoom+=.1}handleZoomClear(){this.zoom=1}handleZoomOut(){this.zoom-=.1}get error(){return e`
2
+ <sp-icon-alert class="icon" size="xl"></sp-icon-alert>
3
+ <p class="spectrum-Body spectrum-Body--sizeXL">
4
+ Please be sure to supply some combination of actual, baseline,
5
+ and diff screenshots for review.
6
+ </p>
7
+ `}get actual(){return e`
8
+ <div class="view actual">
9
+ <slot name="actual"></slot>
10
+ </div>
11
+ `}get baseline(){return e`
12
+ <div class="view baseline">
13
+ <slot name="baseline"></slot>
14
+ </div>
15
+ `}get diff(){return e`
16
+ <div class="view diff">
17
+ <slot name="diff"></slot>
18
+ </div>
19
+ `}get scrubber(){return e`
20
+ <sp-split-view resizable primary-size="50%">
21
+ ${this.baseline} ${this.actual}
22
+ </sp-split-view>
23
+ `}get sidebyside(){return e`
24
+ ${this.baseline} ${this.actual}
25
+ `}get onion(){return e`
26
+ <onion-skinner>
27
+ <slot name="baseline"></slot>
28
+ <slot name="actual"></slot>
29
+ </onion-skinner>
30
+ `}get renderView(){switch(this.view){case"error":return this.error;case"actual":return this.actual;case"baseline":return this.baseline;case"diff":return this.diff;case"onion":return this.onion;case"sidebyside":return this.sidebyside;case"scrubber":default:return this.scrubber}}get viewFallback(){return this.canCompare?"scrubber":this.hasActual?"actual":this.hasBaseline?"baseline":this.hasDiff?"diff":"error"}async prepImages(s){const t=s.target;if(this._loadingImages||!t.assignedNodes().length)return;this._loadingImages=!0,this.imagesLoaded=!1;const i=[...this.querySelectorAll("img")];if(!i.length){this.imagesLoaded=!0,this._loadingImages=!1;return}const r=i.map(o=>o.naturalWidth?(this.style.setProperty("--image-width",`${o.naturalWidth}px`),Promise.resolve()):new Promise(p=>{o.addEventListener("load",()=>{this.style.setProperty("--image-width",`${o.naturalWidth}px`),p(!0)})}));await Promise.all(r),this.imagesLoaded=!0,this._loadingImages=!1}shouldUpdate(){return(this.view==="error"||this.view==="actual"&&!this.hasActual||this.view==="baseline"&&!this.hasBaseline||this.view==="diff"&&!this.hasDiff||(this.view==="onion"||this.view==="sidebyside"||this.view==="scrubber")&&!this.canCompare)&&(this.view=this.viewFallback),!0}render(){return this._loadingImages?e`
31
+ <sp-progress-circle indeterminate></sp-progress-circle>
32
+ <slot
33
+ name="actual"
34
+ @slotchange=${this.prepImages}
35
+ hidden
36
+ ></slot>
37
+ <slot
38
+ name="baseline"
39
+ @slotchange=${this.prepImages}
40
+ hidden
41
+ ></slot>
42
+ <slot name="diff" @slotchange=${this.prepImages} hidden></slot>
43
+ `:this.imagesLoaded?e`
44
+ <sp-action-group
45
+ selects="single"
46
+ compact
47
+ emphasized
48
+ @change=${this.handleChange}
49
+ >
50
+ ${this.view!=="error"?n:e`
51
+ <sp-action-button value="error" disabled>
52
+ Error
53
+ </sp-action-button>
54
+ `}
55
+ ${this.canCompare?e`
56
+ <sp-action-button
57
+ value="scrubber"
58
+ ?selected=${this.view==="scrubber"}
59
+ >
60
+ Scrubber
61
+ </sp-action-button>
62
+ <sp-action-button
63
+ value="onion"
64
+ ?selected=${this.view==="onion"}
65
+ >
66
+ Onion skin
67
+ </sp-action-button>
68
+ <sp-action-button
69
+ value="sidebyside"
70
+ ?selected=${this.view==="sidebyside"}
71
+ >
72
+ Side by side
73
+ </sp-action-button>
74
+ `:n}
75
+ ${this.hasDiff?e`
76
+ <sp-action-button
77
+ value="diff"
78
+ ?selected=${this.view==="diff"}
79
+ >
80
+ Diff
81
+ </sp-action-button>
82
+ `:n}
83
+ ${this.hasActual?e`
84
+ <sp-action-button
85
+ value="actual"
86
+ ?selected=${this.view==="actual"}
87
+ >
88
+ Actual
89
+ </sp-action-button>
90
+ `:n}
91
+ ${this.hasBaseline?e`
92
+ <sp-action-button
93
+ value="baseline"
94
+ ?selected=${this.view==="baseline"}
95
+ >
96
+ Baseline
97
+ </sp-action-button>
98
+ `:n}
99
+ </sp-action-group>
100
+ <div class="review ${this.view}">${this.renderView}</div>
101
+ <sp-action-group compact class="zoom-controls">
102
+ <sp-action-button
103
+ @click=${this.handleZoomOut}
104
+ ?disabled=${this.zoom<=.5}
105
+ >
106
+ <sp-icon-zoom-out slot="icon"></sp-icon-zoom-out>
107
+ </sp-action-button>
108
+ <sp-action-button @click=${this.handleZoomClear}>
109
+ <sp-icon-refresh slot="icon"></sp-icon-refresh>
110
+ </sp-action-button>
111
+ <sp-action-button
112
+ @click=${this.handleZoomIn}
113
+ ?disabled=${this.zoom>=2}
114
+ >
115
+ <sp-icon-zoom-in slot="icon"></sp-icon-zoom-in>
116
+ </sp-action-button>
117
+ </sp-action-group>
118
+ `:e`
119
+ <p class="spectrum-Body spectrum-Body--sizeXL">
120
+ Choose a test to review on the left...
121
+ </p>
122
+ <slot
123
+ name="actual"
124
+ @slotchange=${this.prepImages}
125
+ hidden
126
+ ></slot>
127
+ <slot
128
+ name="baseline"
129
+ @slotchange=${this.prepImages}
130
+ hidden
131
+ ></slot>
132
+ <slot name="diff" @slotchange=${this.prepImages} hidden></slot>
133
+ `}updated(s){if(s.has("zoom")){let t=Math.min(this.zoom,2);t=Math.min(t,.5),this.style.setProperty("--zoom-level",`${this.zoom}`)}}}VrtCompare.styles=[m`
134
+ :host {
135
+ display: grid;
136
+ max-width: 100%;
137
+ overflow: auto;
138
+ margin: 0 auto;
139
+ position: relative;
140
+
141
+ --image-display-width: calc(
142
+ var(--zoom-level, 1) * var(--image-width, 500px)
143
+ );
144
+ }
145
+ sp-progress-circle {
146
+ margin: auto;
147
+ place-self: center;
148
+ }
149
+ .review {
150
+ margin: 100px auto 0;
151
+ display: flex;
152
+ width: var(--image-display-width);
153
+ place-self: start;
154
+ }
155
+ .error {
156
+ flex-direction: column;
157
+ }
158
+ ::slotted(img) {
159
+ display: flex;
160
+ pointer-events: none;
161
+ }
162
+ sp-action-group[selects] {
163
+ margin-bottom: 1em;
164
+ justify-content: center;
165
+ position: fixed;
166
+ top: calc(var(--swc-scale-factor) * 8px);
167
+ right: calc(var(--swc-scale-factor) * 8px);
168
+ }
169
+ .sidebyside {
170
+ display: flex;
171
+ gap: 2px;
172
+ }
173
+ .sidebyside ::slotted(img) {
174
+ width: 100%;
175
+ }
176
+ .view {
177
+ overflow: hidden;
178
+ }
179
+ .review:is(.baseline, .actual, .diff) .view,
180
+ .review:is(.baseline, .actual, .diff) ::slotted(img) {
181
+ width: 100%;
182
+ }
183
+ sp-split-view {
184
+ width: var(--image-display-width);
185
+ }
186
+ sp-split-view ::slotted(img) {
187
+ width: var(--image-display-width);
188
+ height: auto;
189
+ flex-shrink: 0;
190
+ }
191
+ sp-split-view .actual ::slotted(img) {
192
+ float: right;
193
+ }
194
+ p {
195
+ text-align: center;
196
+ margin: 0 3em;
197
+ }
198
+ .icon {
199
+ margin: 0 auto 2em;
200
+ display: flex;
201
+ color: var(--spectrum-semantic-negative-color-background);
202
+ }
203
+ .zoom-controls {
204
+ position: fixed;
205
+ bottom: calc(var(--swc-scale-factor) * 8px);
206
+ left: calc(var(--swc-scale-factor) * 8px);
207
+ z-index: 1;
208
+ }
209
+ `,b],l([d()],VrtCompare.prototype,"view",2),l([d({type:Number})],VrtCompare.prototype,"zoom",2),l([d({type:Boolean,attribute:!1})],VrtCompare.prototype,"imagesLoaded",2);
210
+ //# sourceMappingURL=VrtCompare.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["VrtCompare.ts"],
4
+ "sourcesContent": ["/*\nCopyright 2020 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\n\nimport {\n css,\n html,\n nothing,\n PropertyValues,\n SpectrumElement,\n TemplateResult,\n} from '@spectrum-web-components/base';\nimport { property } from '@spectrum-web-components/base/src/decorators.js';\nimport { ObserveSlotPresence } from '@spectrum-web-components/shared';\nimport { ActionGroup } from '@spectrum-web-components/action-group';\nimport bodyStyles from '@spectrum-web-components/styles/body.js';\nimport '@spectrum-web-components/action-button/sp-action-button.js';\nimport '@spectrum-web-components/action-group/sp-action-group.js';\nimport '@spectrum-web-components/split-view/sp-split-view.js';\nimport '@spectrum-web-components/icons-workflow/icons/sp-icon-alert.js';\nimport '@spectrum-web-components/icons-workflow/icons/sp-icon-zoom-in.js';\nimport '@spectrum-web-components/icons-workflow/icons/sp-icon-zoom-out.js';\nimport '@spectrum-web-components/icons-workflow/icons/sp-icon-refresh.js';\nimport '@spectrum-web-components/action-bar/sp-action-bar.js';\nimport '@spectrum-web-components/progress-circle/sp-progress-circle.js';\nimport '../onion-skinner.js';\n\nexport class VrtCompare extends ObserveSlotPresence(SpectrumElement, [\n '[slot=\"actual\"]',\n '[slot=\"baseline\"]',\n '[slot=\"diff\"]',\n]) {\n @property()\n public view = 'scrubber';\n\n @property({ type: Number })\n public zoom = 1;\n\n @property({ type: Boolean, attribute: false })\n public imagesLoaded = false;\n\n private get hasActual(): boolean {\n return this.getSlotContentPresence('[slot=\"actual\"]');\n }\n\n private get hasBaseline(): boolean {\n return this.getSlotContentPresence('[slot=\"baseline\"]');\n }\n\n private get hasDiff(): boolean {\n return this.getSlotContentPresence('[slot=\"diff\"]');\n }\n\n private get canCompare(): boolean {\n return this.hasActual && this.hasBaseline;\n }\n\n private handleChange(event: Event & { target: ActionGroup }) {\n const view = event.target.selected[0];\n if (view) {\n this.view = view;\n }\n }\n\n private handleZoomIn() {\n this.zoom += 0.1;\n }\n\n private handleZoomClear() {\n this.zoom = 1;\n }\n\n private handleZoomOut() {\n this.zoom -= 0.1;\n }\n\n protected get error() {\n return html`\n <sp-icon-alert class=\"icon\" size=\"xl\"></sp-icon-alert>\n <p class=\"spectrum-Body spectrum-Body--sizeXL\">\n Please be sure to supply some combination of actual, baseline,\n and diff screenshots for review.\n </p>\n `;\n }\n\n protected get actual() {\n return html`\n <div class=\"view actual\">\n <slot name=\"actual\"></slot>\n </div>\n `;\n }\n\n protected get baseline() {\n return html`\n <div class=\"view baseline\">\n <slot name=\"baseline\"></slot>\n </div>\n `;\n }\n\n protected get diff() {\n return html`\n <div class=\"view diff\">\n <slot name=\"diff\"></slot>\n </div>\n `;\n }\n\n protected get scrubber() {\n return html`\n <sp-split-view resizable primary-size=\"50%\">\n ${this.baseline} ${this.actual}\n </sp-split-view>\n `;\n }\n\n protected get sidebyside() {\n return html`\n ${this.baseline} ${this.actual}\n `;\n }\n\n protected get onion() {\n return html`\n <onion-skinner>\n <slot name=\"baseline\"></slot>\n <slot name=\"actual\"></slot>\n </onion-skinner>\n `;\n }\n\n protected get renderView() {\n switch (this.view) {\n case 'error':\n return this.error;\n case 'actual':\n return this.actual;\n case 'baseline':\n return this.baseline;\n case 'diff':\n return this.diff;\n case 'onion':\n return this.onion;\n case 'sidebyside':\n return this.sidebyside;\n case 'scrubber':\n default:\n return this.scrubber;\n }\n }\n\n private get viewFallback() {\n if (this.canCompare) {\n return 'scrubber';\n } else if (this.hasActual) {\n return 'actual';\n } else if (this.hasBaseline) {\n return 'baseline';\n } else if (this.hasDiff) {\n return 'diff';\n } else {\n return 'error';\n }\n }\n\n _loadingImages = false;\n\n async prepImages(event: Event) {\n const slot = event.target as HTMLSlotElement;\n if (this._loadingImages || !slot.assignedNodes().length) {\n return;\n }\n this._loadingImages = true;\n this.imagesLoaded = false;\n const images = [...this.querySelectorAll('img')];\n if (!images.length) {\n this.imagesLoaded = true;\n this._loadingImages = false;\n return;\n }\n const imageLoadPromises = images.map((img) => {\n if (img.naturalWidth) {\n this.style.setProperty(\n '--image-width',\n `${img.naturalWidth}px`\n );\n return Promise.resolve();\n }\n return new Promise((resolve) => {\n img.addEventListener('load', () => {\n this.style.setProperty(\n '--image-width',\n `${img.naturalWidth}px`\n );\n resolve(true);\n });\n });\n });\n await Promise.all(imageLoadPromises);\n this.imagesLoaded = true;\n this._loadingImages = false;\n }\n\n protected override shouldUpdate() {\n if (\n this.view === 'error' ||\n (this.view === 'actual' && !this.hasActual) ||\n (this.view === 'baseline' && !this.hasBaseline) ||\n (this.view === 'diff' && !this.hasDiff) ||\n ((this.view === 'onion' ||\n this.view === 'sidebyside' ||\n this.view === 'scrubber') &&\n !this.canCompare)\n ) {\n this.view = this.viewFallback;\n }\n return true;\n }\n\n protected override render(): TemplateResult {\n if (this._loadingImages) {\n return html`\n <sp-progress-circle indeterminate></sp-progress-circle>\n <slot\n name=\"actual\"\n @slotchange=${this.prepImages}\n hidden\n ></slot>\n <slot\n name=\"baseline\"\n @slotchange=${this.prepImages}\n hidden\n ></slot>\n <slot name=\"diff\" @slotchange=${this.prepImages} hidden></slot>\n `;\n }\n if (!this.imagesLoaded) {\n return html`\n <p class=\"spectrum-Body spectrum-Body--sizeXL\">\n Choose a test to review on the left...\n </p>\n <slot\n name=\"actual\"\n @slotchange=${this.prepImages}\n hidden\n ></slot>\n <slot\n name=\"baseline\"\n @slotchange=${this.prepImages}\n hidden\n ></slot>\n <slot name=\"diff\" @slotchange=${this.prepImages} hidden></slot>\n `;\n }\n return html`\n <sp-action-group\n selects=\"single\"\n compact\n emphasized\n @change=${this.handleChange}\n >\n ${this.view !== 'error'\n ? nothing\n : html`\n <sp-action-button value=\"error\" disabled>\n Error\n </sp-action-button>\n `}\n ${!this.canCompare\n ? nothing\n : html`\n <sp-action-button\n value=\"scrubber\"\n ?selected=${this.view === 'scrubber'}\n >\n Scrubber\n </sp-action-button>\n <sp-action-button\n value=\"onion\"\n ?selected=${this.view === 'onion'}\n >\n Onion skin\n </sp-action-button>\n <sp-action-button\n value=\"sidebyside\"\n ?selected=${this.view === 'sidebyside'}\n >\n Side by side\n </sp-action-button>\n `}\n ${!this.hasDiff\n ? nothing\n : html`\n <sp-action-button\n value=\"diff\"\n ?selected=${this.view === 'diff'}\n >\n Diff\n </sp-action-button>\n `}\n ${!this.hasActual\n ? nothing\n : html`\n <sp-action-button\n value=\"actual\"\n ?selected=${this.view === 'actual'}\n >\n Actual\n </sp-action-button>\n `}\n ${!this.hasBaseline\n ? nothing\n : html`\n <sp-action-button\n value=\"baseline\"\n ?selected=${this.view === 'baseline'}\n >\n Baseline\n </sp-action-button>\n `}\n </sp-action-group>\n <div class=\"review ${this.view}\">${this.renderView}</div>\n <sp-action-group compact class=\"zoom-controls\">\n <sp-action-button\n @click=${this.handleZoomOut}\n ?disabled=${this.zoom <= 0.5}\n >\n <sp-icon-zoom-out slot=\"icon\"></sp-icon-zoom-out>\n </sp-action-button>\n <sp-action-button @click=${this.handleZoomClear}>\n <sp-icon-refresh slot=\"icon\"></sp-icon-refresh>\n </sp-action-button>\n <sp-action-button\n @click=${this.handleZoomIn}\n ?disabled=${this.zoom >= 2}\n >\n <sp-icon-zoom-in slot=\"icon\"></sp-icon-zoom-in>\n </sp-action-button>\n </sp-action-group>\n `;\n }\n\n protected override updated(changes: PropertyValues) {\n if (changes.has('zoom')) {\n let zoom = Math.min(this.zoom, 2);\n zoom = Math.min(zoom, 0.5);\n this.style.setProperty('--zoom-level', `${this.zoom}`);\n }\n }\n\n static override styles = [\n css`\n :host {\n display: grid;\n max-width: 100%;\n overflow: auto;\n margin: 0 auto;\n position: relative;\n\n --image-display-width: calc(\n var(--zoom-level, 1) * var(--image-width, 500px)\n );\n }\n sp-progress-circle {\n margin: auto;\n place-self: center;\n }\n .review {\n margin: 100px auto 0;\n display: flex;\n width: var(--image-display-width);\n place-self: start;\n }\n .error {\n flex-direction: column;\n }\n ::slotted(img) {\n display: flex;\n pointer-events: none;\n }\n sp-action-group[selects] {\n margin-bottom: 1em;\n justify-content: center;\n position: fixed;\n top: calc(var(--swc-scale-factor) * 8px);\n right: calc(var(--swc-scale-factor) * 8px);\n }\n .sidebyside {\n display: flex;\n gap: 2px;\n }\n .sidebyside ::slotted(img) {\n width: 100%;\n }\n .view {\n overflow: hidden;\n }\n .review:is(.baseline, .actual, .diff) .view,\n .review:is(.baseline, .actual, .diff) ::slotted(img) {\n width: 100%;\n }\n sp-split-view {\n width: var(--image-display-width);\n }\n sp-split-view ::slotted(img) {\n width: var(--image-display-width);\n height: auto;\n flex-shrink: 0;\n }\n sp-split-view .actual ::slotted(img) {\n float: right;\n }\n p {\n text-align: center;\n margin: 0 3em;\n }\n .icon {\n margin: 0 auto 2em;\n display: flex;\n color: var(--spectrum-semantic-negative-color-background);\n }\n .zoom-controls {\n position: fixed;\n bottom: calc(var(--swc-scale-factor) * 8px);\n left: calc(var(--swc-scale-factor) * 8px);\n z-index: 1;\n }\n `,\n bodyStyles,\n ];\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["css", "html", "nothing", "SpectrumElement", "property", "ObserveSlotPresence", "bodyStyles", "event", "view", "slot", "images", "imageLoadPromises", "img", "resolve", "changes", "zoom", "__decorateClass"]
7
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ export * from "./VrtCompare.dev.js";
3
+ //# sourceMappingURL=index.dev.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["index.ts"],
4
+ "sourcesContent": ["/*\nCopyright 2020 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\n\nexport * from './VrtCompare.dev.js'\n"],
5
+ "mappings": ";AAYA,cAAc;",
6
+ "names": []
7
+ }
package/src/index.js ADDED
@@ -0,0 +1,2 @@
1
+ "use strict";export*from"./VrtCompare.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["index.ts"],
4
+ "sourcesContent": ["/*\nCopyright 2020 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\n\nexport * from './VrtCompare.js';\n"],
5
+ "mappings": "aAYA,WAAc",
6
+ "names": []
7
+ }
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ import { VrtCompare } from "./src/VrtCompare.dev.js";
3
+ customElements.define("vrt-compare", VrtCompare);
4
+ //# sourceMappingURL=vrt-compare.dev.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["vrt-compare.ts"],
4
+ "sourcesContent": ["/*\nCopyright 2020 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\n\nimport { VrtCompare } from './src/VrtCompare.dev.js'\n\ncustomElements.define('vrt-compare', VrtCompare);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'vrt-compare': VrtCompare;\n }\n}\n"],
5
+ "mappings": ";AAYA,SAAS,kBAAkB;AAE3B,eAAe,OAAO,eAAe,UAAU;",
6
+ "names": []
7
+ }
package/vrt-compare.js ADDED
@@ -0,0 +1,2 @@
1
+ "use strict";import{VrtCompare as e}from"./src/VrtCompare.js";customElements.define("vrt-compare",e);
2
+ //# sourceMappingURL=vrt-compare.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["vrt-compare.ts"],
4
+ "sourcesContent": ["/*\nCopyright 2020 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\n\nimport { VrtCompare } from './src/VrtCompare.js';\n\ncustomElements.define('vrt-compare', VrtCompare);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'vrt-compare': VrtCompare;\n }\n}\n"],
5
+ "mappings": "aAYA,OAAS,cAAAA,MAAkB,sBAE3B,eAAe,OAAO,cAAeA,CAAU",
6
+ "names": ["VrtCompare"]
7
+ }