{"version":3,"file":"editor.min.cjs","sources":["../../../../../node_modules/.pnpm/@rollup+plugin-typescript@11.1.6_rollup@4.34.6_tslib@2.8.1_typescript@5.7.3/node_modules/tslib/tslib.es6.js","../../../../../../src/in/packages/editor/src/event/EditorEvent.ts","../../../../../../src/in/packages/editor/src/event/EditorMoveEvent.ts","../../../../../../src/in/packages/editor/src/event/EditorScaleEvent.ts","../../../../../../src/in/packages/editor/src/event/EditorRotateEvent.ts","../../../../../../src/in/packages/editor/src/event/EditorSkewEvent.ts","../../../../../../src/in/packages/editor/src/decorator/data.ts","../../../../../../src/in/packages/editor/src/display/Stroker.ts","../../../../../../src/in/packages/editor/src/display/SelectArea.ts","../../../../../../src/in/packages/editor/src/helper/EditSelectHelper.ts","../../../../../../src/in/packages/editor/src/display/EditSelect.ts","../../../../../../src/in/packages/editor/src/helper/EditDataHelper.ts","../../../../../../src/in/packages/editor/src/editor/cursor.ts","../../../../../../src/in/packages/editor/src/display/EditPoint.ts","../../../../../../src/in/packages/editor/src/display/EditBox.ts","../../../../../../src/in/packages/editor/src/display/EditMask.ts","../../../../../../src/in/packages/editor/src/svg.ts","../../../../../../src/in/packages/editor/src/config.ts","../../../../../../src/in/packages/editor/src/editor/simulate.ts","../../../../../../src/in/packages/editor/src/helper/EditorHelper.ts","../../../../../../src/in/packages/editor/src/tool/EditToolCreator.ts","../../../../../../src/in/packages/editor/src/event/InnerEditorEvent.ts","../../../../../../src/in/packages/editor/src/event/EditorGroupEvent.ts","../../../../../../src/in/packages/editor/src/display/SimulateElement.ts","../../../../../../src/in/packages/editor/src/Editor.ts","../../../../../../src/in/packages/editor/src/editor/target.ts","../../../../../../src/in/packages/editor/src/tool/InnerEditor.ts","../../../../../../src/in/packages/editor/src/tool/EditTool.ts","../../../../../../src/in/packages/editor/src/tool/LineEditTool.ts","../../../../../../src/in/packages/editor/src/index.ts"],"sourcesContent":["/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\nvar extendStatics = function(d, b) {\r\n    extendStatics = Object.setPrototypeOf ||\r\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n        function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n    return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n    if (typeof b !== \"function\" && b !== null)\r\n        throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n    extendStatics(d, b);\r\n    function __() { this.constructor = d; }\r\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n    __assign = Object.assign || function __assign(t) {\r\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n            s = arguments[i];\r\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n        }\r\n        return t;\r\n    }\r\n    return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n    var t = {};\r\n    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n        t[p] = s[p];\r\n    if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n            if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n                t[p[i]] = s[p[i]];\r\n        }\r\n    return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n    return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n    function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n    var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n    var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n    var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n    var _, done = false;\r\n    for (var i = decorators.length - 1; i >= 0; i--) {\r\n        var context = {};\r\n        for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n        for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n        context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n        var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n        if (kind === \"accessor\") {\r\n            if (result === void 0) continue;\r\n            if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n            if (_ = accept(result.get)) descriptor.get = _;\r\n            if (_ = accept(result.set)) descriptor.set = _;\r\n            if (_ = accept(result.init)) initializers.unshift(_);\r\n        }\r\n        else if (_ = accept(result)) {\r\n            if (kind === \"field\") initializers.unshift(_);\r\n            else descriptor[key] = _;\r\n        }\r\n    }\r\n    if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n    done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n    var useValue = arguments.length > 2;\r\n    for (var i = 0; i < initializers.length; i++) {\r\n        value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n    }\r\n    return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n    return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n    if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n    return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n    return new (P || (P = Promise))(function (resolve, reject) {\r\n        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n        function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n    });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\r\n    return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n    function verb(n) { return function (v) { return step([n, v]); }; }\r\n    function step(op) {\r\n        if (f) throw new TypeError(\"Generator is already executing.\");\r\n        while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n            if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n            if (y = 0, t) op = [op[0] & 2, t.value];\r\n            switch (op[0]) {\r\n                case 0: case 1: t = op; break;\r\n                case 4: _.label++; return { value: op[1], done: false };\r\n                case 5: _.label++; y = op[1]; op = [0]; continue;\r\n                case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n                default:\r\n                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n                    if (t[2]) _.ops.pop();\r\n                    _.trys.pop(); continue;\r\n            }\r\n            op = body.call(thisArg, _);\r\n        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n    }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n    if (k2 === undefined) k2 = k;\r\n    var desc = Object.getOwnPropertyDescriptor(m, k);\r\n    if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n        desc = { enumerable: true, get: function() { return m[k]; } };\r\n    }\r\n    Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n    if (k2 === undefined) k2 = k;\r\n    o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n    for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n    var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n    if (m) return m.call(o);\r\n    if (o && typeof o.length === \"number\") return {\r\n        next: function () {\r\n            if (o && i >= o.length) o = void 0;\r\n            return { value: o && o[i++], done: !o };\r\n        }\r\n    };\r\n    throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n    var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n    if (!m) return o;\r\n    var i = m.call(o), r, ar = [], e;\r\n    try {\r\n        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n    }\r\n    catch (error) { e = { error: error }; }\r\n    finally {\r\n        try {\r\n            if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n        }\r\n        finally { if (e) throw e.error; }\r\n    }\r\n    return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n    for (var ar = [], i = 0; i < arguments.length; i++)\r\n        ar = ar.concat(__read(arguments[i]));\r\n    return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n    for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n    for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n        for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n            r[k] = a[j];\r\n    return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n    if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n        if (ar || !(i in from)) {\r\n            if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n            ar[i] = from[i];\r\n        }\r\n    }\r\n    return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n    return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n    return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n    function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n    function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\r\n    function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n    function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n    function fulfill(value) { resume(\"next\", value); }\r\n    function reject(value) { resume(\"throw\", value); }\r\n    function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n    var i, p;\r\n    return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n    function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var m = o[Symbol.asyncIterator], i;\r\n    return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n    function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n    function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n    if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n    return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n    Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n    o[\"default\"] = v;\r\n};\r\n\r\nvar ownKeys = function(o) {\r\n    ownKeys = Object.getOwnPropertyNames || function (o) {\r\n        var ar = [];\r\n        for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\r\n        return ar;\r\n    };\r\n    return ownKeys(o);\r\n};\r\n\r\nexport function __importStar(mod) {\r\n    if (mod && mod.__esModule) return mod;\r\n    var result = {};\r\n    if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\r\n    __setModuleDefault(result, mod);\r\n    return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n    return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n    if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n    if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n    return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n    if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n    if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n    if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n    return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n    if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n    return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n    if (value !== null && value !== void 0) {\r\n        if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n        var dispose, inner;\r\n        if (async) {\r\n            if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n            dispose = value[Symbol.asyncDispose];\r\n        }\r\n        if (dispose === void 0) {\r\n            if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n            dispose = value[Symbol.dispose];\r\n            if (async) inner = dispose;\r\n        }\r\n        if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n        if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\r\n        env.stack.push({ value: value, dispose: dispose, async: async });\r\n    }\r\n    else if (async) {\r\n        env.stack.push({ async: true });\r\n    }\r\n    return value;\r\n\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n    var e = new Error(message);\r\n    return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n    function fail(e) {\r\n        env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n        env.hasError = true;\r\n    }\r\n    var r, s = 0;\r\n    function next() {\r\n        while (r = env.stack.pop()) {\r\n            try {\r\n                if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\r\n                if (r.dispose) {\r\n                    var result = r.dispose.call(r.value);\r\n                    if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n                }\r\n                else s |= 1;\r\n            }\r\n            catch (e) {\r\n                fail(e);\r\n            }\r\n        }\r\n        if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\r\n        if (env.hasError) throw env.error;\r\n    }\r\n    return next();\r\n}\r\n\r\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\r\n    if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\r\n        return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\r\n            return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\r\n        });\r\n    }\r\n    return path;\r\n}\r\n\r\nexport default {\r\n    __extends: __extends,\r\n    __assign: __assign,\r\n    __rest: __rest,\r\n    __decorate: __decorate,\r\n    __param: __param,\r\n    __esDecorate: __esDecorate,\r\n    __runInitializers: __runInitializers,\r\n    __propKey: __propKey,\r\n    __setFunctionName: __setFunctionName,\r\n    __metadata: __metadata,\r\n    __awaiter: __awaiter,\r\n    __generator: __generator,\r\n    __createBinding: __createBinding,\r\n    __exportStar: __exportStar,\r\n    __values: __values,\r\n    __read: __read,\r\n    __spread: __spread,\r\n    __spreadArrays: __spreadArrays,\r\n    __spreadArray: __spreadArray,\r\n    __await: __await,\r\n    __asyncGenerator: __asyncGenerator,\r\n    __asyncDelegator: __asyncDelegator,\r\n    __asyncValues: __asyncValues,\r\n    __makeTemplateObject: __makeTemplateObject,\r\n    __importStar: __importStar,\r\n    __importDefault: __importDefault,\r\n    __classPrivateFieldGet: __classPrivateFieldGet,\r\n    __classPrivateFieldSet: __classPrivateFieldSet,\r\n    __classPrivateFieldIn: __classPrivateFieldIn,\r\n    __addDisposableResource: __addDisposableResource,\r\n    __disposeResources: __disposeResources,\r\n    __rewriteRelativeImportExtension: __rewriteRelativeImportExtension,\r\n};\r\n","import { IUI, IPointData } from '@leafer-ui/interface'\nimport { Event } from '@leafer-ui/draw'\n\nimport { IEditor, IEditorEvent } from '@leafer-in/interface'\n\n\nfunction toList(value: IUI | IUI[]): IUI[] {\n    return value ? (value instanceof Array ? value : [value]) : []\n}\n\nexport class EditorEvent extends Event implements IEditorEvent {\n\n    static BEFORE_SELECT = 'editor.before_select'\n    static SELECT = 'editor.select'\n\n    static BEFORE_HOVER = 'editor.before_hover'\n    static HOVER = 'editor.hover'\n\n    declare readonly target: IUI\n    readonly editor: IEditor\n\n    readonly value: IUI | IUI[]\n    readonly oldValue: IUI | IUI[]\n\n    get list() { return toList(this.value) }\n    get oldList() { return toList(this.oldValue) }\n\n    readonly worldOrigin: IPointData\n    declare readonly origin: IPointData\n\n    constructor(type: string, data?: IEditorEvent) {\n        super(type)\n        if (data) Object.assign(this, data)\n    }\n\n}","import { IEditorMoveEvent } from '@leafer-in/interface'\n\nimport { EditorEvent } from './EditorEvent'\n\n\nexport class EditorMoveEvent extends EditorEvent implements IEditorMoveEvent {\n\n    static BEFORE_MOVE = 'editor.before_move'\n    static MOVE = 'editor.move'\n\n    readonly moveX: number\n    readonly moveY: number\n\n    constructor(type: string, data?: IEditorMoveEvent) {\n        super(type, data)\n    }\n\n}","import { IAround, IDragEvent, IMatrixData } from '@leafer-ui/interface'\n\nimport { IEditorScaleEvent } from '@leafer-in/interface'\nimport { Direction9 } from '@leafer-ui/draw'\n\nimport { EditorEvent } from './EditorEvent'\n\n\nexport class EditorScaleEvent extends EditorEvent implements IEditorScaleEvent {\n\n    static BEFORE_SCALE = 'editor.before_scale'\n    static SCALE = 'editor.scale'\n\n    // scaleOf(origin, scaleX, scaleY, resize)\n    readonly scaleX: number\n    readonly scaleY: number\n    readonly transform?: IMatrixData\n\n    readonly drag: IDragEvent\n\n    readonly direction: Direction9\n    readonly lockRatio: boolean\n    readonly around: IAround\n\n    constructor(type: string, data?: IEditorScaleEvent) {\n        super(type, data)\n    }\n\n}","import { IEditorRotateEvent } from '@leafer-in/interface'\n\nimport { EditorEvent } from './EditorEvent'\n\n\nexport class EditorRotateEvent extends EditorEvent implements IEditorRotateEvent {\n\n    static BEFORE_ROTATE = 'editor.before_rotate'\n    static ROTATE = 'editor.rotate'\n\n    // rotateOf(origin, rotation)\n    readonly rotation: number\n\n    constructor(type: string, data?: IEditorRotateEvent) {\n        super(type, data)\n    }\n\n}","import { IEditorSkewEvent } from '@leafer-in/interface'\n\nimport { EditorEvent } from './EditorEvent'\n\n\nexport class EditorSkewEvent extends EditorEvent implements IEditorSkewEvent {\n\n    static BEFORE_SKEW = 'editor.before_skew'\n    static SKEW = 'editor.skew'\n\n    // skewOf(origin, skewX, skewY)\n    readonly skewX: number\n    readonly skewY: number\n\n    constructor(type: string, data?: IEditorSkewEvent) {\n        super(type, data)\n    }\n\n}","import { IFunction, ILeaf, IObject, IUI, } from '@leafer-ui/interface'\nimport { IEditor } from '@leafer-in/interface'\nimport { defineKey, isNull } from '@leafer-ui/draw'\n\nimport { EditorEvent } from '../event/EditorEvent'\n\n\nexport function targetAttr(fn: IFunction) {\n    return (target: ILeaf, key: string) => {\n        const privateKey = '_' + key\n        defineKey(target, key, {\n            get() { return (this as IObject)[privateKey] },\n            set(value: IUI | IUI[]) {\n                const old = (this as IObject)[privateKey]\n                if (old !== value) {\n\n                    if ((this as IEditor).config) { // Editor\n\n                        const isSelect = key === 'target'\n                        if (isSelect) {\n                            if (value instanceof Array && value.length > 1 && value[0].locked) value.splice(0, 1) // fix: 单个锁定 + shift多选\n\n                            const { beforeSelect } = (this as IEditor).config\n                            if (beforeSelect) {\n                                const check = beforeSelect({ target: value })\n                                if (typeof check === 'object') value = check\n                                else if (check === false) return\n                            }\n                        }\n\n                        const type = isSelect ? EditorEvent.BEFORE_SELECT : EditorEvent.BEFORE_HOVER\n                        if (this.hasEvent(type)) this.emitEvent(new EditorEvent(type, { editor: this as IEditor, value: value as IUI, oldValue: old }))\n                    }\n\n                    (this as IObject)[privateKey] = value, fn(this, old)\n                }\n            }\n        } as ThisType<ILeaf>)\n    }\n}\n\n\nexport function mergeConfigAttr() {\n    return (target: IEditor, key: string) => {\n        defineKey(target, key, {\n            get() {\n                const { config, element, dragPoint } = this, mergeConfig = { ...config } // 实时合并，后期可优化\n                if (element && element.editConfig) Object.assign(mergeConfig, element.editConfig)\n                if (dragPoint) {\n                    if (dragPoint.editConfig) Object.assign(mergeConfig, dragPoint.editConfig)\n                    if (mergeConfig.editSize === 'font-size') mergeConfig.lockRatio = true // 强制锁定比例\n                    if (dragPoint.pointType === 'resize-rotate') {\n                        mergeConfig.around || (mergeConfig.around = 'center')\n                        isNull(mergeConfig.lockRatio) && (mergeConfig.lockRatio = true)\n                    }\n                }\n                return (this as IObject).mergedConfig = mergeConfig\n            }\n        } as ThisType<IEditor>)\n    }\n}\n\n\n","import { IUI, ILeaferCanvas, IRenderOptions, IRectInputData, IMatrixWithOptionHalfData } from '@leafer-ui/interface'\nimport { Paint, UI, MatrixHelper, getBoundsData, getMatrixData, BoundsHelper, LeafBoundsHelper } from '@leafer-ui/draw'\n\nimport { IStroker } from '@leafer-in/interface'\n\nimport { targetAttr } from '../decorator/data'\n\n\nconst { abs } = Math\nconst { copy, scale } = MatrixHelper\nconst { setListWithFn } = BoundsHelper\nconst { worldBounds } = LeafBoundsHelper\nconst matrix = getMatrixData() as IMatrixWithOptionHalfData\nconst bounds = getBoundsData()\n\nexport class Stroker extends UI implements IStroker {\n\n    @targetAttr(onTarget)\n    public target: IUI | IUI[]\n\n    public list: IUI[] = []\n\n    constructor() {\n        super()\n        this.visible = 0\n        this.hittable = false\n        this.strokeAlign = 'center'\n    }\n\n    public setTarget(target: IUI | IUI[], style: IRectInputData): void {\n        this.set(style)\n        this.target = target\n        this.update()\n    }\n\n    public update(): void {\n        const { list } = this\n        if (list.length) {\n            setListWithFn(bounds, list, worldBounds)\n            this.set(bounds)\n            this.visible = true\n        } else this.visible = 0\n    }\n\n    public __draw(canvas: ILeaferCanvas, options: IRenderOptions): void {\n        const { list } = this\n\n        if (list.length) {\n\n            let leaf: IUI\n            const data = this.__, { stroke, strokeWidth, fill } = data, { bounds } = options\n\n            for (let i = 0; i < list.length; i++) {\n                leaf = list[i]\n                const { worldTransform, worldRenderBounds } = leaf\n\n                if (worldRenderBounds.width && worldRenderBounds.height && (!bounds || bounds.hit(worldRenderBounds, options.matrix))) {\n\n                    const aScaleX = abs(worldTransform.scaleX), aScaleY = abs(worldTransform.scaleY)\n\n                    copy(matrix, worldTransform)\n                    matrix.half = strokeWidth % 2\n\n                    if (aScaleX !== aScaleY) { // need no scale stroke, use rect path\n\n                        scale(matrix, 1 / aScaleX, 1 / aScaleY)\n                        canvas.setWorld(matrix, options.matrix)\n                        canvas.beginPath()\n                        data.strokeWidth = strokeWidth\n\n                        const { x, y, width, height } = leaf.__layout.boxBounds\n                        canvas.rect(x * aScaleX, y * aScaleY, width * aScaleX, height * aScaleY)\n\n                    } else {\n\n                        canvas.setWorld(matrix, options.matrix)\n                        canvas.beginPath()\n\n                        if (leaf.__.__useArrow) leaf.__drawPath(canvas)\n                        else leaf.__.__pathForRender ? leaf.__drawRenderPath(canvas) : leaf.__drawPathByBox(canvas)\n\n                        data.strokeWidth = strokeWidth / abs(worldTransform.scaleX)\n\n                    }\n\n                    if (stroke) typeof stroke === 'string' ? Paint.stroke(stroke, this, canvas) : Paint.strokes(stroke, this, canvas)\n                    if (fill) typeof fill === 'string' ? Paint.fill(fill, this, canvas) : Paint.fills(fill, this, canvas)\n                }\n            }\n\n            data.strokeWidth = strokeWidth\n        }\n    }\n\n    public destroy(): void {\n        this.target = null\n        super.destroy()\n    }\n\n}\n\nfunction onTarget(stroker: Stroker): void {\n    const value = stroker.target\n    stroker.list = value ? (value instanceof Array ? value : [value]) : []\n}\n","import { IBoundsData, IGroupInputData, IRect, IRectInputData } from '@leafer-ui/interface'\nimport { Group, Rect } from '@leafer-ui/draw'\n\nimport { ISelectArea } from '@leafer-in/interface'\n\n\nexport class SelectArea extends Group implements ISelectArea {\n\n    protected strokeArea: IRect = new Rect({ strokeAlign: 'center' })\n    protected fillArea: IRect = new Rect()\n\n    constructor(data?: IGroupInputData) {\n        super(data)\n        this.visible = 0\n        this.hittable = false\n        this.addMany(this.fillArea, this.strokeArea)\n    }\n\n    public setStyle(style: IRectInputData, userStyle?: IRectInputData): void {\n        const { visible, stroke, strokeWidth } = style\n        this.visible = visible\n        this.strokeArea.reset({ stroke, strokeWidth, ...(userStyle || {}) })\n        this.fillArea.reset({ visible: userStyle ? false : true, fill: stroke, opacity: 0.2 })\n    }\n\n    public setBounds(bounds: IBoundsData): void {\n        this.strokeArea.set(bounds)\n        this.fillArea.set(bounds)\n    }\n\n}","import { IBounds, ILeafList, IUI, IUIData } from '@leafer-ui/interface'\n\n\nexport const EditSelectHelper = {\n\n    findOne(path: ILeafList): IUI {\n        return path.list.find((leaf) => leaf.editable) as IUI\n    },\n\n    findByBounds(branch: IUI, bounds: IBounds): IUI[] {\n        const list: IUI[] = []\n        eachFind([branch], list, bounds)\n        return list\n    }\n\n}\n\n\nfunction eachFind(children: IUI[], list: IUI[], bounds: IBounds): void {\n    let child: IUI, data: IUIData\n    for (let i = 0, len = children.length; i < len; i++) {\n        child = children[i], data = child.__\n        if (data.hittable && data.visible && !data.locked && bounds.hit(child.__world)) {\n\n            if (data.editable) {\n                if (child.isBranch && !data.hitChildren) {\n                    if (data.hitSelf) list.push(child)\n                    continue\n                } else if (child.isFrame) {\n                    if (bounds.includes(child.__layout.boxBounds, child.__world)) {\n                        list.push(child)\n                        continue\n                    }\n                } else if (bounds.hit(child.__layout.boxBounds, child.__world) && data.hitSelf) list.push(child)\n            }\n\n            if (child.isBranch) eachFind(child.children, list, bounds)\n\n        }\n    }\n}","import { IBounds, ILeaf, ILeafList, IUI, IEventListenerId, IPointerEvent, IFunction } from '@leafer-ui/interface'\nimport { Bounds, LeafList, Group } from '@leafer-ui/draw'\nimport { PointerEvent, DragEvent, MoveEvent, ZoomEvent } from '@leafer-ui/core'\n\nimport { IEditSelect, IEditor, ISelectArea, IStroker } from '@leafer-in/interface'\n\nimport { Stroker } from './Stroker'\nimport { SelectArea } from './SelectArea'\nimport { EditSelectHelper } from '../helper/EditSelectHelper'\nimport { EditorEvent } from '../event/EditorEvent'\n\n\nconst { findOne, findByBounds } = EditSelectHelper\n\nexport class EditSelect extends Group implements IEditSelect {\n\n    public editor: IEditor\n\n    public get dragging(): boolean { return !!this.originList }\n    public get running(): boolean { const { editor } = this; return this.hittable && editor.visible && editor.hittable && editor.mergeConfig.selector }\n    public get isMoveMode(): boolean { return this.app && this.app.interaction.moveMode }\n\n    public hoverStroker: IStroker = new Stroker()\n    public targetStroker: IStroker = new Stroker()\n\n    public bounds: IBounds = new Bounds()\n    public selectArea: ISelectArea = new SelectArea()\n\n    protected originList: ILeafList\n    protected needRemoveItem: IUI\n\n    protected waitSelect: IFunction // 手机端延迟选中，防止多点触屏误选元素\n\n    protected __eventIds: IEventListenerId[] = []\n\n    constructor(editor: IEditor) {\n        super()\n        this.editor = editor\n        this.addMany(this.targetStroker, this.hoverStroker, this.selectArea)\n        this.__listenEvents()\n    }\n\n    // hover / select\n\n    protected onHover(): void {\n        const { editor } = this\n        if (this.running && !this.dragging && !editor.dragging) {\n            const { stroke, strokeWidth, hover, hoverStyle } = editor.mergeConfig\n            this.hoverStroker.setTarget(hover ? this.editor.hoverTarget : null, { stroke, strokeWidth, ...(hoverStyle || {}) })\n        } else {\n            this.hoverStroker.target = null\n        }\n    }\n\n    protected onSelect(): void {\n        if (this.running) {\n            const { mergeConfig, list } = this.editor\n            const { stroke, strokeWidth, selectedStyle } = mergeConfig\n            this.targetStroker.setTarget(list, { stroke, strokeWidth: Math.max(1, strokeWidth / 2), ...(selectedStyle || {}) })\n            this.hoverStroker.target = null\n        }\n    }\n\n    public update(): void {\n        this.hoverStroker.update()\n        this.targetStroker.update()\n    }\n\n    // move / down\n\n    protected onPointerMove(e: PointerEvent): void {\n        const { app, editor } = this\n        if (this.running && !this.isMoveMode && app.interaction.canHover && !app.interaction.dragging) {\n            const find = this.findUI(e)\n            editor.hoverTarget = editor.hasItem(find) ? null : find\n        } if (this.isMoveMode) {\n            editor.hoverTarget = null //  move.dragEmpty\n        }\n    }\n\n    protected onBeforeDown(e: PointerEvent): void {\n        if (e.multiTouch) return\n\n        const { select } = this.editor.mergeConfig\n        if (select === 'press') {\n            if (this.app.config.mobile) {\n                this.waitSelect = () => this.checkAndSelect(e)\n            } else {\n                this.checkAndSelect(e)\n            }\n        }\n    }\n\n    protected onTap(e: PointerEvent): void {\n        if (e.multiTouch) return\n\n        const { editor } = this\n        const { select } = editor.mergeConfig\n\n        if (select === 'tap') this.checkAndSelect(e)\n        else if (this.waitSelect) this.waitSelect()\n\n        if (this.needRemoveItem) {\n            editor.removeItem(this.needRemoveItem)\n        } else if (this.isMoveMode) {\n            editor.target = null  // move.dragEmpty\n        }\n\n    }\n\n    protected checkAndSelect(e: PointerEvent): void { // pointer.down or tap\n        this.needRemoveItem = null\n\n        if (this.allowSelect(e)) {\n            const { editor } = this\n            const find = this.findUI(e)\n\n            if (find) {\n                if (this.isMultipleSelect(e)) {\n                    if (editor.hasItem(find)) this.needRemoveItem = find // 等待tap事件再实际移除\n                    else editor.addItem(find)\n                } else {\n                    editor.target = find\n                }\n\n            } else if (this.allow(e.target)) {\n\n                if (!e.shiftKey) editor.target = null\n\n            }\n        }\n    }\n\n    // drag\n\n    protected onDragStart(e: DragEvent): void {\n        if (e.multiTouch) return\n        if (this.waitSelect) this.waitSelect()\n\n        if (this.allowDrag(e)) {\n            const { editor } = this\n            const { stroke, area } = editor.mergeConfig\n            const { x, y } = e.getInnerPoint(this)\n\n            this.bounds.set(x, y)\n\n            this.selectArea.setStyle({ visible: true, stroke, x, y }, area)\n            this.selectArea.setBounds(this.bounds.get())\n\n            this.originList = editor.leafList.clone()\n        }\n    }\n\n    protected onDrag(e: DragEvent): void {\n        if (e.multiTouch) return\n        if (this.editor.dragging) return this.onDragEnd(e)\n\n        if (this.dragging) {\n            const { editor } = this\n            const total = e.getInnerTotal(this)\n\n            const dragBounds = this.bounds.clone().unsign()\n            const list = new LeafList(findByBounds(editor.app, dragBounds))\n\n            this.bounds.width = total.x\n            this.bounds.height = total.y\n\n            this.selectArea.setBounds(dragBounds.get())\n\n            if (list.length) {\n\n                const selectList: ILeaf[] = []\n\n                this.originList.forEach(item => { if (!list.has(item)) selectList.push(item) })\n                list.forEach(item => { if (!this.originList.has(item)) selectList.push(item) })\n\n                if (selectList.length !== editor.list.length || editor.list.some((child, index) => child !== selectList[index])) {\n                    editor.target = selectList as IUI[]\n                }\n\n            } else {\n\n                editor.target = this.originList.list as IUI[]\n\n            }\n        }\n    }\n\n    protected onDragEnd(e: DragEvent): void {\n        if (e.multiTouch) return\n\n        if (this.dragging) this.originList = null, this.selectArea.visible = 0\n    }\n\n    protected onAutoMove(e: MoveEvent): void {\n        if (this.dragging) {\n            const { x, y } = e.getLocalMove(this)\n            this.bounds.x += x\n            this.bounds.y += y\n        }\n    }\n\n    // helper\n\n    protected allow(target: ILeaf): boolean {\n        return target.leafer !== this.editor.leafer\n    }\n\n    protected allowDrag(e: DragEvent) {\n        const { boxSelect, multipleSelect } = this.editor.mergeConfig\n        if (this.running && (multipleSelect && boxSelect) && !e.target.draggable) {\n            return (!this.editor.editing && this.allow(e.target)) || (e.shiftKey && !findOne(e.path))\n        } else {\n            return false\n        }\n    }\n\n    protected allowSelect(e: IPointerEvent): boolean {\n        return this.running && !this.isMoveMode && !e.middle\n    }\n\n    public findDeepOne(e: PointerEvent): IUI {\n        const options = { exclude: new LeafList(this.editor.editBox.rect) }\n        return findOne(e.target.leafer.interaction.findPath(e, options)) as IUI\n    }\n\n    public findUI(e: PointerEvent): IUI {\n        return this.isMultipleSelect(e) ? this.findDeepOne(e) : findOne(e.path)\n    }\n\n    public isMultipleSelect(e: IPointerEvent): boolean {\n        const { multipleSelect, continuousSelect } = this.editor.mergeConfig\n        return multipleSelect && (e.shiftKey || continuousSelect)\n    }\n\n    protected __listenEvents(): void {\n        const { editor } = this\n        editor.waitLeafer(() => {\n\n            const { app } = editor\n            app.selector.proxy = editor\n\n            this.__eventIds = [\n                editor.on_(EditorEvent.HOVER, this.onHover, this),\n                editor.on_(EditorEvent.SELECT, this.onSelect, this),\n\n                app.on_(PointerEvent.MOVE, this.onPointerMove, this),\n                app.on_(PointerEvent.BEFORE_DOWN, this.onBeforeDown, this),\n                app.on_(PointerEvent.TAP, this.onTap, this),\n\n                app.on_(DragEvent.START, this.onDragStart, this, true), // 采用捕获事件，需要比EditBox中的dragStart早触发\n                app.on_(DragEvent.DRAG, this.onDrag, this),\n                app.on_(DragEvent.END, this.onDragEnd, this),\n\n                app.on_(MoveEvent.MOVE, this.onAutoMove, this),\n                app.on_([ZoomEvent.ZOOM, MoveEvent.MOVE], () => { this.editor.hoverTarget = null }),\n            ]\n\n        })\n    }\n\n    protected __removeListenEvents(): void {\n        if (this.__eventIds) {\n            this.off_(this.__eventIds)\n            this.__eventIds.length = 0\n        }\n    }\n\n    public destroy(): void {\n        this.editor = this.originList = this.needRemoveItem = null\n        this.__removeListenEvents()\n        super.destroy()\n    }\n}","import { IBoundsData, IPointData, IAround, IAlign, IUI, ILayoutBoundsData } from '@leafer-ui/interface'\nimport { AroundHelper, MathHelper, PointHelper, BoundsHelper, Bounds, Direction9 } from '@leafer-ui/draw'\n\nimport { IEditorScaleEvent, IEditorSkewEvent, IEditorRotateEvent } from '@leafer-in/interface'\n\n\nconst { topLeft, top, topRight, right, bottomRight, bottom, bottomLeft, left } = Direction9\nconst { toPoint } = AroundHelper\nconst { within } = MathHelper\n\nexport const EditDataHelper = {\n\n    getScaleData(element: IUI, startBounds: ILayoutBoundsData, direction: Direction9, totalMove: IPointData, lockRatio: boolean | 'corner', around: IAround, flipable: boolean, scaleMode: boolean): IEditorScaleEvent {\n        let align: IAlign, origin = {} as IPointData, scaleX: number = 1, scaleY: number = 1\n\n        const { boxBounds, widthRange, heightRange, dragBounds, worldBoxBounds } = element\n        const { width, height } = startBounds\n\n        if (around) {\n            totalMove.x *= 2\n            totalMove.y *= 2\n        }\n\n\n        // 获取已经改变的比例\n        const originChangedScaleX = element.scaleX / startBounds.scaleX\n        const originChangedScaleY = element.scaleY / startBounds.scaleY\n        const signX = originChangedScaleX < 0 ? -1 : 1\n        const signY = originChangedScaleY < 0 ? -1 : 1\n\n        const changedScaleX = scaleMode ? originChangedScaleX : signX * boxBounds.width / width\n        const changedScaleY = scaleMode ? originChangedScaleY : signY * boxBounds.height / height\n\n        totalMove.x *= scaleMode ? originChangedScaleX : signX\n        totalMove.y *= scaleMode ? originChangedScaleY : signY\n\n        const topScale = (-totalMove.y + height) / height\n        const rightScale = (totalMove.x + width) / width\n        const bottomScale = (totalMove.y + height) / height\n        const leftScale = (-totalMove.x + width) / width\n\n        switch (direction) {\n            case top:\n                scaleY = topScale\n                align = 'bottom'\n                break\n            case right:\n                scaleX = rightScale\n                align = 'left'\n                break\n            case bottom:\n                scaleY = bottomScale\n                align = 'top'\n                break\n            case left:\n                scaleX = leftScale\n                align = 'right'\n                break\n            case topLeft:\n                scaleY = topScale\n                scaleX = leftScale\n                align = 'bottom-right'\n                break\n            case topRight:\n                scaleY = topScale\n                scaleX = rightScale\n                align = 'bottom-left'\n                break\n            case bottomRight:\n                scaleY = bottomScale\n                scaleX = rightScale\n                align = 'top-left'\n                break\n            case bottomLeft:\n                scaleY = bottomScale\n                scaleX = leftScale\n                align = 'top-right'\n        }\n\n        if (lockRatio) {\n            if (lockRatio === 'corner' && direction % 2) {\n                lockRatio = false\n            } else {\n                let scale: number\n                switch (direction) {\n                    case top:\n                    case bottom:\n                        scale = scaleY\n                        break\n                    case left:\n                    case right:\n                        scale = scaleX\n                        break\n                    default:\n                        scale = Math.sqrt(Math.abs(scaleX * scaleY))\n                }\n                scaleX = scaleX < 0 ? -scale : scale\n                scaleY = scaleY < 0 ? -scale : scale\n            }\n        }\n\n        const useScaleX = scaleX !== 1, useScaleY = scaleY !== 1\n\n        if (useScaleX) scaleX /= changedScaleX\n        if (useScaleY) scaleY /= changedScaleY\n\n        if (!flipable) {\n            const { worldTransform } = element\n            if (scaleX < 0) scaleX = 1 / boxBounds.width / worldTransform.scaleX\n            if (scaleY < 0) scaleY = 1 / boxBounds.height / worldTransform.scaleY\n        }\n\n        // 检查限制\n\n        toPoint(around || align, boxBounds, origin, true)\n\n        if (dragBounds) {\n            const allowBounds = dragBounds === 'parent' ? element.parent.boxBounds : dragBounds\n            const localBounds = new Bounds(element.__localBoxBounds)\n            localBounds.scaleOf(element.getLocalPointByInner(origin), scaleX, scaleY)\n\n            if (!BoundsHelper.includes(allowBounds, localBounds)) {\n                const realBounds = localBounds.getIntersect(allowBounds)\n                const fitScaleX = realBounds.width / localBounds.width, fitScaleY = realBounds.height / localBounds.height\n                if (useScaleX) scaleX *= fitScaleX\n                if (useScaleY) scaleY *= fitScaleY // 后续需优化带旋转的场景\n            }\n        }\n\n        if (useScaleX && widthRange) {\n            const nowWidth = boxBounds.width * element.scaleX\n            scaleX = within(nowWidth * scaleX, widthRange) / nowWidth\n        }\n\n        if (useScaleY && heightRange) {\n            const nowHeight = boxBounds.height * element.scaleY\n            scaleY = within(nowHeight * scaleY, heightRange) / nowHeight\n        }\n\n        // 防止小于1px\n        if (useScaleX && Math.abs(scaleX * worldBoxBounds.width) < 1) scaleX = (scaleX < 0 ? -1 : 1) / worldBoxBounds.width\n        if (useScaleY && Math.abs(scaleY * worldBoxBounds.height) < 1) scaleY = (scaleY < 0 ? -1 : 1) / worldBoxBounds.height\n\n        if (lockRatio && scaleX !== scaleY) scaleY = scaleX = Math.min(scaleX, scaleY)\n\n        return { origin, scaleX, scaleY, direction, lockRatio, around }\n    },\n\n    getRotateData(bounds: IBoundsData, direction: Direction9, current: IPointData, last: IPointData, around: IAround): IEditorRotateEvent {\n        let align: IAlign, origin = {} as IPointData\n\n        switch (direction) {\n            case topLeft:\n                align = 'bottom-right'\n                break\n            case topRight:\n                align = 'bottom-left'\n                break\n            case bottomRight:\n                align = 'top-left'\n                break\n            case bottomLeft:\n                align = 'top-right'\n                break\n            default:\n                align = 'center'\n        }\n\n        toPoint(around || align, bounds, origin, true)\n\n        return { origin, rotation: PointHelper.getRotation(last, origin, current) }\n    },\n\n    getSkewData(bounds: IBoundsData, direction: Direction9, move: IPointData, around: IAround): IEditorSkewEvent {\n        let align: IAlign, origin = {} as IPointData, skewX = 0, skewY = 0\n        let last: IPointData\n\n        switch (direction) {\n            case top:\n            case topLeft:\n                last = { x: 0.5, y: 0 }\n                align = 'bottom'\n                skewX = 1\n                break\n            case bottom:\n            case bottomRight:\n                last = { x: 0.5, y: 1 }\n                align = 'top'\n                skewX = 1\n                break\n            case left:\n            case bottomLeft:\n                last = { x: 0, y: 0.5 }\n                align = 'right'\n                skewY = 1\n                break\n            case right:\n            case topRight:\n                last = { x: 1, y: 0.5 }\n                align = 'left'\n                skewY = 1\n        }\n\n        const { width, height } = bounds\n\n        last.x = last.x * width\n        last.y = last.y * height\n\n        toPoint(around || align, bounds, origin, true)\n\n        const rotation = PointHelper.getRotation(last, origin, { x: last.x + (skewX ? move.x : 0), y: last.y + (skewY ? move.y : 0) })\n        skewX ? skewX = -rotation : skewY = rotation\n\n        return { origin, skewX, skewY }\n    },\n\n\n    getAround(around: IAround, altKey: boolean): IAround {\n        return (altKey && !around) ? 'center' : around\n    },\n\n    getRotateDirection(direction: number, rotation: number, totalDirection = 8): number {\n        direction = (direction + Math.round(rotation / (360 / totalDirection))) % totalDirection\n        if (direction < 0) direction += totalDirection\n        return direction\n    },\n\n    getFlipDirection(direction: Direction9, flipedX: boolean, flipedY: boolean): Direction9 {\n        if (flipedX) {\n            switch (direction) {\n                case left: direction = right; break\n                case topLeft: direction = topRight; break\n                case bottomLeft: direction = bottomRight; break\n                case right: direction = left; break\n                case topRight: direction = topLeft; break\n                case bottomRight: direction = bottomLeft; break\n            }\n        }\n\n        if (flipedY) {\n            switch (direction) {\n                case top: direction = bottom; break\n                case topLeft: direction = bottomLeft; break\n                case topRight: direction = bottomRight; break\n                case bottom: direction = top; break\n                case bottomLeft: direction = topLeft; break\n                case bottomRight: direction = topRight; break\n            }\n        }\n\n        return direction\n    }\n\n}","import { IObject, IUIEvent } from '@leafer-ui/interface'\n\nimport { IEditor } from '@leafer-in/interface'\nimport { MathHelper } from '@leafer-ui/draw'\n\nimport { EditDataHelper } from '../helper/EditDataHelper'\n\n\nconst cacheCursors: IObject = {}\n\nexport function updateCursor(editor: IEditor, e: IUIEvent): void {\n    const { editBox } = editor, point = editBox.enterPoint\n    if (!point || !editor.editing || !editBox.visible) return\n    if (point.name === 'circle') return // 独立旋转按钮\n    if (point.pointType === 'button') { // 普通按钮\n        if (!point.cursor) point.cursor = 'pointer'\n        return\n    }\n\n    let { rotation } = editBox\n    const { resizeCursor, rotateCursor, skewCursor, resizeable, rotateable, skewable } = editor.mergeConfig\n    const { pointType } = point, { flippedX, flippedY } = editBox\n\n    let showResize = pointType.includes('resize')\n    if (showResize && rotateable && (e.metaKey || e.ctrlKey || !resizeable)) showResize = false\n    const showSkew = skewable && !showResize && (point.name === 'resize-line' || pointType === 'skew')\n\n    const cursor = showSkew ? skewCursor : (showResize ? resizeCursor : rotateCursor)\n    rotation += (EditDataHelper.getFlipDirection(point.direction, flippedX, flippedY) + 1) * 45\n    rotation = Math.round(MathHelper.formatRotation(rotation, true) / 2) * 2\n\n    const { url, x, y } = cursor\n    const key = url + rotation\n\n    if (cacheCursors[key]) {\n        point.cursor = cacheCursors[key]\n    } else {\n        cacheCursors[key] = point.cursor = { url: toDataURL(url, rotation), x, y }\n    }\n}\n\nexport function updateMoveCursor(editor: IEditor): void {\n    const { moveCursor, moveable } = editor.mergeConfig\n    editor.editBox.rect.cursor = moveable ? moveCursor : undefined\n}\n\n\nfunction toDataURL(svg: string, rotation: number): string {\n    return '\"data:image/svg+xml,' + encodeURIComponent(svg.replace('{{rotation}}', rotation.toString())) + '\"'\n}","import { Box, Direction9 } from '@leafer-ui/draw'\n\nimport { IEditPoint, IEditPointType } from '@leafer-in/interface'\n\n\nexport class EditPoint extends Box implements IEditPoint {\n    public direction: Direction9\n    public pointType: IEditPointType\n}","import { IRect, IEventListenerId, IBoundsData, IPointData, IKeyEvent, IGroup, IBox, IBoxInputData, IAlign, IUI, IEditorConfig, IEditorDragStartData } from '@leafer-ui/interface'\nimport { Group, Box, Text, AroundHelper, Direction9, ResizeEvent } from '@leafer-ui/draw'\nimport { DragEvent, PointerEvent } from '@leafer-ui/core'\n\nimport { IEditBox, IEditor, IEditPoint, IEditPointType } from '@leafer-in/interface'\n\nimport { updateCursor, updateMoveCursor } from '../editor/cursor'\nimport { EditorEvent } from '../event/EditorEvent'\nimport { EditPoint } from './EditPoint'\nimport { EditDataHelper } from '../helper/EditDataHelper'\n\n\nconst fourDirection = ['top', 'right', 'bottom', 'left'], editConfig: IEditorConfig = undefined\n\nexport class EditBox extends Group implements IEditBox {\n\n    public editor: IEditor\n    public dragging: boolean\n    public moving: boolean\n\n    public view: IGroup = new Group()  // 放置默认编辑工具控制点\n\n    public rect: IBox = new Box({ name: 'rect', hitFill: 'all', hitStroke: 'none', strokeAlign: 'center', hitRadius: 5 }) // target rect\n    public circle: IEditPoint = new EditPoint({ name: 'circle', strokeAlign: 'center', around: 'center', cursor: 'crosshair', hitRadius: 5 }) // rotate point\n    public buttons: IGroup = new Group({ around: 'center', hitSelf: false, visible: 0 })\n\n    public resizePoints: IEditPoint[] = [] // topLeft, top, topRight, right, bottomRight, bottom, bottomLeft, left\n    public rotatePoints: IEditPoint[] = [] // topLeft, top, topRight, right, bottomRight, bottom, bottomLeft, left\n    public resizeLines: IEditPoint[] = [] // top, right, bottom, left\n\n    public enterPoint: IEditPoint\n    public dragPoint: IEditPoint // 正在拖拽的控制点\n\n    public dragStartData = {} as IEditorDragStartData\n\n    // fliped\n    public get flipped(): boolean { return this.flippedX || this.flippedY }\n    public get flippedX(): boolean { return this.scaleX < 0 }\n    public get flippedY(): boolean { return this.scaleY < 0 }\n    public get flippedOne(): boolean { return this.scaleX * this.scaleY < 0 }\n\n    protected __eventIds: IEventListenerId[] = []\n\n    constructor(editor: IEditor) {\n        super()\n        this.editor = editor\n        this.visible = false\n        this.create()\n        this.__listenEvents()\n    }\n\n    public create() {\n        let rotatePoint: IEditPoint, resizeLine: IEditPoint, resizePoint: IEditPoint\n        const { view, resizePoints, rotatePoints, resizeLines, rect, circle, buttons } = this\n        const arounds: IAlign[] = ['bottom-right', 'bottom', 'bottom-left', 'left', 'top-left', 'top', 'top-right', 'right']\n\n        for (let i = 0; i < 8; i++) {\n            rotatePoint = new EditPoint({ name: 'rotate-point', around: arounds[i], width: 15, height: 15, hitFill: \"all\" })\n            rotatePoints.push(rotatePoint)\n            this.listenPointEvents(rotatePoint, 'rotate', i)\n\n            if (i % 2) {\n                resizeLine = new EditPoint({ name: 'resize-line', around: 'center', width: 10, height: 10, hitFill: \"all\" })\n                resizeLines.push(resizeLine)\n                this.listenPointEvents(resizeLine, 'resize', i)\n            }\n\n            resizePoint = new EditPoint({ name: 'resize-point', hitRadius: 5 })\n            resizePoints.push(resizePoint)\n            this.listenPointEvents(resizePoint, 'resize', i)\n        }\n\n        this.listenPointEvents(circle, 'rotate', 2)\n\n        view.addMany(...rotatePoints, rect, circle, buttons, ...resizeLines, ...resizePoints)\n        this.add(view)\n    }\n\n    public load(): void {\n        const { mergeConfig, element, single } = this.editor\n        const { rect, circle, resizePoints } = this\n        const { stroke, strokeWidth } = mergeConfig\n\n        const pointsStyle = this.getPointsStyle()\n        const middlePointsStyle = this.getMiddlePointsStyle()\n\n        let resizeP: IRect\n\n        for (let i = 0; i < 8; i++) {\n            resizeP = resizePoints[i]\n            resizeP.set(this.getPointStyle((i % 2) ? middlePointsStyle[((i - 1) / 2) % middlePointsStyle.length] : pointsStyle[(i / 2) % pointsStyle.length]))\n            if (!(i % 2)) resizeP.rotation = (i / 2) * 90\n        }\n\n        // rotate\n        circle.set(this.getPointStyle(mergeConfig.circle || mergeConfig.rotatePoint || pointsStyle[0]))\n\n        // rect\n        rect.set({ stroke, strokeWidth, editConfig, ...(mergeConfig.rect || {}) })\n        rect.hittable = !single\n        rect.syncEventer = single && this.editor  // 单选下 rect 的事件不会冒泡，需要手动传递给editor\n\n        // 编辑框作为底部虚拟元素， 在 onSelect 方法移除\n        if (single) {\n            element.syncEventer = rect\n            this.app.interaction.bottomList = [{ target: rect, proxy: element }]\n        }\n    }\n\n    public update(bounds: IBoundsData): void {\n        const { rect, circle, buttons, resizePoints, rotatePoints, resizeLines, editor } = this\n        const { mergeConfig, element, multiple, editMask } = editor\n        const { middlePoint, resizeable, rotateable, hideOnSmall, editBox, mask } = mergeConfig\n\n        this.visible = !element.locked\n        editMask.visible = mask ? true : 0\n\n        if (this.view.worldOpacity) {\n            const { width, height } = bounds\n            const smallSize = typeof hideOnSmall === 'number' ? hideOnSmall : 10\n            const showPoints = editBox && !(hideOnSmall && width < smallSize && height < smallSize)\n\n            let point = {} as IPointData, rotateP: IRect, resizeP: IRect, resizeL: IRect\n\n            for (let i = 0; i < 8; i++) {\n\n                AroundHelper.toPoint(AroundHelper.directionData[i], bounds, point)\n                resizeP = resizePoints[i]\n                rotateP = rotatePoints[i]\n                resizeL = resizeLines[Math.floor(i / 2)]\n                resizeP.set(point)\n                rotateP.set(point)\n                resizeL.set(point)\n\n                // visible \n                resizeP.visible = resizeL.visible = showPoints && !!(resizeable || rotateable)\n                rotateP.visible = showPoints && rotateable && resizeable && !mergeConfig.rotatePoint\n\n                if (i % 2) { // top,  right, bottom, left\n\n                    resizeP.visible = rotateP.visible = showPoints && !!middlePoint\n\n                    if (((i + 1) / 2) % 2) { // top, bottom\n                        resizeL.width = width\n                        if (hideOnSmall && resizeP.width * 2 > width) resizeP.visible = false\n                    } else {\n                        resizeL.height = height\n                        resizeP.rotation = 90\n                        if (hideOnSmall && resizeP.width * 2 > height) resizeP.visible = false\n                    }\n                }\n\n            }\n\n            // rotate\n            circle.visible = showPoints && rotateable && !!(mergeConfig.circle || mergeConfig.rotatePoint)\n            if (circle.visible) this.layoutCircle(mergeConfig)\n\n            // rect\n            if (rect.path) rect.path = null // line可能会变成path优先模式\n            rect.set({ ...bounds, visible: multiple ? true : editBox })\n\n            // buttons\n            buttons.visible = showPoints && buttons.children.length > 0 || 0\n            if (buttons.visible) this.layoutButtons(mergeConfig)\n        } else rect.set(bounds) // 需要更新大小\n    }\n\n    protected layoutCircle(config: IEditorConfig): void {\n        const { circleDirection, circleMargin, buttonsMargin, buttonsDirection, middlePoint } = config\n        const direction = fourDirection.indexOf(circleDirection || ((this.buttons.children.length && buttonsDirection === 'bottom') ? 'top' : 'bottom'))\n        this.setButtonPosition(this.circle, direction, circleMargin || buttonsMargin, !!middlePoint)\n    }\n\n    protected layoutButtons(config: IEditorConfig): void {\n        const { buttons } = this\n        const { buttonsDirection, buttonsFixed, buttonsMargin, middlePoint } = config\n\n        const { flippedX, flippedY } = this\n        let index = fourDirection.indexOf(buttonsDirection)\n        if ((index % 2 && flippedX) || ((index + 1) % 2 && flippedY)) {\n            if (buttonsFixed) index = (index + 2) % 4 // flip x / y\n        }\n\n        const direction = buttonsFixed ? EditDataHelper.getRotateDirection(index, this.flippedOne ? this.rotation : -this.rotation, 4) : index\n        this.setButtonPosition(buttons, direction, buttonsMargin, !!middlePoint)\n\n        if (buttonsFixed) buttons.rotation = (direction - index) * 90\n        buttons.scaleX = flippedX ? -1 : 1\n        buttons.scaleY = flippedY ? -1 : 1\n    }\n\n    protected setButtonPosition(buttons: IUI, direction: number, buttonsMargin: number, useMiddlePoint: boolean): void {\n        const point = this.resizePoints[direction * 2 + 1] // 4 map 8 direction\n        const useX = direction % 2  // left / right\n        const sign = (!direction || direction === 3) ? -1 : 1 // top / left = -1\n\n        const useWidth = direction % 2 // left / right  origin direction\n        const margin = (buttonsMargin + (useWidth ? ((useMiddlePoint ? point.width : 0) + buttons.boxBounds.width) : ((useMiddlePoint ? point.height : 0) + buttons.boxBounds.height)) / 2) * sign\n\n        if (useX) {\n            buttons.x = point.x + margin\n            buttons.y = point.y\n        } else {\n            buttons.x = point.x\n            buttons.y = point.y + margin\n        }\n    }\n\n\n    public unload(): void {\n        this.visible = false\n    }\n\n\n    public getPointStyle(userStyle?: IBoxInputData): IBoxInputData {\n        const { stroke, strokeWidth, pointFill, pointSize, pointRadius } = this.editor.mergeConfig\n        const defaultStyle = { fill: pointFill, stroke, strokeWidth, around: 'center', strokeAlign: 'center', width: pointSize, height: pointSize, cornerRadius: pointRadius, offsetX: 0, offsetY: 0, editConfig } as IBoxInputData\n        return userStyle ? Object.assign(defaultStyle, userStyle) : defaultStyle\n    }\n\n    public getPointsStyle(): IBoxInputData[] {\n        const { point } = this.editor.mergeConfig\n        return point instanceof Array ? point : [point]\n    }\n\n    public getMiddlePointsStyle(): IBoxInputData[] {\n        const { middlePoint } = this.editor.mergeConfig\n        return middlePoint instanceof Array ? middlePoint : (middlePoint ? [middlePoint] : this.getPointsStyle())\n    }\n\n    protected onSelect(e: EditorEvent): void {\n        if (e.oldList.length === 1) {\n            e.oldList[0].syncEventer = null\n            if (this.app) this.app.interaction.bottomList = null\n        }\n    }\n\n    // drag\n\n    protected onDragStart(e: DragEvent): void {\n        this.dragging = true\n        const point = this.dragPoint = e.current as IEditPoint, { pointType } = point\n        const { editor, dragStartData } = this, { element } = editor\n        if (point.name === 'rect') {\n            this.moving = true\n            editor.opacity = editor.mergeConfig.hideOnMove ? 0 : 1 // move\n        }\n        dragStartData.x = e.x\n        dragStartData.y = e.y\n        dragStartData.point = { x: element.x, y: element.y } // 用于移动\n        dragStartData.bounds = { ...element.getLayoutBounds('box', 'local') } // 用于resize\n        dragStartData.rotation = element.rotation // 用于旋转\n        if (pointType && pointType.includes('resize')) ResizeEvent.resizingKeys = editor.leafList.keys // 记录正在resize中的元素列表\n    }\n\n    protected onDragEnd(e: DragEvent): void {\n        this.dragging = false\n        this.dragPoint = null\n        this.moving = false\n        const { name, pointType } = e.current as IEditPoint\n        if (name === 'rect') this.editor.opacity = 1 // move\n        if (pointType && pointType.includes('resize')) ResizeEvent.resizingKeys = null\n    }\n\n    protected onDrag(e: DragEvent): void {\n        const { editor } = this\n        const { pointType } = this.enterPoint = e.current as IEditPoint\n        if (pointType.includes('rotate') || e.metaKey || e.ctrlKey || !editor.mergeConfig.resizeable) {\n            editor.onRotate(e)\n            if (pointType === 'resize-rotate') editor.onScale(e)\n        } else if (pointType === 'resize') editor.onScale(e)\n        if (pointType === 'skew') editor.onSkew(e)\n        updateCursor(editor, e)\n    }\n\n    public onArrow(e: IKeyEvent): void {\n        const { editor } = this\n        if (editor.editing && editor.mergeConfig.keyEvent) {\n            let x = 0, y = 0\n            const distance = e.shiftKey ? 10 : 1\n            switch (e.code) {\n                case 'ArrowDown':\n                    y = distance\n                    break\n                case 'ArrowUp':\n                    y = -distance\n                    break\n                case 'ArrowLeft':\n                    x = -distance\n                    break\n                case 'ArrowRight':\n                    x = distance\n            }\n            if (x || y) editor.move(x, y)\n        }\n    }\n\n\n    protected onDoubleTap(e: PointerEvent): void {\n        if (this.editor.mergeConfig.openInner === 'double') this.openInner(e)\n    }\n\n    protected onLongPress(e: PointerEvent): void {\n        if (this.editor.mergeConfig.openInner === 'long') this.openInner(e)\n    }\n\n    protected openInner(e: PointerEvent): void {\n        const { editor } = this\n        if (editor.single) {\n            const { element } = editor\n            if (element.locked) return\n            if (element.isBranch && !element.editInner) {\n                if ((element as IBox).textBox) {\n                    const { children } = element\n                    const find = children.find(item => item.editable && item instanceof Text) || children.find(item => item instanceof Text)\n                    if (find) return editor.openInnerEditor(find) // 文本Box直接进入编辑状态，如便利贴文本\n                }\n\n                editor.openGroup(element as IGroup)\n                editor.target = editor.selector.findDeepOne(e)\n            } else {\n                editor.openInnerEditor()\n            }\n        }\n    }\n\n\n    public listenPointEvents(point: IEditPoint, type: IEditPointType, direction: Direction9): void {\n        const { editor } = this\n        point.direction = direction\n        point.pointType = type\n        point.on_(DragEvent.START, this.onDragStart, this)\n        point.on_(DragEvent.DRAG, this.onDrag, this)\n        point.on_(DragEvent.END, this.onDragEnd, this)\n        point.on_(PointerEvent.LEAVE, () => this.enterPoint = null)\n        if (point.name !== 'circle') point.on_(PointerEvent.ENTER, (e) => { this.enterPoint = point, updateCursor(editor, e) })\n    }\n\n    protected __listenEvents(): void {\n        const { rect, editor } = this\n        this.__eventIds = [\n            editor.on_(EditorEvent.SELECT, this.onSelect, this),\n\n            rect.on_(DragEvent.START, this.onDragStart, this),\n            rect.on_(DragEvent.DRAG, editor.onMove, editor),\n            rect.on_(DragEvent.END, this.onDragEnd, this),\n\n            rect.on_(PointerEvent.ENTER, () => updateMoveCursor(editor)),\n            rect.on_(PointerEvent.DOUBLE_TAP, this.onDoubleTap, this),\n            rect.on_(PointerEvent.LONG_PRESS, this.onLongPress, this)\n        ]\n    }\n\n    protected __removeListenEvents(): void {\n        this.off_(this.__eventIds)\n        this.__eventIds.length = 0\n    }\n\n    public destroy(): void {\n        this.editor = null\n        this.__removeListenEvents()\n        super.destroy()\n    }\n\n}","import { IBox, ILeaferCanvas, IRenderOptions } from '@leafer-ui/interface'\nimport { UI } from '@leafer-ui/draw'\n\nimport { IEditor } from '@leafer-in/interface'\n\nconst bigBounds = { x: 0, y: 0, width: 100000, height: 100000 }\n\nexport class EditMask extends UI {\n\n    public editor: IEditor\n\n    constructor(editor: IEditor) {\n        super()\n        this.editor = editor\n        this.hittable = false\n        this.visible = 0\n    }\n\n    override __updateWorldBounds(): void {\n        Object.assign(this.__local, bigBounds) // 强制修改渲染包围盒\n        Object.assign(this.__world, bigBounds)\n    }\n\n    public __draw(canvas: ILeaferCanvas, options: IRenderOptions): void {\n\n        const { editor } = this, { mask } = editor.mergedConfig\n        if (mask && editor.editing) {\n            canvas.fillWorld(canvas.bounds, mask === true ? 'rgba(0,0,0,0.8)' : mask)\n            if (options.bounds && !options.bounds.hit(editor.editBox.rect.__world, options.matrix)) return\n\n            canvas.saveBlendMode('destination-out')\n            editor.list.forEach(item => {\n                item.__renderShape(canvas, options)\n                const { __box, parent } = item\n                if ((item = __box) || ((item = parent) && (parent as IBox).textBox)) item.__renderShape(canvas, options) // 文本框\n            })\n            canvas.restoreBlendMode()\n        }\n    }\n\n    public destroy(): void {\n        this.editor = null\n        super.destroy()\n    }\n\n}\n","const filterStyle = `\n<feOffset dy=\"1\"/>\n<feGaussianBlur stdDeviation=\"1.5\"/>\n<feColorMatrix type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.2 0\"/>\n<feBlend mode=\"normal\" in=\"SourceGraphic\" result=\"shape\"/>`\n\n\nexport const resizeSVG = `\n<svg width=\"24\" height=\"24\" xmlns=\"http://www.w3.org/2000/svg\">\n<g filter=\"url(#f)\">\n<g transform=\"rotate({{rotation}},12,12)\">\n<path d=\"M7.5 8.0H8.5V5.9L6.8 7.2L7.5 8.0ZM3 11.4L2.3 10.6L1.3 11.4L2.3 12.2L3 11.4ZM7.5 10.4H6.5V11.4H7.5V10.4ZM16.5 10.4V11.4H17.5V10.4H16.5ZM16.5 8.0L17.1 7.2L15.5 5.9V8.0H16.5ZM21 11.4L21.6 12.2L22.6 11.4L21.6 10.6L21 11.4ZM16.5 14.9H15.5V16.9L17.1 15.7L16.5 14.9ZM16.5 12.4H17.5V11.4H16.5V12.4ZM7.5 12.4V11.4H6.5V12.4H7.5ZM7.5 14.9L6.8 15.7L8.5 16.9V14.9H7.5ZM6.8 7.2L2.3 10.6L3.6 12.2L8.1 8.7L6.8 7.2ZM8.5 10.4V8.0H6.5V10.4H8.5ZM16.5 9.4H7.5V11.4H16.5V9.4ZM17.5 10.4V8.0H15.5V10.4H17.5ZM15.8 8.7L20.3 12.2L21.6 10.6L17.1 7.2L15.8 8.7ZM20.3 10.6L15.8 14.1L17.1 15.7L21.6 12.2L20.3 10.6ZM17.5 14.9V12.4H15.5V14.9H17.5ZM7.5 13.4H16.5V11.4H7.5V13.4ZM8.5 14.9V12.4H6.5V14.9H8.5ZM2.3 12.2L6.8 15.7L8.1 14.1L3.6 10.6L2.3 12.2Z\" fill=\"white\"/>\n<path fill-rule=\"evenodd\" d=\"M3 11.4L7.5 8.0V10.4H16.5V8.0L21 11.4L16.5 14.9V12.4H7.5V14.9L3 11.4Z\" fill=\"black\"/>\n</g>\n</g>\n<defs>\n<filter id=\"f\" x=\"-1.6\" y=\"3.9\" width=\"27.2\" height=\"16.9\" filterUnits=\"userSpaceOnUse\">\n${filterStyle}\n</filter>\n</defs>\n</svg>\n`\n\nexport const rotateSVG = `\n<svg width=\"24\" height=\"24\" xmlns=\"http://www.w3.org/2000/svg\">\n<g filter=\"url(#f)\">\n<g transform=\"rotate(135,12,12),rotate({{rotation}},12,12)\">\n<path d=\"M20.4 8H21.4L20.8 7.1L17.3 2.6L17 2.1L16.6 2.6L13.1 7.1L12.5 8H13.5H15.4C14.9 11.8 11.8 14.9 8 15.4V13.5V12.5L7.1 13.1L2.6 16.6L2.1 17L2.6 17.3L7.1 20.8L8 21.4V20.4V18.4C13.5 17.9 17.9 13.5 18.4 8H20.4Z\" stroke=\"white\"/>\n<path fill-rule=\"evenodd\" d=\"M17 3L20.4 7.5H17.9C17.7 13.1 13.1 17.7 7.5 17.9V20.4L3 17L7.5 13.5V15.9C12.0 15.7 15.7 12.0 15.9 7.5H13.5L17 3Z\" fill=\"black\"/>\n</g>\n</g>\n<defs>\n<filter id=\"f\" x=\"-1.6\" y=\"-0.6\" width=\"27.1\" height=\"27.1\" filterUnits=\"userSpaceOnUse\">\n${filterStyle}\n</filter>\n</defs>\n</svg>\n`\n\nexport const skewSVG = `\n<svg width=\"24\" height=\"24\" xmlns=\"http://www.w3.org/2000/svg\">\n<g filter=\"url(#f)\">\n<g transform=\"rotate(90,12,12),rotate({{rotation}},12,12)\">\n<path d=\"M21 10.4L21 11.4L23.8 11.4L21.6 9.6L21 10.4ZM17 10.4V11.4L17 11.4L17 10.4ZM15.5 6L16.1 5.2L14.5 3.9V6H15.5ZM15.5 8.4V9.4H16.5V8.4H15.5ZM6 8.4V7.4H5V8.4H6ZM6 10.4H5V11.4H6V10.4ZM7 14.4V13.4L7 13.4L7 14.4ZM3 14.4L3 13.4L0.1 13.4L2.3 15.2L3 14.4ZM8.5 18.9L7.8 19.7L9.5 21.0V18.9H8.5ZM8.5 16.4V15.4H7.5V16.4H8.5ZM19 16.4V17.4H20V16.4H19ZM19 14.4H20V13.4H19V14.4ZM21 9.4L17 9.4L17 11.4L21 11.4L21 9.4ZM14.8 6.7L20.3 11.2L21.6 9.6L16.1 5.2L14.8 6.7ZM16.5 8.4V6H14.5V8.4H16.5ZM6 9.4H15.5V7.4H6V9.4ZM7 10.4V8.4H5V10.4H7ZM15.5 9.4H6V11.4H15.5V9.4ZM17 9.4H15.5V11.4H17V9.4ZM7 15.4H8.5V13.4H7V15.4ZM3 15.4L7 15.4L7 13.4L3 13.4L3 15.4ZM9.1 18.1L3.6 13.6L2.3 15.2L7.8 19.7L9.1 18.1ZM7.5 16.4V18.9H9.5V16.4H7.5ZM19 15.4H8.5V17.4H19V15.4ZM18 14.4V16.4H20V14.4H18ZM8.5 15.4H19V13.4H8.5V15.4Z\" fill=\"white\"/>\n<path fill-rule=\"evenodd\" d=\"M17 10.4L21 10.4L15.5 6V8.4H6V10.4H15.5H17ZM8.5 14.4H7L3 14.4L8.5 18.9V16.4H19V14.4H8.5Z\" fill=\"black\"/>\n</g>\n</g>\n<defs>\n<filter x=\"-2.8\" y=\"1.9\" width=\"29.6\" height=\"23.1\" filterUnits=\"userSpaceOnUse\" >\n${filterStyle}\n</filter>\n</defs>\n</svg>\n`","import { IEditorConfig } from '@leafer-in/interface'\nimport { resizeSVG, rotateSVG, skewSVG } from './svg'\n\n\nexport const config: IEditorConfig = {\n    editSize: 'size',\n    keyEvent: true,\n\n    stroke: '#836DFF',\n    strokeWidth: 2,\n\n    pointFill: '#FFFFFF',\n    pointSize: 10,\n    pointRadius: 16,\n\n    rotateGap: 45,\n\n    buttonsDirection: 'bottom',\n    buttonsMargin: 12,\n\n    hideOnSmall: true,\n\n    moveCursor: 'move',\n    resizeCursor: { url: resizeSVG, x: 12, y: 12 },\n    rotateCursor: { url: rotateSVG, x: 12, y: 12 },\n    skewCursor: { url: skewSVG, x: 12, y: 12 },\n\n    selector: true,\n    editBox: true,\n    hover: true,\n    select: 'press',\n    openInner: 'double',\n    multipleSelect: true,\n    boxSelect: true,\n\n    moveable: true,\n    resizeable: true,\n    flipable: true,\n    rotateable: true,\n    skewable: true\n}","import { IGroup, ILeaf } from '@leafer-ui/interface'\nimport { Bounds } from '@leafer-ui/draw'\n\nimport { IEditor } from '@leafer-in/interface'\n\n\nconst bounds = new Bounds()\n\nexport function simulate(editor: IEditor) {\n    const { simulateTarget, list } = editor\n    const { zoomLayer } = list[0].leafer.zoomLayer as IGroup // follow zoomLayer zoom / move\n    simulateTarget.safeChange(() => {\n        bounds.setListWithFn(list, (leaf: ILeaf) => leaf.getBounds('box', 'page'))\n        if (bounds.width === 0) bounds.width = 0.1 // fix\n        if (bounds.height === 0) bounds.height = 0.1\n        simulateTarget.reset(bounds.get())\n    })\n    zoomLayer.add(simulateTarget)\n}","import { IGroup, IGroupInputData, ILeaf, IUI } from '@leafer-ui/interface'\nimport { Group, Matrix } from '@leafer-ui/draw'\n\n\nconst order = (a: ILeaf, b: ILeaf) => a.parent.children.indexOf(a) - b.parent.children.indexOf(b)\nconst reverseOrder = (a: ILeaf, b: ILeaf) => b.parent.children.indexOf(b) - a.parent.children.indexOf(a)\n\nexport const EditorHelper = {\n\n    group(list: IUI[], element?: IUI, userGroup?: IGroup | IGroupInputData): IGroup {\n        list.sort(reverseOrder)\n        const { app, parent } = list[0]\n\n        let group: IGroup\n        if (userGroup && (userGroup as IGroup).add) {\n            group = userGroup as IGroup\n        } else {\n            group = new Group(userGroup)\n        }\n\n        parent.addAt(group, parent.children.indexOf(list[0]))\n        list.sort(order)\n\n        const matrx = new Matrix(element.worldTransform)\n        matrx.divideParent(parent.worldTransform)\n        group.setTransform(matrx)\n        group.editable = true\n        group.hitChildren = false\n\n        app.lockLayout()\n        list.forEach(child => child.dropTo(group))\n        app.unlockLayout()\n\n        return group\n    },\n\n    ungroup(list: IUI[]): IUI[] {\n        const { app } = list[0]\n        const ungroupList: IUI[] = []\n\n        app.lockLayout()\n        list.forEach(leaf => {\n            if (leaf.isBranch) {\n                const { parent, children } = leaf\n                while (children.length) {\n                    ungroupList.push(children[0])\n                    children[0].dropTo(parent, parent.children.indexOf(leaf))\n                }\n                if (leaf.isBranchLeaf) ungroupList.push(leaf)\n                else leaf.remove()\n            } else {\n                ungroupList.push(leaf)\n            }\n        })\n        app.unlockLayout()\n\n        return ungroupList\n    },\n\n    toTop(list: IUI[]): void {\n        list.sort(order)\n        list.forEach(leaf => {\n            if (leaf.parent) leaf.parent.add(leaf)\n        })\n    },\n\n    toBottom(list: IUI[]): void {\n        list.sort(reverseOrder)\n        list.forEach(leaf => {\n            if (leaf.parent) leaf.parent.addAt(leaf, 0)\n        })\n    }\n\n}","import { IObject } from '@leafer-ui/interface'\nimport { Debug } from '@leafer-ui/draw'\n\nimport { IEditTool, IEditor } from '@leafer-in/interface'\n\n\nconst debug = Debug.get('EditToolCreator')\n\nexport function registerEditTool() {\n    return (target: IObject) => {\n        EditToolCreator.register(target)\n    }\n}\n\nexport const registerInnerEditor = registerEditTool\n\nexport const EditToolCreator = {\n\n    list: {} as IObject,\n\n    register(EditTool: IObject): void {\n        const { tag } = EditTool.prototype as IEditTool\n        list[tag] && debug.repeat(tag)\n        list[tag] = EditTool\n    },\n\n    get(tag: string, editor: IEditor): IEditTool {\n        return new list[tag](editor)\n    }\n\n}\n\nconst { list } = EditToolCreator","import { IInnerEditorEvent, IInnerEditor } from '@leafer-in/interface'\n\nimport { EditorEvent } from './EditorEvent'\nimport { IUI } from '@leafer-ui/interface'\nimport { } from '../tool/InnerEditor'\n\n\nexport class InnerEditorEvent extends EditorEvent implements IInnerEditorEvent {\n\n    static BEFORE_OPEN = 'innerEditor.before_open'\n    static OPEN = 'innerEditor.open'\n\n    static BEFORE_CLOSE = 'innerEditor.before_close'\n    static CLOSE = 'innerEditor.close'\n\n    readonly editTarget: IUI\n    readonly innerEditor: IInnerEditor\n\n    constructor(type: string, data?: IInnerEditorEvent) {\n        super(type, data)\n    }\n\n}","import { IEditorGroupEvent } from '@leafer-in/interface'\n\nimport { EditorEvent } from './EditorEvent'\nimport { IGroup } from '@leafer-ui/interface'\nimport { } from '../tool/InnerEditor'\n\n\nexport class EditorGroupEvent extends EditorEvent implements IEditorGroupEvent {\n\n\n    static BEFORE_GROUP = 'editor.before_group'\n    static GROUP = 'editor.group'\n\n    static BEFORE_UNGROUP = 'editor.before_ungroup'\n    static UNGROUP = 'editor.ungroup'\n\n    static BEFORE_OPEN = 'editor.before_open_group'\n    static OPEN = 'editor.open_group'\n\n    static BEFORE_CLOSE = 'editor.before_close_group'\n    static CLOSE = 'editor.close_group'\n\n    readonly editTarget: IGroup\n\n    constructor(type: string, data?: IEditorGroupEvent) {\n        super(type, data)\n    }\n\n}","import { IObject, IFunction, IMatrix } from '@leafer-ui/interface'\nimport { LeafHelper, Matrix, PropertyEvent, Rect } from '@leafer-ui/draw'\n\nimport { IEditor, ISimulateElement } from '@leafer-in/interface'\n\n\nconst { updateMatrix } = LeafHelper\nconst checkMap: IObject = { x: 1, y: 1, scaleX: 1, scaleY: 1, rotation: 1, skewX: 1, skewY: 1 }, origin = 'top-left'\n\nexport class SimulateElement extends Rect implements ISimulateElement {\n\n    public get __tag() { return 'SimulateElement' }\n\n    public checkChange = true\n\n    public canChange = true\n\n    public changedTransform: IMatrix\n\n\n    constructor(editor: IEditor) {\n        super()\n\n        this.visible = this.hittable = false\n\n        this.on(PropertyEvent.CHANGE, (event: PropertyEvent) => {\n\n            if (this.checkChange && checkMap[event.attrName]) {\n\n                const { attrName, newValue, oldValue } = event\n                const addValue = attrName[0] === 's' ? (<number>newValue || 1) / (<number>oldValue || 1) : (<number>newValue || 0) - (<number>oldValue || 0)\n\n                this.canChange = false\n\n                const data: IObject = this.__\n\n                // old matrix\n                data[attrName] = oldValue\n                updateMatrix(this.parent)\n                updateMatrix(this)\n\n                const oldMatrix = new Matrix(this.__world)\n\n                // new matrix\n                data[attrName] = newValue\n                this.__layout.rotationChange()\n                updateMatrix(this)\n\n                this.changedTransform = new Matrix(this.__world).divide(oldMatrix) // world change transform\n\n                switch (attrName) {\n                    case 'x':\n                        editor.move(addValue, 0)\n                        break\n                    case 'y':\n                        editor.move(0, addValue)\n                        break\n                    case 'rotation':\n                        editor.rotateOf(origin, addValue)\n                        break\n                    case 'scaleX':\n                        editor.scaleOf(origin, addValue, 1)\n                        break\n                    case 'scaleY':\n                        editor.scaleOf(origin, 1, addValue)\n                        break\n                    case 'skewX':\n                        editor.skewOf(origin, addValue, 0)\n                        break\n                    case 'skewY':\n                        editor.skewOf(origin, 0, addValue)\n                }\n\n                this.canChange = true\n\n            }\n        })\n    }\n\n    public safeChange(changeFn: IFunction): void {\n        if (this.canChange) {\n            this.checkChange = false\n            changeFn()\n            this.checkChange = true\n        }\n    }\n}","import { IGroupInputData, IUI, IEventListenerId, IPointData, ILeafList, IEditSize, IGroup, IObject, IAlign, IAxis, IFunction, IMatrix, IApp } from '@leafer-ui/interface'\nimport { Group, DataHelper, MathHelper, LeafList, Matrix, RenderEvent, LeafHelper, Direction9 } from '@leafer-ui/draw'\nimport { DragEvent, RotateEvent, KeyEvent, ZoomEvent, MoveEvent, Plugin } from '@leafer-ui/core'\n\nimport { IEditBox, IEditPoint, IEditor, IEditorConfig, IEditTool, IEditorScaleEvent, IInnerEditor, ISimulateElement, IEditorMoveEvent, IEditorRotateEvent, IEditorSkewEvent } from '@leafer-in/interface'\n\nimport { EditorMoveEvent } from './event/EditorMoveEvent'\nimport { EditorScaleEvent } from './event/EditorScaleEvent'\nimport { EditorRotateEvent } from './event/EditorRotateEvent'\nimport { EditorSkewEvent } from './event/EditorSkewEvent'\n\nimport { EditSelect } from './display/EditSelect'\nimport { EditBox } from './display/EditBox'\nimport { EditMask } from './display/EditMask'\n\nimport { config } from './config'\n\nimport { onTarget, onHover } from './editor/target'\nimport { targetAttr, mergeConfigAttr } from './decorator/data'\nimport { EditorHelper } from './helper/EditorHelper'\nimport { EditDataHelper } from './helper/EditDataHelper'\nimport { simulate } from './editor/simulate'\nimport { updateCursor } from './editor/cursor'\nimport { EditToolCreator } from './tool/EditToolCreator'\nimport { InnerEditorEvent } from './event/InnerEditorEvent'\nimport { EditorGroupEvent } from './event/EditorGroupEvent'\nimport { SimulateElement } from './display/SimulateElement'\n\n\nexport class Editor extends Group implements IEditor {\n\n    public config: IEditorConfig\n\n    @mergeConfigAttr()\n    readonly mergeConfig: IEditorConfig\n    readonly mergedConfig: IEditorConfig\n\n    @targetAttr(onHover)\n    public hoverTarget?: IUI\n\n    @targetAttr(onTarget)\n    public target?: IUI | IUI[]\n\n    // 列表\n\n    public leafList: ILeafList = new LeafList() // from target\n    public get list(): IUI[] { return this.leafList.list as IUI[] }\n    public get dragHoverExclude(): IUI[] { return [this.editBox.rect] }\n    public openedGroupList: ILeafList = new LeafList()\n\n    // 状态\n\n    public get editing(): boolean { return !!this.list.length }\n    public innerEditing: boolean\n    public get groupOpening(): boolean { return !!this.openedGroupList.length }\n    public resizeDirection?: Direction9\n\n    public get multiple(): boolean { return this.list.length > 1 }\n    public get single(): boolean { return this.list.length === 1 }\n\n    public get dragging(): boolean { return this.editBox.dragging }\n    public get moving(): boolean { return this.editBox.moving }\n    public get dragPoint(): IEditPoint { return this.editBox.dragPoint }\n\n    // 组件\n\n    public get element() { return this.multiple ? this.simulateTarget : this.list[0] as ISimulateElement }\n    public simulateTarget: ISimulateElement = new SimulateElement(this)\n\n    public editBox: IEditBox = new EditBox(this)\n    public get buttons() { return this.editBox.buttons }\n\n    public editTool?: IEditTool\n\n    public innerEditor?: IInnerEditor\n    public editToolList: IObject = {}\n\n    public selector: EditSelect = new EditSelect(this)\n    public editMask: EditMask = new EditMask(this)\n\n    public targetChanged: boolean\n    public targetEventIds: IEventListenerId[] = []\n\n\n    constructor(userConfig?: IEditorConfig, data?: IGroupInputData) {\n        super(data)\n        let mergedConfig: IEditorConfig = DataHelper.clone(config)\n        if (userConfig) mergedConfig = DataHelper.default(userConfig, mergedConfig)\n        this.mergedConfig = this.config = mergedConfig\n\n        this.addMany(this.editMask, this.selector, this.editBox)\n        if (!Plugin.has('resize')) this.config.editSize = 'scale'\n    }\n\n    // select \n\n    public select(target: IUI | IUI[]): void {\n        this.target = target\n    }\n\n    public cancel(): void {\n        this.target = null\n    }\n\n    // item\n\n    public hasItem(item: IUI): boolean {\n        return this.leafList.has(item)\n    }\n\n    public addItem(item: IUI): void {\n        if (!this.hasItem(item) && !item.locked) this.leafList.add(item), this.target = this.leafList.list as IUI[]\n    }\n\n    public removeItem(item: IUI): void {\n        if (this.hasItem(item)) this.leafList.remove(item), this.target = this.leafList.list as IUI[]\n    }\n\n    public shiftItem(item: IUI): void {\n        this.hasItem(item) ? this.removeItem(item) : this.addItem(item)\n    }\n\n    // update\n\n    public update(): void {\n        if (this.editing) {\n            if (!this.element.parent) return this.cancel()\n            if (this.innerEditing) this.innerEditor.update()\n            this.editTool.update()\n            this.selector.update()\n        }\n    }\n\n    public updateEditBox(): void {\n        if (this.multiple) simulate(this)\n        this.update()\n    }\n\n    public updateEditTool(): void {\n        const tool = this.editTool\n        if (tool) {\n            this.editBox.unload()\n            tool.unload()\n            this.editTool = null\n        }\n\n        if (this.editing) {\n            const tag = this.single ? this.list[0].editOuter as string : 'EditTool'\n            this.editTool = this.editToolList[tag] = this.editToolList[tag] || EditToolCreator.get(tag, this)\n            this.editBox.load()\n            this.editTool.load()\n        }\n    }\n\n\n    // get\n\n    public getEditSize(_ui: IUI): IEditSize {\n        return this.mergeConfig.editSize\n    }\n\n    // operate\n\n    public onMove(e: DragEvent | MoveEvent): void {\n        if (e instanceof MoveEvent) {\n\n            if (e.moveType !== 'drag') {\n                const { moveable, resizeable } = this.mergeConfig\n                const move = e.getLocalMove(this.element)\n                if (moveable === 'move') e.stop(), this.move(move.x, move.y)\n                else if (resizeable === 'zoom') e.stop()\n            }\n\n        } else {\n\n            const total = { x: e.totalX, y: e.totalY }\n\n            if (e.shiftKey) {\n                if (Math.abs(total.x) > Math.abs(total.y)) total.y = 0\n                else total.x = 0\n            }\n\n            this.move(DragEvent.getValidMove(this.element, this.editBox.dragStartData.point, total))\n\n        }\n    }\n\n    public onScale(e: DragEvent | ZoomEvent): void {\n        const { element } = this\n        let { around, lockRatio, resizeable, flipable, editSize } = this.mergeConfig\n\n        if (e instanceof ZoomEvent) {\n\n            if (resizeable === 'zoom') e.stop(), this.scaleOf(element.getBoxPoint(e), e.scale, e.scale)\n\n        } else {\n\n            const { direction } = e.current as IEditPoint\n\n            if (e.shiftKey || element.lockRatio) lockRatio = true\n\n            const data = EditDataHelper.getScaleData(element, this.editBox.dragStartData.bounds, direction, e.getInnerTotal(element), lockRatio, EditDataHelper.getAround(around, e.altKey), flipable, this.multiple || editSize === 'scale')\n\n            if (this.editTool.onScaleWithDrag) {\n                data.drag = e\n                this.scaleWithDrag(data)\n            } else {\n                this.scaleOf(data.origin, data.scaleX, data.scaleY)\n            }\n\n        }\n    }\n\n    public onRotate(e: DragEvent | RotateEvent): void {\n        const { skewable, rotateable, around, rotateGap } = this.mergeConfig\n        const { direction, name } = e.current as IEditPoint\n        if (skewable && name === 'resize-line') return this.onSkew(e as DragEvent)\n\n        const { element } = this, { dragStartData } = this.editBox\n        let origin: IPointData, rotation: number\n\n        if (e instanceof RotateEvent) {\n\n            if (rotateable === 'rotate') e.stop(), rotation = e.rotation, origin = element.getBoxPoint(e)\n            else return\n\n            if (element.scaleX * element.scaleY < 0) rotation = -rotation // flippedOne\n\n        } else {\n\n            const data = EditDataHelper.getRotateData(element.boxBounds, direction, e.getBoxPoint(element), element.getBoxPoint(dragStartData), e.shiftKey ? null : (element.around || element.origin || around || 'center'))\n            rotation = data.rotation\n            origin = data.origin\n\n        }\n\n        if (element.scaleX * element.scaleY < 0) rotation = -rotation // flippedOne\n        if (e instanceof DragEvent) rotation = dragStartData.rotation + rotation - element.rotation\n\n        rotation = MathHelper.float(MathHelper.getGapRotation(rotation, rotateGap, element.rotation), 2)\n        if (!rotation) return\n\n        this.rotateOf(origin, rotation)\n    }\n\n\n    public onSkew(e: DragEvent): void {\n        const { element } = this\n        const { around } = this.mergeConfig\n\n        const { origin, skewX, skewY } = EditDataHelper.getSkewData(element.boxBounds, (e.current as IEditPoint).direction, e.getInnerMove(element), EditDataHelper.getAround(around, e.altKey))\n        if (!skewX && !skewY) return\n\n        this.skewOf(origin, skewX, skewY)\n    }\n\n\n    // transform\n\n    public move(x: number | IPointData, y = 0): void {\n        if (!this.checkTransform('moveable')) return\n        if (typeof x === 'object') y = x.y, x = x.x\n\n        const { element: target } = this, { beforeMove } = this.mergeConfig\n        if (beforeMove) {\n            const check = beforeMove({ target, x, y })\n            if (typeof check === 'object') x = check.x, y = check.y\n            else if (check === false) return\n        }\n\n        const world = target.getWorldPointByLocal({ x, y }, null, true)\n        if (this.multiple) target.safeChange(() => target.move(x, y))\n        const data: IEditorMoveEvent = { target, editor: this, moveX: world.x, moveY: world.y }\n\n        this.emitEvent(new EditorMoveEvent(EditorMoveEvent.BEFORE_MOVE, data))\n        const event = new EditorMoveEvent(EditorMoveEvent.MOVE, data)\n        this.editTool.onMove(event)\n        this.emitEvent(event)\n    }\n\n    public scaleWithDrag(data: IEditorScaleEvent): void {\n        if (!this.checkTransform('resizeable')) return\n\n        const { element: target } = this, { beforeScale } = this.mergeConfig\n        if (beforeScale) {\n            const { origin, scaleX, scaleY, drag } = data\n            const check = beforeScale({ target, drag, origin, scaleX, scaleY })\n            if (check === false) return\n        }\n\n        data = { ...data, target, editor: this, worldOrigin: target.getWorldPoint(data.origin) }\n\n        this.emitEvent(new EditorScaleEvent(EditorScaleEvent.BEFORE_SCALE, data))\n        const event = new EditorScaleEvent(EditorScaleEvent.SCALE, data)\n        this.editTool.onScaleWithDrag(event)\n        this.emitEvent(event)\n    }\n\n\n    override scaleOf(origin: IPointData | IAlign, scaleX: number, scaleY = scaleX, _resize?: boolean): void {\n        if (!this.checkTransform('resizeable')) return\n\n        const { element: target } = this, { beforeScale } = this.mergeConfig\n        if (beforeScale) {\n            const check = beforeScale({ target, origin, scaleX, scaleY })\n            if (typeof check === 'object') scaleX = check.scaleX, scaleY = check.scaleY\n            else if (check === false) return\n        }\n\n        const worldOrigin = this.getWorldOrigin(origin)\n        const transform = this.multiple && this.getChangedTransform(() => target.safeChange(() => target.scaleOf(origin, scaleX, scaleY)))\n        const data: IEditorScaleEvent = { target, editor: this, worldOrigin, scaleX, scaleY, transform }\n\n        this.emitEvent(new EditorScaleEvent(EditorScaleEvent.BEFORE_SCALE, data))\n        const event = new EditorScaleEvent(EditorScaleEvent.SCALE, data)\n        this.editTool.onScale(event)\n        this.emitEvent(event)\n    }\n\n    override flip(axis: IAxis): void {\n        if (!this.checkTransform('resizeable')) return\n\n        const { element } = this\n        const worldOrigin = this.getWorldOrigin('center')\n        const transform = this.multiple ? this.getChangedTransform(() => element.safeChange(() => element.flip(axis))) : new Matrix(LeafHelper.getFlipTransform(element, axis))\n        const data: IEditorScaleEvent = { target: element, editor: this, worldOrigin, scaleX: axis === 'x' ? -1 : 1, scaleY: axis === 'y' ? -1 : 1, transform }\n\n        this.emitEvent(new EditorScaleEvent(EditorScaleEvent.BEFORE_SCALE, data))\n        const event = new EditorScaleEvent(EditorScaleEvent.SCALE, data)\n        this.editTool.onScale(event)\n        this.emitEvent(event)\n    }\n\n    override rotateOf(origin: IPointData | IAlign, rotation: number): void {\n        if (!this.checkTransform('rotateable')) return\n\n        const { element: target } = this, { beforeRotate } = this.mergeConfig\n        if (beforeRotate) {\n            const check = beforeRotate({ target, origin, rotation })\n            if (typeof check === 'number') rotation = check\n            else if (check === false) return\n        }\n\n        const worldOrigin = this.getWorldOrigin(origin)\n        const transform = this.multiple && this.getChangedTransform(() => target.safeChange(() => target.rotateOf(origin, rotation)))\n        const data: IEditorRotateEvent = { target, editor: this, worldOrigin, rotation, transform }\n\n        this.emitEvent(new EditorRotateEvent(EditorRotateEvent.BEFORE_ROTATE, data))\n        const event = new EditorRotateEvent(EditorRotateEvent.ROTATE, data)\n        this.editTool.onRotate(event)\n        this.emitEvent(event)\n    }\n\n    override skewOf(origin: IPointData | IAlign, skewX: number, skewY = 0, _resize?: boolean): void {\n        if (!this.checkTransform('skewable')) return\n\n        const { element: target } = this, { beforeSkew } = this.mergeConfig\n        if (beforeSkew) {\n            const check = beforeSkew({ target, origin, skewX, skewY })\n            if (typeof check === 'object') skewX = check.skewX, skewY = check.skewY\n            else if (check === false) return\n        }\n\n        const worldOrigin = this.getWorldOrigin(origin)\n        const transform = this.multiple && this.getChangedTransform(() => target.safeChange(() => target.skewOf(origin, skewX, skewY)))\n        const data: IEditorSkewEvent = { target, editor: this, worldOrigin, skewX, skewY, transform }\n\n        this.emitEvent(new EditorSkewEvent(EditorSkewEvent.BEFORE_SKEW, data))\n        const event = new EditorSkewEvent(EditorSkewEvent.SKEW, data)\n        this.editTool.onSkew(event)\n        this.emitEvent(event)\n    }\n\n    public checkTransform(type: 'moveable' | 'resizeable' | 'rotateable' | 'skewable'): boolean { return this.element && !this.element.locked && this.mergeConfig[type] as boolean }\n\n    protected getWorldOrigin(origin: IPointData | IAlign): IPointData {\n        return this.element.getWorldPoint(LeafHelper.getInnerOrigin(this.element, origin))\n    }\n\n    protected getChangedTransform(func: IFunction): IMatrix {\n        const { element } = this\n        if (this.multiple && !element.canChange) return element.changedTransform\n\n        const oldMatrix = new Matrix(element.worldTransform)\n        func()\n        return new Matrix(element.worldTransform).divide(oldMatrix) // world change transform\n    }\n\n\n    // group\n\n    public group(userGroup?: IGroup | IGroupInputData): IGroup {\n        if (this.multiple) {\n            this.emitGroupEvent(EditorGroupEvent.BEFORE_GROUP)\n            this.target = EditorHelper.group(this.list, this.element, userGroup)\n            this.emitGroupEvent(EditorGroupEvent.GROUP, this.target as IGroup)\n        }\n        return this.target as IGroup\n    }\n\n    public ungroup(): IUI[] {\n        const { list } = this\n        if (list.length) {\n            list.forEach(item => item.isBranch && this.emitGroupEvent(EditorGroupEvent.BEFORE_UNGROUP, item as IGroup))\n            this.target = EditorHelper.ungroup(list)\n            list.forEach(item => item.isBranch && this.emitGroupEvent(EditorGroupEvent.UNGROUP, item as IGroup))\n        }\n        return this.list\n    }\n\n    public openGroup(group: IGroup): void {\n        this.emitGroupEvent(EditorGroupEvent.BEFORE_OPEN, group)\n        this.openedGroupList.add(group)\n        group.hitChildren = true\n        this.emitGroupEvent(EditorGroupEvent.OPEN, group)\n    }\n\n    public closeGroup(group: IGroup): void {\n        this.emitGroupEvent(EditorGroupEvent.BEFORE_CLOSE, group)\n        this.openedGroupList.remove(group)\n        group.hitChildren = false\n        this.emitGroupEvent(EditorGroupEvent.CLOSE, group)\n    }\n\n    public checkOpenedGroups(): void {\n        const opened = this.openedGroupList\n        if (opened.length) {\n            let { list } = opened\n            if (this.editing) list = [], opened.forEach(item => this.list.every(leaf => !LeafHelper.hasParent(leaf, item)) && list.push(item))\n            list.forEach(item => this.closeGroup(item as IGroup))\n        }\n        if (this.editing && !this.selector.dragging) this.checkDeepSelect()\n    }\n\n    public checkDeepSelect(): void {\n        let parent: IGroup, { list } = this\n        for (let i = 0; i < list.length; i++) {\n            parent = list[i].parent\n            while (parent && !parent.hitChildren) {\n                this.openGroup(parent)\n                parent = parent.parent\n            }\n        }\n    }\n\n    public emitGroupEvent(type: string, group?: IGroup): void {\n        const event = new EditorGroupEvent(type, { editTarget: group })\n        this.emitEvent(event)\n        if (group) group.emitEvent(event)\n    }\n\n    // inner\n\n    public openInnerEditor(target?: IUI, select?: boolean): void {\n        if (target && select) this.target = target\n        if (this.single) {\n            const editTarget = target || this.element\n            const tag = editTarget.editInner\n            if (tag && EditToolCreator.list[tag]) {\n                this.editTool.unload()\n                this.innerEditing = true\n                this.innerEditor = this.editToolList[tag] || EditToolCreator.get(tag, this)\n                this.innerEditor.editTarget = editTarget\n\n                this.emitInnerEvent(InnerEditorEvent.BEFORE_OPEN)\n                this.innerEditor.load()\n                this.emitInnerEvent(InnerEditorEvent.OPEN)\n            }\n        }\n    }\n\n    public closeInnerEditor(): void {\n        if (this.innerEditing) {\n            this.innerEditing = false\n\n            this.emitInnerEvent(InnerEditorEvent.BEFORE_CLOSE)\n            this.innerEditor.unload()\n            this.emitInnerEvent(InnerEditorEvent.CLOSE)\n\n            this.editTool.load()\n            this.innerEditor = null\n        }\n    }\n\n    public emitInnerEvent(type: string): void {\n        const { innerEditor } = this, { editTarget } = innerEditor\n        const event = new InnerEditorEvent(type, { editTarget, innerEditor })\n        this.emitEvent(event)\n        editTarget.emitEvent(event)\n    }\n\n    // lock\n\n    public lock(): void {\n        this.list.forEach(leaf => leaf.locked = true)\n        this.update()\n    }\n\n    public unlock(): void {\n        this.list.forEach(leaf => leaf.locked = false)\n        this.update()\n    }\n\n    // level\n\n    public toTop(): void {\n        if (this.list.length) {\n            EditorHelper.toTop(this.list)\n            this.leafList.update()\n        }\n    }\n\n    public toBottom(): void {\n        if (this.list.length) {\n            EditorHelper.toBottom(this.list)\n            this.leafList.update()\n        }\n    }\n\n    protected onAppRenderStart(app: IApp): void {\n        if (this.targetChanged = app.children.some(leafer => leafer !== this.leafer && leafer.renderer.changed)) this.editBox.forceRender()\n    }\n\n    protected onRenderStart(): void {\n        if (this.targetChanged) this.update()\n    }\n\n    protected onKey(e: KeyEvent): void {\n        updateCursor(this, e)\n    }\n\n    // event \n\n    public listenTargetEvents(): void {\n        if (!this.targetEventIds.length) {\n            const { app, leafer, editBox, editMask } = this\n            this.targetEventIds = [\n                leafer.on_(RenderEvent.START, this.onRenderStart, this),\n                app.on_(RenderEvent.CHILD_START, this.onAppRenderStart, this),\n                app.on_(MoveEvent.BEFORE_MOVE, this.onMove, this, true),\n                app.on_(ZoomEvent.BEFORE_ZOOM, this.onScale, this, true),\n                app.on_(RotateEvent.BEFORE_ROTATE, this.onRotate, this, true),\n                app.on_([KeyEvent.HOLD, KeyEvent.UP], this.onKey, this),\n                app.on_(KeyEvent.DOWN, editBox.onArrow, editBox)\n            ]\n            if (editMask.visible) editMask.forceRender()\n        }\n    }\n\n    public removeTargetEvents(): void {\n        const { targetEventIds, editMask } = this\n        if (targetEventIds.length) {\n            this.off_(targetEventIds)\n            targetEventIds.length = 0\n            if (editMask.visible) editMask.forceRender()\n        }\n    }\n\n    public destroy(): void {\n        if (!this.destroyed) {\n            this.target = this.hoverTarget = null\n\n            Object.values(this.editToolList).forEach(item => item.destroy())\n            this.simulateTarget.destroy()\n\n            this.editToolList = {}\n            this.simulateTarget = this.editTool = this.innerEditor = null\n\n            super.destroy()\n        }\n    }\n\n}","import { LeafList } from '@leafer-ui/draw'\n\nimport { IEditor, IUI } from '@leafer-in/interface'\n\nimport { simulate } from './simulate'\nimport { updateMoveCursor } from './cursor'\nimport { EditorEvent } from '../event/EditorEvent'\n\n\nexport function onTarget(editor: IEditor, oldValue: IUI | IUI[]): void {\n    const { target } = editor\n    if (target) {\n        editor.leafList = target instanceof LeafList ? target : new LeafList(target)\n        if (editor.multiple) simulate(editor) // 更新模拟元素\n    } else {\n        editor.simulateTarget.remove()\n        editor.leafList.reset()\n        editor.closeInnerEditor()\n    }\n\n    editor.emitEvent(new EditorEvent(EditorEvent.SELECT, { editor, value: target, oldValue }))\n    editor.checkOpenedGroups()\n\n    if (editor.editing) {\n        editor.waitLeafer(() => {\n            updateMoveCursor(editor)\n            editor.updateEditTool()\n            editor.update()\n            editor.listenTargetEvents()\n        })\n    } else {\n        editor.updateEditTool()\n        editor.removeTargetEvents()\n    }\n}\n\n\nexport function onHover(editor: IEditor, oldValue: IUI): void {\n    editor.emitEvent(new EditorEvent(EditorEvent.HOVER, { editor, value: editor.hoverTarget, oldValue }))\n}","import { IGroup, IEventListenerId, IUI, IObject } from '@leafer-ui/interface'\nimport { IInnerEditor, IEditor, IEditBox } from '@leafer-in/interface'\n\nimport { Group } from '@leafer-ui/draw'\nimport { EditToolCreator } from './EditToolCreator'\n\nexport class InnerEditor implements IInnerEditor {\n\n    static registerInnerEditor() {\n        EditToolCreator.register(this)\n    }\n\n\n    public get tag() { return 'InnerEditor' }\n\n    public editTarget: IUI\n\n    public config: IObject\n\n    public editor: IEditor\n    public get editBox(): IEditBox { return this.editor.editBox }\n\n    public view: IGroup\n\n    public eventIds: IEventListenerId[]\n\n\n    constructor(editor: IEditor) {\n        this.editor = editor\n        this.create()\n    }\n\n\n    public onCreate(): void { }\n    public create(): void {\n        this.view = new Group()\n        this.onCreate()\n    }\n\n\n    // 状态\n\n    public onLoad(): void { }\n    public load(): void {\n        const { editor } = this\n        if (editor) {\n            if (editor.app) editor.selector.hittable = editor.app.tree.hitChildren = false\n            this.onLoad()\n        }\n    }\n\n    public onUpdate(): void { }\n    public update(): void { this.onUpdate() }\n\n    public onUnload(): void { }\n    public unload(): void {\n        const { editor } = this\n        if (editor) {\n            if (editor.app) editor.selector.hittable = editor.app.tree.hitChildren = true\n            this.onUnload()\n        }\n    }\n\n    public onDestroy(): void { }\n    public destroy(): void {\n        this.onDestroy()\n        if (this.editor) {\n            if (this.view) this.view.destroy()\n            if (this.eventIds) this.editor.off_(this.eventIds)\n            this.editor = this.view = this.eventIds = null\n        }\n    }\n\n}","import { IEditorScaleEvent, IEditorRotateEvent, IEditTool, IEditorSkewEvent, IEditorMoveEvent } from '@leafer-in/interface'\n\nimport { registerEditTool, EditToolCreator } from './EditToolCreator'\nimport { InnerEditor } from './InnerEditor'\n\n\n@registerEditTool()\nexport class EditTool extends InnerEditor implements IEditTool {\n\n    static registerEditTool() {\n        EditToolCreator.register(this)\n    }\n\n\n    public get tag() { return 'EditTool' }\n\n\n    // 操作\n\n    public onMove(e: IEditorMoveEvent): void {\n        const { moveX, moveY, editor } = e\n        const { app, list } = editor\n        app.lockLayout()\n        list.forEach(target => { target.moveWorld(moveX, moveY) })\n        app.unlockLayout()\n    }\n\n    public onScale(e: IEditorScaleEvent): void {\n        const { scaleX, scaleY, transform, worldOrigin, editor } = e\n        const { app, list } = editor\n        app.lockLayout()\n        list.forEach(target => {\n            const resize = editor.getEditSize(target) !== 'scale'\n            if (transform) target.transformWorld(transform, resize)\n            else target.scaleOfWorld(worldOrigin, scaleX, scaleY, resize)\n        })\n        app.unlockLayout()\n    }\n\n    public onRotate(e: IEditorRotateEvent): void {\n        const { rotation, transform, worldOrigin, editor } = e\n        const { app, list } = editor\n        app.lockLayout()\n        list.forEach(target => {\n            const resize = editor.getEditSize(target) !== 'scale'\n            if (transform) target.transformWorld(transform, resize)\n            else target.rotateOfWorld(worldOrigin, rotation)\n        })\n        app.unlockLayout()\n    }\n\n    public onSkew(e: IEditorSkewEvent): void {\n        const { skewX, skewY, transform, worldOrigin, editor } = e\n        const { app, list } = editor\n        app.lockLayout()\n        list.forEach(target => {\n            const resize = editor.getEditSize(target) !== 'scale'\n            if (transform) target.transformWorld(transform, resize)\n            else target.skewOfWorld(worldOrigin, skewX, skewY, resize)\n        })\n        app.unlockLayout()\n    }\n\n    // 状态\n\n    public load(): void {\n        this.editBox.view.visible = true\n        this.onLoad()\n    }\n\n    public update(): void {\n        const { editor, editBox } = this\n        const { x, y, scaleX, scaleY, rotation, skewX, skewY, width, height } = editor.element.getLayoutBounds('box', editor, true)\n        editBox.set({ x, y, scaleX, scaleY, rotation, skewX, skewY })\n        editBox.update({ x: 0, y: 0, width, height })\n        this.onUpdate()\n    }\n\n    public unload(): void {\n        this.editBox.view.visible = false\n        this.onUnload()\n    }\n\n}","import { IEditorScaleEvent, ILine, IEditorSkewEvent, IPointData, IAround, IPathCommandData, IFromToData, IUI, IDragEvent } from '@leafer-in/interface'\n\nimport { getPointData, Direction9, PointHelper } from '@leafer-ui/draw'\n\nimport { EditTool } from './EditTool'\nimport { registerEditTool } from './EditToolCreator'\n\n\nconst { left, right } = Direction9\nconst { move, copy, toNumberPoints } = PointHelper\n\n@registerEditTool()\nexport class LineEditTool extends EditTool {\n\n    public get tag() { return 'LineEditTool' }\n\n    public scaleOfEvent = true\n\n    onScaleWithDrag(e: IEditorScaleEvent): void {\n        const { drag, direction, lockRatio, around } = e\n        const line = e.target as ILine\n        const isDragFrom = direction === left\n\n        if (line.pathInputed) {\n\n            const { path } = line.__\n            const { from, to } = this.getFromToByPath(path)\n\n            this.dragPoint(from, to, isDragFrom, around, this.getInnerMove(line, drag, lockRatio))\n\n            path[1] = from.x, path[2] = from.y\n            path[4] = to.x, path[5] = to.y\n            line.path = path\n\n        } else if (line.points) {\n\n            const { points } = line\n            const { from, to } = this.getFromToByPoints(points)\n\n            this.dragPoint(from, to, isDragFrom, around, this.getInnerMove(line, drag, lockRatio))\n\n            points[0] = from.x, points[1] = from.y\n            points[2] = to.x, points[3] = to.y\n            line.points = points\n\n        } else {\n\n            const from = getPointData()\n            const { toPoint } = line\n            line.rotation = 0\n\n            this.dragPoint(from, toPoint, isDragFrom, around, this.getInnerMove(line, drag, lockRatio))\n\n            line.getLocalPointByInner(from, null, null, true)\n            line.getLocalPointByInner(toPoint, null, null, true)\n            line.x = from.x\n            line.y = from.y\n\n            line.getInnerPointByLocal(toPoint, null, null, true)\n            line.toPoint = toPoint\n\n        }\n\n    }\n\n    getInnerMove(ui: IUI, event: IDragEvent, lockRatio: boolean | 'corner'): IPointData {\n        const movePoint = event.getInnerMove(ui)\n        if (lockRatio) Math.abs(movePoint.x) > Math.abs(movePoint.y) ? movePoint.y = 0 : movePoint.x = 0\n        return movePoint\n    }\n\n    getFromToByPath(path: IPathCommandData): IFromToData {\n        return {\n            from: { x: path[1], y: path[2] },\n            to: { x: path[4], y: path[5] }\n        }\n    }\n\n    getFromToByPoints(originPoints: number[] | IPointData[]): IFromToData {\n        const points = toNumberPoints(originPoints)\n        return {\n            from: { x: points[0], y: points[1] },\n            to: { x: points[2], y: points[3] }\n        }\n\n    }\n\n    dragPoint(fromPoint: IPointData, toPoint: IPointData, isDragFrom: boolean, around: IAround, movePoint: IPointData): void {\n        const { x, y } = movePoint\n        if (isDragFrom) {\n            move(fromPoint, x, y)\n            if (around) move(toPoint, -x, -y)\n        } else {\n            if (around) move(fromPoint, -x, -y)\n            move(toPoint, x, y)\n        }\n    }\n\n    onSkew(_e: IEditorSkewEvent): void {\n\n    }\n\n    onUpdate() {\n        const { editBox } = this, { rotatePoints, resizeLines, resizePoints, rect } = editBox\n        const line = this.editor.element as ILine\n\n        let fromTo: IFromToData, leftOrRight: boolean\n        if (line.pathInputed) fromTo = this.getFromToByPath(line.__.path)\n        else if (line.points) fromTo = this.getFromToByPoints(line.__.points)\n\n        if (fromTo) {\n            const { from, to } = fromTo\n            line.innerToWorld(from, from, false, editBox)\n            line.innerToWorld(to, to, false, editBox)\n            rect.pen.clearPath().moveTo(from.x, from.y).lineTo(to.x, to.y)\n            copy(resizePoints[7] as IPointData, from)\n            copy(rotatePoints[7] as IPointData, from)\n            copy(resizePoints[3] as IPointData, to)\n            copy(rotatePoints[3] as IPointData, to)\n        }\n\n        for (let i = 0; i < 8; i++) {\n            if (i < 4) resizeLines[i].visible = false\n            leftOrRight = i === left || i === right\n            resizePoints[i].visible = leftOrRight\n            rotatePoints[i].visible = fromTo ? false : leftOrRight\n        }\n    }\n\n}","export { Editor } from './Editor'\n\nexport { EditBox } from './display/EditBox'\nexport { EditPoint } from './display/EditPoint'\nexport { EditSelect } from './display/EditSelect'\nexport { SelectArea } from './display/SelectArea'\nexport { Stroker } from './display/Stroker'\n\n\nexport { EditorEvent } from './event/EditorEvent'\nexport { EditorMoveEvent } from './event/EditorMoveEvent'\nexport { EditorScaleEvent } from './event/EditorScaleEvent'\nexport { EditorRotateEvent } from './event/EditorRotateEvent'\nexport { EditorSkewEvent } from './event/EditorSkewEvent'\nexport { EditorGroupEvent } from './event/EditorGroupEvent'\nexport { InnerEditorEvent } from './event/InnerEditorEvent'\n\nexport { EditToolCreator, registerEditTool, registerInnerEditor } from './tool/EditToolCreator'\nexport { InnerEditor } from './tool/InnerEditor'\nexport { EditTool } from './tool/EditTool'\nexport { LineEditTool } from './tool/LineEditTool'\n\nexport { EditorHelper } from './helper/EditorHelper'\nexport { EditDataHelper } from './helper/EditDataHelper'\nexport { EditSelectHelper } from './helper/EditSelectHelper'\n\n\nimport { IEditor, IEditorConfig, IEditToolFunction, IEditorConfigFunction } from '@leafer-in/interface'\nimport { Creator, UI, Group, Text, Box, dataType, Plugin } from '@leafer-ui/draw'\n\nimport '@leafer-in/resize'\n\nimport { Editor } from './Editor'\n\n\nPlugin.add('editor', 'resize')\n\n\nCreator.editor = function (options?: IEditorConfig): IEditor { return new Editor(options) }\n\nBox.addAttr('textBox', false, dataType)\n\nUI.addAttr('editConfig', undefined, dataType)\nUI.addAttr('editOuter', (ui: UI) => ui.__.__isLinePath ? 'LineEditTool' : 'EditTool', dataType)\n\nUI.addAttr('editInner', 'PathEditor', dataType)\nGroup.addAttr('editInner', '', dataType)  // 必须设为空\nText.addAttr('editInner', 'TextEditor', dataType)\n\nUI.setEditConfig = function (config: IEditorConfig | IEditorConfigFunction): void { this.changeAttr('editConfig', config) }\nUI.setEditOuter = function (toolName: string | IEditToolFunction): void { this.changeAttr('editOuter', toolName) }\nUI.setEditInner = function (editorName: string | IEditToolFunction): void { this.changeAttr('editInner', editorName) }"],"names":["__decorate","decorators","target","key","desc","d","c","arguments","length","r","Object","getOwnPropertyDescriptor","Reflect","decorate","i","defineProperty","toList","value","Array","SuppressedError","EditorEvent","Event","list","this","oldList","oldValue","constructor","type","data","super","assign","BEFORE_SELECT","SELECT","BEFORE_HOVER","HOVER","EditorMoveEvent","BEFORE_MOVE","MOVE","EditorScaleEvent","BEFORE_SCALE","SCALE","EditorRotateEvent","BEFORE_ROTATE","ROTATE","EditorSkewEvent","targetAttr","fn","privateKey","defineKey","get","set","old","config","isSelect","locked","splice","beforeSelect","check","hasEvent","emitEvent","editor","BEFORE_SKEW","SKEW","abs","Math","copy","scale","MatrixHelper","setListWithFn","BoundsHelper","worldBounds","LeafBoundsHelper","matrix","getMatrixData","bounds","getBoundsData","Stroker","UI","visible","hittable","strokeAlign","setTarget","style","update","__draw","canvas","options","leaf","__","stroke","strokeWidth","fill","worldTransform","worldRenderBounds","width","height","hit","aScaleX","scaleX","aScaleY","scaleY","half","setWorld","beginPath","x","y","__layout","boxBounds","rect","__useArrow","__drawPath","__pathForRender","__drawRenderPath","__drawPathByBox","Paint","strokes","fills","destroy","stroker","prototype","SelectArea","Group","strokeArea","Rect","fillArea","addMany","setStyle","userStyle","reset","opacity","setBounds","EditSelectHelper","findOne","path","find","editable","findByBounds","branch","eachFind","children","child","len","__world","isBranch","hitChildren","hitSelf","push","isFrame","includes","EditSelect","dragging","originList","running","mergeConfig","selector","isMoveMode","app","interaction","moveMode","hoverStroker","targetStroker","Bounds","selectArea","__eventIds","__listenEvents","onHover","hover","hoverStyle","hoverTarget","onSelect","selectedStyle","max","onPointerMove","e","canHover","findUI","hasItem","onBeforeDown","multiTouch","select","mobile","waitSelect","checkAndSelect","onTap","needRemoveItem","removeItem","allowSelect","isMultipleSelect","addItem","allow","shiftKey","onDragStart","allowDrag","area","getInnerPoint","leafList","clone","onDrag","onDragEnd","total","getInnerTotal","dragBounds","unsign","LeafList","selectList","forEach","item","has","some","index","onAutoMove","getLocalMove","leafer","boxSelect","multipleSelect","draggable","editing","middle","findDeepOne","exclude","editBox","findPath","continuousSelect","waitLeafer","proxy","on_","PointerEvent","BEFORE_DOWN","TAP","DragEvent","START","DRAG","END","MoveEvent","ZoomEvent","ZOOM","__removeListenEvents","off_","topLeft","top","topRight","right","bottomRight","bottom","bottomLeft","left","Direction9","toPoint","AroundHelper","within","MathHelper","EditDataHelper","getScaleData","element","startBounds","direction","totalMove","lockRatio","around","flipable","scaleMode","align","origin","widthRange","heightRange","worldBoxBounds","originChangedScaleX","originChangedScaleY","signX","signY","changedScaleX","changedScaleY","topScale","rightScale","bottomScale","leftScale","sqrt","useScaleX","useScaleY","allowBounds","parent","localBounds","__localBoxBounds","scaleOf","getLocalPointByInner","realBounds","getIntersect","fitScaleX","fitScaleY","nowWidth","nowHeight","min","getRotateData","current","last","rotation","PointHelper","getRotation","getSkewData","move","skewX","skewY","getAround","altKey","getRotateDirection","totalDirection","round","getFlipDirection","flipedX","flipedY","cacheCursors","updateCursor","point","enterPoint","name","pointType","cursor","resizeCursor","rotateCursor","skewCursor","resizeable","rotateable","skewable","flippedX","flippedY","showResize","metaKey","ctrlKey","formatRotation","url","toDataURL","updateMoveCursor","moveCursor","moveable","undefined","svg","encodeURIComponent","replace","toString","EditPoint","Box","fourDirection","editConfig","EditBox","flipped","flippedOne","view","hitFill","hitStroke","hitRadius","circle","buttons","resizePoints","rotatePoints","resizeLines","dragStartData","create","rotatePoint","resizeLine","resizePoint","arounds","listenPointEvents","add","load","single","pointsStyle","getPointsStyle","middlePointsStyle","getMiddlePointsStyle","resizeP","getPointStyle","syncEventer","bottomList","multiple","editMask","middlePoint","hideOnSmall","mask","worldOpacity","smallSize","showPoints","rotateP","resizeL","directionData","floor","layoutCircle","layoutButtons","circleDirection","circleMargin","buttonsMargin","buttonsDirection","indexOf","setButtonPosition","buttonsFixed","useMiddlePoint","useX","sign","margin","unload","pointFill","pointSize","pointRadius","defaultStyle","cornerRadius","offsetX","offsetY","dragPoint","moving","hideOnMove","getLayoutBounds","ResizeEvent","resizingKeys","keys","onRotate","onScale","onSkew","onArrow","keyEvent","distance","code","onDoubleTap","openInner","onLongPress","editInner","textBox","Text","openInnerEditor","openGroup","LEAVE","ENTER","onMove","DOUBLE_TAP","LONG_PRESS","bigBounds","EditMask","__updateWorldBounds","__local","mergedConfig","fillWorld","saveBlendMode","__renderShape","__box","restoreBlendMode","filterStyle","editSize","rotateGap","simulate","simulateTarget","zoomLayer","safeChange","getBounds","order","a","b","reverseOrder","EditorHelper","group","userGroup","sort","addAt","matrx","Matrix","divideParent","setTransform","lockLayout","dropTo","unlockLayout","ungroup","ungroupList","isBranchLeaf","remove","toTop","toBottom","debug","Debug","registerEditTool","EditToolCreator","register","registerInnerEditor","EditTool","tag","repeat","InnerEditorEvent","BEFORE_OPEN","OPEN","BEFORE_CLOSE","CLOSE","EditorGroupEvent","BEFORE_GROUP","GROUP","BEFORE_UNGROUP","UNGROUP","updateMatrix","LeafHelper","checkMap","SimulateElement","__tag","checkChange","canChange","on","PropertyEvent","CHANGE","event","attrName","newValue","addValue","oldMatrix","rotationChange","changedTransform","divide","rotateOf","skewOf","changeFn","Editor","dragHoverExclude","groupOpening","openedGroupList","userConfig","editToolList","targetEventIds","DataHelper","default","Plugin","cancel","shiftItem","innerEditing","innerEditor","editTool","updateEditBox","updateEditTool","tool","editOuter","getEditSize","_ui","moveType","stop","totalX","totalY","getValidMove","getBoxPoint","onScaleWithDrag","drag","scaleWithDrag","RotateEvent","float","getGapRotation","getInnerMove","checkTransform","beforeMove","world","getWorldPointByLocal","moveX","moveY","beforeScale","worldOrigin","getWorldPoint","_resize","getWorldOrigin","transform","getChangedTransform","flip","axis","getFlipTransform","beforeRotate","beforeSkew","getInnerOrigin","func","emitGroupEvent","closeGroup","checkOpenedGroups","opened","every","hasParent","checkDeepSelect","editTarget","emitInnerEvent","closeInnerEditor","lock","unlock","onAppRenderStart","targetChanged","renderer","changed","forceRender","onRenderStart","onKey","listenTargetEvents","RenderEvent","CHILD_START","BEFORE_ZOOM","KeyEvent","HOLD","UP","DOWN","removeTargetEvents","destroyed","values","isNull","InnerEditor","onCreate","onLoad","tree","onUpdate","onUnload","onDestroy","eventIds","moveWorld","resize","transformWorld","scaleOfWorld","rotateOfWorld","skewOfWorld","toNumberPoints","LineEditTool","scaleOfEvent","line","isDragFrom","pathInputed","from","to","getFromToByPath","points","getFromToByPoints","getPointData","getInnerPointByLocal","ui","movePoint","originPoints","fromPoint","_e","fromTo","leftOrRight","innerToWorld","pen","clearPath","moveTo","lineTo","Creator","addAttr","dataType","__isLinePath","setEditConfig","changeAttr","setEditOuter","toolName","setEditInner","editorName"],"mappings":"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","x_google_ignoreList":[0]}