@spectrum-web-components/vrt-compare 0.41.1 → 0.42.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +11 -11
- package/src/VrtCompare.dev.js +4 -6
- package/src/VrtCompare.dev.js.map +2 -2
- package/src/VrtCompare.js +6 -8
- package/src/VrtCompare.js.map +2 -2
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@spectrum-web-components/vrt-compare",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.42.0",
|
|
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": "^0.
|
|
64
|
-
"@spectrum-web-components/action-button": "^0.
|
|
65
|
-
"@spectrum-web-components/action-group": "^0.
|
|
66
|
-
"@spectrum-web-components/base": "^0.
|
|
67
|
-
"@spectrum-web-components/icons-workflow": "^0.
|
|
68
|
-
"@spectrum-web-components/shared": "^0.
|
|
69
|
-
"@spectrum-web-components/split-view": "^0.
|
|
70
|
-
"@spectrum-web-components/styles": "^0.
|
|
71
|
-
"@spectrum-web-components/theme": "^0.
|
|
63
|
+
"@spectrum-web-components/action-bar": "^0.42.0",
|
|
64
|
+
"@spectrum-web-components/action-button": "^0.42.0",
|
|
65
|
+
"@spectrum-web-components/action-group": "^0.42.0",
|
|
66
|
+
"@spectrum-web-components/base": "^0.42.0",
|
|
67
|
+
"@spectrum-web-components/icons-workflow": "^0.42.0",
|
|
68
|
+
"@spectrum-web-components/shared": "^0.42.0",
|
|
69
|
+
"@spectrum-web-components/split-view": "^0.42.0",
|
|
70
|
+
"@spectrum-web-components/styles": "^0.42.0",
|
|
71
|
+
"@spectrum-web-components/theme": "^0.42.0"
|
|
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": "
|
|
81
|
+
"gitHead": "9b3bd55ff8e8f9438817255976e77fd456b19d72"
|
|
82
82
|
}
|
package/src/VrtCompare.dev.js
CHANGED
|
@@ -345,8 +345,8 @@ VrtCompare.styles = [
|
|
|
345
345
|
margin-bottom: 1em;
|
|
346
346
|
justify-content: center;
|
|
347
347
|
position: fixed;
|
|
348
|
-
top: calc(var(--
|
|
349
|
-
right: calc(var(--
|
|
348
|
+
top: calc(var(--swc-scale-factor) * 8px);
|
|
349
|
+
right: calc(var(--swc-scale-factor) * 8px);
|
|
350
350
|
}
|
|
351
351
|
.sidebyside {
|
|
352
352
|
display: flex;
|
|
@@ -384,10 +384,8 @@ VrtCompare.styles = [
|
|
|
384
384
|
}
|
|
385
385
|
.zoom-controls {
|
|
386
386
|
position: fixed;
|
|
387
|
-
bottom: calc(var(--
|
|
388
|
-
left: calc(
|
|
389
|
-
240px + 48px + var(--spectrum-global-dimension-size-200) / 2
|
|
390
|
-
);
|
|
387
|
+
bottom: calc(var(--swc-scale-factor) * 8px);
|
|
388
|
+
left: calc(var(--swc-scale-factor) * 8px);
|
|
391
389
|
z-index: 1;
|
|
392
390
|
}
|
|
393
391
|
`,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
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(--spectrum-global-dimension-size-200) / 2);\n right: calc(var(--spectrum-global-dimension-size-200) / 2);\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(--spectrum-global-dimension-size-200) / 2);\n left: calc(\n 240px + 48px + var(--spectrum-global-dimension-size-200) / 2\n );\n z-index: 1;\n }\n `,\n bodyStyles,\n ];\n}\n"],
|
|
5
|
-
"mappings": "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
|
|
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
6
|
"names": []
|
|
7
7
|
}
|
package/src/VrtCompare.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
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
|
|
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
2
|
<sp-icon-alert class="icon" size="xl"></sp-icon-alert>
|
|
3
3
|
<p class="spectrum-Body spectrum-Body--sizeXL">
|
|
4
4
|
Please be sure to supply some combination of actual, baseline,
|
|
@@ -163,8 +163,8 @@
|
|
|
163
163
|
margin-bottom: 1em;
|
|
164
164
|
justify-content: center;
|
|
165
165
|
position: fixed;
|
|
166
|
-
top: calc(var(--
|
|
167
|
-
right: calc(var(--
|
|
166
|
+
top: calc(var(--swc-scale-factor) * 8px);
|
|
167
|
+
right: calc(var(--swc-scale-factor) * 8px);
|
|
168
168
|
}
|
|
169
169
|
.sidebyside {
|
|
170
170
|
display: flex;
|
|
@@ -202,11 +202,9 @@
|
|
|
202
202
|
}
|
|
203
203
|
.zoom-controls {
|
|
204
204
|
position: fixed;
|
|
205
|
-
bottom: calc(var(--
|
|
206
|
-
left: calc(
|
|
207
|
-
240px + 48px + var(--spectrum-global-dimension-size-200) / 2
|
|
208
|
-
);
|
|
205
|
+
bottom: calc(var(--swc-scale-factor) * 8px);
|
|
206
|
+
left: calc(var(--swc-scale-factor) * 8px);
|
|
209
207
|
z-index: 1;
|
|
210
208
|
}
|
|
211
|
-
`,
|
|
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);
|
|
212
210
|
//# sourceMappingURL=VrtCompare.js.map
|
package/src/VrtCompare.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
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(--spectrum-global-dimension-size-200) / 2);\n right: calc(var(--spectrum-global-dimension-size-200) / 2);\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(--spectrum-global-dimension-size-200) / 2);\n left: calc(\n 240px + 48px + var(--spectrum-global-dimension-size-200) / 2\n );\n z-index: 1;\n }\n `,\n bodyStyles,\n ];\n}\n"],
|
|
5
|
-
"mappings": "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
|
|
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
6
|
"names": ["css", "html", "nothing", "SpectrumElement", "property", "ObserveSlotPresence", "bodyStyles", "event", "view", "slot", "images", "imageLoadPromises", "img", "resolve", "changes", "zoom", "__decorateClass"]
|
|
7
7
|
}
|