@asup/context-menu 1.1.1 → 1.1.2

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/cjs/main.js CHANGED
@@ -1,11 +1,11 @@
1
1
  require("./main.css");
2
- var $gTuX4$swchelperslib_sliced_to_arrayjs = require("@swc/helpers/lib/_sliced_to_array.js");
2
+ var $gTuX4$swchelperscjs_sliced_to_arraycjs = require("@swc/helpers/cjs/_sliced_to_array.cjs");
3
3
  var $gTuX4$reactjsxruntime = require("react/jsx-runtime");
4
4
  var $gTuX4$react = require("react");
5
5
  var $gTuX4$reactdom = require("react-dom");
6
- var $gTuX4$swchelperslib_object_spreadjs = require("@swc/helpers/lib/_object_spread.js");
7
- var $gTuX4$swchelperslib_object_spread_propsjs = require("@swc/helpers/lib/_object_spread_props.js");
8
- var $gTuX4$swchelperslib_to_consumable_arrayjs = require("@swc/helpers/lib/_to_consumable_array.js");
6
+ var $gTuX4$swchelperscjs_object_spreadcjs = require("@swc/helpers/cjs/_object_spread.cjs");
7
+ var $gTuX4$swchelperscjs_object_spread_propscjs = require("@swc/helpers/cjs/_object_spread_props.cjs");
8
+ var $gTuX4$swchelperscjs_to_consumable_arraycjs = require("@swc/helpers/cjs/_to_consumable_array.cjs");
9
9
 
10
10
  function $parcel$exportWildcard(dest, source) {
11
11
  Object.keys(source).forEach(function(key) {
@@ -46,7 +46,7 @@ $parcel$export($a68bd8a6c0fd98c2$exports, "ContextWindowStack", function () { re
46
46
 
47
47
  var $2275c4645c0c5e94$export$a9c522a6d7beb830 = function(param) {
48
48
  var entries = param.entries, target = param.target, toClose = param.toClose;
49
- var _useState = (0, ($parcel$interopDefault($gTuX4$swchelperslib_sliced_to_arrayjs)))((0, $gTuX4$react.useState)(false), 2), visible = _useState[0], setVisible = _useState[1];
49
+ var _useState = (0, $gTuX4$swchelperscjs_sliced_to_arraycjs._)((0, $gTuX4$react.useState)(false), 2), visible = _useState[0], setVisible = _useState[1];
50
50
  return /*#__PURE__*/ (0, $gTuX4$reactjsxruntime.jsxs)("span", {
51
51
  className: "caret-holder",
52
52
  onMouseEnter: function() {
@@ -127,10 +127,10 @@ var $3c568ee547c732c3$export$ed4f9641643dc7e4 = function(param) {
127
127
  // Menu resources
128
128
  var divRef = (0, $gTuX4$react.useRef)(null);
129
129
  var menuRef = (0, $gTuX4$react.useRef)(null);
130
- var _useState = (0, ($parcel$interopDefault($gTuX4$swchelperslib_sliced_to_arrayjs)))((0, $gTuX4$react.useState)(0), 2), menuXPos = _useState[0], setMenuXPos = _useState[1];
131
- var _useState1 = (0, ($parcel$interopDefault($gTuX4$swchelperslib_sliced_to_arrayjs)))((0, $gTuX4$react.useState)(0), 2), menuYPos = _useState1[0], setMenuYPos = _useState1[1];
132
- var _useState2 = (0, ($parcel$interopDefault($gTuX4$swchelperslib_sliced_to_arrayjs)))((0, $gTuX4$react.useState)(false), 2), menuVisible = _useState2[0], setMenuVisible = _useState2[1];
133
- var _useState3 = (0, ($parcel$interopDefault($gTuX4$swchelperslib_sliced_to_arrayjs)))((0, $gTuX4$react.useState)(null), 2), target = _useState3[0], setTarget = _useState3[1];
130
+ var _useState = (0, $gTuX4$swchelperscjs_sliced_to_arraycjs._)((0, $gTuX4$react.useState)(0), 2), menuXPos = _useState[0], setMenuXPos = _useState[1];
131
+ var _useState1 = (0, $gTuX4$swchelperscjs_sliced_to_arraycjs._)((0, $gTuX4$react.useState)(0), 2), menuYPos = _useState1[0], setMenuYPos = _useState1[1];
132
+ var _useState2 = (0, $gTuX4$swchelperscjs_sliced_to_arraycjs._)((0, $gTuX4$react.useState)(false), 2), menuVisible = _useState2[0], setMenuVisible = _useState2[1];
133
+ var _useState3 = (0, $gTuX4$swchelperscjs_sliced_to_arraycjs._)((0, $gTuX4$react.useState)(null), 2), target = _useState3[0], setTarget = _useState3[1];
134
134
  // Show menu when context is requested
135
135
  var showMenu = function(e) {
136
136
  var sel = window.getSelection();
@@ -211,7 +211,7 @@ var $16208d559c772441$var$pushToTop = function(windowId, minZIndex, windowList,
211
211
  zIndex: minZIndex + i
212
212
  };
213
213
  });
214
- setWindowList((0, ($parcel$interopDefault($gTuX4$swchelperslib_to_consumable_arrayjs)))(otherWindows).concat([
214
+ setWindowList((0, $gTuX4$swchelperscjs_to_consumable_arraycjs._)(otherWindows).concat([
215
215
  {
216
216
  windowId: windowId,
217
217
  zIndex: minZIndex + otherWindows.length
@@ -220,7 +220,7 @@ var $16208d559c772441$var$pushToTop = function(windowId, minZIndex, windowList,
220
220
  };
221
221
  var $16208d559c772441$export$9f37482ccd50dad2 = function(param) {
222
222
  var _param_minZIndex = param.minZIndex, minZIndex = _param_minZIndex === void 0 ? 1000 : _param_minZIndex, children = param.children;
223
- var _useState = (0, ($parcel$interopDefault($gTuX4$swchelperslib_sliced_to_arrayjs)))((0, $gTuX4$react.useState)([]), 2), currentWindows = _useState[0], setCurrentWindows = _useState[1];
223
+ var _useState = (0, $gTuX4$swchelperscjs_sliced_to_arraycjs._)((0, $gTuX4$react.useState)([]), 2), currentWindows = _useState[0], setCurrentWindows = _useState[1];
224
224
  return /*#__PURE__*/ (0, $gTuX4$reactjsxruntime.jsx)($16208d559c772441$export$aff5d0593e3727b0.Provider, {
225
225
  value: {
226
226
  currentWindows: currentWindows.map(function(w) {
@@ -266,7 +266,7 @@ var $46fb0088a1bbb6d8$export$1af8984c69ba1b24 = function(param) {
266
266
  var windowId = (0, $gTuX4$react.useRef)(null);
267
267
  var divRef = (0, $gTuX4$react.useRef)(null);
268
268
  var windowRef = (0, $gTuX4$react.useRef)(null);
269
- var _useState = (0, ($parcel$interopDefault($gTuX4$swchelperslib_sliced_to_arrayjs)))((0, $gTuX4$react.useState)(false), 2), windowVisible = _useState[0], setWindowVisible = _useState[1];
269
+ var _useState = (0, $gTuX4$swchelperscjs_sliced_to_arraycjs._)((0, $gTuX4$react.useState)(false), 2), windowVisible = _useState[0], setWindowVisible = _useState[1];
270
270
  var zIndex = (0, $gTuX4$react.useMemo)(function() {
271
271
  var _windowStack_currentWindows_find;
272
272
  var _windowStack_currentWindows_find_zIndex;
@@ -281,7 +281,7 @@ var $46fb0088a1bbb6d8$export$1af8984c69ba1b24 = function(param) {
281
281
  x: 0,
282
282
  y: 0
283
283
  });
284
- var _useState1 = (0, ($parcel$interopDefault($gTuX4$swchelperslib_sliced_to_arrayjs)))((0, $gTuX4$react.useState)(false), 2), moving = _useState1[0], setMoving = _useState1[1];
284
+ var _useState1 = (0, $gTuX4$swchelperscjs_sliced_to_arraycjs._)((0, $gTuX4$react.useState)(false), 2), moving = _useState1[0], setMoving = _useState1[1];
285
285
  var move = (0, $gTuX4$react.useCallback)(function(x, y) {
286
286
  if (windowRef.current && windowPos.current) {
287
287
  var window1 = windowRef.current;
@@ -325,7 +325,7 @@ var $46fb0088a1bbb6d8$export$1af8984c69ba1b24 = function(param) {
325
325
  var _Math;
326
326
  var maxWindowId = (_Math = Math).max.apply(_Math, [
327
327
  0
328
- ].concat((0, ($parcel$interopDefault($gTuX4$swchelperslib_to_consumable_arrayjs)))(windowStack.currentWindows.map(function(w) {
328
+ ].concat((0, $gTuX4$swchelperscjs_to_consumable_arraycjs._)(windowStack.currentWindows.map(function(w) {
329
329
  return w.windowId;
330
330
  }))));
331
331
  windowId.current = maxWindowId + 1;
@@ -361,7 +361,7 @@ var $46fb0088a1bbb6d8$export$1af8984c69ba1b24 = function(param) {
361
361
  children: windowStack && /*#__PURE__*/ (0, $gTuX4$reactdom.createPortal)(/*#__PURE__*/ (0, $gTuX4$reactjsxruntime.jsxs)("div", {
362
362
  id: id,
363
363
  className: "contextwindow",
364
- style: (0, ($parcel$interopDefault($gTuX4$swchelperslib_object_spread_propsjs)))((0, ($parcel$interopDefault($gTuX4$swchelperslib_object_spreadjs)))({}, style), {
364
+ style: (0, $gTuX4$swchelperscjs_object_spread_propscjs._)((0, $gTuX4$swchelperscjs_object_spreadcjs._)({}, style), {
365
365
  opacity: moving ? 0.8 : windowVisible ? 1 : 0,
366
366
  visibility: windowVisible ? "visible" : "hidden",
367
367
  zIndex: zIndex !== null && zIndex !== void 0 ? zIndex : 1,
@@ -1 +1 @@
1
- {"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AEAA;;;;ACAA;;ACAA;;;;AAUO,IAAM,4CAAU,gBAA6D;QAA1D,gBAAA,SAAS,eAAA,QAAQ,gBAAA;IACzC,IAA8B,kFAAA,CAAA,GAAA,qBAAO,EAAW,KAAK,OAA9C,UAAuB,cAAd,aAAc;IAE9B,qBACE,iCAAC;QACC,WAAU;QACV,cAAc,WAAM;YAClB,WAAW,IAAI;QACjB;QACA,cAAc,WAAM;YAClB,WAAW,KAAK;QAClB;;0BAEA,gCAAC;gBACC,OAAM;gBACN,OAAM;gBACN,QAAO;gBACP,MAAK;gBACL,SAAQ;0BAER,cAAA,gCAAC;oBAAK,GAAE;;;0BAEV,gCAAC;gBAAI,WAAU;0BACb,cAAA,gCAAC,CAAA,GAAA,yCAAW,AAAD;oBACT,SAAS;oBACT,SAAS;oBACT,QAAQ;oBACR,MAAM;oBACN,MAAM;oBACN,SAAS;;;;;AAKnB;;;AD/BO,IAAM,0DAAc,CAAA,GAAA,sCAAI,EAAE,UAAU,CACzC,gBAAoD,KAAqB;QAAtE,gBAAA,SAAS,gBAAA,SAAS,eAAA,QAAQ,aAAA,MAAM,aAAA,MAAM,gBAAA;IACvC,0CAAY,WAAW,GAAG;IAE1B,qBACE,gCAAC;QACC,KAAK;QACL,WAAW,AAAC,eAAwC,OAA1B,UAAU,aAAa,EAAE;QACnD,OAAO;YACL,KAAK,AAAC,GAAO,OAAL,MAAK;YACb,MAAM,AAAC,GAAO,OAAL,MAAK;QAChB;kBAEC,QAAQ,GAAG,CAAC,SAAC,GAAG;iCACf,iCAAC;gBAEC,WAAW,AAAC,oBAAiD,OAA9B,EAAE,QAAQ,GAAG,cAAc,EAAE;gBAC5D,SAAS,SAAC,IAAO;oBACf,GAAG,cAAc;oBACjB,GAAG,eAAe;oBAClB,EAAE,MAAM,IAAI,CAAC,EAAE,QAAQ,IAAI,EAAE,MAAM,CAAC;oBACpC,CAAC,EAAE,QAAQ,IAAI;gBACjB;;kCAEA,gCAAC;wBAAK,WAAU;kCAA2B,EAAE,KAAK;;oBACjD,EAAE,KAAK,kBACN,gCAAC,CAAA,GAAA,yCAAO,AAAD;wBACL,SAAS;wBACT,SAAS,EAAE,KAAK;wBAChB,QAAQ;;;eAdP;;;AAqBf;;;;AD3CK,IAAM,4CAAqB,gBAWf;QAVjB,iBAAA,UACA,kBAAA,gCACA,OAAA,kCAAQ;QACN,QAAQ;QACR,OAAO;IACT;IAMA,iBAAiB;IACjB,IAAM,SAAS,CAAA,GAAA,mBAAK,EAAyB,IAAI;IACjD,IAAM,UAAU,CAAA,GAAA,mBAAK,EAAyB,IAAI;IAClD,IAAgC,kFAAA,CAAA,GAAA,qBAAO,EAAU,QAA1C,WAAyB,cAAf,cAAe;IAChC,IAAgC,mFAAA,CAAA,GAAA,qBAAO,EAAU,QAA1C,WAAyB,eAAf,cAAe;IAChC,IAAsC,mFAAA,CAAA,GAAA,qBAAO,EAAW,KAAK,OAAtD,cAA+B,eAAlB,iBAAkB;IACtC,IAA4B,mFAAA,CAAA,GAAA,qBAAO,EAAgB,IAAI,OAAhD,SAAqB,eAAb,YAAa;IAE5B,sCAAsC;IACtC,IAAM,WAAW,SAAC,GAAkC;QAClD,IAAM,MAAM,OAAO,YAAY;QAC/B,UAAU,OAAO,IAAI,UAAU,GAAG,IAAI,IAAI,UAAU,CAAC,KAAK,IAAI;QAC9D,EAAE,cAAc;QAChB,EAAE,eAAe;QACjB,eAAe,IAAI;QACnB,YAAY,EAAE,KAAK;QACnB,YAAY,EAAE,KAAK;IACrB;IAEA,4BAA4B;IAC5B,IAAM,cAAc,CAAA,GAAA,wBAAW,AAAD,EAAE,SAAC,GAA6B;YAGxB;QAFpC,IACE,QAAQ,OAAO,IACd,CAAA,AAAC,EAAE,MAAM,YAAY,WAAW,EAAC,CAAA,mBAAA,QAAQ,OAAO,cAAf,8BAAA,KAAA,IAAA,iBAAiB,SAAS,EAAE,MAAM,MAClE,CAAE,CAAA,EAAE,MAAM,YAAY,OAAM,CAAC,GAE/B,eAAe,KAAK;IAExB,GAAG,EAAE;IAEL,oCAAoC;IACpC,CAAA,GAAA,sBAAS,AAAD,EAAE,WAAM;QACd,IAAI,aAAa,SAAS,gBAAgB,CAAC,aAAa;aACnD,SAAS,mBAAmB,CAAC,aAAa;QAC/C,OAAO,WAAM;YACX,SAAS,mBAAmB,CAAC,aAAa;QAC5C;IACF,GAAG;QAAC;QAAa;KAAY;IAE7B,qBACE;;0BACE,gCAAC;gBACC,eAAe;gBACf,WAAU;gBACV,OAAO;0BAEN;;YAEF,6BACC,CAAA,GAAA,4BAAY,AAAD,gBACT,gCAAC;gBACC,OAAO;oBAAE,UAAU;oBAAY,KAAK;oBAAG,MAAM;gBAAE;gBAC/C,KAAK;0BAEL,cAAA,gCAAC,CAAA,GAAA,yCAAW,AAAD;oBACT,SAAS,IAAI;oBACb,KAAK;oBACL,SAAS;oBACT,MAAM;oBACN,MAAM;oBACN,QAAQ;oBACR,SAAS;+BAAM,eAAe,KAAK;;;gBAGvC,SAAS,IAAI;;;AAIvB;;ADtFA;AIAA;;;;;;;;ACAA;;;;AAYO,IAAM,0DAA4B,CAAA,GAAA,0BAAY,EAAyC,IAAI;AAQlG,IAAM,kCAAY,SAChB,UACA,WACA,YACA,eACG;IACH,IAAM,eAAe,WAClB,MAAM,CAAC,SAAC;eAAM,EAAE,QAAQ,KAAK;OAC7B,GAAG,CAAC,SAAC,GAAG;eAAO;YAAE,UAAU,EAAE,QAAQ;YAAE,QAAQ,YAAY;QAAE;;IAChE,cAAc,AAAC,0EAAG,qBAAJ;QAAkB;YAAE,UAAA;YAAU,QAAQ,YAAY,aAAa,MAAM;QAAC;KAAE;AACxF;AAEO,IAAM,4CAAqB,gBAGU;iCAF1C,WAAA,0CAAY,yBACZ,iBAAA;IAEA,IAA4C,kFAAA,CAAA,GAAA,qBAAO,EAAyB,EAAE,OAAvE,iBAAqC,cAArB,oBAAqB;IAE5C,qBACE,gCAAC,0CAA0B,QAAQ;QACjC,OAAO;YACL,gBAAgB,eAAe,GAAG,CAAC,SAAC;uBAAO;oBACzC,UAAU,EAAE,QAAQ;oBACpB,QAAQ,YAAY,EAAE,MAAM;gBAC9B;;YACA,WAAW,SAAC;uBAAgB,gCAAU,KAAK,WAAW,gBAAgB;;QACxE;kBAEC;;AAGP;;;AC5CO,IAAM,4CAAc,SACzB,QAC+C;IAC/C,IAAI,CAAC,OAAO,OAAO,EACjB,OAAO;QAAE,YAAY;QAAG,YAAY;IAAE;SACjC;QACL,IAAM,cAAc;QACpB,IAAM,OAAO,OAAO,OAAO,CAAC,qBAAqB;QACjD,IAAI,aAAa;QACjB,IAAI,KAAK,IAAI,GAAG,aACd,aAAa,CAAC,KAAK,IAAI,GAAG;aACrB,IAAI,KAAK,KAAK,GAAG,OAAO,UAAU,EACvC,aAAa,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,GAAG,aAAa,OAAO,UAAU,GAAG,KAAK,KAAK,GAAG;QAEnF,IAAI,aAAa;QACjB,IAAI,KAAK,GAAG,GAAG,aACb,aAAa,CAAC,KAAK,GAAG,GAAG;aACpB,IAAI,KAAK,MAAM,GAAG,OAAO,WAAW,EACzC,aAAa,KAAK,GAAG,CACnB,CAAC,KAAK,GAAG,GAAG,aACZ,OAAO,WAAW,GAAG,KAAK,MAAM,GAAG;QAGvC,OAAO;YAAE,YAAA;YAAY,YAAA;QAAW;IAClC,CAAC;AACH;;;AFhBO,IAAM,4CAAgB,gBAQU;QAPrC,WAAA,IACA,gBAAA,SACA,cAAA,OACA,cAAA,OACA,iBAAA,UACA,eAAA,QACA,gBAAA;IAEA,IAAM,cAAc,CAAA,GAAA,uBAAS,EAAE,CAAA,GAAA,yCAAwB;IACvD,IAAM,WAAW,CAAA,GAAA,mBAAK,EAAiB,IAAI;IAC3C,IAAM,SAAS,CAAA,GAAA,mBAAK,EAAyB,IAAI;IACjD,IAAM,YAAY,CAAA,GAAA,mBAAK,EAAyB,IAAI;IACpD,IAA0C,kFAAA,CAAA,GAAA,qBAAO,EAAW,KAAK,OAA1D,gBAAmC,cAApB,mBAAoB;IAC1C,IAAM,SAAS,CAAA,GAAA,oBAAM,EAAE,WAAM;YACpB;YAAA;QAAP,OAAO,CAAA,0CAAA,CAAA,mCAAA,wBAAA,yBAAA,KAAA,IAAA,YAAa,cAAc,CAAC,IAAI,CAAC,SAAC;mBAAM,EAAE,QAAQ,KAAK,SAAS,OAAO;UAAC,cAAxE,8CAAA,KAAA,IAAA,iCAA0E,MAAM,cAAhF,qDAAA,0CAAoF,CAAC;IAC9F,GAAG;QAAC,wBAAA,yBAAA,KAAA,IAAA,YAAa,cAAc;KAAC;IAEhC,WAAW;IACX,IAAM,YAAY,CAAA,GAAA,mBAAK,EAA4B;QAAE,GAAG;QAAG,GAAG;IAAE;IAChE,IAA4B,mFAAA,CAAA,GAAA,qBAAO,EAAW,KAAK,OAA5C,SAAqB,eAAb,YAAa;IAE5B,IAAM,OAAO,CAAA,GAAA,wBAAW,AAAD,EAAE,SAAC,GAAW,GAAc;QACjD,IAAI,UAAU,OAAO,IAAI,UAAU,OAAO,EAAE;YAC1C,IAAM,UAAS,UAAU,OAAO;YAChC,IAAM,MAAM,UAAU,OAAO;YAC7B,IAAI,CAAC,IAAI;YACT,IAAI,CAAC,IAAI;YACT,QAAO,KAAK,CAAC,SAAS,GAAG,AAAC,aAAwB,OAAZ,IAAI,CAAC,EAAC,QAAY,OAAN,IAAI,CAAC,EAAC;QAC1D,CAAC;IACH,GAAG,EAAE;IAEL,IAAM,gBAAgB,CAAA,GAAA,wBAAU,EAAE,WAAM;QACtC,IAAM,SAAS,CAAA,GAAA,yCAAU,EAAE;QAC3B,KAAK,OAAO,UAAU,EAAE,OAAO,UAAU;IAC3C,GAAG;QAAC;KAAK;IAET,IAAM,YAAY,CAAA,GAAA,wBAAW,AAAD,EAC1B,SAAC,GAAkB;QACjB,EAAE,cAAc;QAChB,EAAE,eAAe;QACjB,KAAK,EAAE,SAAS,EAAE,EAAE,SAAS;IAC/B,GACA;QAAC;KAAK;IAGR,IAAM,UAAU,CAAA,GAAA,wBAAW,AAAD,EACxB,SAAC,GAAkB;QACjB,EAAE,cAAc;QAChB,EAAE,eAAe;QACjB,UAAU,KAAK;QACf;QACA,SAAS,mBAAmB,CAAC,aAAa;QAC1C,SAAS,mBAAmB,CAAC,WAAW;QACxC,OAAO,mBAAmB,CAAC,UAAU;QACrC,IAAI,EAAE,MAAM,IAAK,CAAA,EAAE,MAAM,YAAY,eAAe,EAAE,MAAM,YAAY,UAAS,GAC/E,EAAE,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG;IAChC,GACA;QAAC;QAAe;KAAU;IAG5B,oBAAoB;IACpB,CAAA,GAAA,sBAAS,AAAD,EAAE,WAAM;QACd,IAAI,aAAa;YACf,IAAI,WAAW,CAAC,eAAe;gBAC7B,IAAI,CAAC,SAAS,OAAO,EAAE;wBACD;oBAApB,IAAM,cAAc,CAAA,QAAA,MAAK,GAAG,CAAR,MAAA,OAAA;wBAAS;qBAAwD,CAAjE,OAAY,0EAAG,YAAY,cAAc,CAAC,GAAG,CAAC,SAAC;+BAAM,EAAE,QAAQ;;oBACnF,SAAS,OAAO,GAAG,cAAc;gBACnC,CAAC;gBACD,YAAY,SAAS,CAAC,SAAS,OAAO;gBACtC,iBAAiB;gBACjB,UAAU;gBACV,wBAAwB;gBACxB,IAAI,OAAO,OAAO,IAAI,UAAU,OAAO,EAAE;oBACvC,IAAM,YAAY,OAAO,OAAO,CAAC,qBAAqB;oBACtD,IAAM,MAAM,UAAU,OAAO,CAAC,qBAAqB;oBACnD,IAAM,eAAe,IAAI,MAAM,GAAG,IAAI,GAAG;oBACzC,UAAU,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,AAAC,GAAiB,OAAf,UAAU,IAAI,EAAC;oBACjD,UAAU,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,AAAC,GAI9B,OAHC,UAAU,MAAM,GAAG,eAAe,OAAO,WAAW,GAChD,UAAU,MAAM,GAChB,KAAK,GAAG,CAAC,GAAG,UAAU,GAAG,GAAG,aAAa,EAC9C;oBACD,UAAU,OAAO,CAAC,KAAK,CAAC,SAAS,GAAG;oBACpC,UAAU,OAAO,GAAG;wBAAE,GAAG;wBAAG,GAAG;oBAAE;gBACnC,CAAC;YACH,OAAO,IAAI,SAAS,OAAO,IAAI,CAAC,WAAW,eACzC,iBAAiB,KAAK;QAE1B,CAAC;IACH,GAAG;QAAC;QAAQ;QAAS;QAAa;KAAc;QAiBzB,kBACD,iBACC,kBACD;IAlBtB,qBACE,gCAAC;QACC,WAAU;QACV,KAAK;kBAEJ,6BACC,CAAA,GAAA,4BAAY,AAAD,gBACT,iCAAC;YACC,IAAI;YACJ,WAAU;YACV,OAAO,kJACF;gBACH,SAAS,SAAS,MAAM,gBAAgB,IAAI,CAAC;gBAC7C,YAAY,gBAAgB,YAAY,QAAQ;gBAChD,QAAQ,mBAAA,oBAAA,SAAU,CAAC;gBACnB,WAAW,CAAA,mBAAA,kBAAA,mBAAA,KAAA,IAAA,MAAO,SAAS,cAAhB,8BAAA,mBAAoB,OAAO;gBACtC,UAAU,CAAA,kBAAA,kBAAA,mBAAA,KAAA,IAAA,MAAO,QAAQ,cAAf,6BAAA,kBAAmB,OAAO;gBACpC,WAAW,CAAA,mBAAA,kBAAA,mBAAA,KAAA,IAAA,MAAO,SAAS,cAAhB,8BAAA,mBAAoB,QAAQ;gBACvC,UAAU,CAAA,kBAAA,kBAAA,mBAAA,KAAA,IAAA,MAAO,QAAQ,cAAf,6BAAA,kBAAmB,QAAQ;;YAEvC,gBAAgB,WAAM;gBACpB,YAAY,SAAS,OAAO,IAAI,YAAY,SAAS,CAAC,SAAS,OAAO;YACxE;YACA,KAAK;;8BAEL,iCAAC;oBACC,WAAW,AAAC,uBAA6C,OAAvB,SAAS,WAAW,EAAE;oBACxD,aAAa,SAAC,GAAwB;wBACpC,IAAI,EAAE,MAAM,IAAK,CAAA,EAAE,MAAM,YAAY,eAAe,EAAE,MAAM,YAAY,UAAS,GAC/E,EAAE,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG;wBAC9B,UAAU,IAAI;wBACd,YAAY,SAAS,OAAO,IAAI,YAAY,SAAS,CAAC,SAAS,OAAO;wBACtE,SAAS,gBAAgB,CAAC,WAAW;wBACrC,SAAS,gBAAgB,CAAC,aAAa;wBACvC,OAAO,gBAAgB,CAAC,UAAU;mCAAM;;oBAC1C;;sCAEA,gCAAC;4BAAK,WAAU;sCAA4B;;sCAC5C,gCAAC;4BAAK,WAAU;sCACd,cAAA,gCAAC;gCACC,OAAM;gCACN,OAAM;gCACN,QAAO;gCACP,MAAK;gCACL,SAAQ;gCACR,SAAS;gCACT,cAAW;0CAEX,cAAA,gCAAC;oCAAK,GAAE;;;;;;8BAId,gCAAC;oBAAI,WAAU;8BACb,cAAA,gCAAC;kCAAK;;;;YAGV,SAAS,IAAI;;AAIvB;;;;;ALxKA","sources":["src/main.ts","src/components/index.ts","src/components/ContextMenuHandler.tsx","src/components/ContextMenu.tsx","src/components/SubMenu.tsx","src/components/ContextWindow.tsx","src/components/ContextWindowStack.tsx","src/functions/chkPosition.ts"],"sourcesContent":["export * from './components';\n","import { ContextMenuHandler } from './ContextMenuHandler';\nimport { ContextWindow } from './ContextWindow';\nimport { ContextWindowStack } from './ContextWindowStack';\nimport { iMenuItem } from './interface';\n\nexport { ContextMenuHandler, ContextWindow, ContextWindowStack };\nexport type { iMenuItem };\n","import { MouseEvent, useCallback, useEffect, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { ContextMenu } from './ContextMenu';\nimport { iMenuItem } from './interface';\nimport './ContextMenu.css';\n\nexport const ContextMenuHandler = ({\n children,\n menuItems,\n style = {\n height: 'fit-content',\n width: 'fit-content',\n },\n}: {\n children: JSX.Element[] | JSX.Element;\n menuItems: iMenuItem[];\n style?: React.CSSProperties;\n}): JSX.Element => {\n // Menu resources\n const divRef = useRef<HTMLDivElement | null>(null);\n const menuRef = useRef<HTMLDivElement | null>(null);\n const [menuXPos, setMenuXPos] = useState<number>(0);\n const [menuYPos, setMenuYPos] = useState<number>(0);\n const [menuVisible, setMenuVisible] = useState<boolean>(false);\n const [target, setTarget] = useState<Range | null>(null);\n\n // Show menu when context is requested\n const showMenu = (e: MouseEvent<HTMLDivElement>) => {\n const sel = window.getSelection();\n setTarget(sel && sel.rangeCount > 0 ? sel.getRangeAt(0) : null);\n e.preventDefault();\n e.stopPropagation();\n setMenuVisible(true);\n setMenuXPos(e.pageX);\n setMenuYPos(e.pageY);\n };\n\n // Handle click off the menu\n const handleClick = useCallback((e: globalThis.MouseEvent) => {\n if (\n menuRef.current &&\n ((e.target instanceof Element && !menuRef.current?.contains(e.target)) ||\n !(e.target instanceof Element))\n ) {\n setMenuVisible(false);\n }\n }, []);\n\n // Update the document click handler\n useEffect(() => {\n if (menuVisible) document.addEventListener('mousedown', handleClick);\n else document.removeEventListener('mousedown', handleClick);\n return () => {\n document.removeEventListener('mousedown', handleClick);\n };\n }, [handleClick, menuVisible]);\n\n return (\n <>\n <div\n onContextMenu={showMenu}\n className='context-menu-handler'\n style={style}\n >\n {children}\n </div>\n {menuVisible &&\n createPortal(\n <div\n style={{ position: 'absolute', top: 0, left: 0 }}\n ref={divRef}\n >\n <ContextMenu\n visible={true}\n ref={menuRef}\n entries={menuItems}\n xPos={menuXPos}\n yPos={menuYPos}\n target={target}\n toClose={() => setMenuVisible(false)}\n />\n </div>,\n document.body,\n )}\n </>\n );\n};\n","import React from 'react';\nimport { iMenuItem } from './interface';\nimport { SubMenu } from './SubMenu';\n\nexport interface contextMenuProps {\n visible: boolean;\n entries: iMenuItem[];\n target: Range | null;\n xPos: number;\n yPos: number;\n toClose: () => void;\n}\n\nexport const ContextMenu = React.forwardRef<HTMLDivElement, contextMenuProps>(\n ({ visible, entries, target, xPos, yPos, toClose }, ref): JSX.Element => {\n ContextMenu.displayName = 'ContextMenu';\n\n return (\n <div\n ref={ref}\n className={`context-menu${visible ? ' visible' : ''}`}\n style={{\n top: `${yPos}px`,\n left: `${xPos}px`,\n }}\n >\n {entries.map((e, i) => (\n <div\n key={i}\n className={`context-menu-item${e.disabled ? ' disabled' : ''}`}\n onClick={(ev) => {\n ev.preventDefault();\n ev.stopPropagation();\n e.action && !e.disabled && e.action(target);\n !e.disabled && toClose();\n }}\n >\n <span className='context-menu-item-label'>{e.label}</span>\n {e.group && (\n <SubMenu\n toClose={toClose}\n entries={e.group}\n target={target}\n />\n )}\n </div>\n ))}\n </div>\n );\n },\n);\n","import { useState } from 'react';\nimport { ContextMenu } from './ContextMenu';\nimport { iMenuItem } from './interface';\n\nexport interface subMenuProps {\n entries: iMenuItem[];\n target: Range | null;\n toClose: () => void;\n}\n\nexport const SubMenu = ({ entries, target, toClose }: subMenuProps): JSX.Element => {\n const [visible, setVisible] = useState<boolean>(false);\n\n return (\n <span\n className='caret-holder'\n onMouseEnter={() => {\n setVisible(true);\n }}\n onMouseLeave={() => {\n setVisible(false);\n }}\n >\n <svg\n xmlns='http://www.w3.org/2000/svg'\n width='16'\n height='16'\n fill='currentColor'\n viewBox='0 0 16 16'\n >\n <path d='m12.14 8.753-5.482 4.796c-.646.566-1.658.106-1.658-.753V3.204a1 1 0 0 1 1.659-.753l5.48 4.796a1 1 0 0 1 0 1.506z' />\n </svg>\n <div className='sub-menu'>\n <ContextMenu\n visible={visible}\n entries={entries}\n target={target}\n xPos={14}\n yPos={-21}\n toClose={toClose}\n />\n </div>\n </span>\n );\n};\n","import React, { useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport './ContextWindow.css';\nimport { ContextWindowStackContext } from './ContextWindowStack';\nimport { chkPosition } from '../functions/chkPosition';\n\ninterface ContextWindowProps {\n id: string;\n visible: boolean;\n onOpen?: () => void;\n onClose?: () => void;\n title: string;\n style?: React.CSSProperties;\n children: JSX.Element[] | JSX.Element | string;\n}\n\nexport const ContextWindow = ({\n id,\n visible,\n title,\n style,\n children,\n onOpen,\n onClose,\n}: ContextWindowProps): JSX.Element => {\n const windowStack = useContext(ContextWindowStackContext);\n const windowId = useRef<number | null>(null);\n const divRef = useRef<HTMLDivElement | null>(null);\n const windowRef = useRef<HTMLDivElement | null>(null);\n const [windowVisible, setWindowVisible] = useState<boolean>(false);\n const zIndex = useMemo(() => {\n return windowStack?.currentWindows.find((w) => w.windowId === windowId.current)?.zIndex ?? 1;\n }, [windowStack?.currentWindows]);\n\n // Position\n const windowPos = useRef<{ x: number; y: number }>({ x: 0, y: 0 });\n const [moving, setMoving] = useState<boolean>(false);\n\n const move = useCallback((x: number, y: number) => {\n if (windowRef.current && windowPos.current) {\n const window = windowRef.current;\n const pos = windowPos.current;\n pos.x += x;\n pos.y += y;\n window.style.transform = `translate(${pos.x}px, ${pos.y}px)`;\n }\n }, []);\n\n const checkPosition = useCallback(() => {\n const chkPos = chkPosition(windowRef);\n move(chkPos.translateX, chkPos.translateY);\n }, [move]);\n\n const mouseMove = useCallback(\n (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n move(e.movementX, e.movementY);\n },\n [move],\n );\n\n const mouseUp = useCallback(\n (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setMoving(false);\n checkPosition();\n document.removeEventListener('mousemove', mouseMove);\n document.removeEventListener('mouseup', mouseUp);\n window.removeEventListener('resize', checkPosition);\n if (e.target && (e.target instanceof HTMLElement || e.target instanceof SVGElement))\n e.target.style.userSelect = 'auto';\n },\n [checkPosition, mouseMove],\n );\n\n // Update visibility\n useEffect(() => {\n if (windowStack) {\n if (visible && !windowVisible) {\n if (!windowId.current) {\n const maxWindowId = Math.max(0, ...windowStack.currentWindows.map((w) => w.windowId));\n windowId.current = maxWindowId + 1;\n }\n windowStack.pushToTop(windowId.current);\n setWindowVisible(visible);\n onOpen && onOpen();\n // Get starting position\n if (divRef.current && windowRef.current) {\n const parentPos = divRef.current.getBoundingClientRect();\n const pos = windowRef.current.getBoundingClientRect();\n const windowHeight = pos.bottom - pos.top;\n windowRef.current.style.left = `${parentPos.left}px`;\n windowRef.current.style.top = `${\n parentPos.bottom + windowHeight < window.innerHeight\n ? parentPos.bottom\n : Math.max(0, parentPos.top - windowHeight)\n }px`;\n windowRef.current.style.transform = '';\n windowPos.current = { x: 0, y: 0 };\n }\n } else if (windowId.current && !visible && windowVisible) {\n setWindowVisible(false);\n }\n }\n }, [onOpen, visible, windowStack, windowVisible]);\n\n return (\n <div\n className='contentwindow-anchor'\n ref={divRef}\n >\n {windowStack &&\n createPortal(\n <div\n id={id}\n className='contextwindow'\n style={{\n ...style,\n opacity: moving ? 0.8 : windowVisible ? 1 : 0,\n visibility: windowVisible ? 'visible' : 'hidden',\n zIndex: zIndex ?? 1,\n minHeight: style?.minHeight ?? '150px',\n minWidth: style?.minWidth ?? '200px',\n maxHeight: style?.maxHeight ?? '1000px',\n maxWidth: style?.maxWidth ?? '1000px',\n }}\n onClickCapture={() => {\n windowId && windowId.current && windowStack.pushToTop(windowId.current);\n }}\n ref={windowRef}\n >\n <div\n className={`contextwindow-title ${moving ? 'moving' : ''}`}\n onMouseDown={(e: React.MouseEvent) => {\n if (e.target && (e.target instanceof HTMLElement || e.target instanceof SVGElement))\n e.target.style.userSelect = 'none';\n setMoving(true);\n windowId && windowId.current && windowStack.pushToTop(windowId.current);\n document.addEventListener('mouseup', mouseUp);\n document.addEventListener('mousemove', mouseMove);\n window.addEventListener('resize', () => checkPosition());\n }}\n >\n <span className='contextwindow-title-text'>{title}</span>\n <span className='contextwindow-title-close'>\n <svg\n xmlns='http://www.w3.org/2000/svg'\n width='16'\n height='16'\n fill='currentColor'\n viewBox='0 0 16 16'\n onClick={onClose}\n aria-label='Close window'\n >\n <path d='M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708z' />\n </svg>\n </span>\n </div>\n <div className='contextwindow-body'>\n <div>{children}</div>\n </div>\n </div>,\n document.body,\n )}\n </div>\n );\n};\n","import { createContext, useState } from 'react';\n\nexport interface ContextWindowZIndex {\n windowId: number;\n zIndex: number;\n}\n\nexport interface ContextWindowStackContextProps {\n currentWindows: ContextWindowZIndex[];\n pushToTop: (ret: number) => void;\n}\n\nexport const ContextWindowStackContext = createContext<ContextWindowStackContextProps | null>(null);\n\ninterface ContextWindowStackProps {\n id?: string;\n minZIndex?: number;\n children?: JSX.Element[] | JSX.Element;\n}\n\nconst pushToTop = (\n windowId: number,\n minZIndex: number,\n windowList: ContextWindowZIndex[],\n setWindowList: (ret: ContextWindowZIndex[]) => void,\n) => {\n const otherWindows = windowList\n .filter((w) => w.windowId !== windowId)\n .map((w, i) => ({ windowId: w.windowId, zIndex: minZIndex + i }));\n setWindowList([...otherWindows, { windowId, zIndex: minZIndex + otherWindows.length }]);\n};\n\nexport const ContextWindowStack = ({\n minZIndex = 1000,\n children,\n}: ContextWindowStackProps): JSX.Element => {\n const [currentWindows, setCurrentWindows] = useState<ContextWindowZIndex[]>([]);\n\n return (\n <ContextWindowStackContext.Provider\n value={{\n currentWindows: currentWindows.map((w) => ({\n windowId: w.windowId,\n zIndex: minZIndex + w.zIndex,\n })),\n pushToTop: (ret: number) => pushToTop(ret, minZIndex, currentWindows, setCurrentWindows),\n }}\n >\n {children}\n </ContextWindowStackContext.Provider>\n );\n};\n","import { RefObject } from 'react';\n\n/**\n * Check that an existing div is inside the viewport\n * @param divRef Check div is inside view port, and return n\n * @returns \\{ translateX, translateY \\} Amount to move on X and Y axis\n */\nexport const chkPosition = (\n divRef: RefObject<HTMLDivElement>,\n): { translateX: number; translateY: number } => {\n if (!divRef.current) {\n return { translateX: 0, translateY: 0 };\n } else {\n const innerBounce = 16;\n const posn = divRef.current.getBoundingClientRect();\n let translateX = 0;\n if (posn.left < innerBounce) {\n translateX = -posn.left + innerBounce;\n } else if (posn.right > window.innerWidth) {\n translateX = Math.max(-posn.left + innerBounce, window.innerWidth - posn.right - innerBounce);\n }\n let translateY = 0;\n if (posn.top < innerBounce) {\n translateY = -posn.top + innerBounce;\n } else if (posn.bottom > window.innerHeight) {\n translateY = Math.max(\n -posn.top + innerBounce,\n window.innerHeight - posn.bottom - innerBounce,\n );\n }\n return { translateX, translateY };\n }\n};\n"],"names":[],"version":3,"file":"main.js.map"}
1
+ {"mappings":"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","sources":["src/main.ts","src/components/index.ts","src/components/ContextMenuHandler.tsx","src/components/ContextMenu.tsx","src/components/SubMenu.tsx","src/components/ContextWindow.tsx","src/components/ContextWindowStack.tsx","src/functions/chkPosition.ts"],"sourcesContent":["export * from './components';\n","import { ContextMenuHandler } from './ContextMenuHandler';\nimport { ContextWindow } from './ContextWindow';\nimport { ContextWindowStack } from './ContextWindowStack';\nimport { iMenuItem } from './interface';\n\nexport { ContextMenuHandler, ContextWindow, ContextWindowStack };\nexport type { iMenuItem };\n","import { MouseEvent, useCallback, useEffect, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { ContextMenu } from './ContextMenu';\nimport { iMenuItem } from './interface';\nimport './ContextMenu.css';\n\nexport const ContextMenuHandler = ({\n children,\n menuItems,\n style = {\n height: 'fit-content',\n width: 'fit-content',\n },\n}: {\n children: JSX.Element[] | JSX.Element;\n menuItems: iMenuItem[];\n style?: React.CSSProperties;\n}): JSX.Element => {\n // Menu resources\n const divRef = useRef<HTMLDivElement | null>(null);\n const menuRef = useRef<HTMLDivElement | null>(null);\n const [menuXPos, setMenuXPos] = useState<number>(0);\n const [menuYPos, setMenuYPos] = useState<number>(0);\n const [menuVisible, setMenuVisible] = useState<boolean>(false);\n const [target, setTarget] = useState<Range | null>(null);\n\n // Show menu when context is requested\n const showMenu = (e: MouseEvent<HTMLDivElement>) => {\n const sel = window.getSelection();\n setTarget(sel && sel.rangeCount > 0 ? sel.getRangeAt(0) : null);\n e.preventDefault();\n e.stopPropagation();\n setMenuVisible(true);\n setMenuXPos(e.pageX);\n setMenuYPos(e.pageY);\n };\n\n // Handle click off the menu\n const handleClick = useCallback((e: globalThis.MouseEvent) => {\n if (\n menuRef.current &&\n ((e.target instanceof Element && !menuRef.current?.contains(e.target)) ||\n !(e.target instanceof Element))\n ) {\n setMenuVisible(false);\n }\n }, []);\n\n // Update the document click handler\n useEffect(() => {\n if (menuVisible) document.addEventListener('mousedown', handleClick);\n else document.removeEventListener('mousedown', handleClick);\n return () => {\n document.removeEventListener('mousedown', handleClick);\n };\n }, [handleClick, menuVisible]);\n\n return (\n <>\n <div\n onContextMenu={showMenu}\n className='context-menu-handler'\n style={style}\n >\n {children}\n </div>\n {menuVisible &&\n createPortal(\n <div\n style={{ position: 'absolute', top: 0, left: 0 }}\n ref={divRef}\n >\n <ContextMenu\n visible={true}\n ref={menuRef}\n entries={menuItems}\n xPos={menuXPos}\n yPos={menuYPos}\n target={target}\n toClose={() => setMenuVisible(false)}\n />\n </div>,\n document.body,\n )}\n </>\n );\n};\n","import React from 'react';\nimport { iMenuItem } from './interface';\nimport { SubMenu } from './SubMenu';\n\nexport interface contextMenuProps {\n visible: boolean;\n entries: iMenuItem[];\n target: Range | null;\n xPos: number;\n yPos: number;\n toClose: () => void;\n}\n\nexport const ContextMenu = React.forwardRef<HTMLDivElement, contextMenuProps>(\n ({ visible, entries, target, xPos, yPos, toClose }, ref): JSX.Element => {\n ContextMenu.displayName = 'ContextMenu';\n\n return (\n <div\n ref={ref}\n className={`context-menu${visible ? ' visible' : ''}`}\n style={{\n top: `${yPos}px`,\n left: `${xPos}px`,\n }}\n >\n {entries.map((e, i) => (\n <div\n key={i}\n className={`context-menu-item${e.disabled ? ' disabled' : ''}`}\n onClick={(ev) => {\n ev.preventDefault();\n ev.stopPropagation();\n e.action && !e.disabled && e.action(target);\n !e.disabled && toClose();\n }}\n >\n <span className='context-menu-item-label'>{e.label}</span>\n {e.group && (\n <SubMenu\n toClose={toClose}\n entries={e.group}\n target={target}\n />\n )}\n </div>\n ))}\n </div>\n );\n },\n);\n","import { useState } from 'react';\nimport { ContextMenu } from './ContextMenu';\nimport { iMenuItem } from './interface';\n\nexport interface subMenuProps {\n entries: iMenuItem[];\n target: Range | null;\n toClose: () => void;\n}\n\nexport const SubMenu = ({ entries, target, toClose }: subMenuProps): JSX.Element => {\n const [visible, setVisible] = useState<boolean>(false);\n\n return (\n <span\n className='caret-holder'\n onMouseEnter={() => {\n setVisible(true);\n }}\n onMouseLeave={() => {\n setVisible(false);\n }}\n >\n <svg\n xmlns='http://www.w3.org/2000/svg'\n width='16'\n height='16'\n fill='currentColor'\n viewBox='0 0 16 16'\n >\n <path d='m12.14 8.753-5.482 4.796c-.646.566-1.658.106-1.658-.753V3.204a1 1 0 0 1 1.659-.753l5.48 4.796a1 1 0 0 1 0 1.506z' />\n </svg>\n <div className='sub-menu'>\n <ContextMenu\n visible={visible}\n entries={entries}\n target={target}\n xPos={14}\n yPos={-21}\n toClose={toClose}\n />\n </div>\n </span>\n );\n};\n","import React, { useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport './ContextWindow.css';\nimport { ContextWindowStackContext } from './ContextWindowStack';\nimport { chkPosition } from '../functions/chkPosition';\n\ninterface ContextWindowProps {\n id: string;\n visible: boolean;\n onOpen?: () => void;\n onClose?: () => void;\n title: string;\n style?: React.CSSProperties;\n children: JSX.Element[] | JSX.Element | string;\n}\n\nexport const ContextWindow = ({\n id,\n visible,\n title,\n style,\n children,\n onOpen,\n onClose,\n}: ContextWindowProps): JSX.Element => {\n const windowStack = useContext(ContextWindowStackContext);\n const windowId = useRef<number | null>(null);\n const divRef = useRef<HTMLDivElement | null>(null);\n const windowRef = useRef<HTMLDivElement | null>(null);\n const [windowVisible, setWindowVisible] = useState<boolean>(false);\n const zIndex = useMemo(() => {\n return windowStack?.currentWindows.find((w) => w.windowId === windowId.current)?.zIndex ?? 1;\n }, [windowStack?.currentWindows]);\n\n // Position\n const windowPos = useRef<{ x: number; y: number }>({ x: 0, y: 0 });\n const [moving, setMoving] = useState<boolean>(false);\n\n const move = useCallback((x: number, y: number) => {\n if (windowRef.current && windowPos.current) {\n const window = windowRef.current;\n const pos = windowPos.current;\n pos.x += x;\n pos.y += y;\n window.style.transform = `translate(${pos.x}px, ${pos.y}px)`;\n }\n }, []);\n\n const checkPosition = useCallback(() => {\n const chkPos = chkPosition(windowRef);\n move(chkPos.translateX, chkPos.translateY);\n }, [move]);\n\n const mouseMove = useCallback(\n (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n move(e.movementX, e.movementY);\n },\n [move],\n );\n\n const mouseUp = useCallback(\n (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setMoving(false);\n checkPosition();\n document.removeEventListener('mousemove', mouseMove);\n document.removeEventListener('mouseup', mouseUp);\n window.removeEventListener('resize', checkPosition);\n if (e.target && (e.target instanceof HTMLElement || e.target instanceof SVGElement))\n e.target.style.userSelect = 'auto';\n },\n [checkPosition, mouseMove],\n );\n\n // Update visibility\n useEffect(() => {\n if (windowStack) {\n if (visible && !windowVisible) {\n if (!windowId.current) {\n const maxWindowId = Math.max(0, ...windowStack.currentWindows.map((w) => w.windowId));\n windowId.current = maxWindowId + 1;\n }\n windowStack.pushToTop(windowId.current);\n setWindowVisible(visible);\n onOpen && onOpen();\n // Get starting position\n if (divRef.current && windowRef.current) {\n const parentPos = divRef.current.getBoundingClientRect();\n const pos = windowRef.current.getBoundingClientRect();\n const windowHeight = pos.bottom - pos.top;\n windowRef.current.style.left = `${parentPos.left}px`;\n windowRef.current.style.top = `${\n parentPos.bottom + windowHeight < window.innerHeight\n ? parentPos.bottom\n : Math.max(0, parentPos.top - windowHeight)\n }px`;\n windowRef.current.style.transform = '';\n windowPos.current = { x: 0, y: 0 };\n }\n } else if (windowId.current && !visible && windowVisible) {\n setWindowVisible(false);\n }\n }\n }, [onOpen, visible, windowStack, windowVisible]);\n\n return (\n <div\n className='contentwindow-anchor'\n ref={divRef}\n >\n {windowStack &&\n createPortal(\n <div\n id={id}\n className='contextwindow'\n style={{\n ...style,\n opacity: moving ? 0.8 : windowVisible ? 1 : 0,\n visibility: windowVisible ? 'visible' : 'hidden',\n zIndex: zIndex ?? 1,\n minHeight: style?.minHeight ?? '150px',\n minWidth: style?.minWidth ?? '200px',\n maxHeight: style?.maxHeight ?? '1000px',\n maxWidth: style?.maxWidth ?? '1000px',\n }}\n onClickCapture={() => {\n windowId && windowId.current && windowStack.pushToTop(windowId.current);\n }}\n ref={windowRef}\n >\n <div\n className={`contextwindow-title ${moving ? 'moving' : ''}`}\n onMouseDown={(e: React.MouseEvent) => {\n if (e.target && (e.target instanceof HTMLElement || e.target instanceof SVGElement))\n e.target.style.userSelect = 'none';\n setMoving(true);\n windowId && windowId.current && windowStack.pushToTop(windowId.current);\n document.addEventListener('mouseup', mouseUp);\n document.addEventListener('mousemove', mouseMove);\n window.addEventListener('resize', () => checkPosition());\n }}\n >\n <span className='contextwindow-title-text'>{title}</span>\n <span className='contextwindow-title-close'>\n <svg\n xmlns='http://www.w3.org/2000/svg'\n width='16'\n height='16'\n fill='currentColor'\n viewBox='0 0 16 16'\n onClick={onClose}\n aria-label='Close window'\n >\n <path d='M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708z' />\n </svg>\n </span>\n </div>\n <div className='contextwindow-body'>\n <div>{children}</div>\n </div>\n </div>,\n document.body,\n )}\n </div>\n );\n};\n","import { createContext, useState } from 'react';\n\nexport interface ContextWindowZIndex {\n windowId: number;\n zIndex: number;\n}\n\nexport interface ContextWindowStackContextProps {\n currentWindows: ContextWindowZIndex[];\n pushToTop: (ret: number) => void;\n}\n\nexport const ContextWindowStackContext = createContext<ContextWindowStackContextProps | null>(null);\n\ninterface ContextWindowStackProps {\n id?: string;\n minZIndex?: number;\n children?: JSX.Element[] | JSX.Element;\n}\n\nconst pushToTop = (\n windowId: number,\n minZIndex: number,\n windowList: ContextWindowZIndex[],\n setWindowList: (ret: ContextWindowZIndex[]) => void,\n) => {\n const otherWindows = windowList\n .filter((w) => w.windowId !== windowId)\n .map((w, i) => ({ windowId: w.windowId, zIndex: minZIndex + i }));\n setWindowList([...otherWindows, { windowId, zIndex: minZIndex + otherWindows.length }]);\n};\n\nexport const ContextWindowStack = ({\n minZIndex = 1000,\n children,\n}: ContextWindowStackProps): JSX.Element => {\n const [currentWindows, setCurrentWindows] = useState<ContextWindowZIndex[]>([]);\n\n return (\n <ContextWindowStackContext.Provider\n value={{\n currentWindows: currentWindows.map((w) => ({\n windowId: w.windowId,\n zIndex: minZIndex + w.zIndex,\n })),\n pushToTop: (ret: number) => pushToTop(ret, minZIndex, currentWindows, setCurrentWindows),\n }}\n >\n {children}\n </ContextWindowStackContext.Provider>\n );\n};\n","import { RefObject } from 'react';\n\n/**\n * Check that an existing div is inside the viewport\n * @param divRef Check div is inside view port, and return n\n * @returns \\{ translateX, translateY \\} Amount to move on X and Y axis\n */\nexport const chkPosition = (\n divRef: RefObject<HTMLDivElement>,\n): { translateX: number; translateY: number } => {\n if (!divRef.current) {\n return { translateX: 0, translateY: 0 };\n } else {\n const innerBounce = 16;\n const posn = divRef.current.getBoundingClientRect();\n let translateX = 0;\n if (posn.left < innerBounce) {\n translateX = -posn.left + innerBounce;\n } else if (posn.right > window.innerWidth) {\n translateX = Math.max(-posn.left + innerBounce, window.innerWidth - posn.right - innerBounce);\n }\n let translateY = 0;\n if (posn.top < innerBounce) {\n translateY = -posn.top + innerBounce;\n } else if (posn.bottom > window.innerHeight) {\n translateY = Math.max(\n -posn.top + innerBounce,\n window.innerHeight - posn.bottom - innerBounce,\n );\n }\n return { translateX, translateY };\n }\n};\n"],"names":[],"version":3,"file":"main.js.map"}
package/dist/main.js.map CHANGED
@@ -1 +1 @@
1
- {"mappings":"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","sources":["src/main.ts","src/components/index.ts","src/components/ContextMenuHandler.tsx","src/components/ContextMenu.tsx","src/components/SubMenu.tsx","src/components/ContextWindow.tsx","src/components/ContextWindowStack.tsx","src/functions/chkPosition.ts"],"sourcesContent":["export * from './components';\n","import { ContextMenuHandler } from './ContextMenuHandler';\nimport { ContextWindow } from './ContextWindow';\nimport { ContextWindowStack } from './ContextWindowStack';\nimport { iMenuItem } from './interface';\n\nexport { ContextMenuHandler, ContextWindow, ContextWindowStack };\nexport type { iMenuItem };\n","import { MouseEvent, useCallback, useEffect, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { ContextMenu } from './ContextMenu';\nimport { iMenuItem } from './interface';\nimport './ContextMenu.css';\n\nexport const ContextMenuHandler = ({\n children,\n menuItems,\n style = {\n height: 'fit-content',\n width: 'fit-content',\n },\n}: {\n children: JSX.Element[] | JSX.Element;\n menuItems: iMenuItem[];\n style?: React.CSSProperties;\n}): JSX.Element => {\n // Menu resources\n const divRef = useRef<HTMLDivElement | null>(null);\n const menuRef = useRef<HTMLDivElement | null>(null);\n const [menuXPos, setMenuXPos] = useState<number>(0);\n const [menuYPos, setMenuYPos] = useState<number>(0);\n const [menuVisible, setMenuVisible] = useState<boolean>(false);\n const [target, setTarget] = useState<Range | null>(null);\n\n // Show menu when context is requested\n const showMenu = (e: MouseEvent<HTMLDivElement>) => {\n const sel = window.getSelection();\n setTarget(sel && sel.rangeCount > 0 ? sel.getRangeAt(0) : null);\n e.preventDefault();\n e.stopPropagation();\n setMenuVisible(true);\n setMenuXPos(e.pageX);\n setMenuYPos(e.pageY);\n };\n\n // Handle click off the menu\n const handleClick = useCallback((e: globalThis.MouseEvent) => {\n if (\n menuRef.current &&\n ((e.target instanceof Element && !menuRef.current?.contains(e.target)) ||\n !(e.target instanceof Element))\n ) {\n setMenuVisible(false);\n }\n }, []);\n\n // Update the document click handler\n useEffect(() => {\n if (menuVisible) document.addEventListener('mousedown', handleClick);\n else document.removeEventListener('mousedown', handleClick);\n return () => {\n document.removeEventListener('mousedown', handleClick);\n };\n }, [handleClick, menuVisible]);\n\n return (\n <>\n <div\n onContextMenu={showMenu}\n className='context-menu-handler'\n style={style}\n >\n {children}\n </div>\n {menuVisible &&\n createPortal(\n <div\n style={{ position: 'absolute', top: 0, left: 0 }}\n ref={divRef}\n >\n <ContextMenu\n visible={true}\n ref={menuRef}\n entries={menuItems}\n xPos={menuXPos}\n yPos={menuYPos}\n target={target}\n toClose={() => setMenuVisible(false)}\n />\n </div>,\n document.body,\n )}\n </>\n );\n};\n","import React from 'react';\nimport { iMenuItem } from './interface';\nimport { SubMenu } from './SubMenu';\n\nexport interface contextMenuProps {\n visible: boolean;\n entries: iMenuItem[];\n target: Range | null;\n xPos: number;\n yPos: number;\n toClose: () => void;\n}\n\nexport const ContextMenu = React.forwardRef<HTMLDivElement, contextMenuProps>(\n ({ visible, entries, target, xPos, yPos, toClose }, ref): JSX.Element => {\n ContextMenu.displayName = 'ContextMenu';\n\n return (\n <div\n ref={ref}\n className={`context-menu${visible ? ' visible' : ''}`}\n style={{\n top: `${yPos}px`,\n left: `${xPos}px`,\n }}\n >\n {entries.map((e, i) => (\n <div\n key={i}\n className={`context-menu-item${e.disabled ? ' disabled' : ''}`}\n onClick={(ev) => {\n ev.preventDefault();\n ev.stopPropagation();\n e.action && !e.disabled && e.action(target);\n !e.disabled && toClose();\n }}\n >\n <span className='context-menu-item-label'>{e.label}</span>\n {e.group && (\n <SubMenu\n toClose={toClose}\n entries={e.group}\n target={target}\n />\n )}\n </div>\n ))}\n </div>\n );\n },\n);\n","import { useState } from 'react';\nimport { ContextMenu } from './ContextMenu';\nimport { iMenuItem } from './interface';\n\nexport interface subMenuProps {\n entries: iMenuItem[];\n target: Range | null;\n toClose: () => void;\n}\n\nexport const SubMenu = ({ entries, target, toClose }: subMenuProps): JSX.Element => {\n const [visible, setVisible] = useState<boolean>(false);\n\n return (\n <span\n className='caret-holder'\n onMouseEnter={() => {\n setVisible(true);\n }}\n onMouseLeave={() => {\n setVisible(false);\n }}\n >\n <svg\n xmlns='http://www.w3.org/2000/svg'\n width='16'\n height='16'\n fill='currentColor'\n viewBox='0 0 16 16'\n >\n <path d='m12.14 8.753-5.482 4.796c-.646.566-1.658.106-1.658-.753V3.204a1 1 0 0 1 1.659-.753l5.48 4.796a1 1 0 0 1 0 1.506z' />\n </svg>\n <div className='sub-menu'>\n <ContextMenu\n visible={visible}\n entries={entries}\n target={target}\n xPos={14}\n yPos={-21}\n toClose={toClose}\n />\n </div>\n </span>\n );\n};\n","import React, { useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport './ContextWindow.css';\nimport { ContextWindowStackContext } from './ContextWindowStack';\nimport { chkPosition } from '../functions/chkPosition';\n\ninterface ContextWindowProps {\n id: string;\n visible: boolean;\n onOpen?: () => void;\n onClose?: () => void;\n title: string;\n style?: React.CSSProperties;\n children: JSX.Element[] | JSX.Element | string;\n}\n\nexport const ContextWindow = ({\n id,\n visible,\n title,\n style,\n children,\n onOpen,\n onClose,\n}: ContextWindowProps): JSX.Element => {\n const windowStack = useContext(ContextWindowStackContext);\n const windowId = useRef<number | null>(null);\n const divRef = useRef<HTMLDivElement | null>(null);\n const windowRef = useRef<HTMLDivElement | null>(null);\n const [windowVisible, setWindowVisible] = useState<boolean>(false);\n const zIndex = useMemo(() => {\n return windowStack?.currentWindows.find((w) => w.windowId === windowId.current)?.zIndex ?? 1;\n }, [windowStack?.currentWindows]);\n\n // Position\n const windowPos = useRef<{ x: number; y: number }>({ x: 0, y: 0 });\n const [moving, setMoving] = useState<boolean>(false);\n\n const move = useCallback((x: number, y: number) => {\n if (windowRef.current && windowPos.current) {\n const window = windowRef.current;\n const pos = windowPos.current;\n pos.x += x;\n pos.y += y;\n window.style.transform = `translate(${pos.x}px, ${pos.y}px)`;\n }\n }, []);\n\n const checkPosition = useCallback(() => {\n const chkPos = chkPosition(windowRef);\n move(chkPos.translateX, chkPos.translateY);\n }, [move]);\n\n const mouseMove = useCallback(\n (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n move(e.movementX, e.movementY);\n },\n [move],\n );\n\n const mouseUp = useCallback(\n (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setMoving(false);\n checkPosition();\n document.removeEventListener('mousemove', mouseMove);\n document.removeEventListener('mouseup', mouseUp);\n window.removeEventListener('resize', checkPosition);\n if (e.target && (e.target instanceof HTMLElement || e.target instanceof SVGElement))\n e.target.style.userSelect = 'auto';\n },\n [checkPosition, mouseMove],\n );\n\n // Update visibility\n useEffect(() => {\n if (windowStack) {\n if (visible && !windowVisible) {\n if (!windowId.current) {\n const maxWindowId = Math.max(0, ...windowStack.currentWindows.map((w) => w.windowId));\n windowId.current = maxWindowId + 1;\n }\n windowStack.pushToTop(windowId.current);\n setWindowVisible(visible);\n onOpen && onOpen();\n // Get starting position\n if (divRef.current && windowRef.current) {\n const parentPos = divRef.current.getBoundingClientRect();\n const pos = windowRef.current.getBoundingClientRect();\n const windowHeight = pos.bottom - pos.top;\n windowRef.current.style.left = `${parentPos.left}px`;\n windowRef.current.style.top = `${\n parentPos.bottom + windowHeight < window.innerHeight\n ? parentPos.bottom\n : Math.max(0, parentPos.top - windowHeight)\n }px`;\n windowRef.current.style.transform = '';\n windowPos.current = { x: 0, y: 0 };\n }\n } else if (windowId.current && !visible && windowVisible) {\n setWindowVisible(false);\n }\n }\n }, [onOpen, visible, windowStack, windowVisible]);\n\n return (\n <div\n className='contentwindow-anchor'\n ref={divRef}\n >\n {windowStack &&\n createPortal(\n <div\n id={id}\n className='contextwindow'\n style={{\n ...style,\n opacity: moving ? 0.8 : windowVisible ? 1 : 0,\n visibility: windowVisible ? 'visible' : 'hidden',\n zIndex: zIndex ?? 1,\n minHeight: style?.minHeight ?? '150px',\n minWidth: style?.minWidth ?? '200px',\n maxHeight: style?.maxHeight ?? '1000px',\n maxWidth: style?.maxWidth ?? '1000px',\n }}\n onClickCapture={() => {\n windowId && windowId.current && windowStack.pushToTop(windowId.current);\n }}\n ref={windowRef}\n >\n <div\n className={`contextwindow-title ${moving ? 'moving' : ''}`}\n onMouseDown={(e: React.MouseEvent) => {\n if (e.target && (e.target instanceof HTMLElement || e.target instanceof SVGElement))\n e.target.style.userSelect = 'none';\n setMoving(true);\n windowId && windowId.current && windowStack.pushToTop(windowId.current);\n document.addEventListener('mouseup', mouseUp);\n document.addEventListener('mousemove', mouseMove);\n window.addEventListener('resize', () => checkPosition());\n }}\n >\n <span className='contextwindow-title-text'>{title}</span>\n <span className='contextwindow-title-close'>\n <svg\n xmlns='http://www.w3.org/2000/svg'\n width='16'\n height='16'\n fill='currentColor'\n viewBox='0 0 16 16'\n onClick={onClose}\n aria-label='Close window'\n >\n <path d='M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708z' />\n </svg>\n </span>\n </div>\n <div className='contextwindow-body'>\n <div>{children}</div>\n </div>\n </div>,\n document.body,\n )}\n </div>\n );\n};\n","import { createContext, useState } from 'react';\n\nexport interface ContextWindowZIndex {\n windowId: number;\n zIndex: number;\n}\n\nexport interface ContextWindowStackContextProps {\n currentWindows: ContextWindowZIndex[];\n pushToTop: (ret: number) => void;\n}\n\nexport const ContextWindowStackContext = createContext<ContextWindowStackContextProps | null>(null);\n\ninterface ContextWindowStackProps {\n id?: string;\n minZIndex?: number;\n children?: JSX.Element[] | JSX.Element;\n}\n\nconst pushToTop = (\n windowId: number,\n minZIndex: number,\n windowList: ContextWindowZIndex[],\n setWindowList: (ret: ContextWindowZIndex[]) => void,\n) => {\n const otherWindows = windowList\n .filter((w) => w.windowId !== windowId)\n .map((w, i) => ({ windowId: w.windowId, zIndex: minZIndex + i }));\n setWindowList([...otherWindows, { windowId, zIndex: minZIndex + otherWindows.length }]);\n};\n\nexport const ContextWindowStack = ({\n minZIndex = 1000,\n children,\n}: ContextWindowStackProps): JSX.Element => {\n const [currentWindows, setCurrentWindows] = useState<ContextWindowZIndex[]>([]);\n\n return (\n <ContextWindowStackContext.Provider\n value={{\n currentWindows: currentWindows.map((w) => ({\n windowId: w.windowId,\n zIndex: minZIndex + w.zIndex,\n })),\n pushToTop: (ret: number) => pushToTop(ret, minZIndex, currentWindows, setCurrentWindows),\n }}\n >\n {children}\n </ContextWindowStackContext.Provider>\n );\n};\n","import { RefObject } from 'react';\n\n/**\n * Check that an existing div is inside the viewport\n * @param divRef Check div is inside view port, and return n\n * @returns \\{ translateX, translateY \\} Amount to move on X and Y axis\n */\nexport const chkPosition = (\n divRef: RefObject<HTMLDivElement>,\n): { translateX: number; translateY: number } => {\n if (!divRef.current) {\n return { translateX: 0, translateY: 0 };\n } else {\n const innerBounce = 16;\n const posn = divRef.current.getBoundingClientRect();\n let translateX = 0;\n if (posn.left < innerBounce) {\n translateX = -posn.left + innerBounce;\n } else if (posn.right > window.innerWidth) {\n translateX = Math.max(-posn.left + innerBounce, window.innerWidth - posn.right - innerBounce);\n }\n let translateY = 0;\n if (posn.top < innerBounce) {\n translateY = -posn.top + innerBounce;\n } else if (posn.bottom > window.innerHeight) {\n translateY = Math.max(\n -posn.top + innerBounce,\n window.innerHeight - posn.bottom - innerBounce,\n );\n }\n return { translateX, translateY };\n }\n};\n"],"names":[],"version":3,"file":"main.js.map"}
1
+ {"mappings":"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","sources":["src/main.ts","src/components/index.ts","src/components/ContextMenuHandler.tsx","src/components/ContextMenu.tsx","src/components/SubMenu.tsx","src/components/ContextWindow.tsx","src/components/ContextWindowStack.tsx","src/functions/chkPosition.ts"],"sourcesContent":["export * from './components';\n","import { ContextMenuHandler } from './ContextMenuHandler';\nimport { ContextWindow } from './ContextWindow';\nimport { ContextWindowStack } from './ContextWindowStack';\nimport { iMenuItem } from './interface';\n\nexport { ContextMenuHandler, ContextWindow, ContextWindowStack };\nexport type { iMenuItem };\n","import { MouseEvent, useCallback, useEffect, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { ContextMenu } from './ContextMenu';\nimport { iMenuItem } from './interface';\nimport './ContextMenu.css';\n\nexport const ContextMenuHandler = ({\n children,\n menuItems,\n style = {\n height: 'fit-content',\n width: 'fit-content',\n },\n}: {\n children: JSX.Element[] | JSX.Element;\n menuItems: iMenuItem[];\n style?: React.CSSProperties;\n}): JSX.Element => {\n // Menu resources\n const divRef = useRef<HTMLDivElement | null>(null);\n const menuRef = useRef<HTMLDivElement | null>(null);\n const [menuXPos, setMenuXPos] = useState<number>(0);\n const [menuYPos, setMenuYPos] = useState<number>(0);\n const [menuVisible, setMenuVisible] = useState<boolean>(false);\n const [target, setTarget] = useState<Range | null>(null);\n\n // Show menu when context is requested\n const showMenu = (e: MouseEvent<HTMLDivElement>) => {\n const sel = window.getSelection();\n setTarget(sel && sel.rangeCount > 0 ? sel.getRangeAt(0) : null);\n e.preventDefault();\n e.stopPropagation();\n setMenuVisible(true);\n setMenuXPos(e.pageX);\n setMenuYPos(e.pageY);\n };\n\n // Handle click off the menu\n const handleClick = useCallback((e: globalThis.MouseEvent) => {\n if (\n menuRef.current &&\n ((e.target instanceof Element && !menuRef.current?.contains(e.target)) ||\n !(e.target instanceof Element))\n ) {\n setMenuVisible(false);\n }\n }, []);\n\n // Update the document click handler\n useEffect(() => {\n if (menuVisible) document.addEventListener('mousedown', handleClick);\n else document.removeEventListener('mousedown', handleClick);\n return () => {\n document.removeEventListener('mousedown', handleClick);\n };\n }, [handleClick, menuVisible]);\n\n return (\n <>\n <div\n onContextMenu={showMenu}\n className='context-menu-handler'\n style={style}\n >\n {children}\n </div>\n {menuVisible &&\n createPortal(\n <div\n style={{ position: 'absolute', top: 0, left: 0 }}\n ref={divRef}\n >\n <ContextMenu\n visible={true}\n ref={menuRef}\n entries={menuItems}\n xPos={menuXPos}\n yPos={menuYPos}\n target={target}\n toClose={() => setMenuVisible(false)}\n />\n </div>,\n document.body,\n )}\n </>\n );\n};\n","import React from 'react';\nimport { iMenuItem } from './interface';\nimport { SubMenu } from './SubMenu';\n\nexport interface contextMenuProps {\n visible: boolean;\n entries: iMenuItem[];\n target: Range | null;\n xPos: number;\n yPos: number;\n toClose: () => void;\n}\n\nexport const ContextMenu = React.forwardRef<HTMLDivElement, contextMenuProps>(\n ({ visible, entries, target, xPos, yPos, toClose }, ref): JSX.Element => {\n ContextMenu.displayName = 'ContextMenu';\n\n return (\n <div\n ref={ref}\n className={`context-menu${visible ? ' visible' : ''}`}\n style={{\n top: `${yPos}px`,\n left: `${xPos}px`,\n }}\n >\n {entries.map((e, i) => (\n <div\n key={i}\n className={`context-menu-item${e.disabled ? ' disabled' : ''}`}\n onClick={(ev) => {\n ev.preventDefault();\n ev.stopPropagation();\n e.action && !e.disabled && e.action(target);\n !e.disabled && toClose();\n }}\n >\n <span className='context-menu-item-label'>{e.label}</span>\n {e.group && (\n <SubMenu\n toClose={toClose}\n entries={e.group}\n target={target}\n />\n )}\n </div>\n ))}\n </div>\n );\n },\n);\n","import { useState } from 'react';\nimport { ContextMenu } from './ContextMenu';\nimport { iMenuItem } from './interface';\n\nexport interface subMenuProps {\n entries: iMenuItem[];\n target: Range | null;\n toClose: () => void;\n}\n\nexport const SubMenu = ({ entries, target, toClose }: subMenuProps): JSX.Element => {\n const [visible, setVisible] = useState<boolean>(false);\n\n return (\n <span\n className='caret-holder'\n onMouseEnter={() => {\n setVisible(true);\n }}\n onMouseLeave={() => {\n setVisible(false);\n }}\n >\n <svg\n xmlns='http://www.w3.org/2000/svg'\n width='16'\n height='16'\n fill='currentColor'\n viewBox='0 0 16 16'\n >\n <path d='m12.14 8.753-5.482 4.796c-.646.566-1.658.106-1.658-.753V3.204a1 1 0 0 1 1.659-.753l5.48 4.796a1 1 0 0 1 0 1.506z' />\n </svg>\n <div className='sub-menu'>\n <ContextMenu\n visible={visible}\n entries={entries}\n target={target}\n xPos={14}\n yPos={-21}\n toClose={toClose}\n />\n </div>\n </span>\n );\n};\n","import React, { useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport './ContextWindow.css';\nimport { ContextWindowStackContext } from './ContextWindowStack';\nimport { chkPosition } from '../functions/chkPosition';\n\ninterface ContextWindowProps {\n id: string;\n visible: boolean;\n onOpen?: () => void;\n onClose?: () => void;\n title: string;\n style?: React.CSSProperties;\n children: JSX.Element[] | JSX.Element | string;\n}\n\nexport const ContextWindow = ({\n id,\n visible,\n title,\n style,\n children,\n onOpen,\n onClose,\n}: ContextWindowProps): JSX.Element => {\n const windowStack = useContext(ContextWindowStackContext);\n const windowId = useRef<number | null>(null);\n const divRef = useRef<HTMLDivElement | null>(null);\n const windowRef = useRef<HTMLDivElement | null>(null);\n const [windowVisible, setWindowVisible] = useState<boolean>(false);\n const zIndex = useMemo(() => {\n return windowStack?.currentWindows.find((w) => w.windowId === windowId.current)?.zIndex ?? 1;\n }, [windowStack?.currentWindows]);\n\n // Position\n const windowPos = useRef<{ x: number; y: number }>({ x: 0, y: 0 });\n const [moving, setMoving] = useState<boolean>(false);\n\n const move = useCallback((x: number, y: number) => {\n if (windowRef.current && windowPos.current) {\n const window = windowRef.current;\n const pos = windowPos.current;\n pos.x += x;\n pos.y += y;\n window.style.transform = `translate(${pos.x}px, ${pos.y}px)`;\n }\n }, []);\n\n const checkPosition = useCallback(() => {\n const chkPos = chkPosition(windowRef);\n move(chkPos.translateX, chkPos.translateY);\n }, [move]);\n\n const mouseMove = useCallback(\n (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n move(e.movementX, e.movementY);\n },\n [move],\n );\n\n const mouseUp = useCallback(\n (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setMoving(false);\n checkPosition();\n document.removeEventListener('mousemove', mouseMove);\n document.removeEventListener('mouseup', mouseUp);\n window.removeEventListener('resize', checkPosition);\n if (e.target && (e.target instanceof HTMLElement || e.target instanceof SVGElement))\n e.target.style.userSelect = 'auto';\n },\n [checkPosition, mouseMove],\n );\n\n // Update visibility\n useEffect(() => {\n if (windowStack) {\n if (visible && !windowVisible) {\n if (!windowId.current) {\n const maxWindowId = Math.max(0, ...windowStack.currentWindows.map((w) => w.windowId));\n windowId.current = maxWindowId + 1;\n }\n windowStack.pushToTop(windowId.current);\n setWindowVisible(visible);\n onOpen && onOpen();\n // Get starting position\n if (divRef.current && windowRef.current) {\n const parentPos = divRef.current.getBoundingClientRect();\n const pos = windowRef.current.getBoundingClientRect();\n const windowHeight = pos.bottom - pos.top;\n windowRef.current.style.left = `${parentPos.left}px`;\n windowRef.current.style.top = `${\n parentPos.bottom + windowHeight < window.innerHeight\n ? parentPos.bottom\n : Math.max(0, parentPos.top - windowHeight)\n }px`;\n windowRef.current.style.transform = '';\n windowPos.current = { x: 0, y: 0 };\n }\n } else if (windowId.current && !visible && windowVisible) {\n setWindowVisible(false);\n }\n }\n }, [onOpen, visible, windowStack, windowVisible]);\n\n return (\n <div\n className='contentwindow-anchor'\n ref={divRef}\n >\n {windowStack &&\n createPortal(\n <div\n id={id}\n className='contextwindow'\n style={{\n ...style,\n opacity: moving ? 0.8 : windowVisible ? 1 : 0,\n visibility: windowVisible ? 'visible' : 'hidden',\n zIndex: zIndex ?? 1,\n minHeight: style?.minHeight ?? '150px',\n minWidth: style?.minWidth ?? '200px',\n maxHeight: style?.maxHeight ?? '1000px',\n maxWidth: style?.maxWidth ?? '1000px',\n }}\n onClickCapture={() => {\n windowId && windowId.current && windowStack.pushToTop(windowId.current);\n }}\n ref={windowRef}\n >\n <div\n className={`contextwindow-title ${moving ? 'moving' : ''}`}\n onMouseDown={(e: React.MouseEvent) => {\n if (e.target && (e.target instanceof HTMLElement || e.target instanceof SVGElement))\n e.target.style.userSelect = 'none';\n setMoving(true);\n windowId && windowId.current && windowStack.pushToTop(windowId.current);\n document.addEventListener('mouseup', mouseUp);\n document.addEventListener('mousemove', mouseMove);\n window.addEventListener('resize', () => checkPosition());\n }}\n >\n <span className='contextwindow-title-text'>{title}</span>\n <span className='contextwindow-title-close'>\n <svg\n xmlns='http://www.w3.org/2000/svg'\n width='16'\n height='16'\n fill='currentColor'\n viewBox='0 0 16 16'\n onClick={onClose}\n aria-label='Close window'\n >\n <path d='M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708z' />\n </svg>\n </span>\n </div>\n <div className='contextwindow-body'>\n <div>{children}</div>\n </div>\n </div>,\n document.body,\n )}\n </div>\n );\n};\n","import { createContext, useState } from 'react';\n\nexport interface ContextWindowZIndex {\n windowId: number;\n zIndex: number;\n}\n\nexport interface ContextWindowStackContextProps {\n currentWindows: ContextWindowZIndex[];\n pushToTop: (ret: number) => void;\n}\n\nexport const ContextWindowStackContext = createContext<ContextWindowStackContextProps | null>(null);\n\ninterface ContextWindowStackProps {\n id?: string;\n minZIndex?: number;\n children?: JSX.Element[] | JSX.Element;\n}\n\nconst pushToTop = (\n windowId: number,\n minZIndex: number,\n windowList: ContextWindowZIndex[],\n setWindowList: (ret: ContextWindowZIndex[]) => void,\n) => {\n const otherWindows = windowList\n .filter((w) => w.windowId !== windowId)\n .map((w, i) => ({ windowId: w.windowId, zIndex: minZIndex + i }));\n setWindowList([...otherWindows, { windowId, zIndex: minZIndex + otherWindows.length }]);\n};\n\nexport const ContextWindowStack = ({\n minZIndex = 1000,\n children,\n}: ContextWindowStackProps): JSX.Element => {\n const [currentWindows, setCurrentWindows] = useState<ContextWindowZIndex[]>([]);\n\n return (\n <ContextWindowStackContext.Provider\n value={{\n currentWindows: currentWindows.map((w) => ({\n windowId: w.windowId,\n zIndex: minZIndex + w.zIndex,\n })),\n pushToTop: (ret: number) => pushToTop(ret, minZIndex, currentWindows, setCurrentWindows),\n }}\n >\n {children}\n </ContextWindowStackContext.Provider>\n );\n};\n","import { RefObject } from 'react';\n\n/**\n * Check that an existing div is inside the viewport\n * @param divRef Check div is inside view port, and return n\n * @returns \\{ translateX, translateY \\} Amount to move on X and Y axis\n */\nexport const chkPosition = (\n divRef: RefObject<HTMLDivElement>,\n): { translateX: number; translateY: number } => {\n if (!divRef.current) {\n return { translateX: 0, translateY: 0 };\n } else {\n const innerBounce = 16;\n const posn = divRef.current.getBoundingClientRect();\n let translateX = 0;\n if (posn.left < innerBounce) {\n translateX = -posn.left + innerBounce;\n } else if (posn.right > window.innerWidth) {\n translateX = Math.max(-posn.left + innerBounce, window.innerWidth - posn.right - innerBounce);\n }\n let translateY = 0;\n if (posn.top < innerBounce) {\n translateY = -posn.top + innerBounce;\n } else if (posn.bottom > window.innerHeight) {\n translateY = Math.max(\n -posn.top + innerBounce,\n window.innerHeight - posn.bottom - innerBounce,\n );\n }\n return { translateX, translateY };\n }\n};\n"],"names":[],"version":3,"file":"main.js.map"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@asup/context-menu",
3
- "version": "1.1.1",
3
+ "version": "1.1.2",
4
4
  "description": "REACT Typescript Context menu component",
5
5
  "author": "Paul Thomas <@PaulDThomas>",
6
6
  "private": false,
@@ -19,11 +19,12 @@
19
19
  },
20
20
  "homepage": "https://github.com/PaulDThomas/context-menu#readme",
21
21
  "dependencies": {
22
- "@swc/helpers": "^0.4.14",
22
+ "@swc/helpers": "^0.5.1",
23
23
  "react": "^18.0.0",
24
24
  "react-dom": "^18.0.0"
25
25
  },
26
26
  "peerDependencies": {
27
+ "@swc/helpers": "^0.5.1",
27
28
  "react": "^18.0.0",
28
29
  "react-dom": "^18.0.0"
29
30
  },
@@ -34,7 +35,7 @@
34
35
  "@parcel/transformer-typescript-types": "^2.8.0",
35
36
  "@parcel/transformer-webmanifest": "^2.7.0",
36
37
  "@testing-library/jest-dom": "^5.16.5",
37
- "@testing-library/react": "^13.4.0",
38
+ "@testing-library/react": "^14.0.0",
38
39
  "@testing-library/user-event": "^14.4.3",
39
40
  "@types/jest": "^29.2.2",
40
41
  "@types/node": "^18.11.9",