@bagelink/vue 0.0.974 → 0.0.978

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.
@@ -1 +1 @@
1
- {"version":3,"file":"Image.vue.d.ts","sourceRoot":"","sources":["../../src/components/Image.vue"],"names":[],"mappings":";SA4CM,MAAM;UACL,MAAM;YACJ,MAAM,GAAG,MAAM;aACd,MAAM,GAAG,MAAM;;SAHnB,MAAM;UACL,MAAM;YACJ,MAAM,GAAG,MAAM;aACd,MAAM,GAAG,MAAM;;AA8EzB,wBAMG"}
1
+ {"version":3,"file":"Image.vue.d.ts","sourceRoot":"","sources":["../../src/components/Image.vue"],"names":[],"mappings":";SAyFM,MAAM;UACL,MAAM;YACJ,MAAM,GAAG,MAAM;aACd,MAAM,GAAG,MAAM;;SAHnB,MAAM;UACL,MAAM;YACJ,MAAM,GAAG,MAAM;aACd,MAAM,GAAG,MAAM;;AAwHzB,wBAMG"}
@@ -13,6 +13,7 @@ export { default as DataPreview } from './DataPreview.vue';
13
13
  export { default as Dropdown } from './Dropdown.vue';
14
14
  export { default as Flag } from './Flag.vue';
15
15
  export * from './form';
16
+ export { default as Image } from './Image.vue';
16
17
  export * from './layout';
17
18
  export { default as ListItem } from './ListItem.vue';
18
19
  export { default as ListView } from './ListView.vue';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,iBAAiB,CAAA;AACtD,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAC9D,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAC9D,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,cAAc,CAAA;AAChD,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACpD,OAAO,EAAE,OAAO,IAAI,GAAG,EAAE,MAAM,WAAW,CAAA;AAC1C,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,YAAY,CAAA;AAC5C,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACpD,cAAc,aAAa,CAAA;AAC3B,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC1D,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACpD,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,YAAY,CAAA;AAC5C,cAAc,QAAQ,CAAA;AAEtB,cAAc,UAAU,CAAA;AACxB,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACpD,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACpD,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACpD,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAC5D,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAC5D,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,iBAAiB,CAAA;AACtD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,cAAc,CAAA;AAChD,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,iBAAiB,CAAA;AACtD,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,YAAY,CAAA;AAE5C,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAC9D,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC1D,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,cAAc,CAAA;AAChD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,cAAc,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,iBAAiB,CAAA;AACtD,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAC9D,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAC9D,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,cAAc,CAAA;AAChD,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACpD,OAAO,EAAE,OAAO,IAAI,GAAG,EAAE,MAAM,WAAW,CAAA;AAC1C,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,YAAY,CAAA;AAC5C,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACpD,cAAc,aAAa,CAAA;AAC3B,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC1D,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACpD,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,YAAY,CAAA;AAC5C,cAAc,QAAQ,CAAA;AACtB,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,aAAa,CAAA;AAE9C,cAAc,UAAU,CAAA;AACxB,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACpD,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACpD,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACpD,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAC5D,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAC5D,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,iBAAiB,CAAA;AACtD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,cAAc,CAAA;AAChD,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAEtD,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,YAAY,CAAA;AAC5C,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAC9D,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC1D,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,cAAc,CAAA;AAChD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,cAAc,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"Lightbox.vue.d.ts","sourceRoot":"","sources":["../../../src/components/lightbox/Lightbox.vue"],"names":[],"mappings":"AAwRA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAapD,iBAAS,IAAI,CAAC,IAAI,EAAE,YAAY,EAAE,UAAU,CAAC,EAAE,YAAY,EAAE,QAO5D;AAED,iBAAS,KAAK,SAGb;;;;;AA8fD,wBAMG"}
1
+ {"version":3,"file":"Lightbox.vue.d.ts","sourceRoot":"","sources":["../../../src/components/lightbox/Lightbox.vue"],"names":[],"mappings":"AAiRA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAYpD,iBAAS,IAAI,CAAC,IAAI,EAAE,YAAY,EAAE,UAAU,CAAC,EAAE,YAAY,EAAE,QAO5D;AAED,iBAAS,KAAK,SAGb;;;;;AAwfD,wBAMG"}
package/dist/index.cjs CHANGED
@@ -19726,19 +19726,48 @@ const _sfc_main$E = /* @__PURE__ */ vue.defineComponent({
19726
19726
  __name: "Image",
19727
19727
  props: {
19728
19728
  src: {},
19729
- alt: {},
19729
+ alt: { default: "" },
19730
19730
  width: {},
19731
19731
  height: {}
19732
19732
  },
19733
19733
  setup(__props) {
19734
19734
  let imageSrc = vue.ref(null);
19735
19735
  async function loadImage(src) {
19736
- if (src.endsWith(".heic")) {
19736
+ var _a2;
19737
+ if (!src) {
19738
+ imageSrc.value = null;
19739
+ return;
19740
+ }
19741
+ src = normalizeURL(src);
19742
+ const ext = (_a2 = src.split(".").pop()) == null ? void 0 : _a2.toLowerCase().split("?").shift();
19743
+ if (ext === "heic") {
19744
+ if (!("caches" in window)) {
19745
+ console.warn("Caching is not available. Proceeding without cache.");
19746
+ } else {
19747
+ try {
19748
+ const imgCache = await window.caches.open("img-cache");
19749
+ const cachedResponse = await imgCache.match(src);
19750
+ if (cachedResponse) {
19751
+ imageSrc.value = URL.createObjectURL(await cachedResponse.blob());
19752
+ return;
19753
+ }
19754
+ } catch (error) {
19755
+ console.warn("Error accessing cache:", error);
19756
+ }
19757
+ }
19737
19758
  try {
19738
19759
  const response = await fetch(src);
19739
19760
  const blob = await response.blob();
19740
19761
  const convertedBlob = await heic2any({ blob });
19741
19762
  imageSrc.value = URL.createObjectURL(convertedBlob);
19763
+ if ("caches" in window) {
19764
+ try {
19765
+ const imgCache = await window.caches.open("img-cache");
19766
+ imgCache.put(src, new Response(convertedBlob));
19767
+ } catch (cacheError) {
19768
+ console.warn("Failed to cache the image:", cacheError);
19769
+ }
19770
+ }
19742
19771
  } catch (error) {
19743
19772
  console.error("Error converting HEIC file:", error);
19744
19773
  }
@@ -19748,19 +19777,23 @@ const _sfc_main$E = /* @__PURE__ */ vue.defineComponent({
19748
19777
  }
19749
19778
  vue.watch(() => __props.src, loadImage, { immediate: true });
19750
19779
  return (_ctx, _cache) => {
19751
- return vue.openBlock(), vue.createElementBlock("div", null, [
19752
- vue.unref(imageSrc) ? (vue.openBlock(), vue.createElementBlock("img", vue.mergeProps({
19753
- key: 0,
19754
- src: vue.unref(imageSrc)
19755
- }, _ctx.$attrs, {
19756
- alt: _ctx.alt,
19757
- width: _ctx.width,
19758
- height: _ctx.height
19759
- }), null, 16, _hoisted_1$w)) : vue.createCommentVNode("", true)
19760
- ]);
19780
+ return vue.unref(imageSrc) ? (vue.openBlock(), vue.createElementBlock("img", vue.mergeProps({
19781
+ key: 0,
19782
+ src: vue.unref(imageSrc)
19783
+ }, _ctx.$attrs, {
19784
+ alt: _ctx.alt,
19785
+ width: vue.unref(normalizeDimension)(_ctx.width),
19786
+ height: vue.unref(normalizeDimension)(_ctx.height)
19787
+ }), null, 16, _hoisted_1$w)) : (vue.openBlock(), vue.createBlock(vue.unref(Skeleton), {
19788
+ key: 1,
19789
+ class: "img-web-kit",
19790
+ width: vue.unref(normalizeDimension)(_ctx.width),
19791
+ height: vue.unref(normalizeDimension)(_ctx.height)
19792
+ }, null, 8, ["width", "height"]));
19761
19793
  };
19762
19794
  }
19763
19795
  });
19796
+ const Image$2 = /* @__PURE__ */ _export_sfc(_sfc_main$E, [["__scopeId", "data-v-e1f932a8"]]);
19764
19797
  const _hoisted_1$v = { class: "bagel-input" };
19765
19798
  const _hoisted_2$l = {
19766
19799
  key: 0,
@@ -20071,7 +20104,7 @@ const _sfc_main$D = /* @__PURE__ */ vue.defineComponent({
20071
20104
  key: file.id,
20072
20105
  class: "multi-image-item-preview"
20073
20106
  }, [
20074
- isImage(file.extension || file.url) ? (vue.openBlock(), vue.createBlock(_sfc_main$E, {
20107
+ isImage(file.extension || file.url) ? (vue.openBlock(), vue.createBlock(Image$2, {
20075
20108
  key: 0,
20076
20109
  class: "multi-preview",
20077
20110
  src: file.url,
@@ -20099,7 +20132,7 @@ const _sfc_main$D = /* @__PURE__ */ vue.defineComponent({
20099
20132
  class: "multi-image-item-preview"
20100
20133
  }, [
20101
20134
  isImage(fileQ.file.type) ? (vue.openBlock(), vue.createElementBlock(vue.Fragment, { key: 0 }, [
20102
- _ctx.multiple ? (vue.openBlock(), vue.createBlock(_sfc_main$E, {
20135
+ _ctx.multiple ? (vue.openBlock(), vue.createBlock(Image$2, {
20103
20136
  key: 0,
20104
20137
  width: _ctx.width || "220",
20105
20138
  class: "multi-preview",
@@ -20162,7 +20195,7 @@ const _sfc_main$D = /* @__PURE__ */ vue.defineComponent({
20162
20195
  ])
20163
20196
  ]),
20164
20197
  isImage(file.extension || file.url) ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_12$1, [
20165
- vue.withDirectives(vue.createVNode(_sfc_main$E, {
20198
+ vue.withDirectives(vue.createVNode(Image$2, {
20166
20199
  class: "single-preview",
20167
20200
  src: file.url,
20168
20201
  alt: ""
@@ -20195,7 +20228,7 @@ const _sfc_main$D = /* @__PURE__ */ vue.defineComponent({
20195
20228
  icon: "check"
20196
20229
  })
20197
20230
  ], 6),
20198
- isImage(fileQ.file.type) ? (vue.openBlock(), vue.createBlock(_sfc_main$E, {
20231
+ isImage(fileQ.file.type) ? (vue.openBlock(), vue.createBlock(Image$2, {
20199
20232
  key: 0,
20200
20233
  class: "single-preview",
20201
20234
  src: fileToUrl(fileQ.file),
@@ -56328,8 +56361,8 @@ const _sfc_main$k = /* @__PURE__ */ vue.defineComponent({
56328
56361
  __name: "Skeleton",
56329
56362
  props: {
56330
56363
  count: { default: 1 },
56331
- height: { default: "50px" },
56332
- width: { default: "auto" },
56364
+ height: {},
56365
+ width: {},
56333
56366
  round: { type: Boolean, default: false },
56334
56367
  borderRadius: { default: "var(--skeleton-radius)" },
56335
56368
  class: { default: "" }
@@ -56355,7 +56388,7 @@ const _sfc_main$k = /* @__PURE__ */ vue.defineComponent({
56355
56388
  };
56356
56389
  }
56357
56390
  });
56358
- const Skeleton = /* @__PURE__ */ _export_sfc(_sfc_main$k, [["__scopeId", "data-v-9a44f23a"]]);
56391
+ const Skeleton = /* @__PURE__ */ _export_sfc(_sfc_main$k, [["__scopeId", "data-v-4da8c0d1"]]);
56359
56392
  const _hoisted_1$e = { class: "bgl_card tabs-top" };
56360
56393
  const _hoisted_2$8 = { class: "tabs grid auto-flow-columns fit-content" };
56361
56394
  const _hoisted_3$6 = ["onClick"];
@@ -58935,11 +58968,6 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
58935
58968
  if (val) document.body.style.overflow = "hidden";
58936
58969
  else document.body.style.overflow = "";
58937
58970
  });
58938
- function normalizeURL(url) {
58939
- if (url.startsWith("https://")) return url;
58940
- url = url.replace(/http:\/\//, "");
58941
- return `//${url}`;
58942
- }
58943
58971
  function handleKeydown(event) {
58944
58972
  if (event.key === "Escape") {
58945
58973
  close2();
@@ -59052,7 +59080,7 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
59052
59080
  default: vue.withCtx(() => {
59053
59081
  var _a3;
59054
59082
  return [
59055
- vue.createVNode(_sfc_main$E, {
59083
+ vue.createVNode(vue.unref(Image$2), {
59056
59084
  draggable: false,
59057
59085
  src: (_a3 = vue.unref(currentItem)) == null ? void 0 : _a3.src,
59058
59086
  alt: "Preview",
@@ -59069,7 +59097,7 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
59069
59097
  class: "vw90"
59070
59098
  }, null, 8, ["src"])) : ((_m = vue.unref(currentItem)) == null ? void 0 : _m.type) === "pdf" ? (vue.openBlock(), vue.createElementBlock("embed", {
59071
59099
  key: 2,
59072
- src: normalizeURL((_n2 = vue.unref(currentItem)) == null ? void 0 : _n2.src),
59100
+ src: vue.unref(normalizeURL)((_n2 = vue.unref(currentItem)) == null ? void 0 : _n2.src),
59073
59101
  type: "application/pdf",
59074
59102
  width: "100%",
59075
59103
  height: "1080",
@@ -59111,7 +59139,7 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
59111
59139
  vue.unref(group) && vue.unref(group).length > 1 ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_13, [
59112
59140
  (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(vue.unref(group), (item, index2) => {
59113
59141
  return vue.openBlock(), vue.createElementBlock(vue.Fragment, { key: index2 }, [
59114
- item.type === "image" ? (vue.openBlock(), vue.createBlock(_sfc_main$E, {
59142
+ item.type === "image" ? (vue.openBlock(), vue.createBlock(vue.unref(Image$2), {
59115
59143
  key: 0,
59116
59144
  class: vue.normalizeClass(["thumbnail object-fit-cover hover opacity-5 rounded flex bg-popup justify-content-center align-items-center flex-shrink-0", { active: vue.unref(currentIndex) === index2 }]),
59117
59145
  src: item.src,
@@ -59135,7 +59163,7 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
59135
59163
  };
59136
59164
  }
59137
59165
  });
59138
- const Lightbox$1 = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-0a882f27"]]);
59166
+ const Lightbox$1 = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-d5e5a1db"]]);
59139
59167
  const groups = {};
59140
59168
  let clickHandler = (_e2) => void 0;
59141
59169
  const lightboxDirective = {
@@ -59488,6 +59516,15 @@ function appendScript(src) {
59488
59516
  document.head.append(script2);
59489
59517
  });
59490
59518
  }
59519
+ function normalizeURL(url) {
59520
+ if (url.startsWith("https://")) return url;
59521
+ url = url.replace(/http:\/\//, "");
59522
+ return `https://${url}`;
59523
+ }
59524
+ function normalizeDimension(value, defaultMetric = "px") {
59525
+ if (typeof value === "number") return `${value}${defaultMetric}`;
59526
+ return value;
59527
+ }
59491
59528
  const clickOutside = {
59492
59529
  beforeMount(el, binding) {
59493
59530
  el.clickOutsideEvent = (event) => {
@@ -60085,6 +60122,7 @@ exports.Flag = Flag;
60085
60122
  exports.IMAGE_FORMATS = IMAGE_FORMATS;
60086
60123
  exports.IMAGE_FORMATS_REGEXP = IMAGE_FORMATS_REGEXP;
60087
60124
  exports.Icon = _sfc_main$c;
60125
+ exports.Image = Image$2;
60088
60126
  exports.JSONInput = JSONInput;
60089
60127
  exports.Layout = Layout;
60090
60128
  exports.Lineart = _sfc_main$Q;
@@ -60141,6 +60179,8 @@ exports.iffer = iffer;
60141
60179
  exports.initials = initials;
60142
60180
  exports.isDate = isDate;
60143
60181
  exports.keyToLabel = keyToLabel;
60182
+ exports.normalizeDimension = normalizeDimension;
60183
+ exports.normalizeURL = normalizeURL;
60144
60184
  exports.sleep = sleep;
60145
60185
  exports.timeAgo = timeAgo;
60146
60186
  exports.useBagel = useBagel;
package/dist/index.mjs CHANGED
@@ -19724,19 +19724,48 @@ const _sfc_main$E = /* @__PURE__ */ defineComponent({
19724
19724
  __name: "Image",
19725
19725
  props: {
19726
19726
  src: {},
19727
- alt: {},
19727
+ alt: { default: "" },
19728
19728
  width: {},
19729
19729
  height: {}
19730
19730
  },
19731
19731
  setup(__props) {
19732
19732
  let imageSrc = ref(null);
19733
19733
  async function loadImage(src) {
19734
- if (src.endsWith(".heic")) {
19734
+ var _a2;
19735
+ if (!src) {
19736
+ imageSrc.value = null;
19737
+ return;
19738
+ }
19739
+ src = normalizeURL(src);
19740
+ const ext = (_a2 = src.split(".").pop()) == null ? void 0 : _a2.toLowerCase().split("?").shift();
19741
+ if (ext === "heic") {
19742
+ if (!("caches" in window)) {
19743
+ console.warn("Caching is not available. Proceeding without cache.");
19744
+ } else {
19745
+ try {
19746
+ const imgCache = await window.caches.open("img-cache");
19747
+ const cachedResponse = await imgCache.match(src);
19748
+ if (cachedResponse) {
19749
+ imageSrc.value = URL.createObjectURL(await cachedResponse.blob());
19750
+ return;
19751
+ }
19752
+ } catch (error) {
19753
+ console.warn("Error accessing cache:", error);
19754
+ }
19755
+ }
19735
19756
  try {
19736
19757
  const response = await fetch(src);
19737
19758
  const blob = await response.blob();
19738
19759
  const convertedBlob = await heic2any({ blob });
19739
19760
  imageSrc.value = URL.createObjectURL(convertedBlob);
19761
+ if ("caches" in window) {
19762
+ try {
19763
+ const imgCache = await window.caches.open("img-cache");
19764
+ imgCache.put(src, new Response(convertedBlob));
19765
+ } catch (cacheError) {
19766
+ console.warn("Failed to cache the image:", cacheError);
19767
+ }
19768
+ }
19740
19769
  } catch (error) {
19741
19770
  console.error("Error converting HEIC file:", error);
19742
19771
  }
@@ -19746,19 +19775,23 @@ const _sfc_main$E = /* @__PURE__ */ defineComponent({
19746
19775
  }
19747
19776
  watch(() => __props.src, loadImage, { immediate: true });
19748
19777
  return (_ctx, _cache) => {
19749
- return openBlock(), createElementBlock("div", null, [
19750
- unref(imageSrc) ? (openBlock(), createElementBlock("img", mergeProps({
19751
- key: 0,
19752
- src: unref(imageSrc)
19753
- }, _ctx.$attrs, {
19754
- alt: _ctx.alt,
19755
- width: _ctx.width,
19756
- height: _ctx.height
19757
- }), null, 16, _hoisted_1$w)) : createCommentVNode("", true)
19758
- ]);
19778
+ return unref(imageSrc) ? (openBlock(), createElementBlock("img", mergeProps({
19779
+ key: 0,
19780
+ src: unref(imageSrc)
19781
+ }, _ctx.$attrs, {
19782
+ alt: _ctx.alt,
19783
+ width: unref(normalizeDimension)(_ctx.width),
19784
+ height: unref(normalizeDimension)(_ctx.height)
19785
+ }), null, 16, _hoisted_1$w)) : (openBlock(), createBlock(unref(Skeleton), {
19786
+ key: 1,
19787
+ class: "img-web-kit",
19788
+ width: unref(normalizeDimension)(_ctx.width),
19789
+ height: unref(normalizeDimension)(_ctx.height)
19790
+ }, null, 8, ["width", "height"]));
19759
19791
  };
19760
19792
  }
19761
19793
  });
19794
+ const Image$2 = /* @__PURE__ */ _export_sfc(_sfc_main$E, [["__scopeId", "data-v-e1f932a8"]]);
19762
19795
  const _hoisted_1$v = { class: "bagel-input" };
19763
19796
  const _hoisted_2$l = {
19764
19797
  key: 0,
@@ -20069,7 +20102,7 @@ const _sfc_main$D = /* @__PURE__ */ defineComponent({
20069
20102
  key: file.id,
20070
20103
  class: "multi-image-item-preview"
20071
20104
  }, [
20072
- isImage(file.extension || file.url) ? (openBlock(), createBlock(_sfc_main$E, {
20105
+ isImage(file.extension || file.url) ? (openBlock(), createBlock(Image$2, {
20073
20106
  key: 0,
20074
20107
  class: "multi-preview",
20075
20108
  src: file.url,
@@ -20097,7 +20130,7 @@ const _sfc_main$D = /* @__PURE__ */ defineComponent({
20097
20130
  class: "multi-image-item-preview"
20098
20131
  }, [
20099
20132
  isImage(fileQ.file.type) ? (openBlock(), createElementBlock(Fragment$1, { key: 0 }, [
20100
- _ctx.multiple ? (openBlock(), createBlock(_sfc_main$E, {
20133
+ _ctx.multiple ? (openBlock(), createBlock(Image$2, {
20101
20134
  key: 0,
20102
20135
  width: _ctx.width || "220",
20103
20136
  class: "multi-preview",
@@ -20160,7 +20193,7 @@ const _sfc_main$D = /* @__PURE__ */ defineComponent({
20160
20193
  ])
20161
20194
  ]),
20162
20195
  isImage(file.extension || file.url) ? (openBlock(), createElementBlock("div", _hoisted_12$1, [
20163
- withDirectives(createVNode(_sfc_main$E, {
20196
+ withDirectives(createVNode(Image$2, {
20164
20197
  class: "single-preview",
20165
20198
  src: file.url,
20166
20199
  alt: ""
@@ -20193,7 +20226,7 @@ const _sfc_main$D = /* @__PURE__ */ defineComponent({
20193
20226
  icon: "check"
20194
20227
  })
20195
20228
  ], 6),
20196
- isImage(fileQ.file.type) ? (openBlock(), createBlock(_sfc_main$E, {
20229
+ isImage(fileQ.file.type) ? (openBlock(), createBlock(Image$2, {
20197
20230
  key: 0,
20198
20231
  class: "single-preview",
20199
20232
  src: fileToUrl(fileQ.file),
@@ -56326,8 +56359,8 @@ const _sfc_main$k = /* @__PURE__ */ defineComponent({
56326
56359
  __name: "Skeleton",
56327
56360
  props: {
56328
56361
  count: { default: 1 },
56329
- height: { default: "50px" },
56330
- width: { default: "auto" },
56362
+ height: {},
56363
+ width: {},
56331
56364
  round: { type: Boolean, default: false },
56332
56365
  borderRadius: { default: "var(--skeleton-radius)" },
56333
56366
  class: { default: "" }
@@ -56353,7 +56386,7 @@ const _sfc_main$k = /* @__PURE__ */ defineComponent({
56353
56386
  };
56354
56387
  }
56355
56388
  });
56356
- const Skeleton = /* @__PURE__ */ _export_sfc(_sfc_main$k, [["__scopeId", "data-v-9a44f23a"]]);
56389
+ const Skeleton = /* @__PURE__ */ _export_sfc(_sfc_main$k, [["__scopeId", "data-v-4da8c0d1"]]);
56357
56390
  const _hoisted_1$e = { class: "bgl_card tabs-top" };
56358
56391
  const _hoisted_2$8 = { class: "tabs grid auto-flow-columns fit-content" };
56359
56392
  const _hoisted_3$6 = ["onClick"];
@@ -58933,11 +58966,6 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
58933
58966
  if (val) document.body.style.overflow = "hidden";
58934
58967
  else document.body.style.overflow = "";
58935
58968
  });
58936
- function normalizeURL(url) {
58937
- if (url.startsWith("https://")) return url;
58938
- url = url.replace(/http:\/\//, "");
58939
- return `//${url}`;
58940
- }
58941
58969
  function handleKeydown(event) {
58942
58970
  if (event.key === "Escape") {
58943
58971
  close2();
@@ -59050,7 +59078,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
59050
59078
  default: withCtx(() => {
59051
59079
  var _a3;
59052
59080
  return [
59053
- createVNode(_sfc_main$E, {
59081
+ createVNode(unref(Image$2), {
59054
59082
  draggable: false,
59055
59083
  src: (_a3 = unref(currentItem)) == null ? void 0 : _a3.src,
59056
59084
  alt: "Preview",
@@ -59067,7 +59095,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
59067
59095
  class: "vw90"
59068
59096
  }, null, 8, ["src"])) : ((_m = unref(currentItem)) == null ? void 0 : _m.type) === "pdf" ? (openBlock(), createElementBlock("embed", {
59069
59097
  key: 2,
59070
- src: normalizeURL((_n2 = unref(currentItem)) == null ? void 0 : _n2.src),
59098
+ src: unref(normalizeURL)((_n2 = unref(currentItem)) == null ? void 0 : _n2.src),
59071
59099
  type: "application/pdf",
59072
59100
  width: "100%",
59073
59101
  height: "1080",
@@ -59109,7 +59137,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
59109
59137
  unref(group) && unref(group).length > 1 ? (openBlock(), createElementBlock("div", _hoisted_13, [
59110
59138
  (openBlock(true), createElementBlock(Fragment$1, null, renderList(unref(group), (item, index2) => {
59111
59139
  return openBlock(), createElementBlock(Fragment$1, { key: index2 }, [
59112
- item.type === "image" ? (openBlock(), createBlock(_sfc_main$E, {
59140
+ item.type === "image" ? (openBlock(), createBlock(unref(Image$2), {
59113
59141
  key: 0,
59114
59142
  class: normalizeClass(["thumbnail object-fit-cover hover opacity-5 rounded flex bg-popup justify-content-center align-items-center flex-shrink-0", { active: unref(currentIndex) === index2 }]),
59115
59143
  src: item.src,
@@ -59133,7 +59161,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
59133
59161
  };
59134
59162
  }
59135
59163
  });
59136
- const Lightbox$1 = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-0a882f27"]]);
59164
+ const Lightbox$1 = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-d5e5a1db"]]);
59137
59165
  const groups = {};
59138
59166
  let clickHandler = (_e2) => void 0;
59139
59167
  const lightboxDirective = {
@@ -59486,6 +59514,15 @@ function appendScript(src) {
59486
59514
  document.head.append(script2);
59487
59515
  });
59488
59516
  }
59517
+ function normalizeURL(url) {
59518
+ if (url.startsWith("https://")) return url;
59519
+ url = url.replace(/http:\/\//, "");
59520
+ return `https://${url}`;
59521
+ }
59522
+ function normalizeDimension(value, defaultMetric = "px") {
59523
+ if (typeof value === "number") return `${value}${defaultMetric}`;
59524
+ return value;
59525
+ }
59489
59526
  const clickOutside = {
59490
59527
  beforeMount(el, binding) {
59491
59528
  el.clickOutsideEvent = (event) => {
@@ -60084,6 +60121,7 @@ export {
60084
60121
  IMAGE_FORMATS,
60085
60122
  IMAGE_FORMATS_REGEXP,
60086
60123
  _sfc_main$c as Icon,
60124
+ Image$2 as Image,
60087
60125
  JSONInput,
60088
60126
  Layout,
60089
60127
  _sfc_main$Q as Lineart,
@@ -60140,6 +60178,8 @@ export {
60140
60178
  initials,
60141
60179
  isDate,
60142
60180
  keyToLabel,
60181
+ normalizeDimension,
60182
+ normalizeURL,
60143
60183
  sleep,
60144
60184
  timeAgo,
60145
60185
  useBagel,
package/dist/style.css CHANGED
@@ -707,6 +707,13 @@ data[data-v-6c27f163] {
707
707
  }
708
708
  }
709
709
 
710
+ .img-web-kit[data-v-e1f932a8] {
711
+ max-width: 100%;
712
+ vertical-align: middle;
713
+ border: 0;
714
+ width: 100%;
715
+ }
716
+
710
717
  .fileUploadWrap[data-v-e057bb0f] {
711
718
  outline: 1px solid var(--border-color);
712
719
  border-radius: var(--input-border-radius);
@@ -1805,25 +1812,25 @@ p {
1805
1812
  transform: translateX(-20px);
1806
1813
  }
1807
1814
 
1808
- .skeleton-wrap[data-v-9a44f23a] {
1815
+ .skeleton-wrap[data-v-4da8c0d1] {
1809
1816
  margin-bottom: var(--skeleton-margin);
1810
1817
  }
1811
- .skeleton[data-v-9a44f23a] {
1818
+ .skeleton[data-v-4da8c0d1] {
1812
1819
  background-color: var(--skeleton-bg);
1813
1820
  border-radius: var(--bg-card-radius);
1814
1821
  margin-bottom: 0.25em;
1815
1822
  position: relative;
1816
1823
  overflow: hidden;
1817
1824
  }
1818
- .skeleton[data-v-9a44f23a]::before {
1825
+ .skeleton[data-v-4da8c0d1]::before {
1819
1826
  content: "";
1820
1827
  background: linear-gradient(90deg, transparent 20%, var(--skeleton-pulse) 50%, transparent 80%);
1821
- animation: loadingAnimation-9a44f23a 1s ease-in-out infinite;
1828
+ animation: loadingAnimation-4da8c0d1 1s ease-in-out infinite;
1822
1829
  position: absolute;
1823
1830
  inset: 0px;
1824
1831
  transform: translateX(-100%);
1825
1832
  }
1826
- @keyframes loadingAnimation-9a44f23a {
1833
+ @keyframes loadingAnimation-4da8c0d1 {
1827
1834
  to {
1828
1835
  transform: translateX(100%);
1829
1836
  }
@@ -3474,19 +3481,19 @@ tbody tr[data-v-fae54756]:hover {
3474
3481
  -moz-user-drag: none;
3475
3482
  }
3476
3483
 
3477
- .lightbox-image[data-v-0a882f27]{
3484
+ .lightbox-image[data-v-d5e5a1db]{
3478
3485
  object-fit: contain;
3479
3486
  }
3480
- .bgl-lightbox-overlay[data-v-0a882f27] {
3487
+ .bgl-lightbox-overlay[data-v-d5e5a1db] {
3481
3488
  background: rgba(0, 0, 0, 0.8);
3482
3489
  }
3483
- .bgl-lightbox[data-v-0a882f27] {
3490
+ .bgl-lightbox[data-v-d5e5a1db] {
3484
3491
  max-height: 90%;
3485
3492
  }
3486
- .bgl-lightbox-item[data-v-0a882f27]{
3487
- animation: 500ms ease bgl-lightbox-load-0a882f27;
3493
+ .bgl-lightbox-item[data-v-d5e5a1db]{
3494
+ animation: 500ms ease bgl-lightbox-load-d5e5a1db;
3488
3495
  }
3489
- @keyframes bgl-lightbox-load-0a882f27 {
3496
+ @keyframes bgl-lightbox-load-d5e5a1db {
3490
3497
  from {
3491
3498
  scale:0.7;
3492
3499
  }
@@ -3494,44 +3501,44 @@ to {
3494
3501
  scale:1;
3495
3502
  }
3496
3503
  }
3497
- .bgl-lightbox-item[data-v-0a882f27] * {
3504
+ .bgl-lightbox-item[data-v-d5e5a1db] * {
3498
3505
  max-width: 90%;
3499
3506
  max-height: calc(80vh - 90px);
3500
3507
  border-radius: 3px;
3501
3508
  margin: auto;
3502
- animation: 200ms ease bgl-lightbox-load-0a882f27;
3509
+ animation: 200ms ease bgl-lightbox-load-d5e5a1db;
3503
3510
  }
3504
- .navigation[data-v-0a882f27] {
3511
+ .navigation[data-v-d5e5a1db] {
3505
3512
  top: 50%;
3506
3513
  transform: translateY(-50%);
3507
3514
  }
3508
- .navigation-btn[data-v-0a882f27] {
3515
+ .navigation-btn[data-v-d5e5a1db] {
3509
3516
  width: var(--input-height);
3510
3517
  height: var(--input-height);
3511
3518
  }
3512
- .thumbnail[data-v-0a882f27] {
3519
+ .thumbnail[data-v-d5e5a1db] {
3513
3520
  height: 50px;
3514
3521
  width: 50px;
3515
3522
  }
3516
- .thumbnail[data-v-0a882f27]:hover {
3523
+ .thumbnail[data-v-d5e5a1db]:hover {
3517
3524
  opacity: 1;
3518
3525
  }
3519
- .thumbnail[data-v-0a882f27]:active {
3526
+ .thumbnail[data-v-d5e5a1db]:active {
3520
3527
  opacity: 0.8;
3521
3528
  }
3522
- .thumbnail.active[data-v-0a882f27] {
3529
+ .thumbnail.active[data-v-d5e5a1db] {
3523
3530
  opacity: 1;
3524
3531
  outline: 2px solid white;
3525
3532
  }
3526
- .file-info[data-v-0a882f27]{
3533
+ .file-info[data-v-d5e5a1db]{
3527
3534
  max-width: 420px
3528
3535
  }
3529
3536
  @media screen and (max-width: 910px) {
3530
- .file-info[data-v-0a882f27]{
3537
+ .file-info[data-v-d5e5a1db]{
3531
3538
  max-width: 220px;
3532
3539
  text-align: center !important;
3533
3540
  }
3534
- .file-info[data-v-0a882f27] *{
3541
+ .file-info[data-v-d5e5a1db] *{
3535
3542
  text-align: center !important;
3536
3543
  margin-inline: 0 !important;;
3537
3544
  max-width: 100% !important;
@@ -16,6 +16,8 @@ export declare const isDate: (dateToTest: any) => boolean;
16
16
  export declare function getFallbackSchema<T>(data?: any[], showFields?: string[]): BglFormSchemaT<T>;
17
17
  export declare function sleep(ms?: number): Promise<unknown>;
18
18
  export declare function appendScript(src: string): Promise<void>;
19
+ export declare function normalizeURL(url: string): string;
20
+ export declare function normalizeDimension(value: string | number | undefined, defaultMetric?: string): string | undefined;
19
21
  export * as bagelFormUtils from './BagelFormUtils';
20
22
  export { useLang } from './lang';
21
23
  export { formatString } from './strings';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAE/D,wBAAgB,QAAQ,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,EAC3E,QAAQ,EAAE,CAAC,EACX,IAAI,EAAE,MAAM,EACZ,SAAS,CAAC,EAAE,OAAO,GACjB,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CAelC;AAED,wBAAgB,UAAU,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAQ3D;AAED,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,iBAGtE;AAED,wBAAgB,QAAQ,CAAC,GAAG,MAAM,EAAE,MAAM,EAAE,UAG3C;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,IAAI,QAIrE;AAED,wBAAgB,QAAQ,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,OAAO,EAAE,GAAG,EAAE,UAOpE;AAED,wBAAgB,SAAS,CAAC,CAAC,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,EACnD,KAAK,CAAC,EAAE,UAAU,EAClB,QAAQ,CAAC,EAAE,GAAG,EACd,GAAG,CAAC,EAAE,CAAC,OAcP;AAED,wBAAgB,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,OAO9C;AAED,wBAAgB,SAAS,CAAC,QAAQ,CAAC,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,EAAE,OAAO,CAAC,EAAE,MAAM,OAG5E;AAED,eAAO,MAAM,MAAM,eAAgB,GAAG,YAA0C,CAAA;AAEhF,wBAAgB,iBAAiB,CAAC,CAAC,EAClC,IAAI,CAAC,EAAE,GAAG,EAAE,EACZ,UAAU,CAAC,EAAE,MAAM,EAAE,GACnB,cAAc,CAAC,CAAC,CAAC,CAWnB;AAED,wBAAgB,KAAK,CAAC,EAAE,GAAE,MAAY,oBAErC;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAcvD;AAED,OAAO,KAAK,cAAc,MAAM,kBAAkB,CAAA;AAElD,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAA;AAEhC,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAE/D,wBAAgB,QAAQ,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,EAC3E,QAAQ,EAAE,CAAC,EACX,IAAI,EAAE,MAAM,EACZ,SAAS,CAAC,EAAE,OAAO,GACjB,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CAelC;AAED,wBAAgB,UAAU,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAQ3D;AAED,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,iBAGtE;AAED,wBAAgB,QAAQ,CAAC,GAAG,MAAM,EAAE,MAAM,EAAE,UAG3C;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,IAAI,QAIrE;AAED,wBAAgB,QAAQ,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,OAAO,EAAE,GAAG,EAAE,UAOpE;AAED,wBAAgB,SAAS,CAAC,CAAC,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,EACnD,KAAK,CAAC,EAAE,UAAU,EAClB,QAAQ,CAAC,EAAE,GAAG,EACd,GAAG,CAAC,EAAE,CAAC,OAcP;AAED,wBAAgB,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,OAO9C;AAED,wBAAgB,SAAS,CAAC,QAAQ,CAAC,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,EAAE,OAAO,CAAC,EAAE,MAAM,OAG5E;AAED,eAAO,MAAM,MAAM,eAAgB,GAAG,YAA0C,CAAA;AAEhF,wBAAgB,iBAAiB,CAAC,CAAC,EAClC,IAAI,CAAC,EAAE,GAAG,EAAE,EACZ,UAAU,CAAC,EAAE,MAAM,EAAE,GACnB,cAAc,CAAC,CAAC,CAAC,CAWnB;AAED,wBAAgB,KAAK,CAAC,EAAE,GAAE,MAAY,oBAErC;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAcvD;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,UAIvC;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,EAAE,aAAa,SAAO,GAAG,MAAM,GAAG,SAAS,CAG/G;AAED,OAAO,KAAK,cAAc,MAAM,kBAAkB,CAAA;AAElD,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAA;AAEhC,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@bagelink/vue",
3
3
  "type": "module",
4
- "version": "0.0.974",
4
+ "version": "0.0.978",
5
5
  "description": "Bagel core sdk packages",
6
6
  "author": {
7
7
  "name": "Neveh Allon",
@@ -1,8 +1,9 @@
1
1
  <script setup lang="ts">
2
+ import { Skeleton, normalizeURL, normalizeDimension } from '@bagelink/vue'
2
3
  import heic2any from 'heic2any'
3
4
  import { watch } from 'vue'
4
5
 
5
- const { src, alt, width, height } = defineProps<{
6
+ const { height, width, alt = '', src } = defineProps<{
6
7
  src: string
7
8
  alt?: string
8
9
  width?: string | number
@@ -12,12 +13,42 @@ const { src, alt, width, height } = defineProps<{
12
13
  let imageSrc = $ref<string | null>(null)
13
14
 
14
15
  async function loadImage(src: string) {
15
- if (src.endsWith('.heic')) {
16
+ if (!src) {
17
+ imageSrc = null
18
+ return
19
+ }
20
+ src = normalizeURL(src)
21
+ const ext = src.split('.').pop()?.toLowerCase().split('?').shift()
22
+
23
+ if (ext === 'heic') {
24
+ if (!('caches' in window)) {
25
+ console.warn('Caching is not available. Proceeding without cache.')
26
+ } else {
27
+ try {
28
+ const imgCache = await window.caches.open('img-cache')
29
+ const cachedResponse = await imgCache.match(src)
30
+ if (cachedResponse) {
31
+ imageSrc = URL.createObjectURL(await cachedResponse.blob())
32
+ return
33
+ }
34
+ } catch (error) {
35
+ console.warn('Error accessing cache:', error)
36
+ }
37
+ }
16
38
  try {
17
39
  const response = await fetch(src)
18
40
  const blob = await response.blob()
19
41
  const convertedBlob = await heic2any({ blob }) as Blob
20
42
  imageSrc = URL.createObjectURL(convertedBlob)
43
+ // Only attempt to cache if the cache API is available
44
+ if ('caches' in window) {
45
+ try {
46
+ const imgCache = await window.caches.open('img-cache')
47
+ imgCache.put(src, new Response(convertedBlob))
48
+ } catch (cacheError) {
49
+ console.warn('Failed to cache the image:', cacheError)
50
+ }
51
+ }
21
52
  } catch (error) {
22
53
  console.error('Error converting HEIC file:', error)
23
54
  }
@@ -25,12 +56,25 @@ async function loadImage(src: string) {
25
56
  imageSrc = src
26
57
  }
27
58
  }
28
-
29
59
  watch(() => src, loadImage, { immediate: true })
30
60
  </script>
31
61
 
32
62
  <template>
33
- <div>
34
- <img v-if="imageSrc" :src="imageSrc" v-bind="$attrs" :alt="alt" :width="width" :height="height">
35
- </div>
63
+ <img v-if="imageSrc" :src="imageSrc" v-bind="$attrs" :alt="alt" :width="normalizeDimension(width)" :height="normalizeDimension(height)">
64
+ <Skeleton
65
+ v-else
66
+ class="img-web-kit"
67
+ :width="normalizeDimension(width)"
68
+ :height="normalizeDimension(height)"
69
+ />
36
70
  </template>
71
+
72
+ <style scoped>
73
+ .img-web-kit {
74
+ max-width: 100%;
75
+ vertical-align: middle;
76
+ border: 0;
77
+ width: 100%;
78
+
79
+ }
80
+ </style>
@@ -13,6 +13,7 @@ export { default as DataPreview } from './DataPreview.vue'
13
13
  export { default as Dropdown } from './Dropdown.vue'
14
14
  export { default as Flag } from './Flag.vue'
15
15
  export * from './form'
16
+ export { default as Image } from './Image.vue'
16
17
  // export * from './whatsapp';
17
18
  export * from './layout'
18
19
  export { default as ListItem } from './ListItem.vue'
@@ -25,8 +26,8 @@ export { default as ModalConfirm } from './ModalConfirm.vue'
25
26
  export { default as ModalForm } from './ModalForm.vue'
26
27
  export { default as NavBar } from './NavBar.vue'
27
28
  export { default as PageTitle } from './PageTitle.vue'
28
- export { default as Pill } from './Pill.vue'
29
29
 
30
+ export { default as Pill } from './Pill.vue'
30
31
  export { default as RouterWrapper } from './RouterWrapper.vue'
31
32
  export { default as TableSchema } from './TableSchema.vue'
32
33
  export { default as Title } from './Title.vue'
@@ -1,8 +1,8 @@
1
1
  <script lang="ts" setup>
2
2
  const {
3
3
  count = 1,
4
- height = '50px',
5
- width = 'auto',
4
+ height,
5
+ width,
6
6
  borderRadius = 'var(--skeleton-radius)',
7
7
  round = false,
8
8
  class: className = '',
@@ -1,9 +1,8 @@
1
1
  <script setup lang="ts">
2
2
  import type { LightboxItem } from './lightbox.types'
3
3
 
4
- import { BglVideo, Btn, Icon, Zoomer } from '@bagelink/vue'
4
+ import { BglVideo, Btn, Icon, Zoomer, Image, normalizeURL } from '@bagelink/vue'
5
5
  import { watch } from 'vue'
6
- import Image from '../Image.vue'
7
6
 
8
7
  let isOpen = $ref(false)
9
8
  let currentItem = $ref<LightboxItem>()
@@ -48,12 +47,6 @@ watch(() => isOpen, (val) => {
48
47
  else document.body.style.overflow = ''
49
48
  })
50
49
 
51
- function normalizeURL(url: string) {
52
- if (url.startsWith('https://')) return url
53
- url = url.replace(/http:\/\//, '')
54
- return `//${url}`
55
- }
56
-
57
50
  function handleKeydown(event: KeyboardEvent) {
58
51
  if (event.key === 'Escape') {
59
52
  close()
@@ -127,6 +127,17 @@ export function appendScript(src: string): Promise<void> {
127
127
  })
128
128
  }
129
129
 
130
+ export function normalizeURL(url: string) {
131
+ if (url.startsWith('https://')) return url
132
+ url = url.replace(/http:\/\//, '')
133
+ return `https://${url}`
134
+ }
135
+
136
+ export function normalizeDimension(value: string | number | undefined, defaultMetric = 'px'): string | undefined {
137
+ if (typeof value === 'number') return `${value}${defaultMetric}`
138
+ return value
139
+ }
140
+
130
141
  export * as bagelFormUtils from './BagelFormUtils'
131
142
 
132
143
  export { useLang } from './lang'