{"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/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/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/tool/TransformTool.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    static AFTER_SELECT = 'editor.after_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 { 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                            if ((this as IEditor).single) (this as IEditor).element.syncEventer = null // 重置 EditBox.load() 设置\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, editBox } = this, mergeConfig = { ...config } // 实时合并，后期可优化\n                if (element && element.editConfig) Object.assign(mergeConfig, element.editConfig) // 元素上的配置\n                if (editBox.config) Object.assign(mergeConfig, editBox.config) // EditBox 上的配置\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        if (style) this.set(style)\n        this.target = target\n        this.update()\n    }\n\n    public update(style?: IRectInputData): void {\n        const { list } = this\n        if (list.length) {\n            setListWithFn(bounds, list, worldBounds)\n            if (style) this.set(style)\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            this.targetStroker.setTarget(this.editor.list)\n            this.hoverStroker.target = null\n        }\n    }\n\n    public update(): void {\n        this.hoverStroker.update()\n\n        const { stroke, strokeWidth, selectedStyle } = this.editor.mergedConfig\n        this.targetStroker.update({ stroke, strokeWidth: strokeWidth && Math.max(1, strokeWidth / 2), ...(selectedStyle || {}) })\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_([\n                    [EditorEvent.HOVER, this.onHover, this],\n                    [EditorEvent.SELECT, this.onSelect, this]\n                ]),\n\n                app.on_([\n                    [PointerEvent.MOVE, this.onPointerMove, this],\n                    [PointerEvent.BEFORE_DOWN, this.onBeforeDown, this],\n                    [PointerEvent.TAP, this.onTap, this],\n\n                    [DragEvent.START, this.onDragStart, this, true], // 采用捕获事件，需要比EditBox中的dragStart早触发\n                    [DragEvent.DRAG, this.onDrag, this],\n                    [DragEvent.END, this.onDragEnd, this],\n\n                    [MoveEvent.MOVE, this.onAutoMove, this],\n                    [[ZoomEvent.ZOOM, MoveEvent.MOVE], () => { this.editor.hoverTarget = null }],\n                ])\n            ]\n\n        })\n    }\n\n    protected __removeListenEvents(): void {\n        this.off_(this.__eventIds)\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(target: 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 } = target\n        const { width, height } = startBounds\n\n        if (around) {\n            totalMove.x *= 2\n            totalMove.y *= 2\n        }\n\n\n        // 获取已经改变的比例\n        const originChangedScaleX = target.scaleX / startBounds.scaleX\n        const originChangedScaleY = target.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 } = target\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' ? target.parent.boxBounds : dragBounds\n            const childBounds = new Bounds(target.__localBoxBounds)\n\n            if (BoundsHelper.includes(new Bounds(allowBounds).spread(0.1), childBounds)) {\n\n                childBounds.scaleOf(target.getLocalPointByInner(origin), scaleX, scaleY)\n\n                if (!BoundsHelper.includes(allowBounds, childBounds)) {\n                    const realBounds = childBounds.getIntersect(allowBounds)\n                    const fitScaleX = realBounds.width / childBounds.width, fitScaleY = realBounds.height / childBounds.height\n                    if (useScaleX) scaleX *= fitScaleX\n                    if (useScaleY) scaleY *= fitScaleY // 后续需优化带旋转的场景\n                }\n            }\n        }\n\n        if (useScaleX && widthRange) {\n            const nowWidth = boxBounds.width * target.scaleX\n            scaleX = within(nowWidth * scaleX, widthRange) / nowWidth\n        }\n\n        if (useScaleY && heightRange) {\n            const nowHeight = boxBounds.height * target.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(target: IUI, 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, target.boxBounds, origin, true)\n\n        return { origin, rotation: PointHelper.getRotation(last, target.getWorldPointByBox(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 { IEditBox } from '@leafer-in/interface'\nimport { MathHelper } from '@leafer-ui/draw'\n\nimport { EditDataHelper } from '../helper/EditDataHelper'\n\n\nconst cacheCursors: IObject = {}\n\nexport function updatePointCursor(editBox: IEditBox, e: IUIEvent): void {\n    const { enterPoint: point, dragging, skewing, resizing, flippedX, flippedY } = editBox\n    if (!point || !editBox.editor.editing || !editBox.canUse) 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 { pointType } = point, { resizeCursor, rotateCursor, skewCursor, resizeable, rotateable, skewable } = editBox.mergeConfig\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 = dragging\n        ? (skewing ? skewCursor : (resizing ? resizeCursor : rotateCursor))\n        : (showSkew ? skewCursor : (showResize ? resizeCursor : rotateCursor))\n\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(editBox: IEditBox): void {\n    const { moveCursor, moveable } = editBox.mergeConfig\n    if (editBox.canUse) 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, IEditPointInputData, IEditPointType } from '@leafer-in/interface'\n\n\nexport class EditPoint extends Box implements IEditPoint {\n\n    public direction: Direction9\n    public pointType: IEditPointType\n\n    constructor(data: IEditPointInputData) {\n        super(data)\n        this.useFastShadow = true\n    }\n\n}","import { IRect, IEventListenerId, IBoundsData, IPointData, IKeyEvent, IGroup, IBox, IBoxInputData, IAlign, IUI, IEditorConfig, IEditorDragStartData, IEventParams, ITransformTool } from '@leafer-ui/interface'\nimport { Group, Box, Text, AroundHelper, Direction9, ResizeEvent, BoundsHelper } from '@leafer-ui/draw'\nimport { DragEvent, PointerEvent, KeyEvent, RotateEvent, ZoomEvent, MoveEvent } from '@leafer-ui/core'\n\nimport { IEditBox, IEditor, IEditPoint, IEditPointType } from '@leafer-in/interface'\n\nimport { updatePointCursor, updateMoveCursor } from '../editor/cursor'\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\n    public dragging: boolean\n    public gesturing: boolean\n\n    public moving: boolean\n    public resizing: boolean\n    public rotating: boolean\n    public skewing: 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    public config: IEditorConfig\n    public mergedConfig: IEditorConfig\n\n    public get mergeConfig(): IEditorConfig {\n        const { config } = this, { mergeConfig, editBox } = this.editor\n        return this.mergedConfig = config && (editBox !== this) ? { ...mergeConfig, ...config } : mergeConfig // 可能会出现多个editBox的情况\n    }\n\n    protected _target: IUI\n    public get target(): IUI { return this._target || this.editor.element } // 操作的元素，默认为editor.element\n    public set target(target: IUI) { this._target = target }\n\n    public get single(): boolean { return !!this._target || this.editor.single }\n\n    protected _transformTool: ITransformTool\n    public get transformTool(): ITransformTool { return this._transformTool || this.editor }\n    public set transformTool(tool: ITransformTool) { this._transformTool = tool }\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    public get canUse(): boolean { return (this.visible && this.view.visible) as boolean } // 编辑框是否处于激活状态\n    public get canGesture(): boolean { // 是否支持手势\n        if (!this.canUse) return false\n        const { moveable, resizeable, rotateable } = this.mergeConfig\n        return typeof moveable === 'string' || typeof resizeable === 'string' || typeof rotateable === 'string'\n    }\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\n    public load(): void {\n        const { target, mergeConfig, single, 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            resizeP.rotation = ((i - (i % 2 ? 1 : 0)) / 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\n        const syncEventer = single && this.transformTool.editTool\n\n        // 编辑框作为底部虚拟元素， 在 unload() 中重置\n        rect.hittable = !syncEventer\n        rect.syncEventer = syncEventer && this.editor  // 单选下 rect 的事件不会冒泡，需要手动传递给editor\n\n        if (syncEventer) {\n            target.syncEventer = rect // 在 target 属性装饰中重置\n            this.app.interaction.bottomList = [{ target: rect, proxy: target }]\n        }\n\n        updateMoveCursor(this)\n    }\n\n    public update(): void {\n        const { editor } = this\n        const { x, y, scaleX, scaleY, rotation, skewX, skewY, width, height } = this.target.getLayoutBounds('box', editor, true)\n        this.set({ x, y, scaleX, scaleY, rotation, skewX, skewY })\n        this.updateBounds({ x: 0, y: 0, width, height })\n    }\n\n    public unload(): void {\n        this.visible = false\n        if (this.app) this.rect.syncEventer = this.app.interaction.bottomList = null\n    }\n\n\n    public updateBounds(bounds: IBoundsData): void {\n        const { editMask } = this.editor\n        const { mergeConfig, single, rect, circle, buttons, resizePoints, rotatePoints, resizeLines } = this\n        const { middlePoint, resizeable, rotateable, hideOnSmall, editBox, mask, spread } = mergeConfig\n\n        this.visible = !this.target.locked\n        editMask.visible = mask ? true : 0\n\n        if (spread) BoundsHelper.spread(bounds, spread)\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                        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()\n\n            // rect\n            if (rect.path) rect.path = null // line可能会变成path优先模式\n            rect.set({ ...bounds, visible: single ? editBox : true })\n\n            // buttons\n            buttons.visible = showPoints && buttons.children.length > 0 || 0\n            if (buttons.visible) this.layoutButtons()\n        } else rect.set(bounds) // 需要更新大小\n    }\n\n    protected layoutCircle(): void {\n        const { circleDirection, circleMargin, buttonsMargin, buttonsDirection, middlePoint } = this.mergedConfig\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(): void {\n        const { buttons } = this\n        const { buttonsDirection, buttonsFixed, buttonsMargin, middlePoint } = this.mergedConfig\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 getPointStyle(userStyle?: IBoxInputData): IBoxInputData {\n        const { stroke, strokeWidth, pointFill, pointSize, pointRadius } = this.mergedConfig\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.mergedConfig\n        return point instanceof Array ? point : [point]\n    }\n\n    public getMiddlePointsStyle(): IBoxInputData[] {\n        const { middlePoint } = this.mergedConfig\n        return middlePoint instanceof Array ? middlePoint : (middlePoint ? [middlePoint] : this.getPointsStyle())\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, { target } = this, { moveable, resizeable, rotateable, skewable, hideOnMove } = this.mergeConfig\n\n        // 确定模式\n        if (point.name === 'rect') {\n            moveable && (this.moving = true)\n            editor.opacity = hideOnMove ? 0 : 1 // move\n        } else {\n            if (pointType.includes('rotate') || e.metaKey || e.ctrlKey || !resizeable) {\n                rotateable && (this.rotating = true)\n                if (pointType === 'resize-rotate') resizeable && (this.resizing = true)\n                else if (point.name === 'resize-line') skewable && (this.skewing = true), this.rotating = false\n            } else if (pointType === 'resize') resizeable && (this.resizing = true)\n            if (pointType === 'skew') skewable && (this.skewing = true)\n        }\n\n        dragStartData.x = e.x\n        dragStartData.y = e.y\n        dragStartData.point = { x: target.x, y: target.y } // 用于移动\n        dragStartData.bounds = { ...target.getLayoutBounds('box', 'local') } // 用于resize\n        dragStartData.rotation = target.rotation // 用于旋转\n        if (pointType && pointType.includes('resize')) ResizeEvent.resizingKeys = editor.leafList.keys // 记录正在resize中的元素列表\n    }\n\n    protected onDragEnd(e: DragEvent): void {\n        this.dragPoint = null\n        this.resetDoing()\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 { transformTool, moving, resizing, rotating, skewing } = this\n        if (moving) {\n            transformTool.onMove(e)\n            updateMoveCursor(this)\n        } else if (resizing || rotating || skewing) {\n            const point = e.current as IEditPoint\n            if (point.pointType) this.enterPoint = point// 防止变化\n            if (rotating) transformTool.onRotate(e)\n            if (resizing) transformTool.onScale(e)\n            if (skewing) transformTool.onSkew(e)\n            updatePointCursor(this, e)\n        }\n    }\n\n    protected resetDoing(): void {\n        if (this.canUse) this.dragging = this.gesturing = this.moving = this.resizing = this.rotating = this.skewing = false\n    }\n\n    // 手势控制元素\n\n    public onMove(e: MoveEvent): void {\n        if (this.canGesture && e.moveType !== 'drag') {\n            e.stop()\n            if (typeof this.mergeConfig.moveable === 'string') {\n                this.gesturing = this.moving = true\n                this.transformTool.onMove(e)\n            }\n        }\n    }\n\n    public onScale(e: ZoomEvent): void {\n        if (this.canGesture) {\n            e.stop()\n            if (typeof this.mergeConfig.resizeable === 'string') {\n                this.gesturing = this.resizing = true\n                this.transformTool.onScale(e)\n            }\n        }\n    }\n\n    public onRotate(e: RotateEvent): void {\n        if (this.canGesture) {\n            e.stop()\n            if (typeof this.mergeConfig.rotateable === 'string') {\n                this.gesturing = this.rotating = true\n                this.transformTool.onRotate(e)\n            }\n        }\n    }\n\n    // 键盘\n\n    protected onKey(e: KeyEvent): void {\n        updatePointCursor(this, e)\n    }\n\n    public onArrow(e: IKeyEvent): void {\n        const { editor, transformTool } = this\n        if (this.canUse && editor.editing && this.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) transformTool.move(x, y)\n        }\n    }\n\n\n    protected onDoubleTap(e: PointerEvent): void {\n        const { openInner, preventEditInner } = this.mergeConfig\n        if (openInner === 'double' && !preventEditInner) this.openInner(e)\n    }\n\n    protected onLongPress(e: PointerEvent): void {\n        const { openInner, preventEditInner } = this.mergeConfig\n        if (openInner === 'long' && preventEditInner) this.openInner(e)\n    }\n\n    protected openInner(e: PointerEvent): void {\n        const { editor, target } = this\n        if (this.single) {\n            if (target.locked) return\n            if (target.isBranch && !target.editInner) {\n                if ((target as IBox).textBox) {\n                    const { children } = target\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(target 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        point.direction = direction\n        point.pointType = type\n\n        const events: IEventParams[] = [\n            [DragEvent.START, this.onDragStart, this],\n            [DragEvent.DRAG, this.onDrag, this],\n            [DragEvent.END, this.onDragEnd, this],\n            [PointerEvent.LEAVE, () => { this.enterPoint = null }],\n        ]\n        if (point.name !== 'circle') events.push([PointerEvent.ENTER, (e: PointerEvent) => { this.enterPoint = point, updatePointCursor(this, e) }])\n        this.__eventIds.push(point.on_(events))\n    }\n\n    protected __listenEvents(): void {\n        const { rect, editor, __eventIds: events } = this\n\n        events.push(\n            rect.on_([\n                [DragEvent.START, this.onDragStart, this],\n                [DragEvent.DRAG, this.onDrag, this],\n                [DragEvent.END, this.onDragEnd, this],\n\n                [PointerEvent.ENTER, () => updateMoveCursor(this)],\n                [PointerEvent.DOUBLE_TAP, this.onDoubleTap, this],\n                [PointerEvent.LONG_PRESS, this.onLongPress, this]\n            ])\n        )\n\n        this.waitLeafer(() => {\n            events.push(\n                editor.app.on_([\n                    [[KeyEvent.HOLD, KeyEvent.UP], this.onKey, this],\n                    [KeyEvent.DOWN, this.onArrow, this],\n                    [MoveEvent.BEFORE_MOVE, this.onMove, this, true],\n                    [ZoomEvent.BEFORE_ZOOM, this.onScale, this, true],\n                    [RotateEvent.BEFORE_ROTATE, this.onRotate, this, true],\n                    [MoveEvent.END, this.resetDoing, this],\n                    [ZoomEvent.END, this.resetDoing, this],\n                    [RotateEvent.END, this.resetDoing, this],\n                ])\n            )\n        })\n    }\n\n    protected __removeListenEvents(): void {\n        this.off_(this.__eventIds)\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            options = { ...options, shape: true }\n            editor.list.forEach(item => {\n                item.__render(canvas, options)\n                const { parent } = item\n                if (parent && (parent as IBox).textBox) parent.__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 { 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 // 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 { 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 { IEvent, IPointData, IAlign, IAxis, IFunction, IMatrix } from '@leafer-ui/interface'\nimport { MathHelper, Matrix, LeafHelper, AroundHelper } from '@leafer-ui/draw'\nimport { DragEvent, RotateEvent, ZoomEvent, MoveEvent } from '@leafer-ui/core'\n\nimport { IEditBox, IEditPoint, IEditTool, IEditorScaleEvent, 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 { EditDataHelper } from '../helper/EditDataHelper'\nimport { ITransformTool } from '@leafer-ui/interface'\n\nexport class TransformTool implements ITransformTool { // Editor use\n\n    public editBox: IEditBox\n\n    public editTool?: IEditTool // 可能不存在值\n\n\n    // operate\n\n    public onMove(e: DragEvent | MoveEvent): void {\n\n        const { target, dragStartData } = this.editBox\n\n        if (e instanceof MoveEvent) {\n\n            const move = e.getLocalMove(target)\n            this.move(move.x, move.y)\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(target, dragStartData.point, total))\n\n        }\n    }\n\n    public onScale(e: DragEvent | ZoomEvent): void {\n\n        const { target, mergeConfig, single, dragStartData } = this.editBox\n        let { around, lockRatio, flipable, editSize } = mergeConfig\n\n        if (e instanceof ZoomEvent) {\n\n            this.scaleOf(target.getBoxPoint(e), e.scale, e.scale)\n\n        } else {\n\n            const { direction } = e.current as IEditPoint\n            if (e.shiftKey || target.lockRatio) lockRatio = true\n\n            const data = EditDataHelper.getScaleData(target, dragStartData.bounds, direction, e.getInnerTotal(target), lockRatio, EditDataHelper.getAround(around, e.altKey), flipable, !single || editSize === 'scale')\n\n            if (this.editTool && 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\n        const { target, mergeConfig, dragStartData } = this.editBox\n        const { around, rotateAround, rotateGap } = mergeConfig\n        const { direction } = e.current as IEditPoint\n\n        let origin: IPointData, rotation: number\n\n        if (e instanceof RotateEvent) {\n\n            rotation = e.rotation\n            origin = rotateAround ? AroundHelper.getPoint(rotateAround, target.boxBounds) : target.getBoxPoint(e)\n\n        } else {\n\n            const data = EditDataHelper.getRotateData(target, direction, e, dragStartData, e.shiftKey ? null : (rotateAround || target.around || target.origin || around || 'center'))\n            rotation = dragStartData.rotation + data.rotation - target.rotation\n            origin = data.origin\n\n        }\n\n        rotation = MathHelper.float(MathHelper.getGapRotation(rotation, rotateGap, target.rotation), 2)\n        if (!rotation) return\n\n        this.rotateOf(origin, rotation)\n    }\n\n    public onSkew(e: DragEvent): void {\n\n        const { target, mergeConfig } = this.editBox\n        const { around } = mergeConfig\n\n        const { origin, skewX, skewY } = EditDataHelper.getSkewData(target.boxBounds, (e.current as IEditPoint).direction, e.getInnerMove(target), 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 { target, mergeConfig, single, editor } = this.editBox\n        const { beforeMove } = 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 (!single) (target as ISimulateElement).safeChange(() => target.move(x, y))\n        const data: IEditorMoveEvent = { target, editor, 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.doMove(event)\n        this.emitEvent(event)\n    }\n\n    public scaleWithDrag(data: IEditorScaleEvent): void {\n        if (!this.checkTransform('resizeable')) return\n\n        const { target, mergeConfig, editor } = this.editBox\n        const { beforeScale } = 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, 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    public scaleOf(origin: IPointData | IAlign, scaleX: number, scaleY = scaleX, _resize?: boolean): void {\n        if (!this.checkTransform('resizeable')) return\n\n        const { target, mergeConfig, single, editor } = this.editBox\n\n        const { beforeScale } = 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 = !single && this.getChangedTransform(() => (target as ISimulateElement).safeChange(() => target.scaleOf(origin, scaleX, scaleY)))\n        const data: IEditorScaleEvent = { target, editor, worldOrigin, scaleX, scaleY, transform }\n\n        this.emitEvent(new EditorScaleEvent(EditorScaleEvent.BEFORE_SCALE, data))\n        const event = new EditorScaleEvent(EditorScaleEvent.SCALE, data)\n        this.doScale(event)\n        this.emitEvent(event)\n    }\n\n    public flip(axis: IAxis): void {\n        if (!this.checkTransform('resizeable')) return\n\n        const { target, single, editor } = this.editBox\n\n        const worldOrigin = this.getWorldOrigin('center')\n        const transform = !single ? this.getChangedTransform(() => (target as ISimulateElement).safeChange(() => target.flip(axis))) : new Matrix(LeafHelper.getFlipTransform(target, axis))\n        const data: IEditorScaleEvent = { target, editor, 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.doScale(event)\n        this.emitEvent(event)\n    }\n\n    public rotateOf(origin: IPointData | IAlign, rotation: number): void {\n        if (!this.checkTransform('rotateable')) return\n\n        const { target, mergeConfig, single, editor } = this.editBox\n\n        const { beforeRotate } = 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 = !single && this.getChangedTransform(() => (target as ISimulateElement).safeChange(() => target.rotateOf(origin, rotation)))\n        const data: IEditorRotateEvent = { target, editor, worldOrigin, rotation, transform }\n\n        this.emitEvent(new EditorRotateEvent(EditorRotateEvent.BEFORE_ROTATE, data))\n        const event = new EditorRotateEvent(EditorRotateEvent.ROTATE, data)\n        this.doRotate(event)\n        this.emitEvent(event)\n    }\n\n    public skewOf(origin: IPointData | IAlign, skewX: number, skewY = 0, _resize?: boolean): void {\n        if (!this.checkTransform('skewable')) return\n\n        const { target, mergeConfig, single, editor } = this.editBox\n\n        const { beforeSkew } = 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 = !single && this.getChangedTransform(() => (target as ISimulateElement).safeChange(() => target.skewOf(origin, skewX, skewY)))\n        const data: IEditorSkewEvent = { target, editor, worldOrigin, skewX, skewY, transform }\n\n        this.emitEvent(new EditorSkewEvent(EditorSkewEvent.BEFORE_SKEW, data))\n        const event = new EditorSkewEvent(EditorSkewEvent.SKEW, data)\n        this.doSkew(event)\n        this.emitEvent(event)\n    }\n\n\n    // do\n\n    protected doMove(event: IEditorMoveEvent) {\n        this.editTool.onMove(event)\n    }\n\n    protected doScale(event: IEditorScaleEvent): void {\n        this.editTool.onScale(event)\n    }\n\n    protected doRotate(event: IEditorRotateEvent): void {\n        this.editTool.onRotate(event)\n    }\n\n    protected doSkew(event: IEditorSkewEvent): void {\n        this.editTool.onSkew(event)\n    }\n\n    // helper\n\n    public checkTransform(type: 'moveable' | 'resizeable' | 'rotateable' | 'skewable'): boolean {\n        const { target, mergeConfig } = this.editBox\n        return target && !target.locked && mergeConfig[type] as boolean\n    }\n\n    protected getWorldOrigin(origin: IPointData | IAlign): IPointData {\n        const { target } = this.editBox\n        return target.getWorldPoint(LeafHelper.getInnerOrigin(target, origin))\n    }\n\n    protected getChangedTransform(func: IFunction): IMatrix {\n\n        const { target, single } = this.editBox\n        if (!single && !(target as ISimulateElement).canChange) return (target as ISimulateElement).changedTransform\n\n        const oldMatrix = new Matrix(target.worldTransform)\n        func()\n        return new Matrix(target.worldTransform).divide(oldMatrix) // world change transform\n    }\n\n    // need rewrite\n    public emitEvent(event?: IEvent, capture?: boolean): void {\n        this.editBox.editor.emitEvent(event, capture)\n    }\n\n}","import { IGroupInputData, IUI, IEventListenerId, IPointData, ILeafList, IEditSize, IGroup, IObject, IAlign, IAxis, IFunction, IMatrix, IApp } from '@leafer-ui/interface'\nimport { Group, DataHelper, LeafList, RenderEvent, LeafHelper, Direction9, Plugin } from '@leafer-ui/draw'\nimport { DragEvent, RotateEvent, ZoomEvent, MoveEvent, useModule } from '@leafer-ui/core'\n\nimport { IEditBox, IEditPoint, IEditor, IEditorConfig, IEditTool, IEditorScaleEvent, IInnerEditor, ISimulateElement } from '@leafer-in/interface'\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 { simulate } from './editor/simulate'\nimport { EditToolCreator } from './tool/EditToolCreator'\nimport { InnerEditorEvent } from './event/InnerEditorEvent'\nimport { EditorGroupEvent } from './event/EditorGroupEvent'\nimport { SimulateElement } from './display/SimulateElement'\nimport { TransformTool } from './tool/TransformTool'\n\n@useModule(TransformTool, ['editBox', 'editTool', 'emitEvent'])\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 dragPoint(): IEditPoint { return this.editBox.dragPoint }\n\n    public get dragging(): boolean { return this.editBox.dragging }\n    public get gesturing(): boolean { return this.editBox.gesturing } // 手势操作元素中\n\n    public get moving(): boolean { return this.editBox.moving }\n    public get resizing(): boolean { return this.editBox.resizing }\n    public get rotating(): boolean { return this.editBox.rotating }\n    public get skewing(): boolean { return this.editBox.skewing }\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        this.unloadEditTool()\n\n        if (this.editing) {\n            const name = this.element.editOuter || 'EditTool'\n            const tool = this.editTool = this.editToolList[name] = this.editToolList[name] || EditToolCreator.get(name, this)\n            this.editBox.load()\n            tool.load()\n            this.update()\n        }\n    }\n\n    public unloadEditTool(): void {\n        let tool = this.editTool\n        if (tool) {\n            this.editBox.unload()\n            tool.unload()\n            this.editTool = null\n        }\n    }\n\n\n    // get\n\n    public getEditSize(_ui: IUI): IEditSize {\n        return this.mergeConfig.editSize\n    }\n\n\n    // TransformTool will rewrite -----\n\n    // operate \n\n    public onMove(_e: DragEvent | MoveEvent): void { }\n\n    public onScale(_e: DragEvent | ZoomEvent): void { }\n\n    public onRotate(_e: DragEvent | RotateEvent): void { }\n\n    public onSkew(_e: DragEvent): void { }\n\n\n    // transform\n\n    public move(_x: number | IPointData, _y = 0): void { }\n\n    public scaleWithDrag(_data: IEditorScaleEvent): void { }\n\n    override scaleOf(_origin: IPointData | IAlign, scaleX: number, _scaleY = scaleX, _resize?: boolean): void { }\n\n    override flip(_axis: IAxis): void { }\n\n    override rotateOf(_origin: IPointData | IAlign, _rotation: number): void { }\n\n    override skewOf(_origin: IPointData | IAlign, _skewX: number, _skewY = 0, _resize?: boolean): void { }\n\n    public checkTransform(_type: 'moveable' | 'resizeable' | 'rotateable' | 'skewable'): boolean { return undefined }\n\n    protected getWorldOrigin(_origin: IPointData | IAlign): IPointData { return undefined }\n\n    protected getChangedTransform(_func: IFunction): IMatrix { return undefined }\n\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, nameOrSelect?: string | boolean, select?: boolean): void {\n        let name: string\n        if (typeof nameOrSelect === 'string') name = nameOrSelect\n        else if (!select) select = nameOrSelect\n\n        if (target && select) this.target = target\n\n        if (this.single) {\n            const editTarget = target || this.element\n            name || (name = editTarget.editInner)\n            if (name && EditToolCreator.list[name]) {\n                this.editTool.unload()\n                this.innerEditing = true\n                this.innerEditor = this.editToolList[name] = this.editToolList[name] || EditToolCreator.get(name, 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(onlyInnerEditor?: boolean): 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            if (!onlyInnerEditor) this.updateEditTool()\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\n    // event \n\n    public listenTargetEvents(): void {\n        if (!this.targetEventIds.length) {\n            const { app, leafer, editMask } = this\n            this.targetEventIds = [\n                leafer.on_(RenderEvent.START, this.onRenderStart, this),\n                app.on_(RenderEvent.CHILD_START, this.onAppRenderStart, this)\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            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 { 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    }\n\n    editor.closeInnerEditor(true)\n    editor.unloadEditTool()\n\n    const data = { editor, value: target, oldValue }\n    editor.emitEvent(new EditorEvent(EditorEvent.SELECT, data))\n    editor.checkOpenedGroups()\n\n    if (editor.editing) {\n        editor.waitLeafer(() => {\n            editor.updateEditTool()\n            editor.listenTargetEvents()\n        })\n    } else {\n        editor.updateEditTool()\n        editor.removeTargetEvents()\n    }\n\n    editor.emitEvent(new EditorEvent(EditorEvent.AFTER_SELECT, data))\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, IInnerEditorMode } 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 get mode(): IInnerEditorMode { return 'focus' } // 专注模式\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 && this.mode === 'focus') 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 && this.mode === 'focus') 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        this.editBox.update()\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'\nexport { TransformTool } from './tool/TransformTool'\n\n\nexport { EditorHelper } from './helper/EditorHelper'\nexport { EditDataHelper } from './helper/EditDataHelper'\nexport { EditSelectHelper } from './helper/EditSelectHelper'\n\n\nimport { IEditor, IEditorConfig, IEditToolFunction, IEditorConfigFunction, IApp } 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, app?: IApp): IEditor {\n    const editor = new Editor(options)\n    if (app) app.sky.add(app.editor = editor)\n    return editor\n}\n\nBox.addAttr('textBox', false, dataType)\n\nUI.addAttr('editConfig', undefined, dataType)\nUI.addAttr('editOuter', (ui: UI) => { ui.updateLayout(); return ui.__.__isLinePath ? 'LineEditTool' : 'EditTool' }, dataType) // fix: Line 需要更新布局才能精准确定\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","targetAttr","fn","privateKey","defineKey","get","set","old","config","isSelect","locked","splice","single","element","syncEventer","beforeSelect","check","BEFORE_SELECT","BEFORE_HOVER","hasEvent","emitEvent","editor","SELECT","AFTER_SELECT","HOVER","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","mergedConfig","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","MOVE","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","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","childBounds","__localBoxBounds","spread","scaleOf","getLocalPointByInner","realBounds","getIntersect","fitScaleX","fitScaleY","nowWidth","nowHeight","min","getRotateData","current","last","rotation","PointHelper","getRotation","getWorldPointByBox","getSkewData","move","skewX","skewY","getAround","altKey","getRotateDirection","totalDirection","round","getFlipDirection","flipedX","flipedY","cacheCursors","updatePointCursor","enterPoint","point","skewing","resizing","flippedX","flippedY","canUse","name","pointType","cursor","resizeCursor","rotateCursor","skewCursor","resizeable","rotateable","skewable","showResize","metaKey","ctrlKey","showSkew","formatRotation","url","toDataURL","updateMoveCursor","moveCursor","moveable","undefined","svg","encodeURIComponent","replace","toString","EditPoint","Box","useFastShadow","fourDirection","editConfig","EditBox","_target","transformTool","_transformTool","tool","flipped","flippedOne","view","canGesture","hitFill","hitStroke","hitRadius","circle","buttons","resizePoints","rotatePoints","resizeLines","dragStartData","create","rotatePoint","resizeLine","resizePoint","arounds","listenPointEvents","add","load","pointsStyle","getPointsStyle","middlePointsStyle","getMiddlePointsStyle","resizeP","getPointStyle","editTool","bottomList","getLayoutBounds","updateBounds","unload","editMask","middlePoint","hideOnSmall","mask","worldOpacity","smallSize","showPoints","rotateP","resizeL","directionData","floor","layoutCircle","layoutButtons","circleDirection","circleMargin","buttonsMargin","buttonsDirection","indexOf","setButtonPosition","buttonsFixed","useMiddlePoint","useX","sign","margin","pointFill","pointSize","pointRadius","defaultStyle","cornerRadius","offsetX","offsetY","dragPoint","hideOnMove","moving","rotating","ResizeEvent","resizingKeys","keys","resetDoing","onMove","onRotate","onScale","onSkew","gesturing","moveType","stop","onKey","onArrow","keyEvent","distance","code","onDoubleTap","openInner","preventEditInner","onLongPress","editInner","textBox","Text","openInnerEditor","openGroup","events","LEAVE","ENTER","DOUBLE_TAP","LONG_PRESS","KeyEvent","HOLD","UP","DOWN","BEFORE_MOVE","BEFORE_ZOOM","RotateEvent","BEFORE_ROTATE","bigBounds","EditMask","__updateWorldBounds","__local","fillWorld","saveBlendMode","shape","__render","__renderShape","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","EditorMoveEvent","EditorScaleEvent","BEFORE_SCALE","SCALE","EditorRotateEvent","ROTATE","EditorSkewEvent","BEFORE_SKEW","SKEW","TransformTool","totalX","totalY","getValidMove","getBoxPoint","onScaleWithDrag","drag","scaleWithDrag","rotateAround","getPoint","float","getGapRotation","getInnerMove","checkTransform","beforeMove","world","getWorldPointByLocal","moveX","moveY","doMove","beforeScale","worldOrigin","getWorldPoint","_resize","getWorldOrigin","transform","getChangedTransform","doScale","flip","axis","getFlipTransform","beforeRotate","doRotate","beforeSkew","doSkew","getInnerOrigin","func","capture","Editor","dragHoverExclude","groupOpening","openedGroupList","multiple","userConfig","editToolList","targetEventIds","DataHelper","default","Plugin","cancel","shiftItem","innerEditing","innerEditor","updateEditBox","updateEditTool","unloadEditTool","editOuter","getEditSize","_ui","_e","_x","_y","_data","_origin","_scaleY","_axis","_rotation","_skewX","_skewY","_type","_func","emitGroupEvent","closeGroup","checkOpenedGroups","opened","every","hasParent","checkDeepSelect","editTarget","nameOrSelect","emitInnerEvent","closeInnerEditor","onlyInnerEditor","lock","unlock","onAppRenderStart","targetChanged","renderer","changed","forceRender","onRenderStart","listenTargetEvents","RenderEvent","CHILD_START","removeTargetEvents","destroyed","values","isNull","useModule","InnerEditor","mode","eventIds","onCreate","onLoad","tree","onUpdate","onUnload","onDestroy","moveWorld","resize","transformWorld","scaleOfWorld","rotateOfWorld","skewOfWorld","toNumberPoints","LineEditTool","scaleOfEvent","line","isDragFrom","pathInputed","from","to","getFromToByPath","points","getFromToByPoints","getPointData","getInnerPointByLocal","ui","movePoint","originPoints","fromPoint","fromTo","leftOrRight","innerToWorld","pen","clearPath","moveTo","lineTo","Creator","sky","addAttr","dataType","updateLayout","__isLinePath","setEditConfig","changeAttr","setEditOuter","toolName","setEditInner","editorName"],"mappings":"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","x_google_ignoreList":[0]}