@jvs-milkdown/components 1.2.5 → 1.2.7

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-input.d.ts","sourceRoot":"","sources":["../../../src/__internal__/components/image-input.tsx"],"names":[],"mappings":"AAEA,OAAO,EAA2B,KAAK,GAAG,EAAE,MAAM,KAAK,CAAA;AASvD,KAAK,eAAe,GAAG;IACrB,GAAG,EAAE,GAAG,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;IAC5B,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,CAAA;IACtB,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,CAAA;IACtB,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAE/B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAE9B,SAAS,CAAC,EAAE,MAAM,CAAA;IAElB,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;IACzC,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAC1D,CAAA;AAED,eAAO,MAAM,UAAU,0SAiLrB,CAAA"}
1
+ {"version":3,"file":"image-input.d.ts","sourceRoot":"","sources":["../../../src/__internal__/components/image-input.tsx"],"names":[],"mappings":"AAEA,OAAO,EAA2B,KAAK,GAAG,EAAE,MAAM,KAAK,CAAA;AASvD,KAAK,eAAe,GAAG;IACrB,GAAG,EAAE,GAAG,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;IAC5B,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,CAAA;IACtB,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,CAAA;IACtB,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAE/B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAE9B,SAAS,CAAC,EAAE,MAAM,CAAA;IAElB,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;IACzC,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAC1D,CAAA;AAED,eAAO,MAAM,UAAU,0SA0LrB,CAAA"}
@@ -3,9 +3,6 @@ export interface ImageBlockConfig {
3
3
  captionIcon: string | undefined;
4
4
  cropIcon: string | undefined;
5
5
  borderIcon: string | undefined;
6
- confirmIcon: string | undefined;
7
- cancelIcon: string | undefined;
8
- resetCropIcon: string | undefined;
9
6
  uploadButton: string | undefined;
10
7
  confirmButton: string | undefined;
11
8
  uploadPlaceholderText: string;
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/image-block/config.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,GAAG,SAAS,CAAA;IAC7B,WAAW,EAAE,MAAM,GAAG,SAAS,CAAA;IAC/B,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAA;IAC5B,UAAU,EAAE,MAAM,GAAG,SAAS,CAAA;IAC9B,WAAW,EAAE,MAAM,GAAG,SAAS,CAAA;IAC/B,UAAU,EAAE,MAAM,GAAG,SAAS,CAAA;IAC9B,aAAa,EAAE,MAAM,GAAG,SAAS,CAAA;IACjC,YAAY,EAAE,MAAM,GAAG,SAAS,CAAA;IAChC,aAAa,EAAE,MAAM,GAAG,SAAS,CAAA;IACjC,qBAAqB,EAAE,MAAM,CAAA;IAC7B,sBAAsB,EAAE,MAAM,CAAA;IAC9B,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;IACzC,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAA;IACvD,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACzD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,eAAO,MAAM,uBAAuB,EAAE,gBAarC,CAAA;AAED,eAAO,MAAM,gBAAgB,6EAG5B,CAAA"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/image-block/config.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,GAAG,SAAS,CAAA;IAC7B,WAAW,EAAE,MAAM,GAAG,SAAS,CAAA;IAC/B,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAA;IAC5B,UAAU,EAAE,MAAM,GAAG,SAAS,CAAA;IAC9B,YAAY,EAAE,MAAM,GAAG,SAAS,CAAA;IAChC,aAAa,EAAE,MAAM,GAAG,SAAS,CAAA;IACjC,qBAAqB,EAAE,MAAM,CAAA;IAC7B,sBAAsB,EAAE,MAAM,CAAA;IAC9B,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;IACzC,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAA;IACvD,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACzD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,eAAO,MAAM,uBAAuB,EAAE,gBAUrC,CAAA;AAED,eAAO,MAAM,gBAAgB,6EAG5B,CAAA"}
@@ -5,7 +5,7 @@ import { expectDomTypeError } from '@jvs-milkdown/exception';
5
5
  import { Slice, Fragment as Fragment$1 } from '@jvs-milkdown/prose/model';
6
6
  import { visit } from 'unist-util-visit';
7
7
  import DOMPurify from 'dompurify';
8
- import { h, defineComponent, ref, Fragment as Fragment$2, createApp, watchEffect } from 'vue';
8
+ import { h, defineComponent, ref, Fragment as Fragment$2, onMounted, onUnmounted, createApp, watchEffect } from 'vue';
9
9
  import clsx from 'clsx';
10
10
  import { customAlphabet } from 'nanoid';
11
11
 
@@ -39,9 +39,6 @@ const defaultImageBlockConfig = {
39
39
  captionIcon: "\u{1F4AC}",
40
40
  cropIcon: "\u2702\uFE0F",
41
41
  borderIcon: "\u{1F532}",
42
- confirmIcon: "\u2713",
43
- cancelIcon: "\u2715",
44
- resetCropIcon: "\u21A9",
45
42
  uploadButton: "Upload file",
46
43
  confirmButton: "Confirm \u23CE",
47
44
  uploadPlaceholderText: "or paste the image link ...",
@@ -515,7 +512,9 @@ const ImageInput = defineComponent({
515
512
  const isValidUrl = (url) => {
516
513
  if (!url) return false;
517
514
  const trimmedUrl = url.trim();
518
- return /^(https?:\/\/|\/|\.\.?\/|data:image\/|blob:|[a-zA-Z0-9-]+\.[a-zA-Z]+)/i.test(trimmedUrl);
515
+ return /^(https?:\/\/|\/|\.\.?\/|data:image\/|blob:|[a-zA-Z0-9-]+\.[a-zA-Z]+)/i.test(
516
+ trimmedUrl
517
+ );
519
518
  };
520
519
  const onKeydown = (e) => {
521
520
  var _a2, _b2, _c;
@@ -590,7 +589,10 @@ const ImageInput = defineComponent({
590
589
  )), /* @__PURE__ */ h(
591
590
  "div",
592
591
  {
593
- class: clsx("confirm", !isValidUrl(currentLink.value) && "disabled"),
592
+ class: clsx(
593
+ "confirm",
594
+ !isValidUrl(currentLink.value) && "disabled"
595
+ ),
594
596
  onClick: () => onConfirmLinkInput(),
595
597
  style: !isValidUrl(currentLink.value) ? { opacity: 0.5, cursor: "not-allowed" } : void 0
596
598
  },
@@ -831,15 +833,25 @@ const ImageViewer = defineComponent({
831
833
  isCropping.value = true;
832
834
  };
833
835
  const applyCrop = () => {
836
+ if (!isCropping.value) return;
834
837
  setAttr("cropTop", localCrop.value.top);
835
838
  setAttr("cropLeft", localCrop.value.left);
836
839
  setAttr("cropWidth", localCrop.value.width);
837
840
  setAttr("cropHeight", localCrop.value.height);
838
841
  isCropping.value = false;
839
842
  };
840
- const cancelCrop = () => {
841
- isCropping.value = false;
843
+ const handleGlobalPointerDown = (e) => {
844
+ if (!isCropping.value) return;
845
+ if (wrapperRef.value && !wrapperRef.value.contains(e.target)) {
846
+ applyCrop();
847
+ }
842
848
  };
849
+ onMounted(() => {
850
+ window.addEventListener("pointerdown", handleGlobalPointerDown);
851
+ });
852
+ onUnmounted(() => {
853
+ window.removeEventListener("pointerdown", handleGlobalPointerDown);
854
+ });
843
855
  const resetCrop = () => {
844
856
  setAttr("cropTop", 0);
845
857
  setAttr("cropLeft", 0);
@@ -926,7 +938,7 @@ const ImageViewer = defineComponent({
926
938
  cropDragType = "";
927
939
  };
928
940
  return () => {
929
- var _a2, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k;
941
+ var _a2, _b, _c, _d, _e, _f, _g, _h;
930
942
  const currentBorderStyle = (_a2 = borderStyle.value) != null ? _a2 : "none";
931
943
  const currentBorderWidth = localBorderWidth.value !== null ? localBorderWidth.value : (_b = borderWidth.value) != null ? _b : 0;
932
944
  const currentBorderColor = localBorderColor.value !== null ? localBorderColor.value : (_c = borderColor.value) != null ? _c : "#000000";
@@ -1023,7 +1035,7 @@ const ImageViewer = defineComponent({
1023
1035
  resetCrop();
1024
1036
  }
1025
1037
  },
1026
- /* @__PURE__ */ h(Icon, { icon: (_i = config.resetCropIcon) != null ? _i : "\u21A9" })
1038
+ /* @__PURE__ */ h(Icon, { icon: "\u21A9" })
1027
1039
  ) : null,
1028
1040
  config.borderIcon ? /* @__PURE__ */ h(
1029
1041
  "div",
@@ -1153,96 +1165,87 @@ const ImageViewer = defineComponent({
1153
1165
  }
1154
1166
  }
1155
1167
  ),
1156
- isCropping.value ? /* @__PURE__ */ h("div", { class: "crop-overlay", onClick: (e) => e.stopPropagation() }, /* @__PURE__ */ h(
1157
- "div",
1158
- {
1159
- class: "crop-box",
1160
- style: {
1161
- top: `${(localCrop.value.top * 100).toFixed(2)}%`,
1162
- left: `${(localCrop.value.left * 100).toFixed(2)}%`,
1163
- width: `${(localCrop.value.width * 100).toFixed(2)}%`,
1164
- height: `${(localCrop.value.height * 100).toFixed(2)}%`
1165
- },
1166
- onPointerdown: (e) => onCropBoxPointerDown(e, "move")
1167
- },
1168
- /* @__PURE__ */ h("div", { class: "crop-grid" }, /* @__PURE__ */ h("div", { class: "crop-grid-line horizontal first" }), /* @__PURE__ */ h("div", { class: "crop-grid-line horizontal second" }), /* @__PURE__ */ h("div", { class: "crop-grid-line vertical first" }), /* @__PURE__ */ h("div", { class: "crop-grid-line vertical second" })),
1169
- /* @__PURE__ */ h(
1170
- "div",
1171
- {
1172
- class: "crop-handle nw",
1173
- onPointerdown: (e) => onCropBoxPointerDown(e, "nw")
1174
- }
1175
- ),
1176
- /* @__PURE__ */ h(
1177
- "div",
1178
- {
1179
- class: "crop-handle ne",
1180
- onPointerdown: (e) => onCropBoxPointerDown(e, "ne")
1181
- }
1182
- ),
1183
- /* @__PURE__ */ h(
1184
- "div",
1185
- {
1186
- class: "crop-handle sw",
1187
- onPointerdown: (e) => onCropBoxPointerDown(e, "sw")
1188
- }
1189
- ),
1190
- /* @__PURE__ */ h(
1191
- "div",
1192
- {
1193
- class: "crop-handle se",
1194
- onPointerdown: (e) => onCropBoxPointerDown(e, "se")
1195
- }
1196
- ),
1197
- /* @__PURE__ */ h(
1198
- "div",
1199
- {
1200
- class: "crop-handle n",
1201
- onPointerdown: (e) => onCropBoxPointerDown(e, "n")
1202
- }
1203
- ),
1204
- /* @__PURE__ */ h(
1205
- "div",
1206
- {
1207
- class: "crop-handle s",
1208
- onPointerdown: (e) => onCropBoxPointerDown(e, "s")
1209
- }
1210
- ),
1211
- /* @__PURE__ */ h(
1212
- "div",
1213
- {
1214
- class: "crop-handle e",
1215
- onPointerdown: (e) => onCropBoxPointerDown(e, "e")
1216
- }
1217
- ),
1218
- /* @__PURE__ */ h(
1219
- "div",
1220
- {
1221
- class: "crop-handle w",
1222
- onPointerdown: (e) => onCropBoxPointerDown(e, "w")
1223
- }
1224
- )
1225
- ), /* @__PURE__ */ h("div", { class: "crop-toolbar" }, /* @__PURE__ */ h(
1168
+ isCropping.value ? /* @__PURE__ */ h(
1226
1169
  "div",
1227
1170
  {
1228
- class: "crop-toolbar-btn",
1171
+ class: "crop-overlay",
1229
1172
  onClick: (e) => {
1230
1173
  e.stopPropagation();
1231
1174
  applyCrop();
1232
1175
  }
1233
1176
  },
1234
- /* @__PURE__ */ h(Icon, { icon: (_j = config.confirmIcon) != null ? _j : "\u2713" })
1235
- ), /* @__PURE__ */ h(
1236
- "div",
1237
- {
1238
- class: "crop-toolbar-btn",
1239
- onClick: (e) => {
1240
- e.stopPropagation();
1241
- cancelCrop();
1242
- }
1243
- },
1244
- /* @__PURE__ */ h(Icon, { icon: (_k = config.cancelIcon) != null ? _k : "\u2715" })
1245
- ))) : null,
1177
+ /* @__PURE__ */ h(
1178
+ "div",
1179
+ {
1180
+ class: "crop-box",
1181
+ onClick: (e) => e.stopPropagation(),
1182
+ style: {
1183
+ top: `${(localCrop.value.top * 100).toFixed(2)}%`,
1184
+ left: `${(localCrop.value.left * 100).toFixed(2)}%`,
1185
+ width: `${(localCrop.value.width * 100).toFixed(2)}%`,
1186
+ height: `${(localCrop.value.height * 100).toFixed(2)}%`
1187
+ },
1188
+ onPointerdown: (e) => onCropBoxPointerDown(e, "move")
1189
+ },
1190
+ /* @__PURE__ */ h("div", { class: "crop-grid" }, /* @__PURE__ */ h("div", { class: "crop-grid-line horizontal first" }), /* @__PURE__ */ h("div", { class: "crop-grid-line horizontal second" }), /* @__PURE__ */ h("div", { class: "crop-grid-line vertical first" }), /* @__PURE__ */ h("div", { class: "crop-grid-line vertical second" })),
1191
+ /* @__PURE__ */ h(
1192
+ "div",
1193
+ {
1194
+ class: "crop-handle nw",
1195
+ onPointerdown: (e) => onCropBoxPointerDown(e, "nw")
1196
+ }
1197
+ ),
1198
+ /* @__PURE__ */ h(
1199
+ "div",
1200
+ {
1201
+ class: "crop-handle ne",
1202
+ onPointerdown: (e) => onCropBoxPointerDown(e, "ne")
1203
+ }
1204
+ ),
1205
+ /* @__PURE__ */ h(
1206
+ "div",
1207
+ {
1208
+ class: "crop-handle sw",
1209
+ onPointerdown: (e) => onCropBoxPointerDown(e, "sw")
1210
+ }
1211
+ ),
1212
+ /* @__PURE__ */ h(
1213
+ "div",
1214
+ {
1215
+ class: "crop-handle se",
1216
+ onPointerdown: (e) => onCropBoxPointerDown(e, "se")
1217
+ }
1218
+ ),
1219
+ /* @__PURE__ */ h(
1220
+ "div",
1221
+ {
1222
+ class: "crop-handle n",
1223
+ onPointerdown: (e) => onCropBoxPointerDown(e, "n")
1224
+ }
1225
+ ),
1226
+ /* @__PURE__ */ h(
1227
+ "div",
1228
+ {
1229
+ class: "crop-handle s",
1230
+ onPointerdown: (e) => onCropBoxPointerDown(e, "s")
1231
+ }
1232
+ ),
1233
+ /* @__PURE__ */ h(
1234
+ "div",
1235
+ {
1236
+ class: "crop-handle e",
1237
+ onPointerdown: (e) => onCropBoxPointerDown(e, "e")
1238
+ }
1239
+ ),
1240
+ /* @__PURE__ */ h(
1241
+ "div",
1242
+ {
1243
+ class: "crop-handle w",
1244
+ onPointerdown: (e) => onCropBoxPointerDown(e, "w")
1245
+ }
1246
+ )
1247
+ )
1248
+ ) : null,
1246
1249
  !isCropping.value ? /* @__PURE__ */ h(Fragment$2, null, /* @__PURE__ */ h(
1247
1250
  "div",
1248
1251
  {