@leaflink/stash 44.6.1 → 44.8.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/dist/Image.js CHANGED
@@ -1,29 +1,38 @@
1
- import { defineComponent as x, inject as C, computed as d, useAttrs as W, openBlock as D, createElementBlock as L, mergeProps as M } from "vue";
2
- import { IMAGE_PROVIDER_URLS as B, SCREEN_SIZES as P } from "./constants.js";
3
- import N from "lodash-es/merge";
4
- function j(t) {
5
- return (e) => t[e] || e;
1
+ import { defineComponent as M, inject as B, computed as o, useAttrs as D, openBlock as L, createElementBlock as k, mergeProps as C, unref as N } from "vue";
2
+ import V from "@leaflink/snitch";
3
+ import { IMAGE_PROVIDER_URLS as q, SCREEN_SIZES as y } from "./constants.js";
4
+ import G from "lodash-es/merge";
5
+ const w = {
6
+ xs: 160,
7
+ sm: 338,
8
+ md: 676,
9
+ lg: 1352,
10
+ xl: 2704
11
+ };
12
+ var P = /* @__PURE__ */ ((e) => (e.None = "none", e.Rounded = "rounded", e))(P || {}), z = /* @__PURE__ */ ((e) => (e.Cloudinary = "cloudinary", e.Static = "static", e))(z || {});
13
+ function j(e) {
14
+ return (t) => e[t] || t;
6
15
  }
7
- function V({
8
- formatter: t = (n, c) => `${n}=${c}`,
9
- keyMap: e,
10
- joinWith: f = "/",
11
- valueMap: i = {}
16
+ function Q({
17
+ formatter: e = (u, c) => `${u}=${c}`,
18
+ keyMap: t,
19
+ joinWith: d = "/",
20
+ valueMap: r = {}
12
21
  } = {}) {
13
- const n = typeof e == "function" ? e : j(e || {});
14
- return Object.keys(i).forEach((c) => {
15
- typeof i[c] != "function" && (i[c] = j(i[c]));
16
- }), (c = {}) => Object.entries(c).map(([g, v]) => {
17
- const m = i[g], S = n(g);
18
- let h = v;
19
- return typeof m == "function" && (h = m(c[g])), t(S, h);
20
- }).join(f);
22
+ const u = typeof t == "function" ? t : j(t || {});
23
+ return Object.keys(r).forEach((c) => {
24
+ typeof r[c] != "function" && (r[c] = j(r[c]));
25
+ }), (c = {}) => Object.entries(c).map(([f, g]) => {
26
+ const p = r[f], l = u(f);
27
+ let v = g;
28
+ return typeof p == "function" && (v = p(c[f])), e(l, v);
29
+ }).join(d);
21
30
  }
22
- function k(t = "", e = []) {
23
- const i = new URL(t).host;
24
- return e.some((n) => n === i ? !0 : n.endsWith(`.${i}`));
31
+ function T(e = "", t = []) {
32
+ const r = new URL(e).host;
33
+ return t.some((u) => u === r ? !0 : u.endsWith(`.${r}`));
25
34
  }
26
- const q = B.CLOUDINARY, G = (t) => t.startsWith("#") ? t.replace("#", "rgb_") : t, E = V({
35
+ const F = q.CLOUDINARY, H = (e) => e.startsWith("#") ? e.replace("#", "rgb_") : e, I = Q({
27
36
  keyMap: {
28
37
  fit: "c",
29
38
  width: "w",
@@ -44,153 +53,125 @@ const q = B.CLOUDINARY, G = (t) => t.startsWith("#") ? t.replace("#", "rgb_") :
44
53
  format: {
45
54
  jpeg: "jpg"
46
55
  },
47
- background(t) {
48
- return G(t);
56
+ background(e) {
57
+ return H(e);
49
58
  }
50
59
  },
51
60
  joinWith: ",",
52
- formatter: (t, e) => `${t}_${e}`
53
- }), F = {
54
- // defaulting to maintain original image format to reduce transformations
55
- // format: 'auto',
56
- quality: "auto"
61
+ formatter: (e, t) => `${e}_${t}`
62
+ }), Y = {
63
+ format: "auto",
64
+ quality: "auto:best"
57
65
  };
58
- function Y(t, e = {}) {
59
- const f = N(F, e), i = E(f);
60
- return `${q}/${i}/${t}`;
66
+ function Z(e, t = {}) {
67
+ const d = G(Y, t), r = I(d);
68
+ return `${F}/${r}/${e}`;
61
69
  }
62
- const Z = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
70
+ const J = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
63
71
  __proto__: null,
64
- getImageUrl: Y,
65
- operationsGenerator: E
72
+ getImageUrl: Z,
73
+ operationsGenerator: I
66
74
  }, Symbol.toStringTag, { value: "Module" }));
67
- function H(t = "") {
68
- return t;
75
+ function K(e = "") {
76
+ return e;
69
77
  }
70
- const K = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
78
+ const X = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
71
79
  __proto__: null,
72
- getImageUrl: H
73
- }, Symbol.toStringTag, { value: "Module" })), J = {
74
- cloudinary: Z,
75
- static: K
76
- }, Q = ["src"], w = {
77
- xsmall: {
78
- alwaysIncluded: !1,
79
- width: 160
80
- },
81
- small: {
82
- alwaysIncluded: !0,
83
- width: 338
84
- },
85
- medium: {
86
- alwaysIncluded: !0,
87
- width: 676
88
- },
89
- large: {
90
- alwaysIncluded: !0,
91
- width: 1352
92
- },
93
- xlarge: {
94
- alwaysIncluded: !1,
95
- width: 2704
96
- }
97
- };
98
- var X = /* @__PURE__ */ ((t) => (t.None = "none", t.Rounded = "rounded", t))(X || {});
99
- const ne = /* @__PURE__ */ x({
80
+ getImageUrl: K
81
+ }, Symbol.toStringTag, { value: "Module" })), tt = {
82
+ cloudinary: J,
83
+ static: X
84
+ }, et = ["src"], it = /* @__PURE__ */ M({
100
85
  __name: "Image",
101
86
  props: {
102
87
  src: { default: "" },
103
- srcset: { default: "" },
104
- sizes: { default: "" },
88
+ srcset: { default: void 0 },
89
+ sizes: { default: void 0 },
105
90
  provider: { default: void 0 },
106
- radius: { default: "none" }
91
+ radius: { default: "none" },
92
+ staticPath: { default: void 0 }
107
93
  },
108
- setup(t) {
109
- const e = t, f = {
110
- CLOUDINARY: "cloudinary",
111
- STATIC: "static"
112
- }, i = {
113
- md: P.md,
114
- lg: P.lg
115
- }, n = C("stashOptions"), c = d(() => {
116
- const { src: r, ...s } = W();
117
- return s.sizes = R.value, s.srcset = T.value, s;
118
- }), _ = d(() => {
119
- var r;
120
- return ((r = n == null ? void 0 : n.images) == null ? void 0 : r.staticDomains) || [];
121
- }), g = d(() => {
94
+ setup(e) {
95
+ const t = e, d = {
96
+ md: y.md,
97
+ lg: y.lg
98
+ }, r = B("stashOptions"), u = o(() => {
99
+ const { src: n, ...s } = D();
100
+ return s.sizes = U.value, s.srcset = E.value, s;
101
+ }), c = o(() => {
102
+ var n;
103
+ return ((n = r == null ? void 0 : r.images) == null ? void 0 : n.staticDomains) || [];
104
+ }), S = o(() => {
122
105
  try {
123
- new URL(e.src);
106
+ return new URL(t.src), !0;
124
107
  } catch {
125
- return !0;
108
+ return !1;
126
109
  }
127
- return k(e.src, _.value);
128
- }), v = d(() => {
129
- var r;
130
- return e.provider ? e.provider : (r = n == null ? void 0 : n.images) != null && r.provider && n.images.provider !== f.STATIC && !g.value ? n.images.provider : f.STATIC;
131
- }), m = d(() => v.value === f.STATIC), S = d(() => J[v.value]), h = d(
132
- () => m.value ? I() : I({ width: w.medium.width })
133
- ), R = d(() => e.sizes || !m.value ? O() : void 0), T = d(() => e.sizes && !e.srcset && !m.value ? U() : e.srcset), y = d(() => e.sizes ? z(e.sizes) : m.value ? [] : z("lg:large"));
134
- function I(r = {}) {
135
- return S.value.getImageUrl(e.src, r);
110
+ }), f = o(() => S.value && T(t.src, c.value)), g = o(() => {
111
+ var n;
112
+ return t.provider || ((n = r == null ? void 0 : r.images) == null ? void 0 : n.provider) || z.Static;
113
+ }), p = o(() => t.staticPath || (r == null ? void 0 : r.staticPath)), l = o(() => g.value === z.Static), v = o(() => tt[g.value]), $ = o(() => l.value ? _() : _({ width: w.md })), U = o(() => t.sizes ? x() : t.sizes), E = o(() => t.sizes && !t.srcset && !l.value ? W() : t.srcset), R = o(() => t.sizes ? A(t.sizes) : []);
114
+ function _(n = {}) {
115
+ if (l.value && S.value && !f.value)
116
+ return V.error(`Image: ${t.src} is not from a whitelisted domain. See \`stashOptions.image.domains\`.`), "";
117
+ if (l.value && f.value)
118
+ return t.src;
119
+ const s = l.value && p.value ? `${p.value}/${t.src}` : t.src;
120
+ return v.value.getImageUrl(s, n);
136
121
  }
137
- function U() {
138
- const r = Object.entries(w).reduce((s, [l, a]) => ((!!y.value.find((o) => o.preset === l) || a.alwaysIncluded) && (s[l] = a), s), {});
139
- return Object.values(r).map((s) => {
140
- const l = s.width;
141
- return `${I({ width: l })} ${s.width}w`;
142
- }).join(", ");
122
+ function W() {
123
+ return Object.values(w).map((n) => `${_({ width: n })} ${n}w`).join(", ");
143
124
  }
144
- function O() {
145
- return y.value.map((r) => `${r.media ? r.media + " " : ""}${r.size}`).join(", ");
125
+ function x() {
126
+ var n;
127
+ return (n = t.sizes) != null && n.includes("(") ? t.sizes : R.value.map((s) => `${s.mediaQuery ? s.mediaQuery + " " : ""}${s.size}`).join(", ");
146
128
  }
147
- function z(r) {
148
- const s = [], l = {
129
+ function A(n = "") {
130
+ const s = [], h = {
149
131
  default: "100vw"
150
132
  };
151
- if (typeof r == "string") {
152
- const a = r.split(/[\s]+/).filter((u) => u);
153
- for (const u of a) {
154
- const o = u.split(":");
155
- if (o.length !== 2) {
156
- l.default = o[0].trim();
133
+ if (typeof n == "string") {
134
+ const m = n.split(/[\s]+/).filter((a) => a);
135
+ for (const a of m) {
136
+ const i = a.split(":");
137
+ if (i.length !== 2) {
138
+ h.default = i[0].trim();
157
139
  continue;
158
140
  }
159
- l[o[0].trim()] = o[1].trim();
141
+ h[i[0].trim()] = i[1].trim();
160
142
  }
161
143
  } else
162
144
  throw new Error("`sizes` needs to be a string");
163
- for (const a in l) {
164
- const u = parseInt(i[a] || 0), o = l[a], $ = w[o] ? o : void 0;
165
- let p = String($ ? w[o].width : o);
166
- const b = p.endsWith("vw");
167
- if (!b && /^\d+$/.test(p) && (p = `${p}px`), !b && !p.endsWith("px"))
168
- continue;
169
- const A = {
170
- media: u ? `(min-width: ${u}px)` : "",
171
- preset: $,
172
- screenMinWidth: u,
173
- size: p
145
+ for (const m in h) {
146
+ const a = parseInt(d[m] || 0);
147
+ let i = String(h[m]);
148
+ const b = i.endsWith("vw");
149
+ if (!b && /^\d+$/.test(i) && (i = `${i}px`), !b && i.endsWith("%"))
150
+ throw new Error("Image: `sizes` does not support percentage values");
151
+ const O = {
152
+ mediaQuery: a ? `(min-width: ${a}px)` : "",
153
+ screenMinWidth: a,
154
+ size: i
174
155
  };
175
- s.push(A);
156
+ s.push(O);
176
157
  }
177
- return s.sort((a, u) => a.screenMinWidth > u.screenMinWidth ? -1 : 1), s;
158
+ return s.sort((m, a) => m.screenMinWidth > a.screenMinWidth ? -1 : 1), s;
178
159
  }
179
- return (r, s) => (D(), L("img", M({
160
+ return (n, s) => (L(), k("img", C({
180
161
  ref: "img",
181
- key: h.value,
162
+ key: $.value,
182
163
  "data-test": "stash-image",
183
164
  class: ["stash-image", {
184
- "tw-rounded": e.radius === "rounded"
185
- /* Rounded */
165
+ "tw-rounded": t.radius === N(P).Rounded
186
166
  }],
187
- src: h.value
188
- }, c.value), null, 16, Q));
167
+ src: $.value
168
+ }, u.value), null, 16, et));
189
169
  }
190
170
  });
191
171
  export {
192
- X as ImageRadiuses,
193
- w as PRESET_SIZES,
194
- ne as default
172
+ z as ImageProviders,
173
+ P as ImageRadius,
174
+ w as Screens,
175
+ it as default
195
176
  };
196
177
  //# sourceMappingURL=Image.js.map
package/dist/Image.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"Image.js","sources":["../src/components/Image/providers/utils.ts","../src/components/Image/providers/cloudinary.ts","../src/components/Image/providers/static.ts","../src/components/Image/providers/index.ts","../src/components/Image/Image.vue"],"sourcesContent":["export interface ImageModifiers {\n format?: string;\n height?: number;\n width?: number;\n [key: string]: any /* eslint-disable-line @typescript-eslint/no-explicit-any */;\n}\n\nexport type ParamFormatter = (key: string, value: string) => string;\n\nexport type ParamMapper = { [key: string]: string } | ((key: string) => string);\n\nexport interface ProviderUrlBuilder {\n keyMap?: ParamMapper;\n formatter?: ParamFormatter;\n joinWith?: string;\n valueMap?: {\n [key: string]: ParamMapper;\n };\n}\n\nfunction createMapper(map: ParamMapper) {\n return (key: string) => {\n return map[key] || key;\n };\n}\n\n/**\n * Builds the parameterized Cloudinary url\n */\nexport function buildProviderUrl({\n formatter = (key, value) => `${key}=${value}`,\n keyMap,\n joinWith = '/',\n valueMap = {},\n}: ProviderUrlBuilder = {}) {\n const keyMapper = typeof keyMap === 'function' ? keyMap : createMapper(keyMap || {});\n\n Object.keys(valueMap).forEach((valueKey) => {\n if (typeof valueMap[valueKey] !== 'function') {\n valueMap[valueKey] = createMapper(valueMap[valueKey]);\n }\n });\n\n return (modifiers: { [key: string]: string } = {}) => {\n const operations = Object.entries(modifiers).map(([key, value]) => {\n const mapper = valueMap[key];\n const newKey = keyMapper(key);\n let newVal = value;\n\n if (typeof mapper === 'function') {\n newVal = mapper(modifiers[key]);\n }\n\n return formatter(newKey, newVal);\n });\n\n return operations.join(joinWith);\n };\n}\n\n/**\n * Checks if a (sub)domain is included in a list of acceptable domains\n * @param str the (sub)domain to check\n * @param domains an array of valid domains\n */\nexport function isDomainValid(str = '', domains: string[] = []): boolean {\n const url = new URL(str);\n const host = url.host;\n\n return domains.some((domain) => {\n if (domain === host) {\n return true;\n }\n\n return domain.endsWith(`.${host}`);\n });\n}\n","import merge from 'lodash-es/merge';\n\nimport { IMAGE_PROVIDER_URLS } from '../../../constants';\nimport { buildProviderUrl, ImageModifiers } from './utils';\n\nconst BASE_URL = IMAGE_PROVIDER_URLS.CLOUDINARY;\n\nconst convertHextoRGBFormat = (value: string) => (value.startsWith('#') ? value.replace('#', 'rgb_') : value);\n\n/**\n * Parameters (option and value pairs) that can be used in the <transformations> segment of the Cloudinary transformation URL.\n * Options and their respective values are connected by an underscore (eg `w_250` for width of 250px.).\n * Multiple parameters are comma separated (eg. `w_250,h_250`).\n *\n * `keyMap` maps the option to its option prefix.\n * `valueMap` is used for grouping options using the same `keyMap` value under a 'category', allowing for easier usage and custom labelling in the component context.\n *\n * Transformation URL structure:\n * https://cloudinary.com/documentation/transformation_reference\n *\n * Transformation URL parameters (options and values):\n * https://cloudinary.com/documentation/image_transformations#transformation_url_syntax\n *\n */\nexport const operationsGenerator = buildProviderUrl({\n keyMap: {\n fit: 'c',\n width: 'w',\n height: 'h',\n format: 'f',\n quality: 'q',\n background: 'b',\n dpr: 'dpr',\n },\n valueMap: {\n fit: {\n fill: 'fill',\n inside: 'pad',\n outside: 'lpad',\n cover: 'fit',\n contain: 'scale',\n },\n format: {\n jpeg: 'jpg',\n },\n background(value: string) {\n return convertHextoRGBFormat(value);\n },\n },\n joinWith: ',',\n formatter: (key, value) => `${key}_${value}`,\n});\n\n// Note: Not configurable via Image props (for now).\nconst defaultModifiers = {\n // defaulting to maintain original image format to reduce transformations\n // format: 'auto',\n quality: 'auto',\n};\n\nexport function getImageUrl(src: string, modifiers: Partial<ImageModifiers> = {}): string {\n const mergeModifiers = merge(defaultModifiers, modifiers);\n const operations = operationsGenerator(mergeModifiers);\n\n return `${BASE_URL}/${operations}/${src}`;\n}\n","export function getImageUrl(src = ''): string {\n return src;\n}\n","import * as cloudinary from './cloudinary';\nimport * as staticProvider from './static';\n\nexport default {\n cloudinary,\n static: staticProvider,\n};\n","<script lang=\"ts\">\n export const PRESET_SIZES = {\n xsmall: {\n alwaysIncluded: false,\n width: 160,\n },\n small: {\n alwaysIncluded: true,\n width: 338,\n },\n medium: {\n alwaysIncluded: true,\n width: 676,\n },\n large: {\n alwaysIncluded: true,\n width: 1352,\n },\n xlarge: {\n alwaysIncluded: false,\n width: 2704,\n },\n } as const;\n\n export enum ImageRadiuses {\n None = 'none',\n Rounded = 'rounded',\n }\n</script>\n\n<script setup lang=\"ts\">\n import { computed, inject, useAttrs } from 'vue';\n\n import { StashImageProviders, StashProvideState } from '../../../types/misc';\n import { SCREEN_SIZES } from '../../constants';\n import providers from './providers';\n import { ImageModifiers, isDomainValid } from './providers/utils';\n\n // interface ImagePresetSizes {\n // [size: string]: {\n // alwaysIncluded: boolean;\n // width: number;\n // }\n // }\n\n export interface ImageSizeVariant {\n media: string;\n preset?: keyof typeof PRESET_SIZES;\n screenMinWidth: number;\n size: string;\n }\n\n export type ImageRadius = `${ImageRadiuses}`;\n\n export interface ImageProps {\n /**\n * The path to the image you want to embed.\n */\n src: string;\n\n /**\n * Native srcset attribute.\n * One or more strings separated by commas, indicating possible image sources\n * Can only be used with provider=static, otherwise it's ignored and auto-generated with `sizes` usage\n */\n srcset?: string;\n\n /**\n * For specifying responsive sizes\n */\n sizes?: string;\n\n /**\n * Where the image is served from.\n * Optional, and when provided it forces the provider used.\n *\n * The provider is otherwise inherited from the Stash config `stashOptions.images.provider`, which defaults to `cloudinary`.\n *\n * When not provided, the provider is also inferred by `isStatic`:\n * - `static` for relative/absolute paths (`img/foo.jpg` or `/static/img/bar.jpg`), or when whitelisted absolute URLs are used (included in `staticOptions.images.staticDomains`).\n */\n provider?: StashImageProviders;\n\n /**\n * For applying border radius\n */\n radius?: ImageRadius;\n\n /**\n * TODO - https://leaflink.atlassian.net/browse/GRO-204\n * A custom function used to resolve a URL string for the image\n */\n // loader?: () => string;\n }\n\n const PROVIDERS = {\n CLOUDINARY: 'cloudinary',\n STATIC: 'static',\n };\n const BREAKPOINTS = {\n md: SCREEN_SIZES.md,\n lg: SCREEN_SIZES.lg,\n };\n const stashOptions = inject<StashProvideState>('stashOptions');\n const props = withDefaults(defineProps<ImageProps>(), {\n src: '',\n srcset: '',\n sizes: '',\n provider: undefined,\n radius: 'none',\n // loader: undefined, // TODO - https://leaflink.atlassian.net/browse/GRO-204\n });\n\n const attrs = computed(() => {\n const { src, ...attrs } = useAttrs();\n\n attrs.sizes = imgSizes.value;\n attrs.srcset = imgSrcset.value;\n\n return attrs;\n });\n\n const staticDomains = computed(() => stashOptions?.images?.staticDomains || []);\n\n const isStaticUrl = computed(() => {\n // return true if not an absolute url\n try {\n new URL(props.src);\n } catch (e) {\n return true;\n }\n\n // true if domain is whitelisted for static usage\n return isDomainValid(props.src, staticDomains.value);\n });\n\n const computedProvider = computed(() => {\n if (props.provider) {\n return props.provider;\n }\n\n if (stashOptions?.images?.provider && stashOptions.images.provider !== PROVIDERS.STATIC && !isStaticUrl.value) {\n return stashOptions.images.provider;\n }\n\n return PROVIDERS.STATIC;\n });\n\n const isStatic = computed(() => computedProvider.value === PROVIDERS.STATIC);\n\n const imgProvider = computed(() => providers[computedProvider.value]);\n\n const imgSrc = computed(() =>\n isStatic.value ? getProviderImage() : getProviderImage({ width: PRESET_SIZES.medium.width }),\n );\n\n const imgSizes = computed(() => (props.sizes || !isStatic.value ? getSizes() : undefined));\n\n const imgSrcset = computed(() => (props.sizes && !props.srcset && !isStatic.value ? getSources() : props.srcset));\n\n const parsedSizes = computed(() => {\n if (props.sizes) {\n return parseSizes(props.sizes);\n }\n\n if (!isStatic.value) {\n return parseSizes('lg:large');\n }\n\n return [];\n });\n\n function getProviderImage(modifiers: ImageModifiers = {}) {\n return imgProvider.value.getImageUrl(props.src, modifiers);\n }\n\n function getSources() {\n const appliedPresets = Object.entries(PRESET_SIZES).reduce((obj, [key, entry]) => {\n const isPreset = !!parsedSizes.value.find((size) => size.preset === key);\n\n if (isPreset || entry.alwaysIncluded) {\n obj[key] = entry;\n }\n\n return obj;\n }, {} as typeof PRESET_SIZES);\n\n return Object.values(appliedPresets)\n .map((size) => {\n const width = size.width;\n const src = getProviderImage({ width });\n\n return `${src} ${size.width}w`;\n })\n .join(', ');\n }\n\n function getSizes() {\n return parsedSizes.value.map((v) => `${v.media ? v.media + ' ' : ''}${v.size}`).join(', ');\n }\n\n function parseSizes(providedSizes: string) {\n const variants: ImageSizeVariant[] = [];\n const sizes = {\n default: '100vw',\n };\n\n // parse sizes and convert to object\n if (typeof providedSizes === 'string') {\n const definitions = providedSizes.split(/[\\s]+/).filter((size) => size);\n\n for (const entry of definitions) {\n const size = entry.split(':');\n\n if (size.length !== 2) {\n sizes['default'] = size[0].trim();\n continue;\n }\n\n sizes[size[0].trim()] = size[1].trim();\n }\n } else {\n throw new Error('`sizes` needs to be a string');\n }\n\n for (const key in sizes) {\n const screenMinWidth = parseInt(BREAKPOINTS[key] || 0);\n const sizeValue = sizes[key];\n const presetKey = PRESET_SIZES[sizeValue] ? sizeValue : undefined;\n let size = String(presetKey ? PRESET_SIZES[sizeValue].width : sizeValue);\n const isFluid = size.endsWith('vw');\n\n // default integers to pixels\n if (!isFluid && /^\\d+$/.test(size)) {\n size = `${size}px`;\n }\n\n // ignore invalid size\n if (!isFluid && !size.endsWith('px')) {\n continue;\n }\n\n const variant = {\n media: screenMinWidth ? `(min-width: ${screenMinWidth}px)` : '',\n preset: presetKey,\n screenMinWidth,\n size,\n };\n\n variants.push(variant);\n }\n\n variants.sort((v1, v2) => (v1.screenMinWidth > v2.screenMinWidth ? -1 : 1));\n\n return variants;\n }\n</script>\n\n<template>\n <img\n ref=\"img\"\n :key=\"imgSrc\"\n data-test=\"stash-image\"\n class=\"stash-image\"\n :class=\"{\n 'tw-rounded': props.radius === ImageRadiuses.Rounded,\n }\"\n :src=\"imgSrc\"\n v-bind=\"attrs\"\n />\n</template>\n"],"names":["createMapper","map","key","buildProviderUrl","formatter","value","keyMap","joinWith","valueMap","keyMapper","valueKey","modifiers","mapper","newKey","newVal","isDomainValid","str","domains","host","domain","BASE_URL","IMAGE_PROVIDER_URLS","convertHextoRGBFormat","operationsGenerator","defaultModifiers","getImageUrl","src","mergeModifiers","merge","operations","providers","cloudinary","staticProvider","PRESET_SIZES","ImageRadiuses","PROVIDERS","BREAKPOINTS","SCREEN_SIZES","stashOptions","inject","attrs","computed","useAttrs","imgSizes","imgSrcset","staticDomains","_a","isStaticUrl","props","computedProvider","isStatic","imgProvider","imgSrc","getProviderImage","getSizes","getSources","parsedSizes","parseSizes","appliedPresets","obj","entry","size","width","v","providedSizes","variants","sizes","definitions","screenMinWidth","sizeValue","presetKey","isFluid","variant","v1","v2"],"mappings":";;;AAoBA,SAASA,EAAaC,GAAkB;AACtC,SAAO,CAACC,MACCD,EAAIC,CAAG,KAAKA;AAEvB;AAKO,SAASC,EAAiB;AAAA,EAC/B,WAAAC,IAAY,CAACF,GAAKG,MAAU,GAAGH,CAAG,IAAIG,CAAK;AAAA,EAC3C,QAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,UAAAC,IAAW,CAAC;AACd,IAAwB,IAAI;AACpB,QAAAC,IAAY,OAAOH,KAAW,aAAaA,IAASN,EAAaM,KAAU,CAAA,CAAE;AAEnF,gBAAO,KAAKE,CAAQ,EAAE,QAAQ,CAACE,MAAa;AAC1C,IAAI,OAAOF,EAASE,CAAQ,KAAM,eAChCF,EAASE,CAAQ,IAAIV,EAAaQ,EAASE,CAAQ,CAAC;AAAA,EACtD,CACD,GAEM,CAACC,IAAuC,OAC1B,OAAO,QAAQA,CAAS,EAAE,IAAI,CAAC,CAACT,GAAKG,CAAK,MAAM;AAC3D,UAAAO,IAASJ,EAASN,CAAG,GACrBW,IAASJ,EAAUP,CAAG;AAC5B,QAAIY,IAAST;AAET,WAAA,OAAOO,KAAW,eACXE,IAAAF,EAAOD,EAAUT,CAAG,CAAC,IAGzBE,EAAUS,GAAQC,CAAM;AAAA,EAAA,CAChC,EAEiB,KAAKP,CAAQ;AAEnC;AAOO,SAASQ,EAAcC,IAAM,IAAIC,IAAoB,CAAA,GAAa;AAEvE,QAAMC,IADM,IAAI,IAAIF,CAAG,EACN;AAEV,SAAAC,EAAQ,KAAK,CAACE,MACfA,MAAWD,IACN,KAGFC,EAAO,SAAS,IAAID,CAAI,EAAE,CAClC;AACH;ACvEA,MAAME,IAAWC,EAAoB,YAE/BC,IAAwB,CAACjB,MAAmBA,EAAM,WAAW,GAAG,IAAIA,EAAM,QAAQ,KAAK,MAAM,IAAIA,GAiB1FkB,IAAsBpB,EAAiB;AAAA,EAClD,QAAQ;AAAA,IACN,KAAK;AAAA,IACL,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,KAAK;AAAA,EACP;AAAA,EACA,UAAU;AAAA,IACR,KAAK;AAAA,MACH,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,OAAO;AAAA,MACP,SAAS;AAAA,IACX;AAAA,IACA,QAAQ;AAAA,MACN,MAAM;AAAA,IACR;AAAA,IACA,WAAWE,GAAe;AACxB,aAAOiB,EAAsBjB,CAAK;AAAA,IACpC;AAAA,EACF;AAAA,EACA,UAAU;AAAA,EACV,WAAW,CAACH,GAAKG,MAAU,GAAGH,CAAG,IAAIG,CAAK;AAC5C,CAAC,GAGKmB,IAAmB;AAAA;AAAA;AAAA,EAGvB,SAAS;AACX;AAEO,SAASC,EAAYC,GAAaf,IAAqC,IAAY;AAClF,QAAAgB,IAAiBC,EAAMJ,GAAkBb,CAAS,GAClDkB,IAAaN,EAAoBI,CAAc;AAErD,SAAO,GAAGP,CAAQ,IAAIS,CAAU,IAAIH,CAAG;AACzC;;;;;;ACjEgB,SAAAD,EAAYC,IAAM,IAAY;AACrC,SAAAA;AACT;;;;8CCCeI,IAAA;AAAA,EACb,YAAAC;AAAA,EACA,QAAQC;AACV,gBCLeC,IAAe;AAAA,EAC1B,QAAQ;AAAA,IACN,gBAAgB;AAAA,IAChB,OAAO;AAAA,EACT;AAAA,EACA,OAAO;AAAA,IACL,gBAAgB;AAAA,IAChB,OAAO;AAAA,EACT;AAAA,EACA,QAAQ;AAAA,IACN,gBAAgB;AAAA,IAChB,OAAO;AAAA,EACT;AAAA,EACA,OAAO;AAAA,IACL,gBAAgB;AAAA,IAChB,OAAO;AAAA,EACT;AAAA,EACA,QAAQ;AAAA,IACN,gBAAgB;AAAA,IAChB,OAAO;AAAA,EACT;AACF;AAEY,IAAAC,sBAAAA,OACVA,EAAA,OAAO,QACPA,EAAA,UAAU,WAFAA,IAAAA,KAAA,CAAA,CAAA;;;;;;;;;;;iBAuENC,IAAY;AAAA,MAChB,YAAY;AAAA,MACZ,QAAQ;AAAA,IAAA,GAEJC,IAAc;AAAA,MAClB,IAAIC,EAAa;AAAA,MACjB,IAAIA,EAAa;AAAA,IAAA,GAEbC,IAAeC,EAA0B,cAAc,GAUvDC,IAAQC,EAAS,MAAM;AAC3B,YAAM,EAAE,KAAAf,GAAK,GAAGc,MAAUE,EAAS;AAEnCF,aAAAA,EAAM,QAAQG,EAAS,OACvBH,EAAM,SAASI,EAAU,OAElBJ;AAAAA,IAAA,CACR,GAEKK,IAAgBJ,EAAS,MAAM;;AAAA,eAAAK,IAAAR,KAAA,gBAAAA,EAAc,WAAd,gBAAAQ,EAAsB,kBAAiB,CAAA;AAAA,KAAE,GAExEC,IAAcN,EAAS,MAAM;AAE7B,UAAA;AACE,YAAA,IAAIO,EAAM,GAAG;AAAA,cACP;AACH,eAAA;AAAA,MACT;AAGA,aAAOjC,EAAciC,EAAM,KAAKH,EAAc,KAAK;AAAA,IAAA,CACpD,GAEKI,IAAmBR,EAAS,MAAM;;AACtC,aAAIO,EAAM,WACDA,EAAM,YAGXF,IAAAR,KAAA,gBAAAA,EAAc,WAAd,QAAAQ,EAAsB,YAAYR,EAAa,OAAO,aAAaH,EAAU,UAAU,CAACY,EAAY,QAC/FT,EAAa,OAAO,WAGtBH,EAAU;AAAA,IAAA,CAClB,GAEKe,IAAWT,EAAS,MAAMQ,EAAiB,UAAUd,EAAU,MAAM,GAErEgB,IAAcV,EAAS,MAAMX,EAAUmB,EAAiB,KAAK,CAAC,GAE9DG,IAASX;AAAA,MAAS,MACtBS,EAAS,QAAQG,MAAqBA,EAAiB,EAAE,OAAOpB,EAAa,OAAO,OAAO;AAAA,IAAA,GAGvFU,IAAWF,EAAS,MAAOO,EAAM,SAAS,CAACE,EAAS,QAAQI,MAAa,MAAU,GAEnFV,IAAYH,EAAS,MAAOO,EAAM,SAAS,CAACA,EAAM,UAAU,CAACE,EAAS,QAAQK,EAAW,IAAIP,EAAM,MAAO,GAE1GQ,IAAcf,EAAS,MACvBO,EAAM,QACDS,EAAWT,EAAM,KAAK,IAG1BE,EAAS,QAIP,KAHEO,EAAW,UAAU,CAI/B;AAEQ,aAAAJ,EAAiB1C,IAA4B,IAAI;AACxD,aAAOwC,EAAY,MAAM,YAAYH,EAAM,KAAKrC,CAAS;AAAA,IAC3D;AAEA,aAAS4C,IAAa;AACd,YAAAG,IAAiB,OAAO,QAAQzB,CAAY,EAAE,OAAO,CAAC0B,GAAK,CAACzD,GAAK0D,CAAK,QACzD,CAAC,CAACJ,EAAY,MAAM,KAAK,CAACK,MAASA,EAAK,WAAW3D,CAAG,KAEvD0D,EAAM,oBACpBD,EAAIzD,CAAG,IAAI0D,IAGND,IACN,CAAyB,CAAA;AAE5B,aAAO,OAAO,OAAOD,CAAc,EAChC,IAAI,CAACG,MAAS;AACb,cAAMC,IAAQD,EAAK;AAGnB,eAAO,GAFKR,EAAiB,EAAE,OAAAS,EAAO,CAAA,CAEzB,IAAID,EAAK,KAAK;AAAA,MAAA,CAC5B,EACA,KAAK,IAAI;AAAA,IACd;AAEA,aAASP,IAAW;AAClB,aAAOE,EAAY,MAAM,IAAI,CAACO,MAAM,GAAGA,EAAE,QAAQA,EAAE,QAAQ,MAAM,EAAE,GAAGA,EAAE,IAAI,EAAE,EAAE,KAAK,IAAI;AAAA,IAC3F;AAEA,aAASN,EAAWO,GAAuB;AACzC,YAAMC,IAA+B,CAAA,GAC/BC,IAAQ;AAAA,QACZ,SAAS;AAAA,MAAA;AAIP,UAAA,OAAOF,KAAkB,UAAU;AAC/B,cAAAG,IAAcH,EAAc,MAAM,OAAO,EAAE,OAAO,CAACH,MAASA,CAAI;AAEtE,mBAAWD,KAASO,GAAa;AACzB,gBAAAN,IAAOD,EAAM,MAAM,GAAG;AAExB,cAAAC,EAAK,WAAW,GAAG;AACrB,YAAAK,EAAM,UAAaL,EAAK,CAAC,EAAE,KAAK;AAChC;AAAA,UACF;AAEM,UAAAK,EAAAL,EAAK,CAAC,EAAE,KAAA,CAAM,IAAIA,EAAK,CAAC,EAAE;QAClC;AAAA,MAAA;AAEM,cAAA,IAAI,MAAM,8BAA8B;AAGhD,iBAAW3D,KAAOgE,GAAO;AACvB,cAAME,IAAiB,SAAShC,EAAYlC,CAAG,KAAK,CAAC,GAC/CmE,IAAYH,EAAMhE,CAAG,GACrBoE,IAAYrC,EAAaoC,CAAS,IAAIA,IAAY;AACxD,YAAIR,IAAO,OAAOS,IAAYrC,EAAaoC,CAAS,EAAE,QAAQA,CAAS;AACjE,cAAAE,IAAUV,EAAK,SAAS,IAAI;AAQlC,YALI,CAACU,KAAW,QAAQ,KAAKV,CAAI,MAC/BA,IAAO,GAAGA,CAAI,OAIZ,CAACU,KAAW,CAACV,EAAK,SAAS,IAAI;AACjC;AAGF,cAAMW,IAAU;AAAA,UACd,OAAOJ,IAAiB,eAAeA,CAAc,QAAQ;AAAA,UAC7D,QAAQE;AAAA,UACR,gBAAAF;AAAA,UACA,MAAAP;AAAA,QAAA;AAGF,QAAAI,EAAS,KAAKO,CAAO;AAAA,MACvB;AAES,aAAAP,EAAA,KAAK,CAACQ,GAAIC,MAAQD,EAAG,iBAAiBC,EAAG,iBAAiB,KAAK,CAAE,GAEnET;AAAA,IACT;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"Image.js","sources":["../src/components/Image/Image.types.ts","../src/components/Image/providers/utils.ts","../src/components/Image/providers/cloudinary.ts","../src/components/Image/providers/static.ts","../src/components/Image/providers/index.ts","../src/components/Image/Image.vue"],"sourcesContent":["// Sizes used to generate resized and optimized versions of an image.\n// Generated in `srcset`, and informed by `sizes`.\nexport const Screens = {\n xs: 160,\n sm: 338,\n md: 676,\n lg: 1352,\n xl: 2704,\n} as const;\n\nexport interface ImageSizeCondition {\n mediaQuery: string;\n screenMinWidth: number;\n size: string;\n}\n\nexport enum ImageRadius {\n None = 'none',\n Rounded = 'rounded',\n}\n\nexport type ImageRadii = `${ImageRadius}`;\n\nexport enum ImageProviders {\n Cloudinary = 'cloudinary',\n Static = 'static',\n}\n","export interface ImageModifiers {\n format?: string;\n height?: number;\n width?: number;\n [key: string]: any /* eslint-disable-line @typescript-eslint/no-explicit-any */;\n}\n\nexport type ParamFormatter = (key: string, value: string) => string;\n\nexport type ParamMapper = { [key: string]: string } | ((key: string) => string);\n\nexport interface ProviderUrlBuilder {\n keyMap?: ParamMapper;\n formatter?: ParamFormatter;\n joinWith?: string;\n valueMap?: {\n [key: string]: ParamMapper;\n };\n}\n\nfunction createMapper(map: ParamMapper) {\n return (key: string) => {\n return map[key] || key;\n };\n}\n\n/**\n * Builds the parameterized Cloudinary url\n */\nexport function buildProviderUrl({\n formatter = (key, value) => `${key}=${value}`,\n keyMap,\n joinWith = '/',\n valueMap = {},\n}: ProviderUrlBuilder = {}) {\n const keyMapper = typeof keyMap === 'function' ? keyMap : createMapper(keyMap || {});\n\n Object.keys(valueMap).forEach((valueKey) => {\n if (typeof valueMap[valueKey] !== 'function') {\n valueMap[valueKey] = createMapper(valueMap[valueKey]);\n }\n });\n\n return (modifiers: { [key: string]: string } = {}) => {\n const operations = Object.entries(modifiers).map(([key, value]) => {\n const mapper = valueMap[key];\n const newKey = keyMapper(key);\n let newVal = value;\n\n if (typeof mapper === 'function') {\n newVal = mapper(modifiers[key]);\n }\n\n return formatter(newKey, newVal);\n });\n\n return operations.join(joinWith);\n };\n}\n\n/**\n * Checks if a (sub)domain is included in a list of acceptable domains\n * @param str the (sub)domain to check\n * @param domains an array of valid domains\n */\nexport function isDomainValid(str = '', domains: string[] = []): boolean {\n const url = new URL(str);\n const host = url.host;\n\n return domains.some((domain) => {\n if (domain === host) {\n return true;\n }\n\n return domain.endsWith(`.${host}`);\n });\n}\n","import merge from 'lodash-es/merge';\n\nimport { IMAGE_PROVIDER_URLS } from '../../../constants';\nimport { buildProviderUrl, ImageModifiers } from './utils';\n\nconst BASE_URL = IMAGE_PROVIDER_URLS.CLOUDINARY;\n\nconst convertHextoRGBFormat = (value: string) => (value.startsWith('#') ? value.replace('#', 'rgb_') : value);\n\n/**\n * Parameters (option and value pairs) that can be used in the <transformations> segment of the Cloudinary transformation URL.\n * Options and their respective values are connected by an underscore (eg `w_250` for width of 250px.).\n * Multiple parameters are comma separated (eg. `w_250,h_250`).\n *\n * `keyMap` maps the option to its option prefix.\n * `valueMap` is used for grouping options using the same `keyMap` value under a 'category', allowing for easier usage and custom labelling in the component context.\n *\n * Transformation URL structure:\n * https://cloudinary.com/documentation/transformation_reference\n *\n * Transformation URL parameters (options and values):\n * https://cloudinary.com/documentation/image_transformations#transformation_url_syntax\n *\n */\nexport const operationsGenerator = buildProviderUrl({\n keyMap: {\n fit: 'c',\n width: 'w',\n height: 'h',\n format: 'f',\n quality: 'q',\n background: 'b',\n dpr: 'dpr',\n },\n valueMap: {\n fit: {\n fill: 'fill',\n inside: 'pad',\n outside: 'lpad',\n cover: 'fit',\n contain: 'scale',\n },\n format: {\n jpeg: 'jpg',\n },\n background(value: string) {\n return convertHextoRGBFormat(value);\n },\n },\n joinWith: ',',\n formatter: (key, value) => `${key}_${value}`,\n});\n\n// Note: Not configurable via Image props (for now).\nconst defaultModifiers = {\n format: 'auto',\n quality: 'auto:best',\n};\n\nexport function getImageUrl(src: string, modifiers: Partial<ImageModifiers> = {}): string {\n const mergeModifiers = merge(defaultModifiers, modifiers);\n const operations = operationsGenerator(mergeModifiers);\n\n return `${BASE_URL}/${operations}/${src}`;\n}\n","export function getImageUrl(src = ''): string {\n return src;\n}\n","import * as cloudinary from './cloudinary';\nimport * as staticProvider from './static';\n\nexport default {\n cloudinary,\n static: staticProvider,\n};\n","<script lang=\"ts\">\n export * from './Image.types';\n</script>\n\n<script setup lang=\"ts\">\n import logger from '@leaflink/snitch';\n import { computed, inject, useAttrs } from 'vue';\n\n import { StashImageProviders, StashProvideState } from '../../../types/misc';\n import { SCREEN_SIZES } from '../../constants';\n import { ImageProviders, ImageRadii, ImageRadius, ImageSizeCondition, Screens } from './Image.types';\n import providers from './providers';\n import { ImageModifiers, isDomainValid } from './providers/utils';\n\n export interface ImageProps {\n /**\n * The path to the image you want to embed.\n */\n src: string;\n\n /**\n * Native srcset attribute.\n * One or more strings separated by commas, indicating possible image sources\n * Can only be used with provider=static, otherwise it's ignored and auto-generated with `sizes` usage\n */\n srcset?: string;\n\n /**\n * For specifying responsive sizes\n */\n sizes?: string;\n\n /**\n * Where the image is served from.\n * Optional, and when provided it forces the provider used.\n *\n * The provider is otherwise inherited from the Stash config `stashOptions.images.provider`, which defaults to `cloudinary`.\n *\n * When not provided, the provider is also inferred by `isStatic`:\n * - `static` for relative/absolute paths (`img/foo.jpg` or `/static/img/bar.jpg`), or when whitelisted absolute URLs are used (included in `staticOptions.images.staticDomains`).\n */\n provider?: StashImageProviders;\n\n /**\n * For applying border radius\n */\n radius?: ImageRadii;\n\n /**\n * A custom static path the image src will be appended onto when provider=static.\n * Can be used to override the library-level default.\n */\n staticPath?: string;\n\n /**\n * TODO - https://leaflink.atlassian.net/browse/GRO-204\n * A custom function used to resolve a URL string for the image\n */\n // loader?: () => string;\n }\n\n const BREAKPOINTS = {\n md: SCREEN_SIZES.md,\n lg: SCREEN_SIZES.lg,\n };\n const stashOptions = inject<StashProvideState>('stashOptions');\n const props = withDefaults(defineProps<ImageProps>(), {\n src: '',\n srcset: undefined,\n sizes: undefined,\n staticPath: undefined,\n provider: undefined,\n radius: 'none',\n // loader: undefined, // TODO - https://leaflink.atlassian.net/browse/GRO-204\n });\n\n const attrs = computed(() => {\n const { src, ...attrs } = useAttrs();\n\n attrs.sizes = imgSizes.value;\n attrs.srcset = imgSrcset.value;\n\n return attrs;\n });\n\n const staticDomains = computed(() => stashOptions?.images?.staticDomains || []);\n\n const isAbsoluteUrl = computed(() => {\n // return true if not an absolute url\n try {\n new URL(props.src);\n return true;\n } catch (e) {\n return false;\n }\n });\n\n const isValidStaticAbsoluteUrl = computed(() => {\n return isAbsoluteUrl.value && isDomainValid(props.src, staticDomains.value);\n });\n\n const computedProvider = computed(() => props.provider || stashOptions?.images?.provider || ImageProviders.Static);\n\n const computedStaticPath = computed(() => props.staticPath || stashOptions?.staticPath);\n\n const isStatic = computed(() => computedProvider.value === ImageProviders.Static);\n\n const imgProvider = computed(() => providers[computedProvider.value]);\n\n const imgSrc = computed(() => (isStatic.value ? getProviderImage() : getProviderImage({ width: Screens.md })));\n\n const imgSizes = computed(() => (props.sizes ? getSizes() : props.sizes));\n\n const imgSrcset = computed(() => (props.sizes && !props.srcset && !isStatic.value ? getSources() : props.srcset));\n\n const parsedSizes = computed(() => {\n return props.sizes ? parseSizes(props.sizes) : [];\n });\n\n function getProviderImage(modifiers: ImageModifiers = {}) {\n if (isStatic.value && isAbsoluteUrl.value && !isValidStaticAbsoluteUrl.value) {\n // eslint-disable-next-line no-console\n logger.error(`Image: ${props.src} is not from a whitelisted domain. See \\`stashOptions.image.domains\\`.`);\n return '';\n }\n\n if (isStatic.value && isValidStaticAbsoluteUrl.value) {\n return props.src;\n }\n\n const src = isStatic.value && computedStaticPath.value ? `${computedStaticPath.value}/${props.src}` : props.src;\n\n return imgProvider.value.getImageUrl(src, modifiers);\n }\n\n function getSources() {\n return Object.values(Screens)\n .map((width) => {\n const src = getProviderImage({ width });\n\n return `${src} ${width}w`;\n })\n .join(', ');\n }\n\n function getSizes() {\n // return if using native media conditions\n if (props.sizes?.includes('(')) {\n return props.sizes;\n }\n\n return parsedSizes.value.map((v) => `${v.mediaQuery ? v.mediaQuery + ' ' : ''}${v.size}`).join(', ');\n }\n\n function parseSizes(providedSizes = '') {\n const conditions: ImageSizeCondition[] = [];\n const sizes = {\n default: '100vw',\n };\n\n // parse sizes and convert to object\n if (typeof providedSizes === 'string') {\n const definitions = providedSizes.split(/[\\s]+/).filter((size) => size);\n\n for (const entry of definitions) {\n const size = entry.split(':');\n\n if (size.length !== 2) {\n sizes['default'] = size[0].trim();\n continue;\n }\n\n sizes[size[0].trim()] = size[1].trim();\n }\n } else {\n throw new Error('`sizes` needs to be a string');\n }\n\n for (const key in sizes) {\n const screenMinWidth = parseInt(BREAKPOINTS[key] || 0);\n let size = String(sizes[key]);\n const isFluidSize = size.endsWith('vw');\n\n // convert integer to pixels\n if (!isFluidSize && /^\\d+$/.test(size)) {\n size = `${size}px`;\n }\n\n if (!isFluidSize && size.endsWith('%')) {\n throw new Error('Image: `sizes` does not support percentage values');\n }\n\n const condition = {\n mediaQuery: screenMinWidth ? `(min-width: ${screenMinWidth}px)` : '',\n screenMinWidth,\n size,\n };\n\n conditions.push(condition);\n }\n\n conditions.sort((v1, v2) => (v1.screenMinWidth > v2.screenMinWidth ? -1 : 1));\n\n return conditions;\n }\n</script>\n\n<template>\n <img\n ref=\"img\"\n :key=\"imgSrc\"\n data-test=\"stash-image\"\n class=\"stash-image\"\n :class=\"{\n 'tw-rounded': props.radius === ImageRadius.Rounded,\n }\"\n :src=\"imgSrc\"\n v-bind=\"attrs\"\n />\n</template>\n"],"names":["Screens","ImageRadius","ImageProviders","createMapper","map","key","buildProviderUrl","formatter","value","keyMap","joinWith","valueMap","keyMapper","valueKey","modifiers","mapper","newKey","newVal","isDomainValid","str","domains","host","domain","BASE_URL","IMAGE_PROVIDER_URLS","convertHextoRGBFormat","operationsGenerator","defaultModifiers","getImageUrl","src","mergeModifiers","merge","operations","providers","cloudinary","staticProvider","BREAKPOINTS","SCREEN_SIZES","stashOptions","inject","attrs","computed","useAttrs","imgSizes","imgSrcset","staticDomains","_a","isAbsoluteUrl","props","isValidStaticAbsoluteUrl","computedProvider","computedStaticPath","isStatic","imgProvider","imgSrc","getProviderImage","getSizes","getSources","parsedSizes","parseSizes","logger","width","v","providedSizes","conditions","sizes","definitions","size","entry","screenMinWidth","isFluidSize","condition","v1","v2"],"mappings":"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"}
@@ -29,17 +29,20 @@ declare type __VLS_WithDefaults<P, D> = {
29
29
 
30
30
  declare const _default: DefineComponent<__VLS_WithDefaults<__VLS_TypePropsToRuntimeProps<ImageProps>, {
31
31
  src: string;
32
- srcset: string;
33
- sizes: string;
32
+ srcset: undefined;
33
+ sizes: undefined;
34
+ staticPath: undefined;
34
35
  provider: undefined;
35
36
  radius: string;
36
37
  }>, {}, unknown, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, VNodeProps & AllowedComponentProps & ComponentCustomProps, Readonly<ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToRuntimeProps<ImageProps>, {
37
38
  src: string;
38
- srcset: string;
39
- sizes: string;
39
+ srcset: undefined;
40
+ sizes: undefined;
41
+ staticPath: undefined;
40
42
  provider: undefined;
41
43
  radius: string;
42
44
  }>>>, {
45
+ staticPath: string;
43
46
  src: string;
44
47
  radius: "none" | "rounded";
45
48
  srcset: string;
@@ -76,44 +79,38 @@ export declare interface ImageProps {
76
79
  /**
77
80
  * For applying border radius
78
81
  */
79
- radius?: ImageRadius;
82
+ radius?: ImageRadii;
83
+ /**
84
+ * A custom static path the image src will be appended onto when provider=static.
85
+ * Can be used to override the library-level default.
86
+ */
87
+ staticPath?: string;
80
88
  }
81
89
 
82
- export declare type ImageRadius = `${ImageRadiuses}`;
90
+ export declare enum ImageProviders {
91
+ Cloudinary = "cloudinary",
92
+ Static = "static"
93
+ }
83
94
 
84
- export declare enum ImageRadiuses {
95
+ export declare type ImageRadii = `${ImageRadius}`;
96
+
97
+ export declare enum ImageRadius {
85
98
  None = "none",
86
99
  Rounded = "rounded"
87
100
  }
88
101
 
89
- export declare interface ImageSizeVariant {
90
- media: string;
91
- preset?: keyof typeof PRESET_SIZES;
102
+ export declare interface ImageSizeCondition {
103
+ mediaQuery: string;
92
104
  screenMinWidth: number;
93
105
  size: string;
94
106
  }
95
107
 
96
- export declare const PRESET_SIZES: {
97
- readonly xsmall: {
98
- readonly alwaysIncluded: false;
99
- readonly width: 160;
100
- };
101
- readonly small: {
102
- readonly alwaysIncluded: true;
103
- readonly width: 338;
104
- };
105
- readonly medium: {
106
- readonly alwaysIncluded: true;
107
- readonly width: 676;
108
- };
109
- readonly large: {
110
- readonly alwaysIncluded: true;
111
- readonly width: 1352;
112
- };
113
- readonly xlarge: {
114
- readonly alwaysIncluded: false;
115
- readonly width: 2704;
116
- };
108
+ export declare const Screens: {
109
+ readonly xs: 160;
110
+ readonly sm: 338;
111
+ readonly md: 676;
112
+ readonly lg: 1352;
113
+ readonly xl: 2704;
117
114
  };
118
115
 
119
116
  declare enum StashImageProvider {