@xrubik/fabric-to-leafer-elements 0.0.0-stage → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +28 -2
- package/dist/index.cjs +1102 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +113 -0
- package/dist/index.mjs +1071 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +51 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.js","../src/button.js","../src/utils.js","../src/bar.js","../src/circle.js","../src/layer.js","../src/lib.js","../src/text.js"],"sourcesContent":["// 导入即完成 UI 注册:各模块底部会调用 Button / Bar / Circle / Lib / IText 的 registerUI()。\n// 因此本包在 package.json 中标记了 \"sideEffects\": true,避免仅作副作用导入时被摇掉。\nexport { default as Button } from './button.js'\nexport { default as Bar } from './bar.js'\nexport { default as Circle } from './circle.js'\nexport { default as Layer } from './layer.js'\nexport { default as Lib } from './lib.js'\nexport { default as IText } from './text.js'","import { Box, Rect, Text, Line } from 'leafer-ui'\nimport { normalizeColor } from './utils'\n\nconst DEFAULT_FILL = '#969696'\n// 和 Fabric 一致: 默认字体 Times New Roman, 默认不加粗\nconst DEFAULT_FONT = 'Times New Roman'\nconst DEFAULT_FONT_WEIGHT = 'normal'\n\n// 边框受光关系: 上/左亮, 下/右暗; 按下时两者互换, 形成\"整个按钮压下去\"的倒角错觉。\n// 和 Fabric Button._render 的下陷配色一致(按下时下/右变亮、上/左变暗)。\nconst EDGE_LIGHT = '#ffffff'\nconst EDGE_DARK = '#020000'\nconst EDGE_PRESS_LIGHT = '#EFEFEF'\nconst EDGE_PRESS_DARK = '#5F5F5F'\n\nconst normalizeButtonFill = function(fill, fallback = DEFAULT_FILL) {\n return normalizeColor((fill === '' || fill === null || typeof fill === 'undefined') ? fallback : fill)\n}\n\nconst normalizeButtonTextFill = function(fill) {\n return normalizeColor((fill === '' || fill === null || typeof fill === 'undefined') ? '#000000' : fill)\n}\n\nconst toTextWrap = function(wordWrap) {\n // 和文本转换同一条规则: 空值 / none / word 都是不换行, 只有 char 才按字符换行\n if (wordWrap === 'char') return 'break'\n return 'none'\n}\n\nconst toWordWrap = function(textWrap) {\n if (textWrap === 'break') return 'char'\n if (textWrap === 'none') return 'none'\n return 'word'\n}\n\nconst requestRubikRender = function(obj) {\n const leafer = obj && obj.leafer\n if (leafer) {\n leafer.requestRender()\n }\n}\n\nclass Button extends Box {\n get __tag() { return 'Button' }\n\n constructor(data) {\n // eslint-disable-next-line no-unused-vars\n let {\n text,\n fontSize,\n fontWeight,\n fontColor,\n fontFamily,\n fill,\n backgroundColor,\n buttonScaleBaseWidth,\n buttonScaleBaseHeight,\n wordWrap,\n down,\n ...buttonData\n } = data || {}\n if ((fontColor === undefined || fontColor === null) && backgroundColor !== undefined && fill !== undefined && fill !== backgroundColor) {\n fontColor = fill\n }\n super({\n // button: true,\n ...buttonData,\n cursor: 'pointer'\n })\n this.childlessJSON = true\n this.defaultFill = normalizeButtonFill(backgroundColor === undefined ? fill : backgroundColor)\n this.originalFill = this.defaultFill\n this.buttonScaleBaseWidth = buttonScaleBaseWidth || this.width || 0\n this.buttonScaleBaseHeight = buttonScaleBaseHeight || this.height || 0\n this._wordWrap = wordWrap || 'word'\n this._down = !!down\n fontSize = fontSize || 12\n this.fill = this.originalFill\n this.hoverElement = new Rect({\n x: 0,\n y: 0,\n width: this.width,\n height: this.height,\n fill: 'rgba(64,32,125,0.16)',\n stroke: 'transparent',\n strokeWidth: 0,\n visible: false\n })\n this.textElement = new Text({\n text: text,\n fontSize: fontSize,\n fill: normalizeButtonTextFill(fontColor),\n textAlign: 'center',\n verticalAlign: 'middle',\n fontFamily: fontFamily || DEFAULT_FONT,\n textWrap: toTextWrap(this._wordWrap),\n x: 0,\n y: 0,\n width: this.width,\n height: this.height,\n fontWeight: fontWeight || DEFAULT_FONT_WEIGHT\n })\n\n // 上边框\n this.topLine = new Line({\n points: [0, 0, this.width, 0],\n stroke: EDGE_LIGHT,\n strokeWidth: 0.5\n })\n\n // 左边框\n this.leftLine = new Line({\n points: [0, 0, 0, this.height],\n stroke: EDGE_LIGHT,\n strokeWidth: 0.5\n })\n\n // 右边框\n this.rightLine = new Line({\n points: [this.width, 0, this.width, this.height],\n stroke: EDGE_DARK,\n strokeWidth: 0.5\n })\n\n // 下边框\n this.bottomLine = new Line({\n points: [0, this.height, this.width, this.height],\n stroke: EDGE_DARK,\n strokeWidth: 0.5\n })\n\n this.add(this.hoverElement)\n this.add(this.topLine)\n this.add(this.bottomLine)\n this.add(this.rightLine)\n this.add(this.leftLine)\n this.add(this.textElement)\n\n this.updateLayout()\n }\n\n get type() {\n return 'button'\n }\n\n set type(value) {\n this._type = value\n }\n\n get backgroundColor() {\n return this.originalFill\n }\n\n set backgroundColor(value) {\n this.setButtonFill(value)\n }\n\n set(data, transition) {\n if (typeof data === 'string') {\n data = { [data]: transition }\n }\n if (!data || typeof data !== 'object') {\n return super.set(data, transition)\n }\n const hasBackgroundColor = Object.prototype.hasOwnProperty.call(data, 'backgroundColor')\n const hasFill = Object.prototype.hasOwnProperty.call(data, 'fill')\n const next = { ...data }\n if (hasBackgroundColor) {\n delete next.backgroundColor\n }\n if (hasFill) {\n delete next.fill\n }\n if (Object.prototype.hasOwnProperty.call(next, 'wordWrap')) {\n this.wordWrap = next.wordWrap\n delete next.wordWrap\n }\n if (Object.prototype.hasOwnProperty.call(next, 'splitByGrapheme')) {\n if (!Object.prototype.hasOwnProperty.call(data, 'wordWrap')) {\n this.wordWrap = data.splitByGrapheme ? 'char' : this.wordWrap\n }\n delete next.splitByGrapheme\n }\n if (Object.prototype.hasOwnProperty.call(next, 'down')) {\n this.down = !!next.down\n delete next.down\n }\n // 运行态动态/页面参数会通过 set({ text }) 更新按钮文字和字体,\n // 这些属性实际属于内部 textElement, 不能直接交给 Box.set。\n if (Object.prototype.hasOwnProperty.call(next, 'text')) {\n this.text = next.text === undefined || next.text === null ? '' : String(next.text)\n delete next.text\n }\n if (Object.prototype.hasOwnProperty.call(next, 'fontSize')) {\n this.fontSize = next.fontSize\n delete next.fontSize\n }\n if (Object.prototype.hasOwnProperty.call(next, 'fontColor')) {\n this.fontColor = next.fontColor\n delete next.fontColor\n }\n if (Object.prototype.hasOwnProperty.call(next, 'fontFamily')) {\n this.fontFamily = next.fontFamily\n delete next.fontFamily\n }\n if (Object.prototype.hasOwnProperty.call(next, 'fontWeight')) {\n this.fontWeight = next.fontWeight\n delete next.fontWeight\n }\n const result = Object.keys(next).length ? super.set(next, transition) : this\n if (hasBackgroundColor) {\n this.setButtonFill(data.backgroundColor)\n } else if (hasFill) {\n this.setButtonFill(data.fill)\n }\n if (data && (\n Object.prototype.hasOwnProperty.call(data, 'width') ||\n Object.prototype.hasOwnProperty.call(data, 'height') ||\n Object.prototype.hasOwnProperty.call(data, 'strokeWidth')\n )) {\n this.updateLayout()\n }\n return result\n }\n\n setButtonFill(value) {\n this.originalFill = normalizeButtonFill(value, this.defaultFill || DEFAULT_FILL)\n this.fill = this.originalFill\n requestRubikRender(this)\n return this\n }\n\n setButtonScale(key, value) {\n value = typeof value === 'undefined' ? 1 : value\n if (key === 'scaleX') {\n this.width = (this.buttonScaleBaseWidth || this.width || 0) * Math.abs(value)\n } else {\n this.height = (this.buttonScaleBaseHeight || this.height || 0) * Math.abs(value)\n }\n this.updateLayout()\n requestRubikRender(this)\n return this\n }\n\n updateLayout() {\n const width = this.width || 0\n const height = this.height || 0\n const strokeWidth = Math.min(4, Math.max(0.5, Number(this.strokeWidth) || 1))\n this.textElement && this.textElement.set({ width, height })\n this.hoverElement && this.hoverElement.set({ width, height })\n this.topLine && this.topLine.set({ points: [0, 0, width, 0], strokeWidth })\n this.leftLine && this.leftLine.set({ points: [0, 0, 0, height], strokeWidth })\n this.rightLine && this.rightLine.set({ points: [width, 0, width, height], strokeWidth })\n this.bottomLine && this.bottomLine.set({ points: [0, height, width, height], strokeWidth })\n this.updatePressState()\n }\n\n get down() {\n return !!this._down\n }\n\n set down(value) {\n this._down = !!value\n this.updatePressState()\n requestRubikRender(this)\n }\n\n // 运行态唯一的交互状态入口: 悬停/按下一起给, 元素自己不再监听指针事件。\n // Fabric 里被其它图元盖住的按钮也会变色, 所以状态由运行态按穿透目标统一驱动。\n setInteraction(state) {\n const blocked = !!this.disabled\n const hovered = !blocked && !!(state && state.hovered)\n const pressed = !blocked && !!(state && state.pressed)\n if (this._hovered === hovered && this._pressed === pressed) return\n this._hovered = hovered\n this._pressed = pressed\n this.updatePressState()\n requestRubikRender(this)\n }\n\n // 按下 = 文字右下移 1px + 边框倒角翻转 + 悬停遮罩隐藏, 与 Fabric Button 一致\n updatePressState() {\n const pressed = this._down || !!this._pressed\n const lightEdge = pressed ? EDGE_PRESS_DARK : EDGE_LIGHT\n const darkEdge = pressed ? EDGE_PRESS_LIGHT : EDGE_DARK\n if (this.topLine && this.topLine.stroke !== lightEdge) this.topLine.stroke = lightEdge\n if (this.leftLine && this.leftLine.stroke !== lightEdge) this.leftLine.stroke = lightEdge\n if (this.rightLine && this.rightLine.stroke !== darkEdge) this.rightLine.stroke = darkEdge\n if (this.bottomLine && this.bottomLine.stroke !== darkEdge) this.bottomLine.stroke = darkEdge\n if (this.hoverElement) this.hoverElement.visible = !!this._hovered && !pressed\n if (this.textElement) {\n const offset = pressed ? 1 : 0\n this.textElement.x = offset\n this.textElement.y = offset\n }\n }\n\n toJSON(options) {\n const data = super.toJSON(options)\n delete data.children\n data.type = 'button'\n data.text = this.text\n data.fontSize = this.fontSize\n data.fontFamily = this.fontFamily\n data.fontWeight = this.fontWeight\n data.fontColor = this.fontColor\n data.fill = this.originalFill\n data.backgroundColor = this.originalFill\n data.buttonScaleBaseWidth = this.buttonScaleBaseWidth\n data.buttonScaleBaseHeight = this.buttonScaleBaseHeight\n data.wordWrap = this.wordWrap\n data.down = this.down\n return data\n }\n\n get wordWrap() {\n return this._wordWrap || toWordWrap(this.textElement && this.textElement.textWrap)\n }\n\n set wordWrap(value) {\n this._wordWrap = value || 'word'\n if (this.textElement) {\n this.textElement.textWrap = toTextWrap(this._wordWrap)\n requestRubikRender(this)\n }\n }\n\n get text() {\n return this.textElement.text\n }\n\n set text(value) {\n this.textElement.text = value\n requestRubikRender(this)\n }\n\n get fontSize() {\n return this.textElement.fontSize\n }\n\n set fontSize(value) {\n this.textElement.fontSize = value\n }\n\n get fontFamily() {\n return this.textElement.fontFamily\n }\n\n set fontFamily(value) {\n this.textElement.fontFamily = value\n }\n\n get fontColor() {\n return this.textElement.fill\n }\n\n set fontColor(value) {\n this.textElement.fill = normalizeButtonTextFill(value)\n requestRubikRender(this)\n }\n\n get fontWeight() {\n return this.textElement.fontWeight\n }\n\n set fontWeight(value) {\n this.textElement.fontWeight = value\n }\n}\n\nButton.registerUI()\n\nexport default Button\n","export function normalizeColor(color) {\n // 统一颜色为rgba格式\n if (typeof color !== 'string') return color\n const value = color.trim()\n const rgbaHex = value.match(/^#([0-9a-fA-F]{8})$/)\n if (!rgbaHex) return color\n const hex = rgbaHex[1]\n const alpha = parseInt(hex.slice(6, 8), 16)\n if (alpha === 255) return '#' + hex.slice(0, 6)\n const r = parseInt(hex.slice(0, 2), 16)\n const g = parseInt(hex.slice(2, 4), 16)\n const b = parseInt(hex.slice(4, 6), 16)\n return `rgba(${r},${g},${b},${Math.round((alpha / 255) * 1000) / 1000})`\n}\n","import { Box, Path, PropertyEvent, Rect } from 'leafer-ui'\n\nconst clamp = function(value, min, max) {\n value = Number(value) || 0\n return Math.max(min, Math.min(max, value))\n}\n\nconst normalizeFill = function(fill) {\n return (fill === '' || fill === null || typeof fill === 'undefined') ? 'transparent' : fill\n}\n\nconst hasOwn = function(data, key) {\n return data && Object.prototype.hasOwnProperty.call(data, key)\n}\n\nconst requestFrame = function(callback) {\n if (typeof window !== 'undefined' && window.requestAnimationFrame) {\n return window.requestAnimationFrame(callback)\n }\n return setTimeout(() => callback(Date.now()), 16)\n}\n\nconst cancelFrame = function(frameId) {\n if (!frameId) {\n return\n }\n if (typeof window !== 'undefined' && window.cancelAnimationFrame) {\n window.cancelAnimationFrame(frameId)\n } else {\n clearTimeout(frameId)\n }\n}\n\nconst getNow = function() {\n if (typeof performance !== 'undefined' && performance.now) {\n return performance.now()\n }\n return Date.now()\n}\n\nconst requestRubikRender = function(obj) {\n const leafer = obj && obj.leafer\n if (leafer) {\n leafer.requestRender()\n }\n}\n\nclass Bar extends Box {\n get __tag() { return 'Bar' }\n\n constructor(data = {}) {\n const inputData = { ...data }\n delete inputData.children\n delete inputData.tag\n const {\n fill,\n stroke,\n strokeWidth,\n backgroundFill,\n backgroundColor,\n fpct,\n fdir,\n fstyle,\n ...barData\n } = inputData\n super({\n ...barData,\n hitFill: 'all',\n overflow: 'hide',\n cursor: barData.cursor\n })\n this.childlessJSON = true\n this._barFill = normalizeFill(fill)\n this._barStroke = stroke\n this._barStrokeWidth = strokeWidth || 1\n this._backgroundFill = backgroundFill || backgroundColor || 'transparent'\n this._fpct = fpct === undefined ? 0 : Number(fpct) || 0\n this._fdir = Number(fdir) || 0\n this._fstyle = fstyle || 'rect'\n\n this.backgroundElement = new Rect({\n x: 0,\n y: 0,\n width: this.width || 0,\n height: this.height || 0,\n fill: this._backgroundFill,\n stroke: 'transparent',\n strokeWidth: 0\n })\n this.fillElement = new Path({\n fill: this._barFill,\n stroke: 'transparent',\n strokeWidth: 0\n })\n this.strokeElement = new Path({\n fill: 'transparent',\n stroke: this._barStroke,\n strokeWidth: this._barStrokeWidth\n })\n\n this.add(this.backgroundElement)\n this.add(this.fillElement)\n this.add(this.strokeElement)\n this.updateBar()\n // 拖动控制点 / 属性面板改尺寸时, 内部填充条要按新尺寸重新计算\n // 批量 set 时 attrName 可能是 undefined, 这种情况也一并刷新\n this.on(PropertyEvent.CHANGE, (event) => {\n const name = event && event.attrName\n if (!name || name === 'width' || name === 'height') this.updateBar()\n })\n }\n\n get type() {\n return 'bar'\n }\n\n set type(value) {\n this._type = value\n }\n\n get fill() {\n return this._barFill\n }\n\n set fill(value) {\n this._barFill = normalizeFill(value)\n if (this.fillElement) {\n this.fillElement.fill = this._barFill\n }\n }\n\n get stroke() {\n return this._barStroke\n }\n\n set stroke(value) {\n this._barStroke = value\n if (this.strokeElement) {\n this.strokeElement.stroke = value\n }\n }\n\n get strokeWidth() {\n return this._barStrokeWidth\n }\n\n set strokeWidth(value) {\n this._barStrokeWidth = value || 0\n if (this.strokeElement) {\n this.strokeElement.strokeWidth = this._barStrokeWidth\n }\n }\n\n get backgroundFill() {\n return this._backgroundFill\n }\n\n set backgroundFill(value) {\n this._backgroundFill = value || 'transparent'\n if (this.backgroundElement) {\n this.backgroundElement.fill = this._backgroundFill\n }\n }\n\n get backgroundColor() {\n return this._backgroundFill\n }\n\n set backgroundColor(value) {\n this.backgroundFill = value\n }\n\n get fpct() {\n return this._fpct\n }\n\n set fpct(value) {\n this._fpct = Number(value) || 0\n this.updateBar()\n }\n\n get fdir() {\n return this._fdir\n }\n\n set fdir(value) {\n this._fdir = Number(value) || 0\n this.updateBar()\n }\n\n get fstyle() {\n return this._fstyle\n }\n\n set fstyle(value) {\n this._fstyle = value || 'rect'\n this.updateBar()\n }\n\n set(data, transition) {\n if (typeof data === 'string') {\n data = { [data]: transition }\n }\n\n const baseData = { ...(data || {}) }\n if (hasOwn(data, 'fill')) {\n this._barFill = normalizeFill(data.fill)\n delete baseData.fill\n }\n if (hasOwn(data, 'stroke')) {\n this._barStroke = data.stroke\n delete baseData.stroke\n }\n if (hasOwn(data, 'strokeWidth')) {\n this._barStrokeWidth = data.strokeWidth || 0\n delete baseData.strokeWidth\n }\n if (hasOwn(data, 'backgroundFill')) {\n this._backgroundFill = normalizeFill(data.backgroundFill)\n delete baseData.backgroundFill\n }\n if (hasOwn(data, 'backgroundColor')) {\n this._backgroundFill = normalizeFill(data.backgroundColor)\n delete baseData.backgroundColor\n }\n if (hasOwn(data, 'fpct')) {\n this._fpct = Number(data.fpct) || 0\n this.fpctSeted = true\n delete baseData.fpct\n }\n if (hasOwn(data, 'fdir')) {\n this._fdir = Number(data.fdir) || 0\n delete baseData.fdir\n }\n if (hasOwn(data, 'fstyle')) {\n this._fstyle = data.fstyle || 'rect'\n delete baseData.fstyle\n }\n\n const result = super.set(baseData, transition)\n this.updateBar()\n return result\n }\n\n setFpct(value, option = {}) {\n const target = Number(value) || 0\n const loop = (this.leafer && this.leafer.__loop) || 0\n if (option.animate === false || !this.fpctSeted || loop < 4) {\n this.fpctSeted = true\n this.cancelFpctAnimation()\n this._fpct = target\n this.updateBar()\n return this\n }\n return this.animateFpct(target, option)\n }\n\n animateFpct(target, option = {}) {\n const start = Number(this._fpct) || 0\n const duration = Math.max(0, Number(option.duration) || 500)\n if (duration === 0 || start === target) {\n this.cancelFpctAnimation()\n this._fpct = target\n this.updateBar()\n return this\n }\n\n this.fpctSeted = true\n this.cancelFpctAnimation()\n const startTime = getNow()\n const step = (time) => {\n const progress = Math.min(1, (time - startTime) / duration)\n this._fpct = start + (target - start) * progress\n this.updateBar()\n if (progress < 1) {\n this._fpctFrame = requestFrame(step)\n } else {\n this._fpctFrame = null\n }\n }\n this._fpctFrame = requestFrame(step)\n return this\n }\n\n cancelFpctAnimation() {\n cancelFrame(this._fpctFrame)\n this._fpctFrame = null\n }\n\n toJSON(options) {\n const data = super.toJSON(options)\n data.type = 'bar'\n data.fill = this._barFill\n data.stroke = this._barStroke\n data.strokeWidth = this._barStrokeWidth\n data.backgroundFill = this._backgroundFill\n data.backgroundColor = this._backgroundFill\n data.fpct = this._fpct\n data.fdir = this._fdir\n data.fstyle = this._fstyle\n return data\n }\n\n updateBar() {\n if (!this.fillElement || !this.strokeElement || !this.backgroundElement) {\n return\n }\n const width = Math.max(Number(this.width) || 0, 0)\n const height = Math.max(Number(this.height) || 0, 0)\n this.backgroundElement.set({\n x: 0,\n y: 0,\n width,\n height,\n fill: this._backgroundFill\n })\n\n if (this._fstyle === 'circle') {\n this.updateCircleBar(width, height)\n } else {\n this.updateRectBar(width, height)\n }\n requestRubikRender(this)\n }\n\n updateRectBar(width, height) {\n let x = 0\n let y = 0\n let w = width\n let h = height\n let fdir = this._fdir % 5\n if (fdir < 0) {\n fdir += 5\n }\n let fpct = clamp(this._fpct, fdir < 4 ? 0 : -1, 1)\n\n switch (fdir) {\n case 1:\n w = width * fpct\n break\n case 2:\n h = height * fpct\n break\n case 3:\n w = width * fpct\n x = width - w\n break\n case 4:\n if (fpct >= 0) {\n h = height / 2 * fpct\n y = height / 2 - h\n } else {\n h = height / 2 * -fpct\n y = height / 2\n }\n break\n case 0:\n default:\n h = height * fpct\n y = height - h\n break\n }\n\n this.fillElement.set({\n path: this.rectPath(x, y, w, h),\n fill: this._barFill\n })\n this.strokeElement.set({\n path: this.rectPath(0, 0, width, height),\n stroke: this._barStroke,\n strokeWidth: this._barStrokeWidth\n })\n }\n\n updateCircleBar(width, height) {\n const fpct = clamp(this._fpct, 0, 1)\n let fdir = this._fdir % 4\n if (fdir < 0) {\n fdir += 4\n }\n this.fillElement.set({\n path: this.circleFillPath(width, height, fpct, fdir),\n fill: this._barFill\n })\n this.strokeElement.set({\n path: this.ellipsePath(width, height),\n stroke: this._barStroke,\n strokeWidth: this._barStrokeWidth\n })\n }\n\n rectPath(x, y, width, height) {\n if (width <= 0 || height <= 0) {\n return ''\n }\n return `M ${x} ${y} L ${x + width} ${y} L ${x + width} ${y + height} L ${x} ${y + height} Z`\n }\n\n ellipsePath(width, height) {\n if (width <= 0 || height <= 0) {\n return ''\n }\n const rx = width / 2\n const ry = height / 2\n const cx = rx\n const cy = ry\n return `M ${cx - rx} ${cy} A ${rx} ${ry} 0 1 0 ${cx + rx} ${cy} A ${rx} ${ry} 0 1 0 ${cx - rx} ${cy} Z`\n }\n\n circleFillPath(width, height, fpct, fdir) {\n if (width <= 0 || height <= 0 || fpct <= 0) {\n return ''\n }\n if (fpct >= 1) {\n return this.ellipsePath(width, height)\n }\n const rx = width / 2\n const ry = height / 2\n const cx = rx\n const cy = ry\n let startAngle = Math.asin((0.5 - fpct) * 2)\n let endAngle = Math.PI - startAngle\n startAngle += Math.PI / 2 * fdir\n endAngle += Math.PI / 2 * fdir\n\n const start = this.ellipsePoint(cx, cy, rx, ry, startAngle)\n const end = this.ellipsePoint(cx, cy, rx, ry, endAngle)\n const largeArc = endAngle - startAngle > Math.PI ? 1 : 0\n return `M ${start.x} ${start.y} A ${rx} ${ry} 0 ${largeArc} 1 ${end.x} ${end.y} Z`\n }\n\n ellipsePoint(cx, cy, rx, ry, angle) {\n return {\n x: cx + Math.cos(angle) * rx,\n y: cy + Math.sin(angle) * ry\n }\n }\n}\n\nBar.registerUI()\n\nexport default Bar\n","import { Path } from 'leafer-ui'\n\nconst TWO_PI = Math.PI * 2\n\nconst buildPath = function(width, height, startAngle, endAngle, filled) {\n const rx = Math.max(0, Number(width) || 0) / 2\n const ry = Math.max(0, Number(height) || 0) / 2\n if (!rx || !ry) {\n return ''\n }\n const cx = rx\n const cy = ry\n let start = Number(startAngle) || 0\n let end = Number(endAngle) || 0\n if (Math.abs(end - start) >= TWO_PI - 0.0001) {\n // 完整圆用两段 arc,避免大弧标志在 2π 处歧义。\n return `M ${cx - rx} ${cy} A ${rx} ${ry} 0 1 0 ${cx + rx} ${cy} A ${rx} ${ry} 0 1 0 ${cx - rx} ${cy} Z`\n }\n if (start === end) {\n return ''\n }\n if (Math.abs(end - start) > TWO_PI) {\n end = start + TWO_PI * Math.sign(end - start)\n }\n const sx = cx + Math.cos(start) * rx\n const sy = cy + Math.sin(start) * ry\n const ex = cx + Math.cos(end) * rx\n const ey = cy + Math.sin(end) * ry\n const largeArc = Math.abs(end - start) > Math.PI ? 1 : 0\n const sweep = end > start ? 1 : 0\n if (filled) {\n return `M ${cx} ${cy} L ${sx} ${sy} A ${rx} ${ry} 0 ${largeArc} ${sweep} ${ex} ${ey} Z`\n }\n return `M ${sx} ${sy} A ${rx} ${ry} 0 ${largeArc} ${sweep} ${ex} ${ey}`\n}\n\nclass Circle extends Path {\n get __tag() { return 'Circle' }\n\n constructor(data = {}) {\n const input = { ...data }\n const startAngle = input.startAngle === undefined ? 0 : input.startAngle\n const endAngle = input.endAngle === undefined ? TWO_PI : input.endAngle\n const filled = input.fill !== '' && input.fill !== undefined && input.fill !== null && input.fill !== 'transparent'\n super({\n ...input,\n path: buildPath(input.width, input.height, startAngle, endAngle, filled)\n })\n this.startAngle = startAngle\n this.endAngle = endAngle\n this._filled = filled\n }\n\n get type() { return 'circle' }\n\n set type(value) { this._type = value }\n\n get startAngle() { return this._startAngle || 0 }\n\n set startAngle(value) {\n this._startAngle = Number(value) || 0\n this.updateArc()\n }\n\n get endAngle() { return this._endAngle === undefined ? TWO_PI : this._endAngle }\n\n set endAngle(value) {\n this._endAngle = Number(value) || 0\n this.updateArc()\n }\n\n set(data, transition) {\n if (typeof data === 'string') {\n data = { [data]: transition }\n }\n if (data && typeof data === 'object') {\n if (Object.prototype.hasOwnProperty.call(data, 'startAngle')) {\n this._startAngle = Number(data.startAngle) || 0\n }\n if (Object.prototype.hasOwnProperty.call(data, 'endAngle')) {\n this._endAngle = Number(data.endAngle) || 0\n }\n if (Object.prototype.hasOwnProperty.call(data, 'fill')) {\n const fill = data.fill\n this._filled = fill !== '' && fill !== undefined && fill !== null && fill !== 'transparent'\n }\n }\n const result = super.set(data, transition)\n if (data && typeof data === 'object' && (\n Object.prototype.hasOwnProperty.call(data, 'width') ||\n Object.prototype.hasOwnProperty.call(data, 'height') ||\n Object.prototype.hasOwnProperty.call(data, 'startAngle') ||\n Object.prototype.hasOwnProperty.call(data, 'endAngle') ||\n Object.prototype.hasOwnProperty.call(data, 'fill')\n )) {\n this.updateArc()\n }\n return result\n }\n\n updateArc() {\n this.path = buildPath(this.width, this.height, this.startAngle, this.endAngle, this._filled)\n }\n\n toJSON(options) {\n const data = super.toJSON(options)\n data.type = 'circle'\n data.startAngle = this.startAngle\n data.endAngle = this.endAngle\n return data\n }\n}\n\nCircle.registerUI()\n\nexport default Circle\n","import { Group } from 'leafer-ui'\n\n/**\n * 图层容器。\n *\n * 层只是编辑态的组织方式: 层内图元仍然是页面坐标, 进出层不改变位置。\n * 所以这里把变换锁死成恒等(x/y = 0, 不缩放不旋转), 并且自身不可选中/不可拖动,\n * 点击都落到层内图元上(层容器不能参与选择)。\n *\n * Fabric 没有图层概念, 转换器不会产出它; 只有 Leafer 编辑器会创建。\n */\nclass Layer extends Group {\n get __tag() {\n return 'Layer'\n }\n\n constructor(data = {}) {\n const next = { ...(data || {}) }\n // 层的变换恒等: 老文件里存过的位移/缩放/旋转一律丢掉\n delete next.x\n delete next.y\n delete next.scaleX\n delete next.scaleY\n delete next.rotation\n // 显式 undefined 会顶掉 Group 的默认值, children 变 undefined 会直接崩, 先删掉\n Object.keys(next).forEach((key) => {\n if (next[key] === undefined) delete next[key]\n })\n next.x = 0\n next.y = 0\n next.editable = false\n next.draggable = false\n // hittable 必须保持 true: leafer 里 hittable=false 会让整棵子树命中不到,\n // 层内图元就点不中了。层本身能不能被选中由 editable 决定。\n next.hittable = true\n next.hitChildren = true\n super(next)\n }\n\n get type() {\n return 'layer'\n }\n\n set type(value) {\n this._type = value\n }\n}\n\nLayer.registerUI()\n\nexport default Layer","import { Group } from 'leafer-ui'\n\n/**\n * 图库实例。\n * 和 Button / Bar 一样是 Leafer 自定义元素,但内部 children 来自 lib 定义,\n * 平台保存时只保留 libName / param,重新打开时再补 children。\n */\nclass Lib extends Group {\n get __tag() { return 'Lib' }\n\n constructor(data = {}) {\n const {\n libName,\n originParam,\n param,\n ...groupData\n } = data || {}\n super(groupData)\n this.libName = libName || ''\n this.originParam = originParam || {}\n this.param = param || {}\n }\n\n get type() {\n return 'lib'\n }\n\n set type(value) {\n this._type = value\n }\n}\n\nLib.registerUI()\n\nexport default Lib\n","import { Box, Text } from 'leafer-ui'\n\n/**\n * Fabric i-text → 铺满包围盒的文字。\n *\n * Fabric 里 i-text 的包围盒就是文字被 scale 拉伸后的尺寸,拖角手柄改的也是 scale,\n * 文字跟着变形(\"拉伸\"两个字可以拉得很长);Leafer 的 Text 固定宽高时只是把文字摆\n * 在框里,不跟着变形,所以这里用一层 Group 当盒子(宽高就是权威尺寸,转换、保存、\n * 属性面板改的都是它),内部 Text 不设宽高、按内容自适应排版,再把它的 scale 反算\n * 成\"盒子 / 自然尺寸\",文字就正好被拉伸到盒子里。\n *\n * 用 Box 而不是 Group:编辑器拖角手柄改的是盒子的宽高(Box 的原生行为),文字跟着\n * 重新拉伸;Group 会被\"缩放子图元\",内部文字就被拽歪、盒子也不再跟着手变了。\n * 另外标记 editInner,双击不会把它当普通组\"进组\"。\n */\n\n// 这些属性属于内部 Text,对外仍按普通文本图元读写\nconst TEXT_PROPS = [\n 'text',\n 'fontSize',\n 'fontFamily',\n 'fontWeight',\n 'fontStyle',\n 'letterSpacing',\n 'lineHeight',\n 'textAlign',\n 'verticalAlign',\n 'textDecoration',\n 'textWrap',\n 'fill',\n 'stroke',\n 'strokeWidth',\n 'shadow',\n 'boxStyle',\n 'textBackgroundColor'\n]\n\nconst DEFAULT_FONT_SIZE = 12\nconst DEFAULT_FILL = '#000000'\n\nconst pickTextProps = function(data) {\n const props = {}\n TEXT_PROPS.forEach((key) => {\n if (data[key] !== undefined) {\n props[key] = data[key]\n }\n })\n return props\n}\n\nclass IText extends Box {\n get __tag() { return 'IText' }\n\n constructor(data = {}) {\n const input = data || {}\n const textData = pickTextProps(input)\n const groupData = { ...input }\n TEXT_PROPS.forEach((key) => {\n delete groupData[key]\n })\n // 内部文字由本元素重建,JSON 里带的 children 不认\n delete groupData.children\n super({ ...groupData, fill: 'transparent' })\n this.childlessJSON = true\n // 有 editInner 时编辑器不会再把这个元素当普通 Group \"进组\"(双击不会乱跑)\n this.editInner = 'IText'\n this.textBox = true\n this.textElement = new Text({\n x: 0,\n y: 0,\n around: 'top-left',\n textWrap: 'none',\n fontSize: DEFAULT_FONT_SIZE,\n fill: DEFAULT_FILL,\n hittable: false,\n draggable: false,\n editable: false,\n ...textData\n })\n this.add(this.textElement)\n this.updateText()\n }\n\n set(data, transition) {\n if (typeof data === 'string') {\n data = { [data]: transition }\n }\n if (!data || typeof data !== 'object') {\n return super.set(data, transition)\n }\n const textData = pickTextProps(data)\n const rest = { ...data }\n TEXT_PROPS.forEach((key) => {\n delete rest[key]\n })\n const result = Object.keys(rest).length ? super.set(rest, transition) : this\n if (this.textElement) {\n if (Object.keys(textData).length) {\n this.textElement.set(textData)\n }\n if (Object.keys(textData).length ||\n Object.prototype.hasOwnProperty.call(rest, 'width') ||\n Object.prototype.hasOwnProperty.call(rest, 'height')) {\n this.updateText()\n }\n }\n return result\n }\n\n /**\n * 换行模式要固定宽度才能断行;不换行时交还内容自适应。\n * 盒子尺寸也在这里同步给内部文字。\n */\n updateText() {\n const text = this.textElement\n if (!text) return\n const { width } = this.boxSize()\n if (text.textWrap !== 'none' && width > 0) {\n if (Number(text.width) !== width) {\n text.width = width\n }\n } else if (text.width !== undefined && text.width !== null) {\n text.width = null\n }\n this.syncFit()\n }\n\n /** 盒子尺寸:转换/保存下来的宽高是权威值,缺省时按内容走 */\n boxSize() {\n const input = this.__\n return {\n width: Number(input.__getInput('width')) || 0,\n height: Number(input.__getInput('height')) || 0\n }\n }\n\n /** 按盒子宽高拉伸内部文字,让文字铺满包围盒(文字会被拉变形) */\n syncFit() {\n const text = this.textElement\n const layout = text && text.__layout\n if (!layout) return\n // 内部文字只受本元素摆布: 被外部挪动(比如编辑器进组后拖动)一律拉回原点\n if (text.x) text.x = 0\n if (text.y) text.y = 0\n const { width, height } = this.boxSize()\n const natural = layout.boxBounds\n if (!width || !height || !natural.width || !natural.height) return\n const scaleX = width / natural.width\n const scaleY = height / natural.height\n if (Math.abs(Number(text.scaleX) - scaleX) > 0.0001) text.scaleX = scaleX\n if (Math.abs(Number(text.scaleY) - scaleY) > 0.0001) text.scaleY = scaleY\n }\n\n // 排版发生在布局阶段:按盒子宽高重新拉伸内部文字(Box 的包围盒就是宽高,不用再改)\n __updateBoxBounds(secondLayout, bounds) {\n this.syncFit()\n super.__updateBoxBounds(secondLayout, bounds)\n }\n\n toJSON(options) {\n const data = super.toJSON(options)\n const text = this.textElement\n if (text) {\n TEXT_PROPS.forEach((key) => {\n const value = text[key]\n if (value !== undefined) {\n data[key] = value\n }\n })\n }\n delete data.children\n return data\n }\n}\n\n// 文字属性对外透传给内部 Text:属性面板、动态取值按普通文本图元读写即可\nTEXT_PROPS.forEach((key) => {\n Object.defineProperty(IText.prototype, key, {\n configurable: true,\n get() {\n const text = this.textElement\n return text ? text[key] : undefined\n },\n set(value) {\n const text = this.textElement\n if (!text) return\n if (text[key] === value) return\n text[key] = value\n this.updateText()\n }\n })\n})\n\nIText.registerUI()\n\nexport default IText"],"mappings":"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","names":["import_leafer_ui","requestRubikRender","import_leafer_ui","import_leafer_ui","import_leafer_ui","import_leafer_ui","DEFAULT_FILL"]}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import type { Box, Group, Path } from 'leafer-ui'
|
|
2
|
+
|
|
3
|
+
export type ButtonWordWrap = 'none' | 'char' | 'word'
|
|
4
|
+
|
|
5
|
+
export interface ButtonOptions {
|
|
6
|
+
text?: string
|
|
7
|
+
fontSize?: number
|
|
8
|
+
fontWeight?: string | number
|
|
9
|
+
fontColor?: string
|
|
10
|
+
fontFamily?: string
|
|
11
|
+
fill?: string
|
|
12
|
+
backgroundColor?: string
|
|
13
|
+
buttonScaleBaseWidth?: number
|
|
14
|
+
buttonScaleBaseHeight?: number
|
|
15
|
+
wordWrap?: ButtonWordWrap
|
|
16
|
+
/** 兼容 fabric 的 splitByGrapheme */
|
|
17
|
+
splitByGrapheme?: boolean
|
|
18
|
+
down?: boolean
|
|
19
|
+
[key: string]: any
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export declare class Button extends Box {
|
|
23
|
+
constructor(data?: ButtonOptions)
|
|
24
|
+
readonly type: 'button'
|
|
25
|
+
text: string
|
|
26
|
+
fontSize: number
|
|
27
|
+
fontWeight: string | number
|
|
28
|
+
fontColor: string
|
|
29
|
+
fontFamily: string
|
|
30
|
+
backgroundColor: string
|
|
31
|
+
wordWrap: ButtonWordWrap
|
|
32
|
+
down: boolean
|
|
33
|
+
buttonScaleBaseWidth: number
|
|
34
|
+
buttonScaleBaseHeight: number
|
|
35
|
+
setButtonFill(value?: string): this
|
|
36
|
+
setButtonScale(key: 'scaleX' | 'scaleY', value?: number): this
|
|
37
|
+
setPressed(pressed: boolean): void
|
|
38
|
+
/** 同步按下态视觉: 文字偏移 + 边框倒角翻转 + 悬停遮罩 */
|
|
39
|
+
updatePressState(): void
|
|
40
|
+
setPressed(pressed: boolean): void
|
|
41
|
+
setHovered(hovered: boolean): void
|
|
42
|
+
updateLayout(): void
|
|
43
|
+
toJSON(options?: any): any
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export type BarFillStyle = 'rect' | 'circle'
|
|
47
|
+
|
|
48
|
+
export interface BarOptions {
|
|
49
|
+
fill?: string
|
|
50
|
+
stroke?: string
|
|
51
|
+
strokeWidth?: number
|
|
52
|
+
backgroundFill?: string
|
|
53
|
+
backgroundColor?: string
|
|
54
|
+
/** 进度 0 ~ 1(fdir = 4 时为 -1 ~ 1) */
|
|
55
|
+
fpct?: number
|
|
56
|
+
/** 方向:rect 0-4,circle 0-3 */
|
|
57
|
+
fdir?: number
|
|
58
|
+
fstyle?: BarFillStyle
|
|
59
|
+
[key: string]: any
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export interface BarAnimateOptions {
|
|
63
|
+
animate?: boolean
|
|
64
|
+
duration?: number
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export declare class Bar extends Box {
|
|
68
|
+
constructor(data?: BarOptions)
|
|
69
|
+
readonly type: 'bar'
|
|
70
|
+
fill: string
|
|
71
|
+
stroke: string
|
|
72
|
+
strokeWidth: number
|
|
73
|
+
backgroundFill: string
|
|
74
|
+
backgroundColor: string
|
|
75
|
+
fpct: number
|
|
76
|
+
fdir: number
|
|
77
|
+
fstyle: BarFillStyle
|
|
78
|
+
setFpct(value: number, option?: BarAnimateOptions): this
|
|
79
|
+
animateFpct(target: number, option?: BarAnimateOptions): this
|
|
80
|
+
cancelFpctAnimation(): void
|
|
81
|
+
updateBar(): void
|
|
82
|
+
toJSON(options?: any): any
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export interface CircleOptions {
|
|
86
|
+
startAngle?: number
|
|
87
|
+
endAngle?: number
|
|
88
|
+
[key: string]: any
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export declare class Circle extends Path {
|
|
92
|
+
constructor(data?: CircleOptions)
|
|
93
|
+
readonly type: 'circle'
|
|
94
|
+
startAngle: number
|
|
95
|
+
endAngle: number
|
|
96
|
+
updateArc(): void
|
|
97
|
+
toJSON(options?: any): any
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
export interface LibOptions {
|
|
101
|
+
libName?: string
|
|
102
|
+
originParam?: Record<string, any>
|
|
103
|
+
param?: Record<string, any>
|
|
104
|
+
[key: string]: any
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export declare class Lib extends Group {
|
|
108
|
+
constructor(data?: LibOptions)
|
|
109
|
+
readonly type: 'lib'
|
|
110
|
+
libName: string
|
|
111
|
+
originParam: Record<string, any>
|
|
112
|
+
param: Record<string, any>
|
|
113
|
+
}
|