function __variableDynamicImportRuntime0__(path) {
  switch (path) {
    case './locale/en.js':
      return Promise.resolve().then(function () { return en$1; });
    case './locale/fr.js':
      return Promise.resolve().then(function () { return fr$1; });
    case './locale/sv.js':
      return Promise.resolve().then(function () { return sv$1; });
    case './locale/tr.js':
      return Promise.resolve().then(function () { return tr$1; });
    case './locale/uk.js':
      return Promise.resolve().then(function () { return uk$1; });
    case './locale/zh-CN.js':
      return Promise.resolve().then(function () { return zhCN$1; });
    default:
      return new Promise(function (resolve, reject) {
        (typeof queueMicrotask === 'function' ? queueMicrotask : setTimeout)(reject.bind(null, new Error("Unknown variable dynamic import: " + path)));
      });
  }
}
/**
 * @file ext-polystar.js
 *
 *
 * @copyright 2010 CloudCanvas, Inc. All rights reserved
 * @copyright 2021 Optimistik SAS, Inc. All rights reserved
 * @license MIT
 *
 */
const name = 'polystar';
const loadExtensionTranslation = async function (svgEditor) {
  let translationModule;
  const lang = svgEditor.configObj.pref('lang');
  try {
    translationModule = await __variableDynamicImportRuntime0__(`./locale/${lang}.js`);
  } catch (_error) {
    console.warn(`Missing translation (${lang}) for ${name} - using 'en'`);
    translationModule = await Promise.resolve().then(function () { return en$1; });
  }
  svgEditor.i18next.addResourceBundle(lang, name, translationModule.default);
};
var extPolystar = {
  name,
  async init() {
    const svgEditor = this;
    const {
      svgCanvas
    } = svgEditor;
    const {
      ChangeElementCommand
    } = svgCanvas.history;
    const addToHistory = cmd => {
      svgCanvas.undoMgr.addCommandToHistory(cmd);
    };
    const {
      $id,
      $click
    } = svgCanvas;
    let selElems;
    let started;
    let newFO;
    await loadExtensionTranslation(svgEditor);
    /**
     * @param {boolean} on true=display
     * @param {string} tool "star" or "polygone"
     * @returns {void}
     */
    const showPanel = (on, tool) => {
      if (on) {
        $id(`${tool}_panel`).style.removeProperty('display');
      } else {
        $id(`${tool}_panel`).style.display = 'none';
      }
    };
    /**
     *
     * @param {string} attr attribute to change
     * @param {string|Float} val new value
     * @returns {void}
     */
    const setAttr = (attr, val) => {
      svgCanvas.changeSelectedAttribute(attr, val);
      svgCanvas.call('changed', selElems);
    };
    /**
     * @param {Float} n angle
     * @return {Float} cotangeante
     */
    const cot = n => 1 / Math.tan(n);
    /**
     * @param {Float} n angle
     * @returns {Float} sec
     */
    const sec = n => 1 / Math.cos(n);
    return {
      name: svgEditor.i18next.t(`${name}:name`),
      // The callback should be used to load the DOM with the appropriate UI items
      callback() {
        // Add the button and its handler(s)
        // Note: the star extension needs to be loaded before the polygon extension
        const fbtitle = `${name}:title`;
        const titleStar = `${name}:buttons.0.title`;
        const titlePolygon = `${name}:buttons.1.title`;
        const buttonTemplate = `
            
              
              
              
              
            
          `;
        svgCanvas.insertChildAtIndex($id('tools_left'), buttonTemplate, 10);
        // handler
        $click($id('tool_star'), () => {
          if (this.leftPanel.updateLeftPanel('tool_star')) {
            svgCanvas.setMode('star');
            showPanel(true, 'star');
            showPanel(false, 'polygon');
          }
        });
        $click($id('tool_polygon'), () => {
          if (this.leftPanel.updateLeftPanel('tool_polygon')) {
            svgCanvas.setMode('polygon');
            showPanel(true, 'polygon');
            showPanel(false, 'star');
          }
        });
        const label0 = `${name}:contextTools.0.label`;
        const title0 = `${name}:contextTools.0.title`;
        const label1 = `${name}:contextTools.1.label`;
        const title1 = `${name}:contextTools.1.title`;
        const label2 = `${name}:contextTools.2.label`;
        const title2 = `${name}:contextTools.2.title`;
        const label3 = `${name}:contextTools.3.label`;
        const title3 = `${name}:contextTools.3.title`;
        // Add the context panel and its handler(s)
        const panelTemplate = document.createElement('template');
        panelTemplate.innerHTML = `
          
            
            
            
            
            
            
          
          
            
            
          
        `;
        // add handlers for the panel
        $id('tools_top').appendChild(panelTemplate.content.cloneNode(true));
        // don't display the panels on start
        showPanel(false, 'star');
        showPanel(false, 'polygon');
        $id('starNumPoints').addEventListener('change', event => {
          setAttr('point', event.target.value);
          const point = event.target.value;
          let i = selElems.length;
          while (i--) {
            const elem = selElems[i];
            if (elem.hasAttribute('r')) {
              const oldPoint = elem.getAttribute('point');
              const oldPoints = elem.getAttribute('points');
              const radialshift = elem.getAttribute('radialshift');
              let xpos = 0;
              let ypos = 0;
              if (elem.points) {
                const list = elem.points;
                const len = list.numberOfItems;
                for (let i = 0; i < len; ++i) {
                  const pt = list.getItem(i);
                  xpos += parseFloat(pt.x);
                  ypos += parseFloat(pt.y);
                }
                const cx = xpos / len;
                const cy = ypos / len;
                const circumradius = Number(elem.getAttribute('r'));
                const inradius = circumradius / elem.getAttribute('starRadiusMultiplier');
                let polyPoints = '';
                for (let s = 0; point >= s; s++) {
                  let angle = 2.0 * Math.PI * (s / point);
                  {
                    angle -= Math.PI / 2;
                  }
                  let x = circumradius * Math.cos(angle) + cx;
                  let y = circumradius * Math.sin(angle) + cy;
                  polyPoints += x + ',' + y + ' ';
                  if (!isNaN(inradius)) {
                    angle = 2.0 * Math.PI * (s / point) + Math.PI / point;
                    {
                      angle -= Math.PI / 2;
                    }
                    angle += radialshift;
                    x = inradius * Math.cos(angle) + cx;
                    y = inradius * Math.sin(angle) + cy;
                    polyPoints += x + ',' + y + ' ';
                  }
                }
                elem.setAttribute('points', polyPoints);
                addToHistory(new ChangeElementCommand(elem, {
                  point: oldPoint,
                  points: oldPoints
                }));
              }
            }
          }
        });
        $id('RadiusMultiplier').addEventListener('change', event => {
          setAttr('starRadiusMultiplier', event.target.value);
        });
        $id('radialShift').addEventListener('change', event => {
          setAttr('radialshift', event.target.value);
        });
        $id('polySides').addEventListener('change', event => {
          setAttr('sides', event.target.value);
          const sides = event.target.value;
          let i = selElems.length;
          while (i--) {
            const elem = selElems[i];
            if (elem.hasAttribute('edge')) {
              const oldSides = elem.getAttribute('sides');
              const oldPoints = elem.getAttribute('points');
              let xpos = 0;
              let ypos = 0;
              if (elem.points) {
                const list = elem.points;
                const len = list.numberOfItems;
                for (let i = 0; i < len; ++i) {
                  const pt = list.getItem(i);
                  xpos += parseFloat(pt.x);
                  ypos += parseFloat(pt.y);
                }
                const cx = xpos / len;
                const cy = ypos / len;
                const edg = elem.getAttribute('edge');
                const inradius = edg / 2 * cot(Math.PI / sides);
                const circumradius = inradius * sec(Math.PI / sides);
                let points = '';
                for (let s = 0; sides >= s; s++) {
                  const angle = 2.0 * Math.PI * s / sides;
                  const x = circumradius * Math.cos(angle) + cx;
                  const y = circumradius * Math.sin(angle) + cy;
                  points += x + ',' + y + ' ';
                }
                elem.setAttribute('points', points);
                addToHistory(new ChangeElementCommand(elem, {
                  sides: oldSides,
                  points: oldPoints
                }));
              }
            }
          }
        });
      },
      mouseDown(opts) {
        if (svgCanvas.getMode() === 'star') {
          const fill = svgCanvas.getColor('fill');
          const stroke = svgCanvas.getColor('stroke');
          const strokeWidth = svgCanvas.getStrokeWidth();
          started = true;
          newFO = svgCanvas.addSVGElementsFromJson({
            element: 'polygon',
            attr: {
              cx: opts.start_x,
              cy: opts.start_y,
              id: svgCanvas.getNextId(),
              shape: 'star',
              point: $id('starNumPoints').value,
              r: 0,
              radialshift: $id('radialShift').value,
              r2: 0,
              orient: 'point',
              fill,
              stroke,
              'stroke-width': strokeWidth
            }
          });
          return {
            started: true
          };
        }
        if (svgCanvas.getMode() === 'polygon') {
          const fill = svgCanvas.getColor('fill');
          const stroke = svgCanvas.getColor('stroke');
          const strokeWidth = svgCanvas.getStrokeWidth();
          started = true;
          newFO = svgCanvas.addSVGElementsFromJson({
            element: 'polygon',
            attr: {
              cx: opts.start_x,
              cy: opts.start_y,
              id: svgCanvas.getNextId(),
              shape: 'regularPoly',
              sides: $id('polySides').value,
              orient: 'x',
              edge: 0,
              fill,
              stroke,
              'stroke-width': strokeWidth
            }
          });
          return {
            started: true
          };
        }
        return undefined;
      },
      mouseMove(opts) {
        if (!started) {
          return undefined;
        }
        if (svgCanvas.getMode() === 'star') {
          const cx = Number(newFO.getAttribute('cx'));
          const cy = Number(newFO.getAttribute('cy'));
          const point = Number(newFO.getAttribute('point'));
          const orient = newFO.getAttribute('orient');
          const fill = newFO.getAttribute('fill');
          const stroke = newFO.getAttribute('stroke');
          const strokeWidth = Number(newFO.getAttribute('stroke-width'));
          const radialshift = Number(newFO.getAttribute('radialshift'));
          let x = opts.mouse_x;
          let y = opts.mouse_y;
          const circumradius = Math.sqrt((x - cx) * (x - cx) + (y - cy) * (y - cy)) / 1.5;
          const RadiusMultiplier = document.getElementById('RadiusMultiplier').value;
          const inradius = circumradius / RadiusMultiplier;
          newFO.setAttribute('r', circumradius);
          newFO.setAttribute('r2', inradius);
          newFO.setAttribute('starRadiusMultiplier', RadiusMultiplier);
          let polyPoints = '';
          for (let s = 0; point >= s; s++) {
            let angle = 2.0 * Math.PI * (s / point);
            if (orient === 'point') {
              angle -= Math.PI / 2;
            } else if (orient === 'edge') {
              angle = angle + Math.PI / point - Math.PI / 2;
            }
            x = circumradius * Math.cos(angle) + cx;
            y = circumradius * Math.sin(angle) + cy;
            polyPoints += x + ',' + y + ' ';
            if (!isNaN(inradius)) {
              angle = 2.0 * Math.PI * (s / point) + Math.PI / point;
              if (orient === 'point') {
                angle -= Math.PI / 2;
              } else if (orient === 'edge') {
                angle = angle + Math.PI / point - Math.PI / 2;
              }
              angle += radialshift;
              x = inradius * Math.cos(angle) + cx;
              y = inradius * Math.sin(angle) + cy;
              polyPoints += x + ',' + y + ' ';
            }
          }
          newFO.setAttribute('points', polyPoints);
          newFO.setAttribute('fill', fill);
          newFO.setAttribute('stroke', stroke);
          newFO.setAttribute('stroke-width', strokeWidth);
          /* const shape = */
          newFO.getAttribute('shape');
          return {
            started: true
          };
        }
        if (svgCanvas.getMode() === 'polygon') {
          const cx = Number(newFO.getAttribute('cx'));
          const cy = Number(newFO.getAttribute('cy'));
          const sides = Number(newFO.getAttribute('sides'));
          // const orient = newFO.getAttribute('orient');
          const fill = newFO.getAttribute('fill');
          const stroke = newFO.getAttribute('stroke');
          const strokeWidth = Number(newFO.getAttribute('stroke-width'));
          let x = opts.mouse_x;
          let y = opts.mouse_y;
          const edg = Math.sqrt((x - cx) * (x - cx) + (y - cy) * (y - cy)) / 1.5;
          newFO.setAttribute('edge', edg);
          const inradius = edg / 2 * cot(Math.PI / sides);
          const circumradius = inradius * sec(Math.PI / sides);
          let points = '';
          for (let s = 0; sides >= s; s++) {
            const angle = 2.0 * Math.PI * s / sides;
            x = circumradius * Math.cos(angle) + cx;
            y = circumradius * Math.sin(angle) + cy;
            points += x + ',' + y + ' ';
          }
          // const poly = newFO.createElementNS(NS.SVG, 'polygon');
          newFO.setAttribute('points', points);
          newFO.setAttribute('fill', fill);
          newFO.setAttribute('stroke', stroke);
          newFO.setAttribute('stroke-width', strokeWidth);
          return {
            started: true
          };
        }
        return undefined;
      },
      mouseUp() {
        if (svgCanvas.getMode() === 'star') {
          const r = newFO.getAttribute('r');
          return {
            keep: r !== '0',
            element: newFO
          };
        }
        if (svgCanvas.getMode() === 'polygon') {
          const edge = newFO.getAttribute('edge');
          const keep = edge !== '0';
          // svgCanvas.addToSelection([newFO], true);
          return {
            keep,
            element: newFO
          };
        }
        return undefined;
      },
      selectedChanged(opts) {
        // Use this to update the current selected elements
        selElems = opts.elems;
        let i = selElems.length;
        // Hide panels if nothing is selected
        if (!i) {
          showPanel(false, 'star');
          showPanel(false, 'polygon');
          return;
        }
        while (i--) {
          const elem = selElems[i];
          if (elem?.getAttribute('shape') === 'star') {
            if (opts.selectedElement && !opts.multiselected) {
              $id('starNumPoints').value = elem.getAttribute('point');
              $id('radialShift').value = elem.getAttribute('radialshift');
              showPanel(true, 'star');
            } else {
              showPanel(false, 'star');
            }
          } else if (elem?.getAttribute('shape') === 'regularPoly') {
            if (opts.selectedElement && !opts.multiselected) {
              $id('polySides').value = elem.getAttribute('sides');
              showPanel(true, 'polygon');
            } else {
              showPanel(false, 'polygon');
            }
          } else {
            showPanel(false, 'star');
            showPanel(false, 'polygon');
          }
        }
      }
    };
  }
};
var en = {
  name: 'star',
  title: 'Polygone/Star Tool',
  buttons: [{
    title: 'Star Tool'
  }, {
    title: 'Polygon Tool'
  }],
  contextTools: [{
    title: 'Number of Sides',
    label: 'points'
  }, {
    title: 'Pointiness',
    label: 'Pointiness'
  }, {
    title: 'Twists the star',
    label: 'Radial Shift'
  }, {
    title: 'Number of Sides',
    label: 'sides'
  }]
};
var en$1 = /*#__PURE__*/Object.freeze({
  __proto__: null,
  default: en
});
var fr = {
  name: 'etoile',
  title: 'Outil Polygone/Etoile',
  buttons: [{
    title: 'Outil Etoile'
  }, {
    title: 'Outil Polygone'
  }],
  contextTools: [{
    title: 'Nombre de côtés',
    label: 'points'
  }, {
    title: 'Précision',
    label: 'Précision'
  }, {
    title: 'Torsion Etoile',
    label: 'Décalage Radial'
  }, {
    title: 'Nombre de côtés',
    label: 'côtés'
  }]
};
var fr$1 = /*#__PURE__*/Object.freeze({
  __proto__: null,
  default: fr
});
var sv = {
  name: 'stjärna',
  title: 'Polygon/stjärnverktyg',
  buttons: [{
    title: 'Stjärnverktyg'
  }, {
    title: 'Polygonverktyg'
  }],
  contextTools: [{
    title: 'Antal sidor',
    label: 'poäng'
  }, {
    title: 'Pointiness',
    label: 'Pointiness'
  }, {
    title: 'Vrider stjärnan',
    label: 'Radiell förskjutning'
  }, {
    title: 'Antal sidor',
    label: 'sidor'
  }]
};
var sv$1 = /*#__PURE__*/Object.freeze({
  __proto__: null,
  default: sv
});
var tr = {
  name: 'yıldız',
  title: 'Çokgen/Yıldız Aracı',
  buttons: [{
    title: 'Yıldız Aracı'
  }, {
    title: 'Çokgen Aracı'
  }],
  contextTools: [{
    title: 'Kenar Sayısı',
    label: 'noktalar'
  }, {
    title: 'Sivrilik',
    label: 'Sivrilik'
  }, {
    title: 'Yıldızı Kıvır',
    label: 'Döngüsel Kaydırma'
  }, {
    title: 'Kenar Sayısı',
    label: 'kenarlar'
  }]
};
var tr$1 = /*#__PURE__*/Object.freeze({
  __proto__: null,
  default: tr
});
var uk = {
  name: 'зірка',
  title: 'Полігон/Зірка',
  buttons: [{
    title: 'Зірка'
  }, {
    title: 'Полігон'
  }],
  contextTools: [{
    title: 'Кількість Сторін',
    label: 'точки'
  }, {
    title: 'Без точок',
    label: 'Без точок'
  }, {
    title: 'Закручення зірки',
    label: 'Радіальне Зміщення'
  }, {
    title: 'Кількість Сторін',
    label: 'сторони'
  }]
};
var uk$1 = /*#__PURE__*/Object.freeze({
  __proto__: null,
  default: uk
});
var zhCN = {
  name: '星形',
  title: 'Polygone/Star Tool',
  buttons: [{
    title: '星形工具'
  }, {
    title: '多边形工具'
  }],
  contextTools: [{
    title: '顶点',
    label: '顶点'
  }, {
    title: '钝度',
    label: '钝度'
  }, {
    title: '径向',
    label: '径向'
  }, {
    title: '边数',
    label: '边数'
  }]
};
var zhCN$1 = /*#__PURE__*/Object.freeze({
  __proto__: null,
  default: zhCN
});
export { extPolystar as default };
//# sourceMappingURL=ext-polystar.js.map