@sky.ui/core 0.0.42 → 0.0.43
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/dist/custom-elements.json +2850 -2850
- package/dist/helper/controllers/animation-controller.d.ts +4 -4
- package/dist/helper/controllers/animation-controller.js.map +1 -1
- package/dist/helper/iconify-offline.js.map +1 -1
- package/dist/helper/utils/color-resolver.js.map +1 -1
- package/dist/helper/utils/contrast-color.js.map +1 -1
- package/dist/helper/utils/size-resolver.js.map +1 -1
- package/dist/sky-alert/sky-alert.js.map +1 -1
- package/dist/sky-appbar/sky-appbar.js.map +1 -1
- package/dist/sky-avatar/sky-avatar.js.map +1 -1
- package/dist/sky-badge/sky-badge.js.map +1 -1
- package/dist/sky-button/sky-button.js.map +1 -1
- package/dist/sky-card/sky-card.js.map +1 -1
- package/dist/sky-checkbox/sky-checkbox.js.map +1 -1
- package/dist/sky-chip/sky-chip.js.map +1 -1
- package/dist/sky-col/sky-col.js.map +1 -1
- package/dist/sky-combobox/sky-combobox.js.map +1 -1
- package/dist/sky-dialog/sky-dialog.js.map +1 -1
- package/dist/sky-divider/sky-divider.js.map +1 -1
- package/dist/sky-flexbox/sky-flexbox.js.map +1 -1
- package/dist/sky-flexcol/sky-flexcol.js.map +1 -1
- package/dist/sky-grid/sky-grid.js.map +1 -1
- package/dist/sky-icon/sky-icon.js +1 -1
- package/dist/sky-icon/sky-icon.js.map +1 -1
- package/dist/sky-image/sky-image.js.map +1 -1
- package/dist/sky-image/srcset-utils.js.map +1 -1
- package/dist/sky-input/sky-input.js.map +1 -1
- package/dist/sky-list/sky-list.js.map +1 -1
- package/dist/sky-listitem/sky-listitem.js.map +1 -1
- package/dist/sky-radio/sky-radio.js.map +1 -1
- package/dist/sky-row/sky-row.js.map +1 -1
- package/dist/sky-sheet/sky-sheet.js.map +1 -1
- package/dist/sky-simple-table/sky-simple-table.js.map +1 -1
- package/dist/sky-theme-provider/sky-theme-provider.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sky-image.js","sources":["../../src/sky-image/sky-image.ts"],"sourcesContent":["import { LitElement, html, css, nothing } from \"lit\";\r\nimport type { PropertyValues } from \"lit\";\r\nimport { customElement, property, state } from \"lit/decorators.js\";\r\nimport { styleMap } from \"lit/directives/style-map.js\";\r\nimport { resolveImageFallbackSrc } from \"./srcset-utils.js\";\r\nimport { PresetController } from \"../helper/controllers/preset-controller\";\n\r\nexport type SkyImageLoading = \"lazy\" | \"eager\";\r\nexport type SkyImageDecoding = \"async\" | \"sync\" | \"auto\";\r\n\r\n/**\r\n * @element sky-image\r\n *\r\n * @summary Responsive image component with style controls, `srcset`, and optional auto `sizes`.\r\n *\r\n * @status stable\r\n * @since 1.0.0\r\n *\r\n * @documentation https://sky-ui.com/components/image\r\n *\r\n * @slot - No slots are exposed; image content is rendered internally.\r\n * @property {string} src - Primary image source URL.\r\n * @property {string} alt - Alternative text for accessibility.\r\n * @property {string} width - CSS width for the rendered image.\r\n * @property {string} height - CSS height for the rendered image.\r\n * @property {string | null} aspectRatio - CSS `aspect-ratio` value.\r\n * @property {string} borderRadius - CSS border radius.\r\n * @property {string} boxShadow - CSS box shadow.\r\n * @property {string} objectFit - CSS object-fit value.\r\n * @property {string} objectPosition - CSS object-position value.\r\n * @property {string} srcset - Responsive source set string.\r\n * @property {string} sizes - Responsive sizes string.\r\n * @property {boolean} autoSizes - Computes `sizes` from host width when true.\r\n * @property {SkyImageLoading} loading - Native loading hint.\r\n * @property {SkyImageDecoding} decoding - Native decoding hint.\r\n * @property {string} preset - Named prop preset from nearest `sky-config-provider`. Default: `\"\"`.\n *\r\n * @csspart img - The underlying `<img>` element.\r\n *\r\n * @Behavior\r\n * - Renders a fallback visual placeholder when `src` is empty\r\n * - Supports automatic `sizes` updates using ResizeObserver\r\n * - Forwards native image loading and decoding hints\r\n *\r\n * @example\r\n * ```html\r\n * <sky-image\r\n * src=\"/images/photo-1280.jpg\"\r\n * srcset=\"/images/photo-640.jpg 640w, /images/photo-960.jpg 960w, /images/photo-1280.jpg 1280w\"\r\n * sizes=\"(max-width: 768px) 100vw, 50vw\"\r\n * alt=\"Responsive photo\"\r\n * width=\"100%\"\r\n * aspect-ratio=\"4/3\"\r\n * border-radius=\"8px\"\r\n * loading=\"lazy\"\r\n * ></sky-image>\r\n * ```\r\n * ```vue\r\n * <template>\r\n * <sky-image\r\n * src=\"/images/photo-1280.jpg\"\r\n * srcset=\"/images/photo-640.jpg 640w, /images/photo-960.jpg 960w, /images/photo-1280.jpg 1280w\"\r\n * sizes=\"(max-width: 768px) 100vw, 50vw\"\r\n * alt=\"Responsive photo\"\r\n * width=\"100%\"\r\n * aspect-ratio=\"4/3\"\r\n * border-radius=\"8px\"\r\n * ></sky-image>\r\n * </template>\r\n * ```\r\n * ```jsx\r\n * export default function Demo() {\r\n * return (\r\n * <sky-image\r\n * src=\"/images/photo-1280.jpg\"\r\n * srcset=\"/images/photo-640.jpg 640w, /images/photo-960.jpg 960w, /images/photo-1280.jpg 1280w\"\r\n * sizes=\"(max-width: 768px) 100vw, 50vw\"\r\n * alt=\"Responsive photo\"\r\n * width=\"100%\"\r\n * aspect-ratio=\"4/3\"\r\n * border-radius=\"8px\"\r\n * ></sky-image>\r\n * );\r\n * }\r\n * ```\r\n */\r\n@customElement(\"sky-image\")\r\nexport class SkyImage extends LitElement {\r\n @property({ type: String }) src = \"\";\r\n @property({ type: String }) alt = \"Image\";\r\n @property({ type: String }) width = \"auto\";\r\n @property({ type: String }) height = \"auto\";\r\n @property({ type: String }) aspectRatio: string | null = null;\r\n @property({ type: String }) borderRadius = \"0\";\r\n @property({ type: String }) boxShadow = \"none\";\r\n @property({ type: String }) objectFit = \"cover\";\r\n @property({ type: String }) objectPosition = \"center\";\r\n\r\n @property({ type: String }) srcset = \"\";\r\n @property({ type: String }) sizes = \"\";\r\n\r\n @property({ type: Boolean }) autoSizes = false;\r\n @state() private _computedSizes = \"\";\r\n\r\n @property({ type: String }) loading: SkyImageLoading = \"lazy\";\r\n @property({ type: String }) decoding: SkyImageDecoding = \"async\";\r\n\r\n\n /** Named prop preset from nearest `sky-config-provider`. */\n @property({ type: String, reflect: true }) preset = \"\";\n\n private _presets = new PresetController(this);\n\n static override styles = css`\r\n :host {\r\n display: inline-block;\r\n max-width: 100%;\r\n }\r\n\r\n img,\r\n .placeholder {\r\n display: block;\r\n max-width: 100%;\r\n }\r\n\r\n .placeholder {\r\n background: var(--sky-hover-tertiary);\r\n }\r\n `;\r\n\r\n private _ro?: ResizeObserver;\r\n private _sizesRafId: number | null = null;\r\n private _updateSizes = () => {\r\n if (this._sizesRafId != null) return;\r\n this._sizesRafId = requestAnimationFrame(() => {\r\n this._sizesRafId = null;\r\n const w = Math.ceil(this.getBoundingClientRect().width);\r\n if (w > 0) this._computedSizes = `${w}px`;\r\n });\r\n };\r\n\r\n override connectedCallback(): void {\r\n super.connectedCallback();\r\n // firstUpdated runs only once; re-create the observer when the element\r\n // is moved back into the document after a disconnect.\r\n this._ensureAutoSizesObserver();\r\n }\r\n\r\n override firstUpdated(): void {\r\n this._ensureAutoSizesObserver();\r\n }\r\n\r\n private _ensureAutoSizesObserver(): void {\r\n if (!this.autoSizes) return;\r\n if (!this._ro) {\r\n this._ro = new ResizeObserver(this._updateSizes);\r\n this._ro.observe(this);\r\n }\r\n this._updateSizes();\r\n }\r\n\r\n override updated(changed: PropertyValues<this>): void {\r\n super.updated(changed);\r\n\r\n if (changed.has(\"autoSizes\")) {\r\n if (this.autoSizes) {\r\n this._ensureAutoSizesObserver();\r\n } else {\r\n this._ro?.disconnect();\r\n this._ro = undefined;\r\n this._computedSizes = \"\";\r\n }\r\n }\r\n\r\n if (!this._shouldResyncImageSource(changed)) return;\r\n this._resyncImageSource(\r\n changed.has(\"srcset\") && changed.get(\"srcset\") !== undefined,\r\n );\r\n }\r\n\r\n override disconnectedCallback(): void {\r\n super.disconnectedCallback();\r\n this._ro?.disconnect();\r\n this._ro = undefined;\r\n if (this._sizesRafId != null) {\r\n cancelAnimationFrame(this._sizesRafId);\r\n this._sizesRafId = null;\r\n }\r\n }\r\n\r\n /** Browsers keep the resolved resource when only srcset/sizes attrs change on a live <img>. */\r\n private _shouldResyncImageSource(changed: PropertyValues<this>): boolean {\r\n // Lit's PropertyValues<this> excludes private reactive state from keyof this,\r\n // although @state changes are present in the runtime map.\r\n const allChanged = changed as unknown as Map<PropertyKey, unknown>;\r\n if (!this.src?.trim() && !this.srcset?.trim()) return false;\r\n if (changed.has(\"src\") && changed.get(\"src\") !== undefined) return true;\r\n if (changed.has(\"srcset\") && changed.get(\"srcset\") !== undefined) return true;\r\n if (changed.has(\"sizes\") && changed.get(\"sizes\") !== undefined) return true;\r\n if (\r\n this.autoSizes &&\r\n allChanged.has(\"_computedSizes\") &&\r\n allChanged.get(\"_computedSizes\") !== undefined\r\n ) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n private _resolvedSizesAttr(): string {\r\n return this.autoSizes ? this._computedSizes : this.sizes || \"\";\r\n }\r\n\r\n /** `src` used on <img> — must stay in sync with `srcset` when the set changes. */\r\n private _displaySrc(): string {\r\n const explicit = this.src?.trim() ?? \"\";\r\n const srcset = this.srcset?.trim() ?? \"\";\r\n if (!explicit && !srcset) return \"\";\r\n if (!srcset) return explicit;\r\n return resolveImageFallbackSrc(explicit, srcset);\r\n }\r\n\r\n private _applyImgAttrs(img: HTMLImageElement, srcsetChanged: boolean): void {\r\n const srcset = this.srcset?.trim() ?? \"\";\r\n const sizesAttr = this._resolvedSizesAttr();\r\n const src = this._displaySrc();\r\n\r\n if (srcset) img.srcset = srcset;\r\n else img.removeAttribute(\"srcset\");\r\n\r\n if (sizesAttr) img.sizes = sizesAttr;\r\n else img.removeAttribute(\"sizes\");\r\n\r\n // When the candidate list changes, drop `src` first so the UA cannot keep the old resource.\r\n if (srcsetChanged) img.removeAttribute(\"src\");\r\n img.src = src;\r\n }\r\n\r\n private _resyncImageSource(srcsetChanged = false): void {\r\n const img = this.renderRoot.querySelector(\"img\");\r\n if (!(img instanceof HTMLImageElement)) return;\r\n\r\n const replacement = img.cloneNode(false) as HTMLImageElement;\r\n replacement.alt = this.alt;\r\n replacement.loading = this.loading;\r\n replacement.decoding = this.decoding;\r\n const style = img.getAttribute(\"style\");\r\n if (style) replacement.setAttribute(\"style\", style);\r\n replacement.setAttribute(\"part\", \"img\");\r\n\r\n this._applyImgAttrs(replacement, srcsetChanged);\r\n img.replaceWith(replacement);\r\n }\r\n\r\n override render() {\r\n const sizesAttr = this._resolvedSizesAttr();\r\n const displaySrc = this._displaySrc();\r\n const hasSrc = displaySrc !== \"\";\r\n\r\n const styleVars = {\r\n width: this.width,\r\n height: this.height,\r\n borderRadius: this.borderRadius,\r\n boxShadow: this.boxShadow,\r\n objectFit: this.objectFit,\r\n objectPosition: this.objectPosition,\r\n aspectRatio: this.aspectRatio ?? \"auto\",\r\n };\r\n\r\n if (!hasSrc) {\r\n return html`\r\n <div\r\n class=\"placeholder\"\r\n part=\"img\"\r\n style=${styleMap(styleVars)}\r\n aria-label=${this.alt}\r\n role=\"img\"\r\n ></div>\r\n `;\r\n }\r\n\r\n return html`\r\n <img\r\n src=${displaySrc}\r\n alt=${this.alt}\r\n srcset=${this.srcset || nothing}\r\n sizes=${sizesAttr || nothing}\r\n loading=${this.loading}\r\n decoding=${this.decoding}\r\n style=${styleMap(styleVars)}\r\n part=\"img\"\r\n />\r\n `;\r\n }\r\n}\r\n"],"names":["SkyImage","LitElement","constructor","super","arguments","this","src","alt","width","height","aspectRatio","borderRadius","boxShadow","objectFit","objectPosition","srcset","sizes","autoSizes","_computedSizes","loading","decoding","preset","_presets","PresetController","_sizesRafId","_updateSizes","requestAnimationFrame","w","Math","ceil","getBoundingClientRect","connectedCallback","_ensureAutoSizesObserver","firstUpdated","_ro","ResizeObserver","observe","updated","changed","has","disconnect","_shouldResyncImageSource","_resyncImageSource","get","disconnectedCallback","cancelAnimationFrame","allChanged","trim","_resolvedSizesAttr","_displaySrc","explicit","resolveImageFallbackSrc","_applyImgAttrs","img","srcsetChanged","sizesAttr","removeAttribute","renderRoot","querySelector","HTMLImageElement","replacement","cloneNode","style","getAttribute","setAttribute","replaceWith","render","displaySrc","hasSrc","styleVars","html","nothing","styleMap","styles","css","__decorateClass","property","type","String","prototype","Boolean","state","reflect","customElement"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sky-image.js","sources":["../../src/sky-image/sky-image.ts"],"sourcesContent":["import { LitElement, html, css, nothing } from \"lit\";\r\nimport type { PropertyValues } from \"lit\";\r\nimport { customElement, property, state } from \"lit/decorators.js\";\r\nimport { styleMap } from \"lit/directives/style-map.js\";\r\nimport { resolveImageFallbackSrc } from \"./srcset-utils.js\";\r\nimport { PresetController } from \"../helper/controllers/preset-controller\";\r\n\r\nexport type SkyImageLoading = \"lazy\" | \"eager\";\r\nexport type SkyImageDecoding = \"async\" | \"sync\" | \"auto\";\r\n\r\n/**\r\n * @element sky-image\r\n *\r\n * @summary Responsive image component with style controls, `srcset`, and optional auto `sizes`.\r\n *\r\n * @status stable\r\n * @since 1.0.0\r\n *\r\n * @documentation https://sky-ui.com/components/image\r\n *\r\n * @slot - No slots are exposed; image content is rendered internally.\r\n * @property {string} src - Primary image source URL.\r\n * @property {string} alt - Alternative text for accessibility.\r\n * @property {string} width - CSS width for the rendered image.\r\n * @property {string} height - CSS height for the rendered image.\r\n * @property {string | null} aspectRatio - CSS `aspect-ratio` value.\r\n * @property {string} borderRadius - CSS border radius.\r\n * @property {string} boxShadow - CSS box shadow.\r\n * @property {string} objectFit - CSS object-fit value.\r\n * @property {string} objectPosition - CSS object-position value.\r\n * @property {string} srcset - Responsive source set string.\r\n * @property {string} sizes - Responsive sizes string.\r\n * @property {boolean} autoSizes - Computes `sizes` from host width when true.\r\n * @property {SkyImageLoading} loading - Native loading hint.\r\n * @property {SkyImageDecoding} decoding - Native decoding hint.\r\n * @property {string} preset - Named prop preset from nearest `sky-config-provider`. Default: `\"\"`.\r\n *\r\n * @csspart img - The underlying `<img>` element.\r\n *\r\n * @Behavior\r\n * - Renders a fallback visual placeholder when `src` is empty\r\n * - Supports automatic `sizes` updates using ResizeObserver\r\n * - Forwards native image loading and decoding hints\r\n *\r\n * @example\r\n * ```html\r\n * <sky-image\r\n * src=\"/images/photo-1280.jpg\"\r\n * srcset=\"/images/photo-640.jpg 640w, /images/photo-960.jpg 960w, /images/photo-1280.jpg 1280w\"\r\n * sizes=\"(max-width: 768px) 100vw, 50vw\"\r\n * alt=\"Responsive photo\"\r\n * width=\"100%\"\r\n * aspect-ratio=\"4/3\"\r\n * border-radius=\"8px\"\r\n * loading=\"lazy\"\r\n * ></sky-image>\r\n * ```\r\n * ```vue\r\n * <template>\r\n * <sky-image\r\n * src=\"/images/photo-1280.jpg\"\r\n * srcset=\"/images/photo-640.jpg 640w, /images/photo-960.jpg 960w, /images/photo-1280.jpg 1280w\"\r\n * sizes=\"(max-width: 768px) 100vw, 50vw\"\r\n * alt=\"Responsive photo\"\r\n * width=\"100%\"\r\n * aspect-ratio=\"4/3\"\r\n * border-radius=\"8px\"\r\n * ></sky-image>\r\n * </template>\r\n * ```\r\n * ```jsx\r\n * export default function Demo() {\r\n * return (\r\n * <sky-image\r\n * src=\"/images/photo-1280.jpg\"\r\n * srcset=\"/images/photo-640.jpg 640w, /images/photo-960.jpg 960w, /images/photo-1280.jpg 1280w\"\r\n * sizes=\"(max-width: 768px) 100vw, 50vw\"\r\n * alt=\"Responsive photo\"\r\n * width=\"100%\"\r\n * aspect-ratio=\"4/3\"\r\n * border-radius=\"8px\"\r\n * ></sky-image>\r\n * );\r\n * }\r\n * ```\r\n */\r\n@customElement(\"sky-image\")\r\nexport class SkyImage extends LitElement {\r\n @property({ type: String }) src = \"\";\r\n @property({ type: String }) alt = \"Image\";\r\n @property({ type: String }) width = \"auto\";\r\n @property({ type: String }) height = \"auto\";\r\n @property({ type: String }) aspectRatio: string | null = null;\r\n @property({ type: String }) borderRadius = \"0\";\r\n @property({ type: String }) boxShadow = \"none\";\r\n @property({ type: String }) objectFit = \"cover\";\r\n @property({ type: String }) objectPosition = \"center\";\r\n\r\n @property({ type: String }) srcset = \"\";\r\n @property({ type: String }) sizes = \"\";\r\n\r\n @property({ type: Boolean }) autoSizes = false;\r\n @state() private _computedSizes = \"\";\r\n\r\n @property({ type: String }) loading: SkyImageLoading = \"lazy\";\r\n @property({ type: String }) decoding: SkyImageDecoding = \"async\";\r\n\r\n\r\n /** Named prop preset from nearest `sky-config-provider`. */\r\n @property({ type: String, reflect: true }) preset = \"\";\r\n\r\n private _presets = new PresetController(this);\r\n\r\n static override styles = css`\r\n :host {\r\n display: inline-block;\r\n max-width: 100%;\r\n }\r\n\r\n img,\r\n .placeholder {\r\n display: block;\r\n max-width: 100%;\r\n }\r\n\r\n .placeholder {\r\n background: var(--sky-hover-tertiary);\r\n }\r\n `;\r\n\r\n private _ro?: ResizeObserver;\r\n private _sizesRafId: number | null = null;\r\n private _updateSizes = () => {\r\n if (this._sizesRafId != null) return;\r\n this._sizesRafId = requestAnimationFrame(() => {\r\n this._sizesRafId = null;\r\n const w = Math.ceil(this.getBoundingClientRect().width);\r\n if (w > 0) this._computedSizes = `${w}px`;\r\n });\r\n };\r\n\r\n override connectedCallback(): void {\r\n super.connectedCallback();\r\n // firstUpdated runs only once; re-create the observer when the element\r\n // is moved back into the document after a disconnect.\r\n this._ensureAutoSizesObserver();\r\n }\r\n\r\n override firstUpdated(): void {\r\n this._ensureAutoSizesObserver();\r\n }\r\n\r\n private _ensureAutoSizesObserver(): void {\r\n if (!this.autoSizes) return;\r\n if (!this._ro) {\r\n this._ro = new ResizeObserver(this._updateSizes);\r\n this._ro.observe(this);\r\n }\r\n this._updateSizes();\r\n }\r\n\r\n override updated(changed: PropertyValues<this>): void {\r\n super.updated(changed);\r\n\r\n if (changed.has(\"autoSizes\")) {\r\n if (this.autoSizes) {\r\n this._ensureAutoSizesObserver();\r\n } else {\r\n this._ro?.disconnect();\r\n this._ro = undefined;\r\n this._computedSizes = \"\";\r\n }\r\n }\r\n\r\n if (!this._shouldResyncImageSource(changed)) return;\r\n this._resyncImageSource(\r\n changed.has(\"srcset\") && changed.get(\"srcset\") !== undefined,\r\n );\r\n }\r\n\r\n override disconnectedCallback(): void {\r\n super.disconnectedCallback();\r\n this._ro?.disconnect();\r\n this._ro = undefined;\r\n if (this._sizesRafId != null) {\r\n cancelAnimationFrame(this._sizesRafId);\r\n this._sizesRafId = null;\r\n }\r\n }\r\n\r\n /** Browsers keep the resolved resource when only srcset/sizes attrs change on a live <img>. */\r\n private _shouldResyncImageSource(changed: PropertyValues<this>): boolean {\r\n // Lit's PropertyValues<this> excludes private reactive state from keyof this,\r\n // although @state changes are present in the runtime map.\r\n const allChanged = changed as unknown as Map<PropertyKey, unknown>;\r\n if (!this.src?.trim() && !this.srcset?.trim()) return false;\r\n if (changed.has(\"src\") && changed.get(\"src\") !== undefined) return true;\r\n if (changed.has(\"srcset\") && changed.get(\"srcset\") !== undefined) return true;\r\n if (changed.has(\"sizes\") && changed.get(\"sizes\") !== undefined) return true;\r\n if (\r\n this.autoSizes &&\r\n allChanged.has(\"_computedSizes\") &&\r\n allChanged.get(\"_computedSizes\") !== undefined\r\n ) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n private _resolvedSizesAttr(): string {\r\n return this.autoSizes ? this._computedSizes : this.sizes || \"\";\r\n }\r\n\r\n /** `src` used on <img> — must stay in sync with `srcset` when the set changes. */\r\n private _displaySrc(): string {\r\n const explicit = this.src?.trim() ?? \"\";\r\n const srcset = this.srcset?.trim() ?? \"\";\r\n if (!explicit && !srcset) return \"\";\r\n if (!srcset) return explicit;\r\n return resolveImageFallbackSrc(explicit, srcset);\r\n }\r\n\r\n private _applyImgAttrs(img: HTMLImageElement, srcsetChanged: boolean): void {\r\n const srcset = this.srcset?.trim() ?? \"\";\r\n const sizesAttr = this._resolvedSizesAttr();\r\n const src = this._displaySrc();\r\n\r\n if (srcset) img.srcset = srcset;\r\n else img.removeAttribute(\"srcset\");\r\n\r\n if (sizesAttr) img.sizes = sizesAttr;\r\n else img.removeAttribute(\"sizes\");\r\n\r\n // When the candidate list changes, drop `src` first so the UA cannot keep the old resource.\r\n if (srcsetChanged) img.removeAttribute(\"src\");\r\n img.src = src;\r\n }\r\n\r\n private _resyncImageSource(srcsetChanged = false): void {\r\n const img = this.renderRoot.querySelector(\"img\");\r\n if (!(img instanceof HTMLImageElement)) return;\r\n\r\n const replacement = img.cloneNode(false) as HTMLImageElement;\r\n replacement.alt = this.alt;\r\n replacement.loading = this.loading;\r\n replacement.decoding = this.decoding;\r\n const style = img.getAttribute(\"style\");\r\n if (style) replacement.setAttribute(\"style\", style);\r\n replacement.setAttribute(\"part\", \"img\");\r\n\r\n this._applyImgAttrs(replacement, srcsetChanged);\r\n img.replaceWith(replacement);\r\n }\r\n\r\n override render() {\r\n const sizesAttr = this._resolvedSizesAttr();\r\n const displaySrc = this._displaySrc();\r\n const hasSrc = displaySrc !== \"\";\r\n\r\n const styleVars = {\r\n width: this.width,\r\n height: this.height,\r\n borderRadius: this.borderRadius,\r\n boxShadow: this.boxShadow,\r\n objectFit: this.objectFit,\r\n objectPosition: this.objectPosition,\r\n aspectRatio: this.aspectRatio ?? \"auto\",\r\n };\r\n\r\n if (!hasSrc) {\r\n return html`\r\n <div\r\n class=\"placeholder\"\r\n part=\"img\"\r\n style=${styleMap(styleVars)}\r\n aria-label=${this.alt}\r\n role=\"img\"\r\n ></div>\r\n `;\r\n }\r\n\r\n return html`\r\n <img\r\n src=${displaySrc}\r\n alt=${this.alt}\r\n srcset=${this.srcset || nothing}\r\n sizes=${sizesAttr || nothing}\r\n loading=${this.loading}\r\n decoding=${this.decoding}\r\n style=${styleMap(styleVars)}\r\n part=\"img\"\r\n />\r\n `;\r\n }\r\n}\r\n"],"names":["SkyImage","LitElement","constructor","super","arguments","this","src","alt","width","height","aspectRatio","borderRadius","boxShadow","objectFit","objectPosition","srcset","sizes","autoSizes","_computedSizes","loading","decoding","preset","_presets","PresetController","_sizesRafId","_updateSizes","requestAnimationFrame","w","Math","ceil","getBoundingClientRect","connectedCallback","_ensureAutoSizesObserver","firstUpdated","_ro","ResizeObserver","observe","updated","changed","has","disconnect","_shouldResyncImageSource","_resyncImageSource","get","disconnectedCallback","cancelAnimationFrame","allChanged","trim","_resolvedSizesAttr","_displaySrc","explicit","resolveImageFallbackSrc","_applyImgAttrs","img","srcsetChanged","sizesAttr","removeAttribute","renderRoot","querySelector","HTMLImageElement","replacement","cloneNode","style","getAttribute","setAttribute","replaceWith","render","displaySrc","hasSrc","styleVars","html","nothing","styleMap","styles","css","__decorateClass","property","type","String","prototype","Boolean","state","reflect","customElement"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"srcset-utils.js","sources":["../../src/sky-image/srcset-utils.ts"],"sourcesContent":["export type SrcsetCandidate = {\r\n url: string;\r\n width?: number;\r\n density?: number;\r\n};\r\n\r\n/** Parse a comma-separated `srcset` attribute into URL + descriptor pairs. */\r\nexport function parseSrcset(srcset: string): SrcsetCandidate[] {\r\n const trimmed = srcset.trim();\r\n if (!trimmed) return [];\r\n\r\n const out: SrcsetCandidate[] = [];\r\n for (const piece of trimmed.split(
|
|
1
|
+
{"version":3,"file":"srcset-utils.js","sources":["../../src/sky-image/srcset-utils.ts"],"sourcesContent":["export type SrcsetCandidate = {\r\n url: string;\r\n width?: number;\r\n density?: number;\r\n};\r\n\r\n/** Parse a comma-separated `srcset` attribute into URL + descriptor pairs. */\r\nexport function parseSrcset(srcset: string): SrcsetCandidate[] {\r\n const trimmed = srcset.trim();\r\n if (!trimmed) return [];\r\n\r\n const out: SrcsetCandidate[] = [];\r\n for (const piece of trimmed.split(',')) {\r\n const parts = piece.trim().split(/\\s+/).filter(Boolean);\r\n const url = parts[0];\r\n if (!url) continue;\r\n\r\n const descriptor = parts[1];\r\n if (!descriptor) {\r\n out.push({ url });\r\n continue;\r\n }\r\n if (descriptor.endsWith('w')) {\r\n const width = Number.parseInt(descriptor.slice(0, -1), 10);\r\n out.push({ url, width: Number.isFinite(width) ? width : undefined });\r\n continue;\r\n }\r\n if (descriptor.endsWith('x')) {\r\n const density = Number.parseFloat(descriptor.slice(0, -1));\r\n out.push({\r\n url,\r\n density: Number.isFinite(density) ? density : undefined,\r\n });\r\n continue;\r\n }\r\n out.push({ url });\r\n }\r\n return out;\r\n}\r\n\r\n/** Pick the `src` fallback the UA should use for a given `srcset`. */\r\nexport function resolveImageFallbackSrc(src: string, srcset: string): string {\r\n const explicit = src.trim();\r\n const candidates = parseSrcset(srcset);\r\n if (!candidates.length) return explicit;\r\n\r\n if (explicit && candidates.some((c) => c.url === explicit)) {\r\n return explicit;\r\n }\r\n\r\n const widthCandidates = candidates.filter(\r\n (c): c is SrcsetCandidate & { width: number } =>\r\n typeof c.width === 'number' && c.width > 0\r\n );\r\n if (widthCandidates.length) {\r\n return widthCandidates.reduce((best, c) =>\r\n c.width >= best.width ? c : best\r\n ).url;\r\n }\r\n\r\n const densityCandidates = candidates.filter(\r\n (c): c is SrcsetCandidate & { density: number } =>\r\n typeof c.density === 'number' && c.density > 0\r\n );\r\n if (densityCandidates.length) {\r\n return densityCandidates.reduce((best, c) =>\r\n c.density >= best.density ? c : best\r\n ).url;\r\n }\r\n\r\n return candidates[0]?.url ?? explicit;\r\n}\r\n"],"names":["parseSrcset","srcset","trimmed","trim","out","piece","split","parts","filter","Boolean","url","descriptor","endsWith","width","Number","parseInt","slice","push","isFinite","density","parseFloat","resolveImageFallbackSrc","src","explicit","candidates","length","some","c","widthCandidates","reduce","best","densityCandidates"],"mappings":"AAOO,SAASA,EAAYC,GAC1B,MAAMC,EAAUD,EAAOE,OACvB,IAAKD,EAAS,MAAO,GAErB,MAAME,EAAyB,GAC/B,IAAA,MAAWC,KAASH,EAAQI,MAAM,KAAM,CACtC,MAAMC,EAAQF,EAAMF,OAAOG,MAAM,OAAOE,OAAOC,SACzCC,EAAMH,EAAM,GAClB,IAAKG,EAAK,SAEV,MAAMC,EAAaJ,EAAM,GACzB,GAAKI,EAAL,CAIA,GAAIA,EAAWC,SAAS,KAAM,CAC5B,MAAMC,EAAQC,OAAOC,SAASJ,EAAWK,MAAM,MAAQ,IACvDZ,EAAIa,KAAK,CAAEP,MAAKG,MAAOC,OAAOI,SAASL,GAASA,OAAQ,IACxD,QACF,CACA,GAAIF,EAAWC,SAAS,KAAM,CAC5B,MAAMO,EAAUL,OAAOM,WAAWT,EAAWK,MAAM,GAAG,IACtDZ,EAAIa,KAAK,CACPP,MACAS,QAASL,OAAOI,SAASC,GAAWA,OAAU,IAEhD,QACF,CACAf,EAAIa,KAAK,CAAEP,OAdX,MAFEN,EAAIa,KAAK,CAAEP,OAiBf,CACA,OAAON,CACT,CAGO,SAASiB,EAAwBC,EAAarB,GACnD,MAAMsB,EAAWD,EAAInB,OACfqB,EAAaxB,EAAYC,GAC/B,IAAKuB,EAAWC,OAAQ,OAAOF,EAE/B,GAAIA,GAAYC,EAAWE,KAAMC,GAAMA,EAAEjB,MAAQa,GAC/C,OAAOA,EAGT,MAAMK,EAAkBJ,EAAWhB,OAChCmB,GACoB,iBAAZA,EAAEd,OAAsBc,EAAEd,MAAQ,GAE7C,GAAIe,EAAgBH,OAClB,OAAOG,EAAgBC,OAAO,CAACC,EAAMH,IACnCA,EAAEd,OAASiB,EAAKjB,MAAQc,EAAIG,GAC5BpB,IAGJ,MAAMqB,EAAoBP,EAAWhB,OAClCmB,GACsB,iBAAdA,EAAER,SAAwBQ,EAAER,QAAU,GAEjD,OAAIY,EAAkBN,OACbM,EAAkBF,OAAO,CAACC,EAAMH,IACrCA,EAAER,SAAWW,EAAKX,QAAUQ,EAAIG,GAChCpB,IAGGc,EAAW,IAAId,KAAOa,CAC/B"}
|