| { text: string } | null
+
+const getNodeText = (data: NodeData): string => {
+ return data.richText ? nodeRichTextToTextWithWrap(data.text) : data.text
+}
+
+const getTitleMark = (level: number): string => {
+ return new Array(level).fill('#').join('')
+}
+
+const getIndentMark = (level: number): string => {
+ return new Array(level - 6).fill(' ').join('') + '*'
+}
+
+// 转换成markdown格式
+export const transformToMarkdown = (root: Node): string => {
+ let content = ''
+ walk(
+ root,
+ null,
+ (node: Node, parent: Node | null, isRoot: boolean, layerIndex: number) => {
+ const level = layerIndex + 1
+ if (level <= 6) {
+ content += getTitleMark(level)
+ } else {
+ content += getIndentMark(level)
+ }
+ content += ' ' + getNodeText(node.data)
+ // 概要
+ const generalization = node.data.generalization
+ if (Array.isArray(generalization)) {
+ content += generalization.map(item => {
+ return ` [${getNodeText(item)}]`
+ })
+ } else if (generalization && 'text' in generalization) {
+ const generalizationText = getNodeText(generalization)
+ content += ` [${generalizationText}]`
+ }
+ content += '\n\n'
+ // 备注
+ if (node.data.note) {
+ content += node.data.note + '\n\n'
+ }
+ },
+ () => { },
+ true
+ )
+ return content
+}
\ No newline at end of file
diff --git a/packages/mindmap/src/parse/toTxt.ts b/packages/mindmap/src/parse/toTxt.ts
new file mode 100644
index 0000000..14ae4d6
--- /dev/null
+++ b/packages/mindmap/src/parse/toTxt.ts
@@ -0,0 +1,37 @@
+import { walk, nodeRichTextToTextWithWrap } from '../utils'
+import { NodeData, Node } from "../types"
+
+
+const getNodeText = (data: NodeData): string => {
+ return data.richText ? nodeRichTextToTextWithWrap(data.text) : data.text
+}
+
+const getIndent = (level: number): string => {
+ return new Array(level).fill(' ').join('')
+}
+
+// 转换成txt格式
+export const transformToTxt = (root: Node): string => {
+ let content = ''
+ walk(
+ root,
+ null,
+ (node: Node, parent: Node | null, isRoot: boolean, layerIndex: number) => {
+ content += getIndent(layerIndex)
+ content += ' ' + getNodeText(node.data)
+ // 概要
+ const generalization = node.data.generalization
+ if (Array.isArray(generalization)) {
+ content += generalization.map(item => {
+ return ` [${getNodeText(item)}]`
+ })
+ } else if (generalization && generalization.text) {
+ content += ` [${getNodeText(generalization)}]`
+ }
+ content += '\n\n'
+ },
+ () => { },
+ true
+ )
+ return content
+}
\ No newline at end of file
diff --git a/packages/mindmap/src/parse/xmind.js b/packages/mindmap/src/parse/xmind.js
new file mode 100644
index 0000000..3040e26
--- /dev/null
+++ b/packages/mindmap/src/parse/xmind.js
@@ -0,0 +1,335 @@
+import JSZip from 'jszip'
+import xmlConvert from 'xml-js'
+import { getTextFromHtml, isUndef } from '../utils/index'
+import {
+ getSummaryText,
+ getSummaryText2,
+ getRoot,
+ getItemByName,
+ getElementsByType,
+ addSummaryData,
+ handleNodeImageFromXmind,
+ handleNodeImageToXmind,
+ getXmindContentXmlData,
+ parseNodeGeneralizationToXmind
+} from '../utils/xmind'
+
+// 解析.xmind文件
+const parseXmindFile = (file, handleMultiCanvas) => {
+ return new Promise((resolve, reject) => {
+ JSZip.loadAsync(file).then(
+ async zip => {
+ try {
+ let content = ''
+ let jsonFile = zip.files['content.json']
+ let xmlFile = zip.files['content.xml'] || zip.files['/content.xml']
+ if (jsonFile) {
+ let json = await jsonFile.async('string')
+ content = await transformXmind(json, zip.files, handleMultiCanvas)
+ } else if (xmlFile) {
+ let xml = await xmlFile.async('string')
+ let json = xmlConvert.xml2json(xml)
+ content = transformOldXmind(json)
+ }
+ if (content) {
+ resolve(content)
+ } else {
+ reject(new Error('解析失败'))
+ }
+ } catch (error) {
+ reject(error)
+ }
+ },
+ e => {
+ reject(e)
+ }
+ )
+ })
+}
+
+// 转换xmind数据
+const transformXmind = async (content, files, handleMultiCanvas) => {
+ content = JSON.parse(content)
+ let data = null
+ if (content.length > 1 && typeof handleMultiCanvas === 'function') {
+ data = await handleMultiCanvas(content)
+ }
+ if (!data) {
+ data = content[0]
+ }
+ const nodeTree = data.rootTopic
+ const newTree = {}
+ const waitLoadImageList = []
+ const walk = async (node, newNode) => {
+ newNode.data = {
+ // 节点内容
+ text: isUndef(node.title) ? '' : node.title
+ }
+ // 节点备注
+ if (node.notes) {
+ const notesData = node.notes.realHTML || node.notes.plain
+ newNode.data.note = notesData ? notesData.content || '' : ''
+ }
+ // 超链接
+ if (node.href && /^https?:\/\//.test(node.href)) {
+ newNode.data.hyperlink = node.href
+ }
+ // 标签
+ if (node.labels && node.labels.length > 0) {
+ newNode.data.tag = node.labels
+ }
+ // 图片
+ handleNodeImageFromXmind(node, newNode, waitLoadImageList, files)
+ // 概要
+ const selfSummary = []
+ const childrenSummary = []
+ if (newNode._summary) {
+ selfSummary.push(newNode._summary)
+ }
+ if (Array.isArray(node.summaries) && node.summaries.length > 0) {
+ node.summaries.forEach(item => {
+ addSummaryData(
+ selfSummary,
+ childrenSummary,
+ () => {
+ return getSummaryText(node, item.topicId)
+ },
+ item.range
+ )
+ })
+ }
+ newNode.data.generalization = selfSummary
+ // 子节点
+ newNode.children = []
+ if (
+ node.children &&
+ node.children.attached &&
+ node.children.attached.length > 0
+ ) {
+ node.children.attached.forEach((item, index) => {
+ const newChild = {}
+ newNode.children.push(newChild)
+ if (childrenSummary[index]) {
+ newChild._summary = childrenSummary[index]
+ }
+ walk(item, newChild)
+ })
+ }
+ }
+ walk(nodeTree, newTree)
+ await Promise.all(waitLoadImageList)
+ return newTree
+}
+
+// 转换旧版xmind数据,xmind8
+const transformOldXmind = content => {
+ const data = JSON.parse(content)
+ const elements = data.elements
+ const root = getRoot(elements)
+ const newTree = {}
+ const walk = (node, newNode) => {
+ const nodeElements = node.elements
+ let nodeTitle = getItemByName(nodeElements, 'title')
+ nodeTitle = nodeTitle && nodeTitle.elements && nodeTitle.elements[0].text
+ // 节点内容
+ newNode.data = {
+ text: isUndef(nodeTitle) ? '' : nodeTitle
+ }
+ // 节点备注
+ try {
+ const notesElement = getItemByName(nodeElements, 'notes')
+ if (notesElement) {
+ newNode.data.note =
+ notesElement.elements[0].elements[0].elements[0].text
+ }
+ } catch (error) {
+ console.log(error)
+ }
+ // 超链接
+ try {
+ if (
+ node.attributes &&
+ node.attributes['xlink:href'] &&
+ /^https?:\/\//.test(node.attributes['xlink:href'])
+ ) {
+ newNode.data.hyperlink = node.attributes['xlink:href']
+ }
+ } catch (error) {
+ console.log(error)
+ }
+ // 标签
+ try {
+ const labelsElement = getItemByName(nodeElements, 'labels')
+ if (labelsElement) {
+ newNode.data.tag = labelsElement.elements.map(item => {
+ return item.elements[0].text
+ })
+ }
+ } catch (error) {
+ console.log(error)
+ }
+ const childrenItem = getItemByName(nodeElements, 'children')
+ // 概要
+ const selfSummary = []
+ const childrenSummary = []
+ try {
+ if (newNode._summary) {
+ selfSummary.push(newNode._summary)
+ }
+ const summariesItem = getItemByName(nodeElements, 'summaries')
+ if (
+ summariesItem &&
+ Array.isArray(summariesItem.elements) &&
+ summariesItem.elements.length > 0
+ ) {
+ summariesItem.elements.forEach(item => {
+ addSummaryData(
+ selfSummary,
+ childrenSummary,
+ () => {
+ return getSummaryText2(childrenItem, item.attributes['topic-id'])
+ },
+ item.attributes.range
+ )
+ })
+ }
+ } catch (error) {
+ console.log(error)
+ }
+ newNode.data.generalization = selfSummary
+ // 子节点
+ newNode.children = []
+ if (
+ childrenItem &&
+ childrenItem.elements &&
+ childrenItem.elements.length > 0
+ ) {
+ const children = getElementsByType(childrenItem.elements, 'attached')
+ ;(children || []).forEach((item, index) => {
+ const newChild = {}
+ newNode.children.push(newChild)
+ if (childrenSummary[index]) {
+ newChild._summary = childrenSummary[index]
+ }
+ walk(item, newChild)
+ })
+ }
+ }
+ walk(root, newTree)
+ return newTree
+}
+
+// 数据转换为xmind文件
+// 直接转换为最新版本的xmind文件 2023.09.11172
+const transformToXmind = async (data, name) => {
+ const id = 'simpleMindMap_' + Date.now()
+ const imageList = []
+ // 转换核心数据
+ let newTree = {}
+ let waitLoadImageList = []
+ let walk = async (node, newNode, isRoot) => {
+ let newData = {
+ id: node.data.uid,
+ structureClass: 'org.xmind.ui.logic.right',
+ title: getTextFromHtml(node.data.text), // 节点文本
+ children: {
+ attached: []
+ }
+ }
+ // 备注
+ if (node.data.note !== undefined) {
+ newData.notes = {
+ realHTML: {
+ content: node.data.note
+ },
+ plain: {
+ content: node.data.note
+ }
+ }
+ }
+ // 超链接
+ if (node.data.hyperlink !== undefined) {
+ newData.href = node.data.hyperlink
+ }
+ // 标签
+ if (node.data.tag !== undefined) {
+ newData.labels = node.data.tag || []
+ }
+ // 图片
+ handleNodeImageToXmind(node, newNode, waitLoadImageList, imageList)
+ // 样式
+ // 暂时不考虑样式
+ if (isRoot) {
+ newData.class = 'topic'
+ newNode.id = id
+ newNode.class = 'sheet'
+ newNode.title = name
+ newNode.extensions = []
+ newNode.topicPositioning = 'fixed'
+ newNode.topicOverlapping = 'overlap'
+ newNode.coreVersion = '2.100.0'
+ newNode.rootTopic = newData
+ } else {
+ Object.keys(newData).forEach(key => {
+ newNode[key] = newData[key]
+ })
+ }
+ // 概要
+ const { summary, summaries } = parseNodeGeneralizationToXmind(node)
+ if (isRoot) {
+ if (summaries.length > 0) {
+ newNode.rootTopic.children.summary = summary
+ newNode.rootTopic.summaries = summaries
+ }
+ } else {
+ if (summaries.length > 0) {
+ newNode.children.summary = summary
+ newNode.summaries = summaries
+ }
+ }
+ // 子节点
+ if (node.children && node.children.length > 0) {
+ node.children.forEach(child => {
+ let newChild = {}
+ walk(child, newChild)
+ newData.children.attached.push(newChild)
+ })
+ }
+ }
+ walk(data, newTree, true)
+ await Promise.all(waitLoadImageList)
+ const contentData = [newTree]
+ // 创建压缩包
+ const zip = new JSZip()
+ zip.file('content.json', JSON.stringify(contentData))
+ zip.file(
+ 'metadata.json',
+ `{"modifier":"","dataStructureVersion":"2","creator":{"name":"mind-map"},"layoutEngineVersion":"3","activeSheetId":"${id}"}`
+ )
+ zip.file('content.xml', getXmindContentXmlData())
+ const manifestData = {
+ 'file-entries': {
+ 'content.json': {},
+ 'metadata.json': {},
+ 'Thumbnails/thumbnail.png': {}
+ }
+ }
+ // 图片
+ if (imageList.length > 0) {
+ imageList.forEach(item => {
+ manifestData['file-entries']['resources/' + item.name] = {}
+ const img = zip.folder('resources')
+ img.file(item.name, item.data, { base64: true })
+ })
+ }
+ zip.file('manifest.json', JSON.stringify(manifestData))
+ const zipData = await zip.generateAsync({ type: 'blob' })
+ return zipData
+}
+
+export default {
+ parseXmindFile,
+ transformXmind,
+ transformOldXmind,
+ transformToXmind
+}
diff --git a/packages/mindmap/src/plugins/AssociativeLine.js b/packages/mindmap/src/plugins/AssociativeLine.js
new file mode 100644
index 0000000..669e8e9
--- /dev/null
+++ b/packages/mindmap/src/plugins/AssociativeLine.js
@@ -0,0 +1,756 @@
+import { walk, bfsWalk, throttle } from '../utils'
+import { v4 as uuid } from 'uuid'
+import {
+ getAssociativeLineTargetIndex,
+ computeCubicBezierPathPoints,
+ cubicBezierPath,
+ getNodePoint,
+ computeNodePoints,
+ getNodeLinePath
+} from './associativeLine/associativeLineUtils'
+import associativeLineControlsMethods from './associativeLine/associativeLineControls'
+import associativeLineTextMethods from './associativeLine/associativeLineText'
+
+const styleProps = [
+ 'associativeLineWidth',
+ 'associativeLineColor',
+ 'associativeLineActiveWidth',
+ 'associativeLineActiveColor',
+ 'associativeLineDasharray',
+ 'associativeLineTextColor',
+ 'associativeLineTextFontSize',
+ 'associativeLineTextLineHeight',
+ 'associativeLineTextFontFamily'
+]
+
+// 关联线插件
+class AssociativeLine {
+ constructor(opt = {}) {
+ this.mindMap = opt.mindMap
+ this.associativeLineDraw = this.mindMap.associativeLineDraw
+ // 本次不要重新渲染连线
+ this.isNotRenderAllLines = false
+ // 当前所有连接线
+ this.lineList = []
+ // 当前激活的连接线
+ this.activeLine = null
+ // 当前正在创建连接线
+ this.isCreatingLine = false // 是否正在创建连接线中
+ this.creatingStartNode = null // 起始节点
+ this.creatingLine = null // 创建过程中的连接线
+ this.overlapNode = null // 创建过程中的目标节点
+ // 是否有节点正在被拖拽
+ this.isNodeDragging = false
+ // 控制点
+ this.controlLine1 = null
+ this.controlLine2 = null
+ this.controlPoint1 = null
+ this.controlPoint2 = null
+ this.controlPointDiameter = 10
+ this.isControlPointMousedown = false
+ this.mousedownControlPointKey = ''
+ this.controlPointMousemoveState = {
+ pos: null,
+ startPoint: null,
+ endPoint: null,
+ targetIndex: ''
+ }
+ // 节流一下,不然很卡
+ this.checkOverlapNode = throttle(this.checkOverlapNode, 100, this)
+ // 控制点相关方法
+ Object.keys(associativeLineControlsMethods).forEach(item => {
+ this[item] = associativeLineControlsMethods[item].bind(this)
+ })
+ // 关联线文字相关方法
+ Object.keys(associativeLineTextMethods).forEach(item => {
+ this[item] = associativeLineTextMethods[item].bind(this)
+ })
+ this.bindEvent()
+ }
+
+ // 监听事件
+ bindEvent() {
+ this.renderAllLines = this.renderAllLines.bind(this)
+ this.onDrawClick = this.onDrawClick.bind(this)
+ this.onNodeClick = this.onNodeClick.bind(this)
+ this.removeLine = this.removeLine.bind(this)
+ this.addLine = this.addLine.bind(this)
+ this.onMousemove = this.onMousemove.bind(this)
+ this.onNodeDragging = this.onNodeDragging.bind(this)
+ this.onNodeDragend = this.onNodeDragend.bind(this)
+ this.onControlPointMouseup = this.onControlPointMouseup.bind(this)
+ this.onBeforeDestroy = this.onBeforeDestroy.bind(this)
+
+ // 节点树渲染完毕后渲染连接线
+ this.mindMap.on('node_tree_render_end', this.renderAllLines)
+ // 状态改变后重新渲染连接线
+ this.mindMap.on('data_change', this.renderAllLines)
+ // 监听画布和节点点击事件,用于清除当前激活的连接线
+ this.mindMap.on('draw_click', this.onDrawClick)
+ this.mindMap.on('node_click', this.onNodeClick)
+ this.mindMap.on('contextmenu', this.onDrawClick)
+ // 注册删除快捷键
+ this.mindMap.keyCommand.addShortcut('Del|Backspace', this.removeLine)
+ // 注册添加连接线的命令
+ this.mindMap.command.add('ADD_ASSOCIATIVE_LINE', this.addLine)
+ // 监听鼠标移动事件
+ this.mindMap.on('mousemove', this.onMousemove)
+ // 节点拖拽事件
+ this.mindMap.on('node_dragging', this.onNodeDragging)
+ this.mindMap.on('node_dragend', this.onNodeDragend)
+ // 拖拽控制点
+ this.mindMap.on('mouseup', this.onControlPointMouseup)
+ // 缩放事件
+ this.mindMap.on('scale', this.onScale)
+ // 实例销毁事件
+ this.mindMap.on('beforeDestroy', this.onBeforeDestroy)
+ }
+
+ // 解绑事件
+ unBindEvent() {
+ this.mindMap.off('node_tree_render_end', this.renderAllLines)
+ this.mindMap.off('data_change', this.renderAllLines)
+ this.mindMap.off('draw_click', this.onDrawClick)
+ this.mindMap.off('node_click', this.onNodeClick)
+ this.mindMap.off('contextmenu', this.onDrawClick)
+ this.mindMap.keyCommand.removeShortcut('Del|Backspace', this.removeLine)
+ this.mindMap.command.remove('ADD_ASSOCIATIVE_LINE', this.addLine)
+ this.mindMap.off('mousemove', this.onMousemove)
+ this.mindMap.off('node_dragging', this.onNodeDragging)
+ this.mindMap.off('node_dragend', this.onNodeDragend)
+ this.mindMap.off('mouseup', this.onControlPointMouseup)
+ this.mindMap.off('scale', this.onScale)
+ this.mindMap.off('beforeDestroy', this.onBeforeDestroy)
+ }
+
+ // 获取关联线的样式配置
+ // 优先级:关联线自定义样式、节点自定义样式、主题的节点层级样式、主题的最外层样式
+ getStyleConfig(node, toNode) {
+ let lineStyle = {}
+ if (toNode) {
+ const associativeLineStyle = node.getData('associativeLineStyle') || {}
+ lineStyle = associativeLineStyle[toNode.getData('uid')] || {}
+ }
+ const res = {}
+ styleProps.forEach(prop => {
+ if (typeof lineStyle[prop] !== 'undefined') {
+ res[prop] = lineStyle[prop]
+ } else {
+ res[prop] = node.getStyle(prop)
+ }
+ })
+ return res
+ }
+
+ // 实例销毁时清除关联线文字编辑框
+ onBeforeDestroy() {
+ this.hideEditTextBox()
+ this.removeTextEditEl()
+ }
+
+ // 画布点击事件
+ onDrawClick() {
+ // 取消创建关联线
+ if (this.isCreatingLine) {
+ this.cancelCreateLine()
+ }
+ // 取消激活关联线
+ if (!this.isControlPointMousedown) {
+ this.clearActiveLine()
+ }
+ }
+
+ // 节点点击事件
+ onNodeClick(node) {
+ if (this.isCreatingLine) {
+ this.completeCreateLine(node)
+ } else {
+ this.clearActiveLine()
+ }
+ }
+
+ // 创建箭头
+ createMarker(callback = () => {}) {
+ return this.associativeLineDraw.marker(20, 20, add => {
+ add.ref(12, 5)
+ add.size(10, 10)
+ add.attr('orient', 'auto-start-reverse')
+ callback(add.path('M0,0 L2,5 L0,10 L10,5 Z'))
+ })
+ }
+
+ // 判断关联线坐标是否变更,有变更则使用变化后的坐标,无则默认坐标
+ updateAllLinesPos(node, toNode, associativeLinePoint) {
+ associativeLinePoint = associativeLinePoint || {}
+ let [startPoint, endPoint] = computeNodePoints(node, toNode)
+ let nodeRange = 0
+ let nodeDir = ''
+ let toNodeRange = 0
+ let toNodeDir = ''
+ if (associativeLinePoint.startPoint) {
+ nodeRange = associativeLinePoint.startPoint.range || 0
+ nodeDir = associativeLinePoint.startPoint.dir || 'right'
+ startPoint = getNodePoint(node, nodeDir, nodeRange)
+ }
+ if (associativeLinePoint.endPoint) {
+ toNodeRange = associativeLinePoint.endPoint.range || 0
+ toNodeDir = associativeLinePoint.endPoint.dir || 'right'
+ endPoint = getNodePoint(toNode, toNodeDir, toNodeRange)
+ }
+ return [startPoint, endPoint]
+ }
+
+ // 渲染所有连线
+ renderAllLines() {
+ if (this.isNotRenderAllLines) {
+ this.isNotRenderAllLines = false
+ return
+ }
+ // 先移除
+ this.removeAllLines()
+ this.removeControls()
+ this.clearActiveLine()
+ let tree = this.mindMap.renderer.root
+ if (!tree) return
+ let idToNode = new Map()
+ let nodeToIds = new Map()
+ walk(
+ tree,
+ null,
+ cur => {
+ if (!cur) return
+ let data = cur.getData()
+ if (
+ data.associativeLineTargets &&
+ data.associativeLineTargets.length > 0
+ ) {
+ nodeToIds.set(cur, data.associativeLineTargets)
+ }
+ if (data.uid) {
+ idToNode.set(data.uid, cur)
+ }
+ },
+ () => {},
+ true,
+ 0
+ )
+ nodeToIds.forEach((ids, node) => {
+ ids.forEach((uid, index) => {
+ let toNode = idToNode.get(uid)
+ if (!node || !toNode) return
+ const associativeLinePoint = (node.getData('associativeLinePoint') ||
+ [])[index]
+ // 切换结构和布局,都会更新坐标
+ const [startPoint, endPoint] = this.updateAllLinesPos(
+ node,
+ toNode,
+ associativeLinePoint
+ )
+ this.drawLine(startPoint, endPoint, node, toNode)
+ })
+ })
+ }
+
+ // 绘制连接线
+ drawLine(startPoint, endPoint, node, toNode) {
+ let {
+ associativeLineWidth,
+ associativeLineColor,
+ associativeLineActiveWidth,
+ associativeLineDasharray
+ } = this.getStyleConfig(node, toNode)
+ // 箭头
+ let markerPath = null
+ const marker = this.createMarker(p => {
+ markerPath = p
+ })
+ markerPath
+ .stroke({ color: associativeLineColor })
+ .fill({ color: associativeLineColor })
+ // 路径
+ let { path: pathStr, controlPoints } = getNodeLinePath(
+ startPoint,
+ endPoint,
+ node,
+ toNode
+ )
+ // 虚线
+ let path = this.associativeLineDraw.path()
+ path
+ .stroke({
+ width: associativeLineWidth,
+ color: associativeLineColor,
+ dasharray: associativeLineDasharray || [6, 4]
+ })
+ .fill({ color: 'none' })
+ path.plot(pathStr)
+ path.marker('end', marker)
+ // 不可见的点击线
+ let clickPath = this.associativeLineDraw.path()
+ clickPath
+ .stroke({ width: associativeLineActiveWidth, color: 'transparent' })
+ .fill({ color: 'none' })
+ clickPath.plot(pathStr)
+ // 文字
+ let text = this.createText({
+ path,
+ clickPath,
+ markerPath,
+ node,
+ toNode,
+ startPoint,
+ endPoint,
+ controlPoints
+ })
+ // 点击事件
+ clickPath.click(e => {
+ e.stopPropagation()
+ this.setActiveLine({
+ path,
+ clickPath,
+ markerPath,
+ text,
+ node,
+ toNode,
+ startPoint,
+ endPoint,
+ controlPoints
+ })
+ })
+ // 双击进入关联线文本编辑状态
+ clickPath.dblclick(() => {
+ if (!this.activeLine) return
+ this.showEditTextBox(text)
+ })
+ // 渲染关联线文字
+ this.renderText(this.getText(node, toNode), path, text, node, toNode)
+ this.lineList.push([path, clickPath, text, node, toNode])
+ }
+
+ // 更新当前激活连线的样式,一般在自定义了节点关联线的样式后调用
+ // 直接调用node.setStyle方法更新样式会直接触发关联线更新,但是关联线的激活状态会丢失
+ // 所以可以调用node.setData方法更新数据,然后再调用该方法更新样式,这样关联线激活状态不会丢失
+ updateActiveLineStyle() {
+ if (!this.activeLine) return
+ this.isNotRenderAllLines = true
+ const [path, clickPath, text, node, toNode, markerPath] = this.activeLine
+ const {
+ associativeLineWidth,
+ associativeLineColor,
+ associativeLineDasharray,
+ associativeLineActiveWidth,
+ associativeLineActiveColor,
+ associativeLineTextColor,
+ associativeLineTextFontFamily,
+ associativeLineTextFontSize
+ } = this.getStyleConfig(node, toNode)
+ path
+ .stroke({
+ width: associativeLineWidth,
+ color: associativeLineColor,
+ dasharray: associativeLineDasharray || [6, 4]
+ })
+ .fill({ color: 'none' })
+ clickPath
+ .stroke({
+ width: associativeLineActiveWidth,
+ color: associativeLineActiveColor
+ })
+ .fill({ color: 'none' })
+ markerPath
+ .stroke({ color: associativeLineColor })
+ .fill({ color: associativeLineColor })
+ text.find('text').forEach(textNode => {
+ textNode
+ .fill({
+ color: associativeLineTextColor
+ })
+ .css({
+ 'font-family': associativeLineTextFontFamily,
+ 'font-size': associativeLineTextFontSize + 'px'
+ })
+ })
+ if (this.controlLine1) {
+ this.controlLine1.stroke({ color: associativeLineActiveColor })
+ }
+ if (this.controlLine2) {
+ this.controlLine2.stroke({ color: associativeLineActiveColor })
+ }
+ if (this.controlPoint1) {
+ this.controlPoint1.stroke({ color: associativeLineActiveColor })
+ }
+ if (this.controlPoint2) {
+ this.controlPoint2.stroke({ color: associativeLineActiveColor })
+ }
+ }
+
+ // 激活某根关联线
+ setActiveLine({
+ path,
+ clickPath,
+ markerPath,
+ text,
+ node,
+ toNode,
+ startPoint,
+ endPoint,
+ controlPoints
+ }) {
+ let { associativeLineActiveColor } = this.getStyleConfig(node, toNode)
+ // 如果当前存在激活节点,那么取消激活节点
+ this.mindMap.execCommand('CLEAR_ACTIVE_NODE')
+ // 否则清除当前的关联线的激活状态,如果有的话
+ this.clearActiveLine()
+ // 保存当前激活的关联线信息
+ this.activeLine = [path, clickPath, text, node, toNode, markerPath]
+ // 让不可见的点击线显示
+ clickPath.stroke({ color: associativeLineActiveColor })
+ // 如果没有输入过关联线文字,那么显示默认文字
+ if (!this.getText(node, toNode)) {
+ this.renderText(
+ this.mindMap.opt.defaultAssociativeLineText,
+ path,
+ text,
+ node,
+ toNode
+ )
+ }
+ // 渲染控制点和连线
+ this.renderControls(
+ startPoint,
+ endPoint,
+ controlPoints[0],
+ controlPoints[1],
+ node,
+ toNode
+ )
+ this.mindMap.emit('associative_line_click', path, clickPath, node, toNode)
+ this.front()
+ }
+
+ // 移除所有连接线
+ removeAllLines() {
+ this.lineList.forEach(line => {
+ line[0].remove()
+ line[1].remove()
+ line[2].remove()
+ })
+ this.lineList = []
+ }
+
+ // 从当前激活节点开始创建连接线
+ createLineFromActiveNode() {
+ if (this.mindMap.renderer.activeNodeList.length <= 0) return
+ let node = this.mindMap.renderer.activeNodeList[0]
+ this.createLine(node)
+ }
+
+ // 创建连接线
+ createLine(fromNode) {
+ let {
+ associativeLineWidth,
+ associativeLineColor,
+ associativeLineDasharray
+ } = this.getStyleConfig(fromNode)
+ if (this.isCreatingLine || !fromNode) return
+ this.front()
+ this.isCreatingLine = true
+ this.creatingStartNode = fromNode
+ this.creatingLine = this.associativeLineDraw.path()
+ this.creatingLine
+ .stroke({
+ width: associativeLineWidth,
+ color: associativeLineColor,
+ dasharray: associativeLineDasharray || [6, 4]
+ })
+ .fill({ color: 'none' })
+ // 箭头
+ let markerPath = null
+ const marker = this.createMarker(p => {
+ markerPath = p
+ })
+ markerPath
+ .stroke({ color: associativeLineColor })
+ .fill({ color: associativeLineColor })
+ this.creatingLine.marker('end', marker)
+ }
+
+ // 取消创建关联线
+ cancelCreateLine() {
+ this.isCreatingLine = false
+ this.creatingStartNode = null
+ this.creatingLine.remove()
+ this.creatingLine = null
+ this.overlapNode = null
+ this.back()
+ }
+
+ // 鼠标移动事件
+ onMousemove(e) {
+ this.onControlPointMousemove(e)
+ this.updateCreatingLine(e)
+ }
+
+ // 更新创建过程中的连接线
+ updateCreatingLine(e) {
+ if (!this.isCreatingLine) return
+ let { x, y } = this.getTransformedEventPos(e)
+ let startPoint = getNodePoint(this.creatingStartNode)
+ let offsetX = x > startPoint.x ? -10 : 10
+ let pathStr = cubicBezierPath(startPoint.x, startPoint.y, x + offsetX, y)
+ this.creatingLine.plot(pathStr)
+ this.checkOverlapNode(x, y)
+ }
+
+ // 获取转换后的鼠标事件对象的坐标
+ getTransformedEventPos(e) {
+ let { x, y } = this.mindMap.toPos(e.clientX, e.clientY)
+ let { scaleX, scaleY, translateX, translateY } =
+ this.mindMap.draw.transform()
+ return {
+ x: (x - translateX) / scaleX,
+ y: (y - translateY) / scaleY
+ }
+ }
+
+ // 计算节点偏移位置
+ getNodePos(node) {
+ const { scaleX, scaleY, translateX, translateY } =
+ this.mindMap.draw.transform()
+ const { left, top, width, height } = node
+ let translateLeft = left * scaleX + translateX
+ let translateTop = top * scaleY + translateY
+ return {
+ left,
+ top,
+ translateLeft,
+ translateTop,
+ width,
+ height
+ }
+ }
+
+ // 检测当前移动到的目标节点
+ checkOverlapNode(x, y) {
+ this.overlapNode = null
+ bfsWalk(this.mindMap.renderer.root, node => {
+ if (node.getData('isActive')) {
+ this.mindMap.execCommand('SET_NODE_ACTIVE', node, false)
+ }
+ if (node.uid === this.creatingStartNode.uid || this.overlapNode) {
+ return
+ }
+ let { left, top, width, height } = node
+ let right = left + width
+ let bottom = top + height
+ if (x >= left && x <= right && y >= top && y <= bottom) {
+ this.overlapNode = node
+ }
+ })
+ if (this.overlapNode && !this.overlapNode.getData('isActive')) {
+ this.mindMap.execCommand('SET_NODE_ACTIVE', this.overlapNode, true)
+ }
+ }
+
+ // 完成创建连接线
+ completeCreateLine(node) {
+ if (this.creatingStartNode.uid === node.uid) return
+ const { beforeAssociativeLineConnection } = this.mindMap.opt
+ let stop = false
+ if (typeof beforeAssociativeLineConnection === 'function') {
+ stop = beforeAssociativeLineConnection(node)
+ }
+ if (stop) return
+ this.addLine(this.creatingStartNode, node)
+ if (this.overlapNode && this.overlapNode.getData('isActive')) {
+ this.mindMap.execCommand('SET_NODE_ACTIVE', this.overlapNode, false)
+ }
+ this.cancelCreateLine()
+ }
+
+ // 添加连接线
+ addLine(fromNode, toNode) {
+ if (!fromNode || !toNode) return
+ // 目标节点如果没有id,则生成一个id
+ let uid = toNode.getData('uid')
+ if (!uid) {
+ uid = uuid()
+ this.mindMap.execCommand('SET_NODE_DATA', toNode, {
+ uid
+ })
+ }
+ // 将目标节点id保存起来
+ let list = fromNode.getData('associativeLineTargets') || []
+ // 连线节点是否存在相同的id,存在则阻止添加关联线
+ const sameLine = list.some(item => item === uid)
+ if (sameLine) {
+ return
+ }
+ list.push(uid)
+ // 保存控制点
+ let [startPoint, endPoint] = computeNodePoints(fromNode, toNode)
+ let controlPoints = computeCubicBezierPathPoints(
+ startPoint.x,
+ startPoint.y,
+ endPoint.x,
+ endPoint.y
+ )
+ // 检查是否存在固定位置的配置
+ const { associativeLineInitPointsPosition } = this.mindMap.opt
+ if (associativeLineInitPointsPosition) {
+ const { from, to } = associativeLineInitPointsPosition
+ if (from) {
+ startPoint.dir = from
+ }
+ if (to) {
+ endPoint.dir = to
+ }
+ }
+ let offsetList =
+ fromNode.getData('associativeLineTargetControlOffsets') || []
+ // 保存的实际是控制点和端点的差值,否则当节点位置改变了,控制点还是原来的位置,连线就不对了
+ offsetList[list.length - 1] = [
+ {
+ x: controlPoints[0].x - startPoint.x,
+ y: controlPoints[0].y - startPoint.y
+ },
+ {
+ x: controlPoints[1].x - endPoint.x,
+ y: controlPoints[1].y - endPoint.y
+ }
+ ]
+ let associativeLinePoint = fromNode.getData('associativeLinePoint') || []
+ // 记录关联的起始|结束坐标
+ associativeLinePoint[list.length - 1] = { startPoint, endPoint }
+ this.mindMap.execCommand('SET_NODE_DATA', fromNode, {
+ associativeLineTargets: list,
+ associativeLineTargetControlOffsets: offsetList,
+ associativeLinePoint
+ })
+ }
+
+ // 删除连接线
+ removeLine() {
+ if (!this.activeLine) return
+ let [, , , node, toNode] = this.activeLine
+ this.removeControls()
+ let {
+ associativeLineTargets,
+ associativeLinePoint,
+ associativeLineTargetControlOffsets,
+ associativeLineText,
+ associativeLineStyle
+ } = node.getData()
+ associativeLinePoint = associativeLinePoint || []
+ let targetIndex = getAssociativeLineTargetIndex(node, toNode)
+ // 更新关联线文本数据
+ let newAssociativeLineText = {}
+ if (associativeLineText) {
+ Object.keys(associativeLineText).forEach(item => {
+ if (item !== toNode.getData('uid')) {
+ newAssociativeLineText[item] = associativeLineText[item]
+ }
+ })
+ }
+ // 更新关联线样式数据
+ let newAssociativeLineStyle = {}
+ if (associativeLineStyle) {
+ Object.keys(associativeLineStyle).forEach(item => {
+ if (item !== toNode.getData('uid')) {
+ newAssociativeLineStyle[item] = associativeLineStyle[item]
+ }
+ })
+ }
+ this.mindMap.execCommand('SET_NODE_DATA', node, {
+ // 目标
+ associativeLineTargets: associativeLineTargets.filter((_, index) => {
+ return index !== targetIndex
+ }),
+ // 连接线坐标
+ associativeLinePoint: associativeLinePoint.filter((_, index) => {
+ return index !== targetIndex
+ }),
+ // 偏移量
+ associativeLineTargetControlOffsets: associativeLineTargetControlOffsets
+ ? associativeLineTargetControlOffsets.filter((_, index) => {
+ return index !== targetIndex
+ })
+ : [],
+ // 文本
+ associativeLineText: newAssociativeLineText,
+ // 样式
+ associativeLineStyle: newAssociativeLineStyle
+ })
+ }
+
+ // 清除激活的线
+ clearActiveLine() {
+ if (this.activeLine) {
+ let [, clickPath, text, node, toNode] = this.activeLine
+ clickPath.stroke({
+ color: 'transparent'
+ })
+ // 隐藏关联线文本编辑框
+ this.hideEditTextBox()
+ // 如果当前关联线没有文字,则清空文字节点
+ if (!this.getText(node, toNode)) {
+ text.clear()
+ }
+ this.activeLine = null
+ this.removeControls()
+ this.back()
+ this.mindMap.emit('associative_line_deactivate')
+ }
+ }
+
+ // 处理节点正在拖拽事件
+ onNodeDragging() {
+ if (this.isNodeDragging) return
+ this.isNodeDragging = true
+ this.lineList.forEach(line => {
+ line[0].hide()
+ line[1].hide()
+ line[2].hide()
+ })
+ this.hideControls()
+ }
+
+ // 处理节点拖拽完成事件
+ onNodeDragend() {
+ if (!this.isNodeDragging) return
+ this.lineList.forEach(line => {
+ line[0].show()
+ line[1].show()
+ line[2].show()
+ })
+ this.showControls()
+ this.isNodeDragging = false
+ }
+
+ // 关联线顶层显示
+ front() {
+ if (this.mindMap.opt.associativeLineIsAlwaysAboveNode) return
+ this.associativeLineDraw.front()
+ }
+
+ // 关联线回到原有层级
+ back() {
+ if (this.mindMap.opt.associativeLineIsAlwaysAboveNode) return
+ this.associativeLineDraw.back() // 最底层
+ this.associativeLineDraw.forward() // 连线层上面
+ }
+
+ // 插件被移除前做的事情
+ beforePluginRemove() {
+ this.unBindEvent()
+ }
+
+ // 插件被卸载前做的事情
+ beforePluginDestroy() {
+ this.unBindEvent()
+ }
+}
+
+AssociativeLine.instanceName = 'associativeLine'
+
+export default AssociativeLine
diff --git a/packages/mindmap/src/plugins/Cooperate.js b/packages/mindmap/src/plugins/Cooperate.js
new file mode 100644
index 0000000..ca09a2b
--- /dev/null
+++ b/packages/mindmap/src/plugins/Cooperate.js
@@ -0,0 +1,284 @@
+import * as Y from 'yjs'
+import { WebrtcProvider } from 'y-webrtc'
+import {
+ isSameObject,
+ simpleDeepClone,
+ getType,
+ isUndef,
+ transformTreeDataToObject,
+ transformObjectToTreeData
+} from '../utils/index'
+
+// 协同插件
+class Cooperate {
+ constructor(opt) {
+ this.opt = opt
+ this.mindMap = opt.mindMap
+ // yjs文档
+ this.ydoc = new Y.Doc()
+ // 共享数据
+ this.ymap = null
+ // 连接提供者
+ this.provider = null
+ // 感知数据
+ this.awareness = null
+ this.currentAwarenessData = []
+ this.waitNodeUidMap = {} // 该列表中的uid对应的节点还未渲染完毕
+ // 当前的平级对象类型的思维导图数据
+ this.currentData = null
+ // 用户信息
+ this.userInfo = null
+ // 是否正在重新设置思维导图数据
+ this.isSetData = false
+ // 绑定事件
+ this.bindEvent()
+ // 处理实例化时传入的思维导图数据
+ if (this.mindMap.opt.data) {
+ this.initData(this.mindMap.opt.data)
+ }
+ }
+
+ // 初始化数据
+ initData(data) {
+ data = simpleDeepClone(data)
+ // 解绑原来的数据
+ if (this.ymap) {
+ this.ymap.unobserve(this.onObserve)
+ }
+ // 创建共享数据
+ this.ymap = this.ydoc.getMap()
+ // 思维导图树结构转平级对象结构
+ this.currentData = transformTreeDataToObject(data)
+ // 将思维导图数据添加到共享数据中
+ Object.keys(this.currentData).forEach(uid => {
+ this.ymap.set(uid, this.currentData[uid])
+ })
+ // 监听数据同步
+ this.onObserve = this.onObserve.bind(this)
+ this.ymap.observe(this.onObserve)
+ }
+
+ // 获取yjs doc实例
+ getDoc() {
+ return this.ydoc
+ }
+
+ // 设置连接提供者
+ setProvider(provider, webrtcProviderConfig = {}) {
+ const { roomName, signalingList, ...otherConfig } = webrtcProviderConfig
+ this.provider =
+ provider ||
+ new WebrtcProvider(roomName, this.ydoc, {
+ signaling: signalingList,
+ ...otherConfig
+ })
+ this.awareness = this.provider.awareness
+
+ // 监听状态同步事件
+ this.onAwareness = this.onAwareness.bind(this)
+ this.awareness.on('change', this.onAwareness)
+ }
+
+ // 绑定事件
+ bindEvent() {
+ // 监听思维导图改变
+ this.onDataChange = this.onDataChange.bind(this)
+ this.mindMap.on('data_change', this.onDataChange)
+
+ // 监听思维导图节点激活事件
+ this.onNodeActive = this.onNodeActive.bind(this)
+ this.mindMap.on('node_active', this.onNodeActive)
+
+ // 监听思维导图渲染完毕事件
+ this.onNodeTreeRenderEnd = this.onNodeTreeRenderEnd.bind(this)
+ this.mindMap.on('node_tree_render_end', this.onNodeTreeRenderEnd)
+
+ // 监听设置思维导图数据事件
+ this.onSetData = this.onSetData.bind(this)
+ this.mindMap.on('set_data', this.onSetData)
+ }
+
+ // 解绑事件
+ unBindEvent() {
+ if (this.ymap) {
+ this.ymap.unobserve(this.onObserve)
+ }
+ this.mindMap.off('data_change', this.onDataChange)
+ this.mindMap.off('node_active', this.onNodeActive)
+ this.mindMap.off('node_tree_render_end', this.onNodeTreeRenderEnd)
+ this.mindMap.off('set_data', this.onSetData)
+ this.ydoc.destroy()
+ }
+
+ // 数据同步时的处理,更新当前思维导图
+ onObserve(event) {
+ const data = event.target.toJSON()
+ // 如果数据没有改变直接返回
+ if (isSameObject(data, this.currentData)) return
+ this.currentData = data
+ // 平级对象转树结构
+ const res = transformObjectToTreeData(data)
+ if (!res) return
+ // 更新思维导图画布
+ this.mindMap.updateData(res)
+ }
+
+ // 当前思维导图改变后的处理,触发同步
+ onDataChange(data) {
+ if (this.isSetData) {
+ this.isSetData = false
+ return
+ }
+ const res = transformTreeDataToObject(data)
+ this.updateChanges(res)
+ }
+
+ // 找出更新点
+ updateChanges(data) {
+ const { beforeCooperateUpdate } = this.mindMap.opt
+ const oldData = this.currentData
+ this.currentData = data
+ this.ydoc.transact(() => {
+ // 找出新增的或修改的
+ const createOrUpdateList = []
+ Object.keys(data).forEach(uid => {
+ // 新增的或已经存在的,如果数据发生了改变
+ if (!oldData[uid] || !isSameObject(oldData[uid], data[uid])) {
+ createOrUpdateList.push({
+ uid,
+ data: data[uid],
+ oldData: oldData[uid]
+ })
+ }
+ })
+ if (beforeCooperateUpdate && createOrUpdateList.length > 0) {
+ beforeCooperateUpdate({
+ type: 'createOrUpdate',
+ list: createOrUpdateList,
+ data
+ })
+ }
+ createOrUpdateList.forEach(item => {
+ this.ymap.set(item.uid, item.data)
+ })
+ // 找出删除的
+ const deleteList = []
+ Object.keys(oldData).forEach(uid => {
+ if (!data[uid]) {
+ deleteList.push({ uid, data: oldData[uid] })
+ }
+ })
+ if (beforeCooperateUpdate && deleteList.length > 0) {
+ beforeCooperateUpdate({
+ type: 'delete',
+ list: deleteList
+ })
+ }
+ deleteList.forEach(item => {
+ this.ymap.delete(item.uid)
+ })
+ })
+ }
+
+ // 节点激活状态改变后触发感知数据同步
+ onNodeActive(node, nodeList) {
+ if (this.userInfo) {
+ this.awareness.setLocalStateField(this.userInfo.name, {
+ // 用户信息
+ userInfo: {
+ ...this.userInfo
+ },
+ // 当前激活的节点id列表
+ nodeIdList: nodeList.map(item => {
+ return item.uid
+ })
+ })
+ }
+ }
+
+ // 节点树渲染完毕事件
+ onNodeTreeRenderEnd() {
+ Object.keys(this.waitNodeUidMap).forEach(uid => {
+ const node = this.mindMap.renderer.findNodeByUid(uid)
+ if (node) {
+ node.addUser(this.waitNodeUidMap[uid])
+ }
+ })
+ this.waitNodeUidMap = {}
+ }
+
+ // 监听思维导图数据的重新设置事件
+ onSetData(data) {
+ this.isSetData = true
+ this.initData(data)
+ }
+
+ // 设置用户信息
+ /**
+ * {
+ * id: '', // 必传,用户唯一的id
+ * name: '', // 用户名称。name和avatar两个只传一个即可,如果都传了,会显示avatar
+ * avatar: '', // 用户头像
+ * color: '' // 如果没有传头像,那么会以一个圆形来显示名称的第一个字,文字的颜色为白色,圆的颜色可以通过该字段设置
+ * }
+ **/
+ setUserInfo(userInfo) {
+ if (
+ getType(userInfo) !== 'Object' ||
+ isUndef(userInfo.id) ||
+ (isUndef(userInfo.name) && isUndef(userInfo.avatar))
+ )
+ return
+ this.userInfo = userInfo || null
+ }
+
+ // 监听感知数据同步事件
+ onAwareness() {
+ const walk = (list, callback) => {
+ list.forEach(value => {
+ const userName = Object.keys(value)[0]
+ if (!userName) return
+ const data = value[userName]
+ const userInfo = data.userInfo
+ const nodeIdList = data.nodeIdList
+ nodeIdList.forEach(uid => {
+ const node = this.mindMap.renderer.findNodeByUid(uid)
+ callback(uid, node, userInfo)
+ })
+ })
+ }
+ // 清除之前的数据
+ walk(this.currentAwarenessData, (uid, node, userInfo) => {
+ if (node) {
+ node.removeUser(userInfo)
+ }
+ })
+ // 设置当前数据
+ const data = Array.from(this.awareness.getStates().values())
+ this.currentAwarenessData = data
+ this.waitNodeUidMap = {}
+ walk(data, (uid, node, userInfo) => {
+ // 不显示自己
+ if (userInfo.id === this.userInfo.id) return
+ if (node) {
+ node.addUser(userInfo)
+ } else {
+ this.waitNodeUidMap[uid] = userInfo
+ }
+ })
+ }
+
+ // 插件被移除前做的事情
+ beforePluginRemove() {
+ this.unBindEvent()
+ }
+
+ // 插件被卸载前做的事情
+ beforePluginDestroy() {
+ this.unBindEvent()
+ }
+}
+
+Cooperate.instanceName = 'cooperate'
+
+export default Cooperate
diff --git a/packages/mindmap/src/plugins/Demonstrate.js b/packages/mindmap/src/plugins/Demonstrate.js
new file mode 100644
index 0000000..7d557d7
--- /dev/null
+++ b/packages/mindmap/src/plugins/Demonstrate.js
@@ -0,0 +1,430 @@
+import {
+ walk,
+ getNodeTreeBoundingRect,
+ fullscrrenEvent,
+ fullScreen,
+ exitFullScreen,
+ formatGetNodeGeneralization
+} from '../utils/index'
+import { keyMap } from '../core/command/keyMap'
+
+const defaultConfig = {
+ boxShadowColor: 'rgba(0, 0, 0, 0.8)', // 高亮框四周的区域颜色
+ borderRadius: '5px', // 高亮框的圆角大小
+ transition: 'all 0.3s ease-out', // 高亮框动画的过渡
+ zIndex: 9999, // 高亮框元素的层级
+ padding: 20, // 高亮框的内边距
+ margin: 50, // 高亮框的外边距
+ openBlankMode: true // 是否开启填空模式,即带下划线的文本默认不显示,按回车键才依次显示
+}
+
+// 演示插件
+class Demonstrate {
+ constructor(opt) {
+ this.mindMap = opt.mindMap
+ // 是否正在演示中
+ this.isInDemonstrate = false
+ // 演示的步骤列表
+ this.stepList = []
+ // 当前所在步骤
+ this.currentStepIndex = 0
+ // 当前所在步骤对应的节点实例
+ this.currentStepNode = null
+ // 当前所在步骤节点的下划线文本数据
+ this.currentUnderlineTextData = null
+ // 临时的样式剩余
+ this.tmpStyleEl = null
+ // 高亮样式元素
+ this.highlightEl = null
+ this.transformState = null
+ this.renderTree = null
+ this.config = Object.assign(
+ { ...defaultConfig },
+ this.mindMap.opt.demonstrateConfig || {}
+ )
+ this.needRestorePerformanceMode = false
+ }
+
+ // 进入演示模式
+ enter() {
+ // 全屏
+ this.bindFullscreenEvent()
+ // 如果已经全屏了
+ if (document.fullscreenElement === this.mindMap.el) {
+ this._enter()
+ } else {
+ // 否则申请全屏
+ fullScreen(this.mindMap.el)
+ }
+ }
+
+ _enter() {
+ this.isInDemonstrate = true
+ // 如果开启了性能模式,那么需要暂停
+ this.pausePerformanceMode()
+ // 添加演示用的临时的样式
+ this.addTmpStyles()
+ // 记录演示前的画布状态
+ this.transformState = this.mindMap.view.getTransformData()
+ // 记录演示前的画布数据
+ this.renderTree = this.mindMap.getData()
+ // 暂停收集历史记录
+ this.mindMap.command.pause()
+ // 暂停思维导图快捷键响应
+ this.mindMap.keyCommand.pause()
+ // 创建高亮元素
+ this.createHighlightEl()
+ // 计算步骤数据
+ this.getStepList()
+ // 收起所有节点
+ let wait = false
+ if (this.mindMap.renderer.isRendering) {
+ wait = true
+ }
+ this.mindMap.execCommand('UNEXPAND_ALL', false)
+ const onRenderEnd = () => {
+ if (wait) {
+ wait = false
+ return
+ }
+ this.mindMap.off('node_tree_render_end', onRenderEnd)
+ // 聚焦到第一步
+ this.jump(this.currentStepIndex)
+ this.bindEvent()
+ }
+ this.mindMap.on('node_tree_render_end', onRenderEnd)
+ }
+
+ // 退出演示模式
+ exit() {
+ exitFullScreen(this.mindMap.el)
+ this.mindMap.updateData(this.renderTree)
+ this.mindMap.view.setTransformData(this.transformState)
+ this.renderTree = null
+ this.transformState = null
+ this.stepList = []
+ this.currentStepIndex = 0
+ this.currentStepNode = null
+ this.currentUnderlineTextData = null
+ this.unBindEvent()
+ this.removeTmpStyles()
+ this.removeHighlightEl()
+ this.mindMap.command.recovery()
+ this.mindMap.keyCommand.recovery()
+ this.restorePerformanceMode()
+ this.mindMap.emit('exit_demonstrate')
+ this.isInDemonstrate = false
+ }
+
+ // 暂停性能模式
+ pausePerformanceMode() {
+ const { openPerformance } = this.mindMap.opt
+ if (openPerformance) {
+ this.needRestorePerformanceMode = true
+ this.mindMap.opt.openPerformance = false
+ this.mindMap.renderer.forceLoadNode()
+ }
+ }
+
+ // 恢复性能模式
+ restorePerformanceMode() {
+ if (!this.needRestorePerformanceMode) return
+ this.mindMap.opt.openPerformance = true
+ this.mindMap.renderer.forceLoadNode()
+ }
+
+ // 添加临时的样式
+ addTmpStyles() {
+ this.tmpStyleEl = document.createElement('style')
+ let cssText = `
+ /* 画布所有元素禁止响应鼠标事件 */
+ .smm-mind-map-container {
+ pointer-events: none;
+ }
+ /* 超链接图标允许响应鼠标事件 */
+ .smm-node a {
+ pointer-events: all;
+ }
+ /* 备注图标允许响应鼠标事件 */
+ .smm-node .smm-node-note {
+ pointer-events: all;
+ }
+ `
+ if (this.config.openBlankMode) {
+ cssText += `
+ /* 带下划线的文本内容全部隐藏 */
+ .smm-richtext-node-wrap u {
+ opacity: 0;
+ }
+ `
+ }
+ this.tmpStyleEl.innerText = cssText
+ document.head.appendChild(this.tmpStyleEl)
+ }
+
+ // 移除临时的样式
+ removeTmpStyles() {
+ if (this.tmpStyleEl) document.head.removeChild(this.tmpStyleEl)
+ }
+
+ // 创建高亮元素
+ createHighlightEl() {
+ if (!this.highlightEl) {
+ // 高亮元素
+ this.highlightEl = document.createElement('div')
+ this.highlightEl.style.cssText = `
+ position: absolute;
+ box-shadow: 0 0 0 5000px ${this.config.boxShadowColor};
+ border-radius: ${this.config.borderRadius};
+ transition: ${this.config.transition};
+ z-index: ${this.config.zIndex + 1};
+ pointer-events: none;
+ `
+ this.mindMap.el.appendChild(this.highlightEl)
+ }
+ }
+
+ // 移除高亮元素
+ removeHighlightEl() {
+ if (this.highlightEl) {
+ this.mindMap.el.removeChild(this.highlightEl)
+ this.highlightEl = null
+ }
+ }
+
+ // 更新高亮元素的位置和大小
+ updateHighlightEl({ left, top, width, height }) {
+ const padding = this.config.padding
+ if (left) {
+ this.highlightEl.style.left = left - padding + 'px'
+ }
+ if (top) {
+ this.highlightEl.style.top = top - padding + 'px'
+ }
+ if (width) {
+ this.highlightEl.style.width = width + padding * 2 + 'px'
+ }
+ if (height) {
+ this.highlightEl.style.height = height + padding * 2 + 'px'
+ }
+ }
+
+ // 绑定事件
+ bindEvent() {
+ this.onKeydown = this.onKeydown.bind(this)
+ window.addEventListener('keydown', this.onKeydown)
+ }
+
+ // 绑定全屏事件
+ bindFullscreenEvent() {
+ this.onFullscreenChange = this.onFullscreenChange.bind(this)
+ document.addEventListener(fullscrrenEvent, this.onFullscreenChange)
+ }
+
+ // 解绑事件
+ unBindEvent() {
+ window.removeEventListener('keydown', this.onKeydown)
+ document.removeEventListener(fullscrrenEvent, this.onFullscreenChange)
+ }
+
+ // 全屏状态改变
+ onFullscreenChange() {
+ if (!document.fullscreenElement) {
+ this.exit()
+ } else if (document.fullscreenElement === this.mindMap.el) {
+ this._enter()
+ }
+ }
+
+ // 按键事件
+ onKeydown(e) {
+ // 上一个
+ if (e.keyCode === keyMap.Left) {
+ this.prev()
+ } else if (e.keyCode === keyMap.Right) {
+ // 下一个
+ this.next()
+ } else if (e.keyCode === keyMap.Esc) {
+ // 退出演示
+ this.exit()
+ } else if (e.keyCode === keyMap.Enter) {
+ // 回车键显示隐藏的下划线文本
+ this.showNextUnderlineText()
+ }
+ }
+
+ // 上一张
+ prev() {
+ if (this.currentStepIndex > 0) {
+ this.jump(this.currentStepIndex - 1)
+ }
+ }
+
+ // 下一张
+ next() {
+ const stepLength = this.stepList.length
+ if (this.currentStepIndex < stepLength - 1) {
+ this.jump(this.currentStepIndex + 1)
+ }
+ }
+
+ // 显示隐藏的下划线文本
+ showNextUnderlineText() {
+ if (
+ !this.config.openBlankMode ||
+ !this.currentStepNode ||
+ !this.currentUnderlineTextData
+ )
+ return
+ const { index, list, length } = this.currentUnderlineTextData
+ if (index >= length) return
+ const node = list[index]
+ this.currentUnderlineTextData.index++
+ node.node.style.opacity = 1
+ }
+
+ // 跳转到某一张
+ jump(index) {
+ // 移除该当前下划线元素设置的样式
+ if (this.currentUnderlineTextData) {
+ this.currentUnderlineTextData.list.forEach(item => {
+ item.node.style.opacity = ''
+ })
+ this.currentUnderlineTextData = null
+ }
+ this.currentStepNode = null
+ this.currentStepIndex = index
+ this.mindMap.emit(
+ 'demonstrate_jump',
+ this.currentStepIndex,
+ this.stepList.length
+ )
+ const step = this.stepList[index]
+ // 这一步的节点数据
+ const nodeData = step.node
+ // 该节点的uid
+ const uid = nodeData.data.uid
+ // 根据uid在画布上找到该节点实例
+ const node = this.mindMap.renderer.findNodeByUid(uid)
+ // 如果该节点实例不存在,那么先展开到该节点
+ if (!node) {
+ this.mindMap.renderer.expandToNodeUid(uid, () => {
+ const node = this.mindMap.renderer.findNodeByUid(uid)
+ // 展开后还是没找到,那么就别进入了,否则会死循环
+ if (node) {
+ this.jump(index)
+ }
+ })
+ return
+ }
+ // 1.聚焦到某个节点
+ if (step.type === 'node') {
+ this.currentStepNode = node
+ // 当前节点存在带下划线的文本内容
+ const uNodeList = this.config.openBlankMode ? node.group.find('u') : null
+ if (uNodeList && uNodeList.length > 0) {
+ this.currentUnderlineTextData = {
+ index: 0,
+ list: uNodeList,
+ length: uNodeList.length
+ }
+ }
+ // 适应画布大小
+ this.mindMap.view.fit(
+ () => {
+ return node.group.rbox()
+ },
+ true,
+ this.config.padding + this.config.margin
+ )
+ const rect = node.group.rbox()
+ this.updateHighlightEl({
+ left: rect.x,
+ top: rect.y,
+ width: rect.width,
+ height: rect.height
+ })
+ } else {
+ // 2.聚焦到某个节点的所有子节点
+ // 聚焦该节点的所有子节点
+ const task = () => {
+ // 先收起该节点所有子节点的子节点
+ nodeData.children.forEach(item => {
+ item.data.expand = false
+ })
+ this.mindMap.render(() => {
+ // 适应画布大小
+ this.mindMap.view.fit(
+ () => {
+ const res = getNodeTreeBoundingRect(node, 0, 0, 0, 0, true)
+ return {
+ ...res,
+ x: res.left,
+ y: res.top
+ }
+ },
+ true,
+ this.config.padding + this.config.margin
+ )
+ const res = getNodeTreeBoundingRect(node, 0, 0, 0, 0, true)
+ this.updateHighlightEl(res)
+ })
+ }
+ // 如果该节点是收起状态,那么需要先展开
+ if (!nodeData.data.expand) {
+ this.mindMap.execCommand('SET_NODE_EXPAND', node, true)
+ const onRenderEnd = () => {
+ this.mindMap.off('node_tree_render_end', onRenderEnd)
+ task()
+ }
+ this.mindMap.on('node_tree_render_end', onRenderEnd)
+ } else {
+ // 否则直接聚焦
+ task()
+ }
+ }
+ }
+
+ // 深度度优先遍历所有节点,返回步骤列表
+ getStepList() {
+ walk(this.mindMap.renderer.renderTree, null, node => {
+ this.stepList.push({
+ type: 'node',
+ node
+ })
+ // 添加概要步骤
+ const generalizationList = formatGetNodeGeneralization(node.data)
+ generalizationList.forEach(item => {
+ // 没有uid的直接过滤掉,否则会死循环
+ if (item.uid) {
+ this.stepList.push({
+ type: 'node',
+ node: {
+ data: item
+ }
+ })
+ }
+ })
+ if (node.children.length > 1) {
+ this.stepList.push({
+ type: 'children',
+ node
+ })
+ }
+ })
+ }
+
+ // 插件被移除前做的事情
+ beforePluginRemove() {
+ this.unBindEvent()
+ }
+
+ // 插件被卸载前做的事情
+ beforePluginDestroy() {
+ this.unBindEvent()
+ }
+}
+
+Demonstrate.instanceName = 'demonstrate'
+
+export default Demonstrate
diff --git a/packages/mindmap/src/plugins/Drag.js b/packages/mindmap/src/plugins/Drag.js
new file mode 100644
index 0000000..41cfe65
--- /dev/null
+++ b/packages/mindmap/src/plugins/Drag.js
@@ -0,0 +1,1210 @@
+import {
+ bfsWalk,
+ throttle,
+ getTopAncestorsFomNodeList,
+ getNodeIndexInNodeList,
+ sortNodeList
+} from '../utils'
+import Base from '../layouts/Base'
+import { CONSTANTS } from '../constants/constant'
+import AutoMove from '../utils/AutoMove'
+
+// 节点拖动插件
+class Drag extends Base {
+ // 构造函数
+ constructor({ mindMap }) {
+ super(mindMap.renderer)
+ this.mindMap = mindMap
+ this.autoMove = new AutoMove(mindMap)
+ this.reset()
+ this.bindEvent()
+ }
+
+ // 复位
+ reset() {
+ // 是否正在拖拽中
+ this.isDragging = false
+ // 鼠标按下的节点
+ this.mousedownNode = null
+ // 被拖拽中的节点列表
+ this.beingDragNodeList = []
+ // 当前画布节点列表
+ this.nodeList = []
+ // 当前重叠节点
+ this.overlapNode = null
+ // 当前上一个同级节点
+ this.prevNode = null
+ // 当前下一个同级节点
+ this.nextNode = null
+ // 画布的变换数据
+ this.drawTransform = null
+ // 克隆节点
+ this.clone = null
+ // 同级位置占位符
+ this.placeholder = null
+ this.placeholderWidth = 50
+ this.placeholderHeight = 10
+ this.placeHolderLine = null
+ this.placeHolderExtraLines = []
+ // 鼠标按下位置和节点左上角的偏移量
+ this.offsetX = 0
+ this.offsetY = 0
+ // 当前鼠标是否按下
+ this.isMousedown = false
+ // 拖拽的鼠标位置变量
+ this.mouseDownX = 0
+ this.mouseDownY = 0
+ this.mouseMoveX = 0
+ this.mouseMoveY = 0
+ // 鼠标移动的距离距鼠标按下的位置距离多少以上才认为是拖动事件
+ this.checkDragOffset = 10
+ this.minOffset = 10
+ }
+
+ // 绑定事件
+ bindEvent() {
+ this.onNodeMousedown = this.onNodeMousedown.bind(this)
+ this.onMousemove = this.onMousemove.bind(this)
+ this.onMouseup = this.onMouseup.bind(this)
+ this.checkOverlapNode = throttle(this.checkOverlapNode, 300, this)
+
+ this.mindMap.on('node_mousedown', this.onNodeMousedown)
+ this.mindMap.on('mousemove', this.onMousemove)
+ this.mindMap.on('node_mouseup', this.onMouseup)
+ this.mindMap.on('mouseup', this.onMouseup)
+ }
+
+ // 解绑事件
+ unBindEvent() {
+ this.mindMap.off('node_mousedown', this.onNodeMousedown)
+ this.mindMap.off('mousemove', this.onMousemove)
+ this.mindMap.off('node_mouseup', this.onMouseup)
+ this.mindMap.off('mouseup', this.onMouseup)
+ }
+
+ // 节点鼠标按下事件
+ onNodeMousedown(node, e) {
+ // 只读模式、不是鼠标左键按下、按下的是概要节点或根节点直接返回
+ if (
+ this.mindMap.opt.readonly ||
+ e.which !== 1 ||
+ node.isGeneralization ||
+ node.isRoot
+ ) {
+ return
+ }
+ this.isMousedown = true
+ // 记录鼠标按下时的节点
+ this.mousedownNode = node
+ // 记录鼠标按下的坐标
+ const { x, y } = this.mindMap.toPos(e.clientX, e.clientY)
+ this.mouseDownX = x
+ this.mouseDownY = y
+ }
+
+ // 鼠标移动事件
+ onMousemove(e) {
+ if (this.mindMap.opt.readonly || !this.isMousedown) {
+ return
+ }
+ e.preventDefault()
+ const { x, y } = this.mindMap.toPos(e.clientX, e.clientY)
+ this.mouseMoveX = x
+ this.mouseMoveY = y
+ // 还没开始移动时鼠标位移过小不认为是拖拽
+ if (
+ !this.isDragging &&
+ Math.abs(x - this.mouseDownX) <= this.checkDragOffset &&
+ Math.abs(y - this.mouseDownY) <= this.checkDragOffset
+ ) {
+ return
+ }
+ this.mindMap.emit('node_dragging', this.mousedownNode)
+ this.handleStartMove()
+ this.onMove(x, y, e)
+ }
+
+ // 鼠标松开事件
+ async onMouseup(e) {
+ if (!this.isMousedown) {
+ return
+ }
+ const { autoMoveWhenMouseInEdgeOnDrag, enableFreeDrag, beforeDragEnd } =
+ this.mindMap.opt
+ // 停止自动移动
+ if (autoMoveWhenMouseInEdgeOnDrag && this.mindMap.select) {
+ this.autoMove.clearAutoMoveTimer()
+ }
+ this.isMousedown = false
+ // 恢复被拖拽节点的临时设置
+ this.beingDragNodeList.forEach(node => {
+ node.setOpacity(1)
+ node.showChildren()
+ node.endDrag()
+ })
+ this.removeCloneNode()
+ let overlapNodeUid = this.overlapNode ? this.overlapNode.getData('uid') : ''
+ let prevNodeUid = this.prevNode ? this.prevNode.getData('uid') : ''
+ let nextNodeUid = this.nextNode ? this.nextNode.getData('uid') : ''
+ if (this.isDragging && typeof beforeDragEnd === 'function') {
+ const isCancel = await beforeDragEnd({
+ overlapNodeUid,
+ prevNodeUid,
+ nextNodeUid,
+ beingDragNodeList: [...this.beingDragNodeList]
+ })
+ if (isCancel) {
+ this.reset()
+ return
+ }
+ }
+ // 存在重叠子节点,则移动作为其子节点
+ if (this.overlapNode) {
+ this.removeNodeActive(this.overlapNode)
+ this.mindMap.execCommand(
+ 'MOVE_NODE_TO',
+ this.beingDragNodeList,
+ this.overlapNode
+ )
+ } else if (this.prevNode) {
+ // 存在前一个相邻节点,作为其下一个兄弟节点
+ this.removeNodeActive(this.prevNode)
+ this.mindMap.execCommand(
+ 'INSERT_AFTER',
+ this.beingDragNodeList,
+ this.prevNode
+ )
+ } else if (this.nextNode) {
+ // 存在下一个相邻节点,作为其前一个兄弟节点
+ this.removeNodeActive(this.nextNode)
+ this.mindMap.execCommand(
+ 'INSERT_BEFORE',
+ this.beingDragNodeList,
+ this.nextNode
+ )
+ } else if (
+ this.clone &&
+ enableFreeDrag &&
+ this.beingDragNodeList.length === 1
+ ) {
+ // 如果只拖拽了一个节点,那么设置自定义位置
+ let { x, y } = this.mindMap.toPos(
+ e.clientX - this.offsetX,
+ e.clientY - this.offsetY
+ )
+ let { scaleX, scaleY, translateX, translateY } = this.drawTransform
+ x = (x - translateX) / scaleX
+ y = (y - translateY) / scaleY
+ this.mousedownNode.left = x
+ this.mousedownNode.top = y
+ this.mousedownNode.customLeft = x
+ this.mousedownNode.customTop = y
+ this.mindMap.execCommand(
+ 'SET_NODE_CUSTOM_POSITION',
+ this.mousedownNode,
+ x,
+ y
+ )
+ this.mindMap.render()
+ }
+ if (this.isDragging) {
+ this.mindMap.emit('node_dragend', {
+ overlapNodeUid,
+ prevNodeUid,
+ nextNodeUid
+ })
+ }
+ this.reset()
+ }
+
+ // 移除节点的激活状态
+ removeNodeActive(node) {
+ if (node.getData('isActive')) {
+ this.mindMap.execCommand('SET_NODE_ACTIVE', node, false)
+ }
+ }
+
+ // 拖动中
+ onMove(x, y, e) {
+ if (!this.isMousedown || !this.isDragging) {
+ return
+ }
+ // 更新克隆节点的位置
+ let { scaleX, scaleY, translateX, translateY } = this.drawTransform
+ let cloneNodeLeft = x - this.offsetX
+ let cloneNodeTop = y - this.offsetY
+ x = (cloneNodeLeft - translateX) / scaleX
+ y = (cloneNodeTop - translateY) / scaleY
+ let t = this.clone.transform()
+ this.clone.translate(x - t.translateX, y - t.translateY)
+ // 检测新位置
+ this.checkOverlapNode()
+ // 边缘自动移动画布
+ this.drawTransform = this.mindMap.draw.transform()
+ this.autoMove.clearAutoMoveTimer()
+ this.autoMove.onMove(e.clientX, e.clientY)
+ }
+
+ // 开始拖拽时初始化一些数据
+ async handleStartMove() {
+ if (!this.isDragging) {
+ // 鼠标按下的节点
+ let node = this.mousedownNode
+ // 计算鼠标按下的位置距离节点左上角的距离
+ this.drawTransform = this.mindMap.draw.transform()
+ let { scaleX, scaleY, translateX, translateY } = this.drawTransform
+ this.offsetX = this.mouseDownX - (node.left * scaleX + translateX)
+ this.offsetY = this.mouseDownY - (node.top * scaleY + translateY)
+ // 如果鼠标按下的节点是激活节点,那么保存当前所有激活的节点
+ if (node.getData('isActive')) {
+ // 找出这些激活节点中的最顶层节点
+ // 并按索引从小到大排序
+ this.beingDragNodeList = sortNodeList(
+ getTopAncestorsFomNodeList(
+ // 过滤掉根节点和概要节点
+ this.mindMap.renderer.activeNodeList.filter(item => {
+ return !item.isRoot && !item.isGeneralization
+ })
+ )
+ )
+ } else {
+ // 否则只拖拽按下的节点
+ this.beingDragNodeList = [node]
+ }
+ // 拦截拖拽
+ const { beforeDragStart } = this.mindMap.opt
+ if (typeof beforeDragStart === 'function') {
+ const stop = await beforeDragStart([...this.beingDragNodeList])
+ if (stop) return
+ }
+ // 将节点树转为节点数组
+ this.nodeTreeToList()
+ // 创建克隆节点
+ this.createCloneNode()
+ // 清除当前所有激活的节点
+ this.mindMap.execCommand('CLEAR_ACTIVE_NODE')
+ this.isDragging = true
+ }
+ }
+
+ // 节点由树转换成数组,从子节点到根节点
+ nodeTreeToList() {
+ const list = []
+ bfsWalk(this.mindMap.renderer.root, node => {
+ // 过滤掉当前被拖拽的节点
+ if (this.checkIsInBeingDragNodeList(node)) {
+ return
+ }
+ if (!list[node.layerIndex]) {
+ list[node.layerIndex] = []
+ }
+ list[node.layerIndex].push(node)
+ })
+ this.nodeList = list.reduceRight((res, cur) => {
+ return [...res, ...cur]
+ }, [])
+ }
+
+ // 创建克隆节点
+ createCloneNode() {
+ if (!this.clone) {
+ const {
+ dragMultiNodeRectConfig,
+ dragPlaceholderRectFill,
+ dragPlaceholderLineConfig,
+ dragOpacityConfig,
+ handleDragCloneNode
+ } = this.mindMap.opt
+ const {
+ width: rectWidth,
+ height: rectHeight,
+ fill: rectFill
+ } = dragMultiNodeRectConfig
+ const node = this.beingDragNodeList[0]
+ const lineColor = node.style.merge('lineColor', true)
+ // 如果当前被拖拽的节点数量大于1,那么创建一个矩形示意
+ if (this.beingDragNodeList.length > 1) {
+ this.clone = this.mindMap.otherDraw
+ .rect()
+ .size(rectWidth, rectHeight)
+ .radius(rectHeight / 2)
+ .fill({
+ color: rectFill || lineColor
+ })
+ this.offsetX = rectWidth / 2
+ this.offsetY = rectHeight / 2
+ } else {
+ // 否则克隆当前的节点
+ this.clone = node.group.clone()
+ // 删除展开收起按钮元素
+ const expandEl = this.clone.findOne('.smm-expand-btn')
+ if (expandEl) {
+ expandEl.remove()
+ }
+ this.mindMap.otherDraw.add(this.clone)
+ if (typeof handleDragCloneNode === 'function') {
+ handleDragCloneNode(this.clone)
+ }
+ }
+ this.clone.opacity(dragOpacityConfig.cloneNodeOpacity)
+ this.clone.css('z-index', 99999)
+ // 同级位置提示元素
+ this.placeholder = this.mindMap.otherDraw
+ .rect()
+ .fill({
+ color: dragPlaceholderRectFill || lineColor
+ })
+ .radius(5)
+ this.placeHolderLine = this.mindMap.otherDraw
+ .path()
+ .stroke({
+ color: dragPlaceholderLineConfig.color || lineColor,
+ width: dragPlaceholderLineConfig.width
+ })
+ .fill({ color: 'none' })
+ // 当前被拖拽的节点的临时设置
+ this.beingDragNodeList.forEach(node => {
+ // 降低透明度
+ node.setOpacity(dragOpacityConfig.beingDragNodeOpacity)
+ // 隐藏连线及下级节点
+ node.hideChildren()
+ // 设置拖拽状态
+ node.startDrag()
+ })
+ }
+ }
+
+ // 移除克隆节点
+ removeCloneNode() {
+ if (!this.clone) {
+ return
+ }
+ this.clone.remove()
+ this.placeholder.remove()
+ this.placeHolderLine.remove()
+ this.removeExtraLines()
+ }
+
+ // 移除额外创建的连线
+ removeExtraLines() {
+ this.placeHolderExtraLines.forEach(item => {
+ item.remove()
+ })
+ this.placeHolderExtraLines = []
+ }
+
+ // 检测重叠节点
+ checkOverlapNode() {
+ if (!this.drawTransform || !this.placeholder) {
+ return
+ }
+ const {
+ LOGICAL_STRUCTURE,
+ LOGICAL_STRUCTURE_LEFT,
+ MIND_MAP,
+ ORGANIZATION_STRUCTURE,
+ CATALOG_ORGANIZATION,
+ TIMELINE,
+ TIMELINE2,
+ VERTICAL_TIMELINE,
+ FISHBONE
+ } = CONSTANTS.LAYOUT
+ this.overlapNode = null
+ this.prevNode = null
+ this.nextNode = null
+ this.placeholder.size(0, 0)
+ this.placeHolderLine.hide()
+ this.removeExtraLines()
+ this.nodeList.forEach(node => {
+ if (node.getData('isActive')) {
+ this.mindMap.execCommand('SET_NODE_ACTIVE', node, false)
+ }
+ if (this.overlapNode || (this.prevNode && this.nextNode)) {
+ return
+ }
+ switch (this.mindMap.opt.layout) {
+ case LOGICAL_STRUCTURE:
+ case LOGICAL_STRUCTURE_LEFT:
+ this.handleLogicalStructure(node)
+ break
+ case MIND_MAP:
+ this.handleMindMap(node)
+ break
+ case ORGANIZATION_STRUCTURE:
+ this.handleOrganizationStructure(node)
+ break
+ case CATALOG_ORGANIZATION:
+ this.handleCatalogOrganization(node)
+ break
+ case TIMELINE:
+ this.handleTimeLine(node)
+ break
+ case TIMELINE2:
+ this.handleTimeLine2(node)
+ break
+ case VERTICAL_TIMELINE:
+ this.handleLogicalStructure(node)
+ break
+ case FISHBONE:
+ this.handleFishbone(node)
+ break
+ default:
+ this.handleLogicalStructure(node)
+ }
+ })
+ // 重叠节点,也就是添加为子节点
+ if (this.overlapNode) {
+ this.handleOverlapNode()
+ }
+ }
+
+ // 处理作为子节点的情况
+ handleOverlapNode() {
+ const {
+ LOGICAL_STRUCTURE,
+ LOGICAL_STRUCTURE_LEFT,
+ MIND_MAP,
+ ORGANIZATION_STRUCTURE,
+ CATALOG_ORGANIZATION,
+ TIMELINE,
+ TIMELINE2,
+ VERTICAL_TIMELINE,
+ FISHBONE
+ } = CONSTANTS.LAYOUT
+ const { LEFT, TOP, RIGHT, BOTTOM } = CONSTANTS.LAYOUT_GROW_DIR
+ const layerIndex = this.overlapNode.layerIndex
+ const children = this.overlapNode.children
+ const marginX = this.mindMap.renderer.layout.getMarginX(layerIndex + 1)
+ const marginY = this.mindMap.renderer.layout.getMarginY(layerIndex + 1)
+ const halfPlaceholderWidth = this.placeholderWidth / 2
+ const halfPlaceholderHeight = this.placeholderHeight / 2
+ let dir = ''
+ let x = ''
+ let y = ''
+ let rotate = false
+ let notRenderPlaceholder = false
+ // 目标节点存在子节点,那么基于最后一个子节点定位
+ if (children.length > 0) {
+ const lastChild = children[children.length - 1]
+ const lastNodeRect = this.getNodeRect(lastChild)
+ dir = this.getNewChildNodeDir(lastChild)
+ switch (this.mindMap.opt.layout) {
+ case LOGICAL_STRUCTURE:
+ case MIND_MAP:
+ x =
+ dir === LEFT
+ ? lastNodeRect.originRight - this.placeholderWidth
+ : lastNodeRect.originLeft
+ y = lastNodeRect.originBottom + this.minOffset - halfPlaceholderHeight
+ break
+ case LOGICAL_STRUCTURE_LEFT:
+ x = lastNodeRect.originRight - this.placeholderWidth
+ y = lastNodeRect.originBottom + this.minOffset - halfPlaceholderHeight
+ break
+ case ORGANIZATION_STRUCTURE:
+ rotate = true
+ x = lastNodeRect.originRight + this.minOffset - halfPlaceholderHeight
+ y = lastNodeRect.originTop
+ break
+ case CATALOG_ORGANIZATION:
+ if (layerIndex === 0) {
+ rotate = true
+ x =
+ lastNodeRect.originRight + this.minOffset - halfPlaceholderHeight
+ y = lastNodeRect.originTop
+ } else {
+ x = lastNodeRect.originLeft
+ y =
+ lastNodeRect.originBottom + this.minOffset - halfPlaceholderHeight
+ }
+ break
+ case TIMELINE:
+ if (layerIndex === 0) {
+ rotate = true
+ x =
+ lastNodeRect.originRight + this.minOffset - halfPlaceholderHeight
+ y =
+ lastNodeRect.originTop +
+ lastNodeRect.originHeight / 2 -
+ halfPlaceholderWidth
+ } else {
+ x = lastNodeRect.originLeft
+ y =
+ lastNodeRect.originBottom + this.minOffset - halfPlaceholderHeight
+ }
+ break
+ case TIMELINE2:
+ if (layerIndex === 0) {
+ rotate = true
+ x =
+ lastNodeRect.originRight + this.minOffset - halfPlaceholderHeight
+ y =
+ lastNodeRect.originTop +
+ lastNodeRect.originHeight / 2 -
+ halfPlaceholderWidth
+ } else {
+ x = lastNodeRect.originLeft
+ if (layerIndex === 1) {
+ y =
+ dir === TOP
+ ? lastNodeRect.originTop -
+ this.placeholderHeight -
+ this.minOffset +
+ halfPlaceholderHeight
+ : lastNodeRect.originBottom +
+ this.minOffset -
+ halfPlaceholderHeight
+ } else {
+ y =
+ lastNodeRect.originBottom +
+ this.minOffset -
+ halfPlaceholderHeight
+ }
+ }
+ break
+ case VERTICAL_TIMELINE:
+ if (layerIndex === 0) {
+ x =
+ lastNodeRect.originLeft +
+ lastNodeRect.originWidth / 2 -
+ halfPlaceholderWidth
+ y =
+ lastNodeRect.originBottom + this.minOffset - halfPlaceholderHeight
+ } else {
+ x =
+ dir === RIGHT
+ ? lastNodeRect.originLeft
+ : lastNodeRect.originRight - this.placeholderWidth
+ y =
+ lastNodeRect.originBottom + this.minOffset - halfPlaceholderHeight
+ }
+ break
+ case FISHBONE:
+ if (layerIndex <= 1) {
+ notRenderPlaceholder = true
+ this.mindMap.execCommand('SET_NODE_ACTIVE', this.overlapNode, true)
+ } else {
+ x = lastNodeRect.originLeft
+ y =
+ dir === TOP
+ ? lastNodeRect.originBottom +
+ this.minOffset -
+ halfPlaceholderHeight
+ : lastNodeRect.originTop -
+ this.placeholderHeight -
+ this.minOffset +
+ halfPlaceholderHeight
+ }
+ break
+ default:
+ }
+ } else {
+ // 目标节点不存在子节点,那么基于目标节点定位
+ const nodeRect = this.getNodeRect(this.overlapNode)
+ dir = this.getNewChildNodeDir(this.overlapNode)
+ switch (this.mindMap.opt.layout) {
+ case LOGICAL_STRUCTURE:
+ case MIND_MAP:
+ x =
+ dir === RIGHT
+ ? nodeRect.originRight + marginX
+ : nodeRect.originLeft - this.placeholderWidth - marginX
+ y =
+ nodeRect.originTop +
+ (nodeRect.originHeight - this.placeholderHeight) / 2
+ break
+ case LOGICAL_STRUCTURE_LEFT:
+ x = nodeRect.originLeft - this.placeholderWidth - marginX
+ y =
+ nodeRect.originTop +
+ (nodeRect.originHeight - this.placeholderHeight) / 2
+ break
+ case ORGANIZATION_STRUCTURE:
+ rotate = true
+ x =
+ nodeRect.originLeft +
+ (nodeRect.originWidth - this.placeholderHeight) / 2
+ y = nodeRect.originBottom + marginX
+ break
+ case CATALOG_ORGANIZATION:
+ if (layerIndex === 0) {
+ rotate = true
+ }
+ x = nodeRect.originLeft + nodeRect.originWidth * 0.5
+ y = nodeRect.originBottom + marginX
+ break
+ case TIMELINE:
+ if (layerIndex === 0) {
+ rotate = true
+ }
+ x = nodeRect.originLeft + nodeRect.originWidth * 0.5
+ y = nodeRect.originBottom + marginY
+ break
+ case TIMELINE2:
+ if (layerIndex === 0) {
+ rotate = true
+ }
+ x = nodeRect.originLeft + nodeRect.originWidth * 0.5
+ if (layerIndex === 1) {
+ y =
+ dir === TOP
+ ? nodeRect.originTop - this.placeholderHeight - marginX
+ : nodeRect.originBottom + marginX
+ } else {
+ y = nodeRect.originBottom + marginX
+ }
+ break
+ case VERTICAL_TIMELINE:
+ if (layerIndex === 0) {
+ rotate = true
+ }
+ x =
+ dir === RIGHT
+ ? nodeRect.originRight + marginX
+ : nodeRect.originLeft - this.placeholderWidth - marginX
+ y =
+ nodeRect.originTop +
+ nodeRect.originHeight / 2 -
+ halfPlaceholderHeight
+ break
+ case FISHBONE:
+ if (layerIndex <= 1) {
+ notRenderPlaceholder = true
+ this.mindMap.execCommand('SET_NODE_ACTIVE', this.overlapNode, true)
+ } else {
+ x = nodeRect.originLeft + nodeRect.originWidth * 0.5
+ y =
+ dir === BOTTOM
+ ? nodeRect.originTop -
+ this.placeholderHeight -
+ this.minOffset +
+ halfPlaceholderHeight
+ : nodeRect.originBottom + this.minOffset - halfPlaceholderHeight
+ }
+ break
+ default:
+ }
+ }
+ if (!notRenderPlaceholder) {
+ this.setPlaceholderRect({
+ x,
+ y,
+ dir,
+ rotate
+ })
+ }
+ }
+
+ // 获取节点的生长方向
+ getNewChildNodeDir(node) {
+ const {
+ LOGICAL_STRUCTURE,
+ LOGICAL_STRUCTURE_LEFT,
+ MIND_MAP,
+ TIMELINE2,
+ VERTICAL_TIMELINE,
+ FISHBONE
+ } = CONSTANTS.LAYOUT
+ switch (this.mindMap.opt.layout) {
+ case LOGICAL_STRUCTURE:
+ return CONSTANTS.LAYOUT_GROW_DIR.RIGHT
+ case LOGICAL_STRUCTURE_LEFT:
+ return CONSTANTS.LAYOUT_GROW_DIR.LEFT
+ case MIND_MAP:
+ case TIMELINE2:
+ case VERTICAL_TIMELINE:
+ case FISHBONE:
+ return node.dir
+ default:
+ return ''
+ }
+ }
+
+ // 垂直方向比较
+ // isReverse:是否反向
+ handleVerticalCheck(node, checkList, isReverse = false) {
+ const { layout } = this.mindMap.opt
+ const { LAYOUT, LAYOUT_GROW_DIR } = CONSTANTS
+ const { VERTICAL_TIMELINE, FISHBONE } = LAYOUT
+ const { BOTTOM, LEFT } = LAYOUT_GROW_DIR
+ const mouseMoveX = this.mouseMoveX
+ const mouseMoveY = this.mouseMoveY
+ const nodeRect = this.getNodeRect(node)
+ const dir = this.getNewChildNodeDir(node)
+ const layerIndex = node.layerIndex
+ if (
+ isReverse ||
+ (layout === FISHBONE && dir === BOTTOM && layerIndex >= 3)
+ ) {
+ checkList = checkList.reverse()
+ }
+ let oneFourthHeight = nodeRect.originHeight / 4
+ let { prevBrotherOffset, nextBrotherOffset } =
+ this.getNodeDistanceToSiblingNode(checkList, node, nodeRect, 'v')
+ if (nodeRect.left <= mouseMoveX && nodeRect.right >= mouseMoveX) {
+ // 检测兄弟节点位置
+ if (
+ !this.overlapNode &&
+ !this.prevNode &&
+ !this.nextNode &&
+ !node.isRoot
+ ) {
+ let checkIsPrevNode =
+ nextBrotherOffset > 0 // 距离下一个兄弟节点的距离大于0
+ ? mouseMoveY > nodeRect.bottom &&
+ mouseMoveY <= nodeRect.bottom + nextBrotherOffset // 那么在当前节点外底部判断
+ : mouseMoveY >= nodeRect.bottom - oneFourthHeight &&
+ mouseMoveY <= nodeRect.bottom // 否则在当前节点内底部1/4区间判断
+ let checkIsNextNode =
+ prevBrotherOffset > 0 // 距离上一个兄弟节点的距离大于0
+ ? mouseMoveY < nodeRect.top &&
+ mouseMoveY >= nodeRect.top - prevBrotherOffset // 那么在当前节点外底部判断
+ : mouseMoveY >= nodeRect.top &&
+ mouseMoveY <= nodeRect.top + oneFourthHeight
+
+ const { scaleY } = this.drawTransform
+ let x =
+ dir === LEFT
+ ? nodeRect.originRight - this.placeholderWidth
+ : nodeRect.originLeft
+ let notRenderLine = false
+ switch (layout) {
+ case VERTICAL_TIMELINE:
+ if (layerIndex === 1) {
+ x =
+ nodeRect.originLeft +
+ nodeRect.originWidth / 2 -
+ this.placeholderWidth / 2
+ }
+ break
+ default:
+ }
+ if (checkIsPrevNode) {
+ if (isReverse) {
+ this.nextNode = node
+ } else {
+ this.prevNode = node
+ }
+ let y =
+ nodeRect.originBottom +
+ nextBrotherOffset / scaleY - //nextBrotherOffset已经是实际间距的一半了
+ this.placeholderHeight / 2
+ switch (layout) {
+ case FISHBONE:
+ if (layerIndex === 2) {
+ notRenderLine = true
+ y =
+ nodeRect.originBottom +
+ this.minOffset -
+ this.placeholderHeight / 2
+ }
+ break
+ default:
+ }
+ this.setPlaceholderRect({
+ x,
+ y,
+ dir,
+ notRenderLine
+ })
+ } else if (checkIsNextNode) {
+ if (isReverse) {
+ this.prevNode = node
+ } else {
+ this.nextNode = node
+ }
+ let y =
+ nodeRect.originTop -
+ this.placeholderHeight -
+ prevBrotherOffset / scaleY +
+ this.placeholderHeight / 2
+ switch (layout) {
+ case FISHBONE:
+ if (layerIndex === 2) {
+ notRenderLine = true
+ y =
+ nodeRect.originTop -
+ this.placeholderHeight -
+ this.minOffset +
+ this.placeholderHeight / 2
+ }
+ break
+ default:
+ }
+ this.setPlaceholderRect({
+ x,
+ y,
+ dir,
+ notRenderLine
+ })
+ }
+ }
+ // 检测是否重叠
+ this.checkIsOverlap({
+ node,
+ dir: 'v',
+ prevBrotherOffset,
+ nextBrotherOffset,
+ size: oneFourthHeight,
+ pos: mouseMoveY,
+ nodeRect
+ })
+ }
+ }
+
+ // 水平方向比较
+ handleHorizontalCheck(node, checkList) {
+ const { layout } = this.mindMap.opt
+ const { LAYOUT } = CONSTANTS
+ const { FISHBONE, TIMELINE, TIMELINE2 } = LAYOUT
+ let mouseMoveX = this.mouseMoveX
+ let mouseMoveY = this.mouseMoveY
+ let nodeRect = this.getNodeRect(node)
+ let oneFourthWidth = nodeRect.originWidth / 4
+ let { prevBrotherOffset, nextBrotherOffset } =
+ this.getNodeDistanceToSiblingNode(checkList, node, nodeRect, 'h')
+ if (nodeRect.top <= mouseMoveY && nodeRect.bottom >= mouseMoveY) {
+ // 检测兄弟节点位置
+ if (
+ !this.overlapNode &&
+ !this.prevNode &&
+ !this.nextNode &&
+ !node.isRoot
+ ) {
+ let checkIsPrevNode =
+ nextBrotherOffset > 0 // 距离下一个兄弟节点的距离大于0
+ ? mouseMoveX < nodeRect.right + nextBrotherOffset &&
+ mouseMoveX >= nodeRect.right // 那么在当前节点外底部判断
+ : mouseMoveX <= nodeRect.right &&
+ mouseMoveX >= nodeRect.right - oneFourthWidth // 否则在当前节点内底部1/4区间判断
+ let checkIsNextNode =
+ prevBrotherOffset > 0 // 距离上一个兄弟节点的距离大于0
+ ? mouseMoveX > nodeRect.left - prevBrotherOffset &&
+ mouseMoveX <= nodeRect.left // 那么在当前节点外底部判断
+ : mouseMoveX <= nodeRect.left + oneFourthWidth &&
+ mouseMoveX >= nodeRect.left
+ const { scaleX } = this.drawTransform
+ const layerIndex = node.layerIndex
+ let y = nodeRect.originTop
+ let notRenderLine = false
+ switch (layout) {
+ case TIMELINE:
+ case TIMELINE2:
+ y =
+ nodeRect.originTop +
+ nodeRect.originHeight / 2 -
+ this.placeholderWidth / 2
+ break
+ case FISHBONE:
+ if (layerIndex === 1) {
+ notRenderLine = true
+ y =
+ nodeRect.originTop +
+ nodeRect.originHeight / 2 -
+ this.placeholderWidth / 2
+ }
+ break
+ default:
+ }
+ if (checkIsPrevNode) {
+ this.prevNode = node
+ this.setPlaceholderRect({
+ x:
+ nodeRect.originRight +
+ nextBrotherOffset / scaleX - //nextBrotherOffset已经是实际间距的一半了
+ this.placeholderHeight / 2,
+ y,
+ rotate: true,
+ notRenderLine
+ })
+ } else if (checkIsNextNode) {
+ this.nextNode = node
+ this.setPlaceholderRect({
+ x:
+ nodeRect.originLeft -
+ this.placeholderHeight -
+ prevBrotherOffset / scaleX +
+ this.placeholderHeight / 2,
+ y,
+ rotate: true,
+ notRenderLine
+ })
+ }
+ }
+ // 检测是否重叠
+ this.checkIsOverlap({
+ node,
+ dir: 'h',
+ prevBrotherOffset,
+ nextBrotherOffset,
+ size: oneFourthWidth,
+ pos: mouseMoveX,
+ nodeRect
+ })
+ }
+ }
+
+ // 获取节点距前一个和后一个节点的距离
+ getNodeDistanceToSiblingNode(checkList, node, nodeRect, dir) {
+ const { TOP, LEFT, BOTTOM, RIGHT } = CONSTANTS.LAYOUT_GROW_DIR
+ let { scaleX, scaleY } = this.drawTransform
+ let dir1 = dir === 'v' ? TOP : LEFT
+ let dir2 = dir === 'v' ? BOTTOM : RIGHT
+ let scale = dir === 'v' ? scaleY : scaleX
+ let minOffset = this.minOffset * scale
+ let index = getNodeIndexInNodeList(node, checkList)
+ let prevBrother = null
+ let nextBrother = null
+ if (index !== -1) {
+ if (index - 1 >= 0) {
+ prevBrother = checkList[index - 1]
+ }
+ if (index + 1 <= checkList.length - 1) {
+ nextBrother = checkList[index + 1]
+ }
+ }
+ // 和前一个兄弟节点的距离
+ let prevBrotherOffset = 0
+ if (prevBrother) {
+ let prevNodeRect = this.getNodeRect(prevBrother)
+ prevBrotherOffset = nodeRect[dir1] - prevNodeRect[dir2]
+ // 间距小于10就当它不存在
+ prevBrotherOffset =
+ prevBrotherOffset >= minOffset ? prevBrotherOffset / 2 : 0
+ } else {
+ // 没有前一个兄弟节点,那么假设和前一个节点的距离为20
+ prevBrotherOffset = minOffset
+ }
+ // 和后一个兄弟节点的距离
+ let nextBrotherOffset = 0
+ if (nextBrother) {
+ let nextNodeRect = this.getNodeRect(nextBrother)
+ nextBrotherOffset = nextNodeRect[dir1] - nodeRect[dir2]
+ nextBrotherOffset =
+ nextBrotherOffset >= minOffset ? nextBrotherOffset / 2 : 0
+ } else {
+ nextBrotherOffset = minOffset
+ }
+ return {
+ prevBrother,
+ prevBrotherOffset,
+ nextBrother,
+ nextBrotherOffset
+ }
+ }
+
+ // 设置提示元素的大小和位置
+ setPlaceholderRect({ x, y, dir, rotate, notRenderLine }) {
+ let w = this.placeholderWidth
+ let h = this.placeholderHeight
+ if (rotate) {
+ const tmp = w
+ w = h
+ h = tmp
+ }
+ this.placeholder.size(w, h).move(x, y)
+ if (notRenderLine) {
+ return
+ }
+ const { dragPlaceholderLineConfig } = this.mindMap.opt
+ let node = null
+ let parent = null
+ if (this.overlapNode) {
+ node = this.overlapNode
+ parent = this.overlapNode
+ } else {
+ node = this.prevNode || this.nextNode
+ parent = node.parent
+ }
+ parent = parent.fakeClone()
+ node = node.fakeClone()
+ const tmpNode = this.beingDragNodeList[0].fakeClone()
+ tmpNode.dir = dir
+ tmpNode.left = x
+ tmpNode.top = y
+ tmpNode.width = w
+ tmpNode.height = h
+ parent.children = [tmpNode]
+ parent._lines = []
+ this.placeHolderLine.show()
+ this.mindMap.renderer.layout.renderLine(
+ parent,
+ [this.placeHolderLine],
+ (...args) => {
+ // node.styleLine(...args)
+ },
+ node.style.getStyle('lineStyle', true)
+ )
+ this.placeHolderExtraLines = [...parent._lines]
+ this.placeHolderExtraLines.forEach(line => {
+ this.mindMap.otherDraw.add(line)
+ line
+ .stroke({
+ color: dragPlaceholderLineConfig.color,
+ width: dragPlaceholderLineConfig.width
+ })
+ .fill({ color: 'none' })
+ })
+ }
+
+ // 检测是否重叠
+ checkIsOverlap({
+ node,
+ dir,
+ prevBrotherOffset,
+ nextBrotherOffset,
+ size,
+ pos,
+ nodeRect
+ }) {
+ const { TOP, LEFT, BOTTOM, RIGHT } = CONSTANTS.LAYOUT_GROW_DIR
+ let dir1 = dir === 'v' ? TOP : LEFT
+ let dir2 = dir === 'v' ? BOTTOM : RIGHT
+ if (!this.overlapNode && !this.prevNode && !this.nextNode) {
+ if (
+ nodeRect[dir1] + (prevBrotherOffset > 0 ? 0 : size) <= pos &&
+ nodeRect[dir2] - (nextBrotherOffset > 0 ? 0 : size) >= pos
+ ) {
+ this.overlapNode = node
+ }
+ }
+ }
+
+ // 处理逻辑结构图
+ handleLogicalStructure(node) {
+ const checkList = this.commonGetNodeCheckList(node)
+ this.handleVerticalCheck(node, checkList)
+ }
+
+ // 处理思维导图
+ handleMindMap(node) {
+ const checkList = node.parent
+ ? node.parent.children.filter(item => {
+ let sameDir = true
+ if (node.layerIndex === 1) {
+ sameDir = item.dir === node.dir
+ }
+ return sameDir && !this.checkIsInBeingDragNodeList(item)
+ })
+ : []
+ this.handleVerticalCheck(node, checkList)
+ }
+
+ // 处理组织结构图
+ handleOrganizationStructure(node) {
+ const checkList = this.commonGetNodeCheckList(node)
+ this.handleHorizontalCheck(node, checkList)
+ }
+
+ // 处理目录组织图
+ handleCatalogOrganization(node) {
+ const checkList = this.commonGetNodeCheckList(node)
+ if (node.layerIndex === 1) {
+ this.handleHorizontalCheck(node, checkList)
+ } else {
+ this.handleVerticalCheck(node, checkList)
+ }
+ }
+
+ // 处理时间轴
+ handleTimeLine(node) {
+ let checkList = this.commonGetNodeCheckList(node)
+ if (node.layerIndex === 1) {
+ this.handleHorizontalCheck(node, checkList)
+ } else {
+ this.handleVerticalCheck(node, checkList)
+ }
+ }
+
+ // 处理时间轴2
+ handleTimeLine2(node) {
+ let checkList = this.commonGetNodeCheckList(node)
+ if (node.layerIndex === 1) {
+ this.handleHorizontalCheck(node, checkList)
+ } else {
+ // 处于上方的三级节点需要特殊处理,因为节点排列方向反向了
+ if (node.dir === CONSTANTS.LAYOUT_GROW_DIR.TOP && node.layerIndex === 2) {
+ this.handleVerticalCheck(node, checkList, true)
+ } else {
+ this.handleVerticalCheck(node, checkList)
+ }
+ }
+ }
+
+ // 处理鱼骨图
+ handleFishbone(node) {
+ let checkList = node.parent
+ ? node.parent.children.filter(item => {
+ return item.layerIndex > 1 && !this.checkIsInBeingDragNodeList(item)
+ })
+ : []
+ if (node.layerIndex === 1) {
+ this.handleHorizontalCheck(node, checkList)
+ } else {
+ // 处于上方的三级节点需要特殊处理,因为节点排列方向反向了
+ if (node.dir === CONSTANTS.LAYOUT_GROW_DIR.TOP && node.layerIndex === 2) {
+ this.handleVerticalCheck(node, checkList, true)
+ } else {
+ this.handleVerticalCheck(node, checkList)
+ }
+ }
+ }
+
+ // 获取节点的兄弟节点列表通用方法
+ commonGetNodeCheckList(node) {
+ return node.parent
+ ? [...node.parent.children].filter(item => {
+ return !this.checkIsInBeingDragNodeList(item)
+ })
+ : []
+ }
+
+ // 计算节点的位置尺寸信息
+ getNodeRect(node) {
+ let { scaleX, scaleY, translateX, translateY } = this.drawTransform
+ let { left, top, width, height } = node
+ let originWidth = width
+ let originHeight = height
+ let originLeft = left
+ let originTop = top
+ let originBottom = top + height
+ let originRight = left + width
+ let right = (left + width) * scaleX + translateX
+ let bottom = (top + height) * scaleY + translateY
+ left = left * scaleX + translateX
+ top = top * scaleY + translateY
+ return {
+ left,
+ top,
+ right,
+ bottom,
+ originWidth,
+ originHeight,
+ originLeft,
+ originTop,
+ originBottom,
+ originRight
+ }
+ }
+
+ // 检查某个节点是否在被拖拽节点内
+ checkIsInBeingDragNodeList(node) {
+ return !!this.beingDragNodeList.find(item => {
+ return item.uid === node.uid || item.isAncestor(node)
+ })
+ }
+
+ // 插件被移除前做的事情
+ beforePluginRemove() {
+ this.unBindEvent()
+ }
+
+ // 插件被卸载前做的事情
+ beforePluginDestroy() {
+ this.unBindEvent()
+ }
+}
+
+Drag.instanceName = 'drag'
+
+export default Drag
diff --git a/packages/mindmap/src/plugins/Export.js b/packages/mindmap/src/plugins/Export.js
new file mode 100644
index 0000000..bb57645
--- /dev/null
+++ b/packages/mindmap/src/plugins/Export.js
@@ -0,0 +1,391 @@
+import {
+ imgToDataUrl,
+ downloadFile,
+ readBlob,
+ removeHTMLEntities,
+ resizeImgSize,
+ handleSelfCloseTags,
+ addXmlns
+} from '../utils'
+import { SVG } from '@svgdotjs/svg.js'
+import drawBackgroundImageToCanvas from '../utils/simulateCSSBackgroundInCanvas'
+import { transformToMarkdown } from '../parse/toMarkdown'
+import { ERROR_TYPES } from '../constants/constant'
+import { transformToTxt } from '../parse/toTxt'
+
+// 导出插件
+class Export {
+ // 构造函数
+ constructor(opt) {
+ this.mindMap = opt.mindMap
+ }
+
+ // 导出
+ async export(type, isDownload = true, name = '思维导图', ...args) {
+ if (this[type]) {
+ const result = await this[type](name, ...args)
+ if (isDownload) {
+ downloadFile(result, name + '.' + type)
+ }
+ return result
+ } else {
+ return null
+ }
+ }
+
+ // 创建图片url转换任务
+ createTransformImgTaskList(svg, tagName, propName, getUrlFn) {
+ const imageList = svg.find(tagName)
+ return imageList.map(async item => {
+ const imgUlr = getUrlFn(item)
+ // 已经是data:URL形式不用转换
+ if (/^data:/.test(imgUlr) || imgUlr === 'none') {
+ return
+ }
+ const imgData = await imgToDataUrl(imgUlr)
+ item.attr(propName, imgData)
+ })
+ }
+
+ // 获取svg数据
+ async getSvgData(node) {
+ let {
+ exportPaddingX,
+ exportPaddingY,
+ errorHandler,
+ resetCss,
+ addContentToHeader,
+ addContentToFooter,
+ handleBeingExportSvg
+ } = this.mindMap.opt
+ let { svg, svgHTML, clipData } = this.mindMap.getSvgData({
+ paddingX: exportPaddingX,
+ paddingY: exportPaddingY,
+ addContentToHeader,
+ addContentToFooter,
+ node
+ })
+ if (clipData) {
+ clipData.paddingX = exportPaddingX
+ clipData.paddingY = exportPaddingY
+ }
+ let svgIsChange = false
+ // svg的image标签,把图片的url转换成data:url类型,否则导出会丢失图片
+ const task1 = this.createTransformImgTaskList(
+ svg,
+ 'image',
+ 'href',
+ item => {
+ return item.attr('href') || item.attr('xlink:href')
+ }
+ )
+ // html的img标签
+ const task2 = this.createTransformImgTaskList(svg, 'img', 'src', item => {
+ return item.attr('src')
+ })
+ const taskList = [...task1, ...task2]
+ try {
+ await Promise.all(taskList)
+ } catch (error) {
+ errorHandler(ERROR_TYPES.EXPORT_LOAD_IMAGE_ERROR, error)
+ }
+ // 开启了节点富文本编辑,需要增加一些样式
+ if (this.mindMap.richText) {
+ const foreignObjectList = svg.find('foreignObject')
+ if (foreignObjectList.length > 0) {
+ foreignObjectList[0].add(SVG(``))
+ svgIsChange = true
+ }
+ // 如果还开启了数学公式,还要插入katex库的样式
+ if (this.mindMap.formula) {
+ const formulaList = svg.find('.ql-formula')
+ if (formulaList.length > 0) {
+ const styleText = this.mindMap.formula.getStyleText()
+ if (styleText) {
+ const styleEl = document.createElement('style')
+ styleEl.innerHTML = styleText
+ addXmlns(styleEl)
+ foreignObjectList[0].add(styleEl)
+ svgIsChange = true
+ }
+ }
+ }
+ }
+ // 自定义处理svg的方法
+ if (typeof handleBeingExportSvg === 'function') {
+ svgIsChange = true
+ svg = handleBeingExportSvg(svg)
+ }
+ // svg节点内容有变,需要重新获取html字符串
+ if (taskList.length > 0 || svgIsChange) {
+ svgHTML = svg.svg()
+ }
+ return {
+ node: svg,
+ str: svgHTML,
+ clipData
+ }
+ }
+
+ // svg转png
+ svgToPng(svgSrc, transparent, clipData = null) {
+ const { maxCanvasSize, minExportImgCanvasScale } = this.mindMap.opt
+ return new Promise((resolve, reject) => {
+ const img = new Image()
+ // 跨域图片需要添加这个属性,否则画布被污染了无法导出图片
+ img.setAttribute('crossOrigin', 'anonymous')
+ img.onload = async () => {
+ try {
+ const canvas = document.createElement('canvas')
+ const dpr = Math.max(window.devicePixelRatio, minExportImgCanvasScale)
+ let imgWidth = img.width
+ let imgHeight = img.height
+ // 如果是裁减操作的话,那么需要手动添加内边距,及调整图片大小为实际的裁减区域的大小,不要忘了内边距哦
+ let paddingX = 0
+ let paddingY = 0
+ if (clipData) {
+ paddingX = clipData.paddingX
+ paddingY = clipData.paddingY
+ imgWidth = clipData.width + paddingX * 2
+ imgHeight = clipData.height + paddingY * 2
+ }
+ // 检查是否超出canvas支持的像素上限
+ // canvas大小需要乘以dpr
+ let canvasWidth = imgWidth * dpr
+ let canvasHeight = imgHeight * dpr
+ if (canvasWidth > maxCanvasSize || canvasHeight > maxCanvasSize) {
+ let newWidth = null
+ let newHeight = null
+ if (canvasWidth > maxCanvasSize) {
+ // 如果宽度超出限制,那么调整为上限值
+ newWidth = maxCanvasSize
+ } else if (canvasHeight > maxCanvasSize) {
+ // 高度同理
+ newHeight = maxCanvasSize
+ }
+ // 计算缩放后的宽高
+ const res = resizeImgSize(
+ canvasWidth,
+ canvasHeight,
+ newWidth,
+ newHeight
+ )
+ canvasWidth = res[0]
+ canvasHeight = res[1]
+ }
+ canvas.width = canvasWidth
+ canvas.height = canvasHeight
+ const styleWidth = canvasWidth / dpr
+ const styleHeight = canvasHeight / dpr
+ canvas.style.width = styleWidth + 'px'
+ canvas.style.height = styleHeight + 'px'
+ const ctx = canvas.getContext('2d')
+ ctx.scale(dpr, dpr)
+ // 绘制背景
+ if (!transparent) {
+ await this.drawBackgroundToCanvas(ctx, styleWidth, styleHeight)
+ }
+ // 图片绘制到canvas里
+ // 如果有裁减数据,那么需要进行裁减
+ if (clipData) {
+ ctx.drawImage(
+ img,
+ clipData.left,
+ clipData.top,
+ clipData.width,
+ clipData.height,
+ paddingX,
+ paddingY,
+ clipData.width,
+ clipData.height
+ )
+ } else {
+ ctx.drawImage(img, 0, 0, styleWidth, styleHeight)
+ }
+ resolve(canvas.toDataURL())
+ } catch (error) {
+ reject(error)
+ }
+ }
+ img.onerror = e => {
+ reject(e)
+ }
+ img.src = svgSrc
+ })
+ }
+
+ // 在canvas上绘制思维导图背景
+ drawBackgroundToCanvas(ctx, width, height) {
+ return new Promise((resolve, reject) => {
+ const {
+ backgroundColor = '#fff',
+ backgroundImage,
+ backgroundRepeat = 'no-repeat',
+ backgroundPosition = 'center center',
+ backgroundSize = 'cover'
+ } = this.mindMap.themeConfig
+ // 背景颜色
+ ctx.save()
+ ctx.rect(0, 0, width, height)
+ ctx.fillStyle = backgroundColor
+ ctx.fill()
+ ctx.restore()
+ // 背景图片
+ if (backgroundImage && backgroundImage !== 'none') {
+ ctx.save()
+ drawBackgroundImageToCanvas(
+ ctx,
+ width,
+ height,
+ backgroundImage,
+ {
+ backgroundRepeat,
+ backgroundPosition,
+ backgroundSize
+ },
+ err => {
+ if (err) {
+ reject(err)
+ } else {
+ resolve()
+ }
+ ctx.restore()
+ }
+ )
+ } else {
+ resolve()
+ }
+ })
+ }
+
+ // 在svg上绘制思维导图背景
+ drawBackgroundToSvg(svg) {
+ return new Promise(async resolve => {
+ const {
+ backgroundColor = '#fff',
+ backgroundImage,
+ backgroundRepeat = 'repeat'
+ } = this.mindMap.themeConfig
+ // 背景颜色
+ svg.css('background-color', backgroundColor)
+ // 背景图片
+ if (backgroundImage && backgroundImage !== 'none') {
+ const imgDataUrl = await imgToDataUrl(backgroundImage)
+ svg.css('background-image', `url(${imgDataUrl})`)
+ svg.css('background-repeat', backgroundRepeat)
+ resolve()
+ } else {
+ resolve()
+ }
+ })
+ }
+
+ // 导出为png
+ /**
+ * 方法1.把svg的图片都转化成data:url格式,再转换
+ * 方法2.把svg的图片提取出来再挨个绘制到canvas里,最后一起转换
+ */
+ async png(name, transparent = false, node = null) {
+ this.handleNodeExport(node)
+ const { str, clipData } = await this.getSvgData(node)
+ const svgUrl = await this.fixSvgStrAndToBlob(str)
+ const res = await this.svgToPng(svgUrl, transparent, clipData)
+ return res
+ }
+
+ // 导出指定节点,如果该节点是激活状态,那么取消激活和隐藏展开收起按钮
+ handleNodeExport(node) {
+ if (node && node.getData('isActive')) {
+ node.deactivate()
+ const { alwaysShowExpandBtn, notShowExpandBtn } = this.mindMap.opt
+ if (!alwaysShowExpandBtn && !notShowExpandBtn && node.getData('expand')) {
+ node.removeExpandBtn()
+ }
+ }
+ }
+
+ // 导出为pdf
+ async pdf(name, transparent = false) {
+ if (!this.mindMap.doExportPDF) {
+ throw new Error('请注册ExportPDF插件')
+ }
+ const img = await this.png(name, transparent)
+ // 使用jspdf库
+ // await this.mindMap.doExportPDF.pdf(name, img)
+ // 使用pdf-lib库
+ const res = await this.mindMap.doExportPDF.pdf(img)
+ return res
+ }
+
+ // 导出为xmind
+ async xmind(name) {
+ if (!this.mindMap.doExportXMind) {
+ throw new Error('请注册ExportXMind插件')
+ }
+ const data = this.mindMap.getData()
+ const blob = await this.mindMap.doExportXMind.xmind(data, name)
+ const res = await readBlob(blob)
+ return res
+ }
+
+ // 导出为svg
+ async svg(name) {
+ const { node } = await this.getSvgData()
+ node.first().before(SVG(`${name}`))
+ await this.drawBackgroundToSvg(node)
+ const str = node.svg()
+ const res = await this.fixSvgStrAndToBlob(str)
+ return res
+ }
+
+ // 修复svg字符串,并且转换为blob数据
+ async fixSvgStrAndToBlob(str) {
+ // 移除字符串中的html实体
+ str = removeHTMLEntities(str)
+ // 给html自闭合标签添加闭合状态
+ str = handleSelfCloseTags(str)
+ // 转换成blob数据
+ const blob = new Blob([str], {
+ type: 'image/svg+xml'
+ })
+ const res = await readBlob(blob)
+ return res
+ }
+
+ // 导出为json
+ async json(name, withConfig = true) {
+ const data = this.mindMap.getData(withConfig)
+ const str = JSON.stringify(data)
+ const blob = new Blob([str])
+ const res = await readBlob(blob)
+ return res
+ }
+
+ // 专有文件,其实就是json文件
+ async smm(name, withConfig) {
+ const res = await this.json(name, withConfig)
+ return res
+ }
+
+ // markdown文件
+ async md() {
+ const data = this.mindMap.getData()
+ const content = transformToMarkdown(data)
+ const blob = new Blob([content])
+ const res = await readBlob(blob)
+ return res
+ }
+
+ // txt文件
+ async txt() {
+ const data = this.mindMap.getData()
+ const content = transformToTxt(data)
+ const blob = new Blob([content])
+ const res = await readBlob(blob)
+ return res
+ }
+}
+
+Export.instanceName = 'doExport'
+
+export default Export
diff --git a/packages/mindmap/src/plugins/ExportPDF.js b/packages/mindmap/src/plugins/ExportPDF.js
new file mode 100644
index 0000000..6cf902c
--- /dev/null
+++ b/packages/mindmap/src/plugins/ExportPDF.js
@@ -0,0 +1,71 @@
+// import JsPDF from '../utils/jspdf'
+import { PDFDocument } from 'pdf-lib'
+import { readBlob } from '../utils/index'
+
+// 导出PDF插件,需要通过Export插件使用
+class ExportPDF {
+ // 构造函数
+ constructor(opt) {
+ this.mindMap = opt.mindMap
+ }
+
+ // 使用pdf-lib库导出为pdf
+ async pdf(img) {
+ return new Promise((resolve, reject) => {
+ const image = new Image()
+ image.onload = async () => {
+ const imageWidth = image.width
+ const imageHeight = image.height
+ // 创建pdf页面,尺寸设置为图片的大小
+ const pdfDoc = await PDFDocument.create()
+ const page = pdfDoc.addPage()
+ page.setSize(imageWidth, imageHeight)
+ // 添加图片到pdf
+ const pngImage = await pdfDoc.embedPng(img)
+ page.drawImage(pngImage, {
+ x: 0,
+ y: 0,
+ width: imageWidth,
+ height: imageHeight
+ })
+ const pdfBytes = await pdfDoc.save()
+ const blob = new Blob([pdfBytes])
+ const res = await readBlob(blob)
+ resolve(res)
+ }
+ image.onerror = e => {
+ reject(e)
+ }
+ image.src = img
+ })
+ }
+
+ // 使用jspdf库导出为pdf
+ // async pdf(name, img) {
+ // return new Promise((resolve, reject) => {
+ // const image = new Image()
+ // image.onload = () => {
+ // const imageWidth = image.width
+ // const imageHeight = image.height
+ // const pdf = new JsPDF({
+ // unit: 'px',
+ // format: [imageWidth, imageHeight],
+ // compress: true,
+ // hotfixes: ['px_scaling'],
+ // orientation: imageWidth > imageHeight ? 'landscape' : 'portrait'
+ // })
+ // pdf.addImage(img, 'PNG', 0, 0, imageWidth, imageHeight)
+ // pdf.save(name)
+ // resolve()
+ // }
+ // image.onerror = e => {
+ // reject(e)
+ // }
+ // image.src = img
+ // })
+ // }
+}
+
+ExportPDF.instanceName = 'doExportPDF'
+
+export default ExportPDF
diff --git a/packages/mindmap/src/plugins/ExportXMind.js b/packages/mindmap/src/plugins/ExportXMind.js
new file mode 100644
index 0000000..aeccf60
--- /dev/null
+++ b/packages/mindmap/src/plugins/ExportXMind.js
@@ -0,0 +1,24 @@
+import xmind from '../parse/xmind'
+
+// 导出XMind插件,需要通过Export插件使用
+class ExportXMind {
+ // 构造函数
+ constructor(opt) {
+ this.mindMap = opt.mindMap
+ }
+
+ // 导出xmind
+ async xmind(data, name) {
+ const zipData = await xmind.transformToXmind(data, name)
+ return zipData
+ }
+
+ // 获取解析器
+ getXmind() {
+ return xmind
+ }
+}
+
+ExportXMind.instanceName = 'doExportXMind'
+
+export default ExportXMind
diff --git a/packages/mindmap/src/plugins/Formula.ts b/packages/mindmap/src/plugins/Formula.ts
new file mode 100644
index 0000000..ca3e577
--- /dev/null
+++ b/packages/mindmap/src/plugins/Formula.ts
@@ -0,0 +1,232 @@
+import katex from 'katex'
+import Quill from 'quill'
+import { getChromeVersion, htmlEscape } from '../utils/index'
+import { getBaseStyleText, getFontStyleText } from './FormulaStyle'
+import MindMap from '..'
+class BaseQuillFormula {
+ static create(value: string): HTMLElement {
+ return document.createElement('span');
+ }
+}
+let extended = false
+const QuillFormula = Quill.import('formats/formula') as typeof BaseQuillFormula
+
+interface FormulaOptions {
+ mindMap: MindMap
+ enableEditFormulaInRichTextEdit?: boolean
+ transformRichTextOnEnterEdit?: (text: string) => string
+ beforeHideRichTextEdit?: (richText: any) => void
+ katexFontPath?: string
+ getKatexOutputType?: () => string
+ openRealtimeRenderOnNodeTextEdit?: boolean
+}
+declare global {
+ interface Window {
+ katex: typeof katex;
+ }
+}
+
+// 数学公式支持插件
+// 该插件在富文本模式下可用
+class Formula {
+ static instanceName = 'formula'
+
+ private opt: FormulaOptions
+ private mindMap: MindMap
+ private config: {
+ throwOnError: boolean
+ errorColor: string
+ output: 'mathml' | 'html'
+ }
+ private cssEl: HTMLStyleElement | null
+
+ constructor(opt: FormulaOptions) {
+ this.opt = opt
+ this.mindMap = opt.mindMap
+ window.katex = katex
+ this.init()
+ this.config = this.getKatexConfig()
+ this.cssEl = null
+ this.addStyle()
+ this.extendQuill()
+ this.onDestroy = this.onDestroy.bind(this)
+ this.mindMap.on('beforeDestroy', this.onDestroy)
+ }
+
+ private onDestroy(): void {
+ const instanceCount = Object.getPrototypeOf(this.mindMap).constructor
+ .instanceCount
+ if (instanceCount <= 1) {
+ extended = false
+ Quill.register('formats/formula', QuillFormula, true)
+ }
+ }
+
+ private init(): void {
+ if (this.mindMap.opt.enableEditFormulaInRichTextEdit) {
+ this.mindMap.opt.transformRichTextOnEnterEdit =
+ this.latexRichToText.bind(this)
+ this.mindMap.opt.beforeHideRichTextEdit = this.formatLatex.bind(this)
+ }
+ }
+
+ private getKatexConfig() {
+ const config = {
+ throwOnError: false,
+ errorColor: '#f00',
+ output: 'mathml' as 'mathml' | 'html'
+ }
+
+ let { getKatexOutputType } = this.mindMap.opt
+ getKatexOutputType =
+ getKatexOutputType ||
+ function () {
+ const chromeVersion = getChromeVersion()
+ if (chromeVersion && chromeVersion <= 100) {
+ return 'html'
+ }
+ return undefined
+ }
+ const output = getKatexOutputType() || 'mathml'
+ config.output = ['mathml', 'html'].includes(output) ? output as 'mathml' | 'html' : 'mathml'
+ return config
+ }
+
+ private extendQuill(): void {
+ if (extended) return
+ extended = true
+
+ const self = this
+
+ class CustomFormulaBlot extends QuillFormula {
+ static create(value: string) {
+ let node = super.create(value)
+ if (typeof value === 'string') {
+ katex.render(value, node, self.config)
+ node.setAttribute('data-value', htmlEscape(value))
+ }
+ return node
+ }
+ }
+
+ Quill.register('formats/formula', CustomFormulaBlot, true)
+ }
+
+ private getStyleText(): string {
+ const { katexFontPath } = this.mindMap.opt
+ let text = ''
+ if (this.config.output === 'html') {
+ text = getFontStyleText(katexFontPath)
+ }
+ text += getBaseStyleText()
+ return text
+ }
+
+ private addStyle(): void {
+ this.cssEl = document.createElement('style')
+ this.cssEl.type = 'text/css'
+ this.cssEl.innerHTML = this.getStyleText()
+ document.head.appendChild(this.cssEl)
+ }
+
+ private removeStyle(): void {
+ if (this.cssEl) {
+ document.head.removeChild(this.cssEl)
+ }
+ }
+
+ public insertFormulaToNode(node: any, formula: string): void {
+ const richTextPlugin = this.mindMap.richText
+ richTextPlugin.showEditText({ node })
+ richTextPlugin.quill.insertEmbed(
+ richTextPlugin.quill.getLength() - 1,
+ 'formula',
+ formula
+ )
+ richTextPlugin.hideEditText([node])
+ }
+
+ public latexRichToText(nodeText: string): string {
+ if (nodeText.indexOf('class="ql-formula"') !== -1) {
+ const parser = new DOMParser()
+ const doc = parser.parseFromString(nodeText, 'text/html')
+ const els = doc.getElementsByClassName('ql-formula')
+ for (const el of els) {
+ nodeText = nodeText.replace(
+ el.outerHTML,
+ `$${el.getAttribute('data-value')}$`
+ )
+ }
+ if (this.mindMap.opt.openRealtimeRenderOnNodeTextEdit) {
+ setTimeout(() => {
+ this.mindMap.emit('node_text_edit_change', {
+ node: this.mindMap.richText.node,
+ text: this.mindMap.richText.getEditText(),
+ richText: true
+ })
+ }, 0)
+ }
+ }
+ return nodeText
+ }
+
+ public formatLatex(richText: any): void {
+ const contents = richText.quill.getContents()
+ const ops = contents.ops
+ let mod = false
+ for (let i = ops.length - 1; i >= 0; i--) {
+ const op = ops[i]
+ const insert = op.insert
+ if (insert && typeof insert !== 'object' && insert !== '\n') {
+ if (/\$.+?\$/g.test(insert)) {
+ const m = [...insert.matchAll(/\$.+?\$/g)]
+ const arr = insert.split(/\$.+?\$/g)
+ for (let j = m.length - 1; j >= 0; j--) {
+ const exp = m[j] && m[j][0] ? m[j][0].slice(1, -1) || null : null
+ if (exp !== null && exp.trim().length > 0) {
+ const isLegal = this.checkFormulaIsLegal(exp)
+ if (isLegal) {
+ arr.splice(j + 1, 0, { insert: { formula: exp } })
+ mod = true
+ } else {
+ arr.splice(j + 1, 0, '')
+ }
+ } else arr.splice(j + 1, 0, '')
+ }
+ while (arr.length > 0) {
+ let v = arr.pop()
+ if (typeof v === 'string') {
+ if (v.length < 1) continue
+ v = { insert: v }
+ }
+ v['attributes'] = ops[i]['attributes']
+ ops.splice(i + 1, 0, v)
+ }
+ ops.splice(i, 1)
+ }
+ }
+ }
+ if (mod) richText.quill.setContents(contents)
+ }
+
+ private checkFormulaIsLegal(str: string): boolean {
+ try {
+ katex.renderToString(str)
+ return true
+ } catch (e) {
+ return false
+ }
+ }
+
+ public beforePluginRemove(): void {
+ this.removeStyle()
+ this.mindMap.off('beforeDestroy', this.onDestroy)
+ }
+
+ public beforePluginDestroy(): void {
+ this.removeStyle()
+ this.mindMap.off('beforeDestroy', this.onDestroy)
+ }
+}
+
+export default Formula
\ No newline at end of file
diff --git a/packages/mindmap/src/plugins/FormulaStyle.js b/packages/mindmap/src/plugins/FormulaStyle.js
new file mode 100644
index 0000000..d0016ac
--- /dev/null
+++ b/packages/mindmap/src/plugins/FormulaStyle.js
@@ -0,0 +1,1091 @@
+export const getFontStyleText = fontPath => {
+ return `
+@font-face {
+ font-family: 'KaTeX_AMS';
+ src: url(${fontPath}fonts/KaTeX_AMS-Regular.woff2) format('woff2'), url(${fontPath}fonts/KaTeX_AMS-Regular.woff) format('woff'), url(${fontPath}fonts/KaTeX_AMS-Regular.ttf) format('truetype');
+ font-weight: normal;
+ font-style: normal;
+}
+@font-face {
+ font-family: 'KaTeX_Caligraphic';
+ src: url(${fontPath}fonts/KaTeX_Caligraphic-Bold.woff2) format('woff2'), url(${fontPath}fonts/KaTeX_Caligraphic-Bold.woff) format('woff'), url(${fontPath}fonts/KaTeX_Caligraphic-Bold.ttf) format('truetype');
+ font-weight: bold;
+ font-style: normal;
+}
+@font-face {
+ font-family: 'KaTeX_Caligraphic';
+ src: url(${fontPath}fonts/KaTeX_Caligraphic-Regular.woff2) format('woff2'), url(${fontPath}fonts/KaTeX_Caligraphic-Regular.woff) format('woff'), url(${fontPath}fonts/KaTeX_Caligraphic-Regular.ttf) format('truetype');
+ font-weight: normal;
+ font-style: normal;
+}
+@font-face {
+ font-family: 'KaTeX_Fraktur';
+ src: url(${fontPath}fonts/KaTeX_Fraktur-Bold.woff2) format('woff2'), url(${fontPath}fonts/KaTeX_Fraktur-Bold.woff) format('woff'), url(${fontPath}fonts/KaTeX_Fraktur-Bold.ttf) format('truetype');
+ font-weight: bold;
+ font-style: normal;
+}
+@font-face {
+ font-family: 'KaTeX_Fraktur';
+ src: url(${fontPath}fonts/KaTeX_Fraktur-Regular.woff2) format('woff2'), url(${fontPath}fonts/KaTeX_Fraktur-Regular.woff) format('woff'), url(${fontPath}fonts/KaTeX_Fraktur-Regular.ttf) format('truetype');
+ font-weight: normal;
+ font-style: normal;
+}
+@font-face {
+ font-family: 'KaTeX_Main';
+ src: url(${fontPath}fonts/KaTeX_Main-Bold.woff2) format('woff2'), url(${fontPath}fonts/KaTeX_Main-Bold.woff) format('woff'), url(${fontPath}fonts/KaTeX_Main-Bold.ttf) format('truetype');
+ font-weight: bold;
+ font-style: normal;
+}
+@font-face {
+ font-family: 'KaTeX_Main';
+ src: url(${fontPath}fonts/KaTeX_Main-BoldItalic.woff2) format('woff2'), url(${fontPath}fonts/KaTeX_Main-BoldItalic.woff) format('woff'), url(${fontPath}fonts/KaTeX_Main-BoldItalic.ttf) format('truetype');
+ font-weight: bold;
+ font-style: italic;
+}
+@font-face {
+ font-family: 'KaTeX_Main';
+ src: url(${fontPath}fonts/KaTeX_Main-Italic.woff2) format('woff2'), url(${fontPath}fonts/KaTeX_Main-Italic.woff) format('woff'), url(${fontPath}fonts/KaTeX_Main-Italic.ttf) format('truetype');
+ font-weight: normal;
+ font-style: italic;
+}
+@font-face {
+ font-family: 'KaTeX_Main';
+ src: url(${fontPath}fonts/KaTeX_Main-Regular.woff2) format('woff2'), url(${fontPath}fonts/KaTeX_Main-Regular.woff) format('woff'), url(${fontPath}fonts/KaTeX_Main-Regular.ttf) format('truetype');
+ font-weight: normal;
+ font-style: normal;
+}
+@font-face {
+ font-family: 'KaTeX_Math';
+ src: url(${fontPath}fonts/KaTeX_Math-BoldItalic.woff2) format('woff2'), url(${fontPath}fonts/KaTeX_Math-BoldItalic.woff) format('woff'), url(${fontPath}fonts/KaTeX_Math-BoldItalic.ttf) format('truetype');
+ font-weight: bold;
+ font-style: italic;
+}
+@font-face {
+ font-family: 'KaTeX_Math';
+ src: url(${fontPath}fonts/KaTeX_Math-Italic.woff2) format('woff2'), url(${fontPath}fonts/KaTeX_Math-Italic.woff) format('woff'), url(${fontPath}fonts/KaTeX_Math-Italic.ttf) format('truetype');
+ font-weight: normal;
+ font-style: italic;
+}
+@font-face {
+ font-family: 'KaTeX_SansSerif';
+ src: url(${fontPath}fonts/KaTeX_SansSerif-Bold.woff2) format('woff2'), url(${fontPath}fonts/KaTeX_SansSerif-Bold.woff) format('woff'), url(${fontPath}fonts/KaTeX_SansSerif-Bold.ttf) format('truetype');
+ font-weight: bold;
+ font-style: normal;
+}
+@font-face {
+ font-family: 'KaTeX_SansSerif';
+ src: url(${fontPath}fonts/KaTeX_SansSerif-Italic.woff2) format('woff2'), url(${fontPath}fonts/KaTeX_SansSerif-Italic.woff) format('woff'), url(${fontPath}fonts/KaTeX_SansSerif-Italic.ttf) format('truetype');
+ font-weight: normal;
+ font-style: italic;
+}
+@font-face {
+ font-family: 'KaTeX_SansSerif';
+ src: url(${fontPath}fonts/KaTeX_SansSerif-Regular.woff2) format('woff2'), url(${fontPath}fonts/KaTeX_SansSerif-Regular.woff) format('woff'), url(${fontPath}fonts/KaTeX_SansSerif-Regular.ttf) format('truetype');
+ font-weight: normal;
+ font-style: normal;
+}
+@font-face {
+ font-family: 'KaTeX_Script';
+ src: url(${fontPath}fonts/KaTeX_Script-Regular.woff2) format('woff2'), url(${fontPath}fonts/KaTeX_Script-Regular.woff) format('woff'), url(${fontPath}fonts/KaTeX_Script-Regular.ttf) format('truetype');
+ font-weight: normal;
+ font-style: normal;
+}
+@font-face {
+ font-family: 'KaTeX_Size1';
+ src: url(${fontPath}fonts/KaTeX_Size1-Regular.woff2) format('woff2'), url(${fontPath}fonts/KaTeX_Size1-Regular.woff) format('woff'), url(${fontPath}fonts/KaTeX_Size1-Regular.ttf) format('truetype');
+ font-weight: normal;
+ font-style: normal;
+}
+@font-face {
+ font-family: 'KaTeX_Size2';
+ src: url(${fontPath}fonts/KaTeX_Size2-Regular.woff2) format('woff2'), url(${fontPath}fonts/KaTeX_Size2-Regular.woff) format('woff'), url(${fontPath}fonts/KaTeX_Size2-Regular.ttf) format('truetype');
+ font-weight: normal;
+ font-style: normal;
+}
+@font-face {
+ font-family: 'KaTeX_Size3';
+ src: url(${fontPath}fonts/KaTeX_Size3-Regular.woff2) format('woff2'), url(${fontPath}fonts/KaTeX_Size3-Regular.woff) format('woff'), url(${fontPath}fonts/KaTeX_Size3-Regular.ttf) format('truetype');
+ font-weight: normal;
+ font-style: normal;
+}
+@font-face {
+ font-family: 'KaTeX_Size4';
+ src: url(${fontPath}fonts/KaTeX_Size4-Regular.woff2) format('woff2'), url(${fontPath}fonts/KaTeX_Size4-Regular.woff) format('woff'), url(${fontPath}fonts/KaTeX_Size4-Regular.ttf) format('truetype');
+ font-weight: normal;
+ font-style: normal;
+}
+@font-face {
+ font-family: 'KaTeX_Typewriter';
+ src: url(${fontPath}fonts/KaTeX_Typewriter-Regular.woff2) format('woff2'), url(${fontPath}fonts/KaTeX_Typewriter-Regular.woff) format('woff'), url(${fontPath}fonts/KaTeX_Typewriter-Regular.ttf) format('truetype');
+ font-weight: normal;
+ font-style: normal;
+}
+ `
+}
+
+export const getBaseStyleText = () => {
+ return `
+.katex {
+ font: normal 1.21em KaTeX_Main, Times New Roman, serif;
+ line-height: 1.2;
+ text-indent: 0;
+ text-rendering: auto;
+}
+.katex * {
+ -ms-high-contrast-adjust: none !important;
+}
+.katex * {
+ border-color: currentColor;
+}
+.katex .katex-version::after {
+ content: "0.16.9";
+}
+.katex .katex-mathml {
+ /* Accessibility hack to only show to screen readers
+ Found at: http://a11yproject.com/posts/how-to-hide-content/ */
+ position: absolute;
+ clip: rect(1px, 1px, 1px, 1px);
+ padding: 0;
+ border: 0;
+ height: 1px;
+ width: 1px;
+ overflow: hidden;
+}
+.katex .katex-html {
+ /* \newline is an empty block at top level, between .base elements */
+}
+.katex .katex-html > .newline {
+ display: block;
+}
+.katex .base {
+ position: relative;
+ display: inline-block;
+ white-space: nowrap;
+ width: -webkit-min-content;
+ width: -moz-min-content;
+ width: min-content;
+}
+.katex .strut {
+ display: inline-block;
+}
+.katex .textbf {
+ font-weight: bold;
+}
+.katex .textit {
+ font-style: italic;
+}
+.katex .textrm {
+ font-family: KaTeX_Main;
+}
+.katex .textsf {
+ font-family: KaTeX_SansSerif;
+}
+.katex .texttt {
+ font-family: KaTeX_Typewriter;
+}
+.katex .mathnormal {
+ font-family: KaTeX_Math;
+ font-style: italic;
+}
+.katex .mathit {
+ font-family: KaTeX_Main;
+ font-style: italic;
+}
+.katex .mathrm {
+ font-style: normal;
+}
+.katex .mathbf {
+ font-family: KaTeX_Main;
+ font-weight: bold;
+}
+.katex .boldsymbol {
+ font-family: KaTeX_Math;
+ font-weight: bold;
+ font-style: italic;
+}
+.katex .amsrm {
+ font-family: KaTeX_AMS;
+}
+.katex .mathbb,
+.katex .textbb {
+ font-family: KaTeX_AMS;
+}
+.katex .mathcal {
+ font-family: KaTeX_Caligraphic;
+}
+.katex .mathfrak,
+.katex .textfrak {
+ font-family: KaTeX_Fraktur;
+}
+.katex .mathboldfrak,
+.katex .textboldfrak {
+ font-family: KaTeX_Fraktur;
+ font-weight: bold;
+}
+.katex .mathtt {
+ font-family: KaTeX_Typewriter;
+}
+.katex .mathscr,
+.katex .textscr {
+ font-family: KaTeX_Script;
+}
+.katex .mathsf,
+.katex .textsf {
+ font-family: KaTeX_SansSerif;
+}
+.katex .mathboldsf,
+.katex .textboldsf {
+ font-family: KaTeX_SansSerif;
+ font-weight: bold;
+}
+.katex .mathitsf,
+.katex .textitsf {
+ font-family: KaTeX_SansSerif;
+ font-style: italic;
+}
+.katex .mainrm {
+ font-family: KaTeX_Main;
+ font-style: normal;
+}
+.katex .vlist-t {
+ display: inline-table;
+ table-layout: fixed;
+ border-collapse: collapse;
+}
+.katex .vlist-r {
+ display: table-row;
+}
+.katex .vlist {
+ display: table-cell;
+ vertical-align: bottom;
+ position: relative;
+}
+.katex .vlist > span {
+ display: block;
+ height: 0;
+ position: relative;
+}
+.katex .vlist > span > span {
+ display: inline-block;
+}
+.katex .vlist > span > .pstrut {
+ overflow: hidden;
+ width: 0;
+}
+.katex .vlist-t2 {
+ margin-right: -2px;
+}
+.katex .vlist-s {
+ display: table-cell;
+ vertical-align: bottom;
+ font-size: 1px;
+ width: 2px;
+ min-width: 2px;
+}
+.katex .vbox {
+ display: inline-flex;
+ flex-direction: column;
+ align-items: baseline;
+}
+.katex .hbox {
+ display: inline-flex;
+ flex-direction: row;
+ width: 100%;
+}
+.katex .thinbox {
+ display: inline-flex;
+ flex-direction: row;
+ width: 0;
+ max-width: 0;
+}
+.katex .msupsub {
+ text-align: left;
+}
+.katex .mfrac > span > span {
+ text-align: center;
+}
+.katex .mfrac .frac-line {
+ display: inline-block;
+ width: 100%;
+ border-bottom-style: solid;
+}
+.katex .mfrac .frac-line,
+.katex .overline .overline-line,
+.katex .underline .underline-line,
+.katex .hline,
+.katex .hdashline,
+.katex .rule {
+ min-height: 1px;
+}
+.katex .mspace {
+ display: inline-block;
+}
+.katex .llap,
+.katex .rlap,
+.katex .clap {
+ width: 0;
+ position: relative;
+}
+.katex .llap > .inner,
+.katex .rlap > .inner,
+.katex .clap > .inner {
+ position: absolute;
+}
+.katex .llap > .fix,
+.katex .rlap > .fix,
+.katex .clap > .fix {
+ display: inline-block;
+}
+.katex .llap > .inner {
+ right: 0;
+}
+.katex .rlap > .inner,
+.katex .clap > .inner {
+ left: 0;
+}
+.katex .clap > .inner > span {
+ margin-left: -50%;
+ margin-right: 50%;
+}
+.katex .rule {
+ display: inline-block;
+ border: solid 0;
+ position: relative;
+}
+.katex .overline .overline-line,
+.katex .underline .underline-line,
+.katex .hline {
+ display: inline-block;
+ width: 100%;
+ border-bottom-style: solid;
+}
+.katex .hdashline {
+ display: inline-block;
+ width: 100%;
+ border-bottom-style: dashed;
+}
+.katex .sqrt > .root {
+ margin-left: 0.27777778em;
+ margin-right: -0.55555556em;
+}
+.katex .sizing.reset-size1.size1,
+.katex .fontsize-ensurer.reset-size1.size1 {
+ font-size: 1em;
+}
+.katex .sizing.reset-size1.size2,
+.katex .fontsize-ensurer.reset-size1.size2 {
+ font-size: 1.2em;
+}
+.katex .sizing.reset-size1.size3,
+.katex .fontsize-ensurer.reset-size1.size3 {
+ font-size: 1.4em;
+}
+.katex .sizing.reset-size1.size4,
+.katex .fontsize-ensurer.reset-size1.size4 {
+ font-size: 1.6em;
+}
+.katex .sizing.reset-size1.size5,
+.katex .fontsize-ensurer.reset-size1.size5 {
+ font-size: 1.8em;
+}
+.katex .sizing.reset-size1.size6,
+.katex .fontsize-ensurer.reset-size1.size6 {
+ font-size: 2em;
+}
+.katex .sizing.reset-size1.size7,
+.katex .fontsize-ensurer.reset-size1.size7 {
+ font-size: 2.4em;
+}
+.katex .sizing.reset-size1.size8,
+.katex .fontsize-ensurer.reset-size1.size8 {
+ font-size: 2.88em;
+}
+.katex .sizing.reset-size1.size9,
+.katex .fontsize-ensurer.reset-size1.size9 {
+ font-size: 3.456em;
+}
+.katex .sizing.reset-size1.size10,
+.katex .fontsize-ensurer.reset-size1.size10 {
+ font-size: 4.148em;
+}
+.katex .sizing.reset-size1.size11,
+.katex .fontsize-ensurer.reset-size1.size11 {
+ font-size: 4.976em;
+}
+.katex .sizing.reset-size2.size1,
+.katex .fontsize-ensurer.reset-size2.size1 {
+ font-size: 0.83333333em;
+}
+.katex .sizing.reset-size2.size2,
+.katex .fontsize-ensurer.reset-size2.size2 {
+ font-size: 1em;
+}
+.katex .sizing.reset-size2.size3,
+.katex .fontsize-ensurer.reset-size2.size3 {
+ font-size: 1.16666667em;
+}
+.katex .sizing.reset-size2.size4,
+.katex .fontsize-ensurer.reset-size2.size4 {
+ font-size: 1.33333333em;
+}
+.katex .sizing.reset-size2.size5,
+.katex .fontsize-ensurer.reset-size2.size5 {
+ font-size: 1.5em;
+}
+.katex .sizing.reset-size2.size6,
+.katex .fontsize-ensurer.reset-size2.size6 {
+ font-size: 1.66666667em;
+}
+.katex .sizing.reset-size2.size7,
+.katex .fontsize-ensurer.reset-size2.size7 {
+ font-size: 2em;
+}
+.katex .sizing.reset-size2.size8,
+.katex .fontsize-ensurer.reset-size2.size8 {
+ font-size: 2.4em;
+}
+.katex .sizing.reset-size2.size9,
+.katex .fontsize-ensurer.reset-size2.size9 {
+ font-size: 2.88em;
+}
+.katex .sizing.reset-size2.size10,
+.katex .fontsize-ensurer.reset-size2.size10 {
+ font-size: 3.45666667em;
+}
+.katex .sizing.reset-size2.size11,
+.katex .fontsize-ensurer.reset-size2.size11 {
+ font-size: 4.14666667em;
+}
+.katex .sizing.reset-size3.size1,
+.katex .fontsize-ensurer.reset-size3.size1 {
+ font-size: 0.71428571em;
+}
+.katex .sizing.reset-size3.size2,
+.katex .fontsize-ensurer.reset-size3.size2 {
+ font-size: 0.85714286em;
+}
+.katex .sizing.reset-size3.size3,
+.katex .fontsize-ensurer.reset-size3.size3 {
+ font-size: 1em;
+}
+.katex .sizing.reset-size3.size4,
+.katex .fontsize-ensurer.reset-size3.size4 {
+ font-size: 1.14285714em;
+}
+.katex .sizing.reset-size3.size5,
+.katex .fontsize-ensurer.reset-size3.size5 {
+ font-size: 1.28571429em;
+}
+.katex .sizing.reset-size3.size6,
+.katex .fontsize-ensurer.reset-size3.size6 {
+ font-size: 1.42857143em;
+}
+.katex .sizing.reset-size3.size7,
+.katex .fontsize-ensurer.reset-size3.size7 {
+ font-size: 1.71428571em;
+}
+.katex .sizing.reset-size3.size8,
+.katex .fontsize-ensurer.reset-size3.size8 {
+ font-size: 2.05714286em;
+}
+.katex .sizing.reset-size3.size9,
+.katex .fontsize-ensurer.reset-size3.size9 {
+ font-size: 2.46857143em;
+}
+.katex .sizing.reset-size3.size10,
+.katex .fontsize-ensurer.reset-size3.size10 {
+ font-size: 2.96285714em;
+}
+.katex .sizing.reset-size3.size11,
+.katex .fontsize-ensurer.reset-size3.size11 {
+ font-size: 3.55428571em;
+}
+.katex .sizing.reset-size4.size1,
+.katex .fontsize-ensurer.reset-size4.size1 {
+ font-size: 0.625em;
+}
+.katex .sizing.reset-size4.size2,
+.katex .fontsize-ensurer.reset-size4.size2 {
+ font-size: 0.75em;
+}
+.katex .sizing.reset-size4.size3,
+.katex .fontsize-ensurer.reset-size4.size3 {
+ font-size: 0.875em;
+}
+.katex .sizing.reset-size4.size4,
+.katex .fontsize-ensurer.reset-size4.size4 {
+ font-size: 1em;
+}
+.katex .sizing.reset-size4.size5,
+.katex .fontsize-ensurer.reset-size4.size5 {
+ font-size: 1.125em;
+}
+.katex .sizing.reset-size4.size6,
+.katex .fontsize-ensurer.reset-size4.size6 {
+ font-size: 1.25em;
+}
+.katex .sizing.reset-size4.size7,
+.katex .fontsize-ensurer.reset-size4.size7 {
+ font-size: 1.5em;
+}
+.katex .sizing.reset-size4.size8,
+.katex .fontsize-ensurer.reset-size4.size8 {
+ font-size: 1.8em;
+}
+.katex .sizing.reset-size4.size9,
+.katex .fontsize-ensurer.reset-size4.size9 {
+ font-size: 2.16em;
+}
+.katex .sizing.reset-size4.size10,
+.katex .fontsize-ensurer.reset-size4.size10 {
+ font-size: 2.5925em;
+}
+.katex .sizing.reset-size4.size11,
+.katex .fontsize-ensurer.reset-size4.size11 {
+ font-size: 3.11em;
+}
+.katex .sizing.reset-size5.size1,
+.katex .fontsize-ensurer.reset-size5.size1 {
+ font-size: 0.55555556em;
+}
+.katex .sizing.reset-size5.size2,
+.katex .fontsize-ensurer.reset-size5.size2 {
+ font-size: 0.66666667em;
+}
+.katex .sizing.reset-size5.size3,
+.katex .fontsize-ensurer.reset-size5.size3 {
+ font-size: 0.77777778em;
+}
+.katex .sizing.reset-size5.size4,
+.katex .fontsize-ensurer.reset-size5.size4 {
+ font-size: 0.88888889em;
+}
+.katex .sizing.reset-size5.size5,
+.katex .fontsize-ensurer.reset-size5.size5 {
+ font-size: 1em;
+}
+.katex .sizing.reset-size5.size6,
+.katex .fontsize-ensurer.reset-size5.size6 {
+ font-size: 1.11111111em;
+}
+.katex .sizing.reset-size5.size7,
+.katex .fontsize-ensurer.reset-size5.size7 {
+ font-size: 1.33333333em;
+}
+.katex .sizing.reset-size5.size8,
+.katex .fontsize-ensurer.reset-size5.size8 {
+ font-size: 1.6em;
+}
+.katex .sizing.reset-size5.size9,
+.katex .fontsize-ensurer.reset-size5.size9 {
+ font-size: 1.92em;
+}
+.katex .sizing.reset-size5.size10,
+.katex .fontsize-ensurer.reset-size5.size10 {
+ font-size: 2.30444444em;
+}
+.katex .sizing.reset-size5.size11,
+.katex .fontsize-ensurer.reset-size5.size11 {
+ font-size: 2.76444444em;
+}
+.katex .sizing.reset-size6.size1,
+.katex .fontsize-ensurer.reset-size6.size1 {
+ font-size: 0.5em;
+}
+.katex .sizing.reset-size6.size2,
+.katex .fontsize-ensurer.reset-size6.size2 {
+ font-size: 0.6em;
+}
+.katex .sizing.reset-size6.size3,
+.katex .fontsize-ensurer.reset-size6.size3 {
+ font-size: 0.7em;
+}
+.katex .sizing.reset-size6.size4,
+.katex .fontsize-ensurer.reset-size6.size4 {
+ font-size: 0.8em;
+}
+.katex .sizing.reset-size6.size5,
+.katex .fontsize-ensurer.reset-size6.size5 {
+ font-size: 0.9em;
+}
+.katex .sizing.reset-size6.size6,
+.katex .fontsize-ensurer.reset-size6.size6 {
+ font-size: 1em;
+}
+.katex .sizing.reset-size6.size7,
+.katex .fontsize-ensurer.reset-size6.size7 {
+ font-size: 1.2em;
+}
+.katex .sizing.reset-size6.size8,
+.katex .fontsize-ensurer.reset-size6.size8 {
+ font-size: 1.44em;
+}
+.katex .sizing.reset-size6.size9,
+.katex .fontsize-ensurer.reset-size6.size9 {
+ font-size: 1.728em;
+}
+.katex .sizing.reset-size6.size10,
+.katex .fontsize-ensurer.reset-size6.size10 {
+ font-size: 2.074em;
+}
+.katex .sizing.reset-size6.size11,
+.katex .fontsize-ensurer.reset-size6.size11 {
+ font-size: 2.488em;
+}
+.katex .sizing.reset-size7.size1,
+.katex .fontsize-ensurer.reset-size7.size1 {
+ font-size: 0.41666667em;
+}
+.katex .sizing.reset-size7.size2,
+.katex .fontsize-ensurer.reset-size7.size2 {
+ font-size: 0.5em;
+}
+.katex .sizing.reset-size7.size3,
+.katex .fontsize-ensurer.reset-size7.size3 {
+ font-size: 0.58333333em;
+}
+.katex .sizing.reset-size7.size4,
+.katex .fontsize-ensurer.reset-size7.size4 {
+ font-size: 0.66666667em;
+}
+.katex .sizing.reset-size7.size5,
+.katex .fontsize-ensurer.reset-size7.size5 {
+ font-size: 0.75em;
+}
+.katex .sizing.reset-size7.size6,
+.katex .fontsize-ensurer.reset-size7.size6 {
+ font-size: 0.83333333em;
+}
+.katex .sizing.reset-size7.size7,
+.katex .fontsize-ensurer.reset-size7.size7 {
+ font-size: 1em;
+}
+.katex .sizing.reset-size7.size8,
+.katex .fontsize-ensurer.reset-size7.size8 {
+ font-size: 1.2em;
+}
+.katex .sizing.reset-size7.size9,
+.katex .fontsize-ensurer.reset-size7.size9 {
+ font-size: 1.44em;
+}
+.katex .sizing.reset-size7.size10,
+.katex .fontsize-ensurer.reset-size7.size10 {
+ font-size: 1.72833333em;
+}
+.katex .sizing.reset-size7.size11,
+.katex .fontsize-ensurer.reset-size7.size11 {
+ font-size: 2.07333333em;
+}
+.katex .sizing.reset-size8.size1,
+.katex .fontsize-ensurer.reset-size8.size1 {
+ font-size: 0.34722222em;
+}
+.katex .sizing.reset-size8.size2,
+.katex .fontsize-ensurer.reset-size8.size2 {
+ font-size: 0.41666667em;
+}
+.katex .sizing.reset-size8.size3,
+.katex .fontsize-ensurer.reset-size8.size3 {
+ font-size: 0.48611111em;
+}
+.katex .sizing.reset-size8.size4,
+.katex .fontsize-ensurer.reset-size8.size4 {
+ font-size: 0.55555556em;
+}
+.katex .sizing.reset-size8.size5,
+.katex .fontsize-ensurer.reset-size8.size5 {
+ font-size: 0.625em;
+}
+.katex .sizing.reset-size8.size6,
+.katex .fontsize-ensurer.reset-size8.size6 {
+ font-size: 0.69444444em;
+}
+.katex .sizing.reset-size8.size7,
+.katex .fontsize-ensurer.reset-size8.size7 {
+ font-size: 0.83333333em;
+}
+.katex .sizing.reset-size8.size8,
+.katex .fontsize-ensurer.reset-size8.size8 {
+ font-size: 1em;
+}
+.katex .sizing.reset-size8.size9,
+.katex .fontsize-ensurer.reset-size8.size9 {
+ font-size: 1.2em;
+}
+.katex .sizing.reset-size8.size10,
+.katex .fontsize-ensurer.reset-size8.size10 {
+ font-size: 1.44027778em;
+}
+.katex .sizing.reset-size8.size11,
+.katex .fontsize-ensurer.reset-size8.size11 {
+ font-size: 1.72777778em;
+}
+.katex .sizing.reset-size9.size1,
+.katex .fontsize-ensurer.reset-size9.size1 {
+ font-size: 0.28935185em;
+}
+.katex .sizing.reset-size9.size2,
+.katex .fontsize-ensurer.reset-size9.size2 {
+ font-size: 0.34722222em;
+}
+.katex .sizing.reset-size9.size3,
+.katex .fontsize-ensurer.reset-size9.size3 {
+ font-size: 0.40509259em;
+}
+.katex .sizing.reset-size9.size4,
+.katex .fontsize-ensurer.reset-size9.size4 {
+ font-size: 0.46296296em;
+}
+.katex .sizing.reset-size9.size5,
+.katex .fontsize-ensurer.reset-size9.size5 {
+ font-size: 0.52083333em;
+}
+.katex .sizing.reset-size9.size6,
+.katex .fontsize-ensurer.reset-size9.size6 {
+ font-size: 0.5787037em;
+}
+.katex .sizing.reset-size9.size7,
+.katex .fontsize-ensurer.reset-size9.size7 {
+ font-size: 0.69444444em;
+}
+.katex .sizing.reset-size9.size8,
+.katex .fontsize-ensurer.reset-size9.size8 {
+ font-size: 0.83333333em;
+}
+.katex .sizing.reset-size9.size9,
+.katex .fontsize-ensurer.reset-size9.size9 {
+ font-size: 1em;
+}
+.katex .sizing.reset-size9.size10,
+.katex .fontsize-ensurer.reset-size9.size10 {
+ font-size: 1.20023148em;
+}
+.katex .sizing.reset-size9.size11,
+.katex .fontsize-ensurer.reset-size9.size11 {
+ font-size: 1.43981481em;
+}
+.katex .sizing.reset-size10.size1,
+.katex .fontsize-ensurer.reset-size10.size1 {
+ font-size: 0.24108004em;
+}
+.katex .sizing.reset-size10.size2,
+.katex .fontsize-ensurer.reset-size10.size2 {
+ font-size: 0.28929605em;
+}
+.katex .sizing.reset-size10.size3,
+.katex .fontsize-ensurer.reset-size10.size3 {
+ font-size: 0.33751205em;
+}
+.katex .sizing.reset-size10.size4,
+.katex .fontsize-ensurer.reset-size10.size4 {
+ font-size: 0.38572806em;
+}
+.katex .sizing.reset-size10.size5,
+.katex .fontsize-ensurer.reset-size10.size5 {
+ font-size: 0.43394407em;
+}
+.katex .sizing.reset-size10.size6,
+.katex .fontsize-ensurer.reset-size10.size6 {
+ font-size: 0.48216008em;
+}
+.katex .sizing.reset-size10.size7,
+.katex .fontsize-ensurer.reset-size10.size7 {
+ font-size: 0.57859209em;
+}
+.katex .sizing.reset-size10.size8,
+.katex .fontsize-ensurer.reset-size10.size8 {
+ font-size: 0.69431051em;
+}
+.katex .sizing.reset-size10.size9,
+.katex .fontsize-ensurer.reset-size10.size9 {
+ font-size: 0.83317261em;
+}
+.katex .sizing.reset-size10.size10,
+.katex .fontsize-ensurer.reset-size10.size10 {
+ font-size: 1em;
+}
+.katex .sizing.reset-size10.size11,
+.katex .fontsize-ensurer.reset-size10.size11 {
+ font-size: 1.19961427em;
+}
+.katex .sizing.reset-size11.size1,
+.katex .fontsize-ensurer.reset-size11.size1 {
+ font-size: 0.20096463em;
+}
+.katex .sizing.reset-size11.size2,
+.katex .fontsize-ensurer.reset-size11.size2 {
+ font-size: 0.24115756em;
+}
+.katex .sizing.reset-size11.size3,
+.katex .fontsize-ensurer.reset-size11.size3 {
+ font-size: 0.28135048em;
+}
+.katex .sizing.reset-size11.size4,
+.katex .fontsize-ensurer.reset-size11.size4 {
+ font-size: 0.32154341em;
+}
+.katex .sizing.reset-size11.size5,
+.katex .fontsize-ensurer.reset-size11.size5 {
+ font-size: 0.36173633em;
+}
+.katex .sizing.reset-size11.size6,
+.katex .fontsize-ensurer.reset-size11.size6 {
+ font-size: 0.40192926em;
+}
+.katex .sizing.reset-size11.size7,
+.katex .fontsize-ensurer.reset-size11.size7 {
+ font-size: 0.48231511em;
+}
+.katex .sizing.reset-size11.size8,
+.katex .fontsize-ensurer.reset-size11.size8 {
+ font-size: 0.57877814em;
+}
+.katex .sizing.reset-size11.size9,
+.katex .fontsize-ensurer.reset-size11.size9 {
+ font-size: 0.69453376em;
+}
+.katex .sizing.reset-size11.size10,
+.katex .fontsize-ensurer.reset-size11.size10 {
+ font-size: 0.83360129em;
+}
+.katex .sizing.reset-size11.size11,
+.katex .fontsize-ensurer.reset-size11.size11 {
+ font-size: 1em;
+}
+.katex .delimsizing.size1 {
+ font-family: KaTeX_Size1;
+}
+.katex .delimsizing.size2 {
+ font-family: KaTeX_Size2;
+}
+.katex .delimsizing.size3 {
+ font-family: KaTeX_Size3;
+}
+.katex .delimsizing.size4 {
+ font-family: KaTeX_Size4;
+}
+.katex .delimsizing.mult .delim-size1 > span {
+ font-family: KaTeX_Size1;
+}
+.katex .delimsizing.mult .delim-size4 > span {
+ font-family: KaTeX_Size4;
+}
+.katex .nulldelimiter {
+ display: inline-block;
+ width: 0.12em;
+}
+.katex .delimcenter {
+ position: relative;
+}
+.katex .op-symbol {
+ position: relative;
+}
+.katex .op-symbol.small-op {
+ font-family: KaTeX_Size1;
+}
+.katex .op-symbol.large-op {
+ font-family: KaTeX_Size2;
+}
+.katex .op-limits > .vlist-t {
+ text-align: center;
+}
+.katex .accent > .vlist-t {
+ text-align: center;
+}
+.katex .accent .accent-body {
+ position: relative;
+}
+.katex .accent .accent-body:not(.accent-full) {
+ width: 0;
+}
+.katex .overlay {
+ display: block;
+}
+.katex .mtable .vertical-separator {
+ display: inline-block;
+ min-width: 1px;
+}
+.katex .mtable .arraycolsep {
+ display: inline-block;
+}
+.katex .mtable .col-align-c > .vlist-t {
+ text-align: center;
+}
+.katex .mtable .col-align-l > .vlist-t {
+ text-align: left;
+}
+.katex .mtable .col-align-r > .vlist-t {
+ text-align: right;
+}
+.katex .svg-align {
+ text-align: left;
+}
+.katex svg {
+ display: block;
+ position: absolute;
+ width: 100%;
+ height: inherit;
+ fill: currentColor;
+ stroke: currentColor;
+ fill-rule: nonzero;
+ fill-opacity: 1;
+ stroke-width: 1;
+ stroke-linecap: butt;
+ stroke-linejoin: miter;
+ stroke-miterlimit: 4;
+ stroke-dasharray: none;
+ stroke-dashoffset: 0;
+ stroke-opacity: 1;
+}
+.katex svg path {
+ stroke: none;
+}
+.katex img {
+ border-style: none;
+ min-width: 0;
+ min-height: 0;
+ max-width: none;
+ max-height: none;
+}
+.katex .stretchy {
+ width: 100%;
+ display: block;
+ position: relative;
+ overflow: hidden;
+}
+.katex .stretchy::before,
+.katex .stretchy::after {
+ content: "";
+}
+.katex .hide-tail {
+ width: 100%;
+ position: relative;
+ overflow: hidden;
+}
+.katex .halfarrow-left {
+ position: absolute;
+ left: 0;
+ width: 50.2%;
+ overflow: hidden;
+}
+.katex .halfarrow-right {
+ position: absolute;
+ right: 0;
+ width: 50.2%;
+ overflow: hidden;
+}
+.katex .brace-left {
+ position: absolute;
+ left: 0;
+ width: 25.1%;
+ overflow: hidden;
+}
+.katex .brace-center {
+ position: absolute;
+ left: 25%;
+ width: 50%;
+ overflow: hidden;
+}
+.katex .brace-right {
+ position: absolute;
+ right: 0;
+ width: 25.1%;
+ overflow: hidden;
+}
+.katex .x-arrow-pad {
+ padding: 0 0.5em;
+}
+.katex .cd-arrow-pad {
+ padding: 0 0.55556em 0 0.27778em;
+}
+.katex .x-arrow,
+.katex .mover,
+.katex .munder {
+ text-align: center;
+}
+.katex .boxpad {
+ padding: 0 0.3em;
+}
+.katex .fbox,
+.katex .fcolorbox {
+ box-sizing: border-box;
+ border: 0.04em solid;
+}
+.katex .cancel-pad {
+ padding: 0 0.2em;
+}
+.katex .cancel-lap {
+ margin-left: -0.2em;
+ margin-right: -0.2em;
+}
+.katex .sout {
+ border-bottom-style: solid;
+ border-bottom-width: 0.08em;
+}
+.katex .angl {
+ box-sizing: border-box;
+ border-top: 0.049em solid;
+ border-right: 0.049em solid;
+ margin-right: 0.03889em;
+}
+.katex .anglpad {
+ padding: 0 0.03889em;
+}
+.katex .eqn-num::before {
+ counter-increment: katexEqnNo;
+ content: "(" counter(katexEqnNo) ")";
+}
+.katex .mml-eqn-num::before {
+ counter-increment: mmlEqnNo;
+ content: "(" counter(mmlEqnNo) ")";
+}
+.katex .mtr-glue {
+ width: 50%;
+}
+.katex .cd-vert-arrow {
+ display: inline-block;
+ position: relative;
+}
+.katex .cd-label-left {
+ display: inline-block;
+ position: absolute;
+ right: calc(50% + 0.3em);
+ text-align: left;
+}
+.katex .cd-label-right {
+ display: inline-block;
+ position: absolute;
+ left: calc(50% + 0.3em);
+ text-align: right;
+}
+.katex-display {
+ display: block;
+ margin: 1em 0;
+ text-align: center;
+}
+.katex-display > .katex {
+ display: block;
+ text-align: center;
+ white-space: nowrap;
+}
+.katex-display > .katex > .katex-html {
+ display: block;
+ position: relative;
+}
+.katex-display > .katex > .katex-html > .tag {
+ position: absolute;
+ right: 0;
+}
+.katex-display.leqno > .katex > .katex-html > .tag {
+ left: 0;
+ right: auto;
+}
+.katex-display.fleqn > .katex {
+ text-align: left;
+ padding-left: 2em;
+}
+body {
+ counter-reset: katexEqnNo mmlEqnNo;
+}
+`
+}
diff --git a/packages/mindmap/src/plugins/KeyboardNavigation.js b/packages/mindmap/src/plugins/KeyboardNavigation.js
new file mode 100644
index 0000000..972e25e
--- /dev/null
+++ b/packages/mindmap/src/plugins/KeyboardNavigation.js
@@ -0,0 +1,287 @@
+import { bfsWalk } from '../utils'
+import { CONSTANTS } from '../constants/constant'
+
+// 键盘导航插件
+class KeyboardNavigation {
+ // 构造函数
+ constructor(opt) {
+ this.opt = opt
+ this.mindMap = opt.mindMap
+
+ this.addShortcut()
+ }
+
+ addShortcut() {
+ this.onLeftKeyUp = this.onLeftKeyUp.bind(this)
+ this.onUpKeyUp = this.onUpKeyUp.bind(this)
+ this.onRightKeyUp = this.onRightKeyUp.bind(this)
+ this.onDownKeyUp = this.onDownKeyUp.bind(this)
+
+ this.mindMap.keyCommand.addShortcut(
+ CONSTANTS.KEY_DIR.LEFT,
+ this.onLeftKeyUp
+ )
+ this.mindMap.keyCommand.addShortcut(CONSTANTS.KEY_DIR.UP, this.onUpKeyUp)
+ this.mindMap.keyCommand.addShortcut(
+ CONSTANTS.KEY_DIR.RIGHT,
+ this.onRightKeyUp
+ )
+ this.mindMap.keyCommand.addShortcut(
+ CONSTANTS.KEY_DIR.DOWN,
+ this.onDownKeyUp
+ )
+ }
+
+ removeShortcut() {
+ this.mindMap.keyCommand.removeShortcut(
+ CONSTANTS.KEY_DIR.LEFT,
+ this.onLeftKeyUp
+ )
+ this.mindMap.keyCommand.removeShortcut(CONSTANTS.KEY_DIR.UP, this.onUpKeyUp)
+ this.mindMap.keyCommand.removeShortcut(
+ CONSTANTS.KEY_DIR.RIGHT,
+ this.onRightKeyUp
+ )
+ this.mindMap.keyCommand.removeShortcut(
+ CONSTANTS.KEY_DIR.DOWN,
+ this.onDownKeyUp
+ )
+ }
+
+ onLeftKeyUp() {
+ this.onKeyup(CONSTANTS.KEY_DIR.LEFT)
+ }
+
+ onUpKeyUp() {
+ this.onKeyup(CONSTANTS.KEY_DIR.UP)
+ }
+
+ onRightKeyUp() {
+ this.onKeyup(CONSTANTS.KEY_DIR.RIGHT)
+ }
+
+ onDownKeyUp() {
+ this.onKeyup(CONSTANTS.KEY_DIR.DOWN)
+ }
+
+ // 处理按键事件
+ onKeyup(dir) {
+ if (this.mindMap.renderer.activeNodeList.length > 0) {
+ this.focus(dir)
+ } else {
+ let root = this.mindMap.renderer.root
+ this.mindMap.execCommand('GO_TARGET_NODE', root)
+ }
+ }
+
+ // 聚焦到下一个节点
+ focus(dir) {
+ // 当前聚焦的节点
+ let currentActiveNode = this.mindMap.renderer.activeNodeList[0]
+ // 当前聚焦节点的位置信息
+ let currentActiveNodeRect = this.getNodeRect(currentActiveNode)
+ // 寻找的下一个聚焦节点
+ let targetNode = null
+ let targetDis = Infinity
+ // 保存并维护距离最近的节点
+ let checkNodeDis = (rect, node) => {
+ let dis = this.getDistance(currentActiveNodeRect, rect)
+ if (dis < targetDis) {
+ targetNode = node
+ targetDis = dis
+ }
+ }
+
+ // 第一优先级:阴影算法
+ this.getFocusNodeByShadowAlgorithm({
+ currentActiveNode,
+ currentActiveNodeRect,
+ dir,
+ checkNodeDis
+ })
+
+ // 第二优先级:区域算法
+ if (!targetNode) {
+ this.getFocusNodeByAreaAlgorithm({
+ currentActiveNode,
+ currentActiveNodeRect,
+ dir,
+ checkNodeDis
+ })
+ }
+
+ // 第三优先级:简单算法
+ if (!targetNode) {
+ this.getFocusNodeBySimpleAlgorithm({
+ currentActiveNode,
+ currentActiveNodeRect,
+ dir,
+ checkNodeDis
+ })
+ }
+
+ // 找到了则让目标节点聚焦
+ if (targetNode) {
+ this.mindMap.execCommand('GO_TARGET_NODE', targetNode)
+ }
+ }
+
+ // 1.简单算法
+ getFocusNodeBySimpleAlgorithm({
+ currentActiveNode,
+ currentActiveNodeRect,
+ dir,
+ checkNodeDis
+ }) {
+ // 遍历节点树
+ bfsWalk(this.mindMap.renderer.root, node => {
+ // 跳过当前聚焦的节点
+ if (node.uid === currentActiveNode.uid) return
+ // 当前遍历到的节点的位置信息
+ let rect = this.getNodeRect(node)
+ let { left, top, right, bottom } = rect
+ let match = false
+ // 按下了左方向键
+ if (dir === CONSTANTS.KEY_DIR.LEFT) {
+ // 判断节点是否在当前节点的左侧
+ match = right <= currentActiveNodeRect.left
+ // 按下了右方向键
+ } else if (dir === CONSTANTS.KEY_DIR.RIGHT) {
+ // 判断节点是否在当前节点的右侧
+ match = left >= currentActiveNodeRect.right
+ // 按下了上方向键
+ } else if (dir === CONSTANTS.KEY_DIR.UP) {
+ // 判断节点是否在当前节点的上面
+ match = bottom <= currentActiveNodeRect.top
+ // 按下了下方向键
+ } else if (dir === CONSTANTS.KEY_DIR.DOWN) {
+ // 判断节点是否在当前节点的下面
+ match = top >= currentActiveNodeRect.bottom
+ }
+ // 符合要求,判断是否是最近的节点
+ if (match) {
+ checkNodeDis(rect, node)
+ }
+ })
+ }
+
+ // 2.阴影算法
+ getFocusNodeByShadowAlgorithm({
+ currentActiveNode,
+ currentActiveNodeRect,
+ dir,
+ checkNodeDis
+ }) {
+ bfsWalk(this.mindMap.renderer.root, node => {
+ if (node.uid === currentActiveNode.uid) return
+ let rect = this.getNodeRect(node)
+ let { left, top, right, bottom } = rect
+ let match = false
+ if (dir === CONSTANTS.KEY_DIR.LEFT) {
+ match =
+ left < currentActiveNodeRect.left &&
+ top < currentActiveNodeRect.bottom &&
+ bottom > currentActiveNodeRect.top
+ } else if (dir === CONSTANTS.KEY_DIR.RIGHT) {
+ match =
+ right > currentActiveNodeRect.right &&
+ top < currentActiveNodeRect.bottom &&
+ bottom > currentActiveNodeRect.top
+ } else if (dir === CONSTANTS.KEY_DIR.UP) {
+ match =
+ top < currentActiveNodeRect.top &&
+ left < currentActiveNodeRect.right &&
+ right > currentActiveNodeRect.left
+ } else if (dir === CONSTANTS.KEY_DIR.DOWN) {
+ match =
+ bottom > currentActiveNodeRect.bottom &&
+ left < currentActiveNodeRect.right &&
+ right > currentActiveNodeRect.left
+ }
+ if (match) {
+ checkNodeDis(rect, node)
+ }
+ })
+ }
+
+ // 3.区域算法
+ getFocusNodeByAreaAlgorithm({
+ currentActiveNode,
+ currentActiveNodeRect,
+ dir,
+ checkNodeDis
+ }) {
+ // 当前聚焦节点的中心点
+ let cX = (currentActiveNodeRect.right + currentActiveNodeRect.left) / 2
+ let cY = (currentActiveNodeRect.bottom + currentActiveNodeRect.top) / 2
+ bfsWalk(this.mindMap.renderer.root, node => {
+ if (node.uid === currentActiveNode.uid) return
+ let rect = this.getNodeRect(node)
+ let { left, top, right, bottom } = rect
+ // 遍历到的节点的中心点
+ let ccX = (right + left) / 2
+ let ccY = (bottom + top) / 2
+ // 节点的中心点坐标和当前聚焦节点的中心点坐标的差值
+ let offsetX = ccX - cX
+ let offsetY = ccY - cY
+ if (offsetX === 0 && offsetY === 0) return
+ let match = false
+ if (dir === CONSTANTS.KEY_DIR.LEFT) {
+ match = offsetX <= 0 && offsetX <= offsetY && offsetX <= -offsetY
+ } else if (dir === CONSTANTS.KEY_DIR.RIGHT) {
+ match = offsetX > 0 && offsetX >= -offsetY && offsetX >= offsetY
+ } else if (dir === CONSTANTS.KEY_DIR.UP) {
+ match = offsetY <= 0 && offsetY < offsetX && offsetY < -offsetX
+ } else if (dir === CONSTANTS.KEY_DIR.DOWN) {
+ match = offsetY > 0 && -offsetY < offsetX && offsetY > offsetX
+ }
+ if (match) {
+ checkNodeDis(rect, node)
+ }
+ })
+ }
+
+ // 获取节点的位置信息
+ getNodeRect(node) {
+ let { scaleX, scaleY, translateX, translateY } =
+ this.mindMap.draw.transform()
+ let { left, top, width, height } = node
+ return {
+ right: (left + width) * scaleX + translateX,
+ bottom: (top + height) * scaleY + translateY,
+ left: left * scaleX + translateX,
+ top: top * scaleY + translateY
+ }
+ }
+
+ // 获取两个节点的距离
+ getDistance(node1Rect, node2Rect) {
+ let center1 = this.getCenter(node1Rect)
+ let center2 = this.getCenter(node2Rect)
+ return Math.sqrt(
+ Math.pow(center1.x - center2.x, 2) + Math.pow(center1.y - center2.y, 2)
+ )
+ }
+
+ // 获取节点的中心点
+ getCenter({ left, right, top, bottom }) {
+ return {
+ x: (left + right) / 2,
+ y: (top + bottom) / 2
+ }
+ }
+
+ // 插件被移除前做的事情
+ beforePluginRemove() {
+ this.removeShortcut()
+ }
+
+ // 插件被卸载前做的事情
+ beforePluginDestroy() {
+ this.removeShortcut()
+ }
+}
+
+KeyboardNavigation.instanceName = 'keyboardNavigation'
+
+export default KeyboardNavigation
diff --git a/packages/mindmap/src/plugins/MindMapLayoutPro.js b/packages/mindmap/src/plugins/MindMapLayoutPro.js
new file mode 100644
index 0000000..130b618
--- /dev/null
+++ b/packages/mindmap/src/plugins/MindMapLayoutPro.js
@@ -0,0 +1,117 @@
+import { CONSTANTS } from '../constants/constant'
+
+// 该插件会向节点数据的data中添加dir字段
+/*
+ 需要更新数据的情况:
+
+ 1.实例化时的数据
+ 2.调用setData和updateData方法
+ 3.执行完命令
+ 4.切换结构
+*/
+
+class MindMapLayoutPro {
+ constructor(opt) {
+ this.opt = opt
+ this.mindMap = opt.mindMap
+ this.init()
+ }
+
+ init() {
+ this.updateNodeTree = this.updateNodeTree.bind(this)
+ this.afterExecCommand = this.afterExecCommand.bind(this)
+ this.layoutChange = this.layoutChange.bind(this)
+
+ // 处理实例化时传入的数据
+ if (this.mindMap.opt.data && this.isMindMapLayout()) {
+ this.updateNodeTree(this.mindMap.opt.data)
+ }
+
+ this.mindMap.on('layout_change', this.layoutChange)
+ this.mindMap.on('afterExecCommand', this.afterExecCommand)
+ this.mindMap.on('before_update_data', this.updateNodeTree)
+ this.mindMap.on('before_set_data', this.updateNodeTree)
+ }
+
+ restore() {
+ this.mindMap.off('layout_change', this.layoutChange)
+ this.mindMap.off('afterExecCommand', this.afterExecCommand)
+ this.mindMap.off('before_update_data', this.updateNodeTree)
+ this.mindMap.off('before_set_data', this.updateNodeTree)
+ }
+
+ // 监听命令执行后的事件
+ afterExecCommand(name) {
+ if (!this.isMindMapLayout()) return
+ if (
+ ![
+ 'BACK',
+ 'FORWARD',
+ 'INSERT_NODE',
+ 'INSERT_MULTI_NODE',
+ 'INSERT_CHILD_NODE',
+ 'INSERT_MULTI_CHILD_NODE',
+ 'INSERT_PARENT_NODE',
+ 'UP_NODE',
+ 'DOWN_NODE',
+ 'MOVE_UP_ONE_LEVEL',
+ 'INSERT_AFTER',
+ 'INSERT_BEFORE',
+ 'MOVE_NODE_TO',
+ 'REMOVE_NODE',
+ 'REMOVE_CURRENT_NODE',
+ 'PASTE_NODE',
+ 'CUT_NODE'
+ ].includes(name)
+ )
+ return
+ this.updateRenderTree()
+ }
+
+ // 更新布局结构
+ layoutChange(layout) {
+ if (layout === CONSTANTS.LAYOUT.MIND_MAP) {
+ this.updateRenderTree()
+ }
+ }
+
+ // 更新当前的渲染树
+ updateRenderTree() {
+ this.updateNodeTree(this.mindMap.renderer.renderTree)
+ }
+
+ // 更新节点树,修改二级节点的排列位置
+ updateNodeTree(tree) {
+ if (!this.isMindMapLayout()) return
+ const root = tree
+ const childrenLength = root.children.length
+ if (childrenLength <= 0) return
+ const center = Math.ceil(childrenLength / 2)
+ root.children.forEach((item, index) => {
+ if (index + 1 <= center) {
+ item.data.dir = CONSTANTS.LAYOUT_GROW_DIR.RIGHT
+ } else {
+ item.data.dir = CONSTANTS.LAYOUT_GROW_DIR.LEFT
+ }
+ })
+ }
+
+ // 判断当前是否是思维导图布局结构
+ isMindMapLayout() {
+ return this.mindMap.opt.layout === CONSTANTS.LAYOUT.MIND_MAP
+ }
+
+ // 插件被移除前做的事情
+ beforePluginRemove() {
+ this.restore()
+ }
+
+ // 插件被卸载前做的事情
+ beforePluginDestroy() {
+ this.restore()
+ }
+}
+
+MindMapLayoutPro.instanceName = 'mindMapLayoutPro'
+
+export default MindMapLayoutPro
diff --git a/packages/mindmap/src/plugins/MiniMap.js b/packages/mindmap/src/plugins/MiniMap.js
new file mode 100644
index 0000000..9f77c89
--- /dev/null
+++ b/packages/mindmap/src/plugins/MiniMap.js
@@ -0,0 +1,224 @@
+import {
+ isWhite,
+ isTransparent,
+ getVisibleColorFromTheme,
+ readBlob
+} from '../utils/index'
+
+// 小地图插件
+class MiniMap {
+ // 构造函数
+ constructor(opt) {
+ this.mindMap = opt.mindMap
+ this.isMousedown = false
+ this.mousedownPos = {
+ x: 0,
+ y: 0
+ }
+ this.startViewPos = {
+ x: 0,
+ y: 0
+ }
+ this.currentState = null
+ }
+
+ // 计算小地图的渲染数据
+ /**
+ * boxWidth:小地图容器的宽度
+ * boxHeight:小地图容器的高度
+ */
+ calculationMiniMap(boxWidth, boxHeight) {
+ let { svg, rect, origWidth, origHeight, scaleX, scaleY } =
+ this.mindMap.getSvgData({
+ ignoreWatermark: true
+ })
+ // 计算数据
+ const elRect = this.mindMap.elRect
+ rect.x -= elRect.left
+ rect.x2 -= elRect.left
+ rect.y -= elRect.top
+ rect.y2 -= elRect.top
+ let boxRatio = boxWidth / boxHeight
+ let actWidth = 0
+ let actHeight = 0
+ if (boxRatio > rect.ratio) {
+ // 高度以box为准,缩放宽度
+ actHeight = boxHeight
+ actWidth = rect.ratio * actHeight
+ } else {
+ // 宽度以box为准,缩放高度
+ actWidth = boxWidth
+ actHeight = actWidth / rect.ratio
+ }
+ // svg图形的缩放及位置
+ let miniMapBoxScale = actWidth / rect.width
+ let miniMapBoxLeft = (boxWidth - actWidth) / 2
+ let miniMapBoxTop = (boxHeight - actHeight) / 2
+ // 当前思维导图图形实际的宽高,即在缩放后的宽高
+ let _rectWidth = rect.width * scaleX
+ let _rectHeight = rect.height * scaleY
+ // 视口框大小及位置
+ let _rectWidthOffsetHalf = (_rectWidth - rect.width) / 2
+ let _rectHeightOffsetHalf = (_rectHeight - rect.height) / 2
+ let _rectX = rect.x - _rectWidthOffsetHalf
+ let _rectX2 = rect.x2 + _rectWidthOffsetHalf
+ let _rectY = rect.y - _rectHeightOffsetHalf
+ let _rectY2 = rect.y2 + _rectHeightOffsetHalf
+ let viewBoxStyle = {
+ left: 0,
+ top: 0,
+ right: 0,
+ bottom: 0
+ }
+ viewBoxStyle.left =
+ Math.max(0, (-_rectX / _rectWidth) * actWidth) + miniMapBoxLeft
+ viewBoxStyle.right =
+ Math.max(0, ((_rectX2 - origWidth) / _rectWidth) * actWidth) +
+ miniMapBoxLeft
+
+ viewBoxStyle.top =
+ Math.max(0, (-_rectY / _rectHeight) * actHeight) + miniMapBoxTop
+ viewBoxStyle.bottom =
+ Math.max(0, ((_rectY2 - origHeight) / _rectHeight) * actHeight) +
+ miniMapBoxTop
+
+ if (viewBoxStyle.top > miniMapBoxTop + actHeight) {
+ viewBoxStyle.top = miniMapBoxTop + actHeight
+ }
+ if (viewBoxStyle.left > miniMapBoxLeft + actWidth) {
+ viewBoxStyle.left = miniMapBoxLeft + actWidth
+ }
+
+ Object.keys(viewBoxStyle).forEach(key => {
+ viewBoxStyle[key] = viewBoxStyle[key] + 'px'
+ })
+ this.removeNodeContent(svg)
+ const svgStr = svg.svg()
+ this.currentState = {
+ viewBoxStyle: {
+ ...viewBoxStyle
+ },
+ miniMapBoxScale,
+ miniMapBoxLeft,
+ miniMapBoxTop
+ }
+ return {
+ getImgUrl: async callback => {
+ const res = await this.mindMap.doExport.fixSvgStrAndToBlob(svgStr)
+ callback(res)
+ },
+ svgHTML: svgStr, // 小地图html
+ viewBoxStyle, // 视图框的位置信息
+ miniMapBoxScale, // 视图框的缩放值
+ miniMapBoxLeft, // 视图框的left值
+ miniMapBoxTop // 视图框的top值
+ }
+ }
+
+ // 移除节点的内容
+ removeNodeContent(svg) {
+ if (svg.hasClass('smm-node')) {
+ let shape = svg.findOne('.smm-node-shape')
+ let fill = shape.attr('fill')
+ if (isWhite(fill) || isTransparent(fill)) {
+ shape.attr('fill', getVisibleColorFromTheme(this.mindMap.themeConfig))
+ }
+ svg.clear()
+ svg.add(shape)
+ return
+ }
+ let children = svg.children()
+ if (children && children.length > 0) {
+ children.forEach(node => {
+ this.removeNodeContent(node)
+ })
+ }
+ }
+
+ // 小地图鼠标按下事件
+ onMousedown(e) {
+ this.isMousedown = true
+ this.mousedownPos = {
+ x: e.clientX,
+ y: e.clientY
+ }
+ // 保存视图当前的偏移量
+ let transformData = this.mindMap.view.getTransformData()
+ this.startViewPos = {
+ x: transformData.state.x,
+ y: transformData.state.y
+ }
+ }
+
+ // 小地图鼠标移动事件
+ onMousemove(e, sensitivityNum = 5) {
+ if (!this.isMousedown || this.isViewBoxMousedown) {
+ return
+ }
+ let ox = e.clientX - this.mousedownPos.x
+ let oy = e.clientY - this.mousedownPos.y
+ // 在视图最初偏移量上累加更新量
+ this.mindMap.view.translateXTo(ox * sensitivityNum + this.startViewPos.x)
+ this.mindMap.view.translateYTo(oy * sensitivityNum + this.startViewPos.y)
+ }
+
+ // 小地图鼠标松开事件
+ onMouseup() {
+ this.isMousedown = false
+ this.isViewBoxMousedown = false
+ }
+
+ // 视口框鼠标按下事件
+ onViewBoxMousedown(e) {
+ this.isViewBoxMousedown = true
+ this.mousedownPos = {
+ x: e.clientX,
+ y: e.clientY
+ }
+ // 保存视图当前的偏移量
+ let transformData = this.mindMap.view.getTransformData()
+ this.startViewPos = {
+ x: transformData.state.x,
+ y: transformData.state.y
+ }
+ }
+
+ // 视口框鼠标移动事件
+ onViewBoxMousemove(e) {
+ if (!this.isViewBoxMousedown || !this.currentState || this.isMousedown)
+ return
+ let ox = e.clientX - this.mousedownPos.x
+ let oy = e.clientY - this.mousedownPos.y
+ const { viewBoxStyle, miniMapBoxScale, miniMapBoxLeft, miniMapBoxTop } =
+ this.currentState
+ const left = Math.max(
+ miniMapBoxLeft,
+ Number.parseFloat(viewBoxStyle.left) + ox
+ )
+ const right = Math.max(
+ miniMapBoxLeft,
+ Number.parseFloat(viewBoxStyle.right) - ox
+ )
+ const top = Math.max(
+ miniMapBoxTop,
+ Number.parseFloat(viewBoxStyle.top) + oy
+ )
+ const bottom = Math.max(
+ miniMapBoxTop,
+ Number.parseFloat(viewBoxStyle.bottom) - oy
+ )
+ this.mindMap.emit('mini_map_view_box_position_change', {
+ left: left + 'px',
+ right: right + 'px',
+ top: top + 'px',
+ bottom: bottom + 'px'
+ })
+ // 在视图最初偏移量上累加更新量
+ this.mindMap.view.translateXTo(-ox / miniMapBoxScale + this.startViewPos.x)
+ this.mindMap.view.translateYTo(-oy / miniMapBoxScale + this.startViewPos.y)
+ }
+}
+
+MiniMap.instanceName = 'miniMap'
+
+export default MiniMap
diff --git a/packages/mindmap/src/plugins/NodeImgAdjust.js b/packages/mindmap/src/plugins/NodeImgAdjust.js
new file mode 100644
index 0000000..ce2a17d
--- /dev/null
+++ b/packages/mindmap/src/plugins/NodeImgAdjust.js
@@ -0,0 +1,337 @@
+// 节点图片大小调整插件
+import { resizeImgSizeByOriginRatio } from '../utils/index'
+import btnsSvg from '../svg/btns'
+
+class NodeImgAdjust {
+ // 构造函数
+ constructor({ mindMap }) {
+ this.mindMap = mindMap
+ this.handleEl = null // 自定义元素,用来渲染临时图片、调整按钮
+ this.isShowHandleEl = false // 自定义元素是否在显示中
+ this.node = null // 当前节点实例
+ this.img = null // 当前节点的图片节点
+ this.rect = null // 当前图片节点的尺寸信息
+ this.isMousedown = false // 当前是否是按住调整按钮状态
+ this.mousedownDrawTransform = null //鼠标按下时对当前画布的变换
+ this.mousedownOffset = {
+ // 鼠标按下时位置和图片右下角相差的距离
+ x: 0,
+ y: 0
+ }
+ this.currentImgWidth = 0 // 当前拖拽实时图片的大小
+ this.currentImgHeight = 0
+ this.isAdjusted = false // 是否是拖拽结束后的渲染期间
+ this.bindEvent()
+ }
+
+ // 监听事件
+ bindEvent() {
+ this.onNodeImgMouseleave = this.onNodeImgMouseleave.bind(this)
+ this.onNodeImgMousemove = this.onNodeImgMousemove.bind(this)
+ this.onMousemove = this.onMousemove.bind(this)
+ this.onMouseup = this.onMouseup.bind(this)
+ this.onRenderEnd = this.onRenderEnd.bind(this)
+ this.mindMap.on('node_img_mouseleave', this.onNodeImgMouseleave)
+ this.mindMap.on('node_img_mousemove', this.onNodeImgMousemove)
+ this.mindMap.on('mousemove', this.onMousemove)
+ this.mindMap.on('mouseup', this.onMouseup)
+ this.mindMap.on('node_mouseup', this.onMouseup)
+ this.mindMap.on('node_tree_render_end', this.onRenderEnd)
+ }
+
+ // 解绑事件
+ unBindEvent() {
+ this.mindMap.off('node_img_mouseleave', this.onNodeImgMouseleave)
+ this.mindMap.off('node_img_mousemove', this.onNodeImgMousemove)
+ this.mindMap.off('mousemove', this.onMousemove)
+ this.mindMap.off('mouseup', this.onMouseup)
+ this.mindMap.off('node_mouseup', this.onMouseup)
+ this.mindMap.off('node_tree_render_end', this.onRenderEnd)
+ }
+
+ // 节点图片鼠标移动事件
+ onNodeImgMousemove(node, img) {
+ // 如果当前正在拖动调整中那么直接返回
+ if (this.isMousedown || this.isAdjusted || this.mindMap.opt.readonly) return
+ // 如果在当前节点内移动,以及自定义元素已经是显示状态,那么直接返回
+ if (this.node && this.node.uid === node.uid && this.isShowHandleEl) return
+ // 更新当前节点信息
+ this.node = node
+ this.img = img
+ this.rect = this.img.rbox()
+ // 显示自定义元素
+ this.showHandleEl()
+ }
+
+ // 节点图片鼠标移出事件
+ onNodeImgMouseleave() {
+ if (this.isMousedown) return
+ this.hideHandleEl()
+ }
+
+ // 隐藏节点实际的图片
+ hideNodeImage() {
+ if (!this.img) return
+ this.img.hide()
+ }
+
+ // 显示节点实际的图片
+ showNodeImage() {
+ if (!this.img) return
+ this.img.show()
+ }
+
+ // 显示自定义元素
+ showHandleEl() {
+ if (this.isShowHandleEl) return
+ if (!this.handleEl) {
+ this.createResizeBtnEl()
+ }
+ this.setHandleElRect()
+ this.handleEl.style.display = 'block'
+ this.isShowHandleEl = true
+ }
+
+ // 隐藏自定义元素
+ hideHandleEl() {
+ if (!this.isShowHandleEl) return
+ this.isShowHandleEl = false
+ this.handleEl.style.display = 'none'
+ this.handleEl.style.backgroundImage = ``
+ this.handleEl.style.width = 0
+ this.handleEl.style.height = 0
+ this.handleEl.style.left = 0
+ this.handleEl.style.top = 0
+ }
+
+ // 设置自定义元素尺寸位置信息
+ setHandleElRect() {
+ let { width, height, x, y } = this.rect
+ this.handleEl.style.left = `${x}px`
+ this.handleEl.style.top = `${y}px`
+ this.currentImgWidth = width
+ this.currentImgHeight = height
+ this.updateHandleElSize()
+ }
+
+ // 更新自定义元素宽高
+ updateHandleElSize() {
+ this.handleEl.style.width = `${this.currentImgWidth}px`
+ this.handleEl.style.height = `${this.currentImgHeight}px`
+ }
+
+ // 创建调整按钮元素
+ createResizeBtnEl() {
+ const { imgResizeBtnSize } = this.mindMap.opt
+ // 容器元素
+ this.handleEl = document.createElement('div')
+ this.handleEl.style.cssText = `
+ pointer-events: none;
+ position: fixed;
+ display:none;
+ background-size: cover;
+ `
+ this.handleEl.className = 'node-img-handle'
+ // 调整按钮元素
+ const btnEl = document.createElement('div')
+ btnEl.innerHTML = btnsSvg.imgAdjust
+ btnEl.style.cssText = `
+ position: absolute;
+ right: 0;
+ bottom: 0;
+ pointer-events: auto;
+ background-color: rgba(0, 0, 0, 0.3);
+ width: ${imgResizeBtnSize}px;
+ height: ${imgResizeBtnSize}px;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ cursor: nwse-resize;
+ `
+ btnEl.className = 'node-image-resize'
+ // 给按钮元素绑定事件
+ btnEl.addEventListener('mouseenter', () => {
+ // 移入按钮,会触发节点图片的移出事件,所以需要再次显示按钮
+ this.showHandleEl()
+ })
+ btnEl.addEventListener('mouseleave', () => {
+ // 移除按钮,需要隐藏按钮
+ if (this.isMousedown) return
+ this.hideHandleEl()
+ })
+ btnEl.addEventListener('mousedown', e => {
+ e.stopPropagation()
+ e.preventDefault()
+ this.onMousedown(e)
+ })
+ btnEl.addEventListener('mouseup', e => {
+ setTimeout(() => {
+ //点击后直接松开异常处理; 其他事件响应之后处理
+ this.hideHandleEl()
+ this.isAdjusted = false
+ }, 0)
+ })
+ btnEl.addEventListener('click', e => {
+ e.stopPropagation()
+ })
+ this.handleEl.appendChild(btnEl)
+ // 删除按钮
+ const btnRemove = document.createElement('div')
+ this.handleEl.prepend(btnRemove)
+ btnRemove.className = 'node-image-remove'
+ btnRemove.innerHTML = btnsSvg.remove
+ btnRemove.style.cssText = `
+ position: absolute;
+ right: 0;top:0;color:#fff;
+ pointer-events: auto;
+ background-color: rgba(0, 0, 0, 0.3);
+ width: ${imgResizeBtnSize}px;
+ height: ${imgResizeBtnSize}px;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ cursor: pointer;
+ `
+ btnRemove.addEventListener('mouseenter', e => {
+ this.showHandleEl()
+ })
+ btnRemove.addEventListener('mouseleave', e => {
+ if (this.isMousedown) return
+ this.hideHandleEl()
+ })
+ btnRemove.addEventListener('click', async e => {
+ let stop = false
+ if (typeof this.mindMap.opt.beforeDeleteNodeImg === 'function') {
+ stop = await this.mindMap.opt.beforeDeleteNodeImg(this.node)
+ }
+ if (!stop) {
+ this.mindMap.execCommand('SET_NODE_IMAGE', this.node, { url: null })
+ }
+ })
+ // 添加元素到页面
+ const targetNode = this.mindMap.opt.customInnerElsAppendTo || document.body
+ targetNode.appendChild(this.handleEl)
+ }
+
+ // 鼠标按钮按下事件
+ onMousedown(e) {
+ this.isMousedown = true
+ this.mousedownDrawTransform = this.mindMap.draw.transform()
+ // 隐藏节点实际图片
+ this.hideNodeImage()
+ this.mousedownOffset.x = e.clientX - this.rect.x2
+ this.mousedownOffset.y = e.clientY - this.rect.y2
+ // 将节点图片渲染到自定义元素上
+ this.handleEl.style.backgroundImage = `url(${this.node.getData('image')})`
+ }
+
+ // 鼠标移动
+ onMousemove(e) {
+ if (!this.isMousedown) return
+ e.preventDefault()
+ const { scaleX, scaleY } = this.mousedownDrawTransform
+ // 图片原始大小
+ const { width: imageOriginWidth, height: imageOriginHeight } =
+ this.node.getData('imageSize')
+ let {
+ minImgResizeWidth,
+ minImgResizeHeight,
+ maxImgResizeWidthInheritTheme,
+ maxImgResizeWidth,
+ maxImgResizeHeight
+ } = this.mindMap.opt
+ // 主题设置的最小图片宽高
+ const minRatio = minImgResizeWidth / minImgResizeHeight
+ const oRatio = imageOriginWidth / imageOriginHeight
+ if (minRatio > oRatio) {
+ // 如果最小值比例大于图片原始比例,那么要调整高度最小值
+ minImgResizeHeight = minImgResizeWidth / oRatio
+ } else {
+ // 否则调整宽度最小值
+ minImgResizeWidth = minImgResizeHeight * oRatio
+ }
+ // 主题设置的最大图片宽高
+ let imgMaxWidth, imgMaxHeight
+ if (maxImgResizeWidthInheritTheme) {
+ imgMaxWidth = this.mindMap.getThemeConfig('imgMaxWidth')
+ imgMaxHeight = this.mindMap.getThemeConfig('imgMaxHeight')
+ } else {
+ imgMaxWidth = maxImgResizeWidth
+ imgMaxHeight = maxImgResizeHeight
+ }
+ imgMaxWidth = imgMaxWidth * scaleX
+ imgMaxHeight = imgMaxHeight * scaleY
+ // 计算当前拖拽位置对应的图片的实时大小
+ let newWidth = Math.abs(e.clientX - this.rect.x - this.mousedownOffset.x)
+ let newHeight = Math.abs(e.clientY - this.rect.y - this.mousedownOffset.y)
+ // 限制最小值
+ if (newWidth < minImgResizeWidth) newWidth = minImgResizeWidth
+ if (newHeight < minImgResizeHeight) newHeight = minImgResizeHeight
+ // 限制最大值
+ if (newWidth > imgMaxWidth) newWidth = imgMaxWidth
+ if (newHeight > imgMaxHeight) newHeight = imgMaxHeight
+ const [actWidth, actHeight] = resizeImgSizeByOriginRatio(
+ imageOriginWidth,
+ imageOriginHeight,
+ newWidth,
+ newHeight
+ )
+ this.currentImgWidth = actWidth
+ this.currentImgHeight = actHeight
+ this.updateHandleElSize()
+ }
+
+ // 鼠标松开
+ onMouseup() {
+ if (!this.isMousedown) return
+ // 显示节点实际图片
+ this.showNodeImage()
+ // 隐藏自定义元素
+ this.hideHandleEl()
+ // 更新节点图片为新的大小
+ const { image, imageTitle } = this.node.getData()
+ const { scaleX, scaleY } = this.mousedownDrawTransform
+ const newWidth = this.currentImgWidth / scaleX
+ const newHeight = this.currentImgHeight / scaleY
+ if (
+ Math.abs(newWidth - this.rect.width) > 1 ||
+ Math.abs(newHeight - this.rect.height) > 1
+ ) {
+ this.mindMap.execCommand('SET_NODE_IMAGE', this.node, {
+ url: image,
+ title: imageTitle,
+ width: newWidth,
+ height: newHeight,
+ custom: true // 代表自定义了图片大小
+ })
+ this.isAdjusted = true
+ }
+ this.isMousedown = false
+ this.mousedownDrawTransform = null
+ this.mousedownOffset.x = 0
+ this.mousedownOffset.y = 0
+ }
+
+ // 渲染完成事件
+ onRenderEnd() {
+ if (!this.isAdjusted) {
+ this.hideHandleEl()
+ return
+ }
+ this.isAdjusted = false
+ }
+
+ // 插件被移除前做的事情
+ beforePluginRemove() {
+ this.unBindEvent()
+ }
+
+ // 插件被卸载前做的事情
+ beforePluginDestroy() {
+ this.unBindEvent()
+ }
+}
+
+NodeImgAdjust.instanceName = 'nodeImgAdjust'
+
+export default NodeImgAdjust
diff --git a/packages/mindmap/src/plugins/OuterFrame.js b/packages/mindmap/src/plugins/OuterFrame.js
new file mode 100644
index 0000000..2bcffcd
--- /dev/null
+++ b/packages/mindmap/src/plugins/OuterFrame.js
@@ -0,0 +1,406 @@
+import {
+ formatDataToArray,
+ walk,
+ getTopAncestorsFomNodeList,
+ getNodeListBoundingRect,
+ createUid
+} from '../utils'
+
+// 解析要添加外框的节点实例列表
+const parseAddNodeList = list => {
+ // 找出顶层节点
+ list = getTopAncestorsFomNodeList(list)
+ const cache = {}
+ const uidToParent = {}
+ // 找出列表中节点在兄弟节点中的索引,并和父节点关联起来
+ list.forEach(node => {
+ const parent = node.parent
+ if (parent) {
+ const pUid = parent.uid
+ uidToParent[pUid] = parent
+ const index = node.getIndexInBrothers()
+ const data = {
+ node,
+ index
+ }
+ if (cache[pUid]) {
+ if (
+ !cache[pUid].find(item => {
+ return item.index === data.index
+ })
+ ) {
+ cache[pUid].push(data)
+ }
+ } else {
+ cache[pUid] = [data]
+ }
+ }
+ })
+ const res = []
+ Object.keys(cache).forEach(uid => {
+ const indexList = cache[uid]
+ const parentNode = uidToParent[uid]
+ if (indexList.length > 1) {
+ // 多个节点
+ const rangeList = indexList
+ .map(item => {
+ return item.index
+ })
+ .sort((a, b) => {
+ return a - b
+ })
+ const minIndex = rangeList[0]
+ const maxIndex = rangeList[rangeList.length - 1]
+ let curStart = -1
+ let curEnd = -1
+ for (let i = minIndex; i <= maxIndex; i++) {
+ // 连续索引
+ if (rangeList.includes(i)) {
+ if (curStart === -1) {
+ curStart = i
+ }
+ curEnd = i
+ } else {
+ // 连续断开
+ if (curStart !== -1 && curEnd !== -1) {
+ res.push({
+ node: parentNode,
+ range: [curStart, curEnd]
+ })
+ }
+ curStart = -1
+ curEnd = -1
+ }
+ }
+ // 不要忘了最后一段索引
+ if (curStart !== -1 && curEnd !== -1) {
+ res.push({
+ node: parentNode,
+ range: [curStart, curEnd]
+ })
+ }
+ } else {
+ // 单个节点
+ res.push({
+ node: parentNode,
+ range: [indexList[0].index, indexList[0].index]
+ })
+ }
+ })
+ return res
+}
+
+// 解析获取节点的子节点生成的外框列表
+const getNodeOuterFrameList = node => {
+ const children = node.children
+ if (!children || children.length <= 0) return
+ const res = []
+ const map = {}
+ children.forEach((item, index) => {
+ const outerFrameData = item.getData('outerFrame')
+ if (!outerFrameData) return
+ const groupId = outerFrameData.groupId
+ if (groupId) {
+ if (!map[groupId]) {
+ map[groupId] = []
+ }
+ map[groupId].push({
+ node: item,
+ index
+ })
+ } else {
+ res.push({
+ nodeList: [item],
+ range: [index, index]
+ })
+ }
+ })
+ Object.keys(map).forEach(id => {
+ const list = map[id]
+ res.push({
+ nodeList: list.map(item => {
+ return item.node
+ }),
+ range: [list[0].index, list[list.length - 1].index]
+ })
+ })
+ return res
+}
+
+// 默认外框样式
+const defaultStyle = {
+ radius: 5,
+ strokeWidth: 2,
+ strokeColor: '#0984e3',
+ strokeDasharray: '5,5',
+ fill: 'rgba(9,132,227,0.05)'
+}
+
+// 外框插件
+class OuterFrame {
+ constructor(opt = {}) {
+ this.mindMap = opt.mindMap
+ this.draw = null
+ this.createDrawContainer()
+ this.outerFrameElList = []
+ this.activeOuterFrame = null
+ this.bindEvent()
+ }
+
+ // 创建容器
+ createDrawContainer() {
+ this.draw = this.mindMap.draw.group()
+ this.draw.addClass('smm-outer-frame-container')
+ this.draw.back() // 最底层
+ this.draw.forward() // 连线层上面
+ }
+
+ // 绑定事件
+ bindEvent() {
+ this.renderOuterFrames = this.renderOuterFrames.bind(this)
+ this.mindMap.on('node_tree_render_end', this.renderOuterFrames)
+ this.mindMap.on('data_change', this.renderOuterFrames)
+ // 监听画布和节点点击事件,用于清除当前激活的连接线
+ this.clearActiveOuterFrame = this.clearActiveOuterFrame.bind(this)
+ this.mindMap.on('draw_click', this.clearActiveOuterFrame)
+ this.mindMap.on('node_click', this.clearActiveOuterFrame)
+
+ this.addOuterFrame = this.addOuterFrame.bind(this)
+ this.mindMap.command.add('ADD_OUTER_FRAME', this.addOuterFrame)
+
+ this.removeActiveOuterFrame = this.removeActiveOuterFrame.bind(this)
+ this.mindMap.keyCommand.addShortcut(
+ 'Del|Backspace',
+ this.removeActiveOuterFrame
+ )
+ }
+
+ // 解绑事件
+ unBindEvent() {
+ this.mindMap.off('node_tree_render_end', this.renderOuterFrames)
+ this.mindMap.off('data_change', this.renderOuterFrames)
+ this.mindMap.off('draw_click', this.clearActiveOuterFrame)
+ this.mindMap.off('node_click', this.clearActiveOuterFrame)
+ this.mindMap.command.remove('ADD_OUTER_FRAME', this.addOuterFrame)
+ this.mindMap.keyCommand.removeShortcut(
+ 'Del|Backspace',
+ this.removeActiveOuterFrame
+ )
+ }
+
+ // 给节点添加外框数据
+ /*
+ config: {
+ text: '',
+ radius: 5,
+ strokeWidth: 2,
+ strokeColor: '#0984e3',
+ strokeDasharray: '5,5',
+ fill: 'rgba(9,132,227,0.05)'
+ }
+ */
+ addOuterFrame(appointNodes, config = {}) {
+ appointNodes = formatDataToArray(appointNodes)
+ const activeNodeList = this.mindMap.renderer.activeNodeList
+ if (activeNodeList.length <= 0 && appointNodes.length <= 0) {
+ return
+ }
+ let nodeList = appointNodes.length > 0 ? appointNodes : activeNodeList
+ nodeList = nodeList.filter(node => {
+ return !node.isRoot && !node.isGeneralization
+ })
+ const list = parseAddNodeList(nodeList)
+ list.forEach(({ node, range }) => {
+ const childNodeList = node.children.slice(range[0], range[1] + 1)
+ const groupId = createUid()
+ childNodeList.forEach(child => {
+ let outerFrame = child.getData('outerFrame')
+ // 检查该外框是否已存在
+ if (outerFrame) {
+ outerFrame = {
+ ...outerFrame,
+ ...config,
+ groupId
+ }
+ } else {
+ outerFrame = {
+ ...config,
+ groupId
+ }
+ }
+ this.mindMap.execCommand('SET_NODE_DATA', child, {
+ outerFrame
+ })
+ })
+ })
+ }
+
+ // 获取当前激活的外框
+ getActiveOuterFrame() {
+ return this.activeOuterFrame
+ ? {
+ ...this.activeOuterFrame
+ }
+ : null
+ }
+
+ // 删除当前激活的外框
+ removeActiveOuterFrame() {
+ if (!this.activeOuterFrame) return
+ const { node, range } = this.activeOuterFrame
+ this.getRangeNodeList(node, range).forEach(child => {
+ this.mindMap.execCommand('SET_NODE_DATA', child, {
+ outerFrame: null
+ })
+ })
+ this.mindMap.emit('outer_frame_delete')
+ }
+
+ // 更新当前激活的外框
+ // 执行了该方法后请立即隐藏你的样式面板,因为会清除当前激活的外框
+ updateActiveOuterFrame(config = {}) {
+ if (!this.activeOuterFrame) return
+ const { node, range } = this.activeOuterFrame
+ this.getRangeNodeList(node, range).forEach(node => {
+ const outerFrame = node.getData('outerFrame')
+ this.mindMap.execCommand('SET_NODE_DATA', node, {
+ outerFrame: {
+ ...outerFrame,
+ ...config
+ }
+ })
+ })
+ }
+
+ // 获取某个节点指定范围的带外框的子节点列表
+ getRangeNodeList(node, range) {
+ return node.children.slice(range[0], range[1] + 1).filter(child => {
+ return child.getData('outerFrame')
+ })
+ }
+
+ // 渲染外框
+ renderOuterFrames() {
+ this.clearOuterFrameElList()
+ let tree = this.mindMap.renderer.root
+ if (!tree) return
+ const t = this.mindMap.draw.transform()
+ const { outerFramePaddingX, outerFramePaddingY } = this.mindMap.opt
+ walk(
+ tree,
+ null,
+ cur => {
+ if (!cur) return
+ const outerFrameList = getNodeOuterFrameList(cur)
+ if (outerFrameList && outerFrameList.length > 0) {
+ outerFrameList.forEach(({ nodeList, range }) => {
+ if (range[0] === -1 || range[1] === -1) return
+ const { left, top, width, height } =
+ getNodeListBoundingRect(nodeList)
+ if (
+ !Number.isFinite(left) ||
+ !Number.isFinite(top) ||
+ !Number.isFinite(width) ||
+ !Number.isFinite(height)
+ )
+ return
+ const el = this.createOuterFrameEl(
+ (left -
+ outerFramePaddingX -
+ this.mindMap.elRect.left -
+ t.translateX) /
+ t.scaleX,
+ (top -
+ outerFramePaddingY -
+ this.mindMap.elRect.top -
+ t.translateY) /
+ t.scaleY,
+ (width + outerFramePaddingX * 2) / t.scaleX,
+ (height + outerFramePaddingY * 2) / t.scaleY,
+ nodeList[0].getData('outerFrame') // 使用第一个节点的外框样式
+ )
+ el.on('click', e => {
+ e.stopPropagation()
+ this.setActiveOuterFrame(el, cur, range)
+ })
+ })
+ }
+ },
+ () => {},
+ true,
+ 0
+ )
+ }
+
+ // 激活外框
+ setActiveOuterFrame(el, node, range) {
+ this.mindMap.execCommand('CLEAR_ACTIVE_NODE')
+ this.clearActiveOuterFrame()
+ this.activeOuterFrame = {
+ el,
+ node,
+ range
+ }
+ el.stroke({
+ dasharray: 'none'
+ })
+ this.mindMap.emit('outer_frame_active', el, node, range)
+ }
+
+ // 清除当前激活的外框
+ clearActiveOuterFrame() {
+ if (!this.activeOuterFrame) return
+ const { el } = this.activeOuterFrame
+ el.stroke({
+ dasharray: el.cacheStyle.dasharray || defaultStyle.strokeDasharray
+ })
+ this.activeOuterFrame = null
+ }
+
+ // 创建外框元素
+ createOuterFrameEl(x, y, width, height, styleConfig = {}) {
+ styleConfig = { ...defaultStyle, ...styleConfig }
+ const el = this.draw
+ .rect()
+ .size(width, height)
+ .radius(styleConfig.radius)
+ .stroke({
+ width: styleConfig.strokeWidth,
+ color: styleConfig.strokeColor,
+ dasharray: styleConfig.strokeDasharray
+ })
+ .fill({
+ color: styleConfig.fill
+ })
+ .x(x)
+ .y(y)
+ el.cacheStyle = {
+ dasharray: styleConfig.strokeDasharray
+ }
+ this.outerFrameElList.push(el)
+ return el
+ }
+
+ // 清除外框元素
+ clearOuterFrameElList() {
+ this.outerFrameElList.forEach(item => {
+ item.remove()
+ })
+ this.outerFrameElList = []
+ this.activeOuterFrame = null
+ }
+
+ // 插件被移除前做的事情
+ beforePluginRemove() {
+ this.unBindEvent()
+ }
+
+ // 插件被卸载前做的事情
+ beforePluginDestroy() {
+ this.unBindEvent()
+ }
+}
+
+OuterFrame.instanceName = 'outerFrame'
+
+export default OuterFrame
diff --git a/packages/mindmap/src/plugins/Painter.js b/packages/mindmap/src/plugins/Painter.js
new file mode 100644
index 0000000..3b7be75
--- /dev/null
+++ b/packages/mindmap/src/plugins/Painter.js
@@ -0,0 +1,87 @@
+import { checkIsNodeStyleDataKey } from '../utils/index'
+
+// 格式刷插件
+class Painter {
+ constructor({ mindMap }) {
+ this.mindMap = mindMap
+ this.isInPainter = false
+ this.painterNode = null
+ this.bindEvent()
+ }
+
+ bindEvent() {
+ this.painterOneNode = this.painterOneNode.bind(this)
+ this.onEndPainter = this.onEndPainter.bind(this)
+ this.mindMap.on('node_click', this.painterOneNode)
+ this.mindMap.on('draw_click', this.onEndPainter)
+ }
+
+ unBindEvent() {
+ this.mindMap.off('node_click', this.painterOneNode)
+ this.mindMap.off('draw_click', this.onEndPainter)
+ }
+
+ // 开始格式刷
+ startPainter() {
+ if (this.mindMap.opt.readonly) return
+ let activeNodeList = this.mindMap.renderer.activeNodeList
+ if (activeNodeList.length <= 0) return
+ this.painterNode = activeNodeList[0]
+ this.isInPainter = true
+ this.mindMap.emit('painter_start')
+ }
+
+ // 结束格式刷
+ endPainter() {
+ this.painterNode = null
+ this.isInPainter = false
+ }
+
+ onEndPainter() {
+ if (!this.isInPainter) return
+ this.endPainter()
+ this.mindMap.emit('painter_end')
+ }
+
+ // 格式刷某个节点
+ painterOneNode(node) {
+ if (
+ !node ||
+ !this.isInPainter ||
+ !this.painterNode ||
+ !node ||
+ node.uid === this.painterNode.uid
+ )
+ return
+ let style = {}
+ // 格式刷节点所有生效的样式
+ if (!this.mindMap.opt.onlyPainterNodeCustomStyles) {
+ style = {
+ ...this.painterNode.effectiveStyles
+ }
+ }
+ const painterNodeData = this.painterNode.getData()
+ Object.keys(painterNodeData).forEach(key => {
+ if (checkIsNodeStyleDataKey(key)) {
+ style[key] = painterNodeData[key]
+ }
+ })
+ // 先去除目标节点的样式
+ this.mindMap.renderer._handleRemoveCustomStyles(node.getData())
+ node.setStyles(style)
+ }
+
+ // 插件被移除前做的事情
+ beforePluginRemove() {
+ this.unBindEvent()
+ }
+
+ // 插件被卸载前做的事情
+ beforePluginDestroy() {
+ this.unBindEvent()
+ }
+}
+
+Painter.instanceName = 'painter'
+
+export default Painter
diff --git a/packages/mindmap/src/plugins/RainbowLines.js b/packages/mindmap/src/plugins/RainbowLines.js
new file mode 100644
index 0000000..42bfaeb
--- /dev/null
+++ b/packages/mindmap/src/plugins/RainbowLines.js
@@ -0,0 +1,92 @@
+import { walk, getNodeDataIndex } from '../utils/index'
+
+const defaultColorsList = [
+ 'rgb(255, 213, 73)',
+ 'rgb(255, 136, 126)',
+ 'rgb(107, 225, 141)',
+ 'rgb(151, 171, 255)',
+ 'rgb(129, 220, 242)',
+ 'rgb(255, 163, 125)',
+ 'rgb(152, 132, 234)'
+]
+
+// 彩虹线条插件
+class RainbowLines {
+ constructor({ mindMap }) {
+ this.mindMap = mindMap
+ }
+
+ // 更新彩虹线条配置
+ updateRainLinesConfig(config = {}) {
+ const newConfig = this.mindMap.opt.rainbowLinesConfig || {}
+ newConfig.open = !!config.open
+ newConfig.colorsList = Array.isArray(config.colorsList)
+ ? config.colorsList
+ : []
+ // 如果开启彩虹线条,那么先移除所有节点的自定义连线颜色配置
+ if (this.mindMap.opt.rainbowLinesConfig.open) {
+ this.removeNodeLineColor()
+ }
+ this.mindMap.render()
+ }
+
+ // 删除所有节点的连线颜色
+ removeNodeLineColor() {
+ const tree = this.mindMap.renderer.renderTree
+ if (!tree) return
+ walk(
+ tree,
+ null,
+ cur => {
+ delete cur.data.lineColor
+ },
+ null,
+ true
+ )
+ this.mindMap.command.addHistory()
+ }
+
+ // 获取一个节点的第二层级的祖先节点
+ getSecondLayerAncestor(node) {
+ if (node.layerIndex === 0) {
+ return null
+ } else if (node.layerIndex === 1) {
+ return node
+ } else {
+ let res = null
+ let parent = node.parent
+ while (parent) {
+ if (parent.layerIndex === 1) {
+ return parent
+ }
+ parent = parent.parent
+ }
+ return res
+ }
+ }
+
+ // 获取颜色列表
+ getColorsList() {
+ const { rainbowLinesConfig } = this.mindMap.opt
+ return rainbowLinesConfig &&
+ Array.isArray(rainbowLinesConfig.colorsList) &&
+ rainbowLinesConfig.colorsList.length > 0
+ ? rainbowLinesConfig.colorsList
+ : [...defaultColorsList]
+ }
+
+ // 获取一个节点的彩虹线条颜色
+ getNodeColor(node) {
+ const { rainbowLinesConfig } = this.mindMap.opt
+ if (!rainbowLinesConfig || !rainbowLinesConfig.open) return ''
+ const ancestor = this.getSecondLayerAncestor(node)
+ if (!ancestor) return
+ const index = getNodeDataIndex(ancestor)
+ const colorsList = this.getColorsList()
+ return colorsList[index % colorsList.length]
+ }
+}
+
+RainbowLines.instanceName = 'rainbowLines'
+
+export default RainbowLines
diff --git a/packages/mindmap/src/plugins/RichText.js b/packages/mindmap/src/plugins/RichText.js
new file mode 100644
index 0000000..a01116a
--- /dev/null
+++ b/packages/mindmap/src/plugins/RichText.js
@@ -0,0 +1,826 @@
+import Quill from 'quill'
+import Delta from 'quill-delta'
+import 'quill/dist/quill.snow.css'
+import {
+ walk,
+ getTextFromHtml,
+ isUndef,
+ checkSmmFormatData,
+ formatGetNodeGeneralization,
+ nodeRichTextToTextWithWrap,
+ getNodeRichTextStyles,
+ htmlEscape,
+ compareVersion
+} from '../utils'
+import { CONSTANTS, richTextSupportStyleList } from '../constants/constant'
+import MindMapNode from '../core/render/node/MindMapNode'
+import { Scope } from 'parchment'
+
+let extended = false
+
+// 扩展quill的字体列表
+let fontFamilyList = [
+ '宋体, SimSun, Songti SC',
+ '微软雅黑, Microsoft YaHei',
+ '楷体, 楷体_GB2312, SimKai, STKaiti',
+ '黑体, SimHei, Heiti SC',
+ '隶书, SimLi',
+ 'andale mono',
+ 'arial, helvetica, sans-serif',
+ 'arial black, avant garde',
+ 'comic sans ms',
+ 'impact, chicago',
+ 'times new roman',
+ 'sans-serif',
+ 'serif'
+]
+
+// 扩展quill的字号列表
+let fontSizeList = new Array(100).fill(0).map((_, index) => {
+ return index + 'px'
+})
+
+// 富文本编辑插件
+class RichText {
+ constructor({ mindMap, pluginOpt }) {
+ this.mindMap = mindMap
+ this.pluginOpt = pluginOpt
+ this.textEditNode = null
+ this.showTextEdit = false
+ this.quill = null
+ this.range = null
+ this.lastRange = null
+ this.pasteUseRange = null
+ this.node = null
+ this.isInserting = false
+ this.styleEl = null
+ this.cacheEditingText = ''
+ this.isCompositing = false
+ this.textNodePaddingX = 6
+ this.textNodePaddingY = 4
+ this.initOpt()
+ this.extendQuill()
+ this.appendCss()
+ this.bindEvent()
+
+ this.handleDataToRichTextOnInit()
+ }
+
+ // 绑定事件
+ bindEvent() {
+ this.onCompositionStart = this.onCompositionStart.bind(this)
+ this.onCompositionUpdate = this.onCompositionUpdate.bind(this)
+ this.onCompositionEnd = this.onCompositionEnd.bind(this)
+ this.handleSetData = this.handleSetData.bind(this)
+ window.addEventListener('compositionstart', this.onCompositionStart)
+ window.addEventListener('compositionupdate', this.onCompositionUpdate)
+ window.addEventListener('compositionend', this.onCompositionEnd)
+ this.mindMap.on('before_update_data', this.handleSetData)
+ this.mindMap.on('before_set_data', this.handleSetData)
+ }
+
+ // 解绑事件
+ unbindEvent() {
+ window.removeEventListener('compositionstart', this.onCompositionStart)
+ window.removeEventListener('compositionupdate', this.onCompositionUpdate)
+ window.removeEventListener('compositionend', this.onCompositionEnd)
+ this.mindMap.off('before_update_data', this.handleSetData)
+ this.mindMap.off('before_set_data', this.handleSetData)
+ }
+
+ // 插入样式
+ appendCss() {
+ this.mindMap.appendCss(
+ 'richText',
+ `
+ .smm-richtext-node-wrap {
+ word-break: break-all;
+ user-select: none;
+ }
+ `
+ )
+ let cssText = `
+ .${CONSTANTS.EDIT_NODE_CLASS.RICH_TEXT_EDIT_WRAP} {
+ overflow: hidden;
+ padding: 0;
+ height: auto;
+ line-height: 1.2;
+ -webkit-user-select: text;
+ }
+
+ .ql-container {
+ height: auto;
+ font-size: inherit;
+ }
+
+ .ql-container.ql-snow {
+ border: none;
+ }
+ `
+ this.styleEl = document.createElement('style')
+ this.styleEl.type = 'text/css'
+ this.styleEl.innerHTML = cssText
+ document.head.appendChild(this.styleEl)
+ }
+
+ // 处理选项参数
+ initOpt() {
+ if (
+ this.pluginOpt.fontFamilyList &&
+ Array.isArray(this.pluginOpt.fontFamilyList)
+ ) {
+ fontFamilyList = this.pluginOpt.fontFamilyList
+ }
+ if (
+ this.pluginOpt.fontSizeList &&
+ Array.isArray(this.pluginOpt.fontSizeList)
+ ) {
+ fontSizeList = this.pluginOpt.fontSizeList
+ }
+ }
+
+ // 扩展quill编辑器
+ extendQuill() {
+ if (extended) {
+ return
+ }
+ extended = true
+
+ this.extendFont([])
+
+ // 扩展quill的字号列表
+ const SizeAttributor = Quill.import('attributors/class/size')
+ SizeAttributor.whitelist = fontSizeList
+ Quill.register(SizeAttributor, true)
+
+ const SizeStyle = Quill.import('attributors/style/size')
+ SizeStyle.whitelist = fontSizeList
+ Quill.register(SizeStyle, true)
+ }
+
+ // 扩展字体列表
+ extendFont(list = [], cover = false) {
+ fontFamilyList = cover ? [...list] : [...fontFamilyList, ...list]
+
+ // 扩展quill的字体列表
+ const FontAttributor = Quill.import('attributors/class/font')
+ FontAttributor.whitelist = fontFamilyList
+ Quill.register(FontAttributor, true)
+
+ const FontStyle = Quill.import('attributors/style/font')
+ FontStyle.whitelist = fontFamilyList
+ Quill.register(FontStyle, true)
+ }
+
+ // 显示文本编辑控件
+ showEditText({ node, rect, isInserting, isFromKeyDown, isFromScale }) {
+ if (this.showTextEdit) {
+ return
+ }
+ let {
+ customInnerElsAppendTo,
+ nodeTextEditZIndex,
+ textAutoWrapWidth,
+ selectTextOnEnterEditText,
+ transformRichTextOnEnterEdit,
+ openRealtimeRenderOnNodeTextEdit,
+ autoEmptyTextWhenKeydownEnterEdit
+ } = this.mindMap.opt
+ textAutoWrapWidth = node.hasCustomWidth()
+ ? node.customTextWidth
+ : textAutoWrapWidth
+ this.node = node
+ this.isInserting = isInserting
+ if (!rect) rect = node._textData.node.node.getBoundingClientRect()
+ if (!isFromScale) {
+ this.mindMap.emit('before_show_text_edit')
+ }
+ this.mindMap.renderer.textEdit.registerTmpShortcut()
+ // 原始宽高
+ let g = node._textData.node
+ let originWidth = g.attr('data-width')
+ let originHeight = g.attr('data-height')
+ // 缩放值
+ const scaleX = Math.ceil(rect.width) / originWidth
+ const scaleY = Math.ceil(rect.height) / originHeight
+ // 内边距
+ let paddingX = this.textNodePaddingX
+ let paddingY = this.textNodePaddingY
+ if (!this.textEditNode) {
+ this.textEditNode = document.createElement('div')
+ this.textEditNode.classList.add('smm-richtext-node-edit-wrap')
+ this.textEditNode.style.cssText = `
+ position:fixed;
+ box-sizing: border-box;
+ ${
+ openRealtimeRenderOnNodeTextEdit
+ ? ''
+ : 'box-shadow: 0 0 20px rgba(0,0,0,.5);'
+ }
+ outline: none;
+ word-break: break-all;
+ padding: ${paddingY}px ${paddingX}px;
+ line-height: 1.2;
+ `
+ this.textEditNode.addEventListener('click', e => {
+ e.stopPropagation()
+ })
+ this.textEditNode.addEventListener('mousedown', e => {
+ e.stopPropagation()
+ })
+ this.textEditNode.addEventListener('keydown', e => {
+ if (this.mindMap.renderer.textEdit.checkIsAutoEnterTextEditKey(e)) {
+ e.stopPropagation()
+ }
+ })
+ const targetNode = customInnerElsAppendTo || document.body
+ targetNode.appendChild(this.textEditNode)
+ }
+ this.addNodeTextStyleToTextEditNode(node)
+ this.textEditNode.style.marginLeft = `-${paddingX * scaleX}px`
+ this.textEditNode.style.marginTop = `-${paddingY * scaleY}px`
+ this.textEditNode.style.zIndex = nodeTextEditZIndex
+ if (!openRealtimeRenderOnNodeTextEdit) {
+ this.textEditNode.style.background =
+ this.mindMap.renderer.textEdit.getBackground(node)
+ }
+ this.textEditNode.style.minWidth = originWidth + paddingX * 2 + 'px'
+ this.textEditNode.style.minHeight = originHeight + 'px'
+ this.textEditNode.style.left = rect.left + 'px'
+ this.textEditNode.style.top = rect.top + 'px'
+ this.textEditNode.style.display = 'block'
+ this.textEditNode.style.maxWidth = textAutoWrapWidth + paddingX * 2 + 'px'
+ this.textEditNode.style.transform = `scale(${scaleX}, ${scaleY})`
+ this.textEditNode.style.transformOrigin = 'left top'
+ // 节点文本内容
+ let nodeText = node.getData('text')
+ if (typeof transformRichTextOnEnterEdit === 'function') {
+ nodeText = transformRichTextOnEnterEdit(nodeText)
+ }
+ // 是否是空文本
+ const isEmptyText = isUndef(nodeText)
+ // 是否是非空的非富文本
+ const noneEmptyNoneRichText = !node.getData('richText') && !isEmptyText
+ if (isFromKeyDown && autoEmptyTextWhenKeydownEnterEdit) {
+ this.textEditNode.innerHTML = ''
+ } else if (noneEmptyNoneRichText) {
+ // 还不是富文本
+ let text = String(nodeText).split(/\n/gim).join('
')
+ let html = `${text}
`
+ this.textEditNode.innerHTML = this.cacheEditingText || html
+ } else {
+ // 已经是富文本
+ this.textEditNode.innerHTML = this.cacheEditingText || nodeText
+ }
+ this.initQuillEditor()
+ this.setQuillContainerMinHeight(originHeight)
+ this.showTextEdit = true
+ // 如果是刚创建的节点,那么默认全选,否则普通激活不全选,除非selectTextOnEnterEditText配置为true
+ // 在selectTextOnEnterEditText时,如果是在keydown事件进入的节点编辑,也不需要全选
+ this.focus(
+ isInserting || (selectTextOnEnterEditText && !isFromKeyDown) ? 0 : null
+ )
+ this.cacheEditingText = ''
+ }
+
+ // 当openRealtimeRenderOnNodeTextEdit配置更新后需要更新编辑框样式
+ onOpenRealtimeRenderOnNodeTextEditConfigUpdate(
+ openRealtimeRenderOnNodeTextEdit
+ ) {
+ if (!this.textEditNode) return
+ this.textEditNode.style.background = openRealtimeRenderOnNodeTextEdit
+ ? 'transparent'
+ : this.node
+ ? this.mindMap.renderer.textEdit.getBackground(this.node)
+ : ''
+ this.textEditNode.style.boxShadow = openRealtimeRenderOnNodeTextEdit
+ ? 'none'
+ : '0 0 20px rgba(0,0,0,.5)'
+ }
+
+ // 将指定节点的文本样式添加到编辑框元素上
+ addNodeTextStyleToTextEditNode(node) {
+ const style = getNodeRichTextStyles(node)
+ Object.keys(style).forEach(prop => {
+ this.textEditNode.style[prop] = style[prop]
+ })
+ }
+
+ // 设置quill编辑器容器的最小高度
+ setQuillContainerMinHeight(minHeight) {
+ document.querySelector(
+ '.' + CONSTANTS.EDIT_NODE_CLASS.RICH_TEXT_EDIT_WRAP
+ ).style.minHeight = minHeight + 'px'
+ }
+
+ // 更新文本编辑框的大小和位置
+ updateTextEditNode() {
+ if (!this.node) return
+ const g = this.node._textData.node
+ const rect = g.node.getBoundingClientRect()
+ const originWidth = g.attr('data-width')
+ const originHeight = g.attr('data-height')
+ this.textEditNode.style.minWidth =
+ originWidth + this.textNodePaddingX * 2 + 'px'
+ this.textEditNode.style.minHeight = originHeight + 'px'
+ this.textEditNode.style.left = rect.left + 'px'
+ this.textEditNode.style.top = rect.top + 'px'
+ this.setQuillContainerMinHeight(originHeight)
+ }
+
+ // 删除文本编辑框元素
+ removeTextEditEl() {
+ if (!this.textEditNode) return
+ const targetNode = this.mindMap.opt.customInnerElsAppendTo || document.body
+ targetNode.removeChild(this.textEditNode)
+ }
+
+ // 获取当前正在编辑的内容
+ getEditText() {
+ // https://github.com/slab/quill/issues/4509
+ return this.quill.container.firstChild.innerHTML.replaceAll(/ +/g, match =>
+ ' '.repeat(match.length)
+ )
+ // 去除ql-cursor节点
+ // https://github.com/wanglin2/mind-map/commit/138cc4b3e824671143f0bf70e5c46796f48520d0
+ // https://github.com/wanglin2/mind-map/commit/0760500cebe8ec4e8ad84ab63f877b8b2a193aa1
+ // html = removeHtmlNodeByClass(html, '.ql-cursor')
+ // 去除最后的空行
+ // return html.replace(/
<\/p>$/, '')
+ }
+
+ // 隐藏文本编辑控件,即完成编辑
+ hideEditText(nodes) {
+ if (!this.showTextEdit) {
+ return
+ }
+ const { beforeHideRichTextEdit } = this.mindMap.opt
+ if (typeof beforeHideRichTextEdit === 'function') {
+ beforeHideRichTextEdit(this)
+ }
+ const html = this.getEditText()
+ const list = nodes && nodes.length > 0 ? nodes : [this.node]
+ const node = this.node
+ this.textEditNode.style.display = 'none'
+ this.showTextEdit = false
+ this.mindMap.emit('rich_text_selection_change', false)
+ this.node = null
+ this.isInserting = false
+ list.forEach(node => {
+ this.mindMap.execCommand('SET_NODE_TEXT', node, html, true)
+ // if (node.isGeneralization) {
+ // 概要节点
+ // node.generalizationBelongNode.updateGeneralization()
+ // }
+ this.mindMap.render()
+ })
+ this.mindMap.emit('hide_text_edit', this.textEditNode, list, node)
+ }
+
+ // 初始化Quill富文本编辑器
+ initQuillEditor() {
+ this.quill = new Quill(this.textEditNode, {
+ modules: {
+ toolbar: false,
+ keyboard: {
+ bindings: {
+ enter: {
+ key: 'Enter',
+ handler: function () {
+ // 覆盖默认的回车键,禁止换行
+ }
+ },
+ shiftEnter: {
+ key: 'Enter',
+ shiftKey: true,
+ handler: function (range, context) {
+ // 覆盖默认的换行,默认情况下新行的样式会丢失
+ const lineFormats = Object.keys(context.format).reduce(
+ (formats, format) => {
+ if (
+ this.quill.scroll.query(format, Scope.BLOCK) &&
+ !Array.isArray(context.format[format])
+ ) {
+ formats[format] = context.format[format]
+ }
+ return formats
+ },
+ {}
+ )
+ const delta = new Delta()
+ .retain(range.index)
+ .delete(range.length)
+ .insert('\n', lineFormats)
+ this.quill.updateContents(delta, Quill.sources.USER)
+ this.quill.setSelection(range.index + 1, Quill.sources.SILENT)
+ this.quill.focus()
+ Object.keys(context.format).forEach(name => {
+ if (lineFormats[name] != null) return
+ if (Array.isArray(context.format[name])) return
+ if (name === 'code' || name === 'link') return
+ this.quill.format(
+ name,
+ context.format[name],
+ Quill.sources.USER
+ )
+ })
+ }
+ },
+ tab: {
+ key: 9,
+ handler: function () {
+ // 覆盖默认的tab键
+ }
+ }
+ }
+ }
+ },
+ formats: [
+ 'bold',
+ 'italic',
+ 'underline',
+ 'strike',
+ 'color',
+ 'background',
+ 'font',
+ 'size',
+ 'formula'
+ ], // 明确指定允许的格式,不包含有序列表,无序列表等
+ theme: 'snow'
+ })
+ // 拦截复制事件,即Ctrl + c,去除多余的空行
+ this.quill.root.addEventListener('copy', event => {
+ event.preventDefault()
+ const sel = window.getSelection()
+ const originStr = sel.toString()
+ try {
+ const range = sel.getRangeAt(0)
+ const div = document.createElement('div')
+ div.appendChild(range.cloneContents())
+ const text = nodeRichTextToTextWithWrap(div.innerHTML)
+ event.clipboardData.setData('text/plain', text)
+ } catch (e) {
+ event.clipboardData.setData('text/plain', originStr)
+ }
+ })
+ this.quill.on('selection-change', range => {
+ // 刚创建的节点全选不需要显示操作条
+ if (this.isInserting) return
+ this.lastRange = this.range
+ this.range = null
+ if (range) {
+ this.pasteUseRange = range
+ let bounds = this.quill.getBounds(range.index, range.length)
+ let rect = this.textEditNode.getBoundingClientRect()
+ let rectInfo = {
+ left: bounds.left + rect.left,
+ top: bounds.top + rect.top,
+ right: bounds.right + rect.left,
+ bottom: bounds.bottom + rect.top,
+ width: bounds.width
+ }
+ let formatInfo = this.quill.getFormat(range.index, range.length)
+ let hasRange = false
+ if (range.length == 0) {
+ hasRange = false
+ } else {
+ this.range = range
+ hasRange = true
+ }
+ this.mindMap.emit(
+ 'rich_text_selection_change',
+ hasRange,
+ rectInfo,
+ formatInfo
+ )
+ } else {
+ this.mindMap.emit('rich_text_selection_change', false, null, null)
+ }
+ })
+ this.quill.on('text-change', () => {
+ this.mindMap.emit('node_text_edit_change', {
+ node: this.node,
+ text: this.getEditText(),
+ richText: true
+ })
+ })
+ // 拦截粘贴,只允许粘贴纯文本
+ // this.quill.clipboard.addMatcher(Node.TEXT_NODE, node => {
+ // let style = this.getPasteTextStyle()
+ // return new Delta().insert(this.formatPasteText(node.data), style)
+ // })
+ // 剪贴板里只要存在文本就会走这里,所以当剪贴板里是纯文本,或文本+图片都可以监听到和拦截,但是只有纯图片时不会走这里,所以无法拦截
+ this.quill.clipboard.addMatcher(Node.ELEMENT_NODE, (node, delta) => {
+ let ops = []
+ let style = this.getPasteTextStyle()
+ delta.ops.forEach(op => {
+ // 过滤出文本内容,过滤掉换行
+ if (op.insert && typeof op.insert === 'string') {
+ ops.push({
+ attributes: { ...style },
+ insert: this.formatPasteText(op.insert)
+ })
+ }
+ })
+ delta.ops = ops
+ return delta
+ })
+ // 拦截图片的粘贴,当剪贴板里是纯图片,或文本+图片都可以拦截到,但是带来的问题是文本+图片时里面的文本也无法粘贴
+ this.quill.root.addEventListener(
+ 'paste',
+ e => {
+ if (
+ e.clipboardData &&
+ e.clipboardData.files &&
+ e.clipboardData.files.length
+ ) {
+ e.preventDefault()
+ }
+ },
+ true
+ )
+ }
+
+ // 获取粘贴的文本的样式
+ getPasteTextStyle() {
+ // 粘贴的数据使用当前光标位置处的文本样式
+ if (this.pasteUseRange) {
+ return this.quill.getFormat(
+ this.pasteUseRange.index,
+ this.pasteUseRange.length
+ )
+ }
+ return {}
+ }
+
+ // 处理粘贴的文本内容
+ formatPasteText(text) {
+ const { isSmm, data } = checkSmmFormatData(text)
+ if (isSmm && data[0] && data[0].data) {
+ // 只取第一个节点的纯文本
+ return getTextFromHtml(data[0].data.text)
+ } else {
+ return text
+ }
+ }
+
+ // 正则输入中文
+ onCompositionStart() {
+ if (!this.showTextEdit) {
+ return
+ }
+ this.isCompositing = true
+ }
+
+ // 中文输入中
+ onCompositionUpdate() {
+ if (!this.showTextEdit || !this.node) return
+ this.mindMap.emit('node_text_edit_change', {
+ node: this.node,
+ text: this.getEditText(),
+ richText: true
+ })
+ }
+
+ // 中文输入结束
+ onCompositionEnd() {
+ if (!this.showTextEdit) {
+ return
+ }
+ this.isCompositing = false
+ }
+
+ // 选中全部
+ selectAll() {
+ this.quill.setSelection(0, this.quill.getLength())
+ }
+
+ // 聚焦
+ focus(start) {
+ const len = this.quill.getLength()
+ this.quill.setSelection(typeof start === 'number' ? start : len, len)
+ }
+
+ // 格式化当前选中的文本
+ formatText(config = {}, clear = false) {
+ if (!this.range && !this.lastRange) return
+ const rangeLost = !this.range
+ const range = rangeLost ? this.lastRange : this.range
+ clear
+ ? this.quill.removeFormat(range.index, range.length)
+ : this.quill.formatText(range.index, range.length, config)
+ if (rangeLost) {
+ this.quill.setSelection(this.lastRange.index, this.lastRange.length)
+ }
+ }
+
+ // 清除当前选中文本的样式
+ removeFormat() {
+ this.formatText({}, true)
+ }
+
+ // 格式化指定范围的文本
+ formatRangeText(range, config = {}) {
+ if (!range) return
+ this.quill.formatText(range.index, range.length, config)
+ }
+
+ // 格式化所有文本
+ formatAllText(config = {}) {
+ this.quill.formatText(0, this.quill.getLength(), config)
+ }
+
+ // 将普通节点样式对象转换成富文本样式对象
+ normalStyleToRichTextStyle(style) {
+ const config = {}
+ Object.keys(style).forEach(prop => {
+ const value = style[prop]
+ switch (prop) {
+ case 'fontFamily':
+ config.font = value
+ break
+ case 'fontSize':
+ config.size = value + 'px'
+ break
+ case 'fontWeight':
+ config.bold = value === 'bold'
+ break
+ case 'fontStyle':
+ config.italic = value === 'italic'
+ break
+ case 'textDecoration':
+ config.underline = value === 'underline'
+ config.strike = value === 'line-through'
+ break
+ case 'color':
+ config.color = value
+ break
+ default:
+ break
+ }
+ })
+ return config
+ }
+
+ // 将富文本样式对象转换成普通节点样式对象
+ richTextStyleToNormalStyle(config) {
+ const data = {}
+ Object.keys(config).forEach(prop => {
+ const value = config[prop]
+ switch (prop) {
+ case 'font':
+ data.fontFamily = value
+ break
+ case 'size':
+ data.fontSize = parseFloat(value)
+ break
+ case 'bold':
+ data.fontWeight = value ? 'bold' : 'normal'
+ break
+ case 'italic':
+ data.fontStyle = value ? 'italic' : 'normal'
+ break
+ case 'underline':
+ data.textDecoration = value ? 'underline' : 'none'
+ break
+ case 'strike':
+ data.textDecoration = value ? 'line-through' : 'none'
+ break
+ case 'color':
+ data.color = value
+ break
+ default:
+ break
+ }
+ })
+ return data
+ }
+
+ // 判断一个对象是否包含了富文本支持的样式字段
+ isHasRichTextStyle(obj) {
+ const keys = Object.keys(obj)
+ for (let i = 0; i < keys.length; i++) {
+ const key = keys[i]
+ if (richTextSupportStyleList.includes(key)) {
+ return true
+ }
+ }
+ return false
+ }
+
+ // 检查指定节点是否存在自定义的富文本样式
+ checkNodeHasCustomRichTextStyle(node) {
+ const nodeData = node instanceof MindMapNode ? node.getData() : node
+ for (let i = 0; i < richTextSupportStyleList.length; i++) {
+ if (nodeData[richTextSupportStyleList[i]] !== undefined) {
+ return true
+ }
+ }
+ return false
+ }
+
+ // 转换数据后的渲染操作
+ afterHandleData() {
+ // 清空历史数据,并且触发数据变化
+ this.mindMap.command.clearHistory()
+ this.mindMap.command.addHistory()
+ this.mindMap.render()
+ }
+
+ // 插件实例化时处理思维导图数据,转换为富文本数据
+ handleDataToRichTextOnInit() {
+ // 处理数据,转成富文本格式
+ if (this.mindMap.renderer.renderTree) {
+ // 如果已经存在渲染树了,那么直接更新渲染树,并且触发重新渲染
+ this.handleSetData(this.mindMap.renderer.renderTree)
+ this.afterHandleData()
+ } else if (this.mindMap.opt.data) {
+ this.handleSetData(this.mindMap.opt.data)
+ }
+ }
+
+ // 将所有节点转换成非富文本节点
+ transformAllNodesToNormalNode() {
+ const renderTree = this.mindMap.renderer.renderTree
+ if (!renderTree) return
+ walk(
+ renderTree,
+ null,
+ node => {
+ if (node.data.richText) {
+ node.data.richText = false
+ node.data.text = getTextFromHtml(node.data.text)
+ }
+ // 概要
+ if (node.data) {
+ const generalizationList = formatGetNodeGeneralization(node.data)
+ generalizationList.forEach(item => {
+ item.richText = false
+ item.text = getTextFromHtml(item.text)
+ })
+ }
+ },
+ null,
+ true,
+ 0,
+ 0
+ )
+ this.afterHandleData()
+ }
+
+ handleDataToRichText(data) {
+ const oldIsRichText = data.richText
+ data.richText = true
+ data.resetRichText = true
+ // 如果原本就是富文本,那么不能转换
+ if (!oldIsRichText) {
+ data.text = htmlEscape(data.text)
+ }
+ }
+
+ // 处理导入数据
+ handleSetData(data) {
+ // 短期处理,为了兼容老数据,长期会去除
+ const isOldRichTextVersion =
+ !data.smmVersion || compareVersion(data.smmVersion, '0.13.0') === '<'
+ const walk = root => {
+ if (root.data && (!root.data.richText || isOldRichTextVersion)) {
+ this.handleDataToRichText(root.data)
+ }
+ // 概要
+ if (root.data) {
+ const generalizationList = formatGetNodeGeneralization(root.data)
+ generalizationList.forEach(item => {
+ if (!item.richText || isOldRichTextVersion) {
+ this.handleDataToRichText(item)
+ }
+ })
+ }
+ if (root.children && root.children.length > 0) {
+ Array.from(root.children).forEach(item => {
+ walk(item)
+ })
+ }
+ }
+ walk(data)
+ return data
+ }
+
+ // 插件被移除前做的事情
+ beforePluginRemove() {
+ this.transformAllNodesToNormalNode()
+ document.head.removeChild(this.styleEl)
+ this.unbindEvent()
+ this.mindMap.removeAppendCss('richText')
+ }
+
+ // 插件被卸载前做的事情
+ beforePluginDestroy() {
+ document.head.removeChild(this.styleEl)
+ this.unbindEvent()
+ }
+}
+
+RichText.instanceName = 'richText'
+
+export default RichText
diff --git a/packages/mindmap/src/plugins/Scrollbar.js b/packages/mindmap/src/plugins/Scrollbar.js
new file mode 100644
index 0000000..7e1c8f3
--- /dev/null
+++ b/packages/mindmap/src/plugins/Scrollbar.js
@@ -0,0 +1,281 @@
+import { throttle } from '../utils/index'
+import { CONSTANTS } from '../constants/constant'
+
+// 滚动条插件
+class Scrollbar {
+ // 构造函数
+ constructor(opt) {
+ this.mindMap = opt.mindMap
+ this.scrollbarWrapSize = {
+ width: 0, // 水平滚动条的容器宽度
+ height: 0 // 垂直滚动条的容器高度
+ }
+ // 思维导图实际高度
+ this.chartHeight = 0
+ this.chartWidth = 0
+ this.reset()
+ this.bindEvent()
+ }
+
+ // 复位数据
+ reset() {
+ // 当前拖拽的滚动条类型
+ this.currentScrollType = ''
+ this.isMousedown = false
+ this.mousedownPos = {
+ x: 0,
+ y: 0
+ }
+ // 鼠标按下时,滚动条位置
+ this.mousedownScrollbarPos = 0
+ }
+
+ // 绑定事件
+ bindEvent() {
+ this.onMousemove = this.onMousemove.bind(this)
+ this.onMouseup = this.onMouseup.bind(this)
+ this.updateScrollbar = this.updateScrollbar.bind(this)
+ this.updateScrollbar = throttle(this.updateScrollbar, 16, this) // 加个节流
+ this.mindMap.on('mousemove', this.onMousemove)
+ this.mindMap.on('mouseup', this.onMouseup)
+ this.mindMap.on('node_tree_render_end', this.updateScrollbar)
+ this.mindMap.on('view_data_change', this.updateScrollbar)
+ this.mindMap.on('resize', this.updateScrollbar)
+ }
+
+ // 解绑事件
+ unBindEvent() {
+ this.mindMap.off('mousemove', this.onMousemove)
+ this.mindMap.off('mouseup', this.onMouseup)
+ this.mindMap.off('node_tree_render_end', this.updateScrollbar)
+ this.mindMap.off('view_data_change', this.updateScrollbar)
+ this.mindMap.off('resize', this.updateScrollbar)
+ }
+
+ // 渲染后、数据改变需要更新滚动条
+ updateScrollbar() {
+ // 当前正在拖拽滚动条时不需要更新
+ if (this.isMousedown) return
+ const res = this.calculationScrollbar()
+ this.emitEvent(res)
+ }
+
+ // 发送滚动条改变事件
+ emitEvent(data) {
+ this.mindMap.emit('scrollbar_change', data)
+ }
+
+ // 设置滚动条容器的大小,指滚动条容器的大小,对于水平滚动条,即宽度,对于垂直滚动条,即高度
+ setScrollBarWrapSize(width, height) {
+ this.scrollbarWrapSize.width = width
+ this.scrollbarWrapSize.height = height
+ }
+
+ // 计算滚动条大小和位置
+ calculationScrollbar() {
+ const rect = this.mindMap.draw.rbox()
+ // 减去画布距离浏览器窗口左上角的距离
+ const elRect = this.mindMap.elRect
+ rect.x -= elRect.left
+ rect.y -= elRect.top
+
+ // 垂直滚动条
+ const canvasHeight = this.mindMap.height // 画布高度
+ const paddingY = canvasHeight / 2 // 首尾允许超出的距离,默认为高度的一半
+ const chartHeight = rect.height + paddingY * 2 // 思维导图高度
+ this.chartHeight = chartHeight
+ const chartTop = rect.y - paddingY // 思维导图顶部距画布顶部的距离
+ const height = Math.min((canvasHeight / chartHeight) * 100, 100) // 滚动条高度 = 画布高度 / 思维导图高度
+ let top = (-chartTop / chartHeight) * 100 // 滚动条距离 = 思维导图顶部距画布顶部的距离 / 思维导图高度
+ // 判断是否到达边界
+ if (top < 0) {
+ top = 0
+ }
+ if (top > 100 - height) {
+ top = 100 - height
+ }
+
+ // 水平滚动条
+ const canvasWidth = this.mindMap.width
+ const paddingX = canvasWidth / 2
+ const chartWidth = rect.width + paddingX * 2
+ this.chartWidth = chartWidth
+ const chartLeft = rect.x - paddingX
+ const width = Math.min((canvasWidth / chartWidth) * 100, 100)
+ let left = (-chartLeft / chartWidth) * 100
+ if (left < 0) {
+ left = 0
+ }
+ if (left > 100 - width) {
+ left = 100 - width
+ }
+
+ const res = {
+ // 垂直滚动条
+ vertical: {
+ top,
+ height
+ },
+ // 水平滚动条
+ horizontal: {
+ left,
+ width
+ }
+ }
+
+ return res
+ }
+
+ // 滚动条鼠标按下事件处理函数
+ onMousedown(e, type) {
+ e.preventDefault()
+ e.stopPropagation()
+ this.currentScrollType = type
+ this.isMousedown = true
+ this.mousedownPos = {
+ x: e.clientX,
+ y: e.clientY
+ }
+ // 保存滚动条当前的位置
+ const styles = window.getComputedStyle(e.target)
+ if (type === CONSTANTS.SCROLL_BAR_DIR.VERTICAL) {
+ this.mousedownScrollbarPos = Number.parseFloat(styles.top)
+ } else {
+ this.mousedownScrollbarPos = Number.parseFloat(styles.left)
+ }
+ }
+
+ // 鼠标移动事件处理函数
+ onMousemove(e) {
+ if (!this.isMousedown) {
+ return
+ }
+ e.preventDefault()
+ e.stopPropagation()
+ if (this.currentScrollType === CONSTANTS.SCROLL_BAR_DIR.VERTICAL) {
+ const oy = e.clientY - this.mousedownPos.y + this.mousedownScrollbarPos
+ this.updateMindMapView(CONSTANTS.SCROLL_BAR_DIR.VERTICAL, oy)
+ } else {
+ const ox = e.clientX - this.mousedownPos.x + this.mousedownScrollbarPos
+ this.updateMindMapView(CONSTANTS.SCROLL_BAR_DIR.HORIZONTAL, ox)
+ }
+ }
+
+ // 鼠标松开事件处理函数
+ onMouseup() {
+ this.isMousedown = false
+ this.reset()
+ }
+
+ // 更新视图
+ updateMindMapView(type, offset) {
+ const scrollbarData = this.calculationScrollbar()
+ const t = this.mindMap.draw.transform()
+ const drawRect = this.mindMap.draw.rbox()
+ const rootRect = this.mindMap.renderer.root.group.rbox()
+ const rootCenterOffset = this.mindMap.renderer.layout.getRootCenterOffset(
+ rootRect.width,
+ rootRect.height
+ )
+ if (type === CONSTANTS.SCROLL_BAR_DIR.VERTICAL) {
+ // 滚动条新位置
+ let oy = offset
+ // 判断是否达到首尾
+ if (oy <= 0) {
+ oy = 0
+ }
+ const max =
+ ((100 - scrollbarData.vertical.height) / 100) *
+ this.scrollbarWrapSize.height
+ if (oy >= max) {
+ oy = max
+ }
+ // 转换成百分比
+ const oyPercentage = (oy / this.scrollbarWrapSize.height) * 100
+ // 转换成相对于图形高度的距离
+ const oyPx = (-oyPercentage / 100) * this.chartHeight
+ // 节点中心点到图形最上方的距离
+ const yOffset = rootRect.y - drawRect.y
+ // 内边距
+ const paddingY = this.mindMap.height / 2
+ // 图形新位置
+ const chartTop =
+ oyPx +
+ yOffset -
+ paddingY * t.scaleY +
+ paddingY -
+ rootCenterOffset.y * t.scaleY +
+ ((this.mindMap.height - this.mindMap.initHeight) / 2) * t.scaleY // 画布宽高改变了,但是思维导图元素变换的中心点依旧是原有位置,所以需要加上中心点变化量
+ this.mindMap.view.translateYTo(chartTop)
+ this.emitEvent({
+ horizontal: scrollbarData.horizontal,
+ vertical: {
+ top: oyPercentage,
+ height: scrollbarData.vertical.height
+ }
+ })
+ } else {
+ // 滚动条新位置
+ let ox = offset
+ // 判断是否达到首尾
+ if (ox <= 0) {
+ ox = 0
+ }
+ const max =
+ ((100 - scrollbarData.horizontal.width) / 100) *
+ this.scrollbarWrapSize.width
+ if (ox >= max) {
+ ox = max
+ }
+ // 转换成百分比
+ const oxPercentage = (ox / this.scrollbarWrapSize.width) * 100
+ // 转换成相对于图形宽度的距离
+ const oxPx = (-oxPercentage / 100) * this.chartWidth
+ // 节点中心点到图形最左边的距离
+ const xOffset = rootRect.x - drawRect.x
+ // 内边距
+ const paddingX = this.mindMap.width / 2
+ // 图形新位置
+ const chartLeft =
+ oxPx +
+ xOffset -
+ paddingX * t.scaleX +
+ paddingX -
+ rootCenterOffset.x * t.scaleX +
+ ((this.mindMap.width - this.mindMap.initWidth) / 2) * t.scaleX // 画布宽高改变了,但是思维导图元素变换的中心点依旧是原有位置,所以需要加上中心点变化量
+ this.mindMap.view.translateXTo(chartLeft)
+ this.emitEvent({
+ vertical: scrollbarData.vertical,
+ horizontal: {
+ left: oxPercentage,
+ width: scrollbarData.horizontal.width
+ }
+ })
+ }
+ }
+
+ // 滚动条的点击事件
+ onClick(e, type) {
+ let offset = 0
+ if (type === CONSTANTS.SCROLL_BAR_DIR.VERTICAL) {
+ offset = e.clientY - e.currentTarget.getBoundingClientRect().top
+ } else {
+ offset = e.clientX - e.currentTarget.getBoundingClientRect().left
+ }
+ this.updateMindMapView(type, offset)
+ }
+
+ // 插件被移除前做的事情
+ beforePluginRemove() {
+ this.unBindEvent()
+ }
+
+ // 插件被卸载前做的事情
+ beforePluginDestroy() {
+ this.unBindEvent()
+ }
+}
+
+Scrollbar.instanceName = 'scrollbar'
+
+export default Scrollbar
diff --git a/packages/mindmap/src/plugins/Search.js b/packages/mindmap/src/plugins/Search.js
new file mode 100644
index 0000000..47de8e9
--- /dev/null
+++ b/packages/mindmap/src/plugins/Search.js
@@ -0,0 +1,321 @@
+import {
+ bfsWalk,
+ getTextFromHtml,
+ isUndef,
+ replaceHtmlText,
+ formatGetNodeGeneralization
+} from '../utils/index'
+import MindMapNode from '../core/render/node/MindMapNode'
+import { CONSTANTS } from '../constants/constant'
+
+// 搜索插件
+class Search {
+ // 构造函数
+ constructor({ mindMap }) {
+ this.mindMap = mindMap
+ // 是否正在搜索
+ this.isSearching = false
+ // 搜索文本
+ this.searchText = ''
+ // 匹配的节点列表
+ this.matchNodeList = []
+ // 当前所在的节点列表索引
+ this.currentIndex = -1
+ // 不要复位搜索文本
+ this.notResetSearchText = false
+ // 是否自动跳转下一个匹配节点
+ this.isJumpNext = false
+
+ this.bindEvent()
+ }
+
+ bindEvent() {
+ this.onDataChange = this.onDataChange.bind(this)
+ this.onModeChange = this.onModeChange.bind(this)
+ this.mindMap.on('data_change', this.onDataChange)
+ this.mindMap.on('mode_change', this.onModeChange)
+ }
+
+ unBindEvent() {
+ this.mindMap.off('data_change', this.onDataChange)
+ this.mindMap.off('mode_change', this.onModeChange)
+ }
+
+ // 节点数据改变了,需要重新搜索
+ onDataChange() {
+ if (this.isJumpNext) {
+ this.isJumpNext = false
+ this.search(this.searchText)
+ return
+ }
+ if (this.notResetSearchText) {
+ this.notResetSearchText = false
+ return
+ }
+ this.searchText = ''
+ }
+
+ // 监听只读模式切换
+ onModeChange(mode) {
+ const isReadonly = mode === CONSTANTS.MODE.READONLY
+ // 如果是由只读模式切换为非只读模式,需要清除只读模式下的节点高亮
+ if (
+ !isReadonly &&
+ this.isSearching &&
+ this.matchNodeList[this.currentIndex]
+ ) {
+ this.matchNodeList[this.currentIndex].closeHighlight()
+ }
+ }
+
+ // 搜索
+ search(text, callback = () => {}) {
+ if (isUndef(text)) return this.endSearch()
+ text = String(text)
+ this.isSearching = true
+ if (this.searchText === text) {
+ // 和上一次搜索文本一样,那么搜索下一个
+ this.searchNext(callback)
+ } else {
+ // 和上次搜索文本不一样,那么重新开始
+ this.searchText = text
+ this.doSearch()
+ this.searchNext(callback)
+ }
+ this.emitEvent()
+ }
+
+ // 更新匹配节点列表
+ updateMatchNodeList(list) {
+ this.matchNodeList = list
+ this.mindMap.emit('search_match_node_list_change', list)
+ }
+
+ // 结束搜索
+ endSearch() {
+ if (!this.isSearching) return
+ if (this.mindMap.opt.readonly && this.matchNodeList[this.currentIndex]) {
+ this.matchNodeList[this.currentIndex].closeHighlight()
+ }
+ this.searchText = ''
+ this.updateMatchNodeList([])
+ this.currentIndex = -1
+ this.notResetSearchText = false
+ this.isSearching = false
+ this.emitEvent()
+ }
+
+ // 搜索匹配的节点
+ doSearch() {
+ this.clearHighlightOnReadonly()
+ this.updateMatchNodeList([])
+ this.currentIndex = -1
+ const { isOnlySearchCurrentRenderNodes } = this.mindMap.opt
+ // 如果要搜索收起来的节点,那么要遍历渲染树而不是节点树
+ const tree = isOnlySearchCurrentRenderNodes
+ ? this.mindMap.renderer.root
+ : this.mindMap.renderer.renderTree
+ if (!tree) return
+ const matchList = []
+ bfsWalk(tree, node => {
+ let { richText, text, generalization } = isOnlySearchCurrentRenderNodes
+ ? node.getData()
+ : node.data
+ if (richText) {
+ text = getTextFromHtml(text)
+ }
+ if (text.includes(this.searchText)) {
+ matchList.push(node)
+ }
+ // 概要节点
+ const generalizationList = formatGetNodeGeneralization({
+ generalization
+ })
+ generalizationList.forEach(gNode => {
+ let { richText, text, uid } = gNode
+ if (
+ isOnlySearchCurrentRenderNodes &&
+ !this.mindMap.renderer.findNodeByUid(uid)
+ ) {
+ return
+ }
+ if (richText) {
+ text = getTextFromHtml(text)
+ }
+ if (text.includes(this.searchText)) {
+ matchList.push({
+ data: gNode
+ })
+ }
+ })
+ })
+ this.updateMatchNodeList(matchList)
+ }
+
+ // 判断对象是否是节点实例
+ isNodeInstance(node) {
+ return node instanceof MindMapNode
+ }
+
+ // 搜索下一个或指定索引,定位到下一个匹配节点
+ searchNext(callback, index) {
+ if (!this.isSearching || this.matchNodeList.length <= 0) return
+ if (
+ index !== undefined &&
+ Number.isInteger(index) &&
+ index >= 0 &&
+ index < this.matchNodeList.length
+ ) {
+ this.currentIndex = index
+ } else {
+ if (this.currentIndex < this.matchNodeList.length - 1) {
+ this.currentIndex++
+ } else {
+ this.currentIndex = 0
+ }
+ }
+ const { readonly } = this.mindMap.opt
+ // 只读模式下需要清除之前节点的高亮
+ this.clearHighlightOnReadonly()
+ const currentNode = this.matchNodeList[this.currentIndex]
+ this.notResetSearchText = true
+ const uid = this.isNodeInstance(currentNode)
+ ? currentNode.getData('uid')
+ : currentNode.data.uid
+ const targetNode = this.mindMap.renderer.findNodeByUid(uid)
+ this.mindMap.execCommand('GO_TARGET_NODE', uid, node => {
+ if (!this.isNodeInstance(currentNode)) {
+ this.matchNodeList[this.currentIndex] = node
+ this.updateMatchNodeList(this.matchNodeList)
+ }
+ callback()
+ // 只读模式下节点无法激活,所以通过高亮的方式
+ if (readonly) {
+ node.highlight()
+ }
+ // 如果当前节点实例已经存在,则不会触发data_change事件,那么需要手动把标志复位
+ if (targetNode) {
+ this.notResetSearchText = false
+ }
+ })
+ }
+
+ // 只读模式下清除现有匹配节点的高亮
+ clearHighlightOnReadonly() {
+ const { readonly } = this.mindMap.opt
+ if (readonly) {
+ this.matchNodeList.forEach(node => {
+ if (this.isNodeInstance(node)) {
+ node.closeHighlight()
+ }
+ })
+ }
+ }
+
+ // 定位到指定搜索结果索引的节点
+ jump(index, callback = () => {}) {
+ this.searchNext(callback, index)
+ }
+
+ // 替换当前节点
+ replace(replaceText, jumpNext = false) {
+ if (
+ replaceText === null ||
+ replaceText === undefined ||
+ !this.isSearching ||
+ this.matchNodeList.length <= 0
+ )
+ return
+ // 自动跳转下一个匹配节点
+ this.isJumpNext = jumpNext
+ replaceText = String(replaceText)
+ let currentNode = this.matchNodeList[this.currentIndex]
+ if (!currentNode) return
+ // 如果当前搜索文本是替换文本的子串,那么该节点还是符合搜索结果的
+ const keep = replaceText.includes(this.searchText)
+ const text = this.getReplacedText(currentNode, this.searchText, replaceText)
+ this.notResetSearchText = true
+ currentNode.setText(text, currentNode.getData('richText'))
+ if (keep) {
+ this.updateMatchNodeList(this.matchNodeList)
+ return
+ }
+ const newList = this.matchNodeList.filter(node => {
+ return currentNode !== node
+ })
+ this.updateMatchNodeList(newList)
+ if (this.currentIndex > this.matchNodeList.length - 1) {
+ this.currentIndex = -1
+ } else {
+ this.currentIndex--
+ }
+ this.emitEvent()
+ }
+
+ // 替换所有
+ replaceAll(replaceText) {
+ if (
+ replaceText === null ||
+ replaceText === undefined ||
+ !this.isSearching ||
+ this.matchNodeList.length <= 0
+ )
+ return
+ replaceText = String(replaceText)
+ // 如果当前搜索文本是替换文本的子串,那么该节点还是符合搜索结果的
+ const keep = replaceText.includes(this.searchText)
+ this.notResetSearchText = true
+ this.matchNodeList.forEach(node => {
+ const text = this.getReplacedText(node, this.searchText, replaceText)
+ if (this.isNodeInstance(node)) {
+ const data = {
+ text
+ }
+ this.mindMap.renderer.setNodeDataRender(node, data, true)
+ } else {
+ node.data.text = text
+ }
+ })
+ this.mindMap.render()
+ this.mindMap.command.addHistory()
+ if (keep) {
+ this.updateMatchNodeList(this.matchNodeList)
+ } else {
+ this.endSearch()
+ }
+ }
+
+ // 获取某个节点替换后的文本
+ getReplacedText(node, searchText, replaceText) {
+ let { richText, text } = this.isNodeInstance(node)
+ ? node.getData()
+ : node.data
+ if (richText) {
+ return replaceHtmlText(text, searchText, replaceText)
+ } else {
+ return text.replaceAll(searchText, replaceText)
+ }
+ }
+
+ // 发送事件
+ emitEvent() {
+ this.mindMap.emit('search_info_change', {
+ currentIndex: this.currentIndex,
+ total: this.matchNodeList.length
+ })
+ }
+
+ // 插件被移除前做的事情
+ beforePluginRemove() {
+ this.unBindEvent()
+ }
+
+ // 插件被卸载前做的事情
+ beforePluginDestroy() {
+ this.unBindEvent()
+ }
+}
+
+Search.instanceName = 'search'
+
+export default Search
diff --git a/packages/mindmap/src/plugins/Select.js b/packages/mindmap/src/plugins/Select.js
new file mode 100644
index 0000000..eaf93f9
--- /dev/null
+++ b/packages/mindmap/src/plugins/Select.js
@@ -0,0 +1,239 @@
+import { bfsWalk, throttle, checkTwoRectIsOverlap } from '../utils'
+import AutoMove from '../utils/AutoMove'
+
+// 节点选择插件
+class Select {
+ // 构造函数
+ constructor({ mindMap }) {
+ this.mindMap = mindMap
+ this.rect = null
+ this.isMousedown = false
+ this.mouseDownX = 0
+ this.mouseDownY = 0
+ this.mouseMoveX = 0
+ this.mouseMoveY = 0
+ this.isSelecting = false
+ this.cacheActiveList = []
+ this.autoMove = new AutoMove(mindMap)
+ this.bindEvent()
+ }
+
+ // 绑定事件
+ bindEvent() {
+ this.onMousedown = this.onMousedown.bind(this)
+ this.onMousemove = this.onMousemove.bind(this)
+ this.onMouseup = this.onMouseup.bind(this)
+ this.checkInNodes = throttle(this.checkInNodes, 300, this)
+
+ this.mindMap.on('mousedown', this.onMousedown)
+ this.mindMap.on('mousemove', this.onMousemove)
+ this.mindMap.on('mouseup', this.onMouseup)
+ this.mindMap.on('node_mouseup', this.onMouseup)
+ }
+
+ // 解绑事件
+ unBindEvent() {
+ this.mindMap.off('mousedown', this.onMousedown)
+ this.mindMap.off('mousemove', this.onMousemove)
+ this.mindMap.off('mouseup', this.onMouseup)
+ this.mindMap.off('node_mouseup', this.onMouseup)
+ }
+
+ // 鼠标按下
+ onMousedown(e) {
+ const { readonly, mousedownEventPreventDefault } = this.mindMap.opt
+ if (readonly) {
+ return
+ }
+ let { useLeftKeySelectionRightKeyDrag } = this.mindMap.opt
+ if (
+ !(e.ctrlKey || e.metaKey) &&
+ (useLeftKeySelectionRightKeyDrag ? e.which !== 1 : e.which !== 3)
+ ) {
+ return
+ }
+ if (mousedownEventPreventDefault) {
+ e.preventDefault()
+ }
+ this.isMousedown = true
+ this.cacheActiveList = [...this.mindMap.renderer.activeNodeList]
+ let { x, y } = this.mindMap.toPos(e.clientX, e.clientY)
+ this.mouseDownX = x
+ this.mouseDownY = y
+ this.createRect(x, y)
+ }
+
+ // 鼠标移动
+ onMousemove(e) {
+ if (this.mindMap.opt.readonly) {
+ return
+ }
+ if (!this.isMousedown) {
+ return
+ }
+ let { x, y } = this.mindMap.toPos(e.clientX, e.clientY)
+ this.mouseMoveX = x
+ this.mouseMoveY = y
+ if (
+ Math.abs(x - this.mouseDownX) <= 10 &&
+ Math.abs(y - this.mouseDownY) <= 10
+ ) {
+ return
+ }
+ this.autoMove.clearAutoMoveTimer()
+ this.autoMove.onMove(
+ e.clientX,
+ e.clientY,
+ () => {
+ this.isSelecting = true
+ // 绘制矩形
+ if (this.rect) {
+ this.rect.plot([
+ [this.mouseDownX, this.mouseDownY],
+ [this.mouseMoveX, this.mouseDownY],
+ [this.mouseMoveX, this.mouseMoveY],
+ [this.mouseDownX, this.mouseMoveY]
+ ])
+ }
+ this.checkInNodes()
+ },
+ (dir, step) => {
+ switch (dir) {
+ case 'left':
+ this.mouseDownX += step
+ break
+ case 'top':
+ this.mouseDownY += step
+ break
+ case 'right':
+ this.mouseDownX -= step
+ break
+ case 'bottom':
+ this.mouseDownY -= step
+ break
+ default:
+ break
+ }
+ }
+ )
+ }
+
+ // 结束框选
+ onMouseup() {
+ if (this.mindMap.opt.readonly) {
+ return
+ }
+ if (!this.isMousedown) {
+ return
+ }
+ this.checkTriggerNodeActiveEvent()
+ this.autoMove.clearAutoMoveTimer()
+ this.isMousedown = false
+ this.cacheActiveList = []
+ if (this.rect) this.rect.remove()
+ this.rect = null
+ setTimeout(() => {
+ this.isSelecting = false
+ }, 0)
+ }
+
+ // 如果激活节点改变了,那么触发事件
+ checkTriggerNodeActiveEvent() {
+ let isNumChange =
+ this.cacheActiveList.length !==
+ this.mindMap.renderer.activeNodeList.length
+ let isNodeChange = false
+ if (!isNumChange) {
+ for (let i = 0; i < this.cacheActiveList.length; i++) {
+ let cur = this.cacheActiveList[i]
+ if (
+ !this.mindMap.renderer.activeNodeList.find(item => {
+ return item.getData('uid') === cur.getData('uid')
+ })
+ ) {
+ isNodeChange = true
+ break
+ }
+ }
+ }
+ if (isNumChange || isNodeChange) {
+ this.mindMap.renderer.emitNodeActiveEvent()
+ }
+ }
+
+ // 创建矩形
+ createRect(x, y) {
+ if (this.rect) this.rect.remove()
+ this.rect = this.mindMap.svg
+ .polygon()
+ .stroke({
+ color: '#0984e3'
+ })
+ .fill({
+ color: 'rgba(9,132,227,0.3)'
+ })
+ .plot([[x, y]])
+ }
+
+ // 检测在选区里的节点
+ checkInNodes() {
+ let { scaleX, scaleY, translateX, translateY } =
+ this.mindMap.draw.transform()
+ let minx = Math.min(this.mouseDownX, this.mouseMoveX)
+ let miny = Math.min(this.mouseDownY, this.mouseMoveY)
+ let maxx = Math.max(this.mouseDownX, this.mouseMoveX)
+ let maxy = Math.max(this.mouseDownY, this.mouseMoveY)
+
+ const check = node => {
+ let { left, top, width, height } = node
+ let right = (left + width) * scaleX + translateX
+ let bottom = (top + height) * scaleY + translateY
+ left = left * scaleX + translateX
+ top = top * scaleY + translateY
+ if (
+ checkTwoRectIsOverlap(minx, maxx, miny, maxy, left, right, top, bottom)
+ ) {
+ if (node.getData('isActive')) {
+ return
+ }
+ this.mindMap.renderer.addNodeToActiveList(node)
+ this.mindMap.renderer.emitNodeActiveEvent()
+ } else if (node.getData('isActive')) {
+ if (!node.getData('isActive')) {
+ return
+ }
+ this.mindMap.renderer.removeNodeFromActiveList(node)
+ this.mindMap.renderer.emitNodeActiveEvent()
+ }
+ }
+
+ bfsWalk(this.mindMap.renderer.root, node => {
+ check(node)
+ // 概要节点
+ if (node._generalizationList && node._generalizationList.length > 0) {
+ node._generalizationList.forEach(item => {
+ check(item.generalizationNode)
+ })
+ }
+ })
+ }
+
+ // 是否存在选区
+ hasSelectRange() {
+ return this.isSelecting
+ }
+
+ // 插件被移除前做的事情
+ beforePluginRemove() {
+ this.unBindEvent()
+ }
+
+ // 插件被卸载前做的事情
+ beforePluginDestroy() {
+ this.unBindEvent()
+ }
+}
+
+Select.instanceName = 'select'
+
+export default Select
diff --git a/packages/mindmap/src/plugins/TouchEvent.js b/packages/mindmap/src/plugins/TouchEvent.js
new file mode 100644
index 0000000..d13569c
--- /dev/null
+++ b/packages/mindmap/src/plugins/TouchEvent.js
@@ -0,0 +1,193 @@
+import { getTwoPointDistance } from '../utils'
+
+// 手势事件支持插件
+class TouchEvent {
+ // 构造函数
+ constructor({ mindMap }) {
+ this.mindMap = mindMap
+ this.touchesNum = 0
+ this.singleTouchstartEvent = null
+ this.clickNum = 0
+ this.touchStartScaleView = null
+ this.lastTouchStartPosition = null
+ this.lastTouchStartDistance = 0
+ this.bindEvent()
+ }
+
+ // 绑定事件
+ bindEvent() {
+ this.onTouchstart = this.onTouchstart.bind(this)
+ this.onTouchmove = this.onTouchmove.bind(this)
+ this.onTouchcancel = this.onTouchcancel.bind(this)
+ this.onTouchend = this.onTouchend.bind(this)
+ window.addEventListener('touchstart', this.onTouchstart, { passive: false })
+ window.addEventListener('touchmove', this.onTouchmove, { passive: false })
+ window.addEventListener('touchcancel', this.onTouchcancel, {
+ passive: false
+ })
+ window.addEventListener('touchend', this.onTouchend, { passive: false })
+ }
+
+ // 解绑事件
+ unBindEvent() {
+ window.removeEventListener('touchstart', this.onTouchstart)
+ window.removeEventListener('touchmove', this.onTouchmove)
+ window.removeEventListener('touchcancel', this.onTouchcancel)
+ window.removeEventListener('touchend', this.onTouchend)
+ }
+
+ // 手指按下事件
+ onTouchstart(e) {
+ this.touchesNum = e.touches.length
+ this.touchStartScaleView = null
+ if (this.touchesNum === 1) {
+ let touch = e.touches[0]
+ if (this.lastTouchStartPosition) {
+ this.lastTouchStartDistance = getTwoPointDistance(
+ this.lastTouchStartPosition.x,
+ this.lastTouchStartPosition.y,
+ touch.clientX,
+ touch.clientY
+ )
+ }
+ this.lastTouchStartPosition = {
+ x: touch.clientX,
+ y: touch.clientY
+ }
+ this.singleTouchstartEvent = touch
+ this.dispatchMouseEvent('mousedown', touch.target, touch)
+ }
+ }
+
+ // 手指移动事件
+ onTouchmove(e) {
+ let len = e.touches.length
+ if (len === 1) {
+ let touch = e.touches[0]
+ this.dispatchMouseEvent('mousemove', touch.target, touch)
+ } else if (len === 2) {
+ let { disableTouchZoom, minTouchZoomScale, maxTouchZoomScale } =
+ this.mindMap.opt
+ if (disableTouchZoom) return
+ minTouchZoomScale =
+ minTouchZoomScale === -1 ? -Infinity : minTouchZoomScale / 100
+ maxTouchZoomScale =
+ maxTouchZoomScale === -1 ? Infinity : maxTouchZoomScale / 100
+ let touch1 = e.touches[0]
+ let touch2 = e.touches[1]
+ let ox = touch1.clientX - touch2.clientX
+ let oy = touch1.clientY - touch2.clientY
+ let distance = Math.sqrt(Math.pow(ox, 2) + Math.pow(oy, 2))
+ // 以两指中心点进行缩放
+ let { x: touch1ClientX, y: touch1ClientY } = this.mindMap.toPos(
+ touch1.clientX,
+ touch1.clientY
+ )
+ let { x: touch2ClientX, y: touch2ClientY } = this.mindMap.toPos(
+ touch2.clientX,
+ touch2.clientY
+ )
+ let cx = (touch1ClientX + touch2ClientX) / 2
+ let cy = (touch1ClientY + touch2ClientY) / 2
+ // 手势缩放,基于最开始的位置进行缩放(基于前一个位置缩放不是线性关系); 缩放同时支持位置拖动
+ const view = this.mindMap.view
+ if (!this.touchStartScaleView) {
+ this.touchStartScaleView = {
+ distance: distance,
+ scale: view.scale,
+ x: view.x,
+ y: view.y,
+ cx: cx,
+ cy: cy
+ }
+ return
+ }
+ const viewBefore = this.touchStartScaleView
+ let scale = viewBefore.scale * (distance / viewBefore.distance)
+ if (Math.abs(distance - viewBefore.distance) <= 10) {
+ scale = viewBefore.scale
+ }
+ scale =
+ scale < minTouchZoomScale
+ ? minTouchZoomScale
+ : scale > maxTouchZoomScale
+ ? maxTouchZoomScale
+ : scale
+ const ratio = 1 - scale / viewBefore.scale
+ view.scale = scale
+ view.x =
+ viewBefore.x +
+ (cx - viewBefore.x) * ratio +
+ (cx - viewBefore.cx) * scale
+ view.y =
+ viewBefore.y +
+ (cy - viewBefore.y) * ratio +
+ (cy - viewBefore.cy) * scale
+ view.transform()
+ this.mindMap.emit('scale', scale)
+ }
+ }
+
+ // 手指取消事件
+ onTouchcancel(e) {}
+
+ // 手指松开事件
+ onTouchend(e) {
+ this.dispatchMouseEvent('mouseup', e.target)
+ if (this.touchesNum === 1) {
+ // 模拟双击事件
+ this.clickNum++
+ setTimeout(() => {
+ this.clickNum = 0
+ this.lastTouchStartPosition = null
+ this.lastTouchStartDistance = 0
+ }, 300)
+ let ev = this.singleTouchstartEvent
+ if (this.clickNum > 1 && this.lastTouchStartDistance <= 5) {
+ this.clickNum = 0
+ this.dispatchMouseEvent('dblclick', ev.target, ev)
+ } else {
+ // 点击事件应该不用模拟
+ // this.dispatchMouseEvent('click', ev.target, ev)
+ }
+ }
+ this.touchesNum = 0
+ this.singleTouchstartEvent = null
+ this.touchStartScaleView = null
+ }
+
+ // 发送鼠标事件
+ dispatchMouseEvent(eventName, target, e) {
+ let opt = {}
+ if (e) {
+ opt = {
+ screenX: e.screenX,
+ screenY: e.screenY,
+ clientX: e.clientX,
+ clientY: e.clientY,
+ which: 1
+ }
+ }
+ let event = new MouseEvent(eventName, {
+ view: document.defaultView,
+ bubbles: true,
+ cancelable: true,
+ ...opt
+ })
+ target.dispatchEvent(event)
+ }
+
+ // 插件被移除前做的事情
+ beforePluginRemove() {
+ this.unBindEvent()
+ }
+
+ // 插件被卸载前做的事情
+ beforePluginDestroy() {
+ this.unBindEvent()
+ }
+}
+
+TouchEvent.instanceName = 'touchEvent'
+
+export default TouchEvent
diff --git a/packages/mindmap/src/plugins/Watermark.ts b/packages/mindmap/src/plugins/Watermark.ts
new file mode 100644
index 0000000..1bfd04f
--- /dev/null
+++ b/packages/mindmap/src/plugins/Watermark.ts
@@ -0,0 +1,210 @@
+import { Text, G } from '@svgdotjs/svg.js'
+import { degToRad, camelCaseToHyphen } from '../utils'
+import merge from 'deepmerge'
+import MindMap from '..'
+
+interface WatermarkOptions {
+ mindMap: MindMap
+}
+
+interface WatermarkConfig {
+ text?: string | number
+ lineSpacing?: number
+ textSpacing?: number
+ angle?: number
+ textStyle?: Record
+ belowNode?: boolean
+ onlyExport?: boolean
+}
+
+interface TextStyle {
+ [key: string]: any
+}
+
+// 水印插件
+class Watermark {
+ static instanceName: string = 'watermark'
+
+ private mindMap: any
+ private lineSpacing: number
+ private textSpacing: number
+ private angle: number
+ private text: string
+ private textStyle: TextStyle
+ private watermarkDraw: G | null
+ private isInExport: boolean
+ private maxLong: number
+
+ constructor(opt: WatermarkOptions = {} as WatermarkOptions) {
+ this.mindMap = opt.mindMap
+ this.lineSpacing = 0
+ this.textSpacing = 0
+ this.angle = 0
+ this.text = ''
+ this.textStyle = {}
+ this.watermarkDraw = null
+ this.isInExport = false
+ this.maxLong = this.getMaxLong()
+ this.updateWatermark(this.mindMap.opt.watermarkConfig || {})
+ this.bindEvent()
+ }
+
+ private getMaxLong(): number {
+ return Math.sqrt(
+ Math.pow(this.mindMap.width, 2) + Math.pow(this.mindMap.height, 2)
+ )
+ }
+
+ private bindEvent(): void {
+ this.onResize = this.onResize.bind(this)
+ this.mindMap.on('resize', this.onResize)
+ }
+
+ private unBindEvent(): void {
+ this.mindMap.off('resize', this.onResize)
+ }
+
+ private onResize(): void {
+ this.maxLong = this.getMaxLong()
+ this.draw()
+ }
+
+ private createContainer(): void {
+ if (this.watermarkDraw) return
+ this.watermarkDraw = new G()
+ .css({
+ pointerEvents: 'none',
+ userSelect: 'none'
+ })
+ .addClass('smm-water-mark-container')
+ this.updateLayer()
+ }
+ private updateLayer(): void {
+ if (!this.watermarkDraw) return
+ const { belowNode } = this.mindMap.opt.watermarkConfig
+ if (belowNode) {
+ this.watermarkDraw.insertBefore(this.mindMap.draw)
+ } else {
+ this.mindMap.svg.add(this.watermarkDraw)
+ }
+ }
+
+ private removeContainer(): void {
+ if (!this.watermarkDraw) {
+ return
+ }
+ this.watermarkDraw.remove()
+ this.watermarkDraw = null
+ }
+
+ private hasWatermark(): boolean {
+ return !!this.text.trim()
+ }
+
+ private handleConfig({ text, lineSpacing, textSpacing, angle, textStyle }: WatermarkConfig): void {
+ this.text = text === undefined ? '' : String(text).trim()
+ this.lineSpacing =
+ typeof lineSpacing === 'number' && lineSpacing > 0 ? lineSpacing : 100
+ this.textSpacing =
+ typeof textSpacing === 'number' && textSpacing > 0 ? textSpacing : 100
+ this.angle =
+ typeof angle === 'number' && angle >= 0 && angle <= 90 ? angle : 30
+ this.textStyle = Object.assign(this.textStyle, textStyle || {})
+ }
+
+ private clear(): void {
+ if (this.watermarkDraw) this.watermarkDraw.clear()
+ }
+
+ private draw(): void {
+ this.clear()
+ const { onlyExport } = this.mindMap.opt.watermarkConfig
+ if (onlyExport && !this.isInExport) return
+ if (!this.hasWatermark()) {
+ this.removeContainer()
+ return
+ }
+ this.createContainer()
+ let x = 0
+ while (x < this.mindMap.width) {
+ this.drawText(x)
+ x += this.lineSpacing / Math.sin(degToRad(this.angle))
+ }
+
+ let yOffset =
+ this.lineSpacing / Math.cos(degToRad(this.angle)) || this.lineSpacing
+ let y = yOffset
+ while (y < this.mindMap.height) {
+ this.drawText(0, y)
+ y += yOffset
+ }
+ }
+
+ private drawText(x: number, y?: number): void {
+ let long = Math.min(
+ this.maxLong,
+ (this.mindMap.width - x) / Math.cos(degToRad(this.angle))
+ )
+ let g = new G()
+ let bbox = null
+ let bboxWidth = 0
+ let textHeight = -1
+ while (bboxWidth < long) {
+ let text = new Text().text(this.text)
+ g.add(text)
+ text.transform({
+ translateX: bboxWidth
+ })
+ this.setTextStyle(text)
+ bbox = g.bbox()
+ if (textHeight === -1) {
+ textHeight = bbox.height
+ }
+ bboxWidth = bbox.width + this.textSpacing
+ }
+ let params = {
+ rotate: this.angle,
+ origin: 'top left',
+ translateX: x,
+ translateY: textHeight
+ }
+ if (y !== undefined) {
+ params.translateY = y + textHeight
+ }
+ g.transform(params)
+ this.watermarkDraw?.add(g)
+ }
+
+ private setTextStyle(text: Text): void {
+ Object.keys(this.textStyle).forEach(item => {
+ let value = this.textStyle[item]
+ if (item === 'color') {
+ text.fill(value)
+ } else {
+ text.css(camelCaseToHyphen(item) as CSSStyleName, value)
+ }
+ })
+ }
+
+ public updateWatermark(config: WatermarkConfig): void {
+ this.mindMap.opt.watermarkConfig = merge(
+ this.mindMap.opt.watermarkConfig,
+ config
+ )
+ this.updateLayer()
+ this.handleConfig(config)
+ this.draw()
+ }
+
+ public beforePluginRemove(): void {
+ this.unBindEvent()
+ this.removeContainer()
+ }
+
+ public beforePluginDestroy(): void {
+ this.unBindEvent()
+ this.removeContainer()
+ }
+}
+
+export default Watermark
\ No newline at end of file
diff --git a/packages/mindmap/src/plugins/associativeLine/associativeLineControls.js b/packages/mindmap/src/plugins/associativeLine/associativeLineControls.js
new file mode 100644
index 0000000..bd380f7
--- /dev/null
+++ b/packages/mindmap/src/plugins/associativeLine/associativeLineControls.js
@@ -0,0 +1,294 @@
+import {
+ getAssociativeLineTargetIndex,
+ joinCubicBezierPath,
+ getNodePoint,
+ getDefaultControlPointOffsets
+} from './associativeLineUtils'
+
+// 创建控制点、连线节点
+function createControlNodes(node, toNode) {
+ let { associativeLineActiveColor } = this.getStyleConfig(node, toNode)
+ // 连线
+ this.controlLine1 = this.associativeLineDraw
+ .line()
+ .stroke({ color: associativeLineActiveColor, width: 2 })
+ this.controlLine2 = this.associativeLineDraw
+ .line()
+ .stroke({ color: associativeLineActiveColor, width: 2 })
+ // 控制点
+ this.controlPoint1 = this.createOneControlNode('controlPoint1', node, toNode)
+ this.controlPoint2 = this.createOneControlNode('controlPoint2', node, toNode)
+}
+
+// 创建控制点
+function createOneControlNode(pointKey, node, toNode) {
+ let { associativeLineActiveColor } = this.getStyleConfig(node, toNode)
+ return this.associativeLineDraw
+ .circle(this.controlPointDiameter)
+ .stroke({ color: associativeLineActiveColor })
+ .fill({ color: '#fff' })
+ .click(e => {
+ e.stopPropagation()
+ })
+ .mousedown(e => {
+ this.onControlPointMousedown(e, pointKey)
+ })
+}
+
+// 控制点的鼠标按下事件
+function onControlPointMousedown(e, pointKey) {
+ e.stopPropagation()
+ e.preventDefault()
+ this.isControlPointMousedown = true
+ this.mousedownControlPointKey = pointKey
+}
+
+// 控制点的鼠标移动事件
+function onControlPointMousemove(e) {
+ if (
+ !this.isControlPointMousedown ||
+ !this.mousedownControlPointKey ||
+ !this[this.mousedownControlPointKey]
+ )
+ return
+ e.stopPropagation()
+ e.preventDefault()
+ let radius = this.controlPointDiameter / 2
+ // 转换鼠标当前的位置
+ let { x, y } = this.getTransformedEventPos(e)
+ this.controlPointMousemoveState.pos = {
+ x,
+ y
+ }
+ // 更新当前拖拽的控制点的位置
+ this[this.mousedownControlPointKey].x(x - radius).y(y - radius)
+ let [, , , node, toNode] = this.activeLine
+ let targetIndex = getAssociativeLineTargetIndex(node, toNode)
+ let { associativeLinePoint, associativeLineTargetControlOffsets } =
+ node.getData()
+ associativeLinePoint = associativeLinePoint || []
+ const nodePos = this.getNodePos(node)
+ const toNodePos = this.getNodePos(toNode)
+ let [startPoint, endPoint] = this.updateAllLinesPos(
+ node,
+ toNode,
+ associativeLinePoint[targetIndex]
+ )
+ this.controlPointMousemoveState.startPoint = startPoint
+ this.controlPointMousemoveState.endPoint = endPoint
+ this.controlPointMousemoveState.targetIndex = targetIndex
+ let offsets = []
+ if (!associativeLineTargetControlOffsets) {
+ // 兼容0.4.5版本,没有associativeLineTargetControlOffsets的情况
+ offsets = getDefaultControlPointOffsets(startPoint, endPoint)
+ } else {
+ offsets = associativeLineTargetControlOffsets[targetIndex]
+ }
+ let point1 = null
+ let point2 = null
+ const { x: clientX, y: clientY } = this.mindMap.toPos(e.clientX, e.clientY)
+ const _e = {
+ clientX,
+ clientY
+ }
+ // 拖拽的是控制点1
+ if (this.mousedownControlPointKey === 'controlPoint1') {
+ startPoint = getNodePoint(nodePos, '', 0, _e)
+ point1 = {
+ x,
+ y
+ }
+ point2 = {
+ x: endPoint.x + offsets[1].x,
+ y: endPoint.y + offsets[1].y
+ }
+ if (startPoint) {
+ // 保存更新后的坐标
+ this.controlPointMousemoveState.startPoint = startPoint
+ // 更新控制点1的连线
+ this.controlLine1.plot(startPoint.x, startPoint.y, point1.x, point1.y)
+ }
+ } else {
+ // 拖拽的是控制点2
+ endPoint = getNodePoint(toNodePos, '', 0, _e)
+ point1 = {
+ x: startPoint.x + offsets[0].x,
+ y: startPoint.y + offsets[0].y
+ }
+ point2 = {
+ x,
+ y
+ }
+ if (endPoint) {
+ // 保存更新后结束节点的坐标
+ this.controlPointMousemoveState.endPoint = endPoint
+ // 更新控制点2的连线
+ this.controlLine2.plot(endPoint.x, endPoint.y, point2.x, point2.y)
+ }
+ }
+ this.updataAassociativeLine(
+ startPoint,
+ endPoint,
+ point1,
+ point2,
+ this.activeLine
+ )
+}
+
+function updataAassociativeLine(
+ startPoint,
+ endPoint,
+ point1,
+ point2,
+ activeLine
+) {
+ const [path, clickPath, text] = activeLine
+ // 更新关联线
+ const pathStr = joinCubicBezierPath(startPoint, endPoint, point1, point2)
+ path.plot(pathStr)
+ clickPath.plot(pathStr)
+ this.updateTextPos(path, text)
+ this.updateTextEditBoxPos(text)
+}
+
+// 控制点的鼠标松开事件
+function onControlPointMouseup(e) {
+ if (!this.isControlPointMousedown) return
+ e.stopPropagation()
+ e.preventDefault()
+ let { pos, startPoint, endPoint, targetIndex } =
+ this.controlPointMousemoveState
+ let [, , , node] = this.activeLine
+ let offsetList = []
+ let { associativeLinePoint, associativeLineTargetControlOffsets } =
+ node.getData()
+ if (!associativeLinePoint) {
+ associativeLinePoint = []
+ }
+ associativeLinePoint[targetIndex] = associativeLinePoint[targetIndex] || {
+ startPoint,
+ endPoint
+ }
+ if (!associativeLineTargetControlOffsets) {
+ // 兼容0.4.5版本,没有associativeLineTargetControlOffsets的情况
+ offsetList[targetIndex] = getDefaultControlPointOffsets(
+ startPoint,
+ endPoint
+ )
+ } else {
+ offsetList = associativeLineTargetControlOffsets
+ }
+ let offset1 = null
+ let offset2 = null
+ if (this.mousedownControlPointKey === 'controlPoint1') {
+ // 更新控制点1数据
+ offset1 = {
+ x: pos.x - startPoint.x,
+ y: pos.y - startPoint.y
+ }
+ offset2 = offsetList[targetIndex][1]
+ associativeLinePoint[targetIndex].startPoint = startPoint
+ } else {
+ // 更新控制点2数据
+ offset1 = offsetList[targetIndex][0]
+ offset2 = {
+ x: pos.x - endPoint.x,
+ y: pos.y - endPoint.y
+ }
+ associativeLinePoint[targetIndex].endPoint = endPoint
+ }
+ offsetList[targetIndex] = [offset1, offset2]
+ this.mindMap.execCommand('SET_NODE_DATA', node, {
+ associativeLineTargetControlOffsets: offsetList,
+ associativeLinePoint
+ })
+ this.isNotRenderAllLines = true
+ // 这里要加个setTimeout0是因为draw_click事件比mouseup事件触发的晚,所以重置isControlPointMousedown需要等draw_click事件触发完以后
+ setTimeout(() => {
+ this.resetControlPoint()
+ }, 0)
+}
+
+// 复位控制点移动
+function resetControlPoint() {
+ this.isControlPointMousedown = false
+ this.mousedownControlPointKey = ''
+ this.controlPointMousemoveState = {
+ pos: null,
+ startPoint: null,
+ endPoint: null,
+ targetIndex: ''
+ }
+}
+
+// 渲染控制点
+function renderControls(startPoint, endPoint, point1, point2, node, toNode) {
+ if (!this.mindMap.opt.enableAdjustAssociativeLinePoints) return
+ if (!this.controlLine1) {
+ this.createControlNodes(node, toNode)
+ }
+ let radius = this.controlPointDiameter / 2
+ // 控制点和起终点的连线
+ this.controlLine1.plot(startPoint.x, startPoint.y, point1.x, point1.y)
+ this.controlLine2.plot(endPoint.x, endPoint.y, point2.x, point2.y)
+ // 控制点
+ this.controlPoint1.x(point1.x - radius).y(point1.y - radius)
+ this.controlPoint2.x(point2.x - radius).y(point2.y - radius)
+}
+
+// 删除控制点
+function removeControls() {
+ if (!this.controlLine1) return
+ ;[
+ this.controlLine1,
+ this.controlLine2,
+ this.controlPoint1,
+ this.controlPoint2
+ ].forEach(item => {
+ item.remove()
+ })
+ this.controlLine1 = null
+ this.controlLine2 = null
+ this.controlPoint1 = null
+ this.controlPoint2 = null
+}
+
+// 隐藏控制点
+function hideControls() {
+ if (!this.controlLine1) return
+ ;[
+ this.controlLine1,
+ this.controlLine2,
+ this.controlPoint1,
+ this.controlPoint2
+ ].forEach(item => {
+ item.hide()
+ })
+}
+
+// 显示控制点
+function showControls() {
+ if (!this.controlLine1) return
+ ;[
+ this.controlLine1,
+ this.controlLine2,
+ this.controlPoint1,
+ this.controlPoint2
+ ].forEach(item => {
+ item.show()
+ })
+}
+
+export default {
+ createControlNodes,
+ createOneControlNode,
+ onControlPointMousedown,
+ onControlPointMousemove,
+ onControlPointMouseup,
+ resetControlPoint,
+ renderControls,
+ removeControls,
+ hideControls,
+ showControls,
+ updataAassociativeLine
+}
diff --git a/packages/mindmap/src/plugins/associativeLine/associativeLineText.js b/packages/mindmap/src/plugins/associativeLine/associativeLineText.js
new file mode 100644
index 0000000..a2147d1
--- /dev/null
+++ b/packages/mindmap/src/plugins/associativeLine/associativeLineText.js
@@ -0,0 +1,200 @@
+import { Text } from '@svgdotjs/svg.js'
+import {
+ getStrWithBrFromHtml,
+ focusInput,
+ selectAllInput
+} from '../../utils/index'
+
+// 创建文字节点
+function createText(data) {
+ let g = this.associativeLineDraw.group()
+ const setActive = () => {
+ if (
+ !this.activeLine ||
+ this.activeLine[3] !== data.node ||
+ this.activeLine[4] !== data.toNode
+ ) {
+ this.setActiveLine({
+ ...data,
+ text: g
+ })
+ }
+ }
+ g.click(e => {
+ e.stopPropagation()
+ setActive()
+ })
+ g.on('dblclick', e => {
+ e.stopPropagation()
+ setActive()
+ if (!this.activeLine) return
+ this.showEditTextBox(g)
+ })
+ return g
+}
+
+// 显示文本编辑框
+function showEditTextBox(g) {
+ this.mindMap.emit('before_show_text_edit')
+ // 注册回车快捷键
+ this.mindMap.keyCommand.addShortcut('Enter', () => {
+ this.hideEditTextBox()
+ })
+ // 输入框元素没有创建过,则先创建
+ if (!this.textEditNode) {
+ this.textEditNode = document.createElement('div')
+ this.textEditNode.className = 'associative-line-text-edit-warp'
+ this.textEditNode.style.cssText = `position:fixed;box-sizing: border-box;background-color:#fff;box-shadow: 0 0 20px rgba(0,0,0,.5);padding: 3px 5px;margin-left: -5px;margin-top: -3px;outline: none; word-break: break-all;`
+ this.textEditNode.setAttribute('contenteditable', true)
+ this.textEditNode.addEventListener('keyup', e => {
+ e.stopPropagation()
+ })
+ this.textEditNode.addEventListener('click', e => {
+ e.stopPropagation()
+ })
+ const targetNode = this.mindMap.opt.customInnerElsAppendTo || document.body
+ targetNode.appendChild(this.textEditNode)
+ }
+ let [, , , node, toNode] = this.activeLine
+ let {
+ associativeLineTextFontSize,
+ associativeLineTextFontFamily,
+ associativeLineTextLineHeight
+ } = this.getStyleConfig(node, toNode)
+ let { defaultAssociativeLineText, nodeTextEditZIndex } = this.mindMap.opt
+ let scale = this.mindMap.view.scale
+ let text = this.getText(node, toNode)
+ let textLines = (text || defaultAssociativeLineText).split(/\n/gim)
+ this.textEditNode.style.fontFamily = associativeLineTextFontFamily
+ this.textEditNode.style.fontSize = associativeLineTextFontSize * scale + 'px'
+ this.textEditNode.style.lineHeight =
+ textLines.length > 1 ? associativeLineTextLineHeight : 'normal'
+ this.textEditNode.style.zIndex = nodeTextEditZIndex
+ this.textEditNode.innerHTML = textLines.join('
')
+ this.textEditNode.style.display = 'block'
+ this.updateTextEditBoxPos(g)
+ this.showTextEdit = true
+ // 如果是默认文本要全选输入框
+ if (text === '' || text === defaultAssociativeLineText) {
+ selectAllInput(this.textEditNode)
+ } else {
+ // 否则聚焦即可
+ focusInput(this.textEditNode)
+ }
+}
+
+// 删除文本编辑框元素
+function removeTextEditEl() {
+ if (!this.textEditNode) return
+ const targetNode = this.mindMap.opt.customInnerElsAppendTo || document.body
+ targetNode.removeChild(this.textEditNode)
+}
+
+// 处理画布缩放
+function onScale() {
+ this.hideEditTextBox()
+}
+
+// 更新文本编辑框位置
+function updateTextEditBoxPos(g) {
+ let rect = g.node.getBoundingClientRect()
+ if (this.textEditNode) {
+ this.textEditNode.style.minWidth = `${rect.width + 10}px`
+ this.textEditNode.style.minHeight = `${rect.height + 6}px`
+ this.textEditNode.style.left = `${rect.left}px`
+ this.textEditNode.style.top = `${rect.top}px`
+ }
+}
+
+// 隐藏文本编辑框
+function hideEditTextBox() {
+ if (!this.showTextEdit) {
+ return
+ }
+ let [path, , text, node, toNode] = this.activeLine
+ let str = getStrWithBrFromHtml(this.textEditNode.innerHTML)
+ // 如果是默认文本,那么不保存
+ let isDefaultText = str === this.mindMap.opt.defaultAssociativeLineText
+ str = isDefaultText ? '' : str
+ this.mindMap.execCommand('SET_NODE_DATA', node, {
+ associativeLineText: {
+ ...(node.getData('associativeLineText') || {}),
+ [toNode.getData('uid')]: str
+ }
+ })
+ this.textEditNode.style.display = 'none'
+ this.textEditNode.innerHTML = ''
+ this.showTextEdit = false
+ this.renderText(str, path, text, node, toNode)
+ this.mindMap.emit('hide_text_edit')
+}
+
+// 获取某根关联线的文字
+function getText(node, toNode) {
+ let obj = node.getData('associativeLineText')
+ if (!obj) {
+ return ''
+ }
+ return obj[toNode.getData('uid')] || ''
+}
+
+// 渲染关联线文字
+function renderText(str, path, text, node, toNode) {
+ if (!str) return
+ let { associativeLineTextFontSize, associativeLineTextLineHeight } =
+ this.getStyleConfig(node, toNode)
+ text.clear()
+ let textArr = str.replace(/\n$/g, '').split(/\n/gim)
+ textArr.forEach((item, index) => {
+ // 避免尾部的空行不占宽度,导致文本编辑框定位异常的问题
+ if (item === '') {
+ item = ''
+ }
+ let textNode = new Text().text(item)
+ textNode.y(
+ associativeLineTextFontSize * associativeLineTextLineHeight * index
+ )
+ this.styleText(textNode, node, toNode)
+ text.add(textNode)
+ })
+ updateTextPos(path, text)
+}
+
+// 给文本设置样式
+function styleText(textNode, node, toNode) {
+ let {
+ associativeLineTextColor,
+ associativeLineTextFontSize,
+ associativeLineTextFontFamily
+ } = this.getStyleConfig(node, toNode)
+ textNode
+ .fill({
+ color: associativeLineTextColor
+ })
+ .css({
+ 'font-family': associativeLineTextFontFamily,
+ 'font-size': associativeLineTextFontSize + 'px'
+ })
+}
+
+// 更新关联线文字位置
+function updateTextPos(path, text) {
+ let pathLength = path.length()
+ let centerPoint = path.pointAt(pathLength / 2)
+ let { width: textWidth, height: textHeight } = text.bbox()
+ text.x(centerPoint.x - textWidth / 2)
+ text.y(centerPoint.y - textHeight / 2)
+}
+
+export default {
+ getText,
+ createText,
+ styleText,
+ onScale,
+ showEditTextBox,
+ removeTextEditEl,
+ hideEditTextBox,
+ updateTextEditBoxPos,
+ renderText,
+ updateTextPos
+}
diff --git a/packages/mindmap/src/plugins/associativeLine/associativeLineUtils.js b/packages/mindmap/src/plugins/associativeLine/associativeLineUtils.js
new file mode 100644
index 0000000..b1626b3
--- /dev/null
+++ b/packages/mindmap/src/plugins/associativeLine/associativeLineUtils.js
@@ -0,0 +1,336 @@
+import { getRectRelativePosition } from '../../utils/index'
+
+// 获取目标节点在起始节点的目标数组中的索引
+export const getAssociativeLineTargetIndex = (node, toNode) => {
+ return node.getData('associativeLineTargets').findIndex(item => {
+ return item === toNode.getData('uid')
+ })
+}
+
+// 计算贝塞尔曲线的控制点
+export const computeCubicBezierPathPoints = (x1, y1, x2, y2) => {
+ const min = 5
+ let cx1 = x1 + (x2 - x1) / 2
+ let cy1 = y1
+ let cx2 = cx1
+ let cy2 = y2
+ if (Math.abs(x1 - x2) <= min) {
+ cx1 = x1 + (y2 - y1) / 2
+ cx2 = cx1
+ }
+ if (Math.abs(y1 - y2) <= min) {
+ cx1 = x1
+ cy1 = y1 - (x2 - x1) / 2
+ cx2 = x2
+ cy2 = cy1
+ }
+ return [
+ {
+ x: cx1,
+ y: cy1
+ },
+ {
+ x: cx2,
+ y: cy2
+ }
+ ]
+}
+
+// 拼接贝塞尔曲线路径
+export const joinCubicBezierPath = (startPoint, endPoint, point1, point2) => {
+ return `M ${startPoint.x},${startPoint.y} C ${point1.x},${point1.y} ${point2.x},${point2.y} ${endPoint.x},${endPoint.y}`
+}
+
+// 获取节点的位置信息
+const getNodeRect = node => {
+ let { left, top, width, height } = node
+ return {
+ right: left + width,
+ bottom: top + height,
+ left,
+ top,
+ width,
+ height
+ }
+}
+
+// 三次贝塞尔曲线
+export const cubicBezierPath = (x1, y1, x2, y2) => {
+ let points = computeCubicBezierPathPoints(x1, y1, x2, y2)
+ return joinCubicBezierPath(
+ { x: x1, y: y1 },
+ { x: x2, y: y2 },
+ points[0],
+ points[1]
+ )
+}
+
+export const calcPoint = (node, e) => {
+ const { left, top, translateLeft, translateTop, width, height } = node
+ const clientX = e.clientX
+ const clientY = e.clientY
+ // 中心点的坐标
+ const centerX = translateLeft + width / 2
+ const centerY = translateTop + height / 2
+ const translateCenterX = left + width / 2
+ const translateCenterY = top + height / 2
+ const theta = Math.atan(height / width)
+ // 矩形左上角坐标
+ const deltaX = clientX - centerX
+ const deltaY = centerY - clientY
+ // 方向值
+ const direction = Math.atan2(deltaY, deltaX)
+ // 默认坐标
+ let x = left + width
+ let y = top + height
+ if (direction < theta && direction >= -theta) {
+ // 右边
+ // 正切值 = 对边/邻边,对边 = 正切值*邻边
+ const range = direction * (width / 2)
+ if (direction < theta && direction >= 0) {
+ // 中心点上边
+ y = translateCenterY - range
+ } else if (direction >= -theta && direction < 0) {
+ // 中心点下方
+ y = translateCenterY - range
+ }
+ return {
+ x,
+ y,
+ dir: 'right',
+ range
+ }
+ } else if (direction >= theta && direction < Math.PI - theta) {
+ // 上边
+ y = top
+ let range = 0
+ if (direction < Math.PI / 2 - theta && direction >= theta) {
+ // 正切值 = 对边/邻边,邻边 = 对边/正切值
+ const side = height / 2 / direction
+ range = -side
+ // 中心点右侧
+ x = translateCenterX + side
+ } else if (
+ direction >= Math.PI / 2 - theta &&
+ direction < Math.PI - theta
+ ) {
+ // 中心点左侧
+ const tanValue = (centerX - clientX) / (centerY - clientY)
+ const side = (height / 2) * tanValue
+ range = side
+ x = translateCenterX - side
+ }
+ return {
+ x,
+ y,
+ dir: 'top',
+ range
+ }
+ } else if (direction < -theta && direction >= theta - Math.PI) {
+ // 下边
+ let range = 0
+ if (direction >= theta - Math.PI / 2 && direction < -theta) {
+ // 中心点右侧
+ // 正切值 = 对边/邻边,邻边 = 对边/正切值
+ const side = height / 2 / direction
+ range = side
+ x = translateCenterX - side
+ } else if (
+ direction < theta - Math.PI / 2 &&
+ direction >= theta - Math.PI
+ ) {
+ // 中心点左侧
+ const tanValue = (centerX - clientX) / (centerY - clientY)
+ const side = (height / 2) * tanValue
+ range = -side
+ x = translateCenterX + side
+ }
+ return {
+ x,
+ y,
+ dir: 'bottom',
+ range
+ }
+ }
+ // 左边
+ x = left
+ const tanValue = (centerY - clientY) / (centerX - clientX)
+ const range = tanValue * (width / 2)
+ if (direction >= -Math.PI && direction < theta - Math.PI) {
+ // 中心点右侧
+ y = translateCenterY - range
+ } else if (direction < Math.PI && direction >= Math.PI - theta) {
+ // 中心点左侧
+ y = translateCenterY - range
+ }
+ return {
+ x,
+ y,
+ dir: 'left',
+ range
+ }
+}
+// 获取节点的连接点
+export const getNodePoint = (node, dir = 'right', range = 0, e = null) => {
+ let { left, top, width, height } = node
+ if (e) {
+ return calcPoint(node, e)
+ }
+ switch (dir) {
+ case 'left':
+ return {
+ x: left,
+ y: top + height / 2 - range,
+ dir
+ }
+ case 'right':
+ return {
+ x: left + width,
+ y: top + height / 2 - range,
+ dir
+ }
+ case 'top':
+ return {
+ x: left + width / 2 - range,
+ y: top,
+ dir
+ }
+ case 'bottom':
+ return {
+ x: left + width / 2 - range,
+ y: top + height,
+ dir
+ }
+ default:
+ break
+ }
+}
+
+// 根据两个节点的位置计算节点的连接点
+export const computeNodePoints = (fromNode, toNode) => {
+ const fromRect = getNodeRect(fromNode)
+ const toRect = getNodeRect(toNode)
+ let fromDir = ''
+ let toDir = ''
+ const dir = getRectRelativePosition(
+ {
+ x: fromRect.left,
+ y: fromRect.top,
+ width: fromRect.width,
+ height: fromRect.height
+ },
+ {
+ x: toRect.left,
+ y: toRect.top,
+ width: toRect.width,
+ height: toRect.height
+ }
+ )
+ // 起始矩形在结束矩形的什么方向
+ switch (dir) {
+ case 'left-top':
+ fromDir = 'right'
+ toDir = 'top'
+ break
+ case 'right-top':
+ fromDir = 'left'
+ toDir = 'top'
+ break
+ case 'right-bottom':
+ fromDir = 'left'
+ toDir = 'bottom'
+ break
+ case 'left-bottom':
+ fromDir = 'right'
+ toDir = 'bottom'
+ break
+ case 'left':
+ fromDir = 'right'
+ toDir = 'left'
+ break
+ case 'right':
+ fromDir = 'left'
+ toDir = 'right'
+ break
+ case 'top':
+ fromDir = 'right'
+ toDir = 'right'
+ break
+ case 'bottom':
+ fromDir = 'left'
+ toDir = 'left'
+ break
+ case 'overlap':
+ fromDir = 'right'
+ toDir = 'right'
+ break
+ default:
+ break
+ }
+ return [getNodePoint(fromNode, fromDir), getNodePoint(toNode, toDir)]
+}
+
+// 获取节点的关联线路径
+export const getNodeLinePath = (startPoint, endPoint, node, toNode) => {
+ let targetIndex = getAssociativeLineTargetIndex(node, toNode)
+ // 控制点
+ let controlPoints = []
+ let associativeLineTargetControlOffsets = node.getData(
+ 'associativeLineTargetControlOffsets'
+ )
+ if (
+ associativeLineTargetControlOffsets &&
+ associativeLineTargetControlOffsets[targetIndex]
+ ) {
+ // 节点保存了控制点差值
+ let offsets = associativeLineTargetControlOffsets[targetIndex]
+ controlPoints = [
+ {
+ x: startPoint.x + offsets[0].x,
+ y: startPoint.y + offsets[0].y
+ },
+ {
+ x: endPoint.x + offsets[1].x,
+ y: endPoint.y + offsets[1].y
+ }
+ ]
+ } else {
+ // 没有保存控制点则生成默认的
+ controlPoints = computeCubicBezierPathPoints(
+ startPoint.x,
+ startPoint.y,
+ endPoint.x,
+ endPoint.y
+ )
+ }
+ // 根据控制点拼接贝塞尔曲线路径
+ return {
+ path: joinCubicBezierPath(
+ startPoint,
+ endPoint,
+ controlPoints[0],
+ controlPoints[1]
+ ),
+ controlPoints
+ }
+}
+
+// 获取默认的控制点差值
+export const getDefaultControlPointOffsets = (startPoint, endPoint) => {
+ let controlPoints = computeCubicBezierPathPoints(
+ startPoint.x,
+ startPoint.y,
+ endPoint.x,
+ endPoint.y
+ )
+ return [
+ {
+ x: controlPoints[0].x - startPoint.x,
+ y: controlPoints[0].y - startPoint.y
+ },
+ {
+ x: controlPoints[1].x - endPoint.x,
+ y: controlPoints[1].y - endPoint.y
+ }
+ ]
+}
diff --git a/packages/mindmap/src/svg/btns.ts b/packages/mindmap/src/svg/btns.ts
new file mode 100644
index 0000000..a4b67ed
--- /dev/null
+++ b/packages/mindmap/src/svg/btns.ts
@@ -0,0 +1,18 @@
+// 展开按钮
+const open = ``
+
+// 收缩按钮
+const close = ``
+
+// 删除按钮
+const remove = ``
+
+// 图片调整按钮
+const imgAdjust = ``
+
+export default {
+ open,
+ close,
+ remove,
+ imgAdjust
+}
diff --git a/packages/mindmap/src/svg/icons.ts b/packages/mindmap/src/svg/icons.ts
new file mode 100644
index 0000000..fa7cd94
--- /dev/null
+++ b/packages/mindmap/src/svg/icons.ts
@@ -0,0 +1,322 @@
+import { mergerIconList } from '../utils'
+interface IconItem {
+ name: string;
+ icon: string;
+}
+
+interface IconGroup {
+ type: string;
+ list: IconItem[];
+}
+// 超链接图标
+const hyperlink =
+ ''
+
+// 备注图标
+const note =
+ ''
+
+// 附件图标
+const attachment =
+ ''
+
+// 节点icon
+export const nodeIconList = [
+ {
+ name: '优先级图标',
+ type: 'priority',
+ list: [
+ {
+ name: '1',
+ icon: ``
+ },
+ {
+ name: '2',
+ icon: ``
+ },
+ {
+ name: '3',
+ icon: ``
+ },
+ {
+ name: '4',
+ icon: ``
+ },
+ {
+ name: '5',
+ icon: ``
+ },
+ {
+ name: '6',
+ icon: ``
+ },
+ {
+ name: '7',
+ icon: ``
+ },
+ {
+ name: '8',
+ icon: ``
+ },
+ {
+ name: '9',
+ icon: ``
+ },
+ {
+ name: '10',
+ icon: ``
+ }
+ ]
+ },
+ {
+ name: '进度图标',
+ type: 'progress',
+ list: [
+ {
+ name: '1',
+ icon: ``
+ },
+ {
+ name: '2',
+ icon: ``
+ },
+ {
+ name: '3',
+ icon: ``
+ },
+ {
+ name: '4',
+ icon: ``
+ },
+ {
+ name: '5',
+ icon: ``
+ },
+ {
+ name: '6',
+ icon: ``
+ },
+ {
+ name: '7',
+ icon: ``
+ },
+ {
+ name: '8',
+ icon: ``
+ }
+ ]
+ },
+ {
+ name: '表情图标',
+ type: 'expression',
+ list: [
+ {
+ name: '1',
+ icon: ``
+ },
+ {
+ name: '2',
+ icon: ``
+ },
+ {
+ name: '3',
+ icon: ``
+ },
+ {
+ name: '4',
+ icon: ``
+ },
+ {
+ name: '5',
+ icon: ``
+ },
+ {
+ name: '6',
+ icon: ``
+ },
+ {
+ name: '7',
+ icon: ``
+ },
+ {
+ name: '8',
+ icon: ``
+ },
+ {
+ name: '9',
+ icon: ``
+ },
+ {
+ name: '10',
+ icon: ``
+ },
+ {
+ name: '11',
+ icon: ``
+ },
+ {
+ name: '12',
+ icon: ``
+ },
+ {
+ name: '13',
+ icon: ``
+ },
+ {
+ name: '14',
+ icon: ``
+ },
+ {
+ name: '15',
+ icon: ``
+ },
+ {
+ name: '16',
+ icon: ``
+ },
+ {
+ name: '17',
+ icon: ``
+ },
+ {
+ name: '18',
+ icon: ``
+ },
+ {
+ name: '19',
+ icon: ``
+ },
+ {
+ name: '20',
+ icon: ``
+ }
+ ]
+ },
+ {
+ name: '标记图标',
+ type: 'sign',
+ list: [
+ {
+ name: '1',
+ icon: ``
+ },
+ {
+ name: '2',
+ icon: ``
+ },
+ {
+ name: '3',
+ icon: ``
+ },
+ {
+ name: '4',
+ icon: ``
+ },
+ {
+ name: '5',
+ icon: ``
+ },
+ {
+ name: '6',
+ icon: ``
+ },
+ {
+ name: '7',
+ icon: ``
+ },
+ {
+ name: '8',
+ icon: ``
+ },
+ {
+ name: '9',
+ icon: ``
+ },
+ {
+ name: '10',
+ icon: ``
+ },
+ {
+ name: '11',
+ icon: ``
+ },
+ {
+ name: '12',
+ icon: ``
+ },
+ {
+ name: '13',
+ icon: ``
+ },
+ {
+ name: '14',
+ icon: ``
+ },
+ {
+ name: '15',
+ icon: ``
+ },
+ {
+ name: '16',
+ icon: ``
+ },
+ {
+ name: '17',
+ icon: ``
+ },
+ {
+ name: '18',
+ icon: ``
+ },
+ {
+ name: '19',
+ icon: ``
+ },
+ {
+ name: '20',
+ icon: ``
+ },
+ {
+ name: '21',
+ icon: ``
+ },
+ {
+ name: '22',
+ icon: ``
+ },
+ {
+ name: '23',
+ icon: ``
+ }
+ ]
+ }
+]
+const getNodeIconListIcon = (name: string, extendIconList: IconGroup[] = []): string => {
+ const arr: string[] = name.split('_');
+ const iconList: IconGroup[] = mergerIconList([...nodeIconList, ...extendIconList]);
+
+ const typeData: IconGroup | undefined = iconList.find(item =>
+ item.type === arr[0]
+ );
+
+ if (typeData) {
+ const typeName: IconItem | undefined = typeData.list.find(item =>
+ item.name === arr[1]
+ );
+
+ if (typeName) {
+ return typeName.icon;
+ }
+ return '';
+ }
+ return '';
+}
+
+// Export with type annotations
+export default {
+ hyperlink,
+ note,
+ attachment,
+ nodeIconList,
+ getNodeIconListIcon
+} as const;
\ No newline at end of file
diff --git a/packages/mindmap/src/theme/default.ts b/packages/mindmap/src/theme/default.ts
new file mode 100644
index 0000000..3c724d0
--- /dev/null
+++ b/packages/mindmap/src/theme/default.ts
@@ -0,0 +1,301 @@
+// 定义主题接口
+export interface ThemeConfig {
+ paddingX: number;
+ paddingY: number;
+ imgMaxWidth: number;
+ imgMaxHeight: number;
+ iconSize: number;
+ lineWidth: number;
+ lineColor: string;
+ lineDasharray: string;
+ lineFlow: boolean;
+ lineFlowDuration: number;
+ lineFlowForward: boolean;
+ lineStyle: 'curve' | 'straight' | 'direct';
+ rootLineKeepSameInCurve: boolean;
+ rootLineStartPositionKeepSameInCurve: boolean;
+ lineRadius: number;
+ showLineMarker: boolean;
+ generalizationLineWidth: number;
+ generalizationLineColor: string;
+ generalizationLineMargin: number;
+ generalizationNodeMargin: number;
+ associativeLineWidth: number;
+ associativeLineColor: string;
+ associativeLineActiveWidth: number;
+ associativeLineActiveColor: string;
+ associativeLineDasharray: number[];
+ associativeLineTextColor: string;
+ associativeLineTextFontSize: number;
+ associativeLineTextLineHeight: number;
+ associativeLineTextFontFamily: string;
+ backgroundColor: string;
+ backgroundImage: string;
+ backgroundRepeat: string;
+ backgroundPosition: string;
+ backgroundSize: string;
+ nodeUseLineStyle: boolean;
+ root: NodeStyle;
+ second: NodeStyle;
+ node: NodeStyle;
+ generalization: NodeStyle;
+}
+
+export interface NodeStyle {
+ shape: string;
+ fillColor: string;
+ fontFamily: string;
+ color: string;
+ fontSize: number;
+ fontWeight: string;
+ fontStyle: string;
+ borderColor: string;
+ borderWidth: number;
+ borderDasharray: string;
+ borderRadius: number;
+ textDecoration: string;
+ gradientStyle: boolean;
+ startColor: string;
+ endColor: string;
+ startDir: number[];
+ endDir: number[];
+ lineMarkerDir?: string;
+ hoverRectColor: string;
+ hoverRectRadius: number;
+ marginX?: number;
+ marginY?: number;
+}
+// 默认主题
+export const defaultTheme: ThemeConfig = {
+ // 节点内边距
+ paddingX: 15,
+ paddingY: 5,
+ // 图片显示的最大宽度
+ imgMaxWidth: 200,
+ // 图片显示的最大高度
+ imgMaxHeight: 100,
+ // icon的大小
+ iconSize: 20,
+ // 连线的粗细
+ lineWidth: 1,
+ // 连线的颜色
+ lineColor: '#549688',
+ // 连线样式
+ lineDasharray: 'none',
+ // 连线是否开启流动效果,仅在虚线时有效(需要注册LineFlow插件)
+ lineFlow: false,
+ // 流动效果一个周期的时间,单位:s
+ lineFlowDuration: 1,
+ // 流动方向是否是从父节点到子节点
+ lineFlowForward: true,
+ // 连线风格
+ lineStyle: 'straight', // 曲线(curve)【仅支持logicalStructure、mindMap、verticalTimeline三种结构】、直线(straight)、直连(direct)【仅支持logicalStructure、mindMap、organizationStructure、verticalTimeline四种结构】
+ // 曲线连接时,根节点和其他节点的连接线样式保持统一,默认根节点为 ( 型,其他节点为 { 型,设为true后,都为 { 型。仅支持logicalStructure、mindMap两种结构
+ rootLineKeepSameInCurve: true,
+ // 曲线连接时,根节点和其他节点的连线起始位置保持统一,默认根节点的连线起始位置在节点中心,其他节点在节点右侧(或左侧),如果该配置设为true,那么根节点的连线起始位置也会在节点右侧(或左侧)
+ rootLineStartPositionKeepSameInCurve: false,
+ // 直线连接(straight)时,连线的圆角大小,设置为0代表没有圆角,仅支持logicalStructure、mindMap、verticalTimeline三种结构
+ lineRadius: 5,
+ // 连线是否显示标记,目前只支持箭头
+ showLineMarker: false,
+ // 概要连线的粗细
+ generalizationLineWidth: 1,
+ // 概要连线的颜色
+ generalizationLineColor: '#549688',
+ // 概要曲线距节点的距离
+ generalizationLineMargin: 0,
+ // 概要节点距节点的距离
+ generalizationNodeMargin: 20,
+ // 关联线默认状态的粗细
+ associativeLineWidth: 2,
+ // 关联线默认状态的颜色
+ associativeLineColor: 'rgb(51, 51, 51)',
+ // 关联线激活状态的粗细
+ associativeLineActiveWidth: 8,
+ // 关联线激活状态的颜色
+ associativeLineActiveColor: 'rgba(2, 167, 240, 1)',
+ // 关联线样式
+ associativeLineDasharray: [6, 4],
+ // 关联线文字颜色
+ associativeLineTextColor: 'rgb(51, 51, 51)',
+ // 关联线文字大小
+ associativeLineTextFontSize: 14,
+ // 关联线文字行高
+ associativeLineTextLineHeight: 1.2,
+ // 关联线文字字体
+ associativeLineTextFontFamily: '微软雅黑, Microsoft YaHei',
+ // 背景颜色
+ backgroundColor: '#fafafa',
+ // 背景图片
+ backgroundImage: 'none',
+ // 背景重复
+ backgroundRepeat: 'no-repeat',
+ // 设置背景图像的起始位置
+ backgroundPosition: 'center center',
+ // 设置背景图片大小
+ backgroundSize: 'cover',
+ // 节点使用只有底边横线的样式,仅支持logicalStructure、mindMap、catalogOrganization、organizationStructure四种结构
+ nodeUseLineStyle: false,
+ // 根节点样式
+ root: {
+ shape: 'rectangle',
+ fillColor: '#549688',
+ fontFamily: '微软雅黑, Microsoft YaHei',
+ color: '#fff',
+ fontSize: 16,
+ fontWeight: 'bold',
+ fontStyle: 'normal',
+ borderColor: 'transparent',
+ borderWidth: 0,
+ borderDasharray: 'none',
+ borderRadius: 5,
+ textDecoration: 'none',
+ gradientStyle: false,
+ startColor: '#549688',
+ endColor: '#fff',
+ startDir: [0, 0],
+ endDir: [1, 0],
+ // 连线标记的位置,start(头部)、end(尾部),该配置在showLineMarker配置为true时生效
+ lineMarkerDir: 'end',
+ // 节点鼠标hover和激活时显示的矩形边框的颜色,主题里不设置,默认会取hoverRectColor实例化选项的值
+ hoverRectColor: '',
+ // 点鼠标hover和激活时显示的矩形边框的圆角大小
+ hoverRectRadius: 5
+ // 下列样式也支持给节点设置,用于覆盖最外层的设置
+ // paddingX,
+ // paddingY,
+ // lineWidth,
+ // lineColor,
+ // lineDasharray,
+ // lineFlow,
+ // lineFlowDuration,
+ // lineFlowForward
+ // 关联线的所有样式
+ },
+ // 二级节点样式
+ second: {
+ shape: 'rectangle',
+ marginX: 100,
+ marginY: 40,
+ fillColor: '#fff',
+ fontFamily: '微软雅黑, Microsoft YaHei',
+ color: '#565656',
+ fontSize: 16,
+ fontWeight: 'normal',
+ fontStyle: 'normal',
+ borderColor: '#549688',
+ borderWidth: 1,
+ borderDasharray: 'none',
+ borderRadius: 5,
+ textDecoration: 'none',
+ gradientStyle: false,
+ startColor: '#549688',
+ endColor: '#fff',
+ startDir: [0, 0],
+ endDir: [1, 0],
+ lineMarkerDir: 'end',
+ hoverRectColor: '',
+ hoverRectRadius: 5
+ },
+ // 三级及以下节点样式
+ node: {
+ shape: 'rectangle',
+ marginX: 50,
+ marginY: 0,
+ fillColor: 'transparent',
+ fontFamily: '微软雅黑, Microsoft YaHei',
+ color: '#6a6d6c',
+ fontSize: 14,
+ fontWeight: 'normal',
+ fontStyle: 'normal',
+ borderColor: 'transparent',
+ borderWidth: 0,
+ borderRadius: 5,
+ borderDasharray: 'none',
+ textDecoration: 'none',
+ gradientStyle: false,
+ startColor: '#549688',
+ endColor: '#fff',
+ startDir: [0, 0],
+ endDir: [1, 0],
+ lineMarkerDir: 'end',
+ hoverRectColor: '',
+ hoverRectRadius: 5
+ },
+ // 概要节点样式
+ generalization: {
+ shape: 'rectangle',
+ marginX: 100,
+ marginY: 40,
+ fillColor: '#fff',
+ fontFamily: '微软雅黑, Microsoft YaHei',
+ color: '#565656',
+ fontSize: 16,
+ fontWeight: 'normal',
+ fontStyle: 'normal',
+ borderColor: '#549688',
+ borderWidth: 1,
+ borderDasharray: 'none',
+ borderRadius: 5,
+ textDecoration: 'none',
+ gradientStyle: false,
+ startColor: '#549688',
+ endColor: '#fff',
+ startDir: [0, 0],
+ endDir: [1, 0],
+ hoverRectColor: '',
+ hoverRectRadius: 5
+ }
+}
+
+export const theme = {
+ default: defaultTheme
+}
+// 检测主题配置是否是节点大小无关的
+const nodeSizeIndependenceList = [
+ 'lineWidth',
+ 'lineColor',
+ 'lineDasharray',
+ 'lineStyle',
+ 'generalizationLineWidth',
+ 'generalizationLineColor',
+ 'associativeLineWidth',
+ 'associativeLineColor',
+ 'associativeLineActiveWidth',
+ 'associativeLineActiveColor',
+ 'associativeLineTextColor',
+ 'associativeLineTextFontSize',
+ 'associativeLineTextLineHeight',
+ 'associativeLineTextFontFamily',
+ 'backgroundColor',
+ 'backgroundImage',
+ 'backgroundRepeat',
+ 'backgroundPosition',
+ 'backgroundSize',
+ 'rootLineKeepSameInCurve',
+ 'rootLineStartPositionKeepSameInCurve',
+ 'showLineMarker',
+ 'lineRadius',
+ 'hoverRectColor',
+ 'hoverRectRadius',
+ 'lineFlow',
+ 'lineFlowDuration',
+ 'lineFlowForward'
+]
+export const checkIsNodeSizeIndependenceConfig = (config: Partial): boolean => {
+ const keys = Object.keys(config);
+ return keys.every(key => nodeSizeIndependenceList.includes(key));
+}
+
+
+// 连线的样式
+export const lineStyleProps = [
+ 'lineColor',
+ 'lineDasharray',
+ 'lineWidth',
+ 'lineMarkerDir',
+ 'lineFlow',
+ 'lineFlowDuration',
+ 'lineFlowForward'
+]
+
diff --git a/packages/mindmap/src/theme/index.ts b/packages/mindmap/src/theme/index.ts
new file mode 100644
index 0000000..274b8fa
--- /dev/null
+++ b/packages/mindmap/src/theme/index.ts
@@ -0,0 +1 @@
+export * from "./default"
\ No newline at end of file
diff --git a/packages/mindmap/src/types.ts b/packages/mindmap/src/types.ts
new file mode 100644
index 0000000..b7a9350
--- /dev/null
+++ b/packages/mindmap/src/types.ts
@@ -0,0 +1,73 @@
+export interface Node {
+ [key: string]: any;
+ parent?: Node | null;
+ isAncestor?: (node: Node) => boolean;
+ getIndexInBrothers?: () => number;
+ data?: {
+ text: string; // 节点文本,支持富文本(html)
+ richText?: boolean; // 是否为富文本模式
+ expand?: boolean; // 节点是否展开
+ uid?: string; // 节点唯一id
+ icon?: string[]; // 节点图标
+ image?: string; // 图片URL
+ imageTitle?: string; // 图片标题
+ imageSize?: {
+ width: number; // 图片宽度
+ height: number; // 图片高度
+ custom?: boolean; // 是否自定义大小
+ };
+ hyperlink?: string; // 超链接地址
+ hyperlinkTitle?: string; // 超链接标题
+ note?: string; // 备注内容
+ attachmentUrl?: string; // 附件URL (v0.9.10+)
+ attachmentName?: string; // 附件名称 (v0.9.10+)
+ tag?: Array;
+ generalization?: Array<{ // 节点概要
+ text: string;
+ richText?: boolean;
+ [key: string]: any; // 支持其他普通节点字段(除children外)
+ }>;
+ associativeLineTargets?: string[]; // 关联线目标节点uid列表
+ associativeLineText?: string; // 关联线文本
+ [key: string]: any; // 其他样式字段
+ };
+ children?: Node[]; // 子节点
+ nodeData?: {
+ children?: any[];
+ };
+}
+
+export interface DrawOptions {
+ sx: number
+ sy: number
+ swidth: number
+ sheight: number
+ x: number
+ y: number
+ width: number
+ height: number
+}
+
+export interface TreeNode {
+
+ data?: NodeData;
+ children?: TreeNode[];
+ nodeData?: TreeNode;
+ [key: string]: any;
+}
+
+export interface NodeData {
+ uid?: string;
+ isActive?: boolean;
+ [key: string]: any;
+}
+
+export interface BoundingRect {
+ left: number
+ top: number
+ width: number
+ height: number
+}
\ No newline at end of file
diff --git a/packages/mindmap/src/utils/AutoMove.ts b/packages/mindmap/src/utils/AutoMove.ts
new file mode 100644
index 0000000..d86e5ea
--- /dev/null
+++ b/packages/mindmap/src/utils/AutoMove.ts
@@ -0,0 +1,111 @@
+/**
+ * @file AutoMove.ts
+ * @description 思维导图画布自动移动管理类
+ * @usage 用于处理画布在鼠标接近边缘时的自动移动效果
+ */
+
+
+
+/**
+ * @class AutoMove
+ * @description 画布自动移动控制类
+ * @pattern 单例模式 - 每个画布实例对应一个自动移动实例
+ * @example
+ * ```ts
+ * const autoMove = new AutoMove(mindMap)
+ * autoMove.onMove(x, y)
+ * ```
+ */
+class AutoMove {
+ private mindMap: any
+ private autoMoveTimer: number | null
+
+ /**
+ * @constructor
+ * @param mindMap - 思维导图实例
+ */
+ constructor(mindMap: any) {
+ this.mindMap = mindMap
+ this.autoMoveTimer = null
+ }
+
+ /**
+ * @method onMove
+ * @description 处理鼠标移动事件,检测是否需要自动移动画布
+ * @param x - 鼠标X坐标
+ * @param y - 鼠标Y坐标
+ * @param callback - 移动回调函数
+ * @param handle - 边缘处理函数
+ * @throws 无异常抛出
+ */
+ onMove(
+ x: number,
+ y: number,
+ callback: () => void = () => { },
+ handle: (direction: string, step: number) => void = () => { }
+ ): void {
+ callback()
+ // 获取移动配置参数
+ const step = this.mindMap.opt.selectTranslateStep
+ const limit = this.mindMap.opt.selectTranslateLimit
+ let count = 0
+
+ // 检测四个方向的边缘,触发相应的画布移动
+ if (x <= this.mindMap.elRect.left + limit) {
+ handle('left', step)
+ this.mindMap.view.translateX(step)
+ count++
+ }
+ if (x >= this.mindMap.elRect.right - limit) {
+ handle('right', step)
+ this.mindMap.view.translateX(-step)
+ count++
+ }
+ if (y <= this.mindMap.elRect.top + limit) {
+ handle('top', step)
+ this.mindMap.view.translateY(step)
+ count++
+ }
+ if (y >= this.mindMap.elRect.bottom - limit) {
+ handle('bottom', step)
+ this.mindMap.view.translateY(-step)
+ count++
+ }
+
+ // 如果触发了边缘移动,则启动自动移动
+ if (count > 0) {
+ this.startAutoMove(x, y, callback, handle)
+ }
+ }
+
+ /**
+ * @method startAutoMove
+ * @description 启动自动移动定时器
+ * @param x - 鼠标X坐标
+ * @param y - 鼠标Y坐标
+ * @param callback - 移动回调函数
+ * @param handle - 边缘处理函数
+ */
+ private startAutoMove(
+ x: number,
+ y: number,
+ callback: () => void,
+ handle: (direction: string, step: number) => void
+ ): void {
+ this.autoMoveTimer = window.setTimeout(() => {
+ this.onMove(x, y, callback, handle)
+ }, 20)
+ }
+
+ /**
+ * @method clearAutoMoveTimer
+ * @description 清除自动移动定时器
+ */
+ clearAutoMoveTimer(): void {
+ if (this.autoMoveTimer) {
+ clearTimeout(this.autoMoveTimer)
+ }
+ }
+}
+
+export default AutoMove
\ No newline at end of file
diff --git a/packages/mindmap/src/utils/BatchExecution.ts b/packages/mindmap/src/utils/BatchExecution.ts
new file mode 100644
index 0000000..9a3057d
--- /dev/null
+++ b/packages/mindmap/src/utils/BatchExecution.ts
@@ -0,0 +1,103 @@
+/**
+ * 批量执行器模块
+ * 用于管理和执行异步任务队列,支持任务去重和批量处理
+ *
+ * 使用场景:
+ * 1. 需要对频繁触发的操作进行批量处理
+ * 2. 需要确保相同任务只执行最新一次
+ * 3. 需要在下一个事件循环统一处理多个任务
+ */
+
+import { nextTick } from './Task'
+
+/**
+ * 批量执行器类
+ *
+ * 核心功能:
+ * - 维护异步任务队列
+ * - 支持任务去重和替换
+ * - 批量执行队列中的任务
+ *
+ * 设计模式:
+ * - 使用单例模式确保任务队列的唯一性
+ * - 采用发布订阅模式处理异步任务
+ *
+ * 使用示例:
+ * ```typescript
+ * const batch = new BatchExecution()
+ * batch.push('task1', () => console.log('执行任务1'))
+ * batch.push('task2', () => console.log('执行任务2'))
+ * ```
+ */
+class BatchExecution {
+ // 任务状态映射表
+ private has: Record
+ // 任务队列
+ private queue: Array<{ name: string, fn: () => void }>
+ // 下一帧执行函数
+ private nextTick: () => void
+
+ constructor() {
+ this.has = {}
+ this.queue = []
+ this.nextTick = nextTick(this.flush, this)
+ }
+
+ /**
+ * 添加任务到执行队列
+ * @param name - 任务唯一标识
+ * @param fn - 待执行的任务函数
+ * @returns void
+ *
+ * 异常处理:
+ * - 如果任务已存在,将替换为新任务
+ * - 任务函数执行错误不会影响队列中其他任务
+ */
+ push(name: string, fn: () => void): void {
+ if (this.has[name]) {
+ this.replaceTask(name, fn)
+ return
+ }
+ this.has[name] = true
+ this.queue.push({
+ name,
+ fn
+ })
+ this.nextTick()
+ }
+
+ /**
+ * 替换已存在的任务
+ * @param name - 任务唯一标识
+ * @param fn - 新的任务函数
+ * @returns void
+ */
+ private replaceTask(name: string, fn: () => void): void {
+ const index = this.queue.findIndex(item => {
+ return item.name === name
+ })
+ if (index !== -1) {
+ this.queue[index] = {
+ name,
+ fn
+ }
+ }
+ }
+
+ /**
+ * 执行队列中的所有任务
+ * 执行完成后清空队列
+ * @returns void
+ */
+ private flush(): void {
+ // 复制队列以避免执行过程中的队列变化
+ let fns = this.queue.slice(0)
+ this.queue = []
+ fns.forEach(({ name, fn }) => {
+ this.has[name] = false
+ fn()
+ })
+ }
+}
+
+export default BatchExecution
\ No newline at end of file
diff --git a/packages/mindmap/src/utils/Dom.ts b/packages/mindmap/src/utils/Dom.ts
new file mode 100644
index 0000000..06fc77f
--- /dev/null
+++ b/packages/mindmap/src/utils/Dom.ts
@@ -0,0 +1,243 @@
+import { htmlEscape } from "./String";
+
+// DOM element references
+let getTextFromHtmlEl: HTMLDivElement | null = null;
+let nodeToHTMLWrapEl: HTMLDivElement | null = null;
+let addHtmlStyleEl: HTMLDivElement | null = null;
+let replaceHtmlTextEl: HTMLDivElement | null = null;
+let removeHtmlNodeByClassEl: HTMLDivElement | null = null;
+let nodeRichTextToTextWithWrapEl: HTMLDivElement | null = null;
+let textToNodeRichTextWithWrapEl: HTMLDivElement | null = null;
+let removeRichTextStyesEl: HTMLDivElement | null = null;
+
+// Extract plain text from HTML string
+export const getTextFromHtml = (html: string): string => {
+ if (!getTextFromHtmlEl) {
+ getTextFromHtmlEl = document.createElement('div');
+ }
+ getTextFromHtmlEl.innerHTML = html;
+ return getTextFromHtmlEl.textContent || '';
+}
+
+// Convert DOM node to HTML string
+export const nodeToHTML = (node: Node): string => {
+ if (!nodeToHTMLWrapEl) {
+ nodeToHTMLWrapEl = document.createElement('div');
+ }
+ nodeToHTMLWrapEl.innerHTML = '';
+ nodeToHTMLWrapEl.appendChild(node);
+ return nodeToHTMLWrapEl.innerHTML;
+}
+
+// Add inline styles to specified tags in HTML
+export const addHtmlStyle = (html: string, tag: string | string[], style: string): string => {
+ if (!addHtmlStyleEl) {
+ addHtmlStyleEl = document.createElement('div');
+ }
+ const tags = Array.isArray(tag) ? tag : [tag];
+ addHtmlStyleEl.innerHTML = html;
+
+ const walk = (root: Node): void => {
+ let childNodes = root.childNodes;
+ childNodes.forEach(node => {
+ if (node.nodeType === 1) {
+ if (tags.includes((node as Element).tagName.toLowerCase())) {
+ (node as HTMLElement).style.cssText = style;
+ } else {
+ walk(node);
+ }
+ }
+ });
+ }
+ walk(addHtmlStyleEl);
+ return addHtmlStyleEl.innerHTML;
+}
+
+// Remove HTML entities from string
+export const removeHTMLEntities = (str: string): string => {
+ [[' ', ' ']].forEach(item => {
+ str = str.replaceAll(item[0], item[1]);
+ });
+ return str;
+}
+
+// Remove inline styles from HTML string
+export const removeHtmlStyle = (html: string): string => {
+ return html.replaceAll(/(<[^\s]+)\s+style=["'][^'"]+["']\s*(>)/g, '$1$2');
+}
+
+// Search and replace text in HTML string
+export const replaceHtmlText = (html: string, searchText: string, replaceText: string): string => {
+ if (!replaceHtmlTextEl) {
+ replaceHtmlTextEl = document.createElement('div');
+ }
+ replaceHtmlTextEl.innerHTML = html;
+
+ const walk = (root: Node): void => {
+ let childNodes = root.childNodes;
+ childNodes.forEach(node => {
+ if (node.nodeType === 1) {
+ walk(node);
+ } else if (node.nodeType === 3) {
+ root.replaceChild(
+ document.createTextNode(
+ node.nodeValue?.replaceAll(searchText, replaceText) || ''
+ ),
+ node
+ );
+ }
+ });
+ }
+ walk(replaceHtmlTextEl);
+ return replaceHtmlTextEl.innerHTML;
+}
+
+// Remove node by class selector from HTML string
+export const removeHtmlNodeByClass = (html: string, selector: string): string => {
+ if (!removeHtmlNodeByClassEl) {
+ removeHtmlNodeByClassEl = document.createElement('div');
+ }
+ removeHtmlNodeByClassEl.innerHTML = html;
+ const node = removeHtmlNodeByClassEl.querySelector(selector);
+ if (node) {
+ node.parentNode?.removeChild(node);
+ }
+ return removeHtmlNodeByClassEl.innerHTML;
+}
+
+// Remove formula tags from DOM node
+export const removeFormulaTags = (node: Node): void => {
+ const walk = (root: Node): void => {
+ const childNodes = root.childNodes;
+ childNodes.forEach(node => {
+ if (node.nodeType === 1) {
+ if ((node as Element).classList.contains('ql-formula')) {
+ node.parentNode?.removeChild(node);
+ } else {
+ walk(node);
+ }
+ }
+ });
+ }
+ walk(node);
+}
+
+// Convert rich text node content to text with newlines
+export const nodeRichTextToTextWithWrap = (html: string): string => {
+ if (!nodeRichTextToTextWithWrapEl) {
+ nodeRichTextToTextWithWrapEl = document.createElement('div');
+ }
+ nodeRichTextToTextWithWrapEl.innerHTML = html;
+ const childNodes = nodeRichTextToTextWithWrapEl.childNodes;
+ let res = '';
+ for (let i = 0; i < childNodes.length; i++) {
+ const node = childNodes[i];
+ if (node.nodeType === 1) {
+ removeFormulaTags(node);
+ if ((node as Element).tagName.toLowerCase() === 'p') {
+ res += node.textContent + '\n';
+ } else {
+ res += node.textContent;
+ }
+ } else if (node.nodeType === 3) {
+ res += node.nodeValue;
+ }
+ }
+ return res.replace(/\n$/, '');
+}
+
+// Convert text with
to rich text node content
+export const textToNodeRichTextWithWrap = (html: string): string => {
+ if (!textToNodeRichTextWithWrapEl) {
+ textToNodeRichTextWithWrapEl = document.createElement('div');
+ }
+ textToNodeRichTextWithWrapEl.innerHTML = html;
+ const childNodes = textToNodeRichTextWithWrapEl.childNodes;
+ let list: string[] = [];
+ let str = '';
+ for (let i = 0; i < childNodes.length; i++) {
+ const node = childNodes[i];
+ if (node.nodeType === 1) {
+ if ((node as Element).tagName.toLowerCase() === 'br') {
+ list.push(str);
+ str = '';
+ } else {
+ str += node.textContent;
+ }
+ } else if (node.nodeType === 3) {
+ str += node.nodeValue;
+ }
+ }
+ if (str) {
+ list.push(str);
+ }
+ return list
+ .map(item => {
+ return `${htmlEscape(item)}
`;
+ })
+ .join('');
+}
+
+// Remove rich text styles but preserve math formulas
+export const removeRichTextStyes = (html: string): string => {
+ if (!removeRichTextStyesEl) {
+ removeRichTextStyesEl = document.createElement('div');
+ }
+ removeRichTextStyesEl.innerHTML = html;
+
+ const formulaList = removeRichTextStyesEl.querySelectorAll('.ql-formula');
+ Array.from(formulaList).forEach(el => {
+ const placeholder = document.createTextNode('$smmformula$');
+ el.parentNode?.replaceChild(placeholder, el);
+ });
+
+ const childNodes = removeRichTextStyesEl.childNodes;
+ let list: string[] = [];
+ for (let i = 0; i < childNodes.length; i++) {
+ const node = childNodes[i];
+ if (node.nodeType === 1 || node.nodeType === 3) {
+ list.push(node.textContent || node.nodeValue || '');
+ }
+ }
+
+ html = list
+ .map(item => {
+ return `${htmlEscape(item)}
`;
+ })
+ .join('');
+
+ if (formulaList.length > 0) {
+ html = html.replace(/\$smmformula\$/g, '');
+ removeRichTextStyesEl.innerHTML = html;
+ const els = removeRichTextStyesEl.querySelectorAll('.smmformula');
+ Array.from(els).forEach((el, index) => {
+ el.parentNode?.replaceChild(formulaList[index], el);
+ });
+ html = removeRichTextStyesEl.innerHTML;
+ }
+ return html;
+}
+
+// Focus input element
+export const focusInput = (el: HTMLElement): void => {
+ let selection = window.getSelection();
+ let range = document.createRange();
+ range.selectNodeContents(el);
+ range.collapse();
+ selection?.removeAllRanges();
+ selection?.addRange(range);
+}
+
+// Focus and select all in input element
+export const selectAllInput = (el: HTMLElement): void => {
+ let selection = window.getSelection();
+ let range = document.createRange();
+ range.selectNodeContents(el);
+ selection?.removeAllRanges();
+ selection?.addRange(range);
+}
+
+// Add xmlns attribute to element
+export const addXmlns = (el: Element): void => {
+ el.setAttribute('xmlns', 'http://www.w3.org/1999/xhtml');
+}
\ No newline at end of file
diff --git a/packages/mindmap/src/utils/File.ts b/packages/mindmap/src/utils/File.ts
new file mode 100644
index 0000000..118eba5
--- /dev/null
+++ b/packages/mindmap/src/utils/File.ts
@@ -0,0 +1,23 @@
+// 将blob转成data:url
+export const readBlob = (blob: Blob): Promise => {
+ return new Promise((resolve, reject) => {
+ const reader = new FileReader()
+ reader.onload = (evt: ProgressEvent) => {
+ if (evt.target?.result) {
+ resolve(evt.target.result as string)
+ }
+ }
+ reader.onerror = (err: ProgressEvent) => {
+ reject(err)
+ }
+ reader.readAsDataURL(blob)
+ })
+}
+
+// 下载文件
+export const downloadFile = (file: string, fileName: string): void => {
+ const a = document.createElement('a')
+ a.href = file
+ a.download = fileName
+ a.click()
+}
\ No newline at end of file
diff --git a/packages/mindmap/src/utils/Image.ts b/packages/mindmap/src/utils/Image.ts
new file mode 100644
index 0000000..602e8d7
--- /dev/null
+++ b/packages/mindmap/src/utils/Image.ts
@@ -0,0 +1,172 @@
+// 按原比例缩放图片
+export const resizeImgSizeByOriginRatio = (
+ width: number,
+ height: number,
+ newWidth: number,
+ newHeight: number
+): [number, number] => {
+ let arr: [number, number] = [0, 0]
+ const nRatio = width / height
+ const mRatio = newWidth / newHeight
+ if (nRatio > mRatio) {
+ // 固定宽度
+ arr = [newWidth, newWidth / nRatio]
+ } else {
+ // 固定高度
+ arr = [nRatio * newHeight, newHeight]
+ }
+ return arr
+}
+
+// 缩放图片尺寸
+export const resizeImgSize = (
+ width: number,
+ height: number,
+ maxWidth?: number,
+ maxHeight?: number
+): [number, number] => {
+ const nRatio = width / height
+ let arr: [number, number] = [0, 0]
+ if (maxWidth && maxHeight) {
+ if (width <= maxWidth && height <= maxHeight) {
+ arr = [width, height]
+ } else {
+ const mRatio = maxWidth / maxHeight
+ if (nRatio > mRatio) {
+ // 固定宽度
+ arr = [maxWidth, maxWidth / nRatio]
+ } else {
+ // 固定高度
+ arr = [nRatio * maxHeight, maxHeight]
+ }
+ }
+ } else if (maxWidth) {
+ if (width <= maxWidth) {
+ arr = [width, height]
+ } else {
+ arr = [maxWidth, maxWidth / nRatio]
+ }
+ } else if (maxHeight) {
+ if (height <= maxHeight) {
+ arr = [width, height]
+ } else {
+ arr = [nRatio * maxHeight, maxHeight]
+ }
+ }
+ return arr
+}
+
+interface ImageSize {
+ width: number
+ height: number
+}
+
+interface LoadImageResult {
+ url: string
+ size: ImageSize
+}
+
+// 缩放图片
+export const resizeImg = (
+ imgUrl: string,
+ maxWidth?: number,
+ maxHeight?: number
+): Promise<[number, number]> => {
+ return new Promise((resolve, reject) => {
+ const img = new Image()
+ img.src = imgUrl
+ img.onload = () => {
+ const arr = resizeImgSize(
+ img.naturalWidth,
+ img.naturalHeight,
+ maxWidth,
+ maxHeight
+ )
+ resolve(arr)
+ }
+ img.onerror = (e: Event | string) => {
+ reject(e)
+ }
+ })
+}
+
+// 获取图片大小
+export const getImageSize = (src: string): Promise => {
+ return new Promise(resolve => {
+ const img = new Image()
+ img.src = src
+ img.onload = () => {
+ resolve({
+ width: img.width,
+ height: img.height
+ })
+ }
+ img.onerror = () => {
+ resolve({
+ width: 0,
+ height: 0
+ })
+ }
+ })
+}
+
+// 加载图片文件
+export const loadImage = (imgFile: File): Promise => {
+ return new Promise((resolve, reject) => {
+ const fr = new FileReader()
+ fr.readAsDataURL(imgFile)
+ fr.onload = async (e: ProgressEvent) => {
+ const url = e.target?.result as string
+ const size = await getImageSize(url)
+ resolve({
+ url,
+ size
+ })
+ }
+ fr.onerror = (error: ProgressEvent) => {
+ reject(error)
+ }
+ })
+}
+
+// 图片转成dataURL
+export const imgToDataUrl = (
+ src: string,
+ returnBlob: boolean = false
+): Promise => {
+ return new Promise((resolve, reject) => {
+ const img = new Image()
+ // 跨域图片需要添加这个属性,否则画布被污染了无法导出图片
+ img.setAttribute('crossOrigin', 'anonymous')
+ img.onload = () => {
+ try {
+ const canvas = document.createElement('canvas')
+ canvas.width = img.width
+ canvas.height = img.height
+ const ctx = canvas.getContext('2d')
+ if (!ctx) {
+ throw new Error('Failed to get canvas context')
+ }
+ // 图片绘制到canvas里
+ ctx.drawImage(img, 0, 0, img.width, img.height)
+ if (returnBlob) {
+ canvas.toBlob(blob => {
+ if (blob) {
+ resolve(blob)
+ } else {
+ reject(new Error('Failed to create blob'))
+ }
+ })
+ } else {
+ resolve(canvas.toDataURL())
+ }
+ } catch (e) {
+ reject(e)
+ }
+ }
+ img.onerror = (e: Event | string) => {
+ reject(e)
+ }
+ img.src = src
+ })
+}
\ No newline at end of file
diff --git a/packages/mindmap/src/utils/Lru.ts b/packages/mindmap/src/utils/Lru.ts
new file mode 100644
index 0000000..d08b8ea
--- /dev/null
+++ b/packages/mindmap/src/utils/Lru.ts
@@ -0,0 +1,110 @@
+/**
+ * LRU (Least Recently Used) 缓存实现
+ *
+ * 用途:
+ * - 用于缓存有限数量的键值对数据
+ * - 适用于需要限制内存使用的场景
+ * - 常用于性能优化,避免重复计算
+ */
+
+/**
+ * LRU缓存类
+ *
+ * 设计说明:
+ * - 采用Map数据结构存储键值对
+ * - 通过size属性跟踪当前缓存数量
+ * - 支持最大容量限制
+ *
+ * 使用示例:
+ * ```ts
+ * const cache = new Lru(100);
+ * cache.add('key', 'value');
+ * const value = cache.get('key');
+ * ```
+ */
+export default class Lru {
+ /** 缓存最大容量 */
+ private max: number;
+ /** 当前缓存数量 */
+ private size: number;
+ /** 缓存池,使用Map存储键值对 */
+ private pool: Map;
+
+ /**
+ * 构造函数
+ * @param max - 缓存的最大容量,默认为1000
+ */
+ constructor(max?: number) {
+ this.max = max || 1000;
+ this.size = 0;
+ this.pool = new Map();
+ }
+
+ /**
+ * 添加键值对到缓存
+ * @param key - 缓存键
+ * @param value - 缓存值
+ * @returns 添加是否成功
+ *
+ * 处理逻辑:
+ * 1. 检查键是否存在
+ * 2. 如果不存在且达到容量上限,则添加失败
+ * 3. 如果键已存在,则先删除旧值
+ * 4. 添加新的键值对
+ */
+ add(key: K, value: V): boolean {
+ const isExist = this.has(key);
+ // 如果该key之前不存在,并且现在数量已经超出最大值,则不再继续添加
+ if (!isExist && this.size >= this.max) {
+ return false;
+ }
+ // 已经存在则可以更新,因为不影响数量
+ // 如果该key是否已经存在,则先删除
+ this.delete(key);
+ // 添加新值
+ this.pool.set(key, value);
+ this.size++;
+ return true;
+ }
+
+ /**
+ * 从缓存中删除指定键值对
+ * @param key - 要删除的键
+ */
+ delete(key: K): void {
+ if (this.pool.has(key)) {
+ this.pool.delete(key);
+ this.size--;
+ }
+ }
+
+ /**
+ * 检查键是否存在于缓存中
+ * @param key - 要检查的键
+ * @returns 是否存在
+ */
+ has(key: K): boolean {
+ return this.pool.has(key);
+ }
+
+ /**
+ * 获取缓存中指定键的值
+ * @param key - 要获取的键
+ * @returns 对应的值,如果不存在则返回undefined
+ */
+ get(key: K): V | undefined {
+ if (this.pool.has(key)) {
+ return this.pool.get(key);
+ }
+ return undefined;
+ }
+
+ /**
+ * 清空缓存
+ * 重置size为0并创建新的Map实例
+ */
+ clear(): void {
+ this.size = 0;
+ this.pool = new Map();
+ }
+}
\ No newline at end of file
diff --git a/packages/mindmap/src/utils/NodeTools.ts b/packages/mindmap/src/utils/NodeTools.ts
new file mode 100644
index 0000000..0a3473f
--- /dev/null
+++ b/packages/mindmap/src/utils/NodeTools.ts
@@ -0,0 +1,279 @@
+import { addXmlns } from "./Dom"
+import { ForeignObject } from '@svgdotjs/svg.js'
+import { BoundingRect, Node } from "../types"
+
+
+
+
+interface ForeignObjectConfig {
+ el: HTMLElement
+ width?: number
+ height?: number
+}
+
+interface ExtraContentConfig {
+ addContentToHeader?: () => {
+ el: HTMLElement
+ cssText?: string
+ height: number
+ } | void
+ addContentToFooter?: () => {
+ el: HTMLElement
+ cssText?: string
+ height: number
+ } | void
+}
+
+interface ExtraContentResult {
+ cssTextList: string[]
+ header: ForeignObject | null
+ headerHeight: number
+ footer: ForeignObject | null
+ footerHeight: number
+}
+
+// Get bounding rect for node tree
+export const getNodeTreeBoundingRect = (
+ node: Node,
+ x: number = 0,
+ y: number = 0,
+ paddingX: number = 0,
+ paddingY: number = 0,
+ excludeSelf: boolean = false,
+ excludeGeneralization: boolean = false
+): BoundingRect => {
+ let minX: number = Infinity
+ let maxX: number = -Infinity
+ let minY: number = Infinity
+ let maxY: number = -Infinity
+
+ const walk = (root: Node, isRoot: boolean): void => {
+ if (!(isRoot && excludeSelf) && root.group) {
+ try {
+ const { x, y, width, height } = root.group
+ .findOne('.smm-node-shape')
+ .rbox()
+ if (x < minX) {
+ minX = x
+ }
+ if (x + width > maxX) {
+ maxX = x + width
+ }
+ if (y < minY) {
+ minY = y
+ }
+ if (y + height > maxY) {
+ maxY = y + height
+ }
+ } catch (e) { }
+ }
+ if (!excludeGeneralization && root._generalizationList.length > 0) {
+ root._generalizationList.forEach(item => {
+ walk(item.generalizationNode, false)
+ })
+ }
+ if (root.children) {
+ root.children.forEach(item => {
+ walk(item, false)
+ })
+ }
+ }
+ walk(node, true)
+
+ minX = minX - x + paddingX
+ minY = minY - y + paddingY
+ maxX = maxX - x + paddingX
+ maxY = maxY - y + paddingY
+
+ return {
+ left: minX,
+ top: minY,
+ width: maxX - minX,
+ height: maxY - minY
+ }
+}
+
+// Get bounding rect for multiple nodes
+export const getNodeListBoundingRect = (
+ nodeList: Node[],
+ x: number = 0,
+ y: number = 0,
+ paddingX: number = 0,
+ paddingY: number = 0
+): BoundingRect => {
+ let minX: number = Infinity
+ let maxX: number = -Infinity
+ let minY: number = Infinity
+ let maxY: number = -Infinity
+
+ nodeList.forEach(node => {
+ const { left, top, width, height } = getNodeTreeBoundingRect(
+ node,
+ x,
+ y,
+ paddingX,
+ paddingY,
+ false,
+ true
+ )
+ if (left < minX) {
+ minX = left
+ }
+ if (left + width > maxX) {
+ maxX = left + width
+ }
+ if (top < minY) {
+ minY = top
+ }
+ if (top + height > maxY) {
+ maxY = top + height
+ }
+ })
+ return {
+ left: minX,
+ top: minY,
+ width: maxX - minX,
+ height: maxY - minY
+ }
+}
+
+// Create foreignObject node
+export const createForeignObjectNode = ({ el, width, height }: ForeignObjectConfig): ForeignObject => {
+ const foreignObject = new ForeignObject()
+ if (width !== undefined) {
+ foreignObject.width(width)
+ }
+ if (height !== undefined) {
+ foreignObject.height(height)
+ }
+ // 使用 node 属性直接设置原生 DOM 元素
+ foreignObject.node.appendChild(el)
+ return foreignObject
+}
+
+// Format node generalization data
+export const formatGetNodeGeneralization = (data: any) => {
+ const generalization = data.generalization
+ if (generalization) {
+ return Array.isArray(generalization) ? generalization : [generalization]
+ } else {
+ return []
+ }
+}
+
+// Sort node list by sortIndex
+export const sortNodeList = (nodeList: Node[]): Node[] => {
+ nodeList = [...nodeList]
+ nodeList.sort((a, b) => {
+ return a.sortIndex - b.sortIndex
+ })
+ return nodeList
+}
+
+// Check if node is outside canvas
+export const checkNodeOuter = (mindMap: {
+ elRect: { width: number, height: number },
+ draw: {
+ transform: () => {
+ scaleX: number,
+ scaleY: number,
+ translateX: number,
+ translateY: number
+ }
+ }
+}, node: Node): {
+ isOuter: boolean,
+ offsetLeft: number,
+ offsetTop: number
+} => {
+ let elRect = mindMap.elRect
+ let { scaleX, scaleY, translateX, translateY } = mindMap.draw.transform()
+ let { left, top, width, height } = node
+ let right = (left + width) * scaleX + translateX
+ let bottom = (top + height) * scaleY + translateY
+ left = left * scaleX + translateX
+ top = top * scaleY + translateY
+ let offsetLeft = 0
+ let offsetTop = 0
+ if (left < 0) {
+ offsetLeft = -left
+ }
+ if (right > elRect.width) {
+ offsetLeft = -(right - elRect.width)
+ }
+ if (top < 0) {
+ offsetTop = -top
+ }
+ if (bottom > elRect.height) {
+ offsetTop = -(bottom - elRect.height)
+ }
+ return {
+ isOuter: offsetLeft !== 0 || offsetTop !== 0,
+ offsetLeft,
+ offsetTop
+ }
+}
+
+// Check if two node lists contain same nodes
+export const checkNodeListIsEqual = (list1: Node[], list2: Node[]): boolean => {
+ if (list1.length !== list2.length) return false
+ for (let i = 0; i < list1.length; i++) {
+ if (
+ !list2.find(item => {
+ return item.uid === list1[i].uid
+ })
+ ) {
+ return false
+ }
+ }
+ return true
+}
+
+// Handle extra content when getting SVG content
+export const handleGetSvgDataExtraContent = ({
+ addContentToHeader,
+ addContentToFooter
+}: ExtraContentConfig): ExtraContentResult => {
+ const cssTextList: string[] = []
+ let header: ForeignObject | null = null
+ let headerHeight = 0
+ let footer: ForeignObject | null = null
+ let footerHeight = 0
+
+ const handle = (fn: (() => {
+ el: HTMLElement,
+ cssText?: string,
+ height: number
+ } | void) | undefined, callback: (foreignObject: ForeignObject, height: number) => void): void => {
+ if (typeof fn === 'function') {
+ const res = fn()
+ if (!res) return
+ const { el, cssText, height } = res
+ if (el instanceof HTMLElement) {
+ addXmlns(el)
+ const foreignObject = createForeignObjectNode({ el, height })
+ callback(foreignObject, height)
+ }
+ if (cssText) {
+ cssTextList.push(cssText)
+ }
+ }
+ }
+
+ handle(addContentToHeader, (foreignObject, height) => {
+ header = foreignObject
+ headerHeight = height
+ })
+ handle(addContentToFooter, (foreignObject, height) => {
+ footer = foreignObject
+ footerHeight = height
+ })
+
+ return {
+ cssTextList,
+ header,
+ headerHeight,
+ footer,
+ footerHeight
+ }
+}
\ No newline at end of file
diff --git a/packages/mindmap/src/utils/Nodes.ts b/packages/mindmap/src/utils/Nodes.ts
new file mode 100644
index 0000000..3770544
--- /dev/null
+++ b/packages/mindmap/src/utils/Nodes.ts
@@ -0,0 +1,217 @@
+import { nodeDataNoStylePropList } from "../constants/constant"
+import { lineStyleProps, ThemeConfig } from "../theme"
+import { createUid } from "./Number"
+import { isUndef } from "./Object"
+import { FontOptions, joinFontStr } from "./Theme"
+import { Node } from "../types"
+
+// 判断一个字段是否是节点数据中的样式字段
+export const checkIsNodeStyleDataKey = (key: string): boolean => {
+ // 用户自定义字段
+ if (/^_/.test(key)) return false
+ // 不在节点非样式字段列表里,那么就是样式字段
+ if (!nodeDataNoStylePropList.includes(key)) {
+ return true
+ }
+ return false
+}
+
+// 判断一个对象是否不需要触发节点重新创建
+export const isNodeNotNeedRenderData = (config: Record): boolean => {
+ const list: string[] = [...lineStyleProps] // 节点连线样式
+ const keys = Object.keys(config)
+ for (let i = 0; i < keys.length; i++) {
+ if (!list.includes(keys[i])) {
+ return false
+ }
+ }
+ return true
+}
+
+
+// 从节点实例列表里找出顶层的节点
+export const getTopAncestorsFomNodeList = (list: Node[]): Node[] => {
+ let res: Node[] = []
+ list.forEach(node => {
+ if (
+ !list.find(item => {
+ return item.uid !== node.uid && item.isAncestor(node)
+ })
+ ) {
+ res.push(node)
+ }
+ })
+ return res
+}
+
+// 从给定的节点实例列表里判断是否存在上下级关系
+export const checkHasSupSubRelation = (list: Node[]): boolean => {
+ for (let i = 0; i < list.length; i++) {
+ const cur = list[i]
+ if (
+ list.find(item => {
+ return item.uid !== cur.uid && cur.isAncestor(item)
+ })
+ ) {
+ return true
+ }
+ }
+ return false
+}
+
+interface GeneralizationNode {
+ node: Node
+ range?: [number, number]
+}
+
+// 解析要添加概要的节点实例列表
+export const parseAddGeneralizationNodeList = (list: Node[]): GeneralizationNode[] => {
+ const cache: Record> = {}
+ const uidToParent: Record = {}
+ list.forEach(node => {
+ const parent = node.parent
+ if (parent) {
+ const pUid = parent.uid
+ uidToParent[pUid] = parent
+ const index = node.getIndexInBrothers()
+ const data = {
+ node,
+ index
+ }
+ if (cache[pUid]) {
+ if (
+ !cache[pUid].find(item => {
+ return item.index === data.index
+ })
+ ) {
+ cache[pUid].push(data)
+ }
+ } else {
+ cache[pUid] = [data]
+ }
+ }
+ })
+ const res: GeneralizationNode[] = []
+ Object.keys(cache).forEach(uid => {
+ if (cache[uid].length > 1) {
+ const rangeList = cache[uid]
+ .map(item => {
+ return item.index
+ })
+ .sort((a, b) => {
+ return a - b
+ })
+ res.push({
+ node: uidToParent[uid],
+ range: [rangeList[0], rangeList[rangeList.length - 1]]
+ })
+ } else {
+ res.push({
+ node: cache[uid][0].node
+ })
+ }
+ })
+ return res
+}
+
+// 给指定的节点列表树数据添加附加数据,会修改原数据
+export const addDataToAppointNodes = (appointNodes: Node[], data: Record = {}): Node[] => {
+ data = { ...data }
+ const alreadyIsRichText = data && data.richText
+ // 如果指定的数据就是富文本格式,那么不需要重新创建
+ if (alreadyIsRichText && data.resetRichText) {
+ delete data.resetRichText
+ }
+ const walk = (list: Node[]) => {
+ list.forEach(node => {
+ node.data = {
+ ...node.data,
+ ...data
+ }
+ if (node.children && node.children.length > 0) {
+ walk(node.children)
+ }
+ })
+ }
+ walk(appointNodes)
+ return appointNodes
+}
+
+// 给指定的节点列表树数据添加uid,会修改原数据
+export const createUidForAppointNodes = (
+ appointNodes: Node[],
+ createNewId: boolean = false,
+ handle: ((node: Node) => void) | null = null
+): Node[] => {
+ const walk = (list: Node[]) => {
+ list.forEach(node => {
+ if (!node.data) {
+ node.data = {}
+ }
+ if (createNewId || isUndef(node.data.uid)) {
+ node.data.uid = createUid()
+ }
+ handle && handle(node)
+ if (node.children && node.children.length > 0) {
+ walk(node.children)
+ }
+ })
+ }
+ walk(appointNodes)
+ return appointNodes
+}
+
+// 获取节点在同级里的位置索引
+// 获取节点在同级里的位置索引
+export const getNodeDataIndex = (node: Node): number => {
+ if (!node?.parent?.nodeData?.children) return -1
+ return node.parent.nodeData.children.findIndex(item => {
+ return item.data.uid === node.uid
+ })
+}
+// 从一个节点列表里找出某个节点的索引
+export const getNodeIndexInNodeList = (node: Node, nodeList: Node[]): number => {
+ return nodeList.findIndex(item => {
+ return item.uid === node.uid
+ })
+}
+
+// 从节点的父节点的nodeData.children列表中移除该节点的数据
+export const removeFromParentNodeData = (node: Node | null): void => {
+ // 检查 node 和 parent 是否存在
+ if (!node?.parent?.nodeData?.children) return
+ const index = getNodeDataIndex(node)
+ if (index === -1) return
+ node.parent.nodeData.children.splice(index, 1)
+}
+
+interface TextMetrics {
+ width: number
+ height: number
+}
+
+//计算节点的文本长宽
+let measureTextContext: CanvasRenderingContext2D | null = null
+export const measureText = (text: string, { italic, bold, fontSize, fontFamily }: FontOptions): TextMetrics => {
+ const font = joinFontStr({
+ italic,
+ bold,
+ fontSize,
+ fontFamily
+ })
+ if (!measureTextContext) {
+ const canvas = document.createElement('canvas')
+ measureTextContext = canvas.getContext('2d')
+ }
+ // 先进行空值检查
+ if (!measureTextContext) {
+ throw new Error('Failed to get 2D context')
+ }
+ measureTextContext?.save()
+ measureTextContext.font = font
+ const { width, actualBoundingBoxAscent, actualBoundingBoxDescent } =
+ measureTextContext.measureText(text)
+ measureTextContext.restore()
+ const height = actualBoundingBoxAscent + actualBoundingBoxDescent
+ return { width, height }
+}
\ No newline at end of file
diff --git a/packages/mindmap/src/utils/Number.ts b/packages/mindmap/src/utils/Number.ts
new file mode 100644
index 0000000..1ad4e84
--- /dev/null
+++ b/packages/mindmap/src/utils/Number.ts
@@ -0,0 +1,98 @@
+import { v4 as uuidv4 } from 'uuid';
+
+// 角度转弧度
+export const degToRad = (deg: number): number => {
+ return deg * (Math.PI / 180);
+};
+
+// 判断两个矩形是否重叠
+export const checkTwoRectIsOverlap = (
+ minx1: number,
+ maxx1: number,
+ miny1: number,
+ maxy1: number,
+ minx2: number,
+ maxx2: number,
+ miny2: number,
+ maxy2: number
+): boolean => {
+ return maxx1 > minx2 && maxx2 > minx1 && maxy1 > miny2 && maxy2 > miny1;
+};
+
+// 创建节点唯一的id
+export const createUid = (): string => {
+ return uuidv4();
+};
+
+// 计算两个点的直线距离
+export const getTwoPointDistance = (
+ x1: number,
+ y1: number,
+ x2: number,
+ y2: number
+): number => {
+ return Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2));
+};
+
+interface Rect {
+ x: number;
+ y: number;
+ width: number;
+ height: number;
+}
+
+type Direction =
+ | 'left-top'
+ | 'right-top'
+ | 'right-bottom'
+ | 'left-bottom'
+ | 'left'
+ | 'right'
+ | 'top'
+ | 'bottom'
+ | 'overlap';
+
+// 判断两个矩形的相对位置
+// 第一个矩形在第二个矩形的什么方向
+export const getRectRelativePosition = (rect1: Rect, rect2: Rect): Direction => {
+ // 获取第一个矩形的中心点坐标
+ const rect1CenterX = rect1.x + rect1.width / 2;
+ const rect1CenterY = rect1.y + rect1.height / 2;
+
+ // 获取第二个矩形的中心点坐标
+ const rect2CenterX = rect2.x + rect2.width / 2;
+ const rect2CenterY = rect2.y + rect2.height / 2;
+
+ // 判断第一个矩形在第二个矩形的哪个方向
+ if (rect1CenterX < rect2CenterX && rect1CenterY < rect2CenterY) {
+ return 'left-top';
+ } else if (rect1CenterX > rect2CenterX && rect1CenterY < rect2CenterY) {
+ return 'right-top';
+ } else if (rect1CenterX > rect2CenterX && rect1CenterY > rect2CenterY) {
+ return 'right-bottom';
+ } else if (rect1CenterX < rect2CenterX && rect1CenterY > rect2CenterY) {
+ return 'left-bottom';
+ } else if (rect1CenterX < rect2CenterX && rect1CenterY === rect2CenterY) {
+ return 'left';
+ } else if (rect1CenterX > rect2CenterX && rect1CenterY === rect2CenterY) {
+ return 'right';
+ } else if (rect1CenterX === rect2CenterX && rect1CenterY < rect2CenterY) {
+ return 'top';
+ } else if (rect1CenterX === rect2CenterX && rect1CenterY > rect2CenterY) {
+ return 'bottom';
+ } else {
+ return 'overlap';
+ }
+};
+
+// 缩放宽度
+export const zoomWidth = (ratio: number, height: number): number => {
+ // w / height = ratio
+ return ratio * height
+}
+
+// 缩放高度
+export const zoomHeight = (ratio: number, width: number): number => {
+ // width / h = ratio
+ return width / ratio
+}
\ No newline at end of file
diff --git a/packages/mindmap/src/utils/Object.ts b/packages/mindmap/src/utils/Object.ts
new file mode 100644
index 0000000..768056b
--- /dev/null
+++ b/packages/mindmap/src/utils/Object.ts
@@ -0,0 +1,168 @@
+import { NodeData, TreeNode } from "../types"
+
+// 获取一个数据的类型
+export const getType = (data: any): string => {
+ return Object.prototype.toString.call(data).slice(8, -1)
+}
+
+// 判断一个数据是否是null和undefined和空字符串
+export const isUndef = (data: any): boolean => {
+ return data === null || data === undefined || data === ''
+}
+
+// 获取对象改变了的的属性
+export const getObjectChangedProps = (oldObject: Record, newObject: Record): Record => {
+ const res: Record = {}
+ Object.keys(newObject).forEach(prop => {
+ const oldVal = oldObject[prop]
+ const newVal = newObject[prop]
+ if (getType(oldVal) !== getType(newVal)) {
+ res[prop] = newVal
+ return
+ }
+ if (getType(oldVal) === 'Object') {
+ if (JSON.stringify(oldVal) !== JSON.stringify(newVal)) {
+ res[prop] = newVal
+ return
+ }
+ } else {
+ if (oldVal !== newVal) {
+ res[prop] = newVal
+ return
+ }
+ }
+ })
+ return res
+}
+
+// 判断两个对象是否相同,只处理对象或数组
+export const isSameObject = (a: any, b: any): boolean => {
+ const type = getType(a)
+ if (type !== getType(b)) return false
+ if (type === 'Object') {
+ const keysa = Object.keys(a)
+ const keysb = Object.keys(b)
+ if (keysa.length !== keysb.length) return false
+ for (let i = 0; i < keysa.length; i++) {
+ const key = keysa[i]
+ if (!keysb.includes(key)) return false
+ const isSame = isSameObject(a[key], b[key])
+ if (!isSame) {
+ return false
+ }
+ }
+ return true
+ } else if (type === 'Array') {
+ if (a.length !== b.length) return false
+ for (let i = 0; i < a.length; i++) {
+ const itema = a[i]
+ const itemb = b[i]
+ const typea = getType(itema)
+ const typeb = getType(itemb)
+ if (typea !== typeb) return false
+ const isSame = isSameObject(itema, itemb)
+ if (!isSame) {
+ return false
+ }
+ }
+ return true
+ } else {
+ return a === b
+ }
+}
+
+// 传入一个数据,如果该数据是数组,那么返回该数组,否则返回一个以该数据为成员的数组
+export const formatDataToArray = (data: T | T[]): T[] => {
+ if (!data) return []
+ return Array.isArray(data) ? data : [data]
+}
+
+// 极简的深拷贝
+export const simpleDeepClone = (data: T): T | null => {
+ try {
+ return JSON.parse(JSON.stringify(data))
+ } catch (error) {
+ return null
+ }
+}
+
+
+interface ObjectNode {
+ isRoot: boolean;
+ data: NodeData;
+ children: string[];
+}
+
+const _findParentUid = (data: Record, targetUid: string): string => {
+ const uids = Object.keys(data)
+ let res = ''
+ uids.forEach(uid => {
+ const children = data[uid].children
+ const isParent = children.findIndex(childUid => childUid === targetUid) !== -1
+ if (isParent) {
+ res = uid
+ }
+ })
+ return res
+}
+
+export const transformTreeDataToObject = (data: TreeNode): Record => {
+ const res: Record = {}
+ const walk = (root: TreeNode, parent: ObjectNode | null) => {
+ const uid = root.data.uid
+ if (parent) {
+ parent.children.push(uid)
+ }
+ res[uid] = {
+ isRoot: !parent,
+ data: {
+ ...root.data
+ },
+ children: []
+ }
+ if (root.children && root.children.length > 0) {
+ root.children.forEach(item => {
+ walk(item, res[uid])
+ })
+ }
+ }
+ walk(data, null)
+ return res
+}
+
+export const transformObjectToTreeData = (data: Record): TreeNode | null => {
+ const uids = Object.keys(data)
+ if (uids.length <= 0) return null
+ const rootKey = uids.find(uid => data[uid].isRoot)
+ if (!rootKey || !data[rootKey]) return null
+
+ const res: TreeNode = {
+ data: simpleDeepClone(data[rootKey].data) as TreeNode['data'],
+ children: []
+ }
+ const map: Record = {}
+ map[rootKey] = res
+
+ uids.forEach(uid => {
+ const parentUid = _findParentUid(data, uid)
+ const cur = data[uid]
+ const node: TreeNode = map[uid] || {
+ data: simpleDeepClone(cur.data) as TreeNode['data'],
+ children: []
+ }
+ if (!map[uid]) {
+ map[uid] = node
+ }
+ if (parentUid) {
+ const index = data[parentUid].children.findIndex(item => item === uid)
+ if (!map[parentUid]) {
+ map[parentUid] = {
+ data: simpleDeepClone(data[parentUid].data) as TreeNode['data'],
+ children: []
+ }
+ }
+ map[parentUid].children[index] = node
+ }
+ })
+ return res
+}
\ No newline at end of file
diff --git a/packages/mindmap/src/utils/Platform.ts b/packages/mindmap/src/utils/Platform.ts
new file mode 100644
index 0000000..a2beabd
--- /dev/null
+++ b/packages/mindmap/src/utils/Platform.ts
@@ -0,0 +1,17 @@
+// 判断是否是移动端环境
+export const isMobile = () => {
+ return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(
+ navigator.userAgent
+ )
+ }
+ // 检查navigator.clipboard对象的读取是否可用
+export const checkClipboardReadEnable = () => {
+ return navigator.clipboard && typeof navigator.clipboard.read === 'function'
+ }// 获取浏览器的chrome内核版本
+export const getChromeVersion = () => {
+ const match = navigator.userAgent.match(/\s+Chrome\/(.*)\s+/)
+ if (match && match[1]) {
+ return Number.parseFloat(match[1])
+ }
+ return ''
+ }
\ No newline at end of file
diff --git a/packages/mindmap/src/utils/Security.ts b/packages/mindmap/src/utils/Security.ts
new file mode 100644
index 0000000..e1a7551
--- /dev/null
+++ b/packages/mindmap/src/utils/Security.ts
@@ -0,0 +1,48 @@
+/**
+ * 防御 XSS 攻击,过滤恶意 HTML 标签和属性
+ * @param {string} text 需要过滤的文本
+ * @returns {string} 过滤后的文本
+ */
+export const defenseXSS = (text: string | number): string => {
+ text = String(text)
+
+ // 初始化结果变量
+ let result: string = text
+
+ // 使用正则表达式匹配 HTML 标签
+ const match: RegExpMatchArray | null = text.match(/<(\S*?)[^>]*>.*?|<.*? \/>/g)
+ if (match == null) {
+ // 如果没有匹配到任何标签,则直接返回原始文本
+ return text
+ }
+
+ // 遍历匹配到的标签
+ for (const value of match) {
+ // 定义白名单属性正则表达式(style、target、href)
+ const whiteAttrRegex: RegExp = new RegExp(/(style|target|href)=["'][^"']*["']/g)
+
+ // 定义黑名单href正则表达式(javascript:)
+ const aHrefBlackRegex: RegExp = new RegExp(/href=["']javascript:/g)
+
+ // 过滤 HTML 标签
+ const filterHtml: string = value.replace(
+ // 匹配属性键值对(如:key="value")
+ /([a-zA-Z-]+)\s*=\s*["']([^"']*)["']/g,
+ (text: string): string => {
+ // 如果属性值包含黑名单href或不在白名单中,则删除该属性
+ if (aHrefBlackRegex.test(text) || !whiteAttrRegex.test(text)) {
+ return ''
+ }
+
+ // 否则,保留该属性
+ return text
+ }
+ )
+
+ // 将过滤后的标签替换回原始文本
+ result = result.replace(value, filterHtml)
+ }
+
+ // 返回最终结果
+ return result
+}
\ No newline at end of file
diff --git a/packages/mindmap/src/utils/String.ts b/packages/mindmap/src/utils/String.ts
new file mode 100644
index 0000000..8d4171e
--- /dev/null
+++ b/packages/mindmap/src/utils/String.ts
@@ -0,0 +1,87 @@
+import { selfCloseTagList } from "../constants/constant"
+
+// 驼峰转连字符
+export const camelCaseToHyphen = (str: string): string => {
+ return str.replace(/([a-z])([A-Z])/g, (...args: string[]): string => {
+ return args[1] + '-' + args[2].toLowerCase()
+ })
+}
+
+// 检查一个字符串是否是富文本字符
+let checkIsRichTextEl: HTMLDivElement | null = null
+export const checkIsRichText = (str: string): boolean => {
+ if (!checkIsRichTextEl) {
+ checkIsRichTextEl = document.createElement('div')
+ }
+ checkIsRichTextEl.innerHTML = str
+ for (let c = checkIsRichTextEl.childNodes, i = c.length; i--;) {
+ if (c[i].nodeType === 1) return true
+ }
+ return false
+}
+
+// html转义
+export const htmlEscape = (str?: string): string => {
+ [
+ ['&', '&'],
+ ['<', '<'],
+ ['>', '>']
+ ].forEach((item: string[]) => {
+ str = str?.replace(new RegExp(item[0], 'g'), item[1])
+ })
+ return str || ''
+}
+
+// 给html自闭合标签添加闭合状态
+export const handleSelfCloseTags = (str: string): string => {
+ selfCloseTagList.forEach((tagName: string) => {
+ str = str.replaceAll(
+ new RegExp(`<${tagName}([^>]*)>`, 'g'),
+ `<${tagName} $1 />`
+ )
+ })
+ return str
+}
+
+// 从头html结构字符串里获取带换行符的字符串
+export const getStrWithBrFromHtml = (str: string): string => {
+ str = str.replace(/
/gim, '\n')
+ const el = document.createElement('div')
+ el.innerHTML = str
+ str = el.textContent || ''
+ return str
+}
+
+interface DataUrlResult {
+ type: string
+ base64: string
+}
+
+// 解析dataUrl
+export const parseDataUrl = (data: string): string | DataUrlResult => {
+ if (!/^data:/.test(data)) return data
+ const [typeStr, base64] = data.split(',')
+ const res = /^data:[^/]+\/([^;]+);/.exec(typeStr)
+ if (!res) throw new Error('Invalid data URL')
+ const type = res[1]
+ return {
+ type,
+ base64
+ }
+}
+
+// 将以空格分隔的字符串值转换成成数字/单位/值数组
+export const getNumberValueFromStr = (value: string | number) => {
+ let arr = String(value).split(/\s+/)
+ return arr.map(item => {
+ if (/^[\d.]+/.test(item)) {
+ // 数字+单位
+ let res = /^([\d.]+)(.*)$/.exec(item)
+ if (!res) return item
+ return [Number(res[1]), res[2]]
+ } else {
+ // 单个值
+ return item
+ }
+ })
+}
\ No newline at end of file
diff --git a/packages/mindmap/src/utils/Task.ts b/packages/mindmap/src/utils/Task.ts
new file mode 100644
index 0000000..5c7c8f9
--- /dev/null
+++ b/packages/mindmap/src/utils/Task.ts
@@ -0,0 +1,93 @@
+// 在下一个事件循环里执行任务
+export const nextTick = function (fn: Function, ctx?: any): () => void {
+ let pending = false;
+ let timerFunc: Function | null = null;
+ let handle = (): void => {
+ pending = false;
+ ctx ? fn.call(ctx) : fn();
+ };
+
+ // 支持MutationObserver接口的话使用MutationObserver
+ if (typeof MutationObserver !== 'undefined') {
+ let counter = 1;
+ let observer = new MutationObserver(handle);
+ let textNode = document.createTextNode(String(counter));
+ observer.observe(textNode, {
+ characterData: true // 设为 true 表示监视指定目标节点或子节点树中节点所包含的字符数据的变化
+ });
+ timerFunc = function (): void {
+ counter = (counter + 1) % 2; // counter会在0和1两者循环变化
+ textNode.data = String(counter); // 节点变化会触发回调handle
+ };
+ } else {
+ // 否则使用定时器
+ timerFunc = setTimeout;
+ }
+
+ return function (): void {
+ if (pending) return;
+ pending = true;
+ timerFunc(handle, 0);
+ };
+};
+
+// 节流函数
+export const throttle = any>(
+ fn: T,
+ time: number = 300,
+ ctx?: any
+): ((...args: Parameters) => void) => {
+ let timer: ReturnType | null = null;
+ return (...args: Parameters): void => {
+ if (timer) {
+ return;
+ }
+ timer = setTimeout(() => {
+ fn.call(ctx, ...args);
+ timer = null;
+ }, time);
+ };
+};
+
+// 防抖函数
+export const debounce = any>(
+ fn: T,
+ wait: number = 300,
+ ctx?: any
+): ((...args: Parameters) => void) => {
+ let timeout: ReturnType | null = null;
+
+ return (...args: Parameters): void => {
+ if (timeout) clearTimeout(timeout);
+ const callNow = !timeout;
+ timeout = setTimeout(() => {
+ timeout = null;
+ fn.apply(ctx, args);
+ }, wait);
+ if (callNow) fn.apply(ctx, args);
+ };
+};
+
+// 异步执行任务队列
+export const asyncRun = (
+ taskList: Array<() => void>,
+ callback: () => void = () => { }
+): void => {
+ let index = 0;
+ let len = taskList.length;
+ if (len <= 0) {
+ return callback();
+ }
+ let loop = (): void => {
+ if (index >= len) {
+ callback();
+ return;
+ }
+ taskList[index]();
+ setTimeout(() => {
+ index++;
+ loop();
+ }, 0);
+ };
+ loop();
+};
\ No newline at end of file
diff --git a/packages/mindmap/src/utils/Theme.ts b/packages/mindmap/src/utils/Theme.ts
new file mode 100644
index 0000000..5f0a4a8
--- /dev/null
+++ b/packages/mindmap/src/utils/Theme.ts
@@ -0,0 +1,128 @@
+import MersenneTwister from "./mersenneTwister"
+import { ThemeConfig } from "../theme"
+import { richTextSupportStyleList } from "../constants/constant"
+import merge from 'deepmerge'
+
+// 判断一个颜色是否是白色
+export const isWhite = (color: string): boolean => {
+ color = String(color).replaceAll(/\s+/g, '')
+ return (
+ ['#fff', '#ffffff', '#FFF', '#FFFFFF', 'rgb(255,255,255)'].includes(
+ color
+ ) || /rgba\(255,255,255,[^)]+\)/.test(color)
+ )
+}
+
+// 判断一个颜色是否是透明
+export const isTransparent = (color: string): boolean => {
+ color = String(color).replaceAll(/\s+/g, '')
+ return (
+ ['', 'transparent'].includes(color) || /rgba\(\d+,\d+,\d+,0\)/.test(color)
+ )
+}
+
+// 从当前主题里获取一个非透明非白色的颜色
+export const getVisibleColorFromTheme = (themeConfig: ThemeConfig): string | undefined => {
+ const { lineColor, root, second, node } = themeConfig
+ const list = [
+ lineColor,
+ root.fillColor,
+ root.color,
+ second.fillColor,
+ second.color,
+ node.fillColor,
+ node.color,
+ root.borderColor,
+ second.borderColor,
+ node.borderColor
+ ]
+ for (let i = 0; i < list.length; i++) {
+ const color = list[i]
+ if (!isTransparent(color) && !isWhite(color)) {
+ return color
+ }
+ }
+ return undefined
+}
+
+// 根据内容生成颜色
+export const generateColorByContent = (str: string): string => {
+ let hash = 0
+ for (let i = 0; i < str.length; i++) {
+ hash = str.charCodeAt(i) + ((hash << 5) - hash)
+ }
+ // 这里使用伪随机数的原因是因为
+ // 1. 如果字符串的内容差不多,根据hash生产的颜色就比较相近,不好区分,比如v1.1 v1.2,所以需要加入随机数来使得颜色能够区分开
+ // 2. 普通的随机数每次数值不一样,就会导致每次新增标签原来的标签颜色就会发生改变,所以加入了这个方法,使得内容不变随机数也不变
+ const rng = new MersenneTwister(hash)
+ const h = rng.genrand_int32() % 360
+ return 'hsla(' + h + ', 50%, 50%, 1)'
+}
+
+interface IconItem {
+ type: string
+ list: Array<{
+ name: string
+ icon: string
+ }>
+}
+
+export const mergerIconList = (list: IconItem[]): IconItem[] => {
+ return list.reduce((result: IconItem[], item) => {
+ const existingItem = result.find(x => x.type === item.type)
+ if (existingItem) {
+ item.list.forEach(newObj => {
+ const existingObj = existingItem.list.find(x => x.name === newObj.name)
+ if (existingObj) {
+ existingObj.icon = newObj.icon
+ } else {
+ existingItem.list.push(newObj)
+ }
+ })
+ } else {
+ result.push({ ...item })
+ }
+ return result
+ }, [])
+}
+
+// 合并主题配置
+export const mergeTheme = (dest: T, source: T): T => {
+ return merge(dest, source, {
+ arrayMerge: (_destinationArray: any[], sourceArray: any[]) => sourceArray
+ })
+}
+
+interface NodeStyle {
+ merge: (prop: string) => string | number
+}
+
+interface Node {
+ style: NodeStyle
+}
+
+// 获取节点实例的文本样式数据
+export const getNodeRichTextStyles = (node: Node): Record => {
+ const res: Record = {}
+ richTextSupportStyleList.forEach(prop => {
+ let value = node.style.merge(prop)
+ if (prop === 'fontSize') {
+ value = value + 'px'
+ }
+ res[prop] = String(value)
+ })
+ return res
+}
+
+export interface FontOptions {
+ italic?: boolean;
+ bold?: boolean;
+ fontSize: number;
+ fontFamily: string;
+}
+
+// 拼接font字符串
+export const joinFontStr = ({ italic, bold, fontSize, fontFamily }: FontOptions): string => {
+ return `${italic ? 'italic ' : ''} ${bold ? 'bold ' : ''
+ } ${fontSize}px ${fontFamily} `
+}
\ No newline at end of file
diff --git a/packages/mindmap/src/utils/Tools.ts b/packages/mindmap/src/utils/Tools.ts
new file mode 100644
index 0000000..e32a25a
--- /dev/null
+++ b/packages/mindmap/src/utils/Tools.ts
@@ -0,0 +1,160 @@
+import { DrawOptions } from "../types"
+import { getTextFromHtml } from "./Dom"
+import { checkClipboardReadEnable } from "./Platform"
+import { htmlEscape } from "./String"
+
+// 将数据设置到用户剪切板中
+export const setDataToClipboard = (data: any): void => {
+ if (navigator.clipboard && navigator.clipboard.writeText) {
+ navigator.clipboard.writeText(JSON.stringify(data))
+ }
+}
+
+// 从用户剪贴板中读取文字和图片
+export const getDataFromClipboard = async (): Promise<{
+ text: string | null,
+ img: Blob | null
+}> => {
+ let text: string | null = null
+ let img: Blob | null = null
+ if (checkClipboardReadEnable()) {
+ const items = await navigator.clipboard.read()
+ if (items && items.length > 0) {
+ for (const clipboardItem of items) {
+ for (const type of clipboardItem.types) {
+ if (/^image\//.test(type)) {
+ img = await clipboardItem.getType(type)
+ } else if (type === 'text/plain') {
+ const blob = await clipboardItem.getType(type)
+ text = await blob.text()
+ }
+ }
+ }
+ }
+ }
+ return {
+ text,
+ img
+ }
+}
+
+export const exitFullscreen = (): void => {
+ if (!document.fullscreenElement) return;
+ if (document.exitFullscreen) {
+ document.exitFullscreen();
+ } else if ((document as any).webkitExitFullscreen) {
+ (document as any).webkitExitFullscreen();
+ } else if ((document as any).mozCancelFullScreen) {
+ (document as any).mozCancelFullScreen();
+ }
+};
+
+// 全屏事件检测
+const getOnfullscreenEvent = (): string | undefined => {
+ if ((document.documentElement as any).requestFullscreen) {
+ return 'fullscreenchange';
+ } else if ((document.documentElement as any).webkitRequestFullscreen) {
+ return 'webkitfullscreenchange';
+ } else if ((document.documentElement as any).mozRequestFullScreen) {
+ return 'mozfullscreenchange';
+ } else if ((document.documentElement as any).msRequestFullscreen) {
+ return 'msfullscreenchange';
+ }
+ return undefined;
+};
+
+export const fullscreenEvent = getOnfullscreenEvent();
+
+// 全屏
+export const fullScreen = (element: Element): void => {
+ if (element.requestFullscreen) {
+ element.requestFullscreen();
+ } else if ((element as any).webkitRequestFullscreen) {
+ (element as any).webkitRequestFullscreen();
+ } else if ((element as any).mozRequestFullScreen) {
+ (element as any).mozRequestFullScreen();
+ }
+};
+
+interface SmmData {
+ simpleMindMap: boolean
+ data: any
+}
+
+// 创建smm粘贴的粘贴数据
+export const createSmmFormatData = (data: any): SmmData => {
+ return {
+ simpleMindMap: true,
+ data
+ }
+}
+
+// 检查是否是smm粘贴格式的数据
+export const checkSmmFormatData = (data: any): {
+ isSmm: boolean,
+ data: any
+} => {
+ let smmData: any = null
+ // 如果是字符串,则尝试解析为对象
+ if (typeof data === 'string') {
+ try {
+ const parsedData = JSON.parse(data)
+ // 判断是否是对象,且存在属性标志
+ if (typeof parsedData === 'object' && parsedData.simpleMindMap) {
+ smmData = parsedData.data
+ }
+ } catch (error) { }
+ } else if (typeof data === 'object' && data.simpleMindMap) {
+ // 否则如果是对象,则检查属性标志
+ smmData = data.data
+ }
+ const isSmm = !!smmData
+ return {
+ isSmm,
+ data: isSmm ? smmData : String(data)
+ }
+}
+
+// 处理输入框的粘贴事件,会去除文本的html格式、换行
+export const handleInputPasteText = (e: ClipboardEvent, text?: string): void => {
+ e.preventDefault()
+ const selection = window.getSelection()
+ if (!selection?.rangeCount) return
+ selection.deleteFromDocument()
+ text = text || e.clipboardData?.getData('text')
+ // 转义特殊字符
+ text = htmlEscape(text)
+ // 去除格式
+ text = getTextFromHtml(text)
+ const textArr = text.split(/\n/g)
+ const fragment = document.createDocumentFragment()
+ textArr.forEach((item, index) => {
+ const node = document.createTextNode(item)
+ fragment.appendChild(node)
+ if (index < textArr.length - 1) {
+ const br = document.createElement('br')
+ fragment.appendChild(br)
+ }
+ })
+ selection.getRangeAt(0).insertNode(fragment)
+ selection.collapseToEnd()
+}
+
+
+export const drawImage = (
+ ctx: CanvasRenderingContext2D,
+ image: CanvasImageSource,
+ drawOpt: DrawOptions
+): void => {
+ ctx.drawImage(
+ image,
+ drawOpt.sx,
+ drawOpt.sy,
+ drawOpt.swidth,
+ drawOpt.sheight,
+ drawOpt.x,
+ drawOpt.y,
+ drawOpt.width,
+ drawOpt.height
+ )
+}
\ No newline at end of file
diff --git a/packages/mindmap/src/utils/Tree.ts b/packages/mindmap/src/utils/Tree.ts
new file mode 100644
index 0000000..2e3d352
--- /dev/null
+++ b/packages/mindmap/src/utils/Tree.ts
@@ -0,0 +1,142 @@
+import { Node } from "../types";
+import { formatGetNodeGeneralization } from "./NodeTools"
+import { createUid } from "./Number";
+import { simpleDeepClone } from "./Object"
+
+
+
+type WalkCallback = (
+ node: Node,
+ parent: Node | null,
+ isRoot: boolean,
+ layerIndex: number,
+ index: number,
+ ancestors: Node[]
+) => boolean | void;
+
+type BFSCallback = (node: Node, parent: Node | null) => 'stop' | void;
+
+export const walk = (
+ root: Node,
+ parent: Node | null,
+ beforeCallback?: WalkCallback,
+ afterCallback?: WalkCallback,
+ isRoot: boolean = false,
+ layerIndex: number = 0,
+ index: number = 0,
+ ancestors: Node[] = []
+): void => {
+ let stop = false;
+ if (beforeCallback) {
+ stop = !!beforeCallback(root, parent, isRoot, layerIndex, index, ancestors);
+ }
+ if (!stop && root.children && root.children.length > 0) {
+ const _layerIndex = layerIndex + 1;
+ root.children.forEach((node, nodeIndex) => {
+ walk(
+ node,
+ root,
+ beforeCallback,
+ afterCallback,
+ false,
+ _layerIndex,
+ nodeIndex,
+ [...ancestors, root]
+ );
+ });
+ }
+ afterCallback?.call(null, root, parent, isRoot, layerIndex, index, ancestors);
+};
+
+export const bfsWalk = (root: Node, callback: BFSCallback): void => {
+ const stack: Node[] = [root];
+ let isStop = false;
+
+ if (callback(root, null) === 'stop') {
+ isStop = true;
+ }
+
+ while (stack.length) {
+ if (isStop) break;
+
+ const cur = stack.shift()!;
+ if (cur.children?.length) {
+ cur.children.forEach(item => {
+ if (isStop) return;
+ stack.push(item);
+ if (callback(item, cur) === 'stop') {
+ isStop = true;
+ }
+ });
+ }
+ }
+};
+
+export const copyRenderTree = (
+ tree: Node,
+ root: Node,
+ removeActiveState: boolean = false
+): Node => {
+ tree.data = simpleDeepClone(root.data);
+ if (removeActiveState) {
+ tree.data.isActive = false;
+ const generalizationList = formatGetNodeGeneralization(tree.data);
+ generalizationList.forEach(item => {
+ item.isActive = false;
+ });
+ }
+
+ tree.children = [];
+ if (root.children?.length > 0) {
+ root.children.forEach((item, index) => {
+ tree.children![index] = copyRenderTree({} as Node, item, removeActiveState);
+ });
+ }
+
+ Object.keys(root).forEach(key => {
+ if (!['data', 'children'].includes(key) && !/^_/.test(key)) {
+ tree[key] = root[key];
+ }
+ });
+
+ return tree;
+};
+
+export const copyNodeTree = (
+ tree: Node,
+ root: Node,
+ removeActiveState: boolean = false,
+ removeId: boolean = true
+): Node => {
+ const rootData = root.nodeData ? root.nodeData : root;
+ tree.data = simpleDeepClone((rootData as any).data);
+
+ if (removeId) {
+ delete tree.data.uid;
+ } else if (!tree.data.uid) {
+ tree.data.uid = createUid();
+ }
+
+ if (removeActiveState) {
+ tree.data.isActive = false;
+ }
+
+ tree.children = [];
+ if (root.children?.length > 0) {
+ root.children.forEach((item, index) => {
+ tree.children![index] = copyNodeTree({} as Node, item, removeActiveState, removeId);
+ });
+ } else if (root.nodeData?.children?.length > 0) {
+ root.nodeData.children.forEach((item, index) => {
+ tree.children![index] = copyNodeTree({} as Node, item, removeActiveState, removeId);
+ });
+ }
+
+ Object.keys(rootData).forEach(key => {
+ if (!['data', 'children'].includes(key) && !/^_/.test(key)) {
+ tree[key] = (rootData as any)[key];
+ }
+ });
+
+ return tree;
+};
\ No newline at end of file
diff --git a/packages/mindmap/src/utils/Version.ts b/packages/mindmap/src/utils/Version.ts
new file mode 100644
index 0000000..c5e2dd3
--- /dev/null
+++ b/packages/mindmap/src/utils/Version.ts
@@ -0,0 +1,22 @@
+// 判断两个版本号的关系
+/*
+a > b 返回 >
+a < b 返回 <
+a = b 返回 =
+*/
+export const compareVersion = (a: string | number, b: string | number): '>' | '<' | '=' => {
+ const aArr: string[] = String(a).split('.')
+ const bArr: string[] = String(b).split('.')
+ const max: number = Math.max(aArr.length, bArr.length)
+
+ for (let i = 0; i < max; i++) {
+ const ai: number = Number(aArr[i]) || 0
+ const bi: number = Number(bArr[i]) || 0
+ if (ai > bi) {
+ return '>'
+ } else if (ai < bi) {
+ return '<'
+ }
+ }
+ return '='
+}
\ No newline at end of file
diff --git a/packages/mindmap/src/utils/index.ts b/packages/mindmap/src/utils/index.ts
new file mode 100644
index 0000000..bce788b
--- /dev/null
+++ b/packages/mindmap/src/utils/index.ts
@@ -0,0 +1,20 @@
+export * from "./AutoMove"
+export * from "./BatchExecution"
+export * from "./Dom"
+export * from "./File"
+export * from "./Image"
+export * from "./Lru"
+export * from "./mersenneTwister"
+export * from "./NodeTools"
+export * from "./Nodes"
+export * from "./Number"
+export * from "./Object"
+export * from "./Platform"
+export * from "./Security"
+export * from "./simulateCSSBackgroundInCanvas"
+export * from "./String"
+export * from "./Task"
+export * from "./Theme"
+export * from "./Tools"
+export * from "./Tree"
+export * from "./Version"
diff --git a/packages/mindmap/src/utils/mersenneTwister.ts b/packages/mindmap/src/utils/mersenneTwister.ts
new file mode 100644
index 0000000..6cc5b92
--- /dev/null
+++ b/packages/mindmap/src/utils/mersenneTwister.ts
@@ -0,0 +1,123 @@
+/**
+ * @file Mersenne Twister 伪随机数生成器
+ * @description
+ * 这是一个基于 Mersenne Twister 算法的伪随机数生成器(PRNG)实现。
+ * 该生成器可以根据给定的种子值生成高质量的伪随机数序列。
+ *
+ * @usage
+ * 主要用于需要可重现随机数的场景,比如:
+ * 1. 基于内容哈希值作为种子,确保相同输入产生相同的随机序列
+ * 2. 游戏、模拟等需要可重复随机数的应用
+ * 3. 测试用例中需要稳定随机数的场景
+ */
+
+/**
+ * Mersenne Twister 伪随机数生成器类
+ * @class MersenneTwister
+ *
+ * @description
+ * 实现了 MT19937 算法,是一个周期为 2^19937-1 的伪随机数生成器
+ *
+ * @pattern 单例模式 - 每个种子对应一个独立的随机数序列
+ *
+ * @example
+ * ```typescript
+ * const mt = new MersenneTwister(12345);
+ * const randomNum = mt.genrand_int32();
+ * ```
+ */
+export default class MersenneTwister {
+ // MT19937 算法的常量参数
+ private readonly N: number = 624; // 状态向量长度
+ private readonly M: number = 397; // 中间点参数
+ private readonly MATRIX_A: number = 0x9908b0df; // 扭矩矩阵常量
+ private readonly UPPER_MASK: number = 0x80000000; // 最高位掩码(32位)
+ private readonly LOWER_MASK: number = 0x7fffffff; // 低31位掩码
+
+ // 内部状态
+ private mt: number[]; // 状态向量数组
+ private mti: number; // 当前状态索引
+
+ /**
+ * 构造函数
+ * @param seed - 随机数生成器的种子值
+ * @throws {Error} 当seed不是数字类型时抛出异常
+ */
+ constructor(seed: number) {
+ if (typeof seed !== 'number') {
+ throw new Error('种子值必须是数字类型');
+ }
+
+ this.mt = new Array(this.N);
+ this.mti = this.N + 1;
+
+ this.init_genrand(seed);
+ }
+
+ /**
+ * 使用种子初始化状态向量
+ * @param s - 初始化种子
+ * @private
+ */
+ private init_genrand(s: number): void {
+ this.mt[0] = s >>> 0;
+ for (this.mti = 1; this.mti < this.N; this.mti++) {
+ // 使用递推公式生成初始状态
+ s = this.mt[this.mti - 1] ^ (this.mt[this.mti - 1] >>> 30);
+ this.mt[this.mti] = (
+ ((((s & 0xffff0000) >>> 16) * 1812433253) << 16) +
+ (s & 0x0000ffff) * 1812433253 +
+ this.mti
+ ) >>> 0;
+ }
+ }
+
+ /**
+ * 生成一个32位的随机整数
+ * @returns 范围在[0, 2^32-1]之间的随机数
+ * @public
+ */
+ public genrand_int32(): number {
+ let y: number;
+ const mag01: number[] = [0x0, this.MATRIX_A];
+
+ // 需要重新生成状态向量
+ if (this.mti >= this.N) {
+ let kk: number;
+
+ // 如果没有初始化,使用默认种子
+ if (this.mti === this.N + 1) {
+ this.init_genrand(5489);
+ }
+
+ // 更新状态向量的前半部分
+ for (kk = 0; kk < this.N - this.M; kk++) {
+ y = (this.mt[kk] & this.UPPER_MASK) | (this.mt[kk + 1] & this.LOWER_MASK);
+ this.mt[kk] = this.mt[kk + this.M] ^ (y >>> 1) ^ mag01[y & 0x1];
+ }
+
+ // 更新状态向量的后半部分
+ for (; kk < this.N - 1; kk++) {
+ y = (this.mt[kk] & this.UPPER_MASK) | (this.mt[kk + 1] & this.LOWER_MASK);
+ this.mt[kk] = this.mt[kk + (this.M - this.N)] ^ (y >>> 1) ^ mag01[y & 0x1];
+ }
+
+ // 处理最后一个元素
+ y = (this.mt[this.N - 1] & this.UPPER_MASK) | (this.mt[0] & this.LOWER_MASK);
+ this.mt[this.N - 1] = this.mt[this.M - 1] ^ (y >>> 1) ^ mag01[y & 0x1];
+
+ this.mti = 0;
+ }
+
+ // 获取下一个随机数
+ y = this.mt[this.mti++];
+
+ // Tempering变换提升随机性
+ y ^= y >>> 11;
+ y ^= (y << 7) & 0x9d2c5680;
+ y ^= (y << 15) & 0xefc60000;
+ y ^= y >>> 18;
+
+ return y >>> 0;
+ }
+}
\ No newline at end of file
diff --git a/packages/mindmap/src/utils/simulateCSSBackgroundInCanvas.ts b/packages/mindmap/src/utils/simulateCSSBackgroundInCanvas.ts
new file mode 100644
index 0000000..f429766
--- /dev/null
+++ b/packages/mindmap/src/utils/simulateCSSBackgroundInCanvas.ts
@@ -0,0 +1,351 @@
+import { DrawOptions } from "../types";
+import { zoomHeight, zoomWidth } from "./Number"
+import { getNumberValueFromStr } from "./String"
+import { drawImage } from "./Tools"
+
+
+// 关键词到百分比值的映射
+const keyWordToPercentageMap: Record = {
+ left: 0,
+ top: 0,
+ center: 50,
+ bottom: 100,
+ right: 100
+}
+
+interface HandleBackgroundSizeParams {
+ backgroundSize: string;
+ drawOpt: DrawOptions;
+ imageRatio: number;
+ canvasWidth: number;
+ canvasHeight: number;
+ canvasRatio: number;
+}
+
+
+const handleBackgroundSize = ({
+ backgroundSize,
+ drawOpt,
+ imageRatio,
+ canvasWidth,
+ canvasHeight,
+ canvasRatio
+}: HandleBackgroundSizeParams): void => {
+ if (backgroundSize) {
+ // 将值转换成数组
+ const backgroundSizeValueArr = getNumberValueFromStr(backgroundSize);
+
+ // 两个值都为auto,那就相当于不设置
+ if (
+ backgroundSizeValueArr[0] === 'auto' &&
+ backgroundSizeValueArr[1] === 'auto'
+ ) {
+ return;
+ }
+
+ // 值为cover
+ if (backgroundSizeValueArr[0] === 'cover') {
+ if (imageRatio > canvasRatio) {
+ drawOpt.height = canvasHeight;
+ drawOpt.width = zoomWidth(imageRatio, canvasHeight);
+ } else {
+ drawOpt.width = canvasWidth;
+ drawOpt.height = zoomHeight(imageRatio, canvasWidth);
+ }
+ return;
+ }
+
+ // 值为contain
+ if (backgroundSizeValueArr[0] === 'contain') {
+ if (imageRatio > canvasRatio) {
+ drawOpt.width = canvasWidth;
+ drawOpt.height = zoomHeight(imageRatio, canvasWidth);
+ } else {
+ drawOpt.height = canvasHeight;
+ drawOpt.width = zoomWidth(imageRatio, canvasHeight);
+ }
+ return;
+ }
+
+ // 图片宽度
+ let newNumberWidth: number = -1;
+ if (backgroundSizeValueArr[0]) {
+ if (Array.isArray(backgroundSizeValueArr[0])) {
+ // 数字+单位类型
+ if (backgroundSizeValueArr[0][1] === '%') {
+ // %单位
+ drawOpt.width = (backgroundSizeValueArr[0][0] as number / 100) * canvasWidth;
+ newNumberWidth = drawOpt.width;
+ } else {
+ // 其他都认为是px单位
+ drawOpt.width = backgroundSizeValueArr[0][0] as number
+ newNumberWidth = backgroundSizeValueArr[0][0] as number
+ }
+ } else if (backgroundSizeValueArr[0] === 'auto') {
+ // auto类型,那么根据设置的新高度以图片原宽高比进行自适应
+ if (backgroundSizeValueArr[1] && Array.isArray(backgroundSizeValueArr[1])) {
+ if (backgroundSizeValueArr[1][1] === '%') {
+ // 高度为%单位
+ drawOpt.width = zoomWidth(
+ imageRatio,
+ (backgroundSizeValueArr[1][0] as number / 100) * canvasHeight
+ );
+ } else {
+ // 其他都认为是px单位
+ drawOpt.width = zoomWidth(imageRatio, backgroundSizeValueArr[1][0] as number);
+ }
+ }
+ }
+ }
+
+ // 设置了图片高度
+ if (backgroundSizeValueArr[1] && Array.isArray(backgroundSizeValueArr[1])) {
+ // 数字+单位类型
+ if (backgroundSizeValueArr[1][1] === '%') {
+ // 高度为%单位
+ drawOpt.height = (backgroundSizeValueArr[1][0] as number / 100) * canvasHeight;
+ } else {
+ // 其他都认为是px单位
+ drawOpt.height = backgroundSizeValueArr[1][0] as number;
+ }
+ } else if (newNumberWidth !== -1) {
+ // 没有设置图片高度或者设置为auto,那么根据设置的新宽度以图片原宽高比进行自适应
+ drawOpt.height = zoomHeight(imageRatio, newNumberWidth);
+ }
+ }
+};
+
+interface BackgroundPositionOptions {
+ backgroundPosition: string;
+ drawOpt: DrawOptions;
+ imgWidth: number;
+ imgHeight: number;
+ canvasWidth: number;
+ canvasHeight: number;
+}
+
+interface BackgroundRepeatOptions {
+ ctx: CanvasRenderingContext2D;
+ image: HTMLImageElement;
+ backgroundRepeat: string;
+ drawOpt: DrawOptions;
+ imgWidth: number;
+ imgHeight: number;
+ canvasWidth: number;
+ canvasHeight: number;
+}
+
+
+
+// 模拟background-position
+const handleBackgroundPosition = ({
+ backgroundPosition,
+ drawOpt,
+ imgWidth,
+ imgHeight,
+ canvasWidth,
+ canvasHeight
+}: BackgroundPositionOptions): void => {
+ if (backgroundPosition) {
+ // 将值转换成数组
+ let backgroundPositionValueArr = getNumberValueFromStr(backgroundPosition)
+ // 将关键词转为百分比
+ backgroundPositionValueArr = backgroundPositionValueArr.map(item => {
+ if (typeof item === 'string') {
+ return keyWordToPercentageMap[item] !== undefined
+ ? [keyWordToPercentageMap[item], '%']
+ : item
+ }
+ return item
+ })
+ if (Array.isArray(backgroundPositionValueArr[0])) {
+ if (backgroundPositionValueArr.length === 1) {
+ // 如果只设置了一个值,第二个默认为50%
+ backgroundPositionValueArr.push([50, '%'])
+ }
+ // 水平位置
+ if (backgroundPositionValueArr[0][1] === '%') {
+ // 单位为%
+ let canvasX = (backgroundPositionValueArr[0][0] as number / 100) * canvasWidth
+ let imgX = (backgroundPositionValueArr[0][0] as number / 100) * imgWidth
+ // 计算差值
+ drawOpt.x = canvasX - imgX
+ } else {
+ // 其他单位默认都为px
+ drawOpt.x = backgroundPositionValueArr[0][0] as number
+ }
+ // 垂直位置
+ if (backgroundPositionValueArr[1][1] === '%') {
+ // 单位为%
+ let canvasY = (backgroundPositionValueArr[1][0] as number / 100) * canvasHeight
+ let imgY = (backgroundPositionValueArr[1][0] as number / 100) * imgHeight
+ // 计算差值
+ drawOpt.y = canvasY - imgY
+ } else {
+ // 其他单位默认都为px
+ drawOpt.x = backgroundPositionValueArr[0][0] as number
+ }
+ }
+ }
+}
+
+// 模拟background-repeat
+const handleBackgroundRepeat = ({
+ ctx,
+ image,
+ backgroundRepeat,
+ drawOpt,
+ imgWidth,
+ imgHeight,
+ canvasWidth,
+ canvasHeight
+}: BackgroundRepeatOptions): boolean | void => {
+ if (backgroundRepeat) {
+ // 保存在handleBackgroundPosition中计算出来的x、y
+ let ox = drawOpt.x
+ let oy = drawOpt.y
+ // 计算ox和oy能平铺的图片数量
+ let oxRepeatNum = Math.ceil(ox / imgWidth)
+ let oyRepeatNum = Math.ceil(oy / imgHeight)
+ // 计算ox和oy第一张图片的位置
+ let oxRepeatX = ox - oxRepeatNum * imgWidth
+ let oxRepeatY = oy - oyRepeatNum * imgHeight
+ // 将值转换成数组
+ let backgroundRepeatValueArr = getNumberValueFromStr(backgroundRepeat)
+ // 不处理
+ if (
+ backgroundRepeatValueArr[0] === 'no-repeat' ||
+ (imgWidth >= canvasWidth && imgHeight >= canvasHeight)
+ ) {
+ return
+ }
+ // 水平平铺
+ if (backgroundRepeatValueArr[0] === 'repeat-x') {
+ if (canvasWidth > imgWidth) {
+ let x = oxRepeatX
+ while (x < canvasWidth) {
+ drawImage(ctx, image, {
+ ...drawOpt,
+ x
+ })
+ x += imgWidth
+ }
+ return true
+ }
+ }
+ // 垂直平铺
+ if (backgroundRepeatValueArr[0] === 'repeat-y') {
+ if (canvasHeight > imgHeight) {
+ let y = oxRepeatY
+ while (y < canvasHeight) {
+ drawImage(ctx, image, {
+ ...drawOpt,
+ y
+ })
+ y += imgHeight
+ }
+ return true
+ }
+ }
+ // 平铺
+ if (backgroundRepeatValueArr[0] === 'repeat') {
+ let x = oxRepeatX
+ while (x < canvasWidth) {
+ if (canvasHeight > imgHeight) {
+ let y = oxRepeatY
+ while (y < canvasHeight) {
+ drawImage(ctx, image, {
+ ...drawOpt,
+ x,
+ y
+ })
+ y += imgHeight
+ }
+ }
+ x += imgWidth
+ }
+ return true
+ }
+ }
+}
+
+interface DrawBackgroundImageOptions {
+ backgroundSize: string;
+ backgroundPosition: string;
+ backgroundRepeat: string;
+}
+
+const drawBackgroundImageToCanvas = (
+ ctx: CanvasRenderingContext2D,
+ width: number,
+ height: number,
+ img: string,
+ { backgroundSize, backgroundPosition, backgroundRepeat }: DrawBackgroundImageOptions,
+ callback: (error?: Error) => void = () => { }
+): void => {
+ // 画布的长宽比
+ let canvasRatio = width / height
+ // 加载图片
+ let image = new Image()
+ image.src = img
+ image.onload = () => {
+ // 图片的宽度及长宽比
+ let imgWidth = image.width
+ let imgHeight = image.height
+ let imageRatio = imgWidth / imgHeight
+ // 绘制图片
+ // drawImage方法的参数值
+ let drawOpt: DrawOptions = {
+ sx: 0,
+ sy: 0,
+ swidth: imgWidth,
+ sheight: imgHeight,
+ x: 0,
+ y: 0,
+ width: imgWidth,
+ height: imgHeight
+ }
+ // 模拟background-size
+ handleBackgroundSize({
+ backgroundSize,
+ drawOpt,
+ imageRatio,
+ canvasWidth: width,
+ canvasHeight: height,
+ canvasRatio
+ })
+
+ // 模拟background-position
+ handleBackgroundPosition({
+ backgroundPosition,
+ drawOpt,
+ imgWidth: drawOpt.width,
+ imgHeight: drawOpt.height,
+ canvasWidth: width,
+ canvasHeight: height,
+ })
+
+ // 模拟background-repeat
+ let notNeedDraw = handleBackgroundRepeat({
+ ctx,
+ image,
+ backgroundRepeat,
+ drawOpt,
+ imgWidth: drawOpt.width,
+ imgHeight: drawOpt.height,
+ canvasWidth: width,
+ canvasHeight: height,
+ })
+
+ // 绘制图片
+ if (!notNeedDraw) {
+ drawImage(ctx, image, drawOpt)
+ }
+
+ callback()
+ }
+ image.addEventListener('error', (e: ErrorEvent) => {
+ callback(e.error);
+ });
+}
+export default drawBackgroundImageToCanvas
diff --git a/packages/mindmap/src/utils/xmind.js b/packages/mindmap/src/utils/xmind.js
new file mode 100644
index 0000000..0477022
--- /dev/null
+++ b/packages/mindmap/src/utils/xmind.js
@@ -0,0 +1,244 @@
+import {
+ getImageSize,
+ imgToDataUrl,
+ parseDataUrl,
+ getTextFromHtml,
+ createUid
+} from './index'
+import { formatGetNodeGeneralization } from './index'
+
+// 解析出新xmind的概要文本
+export const getSummaryText = (node, topicId) => {
+ if (node.children.summary && node.children.summary.length > 0) {
+ for (let i = 0; i < node.children.summary.length; i++) {
+ const cur = node.children.summary[i]
+ if (cur.id === topicId) {
+ return cur.title
+ }
+ }
+ }
+}
+
+// 解析出旧xmind的概要文本
+export const getSummaryText2 = (item, topicId) => {
+ const summaryElements = getElementsByType(item.elements, 'summary')
+ if (summaryElements && summaryElements && summaryElements.length > 0) {
+ for (let i = 0; i < summaryElements.length; i++) {
+ const cur = summaryElements[i]
+ if (cur.attributes.id === topicId) {
+ return cur.elements &&
+ cur.elements[0] &&
+ cur.elements[0].elements &&
+ cur.elements[0].elements[0]
+ ? cur.elements[0].elements[0].text
+ : ''
+ }
+ }
+ }
+ return ''
+}
+
+// 解析旧版xmind数据时,找出根节点
+export const getRoot = list => {
+ let root = null
+ const walk = arr => {
+ if (!arr) return
+ for (let i = 0; i < arr.length; i++) {
+ if (!root && arr[i].name === 'topic') {
+ root = arr[i]
+ return
+ }
+ }
+ arr.forEach(item => {
+ walk(item.elements)
+ })
+ }
+ walk(list)
+ return root
+}
+
+// 解析旧版xmind数据,从一个数组中根据name找出该项
+export const getItemByName = (arr, name) => {
+ return arr.find(item => {
+ return item.name === name
+ })
+}
+
+// 解析旧版xmind数据,从一个数组中根据attributes.type找出该项
+export const getElementsByType = (arr, type) => {
+ return arr.find(el => {
+ return el.attributes.type === type
+ }).elements
+}
+
+// 解析xmind数据,将概要转换为smm支持的结构
+export const addSummaryData = (selfList, childrenList, getText, range) => {
+ const summaryData = {
+ expand: true,
+ isActive: false,
+ text: getText(),
+ range: null
+ }
+ const match = range.match(/\((\d+),(\d+)\)/)
+ if (match) {
+ const startIndex = Number(match[1])
+ const endIndex = Number(match[2])
+ if (startIndex === endIndex) {
+ childrenList[startIndex] = summaryData
+ } else {
+ summaryData.range = [startIndex, endIndex]
+ selfList.push(summaryData)
+ }
+ } else {
+ selfList.push(summaryData)
+ }
+}
+
+// 解析xmind数据时,解析其中的图片数据
+export const handleNodeImageFromXmind = async (
+ node,
+ newNode,
+ promiseList,
+ files
+) => {
+ if (node.image && /\.(jpg|jpeg|png|gif|webp)$/.test(node.image.src)) {
+ // 处理异步逻辑
+ let resolve = null
+ const promise = new Promise(_resolve => {
+ resolve = _resolve
+ })
+ promiseList.push(promise)
+ try {
+ // 读取图片
+ const imageType = /\.([^.]+)$/.exec(node.image.src)[1]
+ const imageBase64 =
+ `data:image/${imageType};base64,` +
+ (await files['resources/' + node.image.src.split('/')[1]].async(
+ 'base64'
+ ))
+ newNode.data.image = imageBase64
+ // 如果图片尺寸不存在
+ if (!node.image.width && !node.image.height) {
+ const imageSize = await getImageSize(imageBase64)
+ newNode.data.imageSize = {
+ width: imageSize.width,
+ height: imageSize.height
+ }
+ } else {
+ newNode.data.imageSize = {
+ width: node.image.width,
+ height: node.image.height
+ }
+ }
+ resolve()
+ } catch (error) {
+ console.log(error)
+ resolve()
+ }
+ }
+}
+
+// 导出为xmind时,处理图片数据
+export const handleNodeImageToXmind = async (
+ node,
+ newData,
+ promiseList,
+ imageList
+) => {
+ if (node.data.image) {
+ // 处理异步逻辑
+ let resolve = null
+ let promise = new Promise(_resolve => {
+ resolve = _resolve
+ })
+ promiseList.push(promise)
+ try {
+ let imgName = ''
+ let imgData = node.data.image
+ // base64之外的其他图片要先转换成data:url
+ if (!/^data:/.test(node.data.image)) {
+ imgData = await imgToDataUrl(node.data.image)
+ }
+ // 从data:url中解析出图片类型和ase64
+ let dataUrlRes = parseDataUrl(imgData)
+ imgName = 'image_' + imageList.length + '.' + dataUrlRes.type
+ imageList.push({
+ name: imgName,
+ data: dataUrlRes.base64
+ })
+ newData.image = {
+ src: 'xap:resources/' + imgName,
+ width: node.data.imageSize.width,
+ height: node.data.imageSize.height
+ }
+ resolve()
+ } catch (error) {
+ console.log(error)
+ resolve()
+ }
+ }
+}
+
+export const getXmindContentXmlData = () => {
+ return ` Warning 警告 Attention Warnung 경고 This file can not be opened normally, please do not modify and save, otherwise the contents will be permanently lost! You can try using XMind 8 Update 3 or later version to open 该文件无法正常打开,请勿修改并保存,否则文件内容将会永久性丢失! 你可以尝试使用 XMind 8 Update 3 或更新版本打开 該文件無法正常打開,請勿修改並保存,否則文件內容將會永久性丟失! 你可以嘗試使用 XMind 8 Update 3 或更新版本打開 この文書は正常に開かないので、修正して保存しないようにしてください。そうでないと、書類の内容が永久に失われます。! XMind 8 Update 3 や更新版を使って開くこともできます Datei kann nicht richtig geöffnet werden. Bitte ändern Sie diese Datei nicht und speichern Sie sie, sonst wird die Datei endgültig gelöscht werden. Bitte versuchen Sie, diese Datei mit XMind 8 Update 3 oder später zu öffnen. Ce fichier ne peut pas ouvert normalement, veuillez le rédiger et sauvegarder, sinon le fichier sera perdu en permanence. Vous pouvez essayer d'ouvrir avec XMind 8 Update 3 ou avec une version plus récente. 파일을 정상적으로 열 수 없으며, 수정 및 저장하지 마십시오. 그렇지 않으면 파일의 내용이 영구적으로 손실됩니다! XMind 8 Update 3 또는 이후 버전을 사용하여 -1 Sheet 1 `
+}
+
+// 获取节点自身的概要,非子节点区间
+const getSelfGeneralization = data => {
+ const list = formatGetNodeGeneralization(data)
+ return list.filter(item => {
+ return !item.range || item.range.length <= 0
+ })
+}
+
+// 获取节点区间概要
+const getRangeGeneralization = data => {
+ const list = formatGetNodeGeneralization(data)
+ return list.filter(item => {
+ return item.range && item.range.length > 0
+ })
+}
+
+// 导出为xmind时,将概要转换为xmind的格式
+export const parseNodeGeneralizationToXmind = node => {
+ const summary = []
+ const summaries = []
+ const collectSummary = (item, startIndex, endIndex) => {
+ const summaryTopicId = createUid()
+ const summaryTitle = getTextFromHtml(item.text)
+ summary.push({
+ id: summaryTopicId,
+ title: summaryTitle,
+ attributedTitle: [
+ {
+ text: summaryTitle
+ }
+ ]
+ })
+ summaries.push({
+ id: createUid(),
+ range: '(' + startIndex + ',' + endIndex + ')',
+ topicId: summaryTopicId
+ })
+ }
+ // 在xmind中,概要都是保存在父节点的
+ // 而在simple-mind-map中,区间概要保存在父节点中,不带区间的保存在自身
+ // 所以先要过滤出自身的区间概要
+ const generalizationList = getRangeGeneralization(node.data)
+ generalizationList.forEach(item => {
+ collectSummary(item, item.range[0], item.range[1])
+ })
+
+ // 遍历子节点,找出子节点自身的概要
+ ; (node.children || []).forEach((child, childIndex) => {
+ const list = getSelfGeneralization(child.data)
+ list.forEach(item => {
+ collectSummary(item, childIndex, childIndex)
+ })
+ })
+
+ return {
+ summary,
+ summaries
+ }
+}
diff --git a/packages/mindmap/tsconfig.json b/packages/mindmap/tsconfig.json
new file mode 100644
index 0000000..0f7bc76
--- /dev/null
+++ b/packages/mindmap/tsconfig.json
@@ -0,0 +1,43 @@
+{
+ "compilerOptions": {
+ "target": "es2022",
+ "module": "esnext",
+ "allowJs": true,
+ "lib": [
+ "DOM",
+ "es2022",
+ "DOM.Iterable"
+ ],
+ "declaration": true,
+ "declarationMap": true,
+ "sourceMap": true,
+ "moduleResolution": "node",
+ "removeComments": true,
+ "skipLibCheck": true,
+ "strict": true,
+ "strictNullChecks": false,
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "esModuleInterop": true,
+ "noUnusedLocals": false,
+ "noUnusedParameters": false,
+ "noImplicitReturns": false,
+ "noFallthroughCasesInSwitch": false,
+ "noUncheckedIndexedAccess": false,
+ "noImplicitOverride": false,
+ "noPropertyAccessFromIndexSignature": false,
+ "outDir": "dist",
+ "incremental": true,
+ "tsBuildInfoFile": "./dist/tsconfig.tsbuildinfo"
+ },
+ "include": [
+ "src"
+ ],
+ "exclude": [
+ "node_modules",
+ "dist",
+ "**/*.test.ts",
+ "**/*.spec.ts",
+ "**/__tests__"
+ ]
+}
\ No newline at end of file
diff --git a/packages/mindmap/tsup.config.ts b/packages/mindmap/tsup.config.ts
new file mode 100644
index 0000000..79af640
--- /dev/null
+++ b/packages/mindmap/tsup.config.ts
@@ -0,0 +1,12 @@
+import { defineConfig } from 'tsup'
+
+export default defineConfig({
+ entry: ['src/index.ts'],
+ format: ['esm', 'cjs'],
+ dts: true,
+ clean: true,
+ sourcemap: true,
+ minify: true,
+ bundle: true,
+ target: "esnext"
+})
\ No newline at end of file
diff --git a/packages/ui/package.json b/packages/ui/package.json
new file mode 100644
index 0000000..f057e65
--- /dev/null
+++ b/packages/ui/package.json
@@ -0,0 +1,38 @@
+{
+ "name": "@nice/ui",
+ "version": "1.0.0",
+ "main": "./dist/index.js",
+ "module": "./dist/index.mjs",
+ "types": "./dist/index.d.ts",
+ "private": true,
+ "scripts": {
+ "build": "tsup",
+ "dev": "tsup --watch",
+ "clean": "rimraf dist",
+ "typecheck": "tsc --noEmit"
+ },
+ "dependencies": {
+ "@dagrejs/dagre": "^1.1.4",
+ "@nice/utils": "workspace:^",
+ "@xyflow/react": "^12.3.6",
+ "dagre": "^0.8.5",
+ "nanoid": "^5.0.9",
+ "react-hotkeys-hook": "^4.6.1",
+ "zustand": "^5.0.3"
+ },
+ "peerDependencies": {
+ "react": "18.2.0",
+ "react-dom": "18.2.0"
+ },
+ "devDependencies": {
+ "@types/dagre": "^0.7.52",
+ "@types/node": "^20.3.1",
+ "@types/react": "18.2.38",
+ "@types/react-dom": "18.2.15",
+ "concurrently": "^8.0.0",
+ "rimraf": "^6.0.1",
+ "ts-node": "^10.9.1",
+ "tsup": "^8.3.5",
+ "typescript": "^5.5.4"
+ }
+}
\ No newline at end of file
diff --git a/packages/ui/src/components/mindmap/MindMap.tsx b/packages/ui/src/components/mindmap/MindMap.tsx
new file mode 100644
index 0000000..24cb3a2
--- /dev/null
+++ b/packages/ui/src/components/mindmap/MindMap.tsx
@@ -0,0 +1,90 @@
+import { useCallback, useState, useRef, useEffect } from 'react';
+import {
+ ReactFlow,
+ Controls,
+ Background,
+ useReactFlow,
+ Panel,
+ ReactFlowProvider,
+ NodeOrigin,
+ ConnectionLineType,
+ useStoreApi,
+ InternalNode,
+} from '@xyflow/react';
+import MindMapNode from './MindMapNode';
+import useMindMapStore, { RFState } from './store';
+import { shallow, useShallow } from 'zustand/shallow';
+import MindMapEdge from './MindMapEdge';
+import '@xyflow/react/dist/style.css';
+import { useFlowKeyboardControls } from './hooks/useFlowKeyboardControl';
+
+const selector = (state: RFState) => ({
+ nodes: state.nodes,
+ edges: state.edges,
+ onNodesChange: state.onNodesChange,
+ onEdgesChange: state.onEdgesChange,
+ addChildNode: state.addChildNode,
+ addSiblingNode: state.addSiblingNode,
+ selectedNodeId: state.selectedNodeId,
+ setSelectedNodeIdId: state.setSelectedNodeId,
+ undo: state.undo,
+ redo: state.redo,
+ canUndo: state.canUndo,
+ canRedo: state.canRedo
+
+});
+const nodeOrigin: NodeOrigin = [0.5, 0.5];
+// 节点类型定义
+const nodeTypes = {
+ mindmap: MindMapNode,
+};
+
+const edgeTypes = {
+ mindmap: MindMapEdge,
+};
+const connectionLineStyle = {
+ stroke: '#999',
+ strokeWidth: 2,
+ radius: 20 // Add corner radius for orthogonal lines
+};
+
+const defaultEdgeOptions = {
+ style: connectionLineStyle,
+ type: 'mindmap',
+ animated: false
+};
+export function Flow() {
+ const { nodes, edges, onNodesChange, undo, redo, setSelectedNodeIdId, onEdgesChange, addChildNode, addSiblingNode, selectedNodeId } = useMindMapStore(
+ useShallow(selector)
+ );
+ useFlowKeyboardControls()
+ return (
+
+
+
+ React Flow Mind Map
+
+ );
+}
+export function MindMap() {
+ return
+
+
+}
\ No newline at end of file
diff --git a/packages/ui/src/components/mindmap/MindMapEdge.tsx b/packages/ui/src/components/mindmap/MindMapEdge.tsx
new file mode 100644
index 0000000..b67bc3a
--- /dev/null
+++ b/packages/ui/src/components/mindmap/MindMapEdge.tsx
@@ -0,0 +1,16 @@
+import { BaseEdge, EdgeProps, getBezierPath, getStraightPath } from '@xyflow/react';
+
+function MindMapEdge(props: EdgeProps) {
+ const { sourceX, sourceY, targetX, targetY } = props;
+
+ const [edgePath] = getBezierPath({
+ sourceX,
+ sourceY,
+ targetX,
+ targetY,
+ });
+
+ return ;
+}
+
+export default MindMapEdge;
\ No newline at end of file
diff --git a/packages/ui/src/components/mindmap/MindMapNode.tsx b/packages/ui/src/components/mindmap/MindMapNode.tsx
new file mode 100644
index 0000000..aff0ba1
--- /dev/null
+++ b/packages/ui/src/components/mindmap/MindMapNode.tsx
@@ -0,0 +1,83 @@
+import { Handle, NodeProps, Position, useEdges } from '@xyflow/react';
+import { MindMapNodeType } from './types';
+import useMindMapStore, { RFState } from './store';
+import { useEffect, useRef, useState } from 'react';
+import { useShallow } from 'zustand/shallow';
+import { useClickOutside } from '../../hooks/useClickOutside';
+import { useHotkeys } from 'react-hotkeys-hook';
+const selector = (state: RFState) => ({
+ selectedNodeId: state.selectedNodeId,
+ editingNodeId: state.editingNodeId,
+ updateNodeLabel: state.updateNodeLabel,
+ setSelectedNodeId: state.setSelectedNodeId,
+ setEditingNodeId: state.setEditingNodeId
+
+});
+function MindMapNode({ id, data }: NodeProps) {
+ const nodeRef = useRef(null);
+ const inputRef = useRef(null);
+ const [inputValue, setInputValue] = useState(data.label);
+
+ const {
+ updateNodeLabel,
+ selectedNodeId,
+ setSelectedNodeId,
+ setEditingNodeId,
+ editingNodeId
+ } = useMindMapStore(useShallow(selector));
+ useEffect(() => {
+ if (editingNodeId === id) {
+ setEditingNodeId(id);
+ setInputValue(data.label);
+ setTimeout(() => {
+ inputRef.current?.focus();
+ inputRef.current?.select();
+ }, 0);
+ } else {
+ inputRef.current?.blur()
+ }
+ }, [editingNodeId])
+ const handleDoubleClick = (e: React.MouseEvent) => {
+ e.stopPropagation();
+ setEditingNodeId(id)
+ };
+
+ useHotkeys("space", (e) => {
+ if (selectedNodeId === id)
+ setEditingNodeId(id)
+ }, { preventDefault: true });
+ const handleClick = (e: React.MouseEvent) => {
+ setSelectedNodeId(id);
+ };
+
+ useClickOutside(nodeRef, () => {
+ console.log(selectedNodeId, id)
+ if (selectedNodeId === id)
+ setSelectedNodeId(null)
+ if (editingNodeId === id) {
+ setEditingNodeId(null)
+ updateNodeLabel(id, inputValue)
+ }
+ });
+
+ return (
+
+ setInputValue(e.target.value)}
+ className="input"
+ readOnly={id !== editingNodeId}
+ />
+
+
+
+ );
+}
+
+export default MindMapNode;
\ No newline at end of file
diff --git a/packages/ui/src/components/mindmap/edge/index.ts b/packages/ui/src/components/mindmap/edge/index.ts
new file mode 100644
index 0000000..d702aa7
--- /dev/null
+++ b/packages/ui/src/components/mindmap/edge/index.ts
@@ -0,0 +1,11 @@
+import type { Edge, EdgeTypes } from "@xyflow/react";
+
+export const initialEdges = [
+ { id: "a->c", source: "a", target: "c", animated: true },
+ { id: "b->d", source: "b", target: "d" },
+ { id: "c->d", source: "c", target: "d", animated: true },
+] satisfies Edge[];
+
+export const edgeTypes = {
+ // Add your custom edge types here!
+} satisfies EdgeTypes;
diff --git a/packages/ui/src/components/mindmap/hooks/useFlowKeyboardControl.ts b/packages/ui/src/components/mindmap/hooks/useFlowKeyboardControl.ts
new file mode 100644
index 0000000..74835c4
--- /dev/null
+++ b/packages/ui/src/components/mindmap/hooks/useFlowKeyboardControl.ts
@@ -0,0 +1,145 @@
+import { useCallback } from 'react';
+import { useHotkeys } from 'react-hotkeys-hook';
+import { useStoreApi } from '@xyflow/react';
+import useMindMapStore, { RFState } from '../store';
+import { useShallow } from 'zustand/shallow';
+
+const controlsSelector = (state: RFState) => ({
+ selectedNodeId: state.selectedNodeId,
+ setSelectedNodeId: state.setSelectedNodeId,
+ addChildNode: state.addChildNode,
+ addSiblingNode: state.addSiblingNode,
+ undo: state.undo,
+ redo: state.redo,
+});
+
+export function useFlowKeyboardControls() {
+ const {
+ selectedNodeId,
+ setSelectedNodeId,
+ addChildNode,
+ addSiblingNode,
+ undo,
+ redo,
+ } = useMindMapStore(useShallow(controlsSelector));
+
+ const store = useStoreApi();
+
+ const getNextNodeInDirection = useCallback((direction: 'left' | 'right' | 'up' | 'down') => {
+ const { nodeLookup, edges } = store.getState();
+ if (!selectedNodeId) return null;
+
+ const currentNode = nodeLookup.get(selectedNodeId);
+ if (!currentNode) return null;
+
+ // 构建节点关系图
+ const nodeRelations = new Map();
+
+ edges.forEach(edge => {
+ const source = edge.source;
+ const target = edge.target;
+
+ if (!nodeRelations.has(source)) {
+ nodeRelations.set(source, { parent: null, children: [], siblings: [] });
+ }
+ if (!nodeRelations.has(target)) {
+ nodeRelations.set(target, { parent: null, children: [], siblings: [] });
+ }
+
+ nodeRelations.get(target)!.parent = source;
+ nodeRelations.get(source)!.children.push(target);
+ });
+
+ // 找出同级节点
+ const currentRelation = nodeRelations.get(selectedNodeId);
+ if (currentRelation?.parent) {
+ const parentRelation = nodeRelations.get(currentRelation.parent);
+ if (parentRelation) {
+ currentRelation.siblings = parentRelation.children.filter(id => id !== selectedNodeId);
+ }
+ }
+
+ // 根据方向决定下一个节点
+ switch (direction) {
+ case 'left': {
+ // 如果当前节点是子节点,优先选择父节点
+ if (currentRelation?.parent) {
+ const parentNode = nodeLookup.get(currentRelation.parent);
+ if (parentNode && parentNode.position.x < currentNode.position.x) {
+ return currentRelation.parent;
+ }
+ }
+ break;
+ }
+ case 'right': {
+ // 如果有子节点,选择第一个子节点
+ const children = currentRelation?.children || [];
+ if (children.length > 0) {
+ return children[0];
+ }
+ break;
+ }
+ case 'up': {
+ // 在同级节点中找位置靠上的节点
+ const siblings = currentRelation?.siblings || [];
+ const upperSiblings = siblings
+ .map(id => nodeLookup.get(id))
+ .filter(node => node && node.position.y < currentNode.position.y)
+ .sort((a, b) => b!.position.y - a!.position.y);
+
+ if (upperSiblings.length > 0) {
+ return upperSiblings[0]!.id;
+ }
+ break;
+ }
+ case 'down': {
+ // 在同级节点中找位置靠下的节点
+ const siblings = currentRelation?.siblings || [];
+ const lowerSiblings = siblings
+ .map(id => nodeLookup.get(id))
+ .filter(node => node && node.position.y > currentNode.position.y)
+ .sort((a, b) => a!.position.y - b!.position.y);
+
+ if (lowerSiblings.length > 0) {
+ return lowerSiblings[0]!.id;
+ }
+ break;
+ }
+ }
+
+ return null;
+ }, [selectedNodeId, store]);
+
+ // Tab 键添加子节点
+ useHotkeys('tab', (e) => {
+ e.preventDefault();
+ if (selectedNodeId) addChildNode(selectedNodeId);
+ }, { enableOnFormTags: true, preventDefault: true });
+
+ // Enter 键添加同级节点
+ useHotkeys('enter', (e) => {
+ e.preventDefault();
+ if (selectedNodeId) addSiblingNode(selectedNodeId);
+ }, { enableOnFormTags: true, preventDefault: true });
+
+ // 撤销重做
+ // useHotkeys('ctrl+z, cmd+z', (e) => {
+
+ // undo();
+ // }, { enableOnFormTags: false });
+
+ // useHotkeys('ctrl+y, cmd+y', (e) => {
+
+ // redo();
+ // }, { enableOnFormTags: false });
+
+ // 方向键导航
+ const directions = ['left', 'right', 'up', 'down'] as const;
+ directions.forEach(direction => {
+ useHotkeys(direction, (e) => {
+ e.preventDefault();
+ const nextNodeId = getNextNodeInDirection(direction);
+ if (nextNodeId) setSelectedNodeId(nextNodeId);
+ }, { enableOnFormTags: true });
+ });
+}
\ No newline at end of file
diff --git a/packages/ui/src/components/mindmap/index.ts b/packages/ui/src/components/mindmap/index.ts
new file mode 100644
index 0000000..3505c9b
--- /dev/null
+++ b/packages/ui/src/components/mindmap/index.ts
@@ -0,0 +1 @@
+export * from "./MindMap"
\ No newline at end of file
diff --git a/packages/ui/src/components/mindmap/layout.ts b/packages/ui/src/components/mindmap/layout.ts
new file mode 100644
index 0000000..7b66c09
--- /dev/null
+++ b/packages/ui/src/components/mindmap/layout.ts
@@ -0,0 +1,43 @@
+import { Edge, Node } from '@xyflow/react';
+import dagre from 'dagre';
+
+export const getLayoutedElements = (nodes: Node[], edges: Edge[], direction = 'LR') => {
+ const dagreGraph = new dagre.graphlib.Graph();
+ dagreGraph.setDefaultEdgeLabel(() => ({}));
+
+ const nodeWidth = 200;
+ const nodeHeight = 50;
+
+ dagreGraph.setGraph({
+ rankdir: direction,
+ nodesep: 80,
+ ranksep: 100
+ });
+
+ // 添加节点
+ nodes.forEach((node) => {
+ dagreGraph.setNode(node.id, { width: nodeWidth, height: nodeHeight });
+ });
+
+ // 添加边
+ edges.forEach((edge) => {
+ dagreGraph.setEdge(edge.source, edge.target);
+ });
+
+ // 计算布局
+ dagre.layout(dagreGraph);
+
+ // 获取新的节点位置
+ const layoutedNodes = nodes.map((node) => {
+ const nodeWithPosition = dagreGraph.node(node.id);
+ return {
+ ...node,
+ position: {
+ x: nodeWithPosition.x - nodeWidth / 2,
+ y: nodeWithPosition.y - nodeHeight / 2,
+ },
+ };
+ });
+
+ return { nodes: layoutedNodes, edges };
+};
\ No newline at end of file
diff --git a/packages/ui/src/components/mindmap/store.ts b/packages/ui/src/components/mindmap/store.ts
new file mode 100644
index 0000000..26f1242
--- /dev/null
+++ b/packages/ui/src/components/mindmap/store.ts
@@ -0,0 +1,234 @@
+import {
+ Edge,
+ EdgeChange,
+ Node,
+ NodeChange,
+ OnNodesChange,
+ OnEdgesChange,
+ applyNodeChanges,
+ applyEdgeChanges,
+ XYPosition,
+} from '@xyflow/react';
+import { nanoid } from 'nanoid';
+import { create } from 'zustand';
+import { HistoryData, HistoryState, NodeLayout, NodeRelationType } from './types';
+import { getLayoutedElements } from './layout';
+
+
+const createHistoryState = (initialPresent: HistoryData): HistoryState => ({
+ past: [],
+ present: initialPresent,
+ future: [],
+});
+
+const initialNodes: Node[] = [{
+ id: 'root',
+ type: 'mindmap',
+ data: { label: 'React Flow Mind Map' },
+ position: { x: 0, y: 0 },
+}];
+
+export type RFState = {
+ nodes: Node[];
+ edges: Edge[];
+ onNodesChange: OnNodesChange;
+ onEdgesChange: OnEdgesChange;
+ history: HistoryState;
+ addChildNode: (nodeId: string, position?: XYPosition) => void;
+ updateNodeLabel: (nodeId: string, label: string) => void
+ addSiblingNode: (nodeId: string, position?: XYPosition) => void
+ selectedNodeId: string | null;
+ setSelectedNodeId: (nodeId: string | null) => void;
+ editingNodeId: string | null;
+ setEditingNodeId: (nodeId: string | null) => void;
+ isEditing: boolean;
+ undo: () => void;
+ redo: () => void;
+ canUndo: boolean;
+ canRedo: boolean;
+};
+const useMindMapStore = create((set, get) => {
+ const updateHistory = (newState: Partial) => {
+ const currentState = get().history.present;
+ return {
+ past: [...get().history.past, currentState],
+ present: { ...currentState, ...newState },
+ future: [],
+ };
+ };
+
+ const createNewNode = (label: string = 'New Node'): Node => ({
+ id: nanoid(),
+ type: 'mindmap',
+ data: { label },
+ position: { x: 0, y: 0 }
+ });
+ const addNode = (
+ parentId: string,
+ relationType: NodeRelationType
+ ) => {
+ const { nodes, edges, editingNodeId } = get();
+ const parentNode = nodes.find(node => node.id === parentId);
+ if (!parentNode) return;
+ const newNode = createNewNode();
+ const newEdge = {
+ id: nanoid(),
+ source: relationType === 'child' ? parentId : edges.find(e => e.target === parentId)?.source ?? parentId,
+ target: newNode.id,
+ type: 'smoothstep',
+ };
+ const newNodes = [...nodes, newNode];
+ const newEdges = [...edges, newEdge];
+ const { nodes: layoutedNodes, edges: layoutedEdges } = getLayoutedElements(newNodes, newEdges);
+ set({
+ nodes: layoutedNodes,
+ edges: layoutedEdges,
+ selectedNodeId: newNode.id,
+ history: updateHistory({
+ nodes: layoutedNodes,
+ edges: layoutedEdges,
+ selectedNodeId: newNode.id,
+ editingNodeId,
+ }),
+ });
+ };
+ return {
+ nodes: initialNodes,
+ edges: [],
+ isEditing: false,
+ history: createHistoryState({ nodes: initialNodes, edges: [], selectedNodeId: null, editingNodeId: null }),
+ editingNodeId: null,
+ setEditingNodeId: (nodeId: string | null) => {
+ const { nodes, edges, selectedNodeId } = get();
+ set({
+ editingNodeId: nodeId,
+ isEditing: Boolean(nodeId),
+ history: {
+ past: [...get().history.past, get().history.present],
+ present: {
+ nodes,
+ edges,
+ selectedNodeId,
+ editingNodeId: nodeId
+ },
+ future: [],
+ },
+ });
+ },
+ selectedNodeId: null,
+ setSelectedNodeId: (nodeId: string | null) => {
+ const { nodes, edges, editingNodeId } = get();
+ set({
+ selectedNodeId: nodeId,
+ history: {
+ past: [...get().history.past, get().history.present],
+ present: { nodes, edges, selectedNodeId: nodeId, editingNodeId },
+ future: [],
+ },
+ });
+ },
+ updateNodeLabel: (nodeId: string, label: string) => {
+ const { nodes, edges, selectedNodeId, editingNodeId } = get();
+ const newNodes = nodes.map((node) => {
+ if (node.id === nodeId) {
+ return { ...node, data: { ...node.data, label } };
+ }
+ return node;
+ });
+ set({
+ nodes: newNodes,
+ edges,
+ selectedNodeId,
+ history: {
+ past: [...get().history.past, get().history.present],
+ present: { nodes: newNodes, edges, selectedNodeId, editingNodeId },
+ future: [],
+ },
+ });
+ },
+ onNodesChange: (changes: NodeChange[]) => {
+ console.log('on node change', changes)
+ const { nodes, edges, selectedNodeId } = get();
+ const newNodes = applyNodeChanges(changes, nodes);
+ set({ nodes: newNodes });
+ },
+ onEdgesChange: (changes: EdgeChange[]) => {
+ const { nodes, edges, selectedNodeId } = get();
+ const newEdges = applyEdgeChanges(changes, edges);
+
+ set({ edges: newEdges });
+ },
+ addChildNode: (nodeId: string) =>
+ addNode(nodeId, 'child'),
+ addSiblingNode: (nodeId: string) =>
+ addNode(nodeId, 'sibling'),
+ undo: () => {
+ const { history } = get();
+ console.log('[Undo] Starting undo operation');
+
+ if (history.past.length === 0) {
+ console.log('[Undo] No past states available, undo skipped');
+ return;
+ }
+ const previous = history.past[history.past.length - 1];
+ const newPast = history.past.slice(0, -1);
+ const newPresent = { ...history.present };
+ console.log('[Undo] Previous state:', previous);
+ console.log('[Undo] New past length:', newPast.length);
+
+ set({
+ nodes: previous.nodes,
+ edges: previous.edges,
+ selectedNodeId: previous.selectedNodeId,
+ editingNodeId: previous.editingNodeId,
+ history: {
+ past: newPast,
+ present: previous,
+ future: [newPresent, ...history.future],
+ },
+ });
+
+ console.log('[Undo] Operation completed');
+ },
+
+ redo: () => {
+ const { history } = get();
+ console.log('[Redo] Starting redo operation');
+
+ if (history.future.length === 0) {
+ console.log('[Redo] No future states available, redo skipped');
+ return;
+ }
+
+ const next = history.future[0];
+ const newFuture = history.future.slice(1);
+
+ console.log('[Redo] Next state:', next);
+ console.log('[Redo] New future length:', newFuture.length);
+
+ set({
+ nodes: next.nodes,
+ edges: next.edges,
+ selectedNodeId: next.selectedNodeId,
+ editingNodeId: next.editingNodeId,
+ history: {
+ past: [...history.past, history.present],
+ present: next,
+ future: newFuture,
+ },
+ });
+
+ console.log('[Redo] Operation completed');
+ },
+ get canUndo() {
+ return get().history.past.length > 0;
+ },
+
+ get canRedo() {
+ return get().history.future.length > 0;
+ },
+ }
+});
+
+
+export default useMindMapStore;
\ No newline at end of file
diff --git a/packages/ui/src/components/mindmap/types.ts b/packages/ui/src/components/mindmap/types.ts
new file mode 100644
index 0000000..72911e2
--- /dev/null
+++ b/packages/ui/src/components/mindmap/types.ts
@@ -0,0 +1,32 @@
+import type { Node, NodeTypes, BuiltInNode, Edge } from "@xyflow/react";
+
+export type MindMapNodeType = Node<
+ {
+ label: string
+ level: number
+ isExpanded?: boolean
+ metadata?: Record
+ }, "mindmap">
+
+export type MindMapEdgeType = Edge<{
+ label: string
+}, "mindmap">
+
+export type HistoryState = {
+ past: T[];
+ present: T;
+ future: T[];
+};
+export type HistoryData = {
+ nodes: Node[];
+ edges: Edge[];
+ selectedNodeId: string | null;
+ editingNodeId: string | null; // Add this
+};
+export type NodeRelationType = 'child' | 'sibling';
+export type NodeLayout = {
+ horizontalSpacing: number;
+ verticalSpacing: number;
+ nodeWidth: number;
+ nodeHeight: number;
+};
diff --git a/packages/ui/src/components/mindmap/utils.ts b/packages/ui/src/components/mindmap/utils.ts
new file mode 100644
index 0000000..e69de29
diff --git a/packages/ui/src/hooks/useClickOutside.ts b/packages/ui/src/hooks/useClickOutside.ts
new file mode 100644
index 0000000..affd62d
--- /dev/null
+++ b/packages/ui/src/hooks/useClickOutside.ts
@@ -0,0 +1,15 @@
+import { useEffect, RefObject } from 'react';
+
+export function useClickOutside(ref: RefObject, handler: () => void) {
+ useEffect(() => {
+ function handleClickOutside(event: MouseEvent) {
+ console.log(event.target)
+ if (ref.current && !ref.current.contains(event.target as Node)) {
+ handler();
+ }
+ }
+
+ document.addEventListener('mousedown', handleClickOutside);
+ return () => document.removeEventListener('mousedown', handleClickOutside);
+ }, [ref, handler]);
+}
\ No newline at end of file
diff --git a/packages/ui/src/index.ts b/packages/ui/src/index.ts
new file mode 100644
index 0000000..33ff1f5
--- /dev/null
+++ b/packages/ui/src/index.ts
@@ -0,0 +1 @@
+export * from "./components/mindmap"
diff --git a/packages/ui/tsconfig.json b/packages/ui/tsconfig.json
new file mode 100644
index 0000000..f2c2a6d
--- /dev/null
+++ b/packages/ui/tsconfig.json
@@ -0,0 +1,43 @@
+{
+ "compilerOptions": {
+ "target": "es2022",
+ "module": "esnext",
+ "allowJs": true,
+ "lib": [
+ "DOM",
+ "es2022",
+ "DOM.Iterable"
+ ],
+ "declaration": true,
+ "declarationMap": true,
+ "sourceMap": true,
+ "moduleResolution": "node",
+ "resolveJsonModule": true,
+ "removeComments": true,
+ "skipLibCheck": true,
+ "strict": true,
+ "isolatedModules": true,
+ "jsx": "react-jsx",
+ "esModuleInterop": true,
+ "noUnusedLocals": false,
+ "noUnusedParameters": false,
+ "noImplicitReturns": false,
+ "noFallthroughCasesInSwitch": false,
+ "noUncheckedIndexedAccess": false,
+ "noImplicitOverride": false,
+ "noPropertyAccessFromIndexSignature": false,
+ "outDir": "dist",
+ "incremental": true,
+ "tsBuildInfoFile": "./dist/tsconfig.tsbuildinfo"
+ },
+ "include": [
+ "src"
+ ],
+ "exclude": [
+ "node_modules",
+ "dist",
+ "**/*.test.ts",
+ "**/*.spec.ts",
+ "**/__tests__"
+ ]
+}
\ No newline at end of file
diff --git a/packages/ui/tsup.config.ts b/packages/ui/tsup.config.ts
new file mode 100644
index 0000000..f21629b
--- /dev/null
+++ b/packages/ui/tsup.config.ts
@@ -0,0 +1,13 @@
+import { defineConfig } from 'tsup'
+
+export default defineConfig({
+ entry: ['src/index.ts'],
+ format: ['esm', 'cjs'],
+ dts: true,
+ clean: true,
+ sourcemap: true,
+ minify: true,
+ external: ['react', 'react-dom'],
+ bundle: true,
+ target: "esnext"
+})
\ No newline at end of file
diff --git a/packages/utils/package.json b/packages/utils/package.json
new file mode 100644
index 0000000..8f3fd0e
--- /dev/null
+++ b/packages/utils/package.json
@@ -0,0 +1,24 @@
+{
+ "name": "@nice/utils",
+ "version": "1.0.0",
+ "main": "./dist/index.js",
+ "module": "./dist/index.mjs",
+ "types": "./dist/index.d.ts",
+ "private": true,
+ "scripts": {
+ "build": "tsup",
+ "dev": "tsup --watch",
+ "clean": "rimraf dist",
+ "typecheck": "tsc --noEmit"
+ },
+ "dependencies": {},
+ "peerDependencies": {},
+ "devDependencies": {
+ "@types/node": "^20.3.1",
+ "ts-node": "^10.9.1",
+ "typescript": "^5.5.4",
+ "concurrently": "^8.0.0",
+ "tsup": "^8.3.5",
+ "rimraf": "^6.0.1"
+ }
+}
\ No newline at end of file
diff --git a/packages/utils/src/index.ts b/packages/utils/src/index.ts
new file mode 100644
index 0000000..aea398b
--- /dev/null
+++ b/packages/utils/src/index.ts
@@ -0,0 +1,23 @@
+/**
+ * 生成唯一ID
+ * @param prefix - 可选的ID前缀
+ * @returns 唯一ID字符串
+ */
+export function generateUniqueId(prefix?: string): string {
+ // 获取当前时间戳
+ const timestamp = Date.now();
+
+ // 生成随机数部分
+ const randomPart = Math.random().toString(36).substring(2, 8);
+
+ // 获取环境特定的额外随机性
+ const environmentPart = typeof window !== 'undefined'
+ ? window.crypto.getRandomValues(new Uint32Array(1))[0].toString(36)
+ : require('crypto').randomBytes(4).toString('hex');
+
+ // 组合所有部分
+ const uniquePart = `${timestamp}${randomPart}${environmentPart}`;
+
+ // 如果提供了前缀,则添加前缀
+ return prefix ? `${prefix}_${uniquePart}` : uniquePart;
+}
\ No newline at end of file
diff --git a/packages/utils/tsconfig.json b/packages/utils/tsconfig.json
new file mode 100644
index 0000000..5244c89
--- /dev/null
+++ b/packages/utils/tsconfig.json
@@ -0,0 +1,40 @@
+{
+ "compilerOptions": {
+ "target": "es2022",
+ "module": "esnext",
+ "lib": [
+ "DOM",
+ "es2022"
+ ],
+ "declaration": true,
+ "declarationMap": true,
+ "sourceMap": true,
+ "moduleResolution": "node",
+ "removeComments": true,
+ "skipLibCheck": true,
+ "strict": true,
+ "isolatedModules": true,
+ "esModuleInterop": true,
+ "noUnusedLocals": false,
+ "noUnusedParameters": false,
+ "noImplicitReturns": false,
+ "noFallthroughCasesInSwitch": false,
+ "noUncheckedIndexedAccess": false,
+ "noImplicitOverride": false,
+ "noPropertyAccessFromIndexSignature": false,
+ "emitDeclarationOnly": true,
+ "outDir": "dist",
+ "incremental": true,
+ "tsBuildInfoFile": "./dist/tsconfig.tsbuildinfo"
+ },
+ "include": [
+ "src"
+ ],
+ "exclude": [
+ "node_modules",
+ "dist",
+ "**/*.test.ts",
+ "**/*.spec.ts",
+ "**/__tests__"
+ ]
+}
\ No newline at end of file
diff --git a/packages/utils/tsup.config.ts b/packages/utils/tsup.config.ts
new file mode 100644
index 0000000..1eacf7a
--- /dev/null
+++ b/packages/utils/tsup.config.ts
@@ -0,0 +1,10 @@
+import { defineConfig } from 'tsup';
+
+export default defineConfig({
+ entry: ['src/index.ts'],
+ format: ['cjs', 'esm'],
+ splitting: false,
+ sourcemap: true,
+ clean: false,
+ dts: true
+});
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 5abfd1f..ae81f3d 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -12,31 +12,31 @@ importers:
dependencies:
'@nestjs/bullmq':
specifier: ^10.2.0
- version: 10.2.0(@nestjs/common@10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.10(@nestjs/common@10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.10)(@nestjs/websockets@10.3.10)(reflect-metadata@0.2.2)(rxjs@7.8.1))(bullmq@5.12.0)
+ version: 10.2.3(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.15)(@nestjs/websockets@10.4.15)(reflect-metadata@0.2.2)(rxjs@7.8.1))(bullmq@5.34.8)
'@nestjs/common':
specifier: ^10.3.10
- version: 10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1)
+ version: 10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1)
'@nestjs/config':
specifier: ^3.2.3
- version: 3.2.3(@nestjs/common@10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1))(rxjs@7.8.1)
+ version: 3.3.0(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(rxjs@7.8.1)
'@nestjs/core':
specifier: ^10.0.0
- version: 10.3.10(@nestjs/common@10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.10)(@nestjs/websockets@10.3.10)(reflect-metadata@0.2.2)(rxjs@7.8.1)
+ version: 10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.15)(@nestjs/websockets@10.4.15)(reflect-metadata@0.2.2)(rxjs@7.8.1)
'@nestjs/jwt':
specifier: ^10.2.0
- version: 10.2.0(@nestjs/common@10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1))
+ version: 10.2.0(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))
'@nestjs/platform-express':
specifier: ^10.0.0
- version: 10.3.10(@nestjs/common@10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.10)
+ version: 10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15)
'@nestjs/platform-socket.io':
specifier: ^10.3.10
- version: 10.4.1(@nestjs/common@10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/websockets@10.3.10)(rxjs@7.8.1)
+ version: 10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/websockets@10.4.15)(rxjs@7.8.1)
'@nestjs/schedule':
specifier: ^4.1.0
- version: 4.1.0(@nestjs/common@10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.10(@nestjs/common@10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.10)(@nestjs/websockets@10.3.10)(reflect-metadata@0.2.2)(rxjs@7.8.1))
+ version: 4.1.2(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.15)(@nestjs/websockets@10.4.15)(reflect-metadata@0.2.2)(rxjs@7.8.1))
'@nestjs/websockets':
specifier: ^10.3.10
- version: 10.3.10(@nestjs/common@10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.10)(@nestjs/platform-socket.io@10.4.1)(reflect-metadata@0.2.2)(rxjs@7.8.1)
+ version: 10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15)(@nestjs/platform-socket.io@10.4.15)(reflect-metadata@0.2.2)(rxjs@7.8.1)
'@nice/common':
specifier: workspace:*
version: link:../../packages/common
@@ -51,13 +51,13 @@ importers:
version: 0.41.1
axios:
specifier: ^1.7.2
- version: 1.7.3
+ version: 1.7.9
bullmq:
specifier: ^5.12.0
- version: 5.12.0
+ version: 5.34.8
cron:
specifier: ^3.1.7
- version: 3.1.7
+ version: 3.3.2
dayjs:
specifier: ^1.11.13
version: 1.11.13
@@ -72,7 +72,7 @@ importers:
version: 2.1.3
ioredis:
specifier: ^5.4.1
- version: 5.4.1
+ version: 5.4.2
lib0:
specifier: ^0.2.97
version: 0.2.99
@@ -87,7 +87,7 @@ importers:
version: 2.1.35
minio:
specifier: ^8.0.1
- version: 8.0.1
+ version: 8.0.3
mitt:
specifier: ^3.0.1
version: 3.0.1
@@ -114,7 +114,7 @@ importers:
version: 1.6.6
socket.io:
specifier: ^4.7.5
- version: 4.7.5
+ version: 4.8.1
superjson-cjs:
specifier: ^2.2.3
version: 2.2.3
@@ -123,7 +123,7 @@ importers:
version: 2.3.5
tus-js-client:
specifier: ^4.1.0
- version: 4.1.0
+ version: 4.2.3
uuid:
specifier: ^10.0.0
version: 10.0.0
@@ -138,20 +138,20 @@ importers:
version: 13.6.21
zod:
specifier: ^3.23.8
- version: 3.23.8
+ version: 3.24.1
devDependencies:
'@nestjs/cli':
specifier: ^10.0.0
- version: 10.4.2(@swc/core@1.6.13)
+ version: 10.4.9(@swc/core@1.10.6)
'@nestjs/schematics':
specifier: ^10.0.0
- version: 10.1.2(chokidar@3.6.0)(typescript@5.7.2)
+ version: 10.2.3(chokidar@3.6.0)(typescript@5.7.2)
'@nestjs/testing':
specifier: ^10.0.0
- version: 10.3.10(@nestjs/common@10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.10(@nestjs/common@10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.10)(@nestjs/websockets@10.3.10)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.10(@nestjs/common@10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.10))
+ version: 10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.15)(@nestjs/websockets@10.4.15)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15))
'@types/exceljs':
specifier: ^1.3.0
- version: 1.3.0
+ version: 1.3.2
'@types/express':
specifier: ^4.17.21
version: 4.17.21
@@ -160,7 +160,7 @@ importers:
version: 2.1.27
'@types/jest':
specifier: ^29.5.2
- version: 29.5.12
+ version: 29.5.14
'@types/mime-types':
specifier: ^2.1.4
version: 2.1.4
@@ -169,7 +169,7 @@ importers:
version: 1.4.12
'@types/node':
specifier: ^20.3.1
- version: 20.14.10
+ version: 20.17.12
'@types/supertest':
specifier: ^6.0.0
version: 6.0.2
@@ -181,25 +181,25 @@ importers:
version: 8.5.13
'@typescript-eslint/eslint-plugin':
specifier: ^6.0.0
- version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.7.2))(eslint@8.57.0)(typescript@5.7.2)
+ version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2)
'@typescript-eslint/parser':
specifier: ^6.0.0
- version: 6.21.0(eslint@8.57.0)(typescript@5.7.2)
+ version: 6.21.0(eslint@8.57.1)(typescript@5.7.2)
eslint:
specifier: ^8.42.0
- version: 8.57.0
+ version: 8.57.1
eslint-config-prettier:
specifier: ^9.0.0
- version: 9.1.0(eslint@8.57.0)
+ version: 9.1.0(eslint@8.57.1)
eslint-plugin-prettier:
specifier: ^5.0.0
- version: 5.1.3(@types/eslint@8.56.10)(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.3.2)
+ version: 5.2.1(@types/eslint@9.6.1)(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.4.2)
jest:
specifier: ^29.5.0
- version: 29.7.0(@types/node@20.14.10)(ts-node@10.9.2(@swc/core@1.6.13)(@types/node@20.14.10)(typescript@5.7.2))
+ version: 29.7.0(@types/node@20.17.12)(ts-node@10.9.2(@swc/core@1.10.6)(@types/node@20.17.12)(typescript@5.7.2))
prettier:
specifier: ^3.0.0
- version: 3.3.2
+ version: 3.4.2
source-map-support:
specifier: ^0.5.21
version: 0.5.21
@@ -208,13 +208,13 @@ importers:
version: 6.3.4
ts-jest:
specifier: ^29.1.0
- version: 29.2.2(@babel/core@7.24.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.7))(jest@29.7.0(@types/node@20.14.10)(ts-node@10.9.2(@swc/core@1.6.13)(@types/node@20.14.10)(typescript@5.7.2)))(typescript@5.7.2)
+ version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@20.17.12)(ts-node@10.9.2(@swc/core@1.10.6)(@types/node@20.17.12)(typescript@5.7.2)))(typescript@5.7.2)
ts-loader:
specifier: ^9.4.3
- version: 9.5.1(typescript@5.7.2)(webpack@5.92.1(@swc/core@1.6.13))
+ version: 9.5.1(typescript@5.7.2)(webpack@5.97.1(@swc/core@1.10.6))
ts-node:
specifier: ^10.9.1
- version: 10.9.2(@swc/core@1.6.13)(@types/node@20.14.10)(typescript@5.7.2)
+ version: 10.9.2(@swc/core@1.10.6)(@types/node@20.17.12)(typescript@5.7.2)
tsconfig-paths:
specifier: ^4.2.0
version: 4.2.0
@@ -265,7 +265,16 @@ importers:
version: 32.3.3
'@ant-design/icons':
specifier: ^5.4.0
- version: 5.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ version: 5.5.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ '@dnd-kit/core':
+ specifier: ^6.3.1
+ version: 6.3.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ '@dnd-kit/sortable':
+ specifier: ^10.0.0
+ version: 10.0.0(@dnd-kit/core@6.3.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0)
+ '@dnd-kit/utilities':
+ specifier: ^3.2.2
+ version: 3.2.2(react@18.2.0)
'@floating-ui/react':
specifier: ^0.26.25
version: 0.26.28(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
@@ -274,7 +283,7 @@ importers:
version: 2.2.0(react@18.2.0)
'@hookform/resolvers':
specifier: ^3.9.1
- version: 3.9.1(react-hook-form@7.54.2(react@18.2.0))
+ version: 3.10.0(react-hook-form@7.54.2(react@18.2.0))
'@nice/client':
specifier: workspace:^
version: link:../../packages/client
@@ -284,24 +293,33 @@ importers:
'@nice/iconer':
specifier: workspace:^
version: link:../../packages/iconer
+ '@nice/mindmap':
+ specifier: workspace:^
+ version: link:../../packages/mindmap
+ '@nice/ui':
+ specifier: workspace:^
+ version: link:../../packages/ui
'@tanstack/query-async-storage-persister':
specifier: ^5.51.9
- version: 5.51.9
+ version: 5.62.16
'@tanstack/react-query':
specifier: ^5.51.21
- version: 5.55.4(react@18.2.0)
+ version: 5.62.16(react@18.2.0)
'@tanstack/react-query-persist-client':
specifier: ^5.51.9
- version: 5.51.11(@tanstack/react-query@5.55.4(react@18.2.0))(react@18.2.0)
+ version: 5.62.16(@tanstack/react-query@5.62.16(react@18.2.0))(react@18.2.0)
'@trpc/client':
specifier: 11.0.0-rc.456
version: 11.0.0-rc.456(@trpc/server@11.0.0-rc.456)
'@trpc/react-query':
specifier: 11.0.0-rc.456
- version: 11.0.0-rc.456(@tanstack/react-query@5.55.4(react@18.2.0))(@trpc/client@11.0.0-rc.456(@trpc/server@11.0.0-rc.456))(@trpc/server@11.0.0-rc.456)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ version: 11.0.0-rc.456(@tanstack/react-query@5.62.16(react@18.2.0))(@trpc/client@11.0.0-rc.456(@trpc/server@11.0.0-rc.456))(@trpc/server@11.0.0-rc.456)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
'@trpc/server':
specifier: 11.0.0-rc.456
version: 11.0.0-rc.456
+ '@xyflow/react':
+ specifier: ^12.3.6
+ version: 12.3.6(@types/react@18.2.38)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
ag-grid-community:
specifier: ~32.3.2
version: 32.3.3
@@ -313,10 +331,10 @@ importers:
version: 32.3.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
antd:
specifier: ^5.19.3
- version: 5.20.6(date-fns@2.30.0)(luxon@3.4.4)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ version: 5.23.0(date-fns@2.30.0)(luxon@3.5.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
axios:
specifier: ^1.7.2
- version: 1.7.3
+ version: 1.7.9
browser-image-compression:
specifier: ^2.0.2
version: 2.0.2
@@ -326,12 +344,21 @@ importers:
clsx:
specifier: ^2.1.1
version: 2.1.1
+ d3-dag:
+ specifier: ^1.1.0
+ version: 1.1.0
+ d3-hierarchy:
+ specifier: ^3.1.2
+ version: 3.1.2
dayjs:
specifier: ^1.11.12
version: 1.11.13
+ elkjs:
+ specifier: ^0.9.3
+ version: 0.9.3
framer-motion:
specifier: ^11.15.0
- version: 11.15.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ version: 11.16.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
hls.js:
specifier: ^1.5.18
version: 1.5.18
@@ -341,6 +368,9 @@ importers:
mitt:
specifier: ^3.0.1
version: 3.0.1
+ quill:
+ specifier: 2.0.3
+ version: 2.0.3
react:
specifier: 18.2.0
version: 18.2.0
@@ -350,21 +380,24 @@ importers:
react-dom:
specifier: 18.2.0
version: 18.2.0(react@18.2.0)
+ react-dropzone:
+ specifier: ^14.3.5
+ version: 14.3.5(react@18.2.0)
react-hook-form:
specifier: ^7.54.2
version: 7.54.2(react@18.2.0)
react-hot-toast:
specifier: ^2.4.1
- version: 2.4.1(csstype@3.1.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ version: 2.5.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
react-resizable:
specifier: ^3.0.5
version: 3.0.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
react-router-dom:
specifier: ^6.24.1
- version: 6.24.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ version: 6.28.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
superjson:
specifier: ^2.2.1
- version: 2.2.1
+ version: 2.2.2
tailwind-merge:
specifier: ^2.6.0
version: 2.6.0
@@ -376,32 +409,32 @@ importers:
version: 13.6.21
zod:
specifier: ^3.23.8
- version: 3.23.8
+ version: 3.24.1
devDependencies:
'@eslint/js':
specifier: ^9.9.0
version: 9.17.0
'@types/react':
- specifier: ^18.2.0
- version: 18.3.3
+ specifier: 18.2.38
+ version: 18.2.38
'@types/react-dom':
- specifier: ^18.2.0
- version: 18.3.0
+ specifier: 18.2.15
+ version: 18.2.15
'@vitejs/plugin-react-swc':
specifier: ^3.5.0
- version: 3.7.0(vite@5.4.11(@types/node@20.14.10)(terser@5.31.2))
+ version: 3.7.2(@swc/helpers@0.5.15)(vite@5.4.11(@types/node@20.17.12)(terser@5.37.0))
autoprefixer:
specifier: ^10.4.20
version: 10.4.20(postcss@8.4.49)
eslint:
specifier: ^9.9.0
- version: 9.17.0(jiti@1.21.6)
+ version: 9.17.0(jiti@1.21.7)
eslint-plugin-react-hooks:
specifier: ^5.1.0-rc.0
- version: 5.1.0(eslint@9.17.0(jiti@1.21.6))
+ version: 5.1.0(eslint@9.17.0(jiti@1.21.7))
eslint-plugin-react-refresh:
specifier: ^0.4.9
- version: 0.4.16(eslint@9.17.0(jiti@1.21.6))
+ version: 0.4.16(eslint@9.17.0(jiti@1.21.7))
globals:
specifier: ^15.9.0
version: 15.14.0
@@ -410,16 +443,16 @@ importers:
version: 8.4.49
tailwindcss:
specifier: ^3.4.10
- version: 3.4.17(ts-node@10.9.2(@swc/core@1.6.13)(@types/node@20.14.10)(typescript@5.7.2))
+ version: 3.4.17(ts-node@10.9.2(@types/node@20.17.12)(typescript@5.7.2))
typescript:
specifier: ^5.5.4
version: 5.7.2
typescript-eslint:
specifier: ^8.0.1
- version: 8.18.2(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2)
+ version: 8.19.1(eslint@9.17.0(jiti@1.21.7))(typescript@5.7.2)
vite:
specifier: ^5.4.1
- version: 5.4.11(@types/node@20.14.10)(terser@5.31.2)
+ version: 5.4.11(@types/node@20.17.12)(terser@5.37.0)
packages/client:
dependencies:
@@ -428,25 +461,25 @@ importers:
version: link:../common
'@tanstack/query-async-storage-persister':
specifier: ^5.51.9
- version: 5.51.9
+ version: 5.62.16
'@tanstack/react-query':
specifier: ^5.51.21
- version: 5.55.4(react@18.2.0)
+ version: 5.62.16(react@18.2.0)
'@tanstack/react-query-persist-client':
specifier: ^5.51.9
- version: 5.51.11(@tanstack/react-query@5.55.4(react@18.2.0))(react@18.2.0)
+ version: 5.62.16(@tanstack/react-query@5.62.16(react@18.2.0))(react@18.2.0)
'@trpc/client':
specifier: 11.0.0-rc.456
version: 11.0.0-rc.456(@trpc/server@11.0.0-rc.456)
'@trpc/react-query':
specifier: 11.0.0-rc.456
- version: 11.0.0-rc.456(@tanstack/react-query@5.55.4(react@18.2.0))(@trpc/client@11.0.0-rc.456(@trpc/server@11.0.0-rc.456))(@trpc/server@11.0.0-rc.456)(react-dom@18.3.1(react@18.2.0))(react@18.2.0)
+ version: 11.0.0-rc.456(@tanstack/react-query@5.62.16(react@18.2.0))(@trpc/client@11.0.0-rc.456(@trpc/server@11.0.0-rc.456))(@trpc/server@11.0.0-rc.456)(react-dom@18.3.1(react@18.2.0))(react@18.2.0)
'@trpc/server':
specifier: 11.0.0-rc.456
version: 11.0.0-rc.456
axios:
specifier: ^1.7.2
- version: 1.7.3
+ version: 1.7.9
dayjs:
specifier: ^1.11.12
version: 1.11.13
@@ -471,7 +504,7 @@ importers:
version: 6.0.1
tsup:
specifier: ^8.3.5
- version: 8.3.5(@swc/core@1.6.13)(jiti@1.21.6)(postcss@8.4.49)(typescript@5.7.2)(yaml@2.4.5)
+ version: 8.3.5(@swc/core@1.10.6)(jiti@1.21.7)(postcss@8.4.49)(typescript@5.7.2)(yaml@2.7.0)
typescript:
specifier: ^5.5.4
version: 5.7.2
@@ -492,11 +525,11 @@ importers:
version: 13.6.21
zod:
specifier: ^3.23.8
- version: 3.23.8
+ version: 3.24.1
devDependencies:
'@types/node':
specifier: ^20.3.1
- version: 20.14.10
+ version: 20.17.12
concurrently:
specifier: ^8.0.0
version: 8.2.2
@@ -505,10 +538,10 @@ importers:
version: 6.0.1
ts-node:
specifier: ^10.9.1
- version: 10.9.2(@swc/core@1.6.13)(@types/node@20.14.10)(typescript@5.7.2)
+ version: 10.9.2(@swc/core@1.10.6)(@types/node@20.17.12)(typescript@5.7.2)
tsup:
specifier: ^8.3.5
- version: 8.3.5(@swc/core@1.6.13)(jiti@1.21.6)(postcss@8.4.49)(typescript@5.7.2)(yaml@2.4.5)
+ version: 8.3.5(@swc/core@1.10.6)(jiti@1.21.7)(postcss@8.4.49)(typescript@5.7.2)(yaml@2.7.0)
typescript:
specifier: ^5.5.4
version: 5.7.2
@@ -516,20 +549,20 @@ importers:
packages/iconer:
devDependencies:
'@types/react':
- specifier: ^18.3.3
- version: 18.3.3
+ specifier: 18.2.38
+ version: 18.2.38
'@types/react-dom':
- specifier: ^18.3.0
- version: 18.3.0
+ specifier: 18.2.15
+ version: 18.2.15
'@typescript-eslint/eslint-plugin':
specifier: ^7.15.0
- version: 7.16.0(@typescript-eslint/parser@7.16.0(eslint@8.57.0)(typescript@5.5.3))(eslint@8.57.0)(typescript@5.5.3)
+ version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2)
'@typescript-eslint/parser':
specifier: ^7.15.0
- version: 7.16.0(eslint@8.57.0)(typescript@5.5.3)
+ version: 7.18.0(eslint@8.57.1)(typescript@5.7.2)
'@vitejs/plugin-react':
specifier: ^4.3.1
- version: 4.3.1(vite@5.3.5(@types/node@20.14.10)(terser@5.31.2))
+ version: 4.3.4(vite@5.4.11(@types/node@20.17.12)(terser@5.37.0))
chokidar-cli:
specifier: ^3.0.0
version: 3.0.0
@@ -538,34 +571,92 @@ importers:
version: 8.2.2
eslint:
specifier: ^8.57.0
- version: 8.57.0
+ version: 8.57.1
eslint-plugin-react-hooks:
specifier: ^4.6.2
- version: 4.6.2(eslint@8.57.0)
+ version: 4.6.2(eslint@8.57.1)
eslint-plugin-react-refresh:
specifier: ^0.4.7
- version: 0.4.8(eslint@8.57.0)
+ version: 0.4.16(eslint@8.57.1)
react:
- specifier: ^18.3.1
- version: 18.3.1
+ specifier: 18.2.0
+ version: 18.2.0
react-dom:
- specifier: ^18.3.1
- version: 18.3.1(react@18.3.1)
+ specifier: 18.2.0
+ version: 18.2.0(react@18.2.0)
typescript:
specifier: ^5.2.2
- version: 5.5.3
+ version: 5.7.2
vite:
specifier: ^5.3.4
- version: 5.3.5(@types/node@20.14.10)(terser@5.31.2)
+ version: 5.4.11(@types/node@20.17.12)(terser@5.37.0)
vite-plugin-svgr:
specifier: ^4.2.0
- version: 4.2.0(rollup@4.29.1)(typescript@5.5.3)(vite@5.3.5(@types/node@20.14.10)(terser@5.31.2))
+ version: 4.3.0(rollup@4.30.1)(typescript@5.7.2)(vite@5.4.11(@types/node@20.17.12)(terser@5.37.0))
- packages/template:
+ packages/mindmap:
+ dependencies:
+ '@svgdotjs/svg.js':
+ specifier: 3.2.0
+ version: 3.2.0
+ deepmerge:
+ specifier: ^1.5.2
+ version: 1.5.2
+ eventemitter3:
+ specifier: ^4.0.7
+ version: 4.0.7
+ jszip:
+ specifier: ^3.10.1
+ version: 3.10.1
+ katex:
+ specifier: ^0.16.8
+ version: 0.16.19
+ mdast-util-from-markdown:
+ specifier: ^1.3.0
+ version: 1.3.1
+ pdf-lib:
+ specifier: ^1.17.1
+ version: 1.17.1
+ quill:
+ specifier: ^2.0.3
+ version: 2.0.3
+ tern:
+ specifier: ^0.24.3
+ version: 0.24.3
+ uuid:
+ specifier: ^9.0.0
+ version: 9.0.1
+ ws:
+ specifier: ^7.5.9
+ version: 7.5.10
+ xml-js:
+ specifier: ^1.6.11
+ version: 1.6.11
+ y-webrtc:
+ specifier: ^10.2.5
+ version: 10.3.0(yjs@13.6.21)
+ yjs:
+ specifier: ^13.6.8
+ version: 13.6.21
devDependencies:
+ '@types/dagre':
+ specifier: ^0.7.52
+ version: 0.7.52
+ '@types/katex':
+ specifier: ^0.16.7
+ version: 0.16.7
+ '@types/mdast':
+ specifier: ^4.0.4
+ version: 4.0.4
'@types/node':
specifier: ^20.3.1
- version: 20.14.10
+ version: 20.17.12
+ '@types/react':
+ specifier: 18.2.38
+ version: 18.2.38
+ '@types/react-dom':
+ specifier: 18.2.15
+ version: 18.2.15
concurrently:
specifier: ^8.0.0
version: 8.2.2
@@ -574,10 +665,31 @@ importers:
version: 6.0.1
ts-node:
specifier: ^10.9.1
- version: 10.9.2(@swc/core@1.6.13)(@types/node@20.14.10)(typescript@5.7.2)
+ version: 10.9.2(@swc/core@1.10.6)(@types/node@20.17.12)(typescript@5.7.2)
tsup:
specifier: ^8.3.5
- version: 8.3.5(@swc/core@1.6.13)(jiti@1.21.6)(postcss@8.4.49)(typescript@5.7.2)(yaml@2.4.5)
+ version: 8.3.5(@swc/core@1.10.6)(jiti@1.21.7)(postcss@8.4.49)(typescript@5.7.2)(yaml@2.7.0)
+ typescript:
+ specifier: ^5.5.4
+ version: 5.7.2
+
+ packages/template:
+ devDependencies:
+ '@types/node':
+ specifier: ^20.3.1
+ version: 20.17.12
+ concurrently:
+ specifier: ^8.0.0
+ version: 8.2.2
+ rimraf:
+ specifier: ^6.0.1
+ version: 6.0.1
+ ts-node:
+ specifier: ^10.9.1
+ version: 10.9.2(@swc/core@1.10.6)(@types/node@20.17.12)(typescript@5.7.2)
+ tsup:
+ specifier: ^8.3.5
+ version: 8.3.5(@swc/core@1.10.6)(jiti@1.21.7)(postcss@8.4.49)(typescript@5.7.2)(yaml@2.7.0)
typescript:
specifier: ^5.5.4
version: 5.7.2
@@ -614,13 +726,13 @@ importers:
version: 4.1.3
'@types/node':
specifier: ^20.3.1
- version: 20.14.10
+ version: 20.17.12
concurrently:
specifier: ^8.0.0
version: 8.2.2
ioredis:
specifier: ^5.4.1
- version: 5.4.1
+ version: 5.4.2
rimraf:
specifier: ^6.0.1
version: 6.0.1
@@ -629,10 +741,89 @@ importers:
version: 13.2.3
ts-node:
specifier: ^10.9.1
- version: 10.9.2(@swc/core@1.6.13)(@types/node@20.14.10)(typescript@5.7.2)
+ version: 10.9.2(@swc/core@1.10.6)(@types/node@20.17.12)(typescript@5.7.2)
tsup:
specifier: ^8.3.5
- version: 8.3.5(@swc/core@1.6.13)(jiti@1.21.6)(postcss@8.4.49)(typescript@5.7.2)(yaml@2.4.5)
+ version: 8.3.5(@swc/core@1.10.6)(jiti@1.21.7)(postcss@8.4.49)(typescript@5.7.2)(yaml@2.7.0)
+ typescript:
+ specifier: ^5.5.4
+ version: 5.7.2
+
+ packages/ui:
+ dependencies:
+ '@dagrejs/dagre':
+ specifier: ^1.1.4
+ version: 1.1.4
+ '@nice/utils':
+ specifier: workspace:^
+ version: link:../utils
+ '@xyflow/react':
+ specifier: ^12.3.6
+ version: 12.3.6(@types/react@18.2.38)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ dagre:
+ specifier: ^0.8.5
+ version: 0.8.5
+ nanoid:
+ specifier: ^5.0.9
+ version: 5.0.9
+ react:
+ specifier: 18.2.0
+ version: 18.2.0
+ react-dom:
+ specifier: 18.2.0
+ version: 18.2.0(react@18.2.0)
+ react-hotkeys-hook:
+ specifier: ^4.6.1
+ version: 4.6.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ zustand:
+ specifier: ^5.0.3
+ version: 5.0.3(@types/react@18.2.38)(react@18.2.0)(use-sync-external-store@1.4.0(react@18.2.0))
+ devDependencies:
+ '@types/dagre':
+ specifier: ^0.7.52
+ version: 0.7.52
+ '@types/node':
+ specifier: ^20.3.1
+ version: 20.17.12
+ '@types/react':
+ specifier: 18.2.38
+ version: 18.2.38
+ '@types/react-dom':
+ specifier: 18.2.15
+ version: 18.2.15
+ concurrently:
+ specifier: ^8.0.0
+ version: 8.2.2
+ rimraf:
+ specifier: ^6.0.1
+ version: 6.0.1
+ ts-node:
+ specifier: ^10.9.1
+ version: 10.9.2(@swc/core@1.10.6)(@types/node@20.17.12)(typescript@5.7.2)
+ tsup:
+ specifier: ^8.3.5
+ version: 8.3.5(@swc/core@1.10.6)(jiti@1.21.7)(postcss@8.4.49)(typescript@5.7.2)(yaml@2.7.0)
+ typescript:
+ specifier: ^5.5.4
+ version: 5.7.2
+
+ packages/utils:
+ devDependencies:
+ '@types/node':
+ specifier: ^20.3.1
+ version: 20.17.12
+ concurrently:
+ specifier: ^8.0.0
+ version: 8.2.2
+ rimraf:
+ specifier: ^6.0.1
+ version: 6.0.1
+ ts-node:
+ specifier: ^10.9.1
+ version: 10.9.2(@swc/core@1.10.6)(@types/node@20.17.12)(typescript@5.7.2)
+ tsup:
+ specifier: ^8.3.5
+ version: 8.3.5(@swc/core@1.10.6)(jiti@1.21.7)(postcss@8.4.49)(typescript@5.7.2)(yaml@2.7.0)
typescript:
specifier: ^5.5.4
version: 5.7.2
@@ -699,8 +890,8 @@ packages:
resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
engines: {node: '>=6.0.0'}
- '@angular-devkit/core@17.3.8':
- resolution: {integrity: sha512-Q8q0voCGudbdCgJ7lXdnyaxKHbNQBARH68zPQV72WT8NWy+Gw/tys870i6L58NWbBaCJEUcIj/kb6KoakSRu+Q==}
+ '@angular-devkit/core@17.3.11':
+ resolution: {integrity: sha512-vTNDYNsLIWpYk2I969LMQFH29GTsLzxNk/0cLw5q56ARF0v5sIWfHYwGTS88jdDqIpuuettcSczbxeA7EuAmqQ==}
engines: {node: ^18.13.0 || >=20.9.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'}
peerDependencies:
chokidar: ^3.5.2
@@ -708,26 +899,26 @@ packages:
chokidar:
optional: true
- '@angular-devkit/schematics-cli@17.3.8':
- resolution: {integrity: sha512-TjmiwWJarX7oqvNiRAroQ5/LeKUatxBOCNEuKXO/PV8e7pn/Hr/BqfFm+UcYrQoFdZplmtNAfqmbqgVziKvCpA==}
+ '@angular-devkit/schematics-cli@17.3.11':
+ resolution: {integrity: sha512-kcOMqp+PHAKkqRad7Zd7PbpqJ0LqLaNZdY1+k66lLWmkEBozgq8v4ASn/puPWf9Bo0HpCiK+EzLf0VHE8Z/y6Q==}
engines: {node: ^18.13.0 || >=20.9.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'}
hasBin: true
- '@angular-devkit/schematics@17.3.8':
- resolution: {integrity: sha512-QRVEYpIfgkprNHc916JlPuNbLzOgrm9DZalHasnLUz4P6g7pR21olb8YCyM2OTJjombNhya9ZpckcADU5Qyvlg==}
+ '@angular-devkit/schematics@17.3.11':
+ resolution: {integrity: sha512-I5wviiIqiFwar9Pdk30Lujk8FczEEc18i22A5c6Z9lbmhPQdTroDnEQdsfXjy404wPe8H62s0I15o4pmMGfTYQ==}
engines: {node: ^18.13.0 || >=20.9.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'}
- '@ant-design/colors@7.1.0':
- resolution: {integrity: sha512-MMoDGWn1y9LdQJQSHiCC20x3uZ3CwQnv9QMz6pCmJOrqdgM9YxsoVVY0wtrdXbmfSgnV0KNk6zi09NAhMR2jvg==}
+ '@ant-design/colors@7.2.0':
+ resolution: {integrity: sha512-bjTObSnZ9C/O8MB/B4OUtd/q9COomuJAR2SYfhxLyHvCKn4EKwCN3e+fWGMo7H5InAyV0wL17jdE9ALrdOW/6A==}
- '@ant-design/cssinjs-utils@1.0.3':
- resolution: {integrity: sha512-BrztZZKuoYcJK8uEH40ylBemf/Mu/QPiDos56g2bv6eUoniQkgQHOCOvA3+pncoFO1TaS8xcUCIqGzDA0I+ZVQ==}
+ '@ant-design/cssinjs-utils@1.1.3':
+ resolution: {integrity: sha512-nOoQMLW1l+xR1Co8NFVYiP8pZp3VjIIzqV6D6ShYF2ljtdwWJn5WSsH+7kvCktXL/yhEtWURKOfH5Xz/gzlwsg==}
peerDependencies:
react: '>=16.9.0'
react-dom: '>=16.9.0'
- '@ant-design/cssinjs@1.21.1':
- resolution: {integrity: sha512-tyWnlK+XH7Bumd0byfbCiZNK43HEubMoCcu9VxwsAwiHdHTgWa+tMN0/yvxa+e8EzuFP1WdUNNPclRpVtD33lg==}
+ '@ant-design/cssinjs@1.22.1':
+ resolution: {integrity: sha512-SLuXM4wiEE1blOx94iXrkOgseMZHzdr4ngdFu3VVDq6AOWh7rlwqTkMAtJho3EsBF6x/eUGOtK53VZXGQG7+sQ==}
peerDependencies:
react: '>=16.0.0'
react-dom: '>=16.0.0'
@@ -739,8 +930,8 @@ packages:
'@ant-design/icons-svg@4.4.2':
resolution: {integrity: sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==}
- '@ant-design/icons@5.4.0':
- resolution: {integrity: sha512-QZbWC5xQYexCI5q4/fehSEkchJr5UGtvAJweT743qKUQQGs9IH2DehNLP49DJ3Ii9m9CijD2HN6fNy3WKhIFdA==}
+ '@ant-design/icons@5.5.2':
+ resolution: {integrity: sha512-xc53rjVBl9v2BqFxUjZGti/RfdDeA8/6KYglmInM2PNqSXc/WfuGDTifJI/ZsokJK0aeKvOIbXc9y2g8ILAhEA==}
engines: {node: '>=8'}
peerDependencies:
react: '>=16.0.0'
@@ -914,82 +1105,58 @@ packages:
resolution: {integrity: sha512-5xK2SqGU1mzzsOeemy7cy3fGKxR1sEpUs4pEiIjaT0OIvU+fZaDVUEYWOqsgns6wI90XZEQJlXtI8uAHX/do5Q==}
engines: {node: '>=18.0.0'}
- '@babel/code-frame@7.24.7':
- resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==}
+ '@babel/code-frame@7.26.2':
+ resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==}
engines: {node: '>=6.9.0'}
- '@babel/compat-data@7.24.7':
- resolution: {integrity: sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==}
+ '@babel/compat-data@7.26.3':
+ resolution: {integrity: sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==}
engines: {node: '>=6.9.0'}
- '@babel/core@7.24.7':
- resolution: {integrity: sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==}
+ '@babel/core@7.26.0':
+ resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==}
engines: {node: '>=6.9.0'}
- '@babel/generator@7.24.7':
- resolution: {integrity: sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==}
+ '@babel/generator@7.26.3':
+ resolution: {integrity: sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==}
engines: {node: '>=6.9.0'}
- '@babel/helper-compilation-targets@7.24.7':
- resolution: {integrity: sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==}
+ '@babel/helper-compilation-targets@7.25.9':
+ resolution: {integrity: sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==}
engines: {node: '>=6.9.0'}
- '@babel/helper-environment-visitor@7.24.7':
- resolution: {integrity: sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==}
+ '@babel/helper-module-imports@7.25.9':
+ resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==}
engines: {node: '>=6.9.0'}
- '@babel/helper-function-name@7.24.7':
- resolution: {integrity: sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==}
- engines: {node: '>=6.9.0'}
-
- '@babel/helper-hoist-variables@7.24.7':
- resolution: {integrity: sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==}
- engines: {node: '>=6.9.0'}
-
- '@babel/helper-module-imports@7.24.7':
- resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==}
- engines: {node: '>=6.9.0'}
-
- '@babel/helper-module-transforms@7.24.7':
- resolution: {integrity: sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==}
+ '@babel/helper-module-transforms@7.26.0':
+ resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0
- '@babel/helper-plugin-utils@7.24.7':
- resolution: {integrity: sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==}
+ '@babel/helper-plugin-utils@7.25.9':
+ resolution: {integrity: sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==}
engines: {node: '>=6.9.0'}
- '@babel/helper-simple-access@7.24.7':
- resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==}
+ '@babel/helper-string-parser@7.25.9':
+ resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==}
engines: {node: '>=6.9.0'}
- '@babel/helper-split-export-declaration@7.24.7':
- resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==}
+ '@babel/helper-validator-identifier@7.25.9':
+ resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==}
engines: {node: '>=6.9.0'}
- '@babel/helper-string-parser@7.24.7':
- resolution: {integrity: sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==}
+ '@babel/helper-validator-option@7.25.9':
+ resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==}
engines: {node: '>=6.9.0'}
- '@babel/helper-validator-identifier@7.24.7':
- resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==}
+ '@babel/helpers@7.26.0':
+ resolution: {integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==}
engines: {node: '>=6.9.0'}
- '@babel/helper-validator-option@7.24.7':
- resolution: {integrity: sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==}
- engines: {node: '>=6.9.0'}
-
- '@babel/helpers@7.24.7':
- resolution: {integrity: sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==}
- engines: {node: '>=6.9.0'}
-
- '@babel/highlight@7.24.7':
- resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==}
- engines: {node: '>=6.9.0'}
-
- '@babel/parser@7.24.7':
- resolution: {integrity: sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==}
+ '@babel/parser@7.26.3':
+ resolution: {integrity: sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==}
engines: {node: '>=6.0.0'}
hasBin: true
@@ -1008,6 +1175,18 @@ packages:
peerDependencies:
'@babel/core': ^7.0.0-0
+ '@babel/plugin-syntax-class-static-block@7.14.5':
+ resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-import-attributes@7.26.0':
+ resolution: {integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
'@babel/plugin-syntax-import-meta@7.10.4':
resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==}
peerDependencies:
@@ -1018,8 +1197,8 @@ packages:
peerDependencies:
'@babel/core': ^7.0.0-0
- '@babel/plugin-syntax-jsx@7.24.7':
- resolution: {integrity: sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==}
+ '@babel/plugin-syntax-jsx@7.25.9':
+ resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
@@ -1054,44 +1233,50 @@ packages:
peerDependencies:
'@babel/core': ^7.0.0-0
+ '@babel/plugin-syntax-private-property-in-object@7.14.5':
+ resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
'@babel/plugin-syntax-top-level-await@7.14.5':
resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- '@babel/plugin-syntax-typescript@7.24.7':
- resolution: {integrity: sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==}
+ '@babel/plugin-syntax-typescript@7.25.9':
+ resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- '@babel/plugin-transform-react-jsx-self@7.24.7':
- resolution: {integrity: sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw==}
+ '@babel/plugin-transform-react-jsx-self@7.25.9':
+ resolution: {integrity: sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- '@babel/plugin-transform-react-jsx-source@7.24.7':
- resolution: {integrity: sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ==}
+ '@babel/plugin-transform-react-jsx-source@7.25.9':
+ resolution: {integrity: sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- '@babel/runtime@7.25.0':
- resolution: {integrity: sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==}
+ '@babel/runtime@7.26.0':
+ resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==}
engines: {node: '>=6.9.0'}
- '@babel/template@7.24.7':
- resolution: {integrity: sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==}
+ '@babel/template@7.25.9':
+ resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==}
engines: {node: '>=6.9.0'}
- '@babel/traverse@7.24.7':
- resolution: {integrity: sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==}
+ '@babel/traverse@7.26.4':
+ resolution: {integrity: sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==}
engines: {node: '>=6.9.0'}
- '@babel/types@7.24.7':
- resolution: {integrity: sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==}
+ '@babel/types@7.26.3':
+ resolution: {integrity: sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==}
engines: {node: '>=6.9.0'}
'@bcoe/v8-coverage@0.2.3':
@@ -1105,9 +1290,34 @@ packages:
resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==}
engines: {node: '>=12'}
- '@ctrl/tinycolor@3.6.1':
- resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==}
- engines: {node: '>=10'}
+ '@dagrejs/dagre@1.1.4':
+ resolution: {integrity: sha512-QUTc54Cg/wvmlEUxB+uvoPVKFazM1H18kVHBQNmK2NbrDR5ihOCR6CXLnDSZzMcSQKJtabPUWridBOlJM3WkDg==}
+
+ '@dagrejs/graphlib@2.2.4':
+ resolution: {integrity: sha512-mepCf/e9+SKYy1d02/UkvSy6+6MoyXhVxP8lLDfA7BPE1X1d4dR0sZznmbM8/XVJ1GPM+Svnx7Xj6ZweByWUkw==}
+ engines: {node: '>17.0.0'}
+
+ '@dnd-kit/accessibility@3.1.1':
+ resolution: {integrity: sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw==}
+ peerDependencies:
+ react: '>=16.8.0'
+
+ '@dnd-kit/core@6.3.1':
+ resolution: {integrity: sha512-xkGBRQQab4RLwgXxoqETICr6S5JlogafbhNsidmrkVv2YRs5MLwpjoF2qpiGjQt8S9AoxtIV603s0GIUpY5eYQ==}
+ peerDependencies:
+ react: '>=16.8.0'
+ react-dom: '>=16.8.0'
+
+ '@dnd-kit/sortable@10.0.0':
+ resolution: {integrity: sha512-+xqhmIIzvAYMGfBYYnbKuNicfSsk4RksY2XdmJhT+HAC01nix6fHCztU68jooFiMUB01Ky3F0FyOvhG/BZrWkg==}
+ peerDependencies:
+ '@dnd-kit/core': ^6.3.0
+ react: '>=16.8.0'
+
+ '@dnd-kit/utilities@3.2.2':
+ resolution: {integrity: sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==}
+ peerDependencies:
+ react: '>=16.8.0'
'@emnapi/runtime@1.3.1':
resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==}
@@ -1406,16 +1616,12 @@ packages:
cpu: [x64]
os: [win32]
- '@eslint-community/eslint-utils@4.4.0':
- resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==}
+ '@eslint-community/eslint-utils@4.4.1':
+ resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
- '@eslint-community/regexpp@4.11.0':
- resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==}
- engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
-
'@eslint-community/regexpp@4.12.1':
resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==}
engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
@@ -1436,8 +1642,8 @@ packages:
resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@eslint/js@8.57.0':
- resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==}
+ '@eslint/js@8.57.1':
+ resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
'@eslint/js@9.17.0':
@@ -1458,11 +1664,11 @@ packages:
'@fast-csv/parse@4.3.6':
resolution: {integrity: sha512-uRsLYksqpbDmWaSmzvJcuApSEe38+6NQZBUsuAyMZKqHxH0g1wcJgsKUvN3WC8tewaqFjBMMGrkHmC+T7k8LvA==}
- '@floating-ui/core@1.6.8':
- resolution: {integrity: sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==}
+ '@floating-ui/core@1.6.9':
+ resolution: {integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==}
- '@floating-ui/dom@1.6.12':
- resolution: {integrity: sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w==}
+ '@floating-ui/dom@1.6.13':
+ resolution: {integrity: sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==}
'@floating-ui/react-dom@2.1.2':
resolution: {integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==}
@@ -1476,16 +1682,16 @@ packages:
react: '>=16.8.0'
react-dom: '>=16.8.0'
- '@floating-ui/utils@0.2.8':
- resolution: {integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==}
+ '@floating-ui/utils@0.2.9':
+ resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==}
'@heroicons/react@2.2.0':
resolution: {integrity: sha512-LMcepvRaS9LYHJGsF0zzmgKCUim/X3N/DQKc4jepAXJ7l8QxJ1PmxJzqplF2Z3FE4PqBAIGyJAQ/w4B5dsqbtQ==}
peerDependencies:
react: '>= 16 || ^19.0.0-rc'
- '@hookform/resolvers@3.9.1':
- resolution: {integrity: sha512-ud2HqmGBM0P0IABqoskKWI6PEf6ZDDBZkFqe2Vnl+mTHCEHzr3ISjjZyCwTjC/qpL25JC9aIDkloQejvMeq0ug==}
+ '@hookform/resolvers@3.10.0':
+ resolution: {integrity: sha512-79Dv+3mDF7i+2ajj7SkypSKHhl1cbln1OGavqrsF7p6mbUv11xpqpacPsGDCTRvCSjEEIez2ef1NveSVL3b0Ag==}
peerDependencies:
react-hook-form: ^7.0.0
@@ -1497,8 +1703,8 @@ packages:
resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==}
engines: {node: '>=18.18.0'}
- '@humanwhocodes/config-array@0.11.14':
- resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==}
+ '@humanwhocodes/config-array@0.13.0':
+ resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==}
engines: {node: '>=10.10.0'}
deprecated: Use @eslint/config-array instead
@@ -1716,8 +1922,8 @@ packages:
resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
- '@jridgewell/gen-mapping@0.3.5':
- resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==}
+ '@jridgewell/gen-mapping@0.3.8':
+ resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==}
engines: {node: '>=6.0.0'}
'@jridgewell/resolve-uri@3.1.2':
@@ -1778,25 +1984,25 @@ packages:
cpu: [x64]
os: [win32]
- '@nestjs/bull-shared@10.2.0':
- resolution: {integrity: sha512-cSi6CyPECHDFumnHWWfwLCnbc6hm5jXt7FqzJ0Id6EhGqdz5ja0FmgRwXoS4xoMA2RRjlxn2vGXr4YOaHBAeig==}
+ '@nestjs/bull-shared@10.2.3':
+ resolution: {integrity: sha512-XcgAjNOgq6b5DVCytxhR5BKiwWo7hsusVeyE7sfFnlXRHeEtIuC2hYWBr/ZAtvL/RH0/O0tqtq0rVl972nbhJw==}
peerDependencies:
'@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0
'@nestjs/core': ^8.0.0 || ^9.0.0 || ^10.0.0
- '@nestjs/bullmq@10.2.0':
- resolution: {integrity: sha512-lHXWDocXh1Yl6unsUzGFEKmK02mu0DdI35cdBp3Fq/9D5V3oLuWjwAPFnTztedshIjlFmNW6x5mdaT5WZ0AV1Q==}
+ '@nestjs/bullmq@10.2.3':
+ resolution: {integrity: sha512-Lo4W5kWD61/246Y6H70RNgV73ybfRbZyKKS4CBRDaMELpxgt89O+EgYZUB4pdoNrWH16rKcaT0AoVsB/iDztKg==}
peerDependencies:
'@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0
'@nestjs/core': ^8.0.0 || ^9.0.0 || ^10.0.0
bullmq: ^3.0.0 || ^4.0.0 || ^5.0.0
- '@nestjs/cli@10.4.2':
- resolution: {integrity: sha512-fQexIfLHfp6GUgX+CO4fOg+AEwV5ox/LHotQhyZi9wXUQDyIqS0NTTbumr//62EcX35qV4nU0359nYnuEdzG+A==}
+ '@nestjs/cli@10.4.9':
+ resolution: {integrity: sha512-s8qYd97bggqeK7Op3iD49X2MpFtW4LVNLAwXFkfbRxKME6IYT7X0muNTJ2+QfI8hpbNx9isWkrLWIp+g5FOhiA==}
engines: {node: '>= 16.14'}
hasBin: true
peerDependencies:
- '@swc/cli': ^0.1.62 || ^0.3.0 || ^0.4.0
+ '@swc/cli': ^0.1.62 || ^0.3.0 || ^0.4.0 || ^0.5.0
'@swc/core': ^1.3.62
peerDependenciesMeta:
'@swc/cli':
@@ -1804,8 +2010,8 @@ packages:
'@swc/core':
optional: true
- '@nestjs/common@10.3.10':
- resolution: {integrity: sha512-H8k0jZtxk1IdtErGDmxFRy0PfcOAUg41Prrqpx76DQusGGJjsaovs1zjXVD1rZWaVYchfT1uczJ6L4Kio10VNg==}
+ '@nestjs/common@10.4.15':
+ resolution: {integrity: sha512-vaLg1ZgwhG29BuLDxPA9OAcIlgqzp9/N8iG0wGapyUNTf4IY4O6zAHgN6QalwLhFxq7nOI021vdRojR1oF3bqg==}
peerDependencies:
class-transformer: '*'
class-validator: '*'
@@ -1817,14 +2023,14 @@ packages:
class-validator:
optional: true
- '@nestjs/config@3.2.3':
- resolution: {integrity: sha512-p6yv/CvoBewJ72mBq4NXgOAi2rSQNWx3a+IMJLVKS2uiwFCOQQuiIatGwq6MRjXV3Jr+B41iUO8FIf4xBrZ4/w==}
+ '@nestjs/config@3.3.0':
+ resolution: {integrity: sha512-pdGTp8m9d0ZCrjTpjkUbZx6gyf2IKf+7zlkrPNMsJzYZ4bFRRTpXrnj+556/5uiI6AfL5mMrJc2u7dB6bvM+VA==}
peerDependencies:
'@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0
rxjs: ^7.1.0
- '@nestjs/core@10.3.10':
- resolution: {integrity: sha512-ZbQ4jovQyzHtCGCrzK5NdtW1SYO2fHSsgSY1+/9WdruYCUra+JDkWEXgZ4M3Hv480Dl3OXehAmY1wCOojeMyMQ==}
+ '@nestjs/core@10.4.15':
+ resolution: {integrity: sha512-UBejmdiYwaH6fTsz2QFBlC1cJHM+3UDeLZN+CiP9I1fRv2KlBZsmozGLbV5eS1JAVWJB4T5N5yQ0gjN8ZvcS2w==}
peerDependencies:
'@nestjs/common': ^10.0.0
'@nestjs/microservices': ^10.0.0
@@ -1845,32 +2051,32 @@ packages:
peerDependencies:
'@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0
- '@nestjs/platform-express@10.3.10':
- resolution: {integrity: sha512-wK2ow3CZI2KFqWeEpPmoR300OB6BcBLxARV1EiClJLCj4S1mZsoCmS0YWgpk3j1j6mo0SI8vNLi/cC2iZPEPQA==}
+ '@nestjs/platform-express@10.4.15':
+ resolution: {integrity: sha512-63ZZPkXHjoDyO7ahGOVcybZCRa7/Scp6mObQKjcX/fTEq1YJeU75ELvMsuQgc8U2opMGOBD7GVuc4DV0oeDHoA==}
peerDependencies:
'@nestjs/common': ^10.0.0
'@nestjs/core': ^10.0.0
- '@nestjs/platform-socket.io@10.4.1':
- resolution: {integrity: sha512-cxn5vKBAbqtEVPl0qVcJpR4sC12+hzcY/mYXGW6ippOKQDBNc2OF8oZXu6V3O1MvAl+VM7eNNEsLmP9DRKQlnw==}
+ '@nestjs/platform-socket.io@10.4.15':
+ resolution: {integrity: sha512-KZAxNEADPwoORixh3NJgGYWMVGORVPKeTqjD7hbF8TPDLKWWxru9yasBQwEz2/wXH/WgpkQbbaYwx4nUjCIVpw==}
peerDependencies:
'@nestjs/common': ^10.0.0
'@nestjs/websockets': ^10.0.0
rxjs: ^7.1.0
- '@nestjs/schedule@4.1.0':
- resolution: {integrity: sha512-WEc96WTXZW+VI/Ng+uBpiBUwm6TWtAbQ4RKWkfbmzKvmbRGzA/9k/UyAWDS9k0pp+ZcbC+MaZQtt7TjQHrwX6g==}
+ '@nestjs/schedule@4.1.2':
+ resolution: {integrity: sha512-hCTQ1lNjIA5EHxeu8VvQu2Ed2DBLS1GSC6uKPYlBiQe6LL9a7zfE9iVSK+zuK8E2odsApteEBmfAQchc8Hx0Gg==}
peerDependencies:
'@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0
'@nestjs/core': ^8.0.0 || ^9.0.0 || ^10.0.0
- '@nestjs/schematics@10.1.2':
- resolution: {integrity: sha512-S0bMtZM5U4mAiqkhRyZkXgjmOHBS5P/lp/vEydgMR4F7csOShc3jFeKVs1Eghd9xCFezGKy3SHy7hFT6dpPhWQ==}
+ '@nestjs/schematics@10.2.3':
+ resolution: {integrity: sha512-4e8gxaCk7DhBxVUly2PjYL4xC2ifDFexCqq1/u4TtivLGXotVk0wHdYuPYe1tHTHuR1lsOkRbfOCpkdTnigLVg==}
peerDependencies:
typescript: '>=4.8.2'
- '@nestjs/testing@10.3.10':
- resolution: {integrity: sha512-i3HAtVQJijxNxJq1k39aelyJlyEIBRONys7IipH/4r8W0J+M1V+y5EKDOyi4j1SdNSb/vmNyWpZ2/ewZjl3kRA==}
+ '@nestjs/testing@10.4.15':
+ resolution: {integrity: sha512-eGlWESkACMKti+iZk1hs6FUY/UqObmMaa8HAN9JLnaYkoLf1Jeh+EuHlGnfqo/Rq77oznNLIyaA3PFjrFDlNUg==}
peerDependencies:
'@nestjs/common': ^10.0.0
'@nestjs/core': ^10.0.0
@@ -1882,8 +2088,8 @@ packages:
'@nestjs/platform-express':
optional: true
- '@nestjs/websockets@10.3.10':
- resolution: {integrity: sha512-F/fhAC0ylAhjfCZj4Xrgc0yTJ/qltooDCa+fke7BFZLofLmE0yj7WzBVrBHsk/46kppyRcs5XrYjIQLqcDze8g==}
+ '@nestjs/websockets@10.4.15':
+ resolution: {integrity: sha512-OmCUJwvtagzXfMVko595O98UI3M9zg+URL+/HV7vd3QPMCZ3uGCKSq15YYJ99LHJn9NyK4e4Szm2KnHtUg2QzA==}
peerDependencies:
'@nestjs/common': ^10.0.0
'@nestjs/core': ^10.0.0
@@ -1911,6 +2117,12 @@ packages:
engines: {node: '>=8.0.0', npm: '>=5.0.0'}
hasBin: true
+ '@pdf-lib/standard-fonts@1.0.0':
+ resolution: {integrity: sha512-hU30BK9IUN/su0Mn9VdlVKsWBS6GyhVfqjwl1FjZN4TxP6cCw0jP2w7V3Hf5uX7M0AZJ16vey9yE0ny7Sa59ZA==}
+
+ '@pdf-lib/upng@1.0.1':
+ resolution: {integrity: sha512-dQK2FUMQtowVP00mtIksrlZhdFXQZPC+taih1q4CvPZ5vqdxR/LKBaFg0oAfzd1GlHZXXSPdQfzQnt+ViGvEIQ==}
+
'@phc/format@1.0.0':
resolution: {integrity: sha512-m7X9U6BG2+J+R1lSOdCiITLLrxm+cWlNI3HUFA92oLO77ObGNzaKdh8pMLqdZcshtkKuV84olNNXDfMc4FezBQ==}
engines: {node: '>=10'}
@@ -1995,8 +2207,8 @@ packages:
react: '>=16.9.0'
react-dom: '>=16.9.0'
- '@rc-component/trigger@2.2.2':
- resolution: {integrity: sha512-xDyi0fJ3IV6XJEReMOewS9PEnnuLHKz4rjbgIniDsJFHjL5nROuUlu64mfo90jglLDkQUxRwK7aTtumA65/zYQ==}
+ '@rc-component/trigger@2.2.6':
+ resolution: {integrity: sha512-/9zuTnWwhQ3S3WT1T8BubuFTT46kvnXgaERR9f4BTKyn61/wpf/BvbImzYBubzJibU707FxwbKszLlHjcLiv1Q==}
engines: {node: '>=8.x'}
peerDependencies:
react: '>=16.9.0'
@@ -2006,12 +2218,12 @@ packages:
resolution: {integrity: sha512-aR0uffYI700OEEH4gYnitAnv3vzVGXCFvYfdpu/CJKvk4pHfLPEy/JSZyrpQ+15WhXe1yJRXLtfQ84s4mEXnPg==}
engines: {node: '>=14'}
- '@remix-run/router@1.17.1':
- resolution: {integrity: sha512-mCOMec4BKd6BRGBZeSnGiIgwsbLGp3yhVqAD8H+PxiRNEHgDpZb8J1TnrSDlg97t0ySKMQJTHCWBCmBpSmkF6Q==}
+ '@remix-run/router@1.21.0':
+ resolution: {integrity: sha512-xfSkCAchbdG5PnbrKqFWwia4Bi61nH+wm8wLEqfHDyp7Y3dZzgqS2itV8i4gAq9pC2HsTpwyBC6Ds8VHZ96JlA==}
engines: {node: '>=14.0.0'}
- '@rollup/pluginutils@5.1.0':
- resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==}
+ '@rollup/pluginutils@5.1.4':
+ resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==}
engines: {node: '>=14.0.0'}
peerDependencies:
rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
@@ -2019,197 +2231,108 @@ packages:
rollup:
optional: true
- '@rollup/rollup-android-arm-eabi@4.18.1':
- resolution: {integrity: sha512-lncuC4aHicncmbORnx+dUaAgzee9cm/PbIqgWz1PpXuwc+sa1Ct83tnqUDy/GFKleLiN7ZIeytM6KJ4cAn1SxA==}
+ '@rollup/rollup-android-arm-eabi@4.30.1':
+ resolution: {integrity: sha512-pSWY+EVt3rJ9fQ3IqlrEUtXh3cGqGtPDH1FQlNZehO2yYxCHEX1SPsz1M//NXwYfbTlcKr9WObLnJX9FsS9K1Q==}
cpu: [arm]
os: [android]
- '@rollup/rollup-android-arm-eabi@4.29.1':
- resolution: {integrity: sha512-ssKhA8RNltTZLpG6/QNkCSge+7mBQGUqJRisZ2MDQcEGaK93QESEgWK2iOpIDZ7k9zPVkG5AS3ksvD5ZWxmItw==}
- cpu: [arm]
- os: [android]
-
- '@rollup/rollup-android-arm64@4.18.1':
- resolution: {integrity: sha512-F/tkdw0WSs4ojqz5Ovrw5r9odqzFjb5LIgHdHZG65dFI1lWTWRVy32KDJLKRISHgJvqUeUhdIvy43fX41znyDg==}
+ '@rollup/rollup-android-arm64@4.30.1':
+ resolution: {integrity: sha512-/NA2qXxE3D/BRjOJM8wQblmArQq1YoBVJjrjoTSBS09jgUisq7bqxNHJ8kjCHeV21W/9WDGwJEWSN0KQ2mtD/w==}
cpu: [arm64]
os: [android]
- '@rollup/rollup-android-arm64@4.29.1':
- resolution: {integrity: sha512-CaRfrV0cd+NIIcVVN/jx+hVLN+VRqnuzLRmfmlzpOzB87ajixsN/+9L5xNmkaUUvEbI5BmIKS+XTwXsHEb65Ew==}
- cpu: [arm64]
- os: [android]
-
- '@rollup/rollup-darwin-arm64@4.18.1':
- resolution: {integrity: sha512-vk+ma8iC1ebje/ahpxpnrfVQJibTMyHdWpOGZ3JpQ7Mgn/3QNHmPq7YwjZbIE7km73dH5M1e6MRRsnEBW7v5CQ==}
+ '@rollup/rollup-darwin-arm64@4.30.1':
+ resolution: {integrity: sha512-r7FQIXD7gB0WJ5mokTUgUWPl0eYIH0wnxqeSAhuIwvnnpjdVB8cRRClyKLQr7lgzjctkbp5KmswWszlwYln03Q==}
cpu: [arm64]
os: [darwin]
- '@rollup/rollup-darwin-arm64@4.29.1':
- resolution: {integrity: sha512-2ORr7T31Y0Mnk6qNuwtyNmy14MunTAMx06VAPI6/Ju52W10zk1i7i5U3vlDRWjhOI5quBcrvhkCHyF76bI7kEw==}
- cpu: [arm64]
- os: [darwin]
-
- '@rollup/rollup-darwin-x64@4.18.1':
- resolution: {integrity: sha512-IgpzXKauRe1Tafcej9STjSSuG0Ghu/xGYH+qG6JwsAUxXrnkvNHcq/NL6nz1+jzvWAnQkuAJ4uIwGB48K9OCGA==}
+ '@rollup/rollup-darwin-x64@4.30.1':
+ resolution: {integrity: sha512-x78BavIwSH6sqfP2xeI1hd1GpHL8J4W2BXcVM/5KYKoAD3nNsfitQhvWSw+TFtQTLZ9OmlF+FEInEHyubut2OA==}
cpu: [x64]
os: [darwin]
- '@rollup/rollup-darwin-x64@4.29.1':
- resolution: {integrity: sha512-j/Ej1oanzPjmN0tirRd5K2/nncAhS9W6ICzgxV+9Y5ZsP0hiGhHJXZ2JQ53iSSjj8m6cRY6oB1GMzNn2EUt6Ng==}
- cpu: [x64]
- os: [darwin]
-
- '@rollup/rollup-freebsd-arm64@4.29.1':
- resolution: {integrity: sha512-91C//G6Dm/cv724tpt7nTyP+JdN12iqeXGFM1SqnljCmi5yTXriH7B1r8AD9dAZByHpKAumqP1Qy2vVNIdLZqw==}
+ '@rollup/rollup-freebsd-arm64@4.30.1':
+ resolution: {integrity: sha512-HYTlUAjbO1z8ywxsDFWADfTRfTIIy/oUlfIDmlHYmjUP2QRDTzBuWXc9O4CXM+bo9qfiCclmHk1x4ogBjOUpUQ==}
cpu: [arm64]
os: [freebsd]
- '@rollup/rollup-freebsd-x64@4.29.1':
- resolution: {integrity: sha512-hEioiEQ9Dec2nIRoeHUP6hr1PSkXzQaCUyqBDQ9I9ik4gCXQZjJMIVzoNLBRGet+hIUb3CISMh9KXuCcWVW/8w==}
+ '@rollup/rollup-freebsd-x64@4.30.1':
+ resolution: {integrity: sha512-1MEdGqogQLccphhX5myCJqeGNYTNcmTyaic9S7CG3JhwuIByJ7J05vGbZxsizQthP1xpVx7kd3o31eOogfEirw==}
cpu: [x64]
os: [freebsd]
- '@rollup/rollup-linux-arm-gnueabihf@4.18.1':
- resolution: {integrity: sha512-P9bSiAUnSSM7EmyRK+e5wgpqai86QOSv8BwvkGjLwYuOpaeomiZWifEos517CwbG+aZl1T4clSE1YqqH2JRs+g==}
+ '@rollup/rollup-linux-arm-gnueabihf@4.30.1':
+ resolution: {integrity: sha512-PaMRNBSqCx7K3Wc9QZkFx5+CX27WFpAMxJNiYGAXfmMIKC7jstlr32UhTgK6T07OtqR+wYlWm9IxzennjnvdJg==}
cpu: [arm]
os: [linux]
libc: [glibc]
- '@rollup/rollup-linux-arm-gnueabihf@4.29.1':
- resolution: {integrity: sha512-Py5vFd5HWYN9zxBv3WMrLAXY3yYJ6Q/aVERoeUFwiDGiMOWsMs7FokXihSOaT/PMWUty/Pj60XDQndK3eAfE6A==}
- cpu: [arm]
- os: [linux]
- libc: [glibc]
-
- '@rollup/rollup-linux-arm-musleabihf@4.18.1':
- resolution: {integrity: sha512-5RnjpACoxtS+aWOI1dURKno11d7krfpGDEn19jI8BuWmSBbUC4ytIADfROM1FZrFhQPSoP+KEa3NlEScznBTyQ==}
+ '@rollup/rollup-linux-arm-musleabihf@4.30.1':
+ resolution: {integrity: sha512-B8Rcyj9AV7ZlEFqvB5BubG5iO6ANDsRKlhIxySXcF1axXYUyqwBok+XZPgIYGBgs7LDXfWfifxhw0Ik57T0Yug==}
cpu: [arm]
os: [linux]
libc: [musl]
- '@rollup/rollup-linux-arm-musleabihf@4.29.1':
- resolution: {integrity: sha512-RiWpGgbayf7LUcuSNIbahr0ys2YnEERD4gYdISA06wa0i8RALrnzflh9Wxii7zQJEB2/Eh74dX4y/sHKLWp5uQ==}
- cpu: [arm]
- os: [linux]
- libc: [musl]
-
- '@rollup/rollup-linux-arm64-gnu@4.18.1':
- resolution: {integrity: sha512-8mwmGD668m8WaGbthrEYZ9CBmPug2QPGWxhJxh/vCgBjro5o96gL04WLlg5BA233OCWLqERy4YUzX3bJGXaJgQ==}
+ '@rollup/rollup-linux-arm64-gnu@4.30.1':
+ resolution: {integrity: sha512-hqVyueGxAj3cBKrAI4aFHLV+h0Lv5VgWZs9CUGqr1z0fZtlADVV1YPOij6AhcK5An33EXaxnDLmJdQikcn5NEw==}
cpu: [arm64]
os: [linux]
libc: [glibc]
- '@rollup/rollup-linux-arm64-gnu@4.29.1':
- resolution: {integrity: sha512-Z80O+taYxTQITWMjm/YqNoe9d10OX6kDh8X5/rFCMuPqsKsSyDilvfg+vd3iXIqtfmp+cnfL1UrYirkaF8SBZA==}
- cpu: [arm64]
- os: [linux]
- libc: [glibc]
-
- '@rollup/rollup-linux-arm64-musl@4.18.1':
- resolution: {integrity: sha512-dJX9u4r4bqInMGOAQoGYdwDP8lQiisWb9et+T84l2WXk41yEej8v2iGKodmdKimT8cTAYt0jFb+UEBxnPkbXEQ==}
+ '@rollup/rollup-linux-arm64-musl@4.30.1':
+ resolution: {integrity: sha512-i4Ab2vnvS1AE1PyOIGp2kXni69gU2DAUVt6FSXeIqUCPIR3ZlheMW3oP2JkukDfu3PsexYRbOiJrY+yVNSk9oA==}
cpu: [arm64]
os: [linux]
libc: [musl]
- '@rollup/rollup-linux-arm64-musl@4.29.1':
- resolution: {integrity: sha512-fOHRtF9gahwJk3QVp01a/GqS4hBEZCV1oKglVVq13kcK3NeVlS4BwIFzOHDbmKzt3i0OuHG4zfRP0YoG5OF/rA==}
- cpu: [arm64]
- os: [linux]
- libc: [musl]
-
- '@rollup/rollup-linux-loongarch64-gnu@4.29.1':
- resolution: {integrity: sha512-5a7q3tnlbcg0OodyxcAdrrCxFi0DgXJSoOuidFUzHZ2GixZXQs6Tc3CHmlvqKAmOs5eRde+JJxeIf9DonkmYkw==}
+ '@rollup/rollup-linux-loongarch64-gnu@4.30.1':
+ resolution: {integrity: sha512-fARcF5g296snX0oLGkVxPmysetwUk2zmHcca+e9ObOovBR++9ZPOhqFUM61UUZ2EYpXVPN1redgqVoBB34nTpQ==}
cpu: [loong64]
os: [linux]
libc: [glibc]
- '@rollup/rollup-linux-powerpc64le-gnu@4.18.1':
- resolution: {integrity: sha512-V72cXdTl4EI0x6FNmho4D502sy7ed+LuVW6Ym8aI6DRQ9hQZdp5sj0a2usYOlqvFBNKQnLQGwmYnujo2HvjCxQ==}
+ '@rollup/rollup-linux-powerpc64le-gnu@4.30.1':
+ resolution: {integrity: sha512-GLrZraoO3wVT4uFXh67ElpwQY0DIygxdv0BNW9Hkm3X34wu+BkqrDrkcsIapAY+N2ATEbvak0XQ9gxZtCIA5Rw==}
cpu: [ppc64]
os: [linux]
libc: [glibc]
- '@rollup/rollup-linux-powerpc64le-gnu@4.29.1':
- resolution: {integrity: sha512-9b4Mg5Yfz6mRnlSPIdROcfw1BU22FQxmfjlp/CShWwO3LilKQuMISMTtAu/bxmmrE6A902W2cZJuzx8+gJ8e9w==}
- cpu: [ppc64]
- os: [linux]
- libc: [glibc]
-
- '@rollup/rollup-linux-riscv64-gnu@4.18.1':
- resolution: {integrity: sha512-f+pJih7sxoKmbjghrM2RkWo2WHUW8UbfxIQiWo5yeCaCM0TveMEuAzKJte4QskBp1TIinpnRcxkquY+4WuY/tg==}
+ '@rollup/rollup-linux-riscv64-gnu@4.30.1':
+ resolution: {integrity: sha512-0WKLaAUUHKBtll0wvOmh6yh3S0wSU9+yas923JIChfxOaaBarmb/lBKPF0w/+jTVozFnOXJeRGZ8NvOxvk/jcw==}
cpu: [riscv64]
os: [linux]
libc: [glibc]
- '@rollup/rollup-linux-riscv64-gnu@4.29.1':
- resolution: {integrity: sha512-G5pn0NChlbRM8OJWpJFMX4/i8OEU538uiSv0P6roZcbpe/WfhEO+AT8SHVKfp8qhDQzaz7Q+1/ixMy7hBRidnQ==}
- cpu: [riscv64]
- os: [linux]
- libc: [glibc]
-
- '@rollup/rollup-linux-s390x-gnu@4.18.1':
- resolution: {integrity: sha512-qb1hMMT3Fr/Qz1OKovCuUM11MUNLUuHeBC2DPPAWUYYUAOFWaxInaTwTQmc7Fl5La7DShTEpmYwgdt2hG+4TEg==}
+ '@rollup/rollup-linux-s390x-gnu@4.30.1':
+ resolution: {integrity: sha512-GWFs97Ruxo5Bt+cvVTQkOJ6TIx0xJDD/bMAOXWJg8TCSTEK8RnFeOeiFTxKniTc4vMIaWvCplMAFBt9miGxgkA==}
cpu: [s390x]
os: [linux]
libc: [glibc]
- '@rollup/rollup-linux-s390x-gnu@4.29.1':
- resolution: {integrity: sha512-WM9lIkNdkhVwiArmLxFXpWndFGuOka4oJOZh8EP3Vb8q5lzdSCBuhjavJsw68Q9AKDGeOOIHYzYm4ZFvmWez5g==}
- cpu: [s390x]
- os: [linux]
- libc: [glibc]
-
- '@rollup/rollup-linux-x64-gnu@4.18.1':
- resolution: {integrity: sha512-7O5u/p6oKUFYjRbZkL2FLbwsyoJAjyeXHCU3O4ndvzg2OFO2GinFPSJFGbiwFDaCFc+k7gs9CF243PwdPQFh5g==}
+ '@rollup/rollup-linux-x64-gnu@4.30.1':
+ resolution: {integrity: sha512-UtgGb7QGgXDIO+tqqJ5oZRGHsDLO8SlpE4MhqpY9Llpzi5rJMvrK6ZGhsRCST2abZdBqIBeXW6WPD5fGK5SDwg==}
cpu: [x64]
os: [linux]
libc: [glibc]
- '@rollup/rollup-linux-x64-gnu@4.29.1':
- resolution: {integrity: sha512-87xYCwb0cPGZFoGiErT1eDcssByaLX4fc0z2nRM6eMtV9njAfEE6OW3UniAoDhX4Iq5xQVpE6qO9aJbCFumKYQ==}
- cpu: [x64]
- os: [linux]
- libc: [glibc]
-
- '@rollup/rollup-linux-x64-musl@4.18.1':
- resolution: {integrity: sha512-pDLkYITdYrH/9Cv/Vlj8HppDuLMDUBmgsM0+N+xLtFd18aXgM9Nyqupb/Uw+HeidhfYg2lD6CXvz6CjoVOaKjQ==}
+ '@rollup/rollup-linux-x64-musl@4.30.1':
+ resolution: {integrity: sha512-V9U8Ey2UqmQsBT+xTOeMzPzwDzyXmnAoO4edZhL7INkwQcaW1Ckv3WJX3qrrp/VHaDkEWIBWhRwP47r8cdrOow==}
cpu: [x64]
os: [linux]
libc: [musl]
- '@rollup/rollup-linux-x64-musl@4.29.1':
- resolution: {integrity: sha512-xufkSNppNOdVRCEC4WKvlR1FBDyqCSCpQeMMgv9ZyXqqtKBfkw1yfGMTUTs9Qsl6WQbJnsGboWCp7pJGkeMhKA==}
- cpu: [x64]
- os: [linux]
- libc: [musl]
-
- '@rollup/rollup-win32-arm64-msvc@4.18.1':
- resolution: {integrity: sha512-W2ZNI323O/8pJdBGil1oCauuCzmVd9lDmWBBqxYZcOqWD6aWqJtVBQ1dFrF4dYpZPks6F+xCZHfzG5hYlSHZ6g==}
+ '@rollup/rollup-win32-arm64-msvc@4.30.1':
+ resolution: {integrity: sha512-WabtHWiPaFF47W3PkHnjbmWawnX/aE57K47ZDT1BXTS5GgrBUEpvOzq0FI0V/UYzQJgdb8XlhVNH8/fwV8xDjw==}
cpu: [arm64]
os: [win32]
- '@rollup/rollup-win32-arm64-msvc@4.29.1':
- resolution: {integrity: sha512-F2OiJ42m77lSkizZQLuC+jiZ2cgueWQL5YC9tjo3AgaEw+KJmVxHGSyQfDUoYR9cci0lAywv2Clmckzulcq6ig==}
- cpu: [arm64]
- os: [win32]
-
- '@rollup/rollup-win32-ia32-msvc@4.18.1':
- resolution: {integrity: sha512-ELfEX1/+eGZYMaCIbK4jqLxO1gyTSOIlZr6pbC4SRYFaSIDVKOnZNMdoZ+ON0mrFDp4+H5MhwNC1H/AhE3zQLg==}
+ '@rollup/rollup-win32-ia32-msvc@4.30.1':
+ resolution: {integrity: sha512-pxHAU+Zv39hLUTdQQHUVHf4P+0C47y/ZloorHpzs2SXMRqeAWmGghzAhfOlzFHHwjvgokdFAhC4V+6kC1lRRfw==}
cpu: [ia32]
os: [win32]
- '@rollup/rollup-win32-ia32-msvc@4.29.1':
- resolution: {integrity: sha512-rYRe5S0FcjlOBZQHgbTKNrqxCBUmgDJem/VQTCcTnA2KCabYSWQDrytOzX7avb79cAAweNmMUb/Zw18RNd4mng==}
- cpu: [ia32]
- os: [win32]
-
- '@rollup/rollup-win32-x64-msvc@4.18.1':
- resolution: {integrity: sha512-yjk2MAkQmoaPYCSu35RLJ62+dz358nE83VfTePJRp8CG7aMg25mEJYpXFiD+NcevhX8LxD5OP5tktPXnXN7GDw==}
- cpu: [x64]
- os: [win32]
-
- '@rollup/rollup-win32-x64-msvc@4.29.1':
- resolution: {integrity: sha512-+10CMg9vt1MoHj6x1pxyjPSMjHTIlqs8/tBztXvPAx24SKs9jwVnKqHJumlH/IzhaPUaj3T6T6wfZr8okdXaIg==}
+ '@rollup/rollup-win32-x64-msvc@4.30.1':
+ resolution: {integrity: sha512-D6qjsXGcvhTjv0kI4fU8tUuBDF/Ueee4SVX79VfNDXZa64TfCW1Slkb6Z7O1p7vflqZjcmOVdZlqf8gvJxc6og==}
cpu: [x64]
os: [win32]
@@ -2441,6 +2564,9 @@ packages:
'@socket.io/component-emitter@3.1.2':
resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==}
+ '@svgdotjs/svg.js@3.2.0':
+ resolution: {integrity: sha512-Tr8p+QVP7y+QT1GBlq1Tt57IvedVH8zCPoYxdHLX0Oof3a/PqnC/tXAkVufv1JQJfsDHlH/UrjcDfgxSofqSNA==}
+
'@svgr/babel-plugin-add-jsx-attribute@8.0.0':
resolution: {integrity: sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==}
engines: {node: '>=14'}
@@ -2509,72 +2635,72 @@ packages:
peerDependencies:
'@svgr/core': '*'
- '@swc/core-darwin-arm64@1.6.13':
- resolution: {integrity: sha512-SOF4buAis72K22BGJ3N8y88mLNfxLNprTuJUpzikyMGrvkuBFNcxYtMhmomO0XHsgLDzOJ+hWzcgjRNzjMsUcQ==}
+ '@swc/core-darwin-arm64@1.10.6':
+ resolution: {integrity: sha512-USbMvT8Rw5PvIfF6HyTm+yW84J9c45emzmHBDIWY76vZHkFsS5MepNi+JLQyBzBBgE7ScwBRBNhRx6VNhkSoww==}
engines: {node: '>=10'}
cpu: [arm64]
os: [darwin]
- '@swc/core-darwin-x64@1.6.13':
- resolution: {integrity: sha512-AW8akFSC+tmPE6YQQvK9S2A1B8pjnXEINg+gGgw0KRUUXunvu1/OEOeC5L2Co1wAwhD7bhnaefi06Qi9AiwOag==}
+ '@swc/core-darwin-x64@1.10.6':
+ resolution: {integrity: sha512-7t2IozcZN4r1p27ei+Kb8IjN4aLoBDn107fPi+aPLcVp2uFgJEUzhCDuZXBNW2057Mx1OHcjzrkaleRpECz3Xg==}
engines: {node: '>=10'}
cpu: [x64]
os: [darwin]
- '@swc/core-linux-arm-gnueabihf@1.6.13':
- resolution: {integrity: sha512-f4gxxvDXVUm2HLYXRd311mSrmbpQF2MZ4Ja6XCQz1hWAxXdhRl1gpnZ+LH/xIfGSwQChrtLLVrkxdYUCVuIjFg==}
+ '@swc/core-linux-arm-gnueabihf@1.10.6':
+ resolution: {integrity: sha512-CPgWT+D0bDp/qhXsLkIJ54LmKU1/zvyGaf/yz8A4iR+YoF6R5CSXENXhNJY8cIrb6+uNWJZzHJ+gefB5V51bpA==}
engines: {node: '>=10'}
cpu: [arm]
os: [linux]
- '@swc/core-linux-arm64-gnu@1.6.13':
- resolution: {integrity: sha512-Nf/eoW2CbG8s+9JoLtjl9FByBXyQ5cjdBsA4efO7Zw4p+YSuXDgc8HRPC+E2+ns0praDpKNZtLvDtmF2lL+2Gg==}
+ '@swc/core-linux-arm64-gnu@1.10.6':
+ resolution: {integrity: sha512-5qZ6hVnqO/ShETXdGSzvdGUVx372qydlj1YWSYiaxQzTAepEBc8TC1NVUgYtOHOKVRkky1d7p6GQ9lymsd4bHw==}
engines: {node: '>=10'}
cpu: [arm64]
os: [linux]
libc: [glibc]
- '@swc/core-linux-arm64-musl@1.6.13':
- resolution: {integrity: sha512-2OysYSYtdw79prJYuKIiux/Gj0iaGEbpS2QZWCIY4X9sGoETJ5iMg+lY+YCrIxdkkNYd7OhIbXdYFyGs/w5LDg==}
+ '@swc/core-linux-arm64-musl@1.10.6':
+ resolution: {integrity: sha512-hB2xZFmXCKf2iJF5y2z01PSuLqEoUP3jIX/XlIHN+/AIP7PkSKsValE63LnjlnWPnSEI0IxUyRE3T3FzWE/fQQ==}
engines: {node: '>=10'}
cpu: [arm64]
os: [linux]
libc: [musl]
- '@swc/core-linux-x64-gnu@1.6.13':
- resolution: {integrity: sha512-PkR4CZYJNk5hcd2+tMWBpnisnmYsUzazI1O5X7VkIGFcGePTqJ/bWlfUIVVExWxvAI33PQFzLbzmN5scyIUyGQ==}
+ '@swc/core-linux-x64-gnu@1.10.6':
+ resolution: {integrity: sha512-PRGPp0I22+oJ8RMGg8M4hXYxEffH3ayu0WoSDPOjfol1F51Wj1tfTWN4wVa2RibzJjkBwMOT0KGLGb/hSEDDXQ==}
engines: {node: '>=10'}
cpu: [x64]
os: [linux]
libc: [glibc]
- '@swc/core-linux-x64-musl@1.6.13':
- resolution: {integrity: sha512-OdsY7wryTxCKwGQcwW9jwWg3cxaHBkTTHi91+5nm7hFPpmZMz1HivJrWAMwVE7iXFw+M4l6ugB/wCvpYrUAAjA==}
+ '@swc/core-linux-x64-musl@1.10.6':
+ resolution: {integrity: sha512-SoNBxlA86lnoV9vIz/TCyakLkdRhFSHx6tFMKNH8wAhz1kKYbZfDmpYoIzeQqdTh0tpx8e/Zu1zdK4smovsZqQ==}
engines: {node: '>=10'}
cpu: [x64]
os: [linux]
libc: [musl]
- '@swc/core-win32-arm64-msvc@1.6.13':
- resolution: {integrity: sha512-ap6uNmYjwk9M/+bFEuWRNl3hq4VqgQ/Lk+ID/F5WGqczNr0L7vEf+pOsRAn0F6EV+o/nyb3ePt8rLhE/wjHpPg==}
+ '@swc/core-win32-arm64-msvc@1.10.6':
+ resolution: {integrity: sha512-6L5Y2E+FVvM+BtoA+mJFjf/SjpFr73w2kHBxINxwH8/PkjAjkePDr5m0ibQhPXV61bTwX49+1otzTY85EsUW9Q==}
engines: {node: '>=10'}
cpu: [arm64]
os: [win32]
- '@swc/core-win32-ia32-msvc@1.6.13':
- resolution: {integrity: sha512-IJ8KH4yIUHTnS/U1jwQmtbfQals7zWPG0a9hbEfIr4zI0yKzjd83lmtS09lm2Q24QBWOCFGEEbuZxR4tIlvfzA==}
+ '@swc/core-win32-ia32-msvc@1.10.6':
+ resolution: {integrity: sha512-kxK3tW8DJwEkAkwy0vhwoBAShRebH1QTe0mvH9tlBQ21rToVZQn+GCV/I44dind80hYPw0Tw2JKFVfoEJyBszg==}
engines: {node: '>=10'}
cpu: [ia32]
os: [win32]
- '@swc/core-win32-x64-msvc@1.6.13':
- resolution: {integrity: sha512-f6/sx6LMuEnbuxtiSL/EkR0Y6qUHFw1XVrh6rwzKXptTipUdOY+nXpKoh+1UsBm/r7H0/5DtOdrn3q5ZHbFZjQ==}
+ '@swc/core-win32-x64-msvc@1.10.6':
+ resolution: {integrity: sha512-4pJka/+t8XcHee12G/R5VWcilkp5poT2EJhrybpuREkpQ7iC/4WOlOVrohbWQ4AhDQmojYQI/iS+gdF2JFLzTQ==}
engines: {node: '>=10'}
cpu: [x64]
os: [win32]
- '@swc/core@1.6.13':
- resolution: {integrity: sha512-eailUYex6fkfaQTev4Oa3mwn0/e3mQU4H8y1WPuImYQESOQDtVrowwUGDSc19evpBbHpKtwM+hw8nLlhIsF+Tw==}
+ '@swc/core@1.10.6':
+ resolution: {integrity: sha512-zgXXsI6SAVwr6XsXyMnqlyLoa1lT+r09bAWI1xT3679ejWqI1Vnl14eJG0GjWYXCEMKHCNytfMq3OOQ62C39QQ==}
engines: {node: '>=10'}
peerDependencies:
'@swc/helpers': '*'
@@ -2585,29 +2711,29 @@ packages:
'@swc/counter@0.1.3':
resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==}
- '@swc/types@0.1.9':
- resolution: {integrity: sha512-qKnCno++jzcJ4lM4NTfYifm1EFSCeIfKiAHAfkENZAV5Kl9PjJIyd2yeeVv6c/2CckuLyv2NmRC5pv6pm2WQBg==}
+ '@swc/helpers@0.5.15':
+ resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==}
- '@tanstack/query-async-storage-persister@5.51.9':
- resolution: {integrity: sha512-sOA6QEjkQSSSb5CyJN9IrW/nLtVO7h378a72Ijn0nsfs+5NvO5agBUq5qZDtaXEQ2iFv6+P84iJ6rAL/eXjlRg==}
+ '@swc/types@0.1.17':
+ resolution: {integrity: sha512-V5gRru+aD8YVyCOMAjMpWR1Ui577DD5KSJsHP8RAxopAH22jFz6GZd/qxqjO6MJHQhcsjvjOFXyDhyLQUnMveQ==}
- '@tanstack/query-core@5.51.9':
- resolution: {integrity: sha512-HsAwaY5J19MD18ykZDS3aVVh+bAt0i7m6uQlFC2b77DLV9djo+xEN7MWQAQQTR8IM+7r/zbozTQ7P0xr0bHuew==}
+ '@tanstack/query-async-storage-persister@5.62.16':
+ resolution: {integrity: sha512-2vyUz/Z/O8APIVBL1srXQo+KpJzeYTAwYmjLwbP0nSYmCgq+HzzJIXRXAXO95ZrCfv7Hng1JZX5egOSe9V+H0w==}
- '@tanstack/query-core@5.55.4':
- resolution: {integrity: sha512-uoRqNnRfzOH4OMIoxj8E2+Us89UIGXfau981qYJWsNMkFS1GXR4UIyzUTVGq4N7SDLHgFPpo6IOazqUV5gkMZA==}
+ '@tanstack/query-core@5.62.16':
+ resolution: {integrity: sha512-9Sgft7Qavcd+sN0V25xVyo0nfmcZXBuODy3FVG7BMWTg1HMLm8wwG5tNlLlmSic1u7l1v786oavn+STiFaPH2g==}
- '@tanstack/query-persist-client-core@5.51.9':
- resolution: {integrity: sha512-yKvDozZLf+XkXM+0ynx+JnSufD1QMFFdCgfIKrSHozZJoCeLnuf3kECi1T3KEZqdaxUWtZnSPcII9eb8pLJ9cQ==}
+ '@tanstack/query-persist-client-core@5.62.16':
+ resolution: {integrity: sha512-gCBGgXMVpb75N0s+KOtLkaNq/YxlJzW0y++Zn41E0ZkKEthwV54Q7oshrJpA6yUcm4Q6b1+BT8xYRx+PLWDaPg==}
- '@tanstack/react-query-persist-client@5.51.11':
- resolution: {integrity: sha512-yx8i+QvMKRzdbCrlAjNXj5TwWXrhujiYwea1BG2AEMMAxCa6IIIwsXI96F5xtkoZnN/HYY3B6t9zCJu93yVDmg==}
+ '@tanstack/react-query-persist-client@5.62.16':
+ resolution: {integrity: sha512-efBCkCcH8Xh/sgKEborOUHg3SJOn6Azmx+g/OiTtC8reky8MJMfH3UYPBnTyoXEH4qDKqo4B1MpkJ6zW8d5TGA==}
peerDependencies:
- '@tanstack/react-query': ^5.51.11
+ '@tanstack/react-query': ^5.62.16
react: ^18 || ^19
- '@tanstack/react-query@5.55.4':
- resolution: {integrity: sha512-e3uX5XkLD9oTV66/VsVpkYz3Ds/ps/Yk+V5d89xthAbtNIKKBEm4FdNb9yISFzGEGezUzVO68qmfmiSrtScvsg==}
+ '@tanstack/react-query@5.62.16':
+ resolution: {integrity: sha512-XJIZNj65d2IdvU8VBESmrPakfIm6FSdHDzrS1dPrAwmq3ZX+9riMh/ZfbNQHAWnhrgmq7KoXpgZSRyXnqMYT9A==}
peerDependencies:
react: ^18 || ^19
@@ -2667,27 +2793,45 @@ packages:
'@types/cors@2.8.17':
resolution: {integrity: sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==}
+ '@types/d3-color@3.1.3':
+ resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==}
+
+ '@types/d3-drag@3.0.7':
+ resolution: {integrity: sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==}
+
+ '@types/d3-interpolate@3.0.4':
+ resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==}
+
+ '@types/d3-selection@3.0.11':
+ resolution: {integrity: sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==}
+
+ '@types/d3-transition@3.0.9':
+ resolution: {integrity: sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==}
+
+ '@types/d3-zoom@3.0.8':
+ resolution: {integrity: sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==}
+
+ '@types/dagre@0.7.52':
+ resolution: {integrity: sha512-XKJdy+OClLk3hketHi9Qg6gTfe1F3y+UFnHxKA2rn9Dw+oXa4Gb378Ztz9HlMgZKSxpPmn4BNVh9wgkpvrK1uw==}
+
'@types/debug@4.1.12':
resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==}
'@types/eslint-scope@3.7.7':
resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==}
- '@types/eslint@8.56.10':
- resolution: {integrity: sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==}
-
- '@types/estree@1.0.5':
- resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==}
+ '@types/eslint@9.6.1':
+ resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==}
'@types/estree@1.0.6':
resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==}
- '@types/exceljs@1.3.0':
- resolution: {integrity: sha512-V3BOkD+eQVEFuYACksKiNEDP3QumTMMrPeXef/F5EAT/MquojQzUwEJt6vwsEwTOZFPfponJMyvdZ0NL71K76Q==}
+ '@types/exceljs@1.3.2':
+ resolution: {integrity: sha512-etq4LpmL5vZKzf29U5u7cWjoCWGc67hTc2WrvwmcBUyRiHydUPg5ZXGFwBHcEkTLinyT6fRmJiVSRwf4RdnjUA==}
deprecated: This is a stub types definition. exceljs provides its own type definitions, so you do not need this installed.
- '@types/express-serve-static-core@4.19.5':
- resolution: {integrity: sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==}
+ '@types/express-serve-static-core@4.19.6':
+ resolution: {integrity: sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==}
'@types/express@4.17.21':
resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==}
@@ -2713,8 +2857,8 @@ packages:
'@types/istanbul-reports@3.0.4':
resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==}
- '@types/jest@29.5.12':
- resolution: {integrity: sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==}
+ '@types/jest@29.5.14':
+ resolution: {integrity: sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==}
'@types/json-schema@7.0.15':
resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
@@ -2722,6 +2866,9 @@ packages:
'@types/jsonwebtoken@9.0.5':
resolution: {integrity: sha512-VRLSGzik+Unrup6BsouBeHsf4d1hOEgYWTm/7Nmw1sXoN1+tRly/Gy/po3yeahnP4jfnQWWAhQAqcNfH7ngOkA==}
+ '@types/katex@0.16.7':
+ resolution: {integrity: sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==}
+
'@types/lodash.throttle@4.1.9':
resolution: {integrity: sha512-PCPVfpfueguWZQB7pJQK890F2scYKoDUL3iM522AptHWn7d5NQmeS/LTEHIcLr5PaTzl3dK2Z0xSUHHTHwaL5g==}
@@ -2731,6 +2878,12 @@ packages:
'@types/luxon@3.4.2':
resolution: {integrity: sha512-TifLZlFudklWlMBfhubvgqTXRzLDI5pCbGa4P8a3wPyUQSW+1xQ5eDsreP9DWHX3tjq1ke96uYG/nwundroWcA==}
+ '@types/mdast@3.0.15':
+ resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==}
+
+ '@types/mdast@4.0.4':
+ resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==}
+
'@types/methods@1.1.4':
resolution: {integrity: sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==}
@@ -2752,26 +2905,32 @@ packages:
'@types/node@14.18.63':
resolution: {integrity: sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==}
- '@types/node@20.14.10':
- resolution: {integrity: sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==}
+ '@types/node@20.17.12':
+ resolution: {integrity: sha512-vo/wmBgMIiEA23A/knMfn/cf37VnuF52nZh5ZoW0GWt4e4sxNquibrMRJ7UQsA06+MBx9r/H1jsI9grYjQCQlw==}
- '@types/prop-types@15.7.12':
- resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==}
+ '@types/prop-types@15.7.14':
+ resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==}
- '@types/qs@6.9.15':
- resolution: {integrity: sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==}
+ '@types/qs@6.9.17':
+ resolution: {integrity: sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ==}
'@types/range-parser@1.2.7':
resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==}
- '@types/react-dom@18.3.0':
- resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==}
+ '@types/react-dom@18.2.15':
+ resolution: {integrity: sha512-HWMdW+7r7MR5+PZqJF6YFNSCtjz1T0dsvo/f1BV6HkV+6erD/nA7wd9NM00KVG83zf2nJ7uATPO9ttdIPvi3gg==}
'@types/react-redux@7.1.34':
resolution: {integrity: sha512-GdFaVjEbYv4Fthm2ZLvj1VSCedV7TqE5y1kNwnjSdBOTXuRSgowux6J8TAct15T3CKBr63UMk+2CO7ilRhyrAQ==}
- '@types/react@18.3.3':
- resolution: {integrity: sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==}
+ '@types/react@18.2.38':
+ resolution: {integrity: sha512-cBBXHzuPtQK6wNthuVMV6IjHAFkdl/FOPFIlkd81/Cd1+IqkHu/A+w4g43kaQQoYHik/ruaQBDL72HyCy1vuMw==}
+
+ '@types/react@18.3.18':
+ resolution: {integrity: sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==}
+
+ '@types/scheduler@0.23.0':
+ resolution: {integrity: sha512-YIoDCTH3Af6XM5VuwGG/QL/CJqga1Zm3NkU3HZ4ZHK2fRMPYP1VczsTUqtsf43PH/iJNVlPHAo2oWX7BSdB2Hw==}
'@types/semver@7.5.8':
resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==}
@@ -2785,12 +2944,15 @@ packages:
'@types/stack-utils@2.0.3':
resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==}
- '@types/superagent@8.1.7':
- resolution: {integrity: sha512-NmIsd0Yj4DDhftfWvvAku482PZum4DBW7U51OvS8gvOkDDY0WT1jsVyDV3hK+vplrsYw8oDwi9QxOM7U68iwww==}
+ '@types/superagent@8.1.9':
+ resolution: {integrity: sha512-pTVjI73witn+9ILmoJdajHGW2jkSaOzhiFYF1Rd3EQ94kymLqB9PjD9ISg7WaALC7+dCHT0FGe9T2LktLq/3GQ==}
'@types/supertest@6.0.2':
resolution: {integrity: sha512-137ypx2lk/wTQbW6An6safu9hXmajAifU/s7szAHLN/FeIm5w7yR0Wkl9fdJMRSHwOn4HLAI0DaB2TOORuhPDg==}
+ '@types/unist@2.0.11':
+ resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==}
+
'@types/uuid@10.0.0':
resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==}
@@ -2800,8 +2962,8 @@ packages:
'@types/yargs-parser@21.0.3':
resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==}
- '@types/yargs@17.0.32':
- resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==}
+ '@types/yargs@17.0.33':
+ resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==}
'@typescript-eslint/eslint-plugin@6.21.0':
resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==}
@@ -2814,8 +2976,8 @@ packages:
typescript:
optional: true
- '@typescript-eslint/eslint-plugin@7.16.0':
- resolution: {integrity: sha512-py1miT6iQpJcs1BiJjm54AMzeuMPBSPuKPlnT8HlfudbcS5rYeX5jajpLf3mrdRh9dA/Ec2FVUY0ifeVNDIhZw==}
+ '@typescript-eslint/eslint-plugin@7.18.0':
+ resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==}
engines: {node: ^18.18.0 || >=20.0.0}
peerDependencies:
'@typescript-eslint/parser': ^7.0.0
@@ -2825,8 +2987,8 @@ packages:
typescript:
optional: true
- '@typescript-eslint/eslint-plugin@8.18.2':
- resolution: {integrity: sha512-adig4SzPLjeQ0Tm+jvsozSGiCliI2ajeURDGHjZ2llnA+A67HihCQ+a3amtPhUakd1GlwHxSRvzOZktbEvhPPg==}
+ '@typescript-eslint/eslint-plugin@8.19.1':
+ resolution: {integrity: sha512-tJzcVyvvb9h/PB96g30MpxACd9IrunT7GF9wfA9/0TJ1LxGOJx1TdPzSbBBnNED7K9Ka8ybJsnEpiXPktolTLg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
'@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0
@@ -2843,8 +3005,8 @@ packages:
typescript:
optional: true
- '@typescript-eslint/parser@7.16.0':
- resolution: {integrity: sha512-ar9E+k7CU8rWi2e5ErzQiC93KKEFAXA2Kky0scAlPcxYblLt8+XZuHUZwlyfXILyQa95P6lQg+eZgh/dDs3+Vw==}
+ '@typescript-eslint/parser@7.18.0':
+ resolution: {integrity: sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==}
engines: {node: ^18.18.0 || >=20.0.0}
peerDependencies:
eslint: ^8.56.0
@@ -2853,8 +3015,8 @@ packages:
typescript:
optional: true
- '@typescript-eslint/parser@8.18.2':
- resolution: {integrity: sha512-y7tcq4StgxQD4mDr9+Jb26dZ+HTZ/SkfqpXSiqeUXZHxOUyjWDKsmwKhJ0/tApR08DgOhrFAoAhyB80/p3ViuA==}
+ '@typescript-eslint/parser@8.19.1':
+ resolution: {integrity: sha512-67gbfv8rAwawjYx3fYArwldTQKoYfezNUT4D5ioWetr/xCrxXxvleo3uuiFuKfejipvq+og7mjz3b0G2bVyUCw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
@@ -2864,12 +3026,12 @@ packages:
resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==}
engines: {node: ^16.0.0 || >=18.0.0}
- '@typescript-eslint/scope-manager@7.16.0':
- resolution: {integrity: sha512-8gVv3kW6n01Q6TrI1cmTZ9YMFi3ucDT7i7aI5lEikk2ebk1AEjrwX8MDTdaX5D7fPXMBLvnsaa0IFTAu+jcfOw==}
+ '@typescript-eslint/scope-manager@7.18.0':
+ resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==}
engines: {node: ^18.18.0 || >=20.0.0}
- '@typescript-eslint/scope-manager@8.18.2':
- resolution: {integrity: sha512-YJFSfbd0CJjy14r/EvWapYgV4R5CHzptssoag2M7y3Ra7XNta6GPAJPPP5KGB9j14viYXyrzRO5GkX7CRfo8/g==}
+ '@typescript-eslint/scope-manager@8.19.1':
+ resolution: {integrity: sha512-60L9KIuN/xgmsINzonOcMDSB8p82h95hoBfSBtXuO4jlR1R9L1xSkmVZKgCPVfavDlXihh4ARNjXhh1gGnLC7Q==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript-eslint/type-utils@6.21.0':
@@ -2882,8 +3044,8 @@ packages:
typescript:
optional: true
- '@typescript-eslint/type-utils@7.16.0':
- resolution: {integrity: sha512-j0fuUswUjDHfqV/UdW6mLtOQQseORqfdmoBNDFOqs9rvNVR2e+cmu6zJu/Ku4SDuqiJko6YnhwcL8x45r8Oqxg==}
+ '@typescript-eslint/type-utils@7.18.0':
+ resolution: {integrity: sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==}
engines: {node: ^18.18.0 || >=20.0.0}
peerDependencies:
eslint: ^8.56.0
@@ -2892,8 +3054,8 @@ packages:
typescript:
optional: true
- '@typescript-eslint/type-utils@8.18.2':
- resolution: {integrity: sha512-AB/Wr1Lz31bzHfGm/jgbFR0VB0SML/hd2P1yxzKDM48YmP7vbyJNHRExUE/wZsQj2wUCvbWH8poNHFuxLqCTnA==}
+ '@typescript-eslint/type-utils@8.19.1':
+ resolution: {integrity: sha512-Rp7k9lhDKBMRJB/nM9Ksp1zs4796wVNyihG9/TU9R6KCJDNkQbc2EOKjrBtLYh3396ZdpXLtr/MkaSEmNMtykw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
@@ -2903,12 +3065,12 @@ packages:
resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==}
engines: {node: ^16.0.0 || >=18.0.0}
- '@typescript-eslint/types@7.16.0':
- resolution: {integrity: sha512-fecuH15Y+TzlUutvUl9Cc2XJxqdLr7+93SQIbcZfd4XRGGKoxyljK27b+kxKamjRkU7FYC6RrbSCg0ALcZn/xw==}
+ '@typescript-eslint/types@7.18.0':
+ resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==}
engines: {node: ^18.18.0 || >=20.0.0}
- '@typescript-eslint/types@8.18.2':
- resolution: {integrity: sha512-Z/zblEPp8cIvmEn6+tPDIHUbRu/0z5lqZ+NvolL5SvXWT5rQy7+Nch83M0++XzO0XrWRFWECgOAyE8bsJTl1GQ==}
+ '@typescript-eslint/types@8.19.1':
+ resolution: {integrity: sha512-JBVHMLj7B1K1v1051ZaMMgLW4Q/jre5qGK0Ew6UgXz1Rqh+/xPzV1aW581OM00X6iOfyr1be+QyW8LOUf19BbA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript-eslint/typescript-estree@6.21.0':
@@ -2920,8 +3082,8 @@ packages:
typescript:
optional: true
- '@typescript-eslint/typescript-estree@7.16.0':
- resolution: {integrity: sha512-a5NTvk51ZndFuOLCh5OaJBELYc2O3Zqxfl3Js78VFE1zE46J2AaVuW+rEbVkQznjkmlzWsUI15BG5tQMixzZLw==}
+ '@typescript-eslint/typescript-estree@7.18.0':
+ resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==}
engines: {node: ^18.18.0 || >=20.0.0}
peerDependencies:
typescript: '*'
@@ -2929,8 +3091,8 @@ packages:
typescript:
optional: true
- '@typescript-eslint/typescript-estree@8.18.2':
- resolution: {integrity: sha512-WXAVt595HjpmlfH4crSdM/1bcsqh+1weFRWIa9XMTx/XHZ9TCKMcr725tLYqWOgzKdeDrqVHxFotrvWcEsk2Tg==}
+ '@typescript-eslint/typescript-estree@8.19.1':
+ resolution: {integrity: sha512-jk/TZwSMJlxlNnqhy0Eod1PNEvCkpY6MXOXE/WLlblZ6ibb32i2We4uByoKPv1d0OD2xebDv4hbs3fm11SMw8Q==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <5.8.0'
@@ -2941,14 +3103,14 @@ packages:
peerDependencies:
eslint: ^7.0.0 || ^8.0.0
- '@typescript-eslint/utils@7.16.0':
- resolution: {integrity: sha512-PqP4kP3hb4r7Jav+NiRCntlVzhxBNWq6ZQ+zQwII1y/G/1gdIPeYDCKr2+dH6049yJQsWZiHU6RlwvIFBXXGNA==}
+ '@typescript-eslint/utils@7.18.0':
+ resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==}
engines: {node: ^18.18.0 || >=20.0.0}
peerDependencies:
eslint: ^8.56.0
- '@typescript-eslint/utils@8.18.2':
- resolution: {integrity: sha512-Cr4A0H7DtVIPkauj4sTSXVl+VBWewE9/o40KcF3TV9aqDEOWoXF3/+oRXNby3DYzZeCATvbdksYsGZzplwnK/Q==}
+ '@typescript-eslint/utils@8.19.1':
+ resolution: {integrity: sha512-IxG5gLO0Ne+KaUc8iW1A+XuKLd63o4wlbI1Zp692n1xojCl/THvgIKXJXBZixTh5dd5+yTJ/VXH7GJaaw21qXA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
@@ -2958,72 +3120,72 @@ packages:
resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==}
engines: {node: ^16.0.0 || >=18.0.0}
- '@typescript-eslint/visitor-keys@7.16.0':
- resolution: {integrity: sha512-rMo01uPy9C7XxG7AFsxa8zLnWXTF8N3PYclekWSrurvhwiw1eW88mrKiAYe6s53AUY57nTRz8dJsuuXdkAhzCg==}
+ '@typescript-eslint/visitor-keys@7.18.0':
+ resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==}
engines: {node: ^18.18.0 || >=20.0.0}
- '@typescript-eslint/visitor-keys@8.18.2':
- resolution: {integrity: sha512-zORcwn4C3trOWiCqFQP1x6G3xTRyZ1LYydnj51cRnJ6hxBlr/cKPckk+PKPUw/fXmvfKTcw7bwY3w9izgx5jZw==}
+ '@typescript-eslint/visitor-keys@8.19.1':
+ resolution: {integrity: sha512-fzmjU8CHK853V/avYZAvuVut3ZTfwN5YtMaoi+X9Y9MA9keaWNHC3zEQ9zvyX/7Hj+5JkNyK1l7TOR2hevHB6Q==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@ungap/structured-clone@1.2.0':
- resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==}
+ '@ungap/structured-clone@1.2.1':
+ resolution: {integrity: sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==}
- '@vitejs/plugin-react-swc@3.7.0':
- resolution: {integrity: sha512-yrknSb3Dci6svCd/qhHqhFPDSw0QtjumcqdKMoNNzmOl5lMXTTiqzjWtG4Qask2HdvvzaNgSunbQGet8/GrKdA==}
+ '@vitejs/plugin-react-swc@3.7.2':
+ resolution: {integrity: sha512-y0byko2b2tSVVf5Gpng1eEhX1OvPC7x8yns1Fx8jDzlJp4LS6CMkCPfLw47cjyoMrshQDoQw4qcgjsU9VvlCew==}
peerDependencies:
- vite: ^4 || ^5
+ vite: ^4 || ^5 || ^6
- '@vitejs/plugin-react@4.3.1':
- resolution: {integrity: sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg==}
+ '@vitejs/plugin-react@4.3.4':
+ resolution: {integrity: sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==}
engines: {node: ^14.18.0 || >=16.0.0}
peerDependencies:
- vite: ^4.2.0 || ^5.0.0
+ vite: ^4.2.0 || ^5.0.0 || ^6.0.0
- '@webassemblyjs/ast@1.12.1':
- resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==}
+ '@webassemblyjs/ast@1.14.1':
+ resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==}
- '@webassemblyjs/floating-point-hex-parser@1.11.6':
- resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==}
+ '@webassemblyjs/floating-point-hex-parser@1.13.2':
+ resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==}
- '@webassemblyjs/helper-api-error@1.11.6':
- resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==}
+ '@webassemblyjs/helper-api-error@1.13.2':
+ resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==}
- '@webassemblyjs/helper-buffer@1.12.1':
- resolution: {integrity: sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==}
+ '@webassemblyjs/helper-buffer@1.14.1':
+ resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==}
- '@webassemblyjs/helper-numbers@1.11.6':
- resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==}
+ '@webassemblyjs/helper-numbers@1.13.2':
+ resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==}
- '@webassemblyjs/helper-wasm-bytecode@1.11.6':
- resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==}
+ '@webassemblyjs/helper-wasm-bytecode@1.13.2':
+ resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==}
- '@webassemblyjs/helper-wasm-section@1.12.1':
- resolution: {integrity: sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==}
+ '@webassemblyjs/helper-wasm-section@1.14.1':
+ resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==}
- '@webassemblyjs/ieee754@1.11.6':
- resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==}
+ '@webassemblyjs/ieee754@1.13.2':
+ resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==}
- '@webassemblyjs/leb128@1.11.6':
- resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==}
+ '@webassemblyjs/leb128@1.13.2':
+ resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==}
- '@webassemblyjs/utf8@1.11.6':
- resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==}
+ '@webassemblyjs/utf8@1.13.2':
+ resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==}
- '@webassemblyjs/wasm-edit@1.12.1':
- resolution: {integrity: sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==}
+ '@webassemblyjs/wasm-edit@1.14.1':
+ resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==}
- '@webassemblyjs/wasm-gen@1.12.1':
- resolution: {integrity: sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==}
+ '@webassemblyjs/wasm-gen@1.14.1':
+ resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==}
- '@webassemblyjs/wasm-opt@1.12.1':
- resolution: {integrity: sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==}
+ '@webassemblyjs/wasm-opt@1.14.1':
+ resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==}
- '@webassemblyjs/wasm-parser@1.12.1':
- resolution: {integrity: sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==}
+ '@webassemblyjs/wasm-parser@1.14.1':
+ resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==}
- '@webassemblyjs/wast-printer@1.12.1':
- resolution: {integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==}
+ '@webassemblyjs/wast-printer@1.14.1':
+ resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==}
'@xtuc/ieee754@1.2.0':
resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==}
@@ -3031,6 +3193,15 @@ packages:
'@xtuc/long@4.2.2':
resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==}
+ '@xyflow/react@12.3.6':
+ resolution: {integrity: sha512-9GS+cz8hDZahpvTrVCmySAEgKUL8oN4b2q1DluHrKtkqhAMWfH2s7kblhbM4Y4Y4SUnH2lt4drXKZ/4/Lot/2Q==}
+ peerDependencies:
+ react: '>=17'
+ react-dom: '>=17'
+
+ '@xyflow/system@0.0.47':
+ resolution: {integrity: sha512-aUXJPIvsCFxGX70ccRG8LPsR+A8ExYXfh/noYNpqn8udKerrLdSHxMG2VsvUrQ1PGex10fOpbJwFU4A+I/Xv8w==}
+
'@zxing/text-encoding@0.9.0':
resolution: {integrity: sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA==}
@@ -3048,22 +3219,25 @@ packages:
resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==}
engines: {node: '>= 0.6'}
- acorn-import-attributes@1.9.5:
- resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==}
- peerDependencies:
- acorn: ^8
-
acorn-jsx@5.3.2:
resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
peerDependencies:
acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
- acorn-walk@8.3.3:
- resolution: {integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==}
+ acorn-loose@6.1.0:
+ resolution: {integrity: sha512-FHhXoiF0Uch3IqsrnPpWwCtiv5PYvipTpT1k9lDMgQVVYc9iDuSl5zdJV358aI8twfHCYMFBRVYvAVki9wC/ng==}
engines: {node: '>=0.4.0'}
- acorn@8.12.1:
- resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==}
+ acorn-walk@6.2.0:
+ resolution: {integrity: sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==}
+ engines: {node: '>=0.4.0'}
+
+ acorn-walk@8.3.4:
+ resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==}
+ engines: {node: '>=0.4.0'}
+
+ acorn@6.4.2:
+ resolution: {integrity: sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==}
engines: {node: '>=0.4.0'}
hasBin: true
@@ -3106,12 +3280,20 @@ packages:
peerDependencies:
ajv: ^6.9.1
+ ajv-keywords@5.1.0:
+ resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==}
+ peerDependencies:
+ ajv: ^8.8.2
+
ajv@6.12.6:
resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
ajv@8.12.0:
resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==}
+ ajv@8.17.1:
+ resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==}
+
ansi-colors@4.1.3:
resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==}
engines: {node: '>=6'}
@@ -3128,8 +3310,8 @@ packages:
resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
engines: {node: '>=8'}
- ansi-regex@6.0.1:
- resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==}
+ ansi-regex@6.1.0:
+ resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==}
engines: {node: '>=12'}
ansi-styles@3.2.1:
@@ -3148,8 +3330,8 @@ packages:
resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==}
engines: {node: '>=12'}
- antd@5.20.6:
- resolution: {integrity: sha512-TZFmNenHlh26DelHCJbkB+x1OVulIKsN1f/CnAd2NxZLysXqRvSuLUeHcgccqAnxTy7B03GZ6i1tocGxPCNjgA==}
+ antd@5.23.0:
+ resolution: {integrity: sha512-aRuhim7u3UCbOMDeGGWAxoCvEmvkqPG9ZZCn5EqdsUGogh4bLJxm0n+omxgXH5TwJy2MuDEZlw88IEw5P2CLvg==}
peerDependencies:
react: '>=16.9.0'
react-dom: '>=16.9.0'
@@ -3198,9 +3380,6 @@ packages:
array-timsort@1.0.3:
resolution: {integrity: sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==}
- array-tree-filter@2.1.0:
- resolution: {integrity: sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==}
-
array-union@2.1.0:
resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==}
engines: {node: '>=8'}
@@ -3211,12 +3390,16 @@ packages:
async@0.2.10:
resolution: {integrity: sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ==}
- async@3.2.5:
- resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==}
+ async@3.2.6:
+ resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==}
asynckit@0.4.0:
resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
+ attr-accept@2.2.5:
+ resolution: {integrity: sha512-0bDNnY/u6pPwHDMoF0FieU354oBi0a8rD9FcsLwzcGWbc8KS8KPIi7y+s13OlVY+gMWc/9xEMUgNE6Qm8ZllYQ==}
+ engines: {node: '>=4'}
+
autoprefixer@10.4.20:
resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==}
engines: {node: ^10 || ^12 || >=14}
@@ -3228,8 +3411,8 @@ packages:
resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==}
engines: {node: '>= 0.4'}
- axios@1.7.3:
- resolution: {integrity: sha512-Ar7ND9pU99eJ9GpoGQKhKf58GpUOgnzuaB7ueNQ5BMi0p+LZ5oaEnfF999fAArcTIBwXTCHAmGcHOZJaWPq9Nw==}
+ axios@1.7.9:
+ resolution: {integrity: sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==}
babel-jest@29.7.0:
resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==}
@@ -3245,8 +3428,8 @@ packages:
resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
- babel-preset-current-node-syntax@1.0.1:
- resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==}
+ babel-preset-current-node-syntax@1.1.0:
+ resolution: {integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==}
peerDependencies:
'@babel/core': ^7.0.0
@@ -3286,8 +3469,8 @@ packages:
bluebird@3.4.7:
resolution: {integrity: sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==}
- body-parser@1.20.2:
- resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==}
+ body-parser@1.20.3:
+ resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==}
engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
bowser@2.11.0:
@@ -3309,11 +3492,6 @@ packages:
browser-or-node@2.1.1:
resolution: {integrity: sha512-8CVjaLJGuSKMVTxJ2DpBl5XnlNDiT4cQFeuCJJrvJmts9YrTZDizTX7PjC2s6W4x+MBGZeEY6dGMrF04/6Hgqg==}
- browserslist@4.23.2:
- resolution: {integrity: sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA==}
- engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
- hasBin: true
-
browserslist@4.24.3:
resolution: {integrity: sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==}
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
@@ -3346,12 +3524,15 @@ packages:
buffer@5.7.1:
resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
+ buffer@6.0.3:
+ resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==}
+
buffers@0.1.1:
resolution: {integrity: sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==}
engines: {node: '>=0.2.0'}
- bullmq@5.12.0:
- resolution: {integrity: sha512-kOtSQx9ymylslsLNFD0xOMJM9mHqnq3x6KD7+DYkHByWe0HFRdblpYKhZyL4uR3rwaKZwzOrJVl3RwRaDjZxSg==}
+ bullmq@5.34.8:
+ resolution: {integrity: sha512-id5mmPg3K8tNXQ9VVlmUxBSeLmliIWUrB8Hd5c62PFrIiHywz4TN1PEqU6OWvYXEvoFCr8/BlnbE4JCrGqPVmg==}
bundle-require@5.1.0:
resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==}
@@ -3371,8 +3552,16 @@ packages:
resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==}
engines: {node: '>=8'}
- call-bind@1.0.7:
- resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==}
+ call-bind-apply-helpers@1.0.1:
+ resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==}
+ engines: {node: '>= 0.4'}
+
+ call-bind@1.0.8:
+ resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==}
+ engines: {node: '>= 0.4'}
+
+ call-bound@1.0.3:
+ resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==}
engines: {node: '>= 0.4'}
callsites@3.1.0:
@@ -3391,31 +3580,27 @@ packages:
resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==}
engines: {node: '>=10'}
- caniuse-lite@1.0.30001641:
- resolution: {integrity: sha512-Phv5thgl67bHYo1TtMY/MurjkHhV4EDaCosezRXgZ8jzA/Ub+wjxAvbGvjoFENStinwi5kCyOYV3mi5tOGykwA==}
-
caniuse-lite@1.0.30001690:
resolution: {integrity: sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==}
chainsaw@0.1.0:
resolution: {integrity: sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==}
- chalk@2.4.2:
- resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
- engines: {node: '>=4'}
-
chalk@4.1.2:
resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
engines: {node: '>=10'}
- chalk@5.3.0:
- resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==}
+ chalk@5.4.1:
+ resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==}
engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
char-regex@1.0.2:
resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==}
engines: {node: '>=10'}
+ character-entities@2.0.2:
+ resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==}
+
chardet@0.7.0:
resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==}
@@ -3440,12 +3625,15 @@ packages:
resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==}
engines: {node: '>=8'}
- cjs-module-lexer@1.3.1:
- resolution: {integrity: sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==}
+ cjs-module-lexer@1.4.1:
+ resolution: {integrity: sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==}
class-variance-authority@0.7.1:
resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==}
+ classcat@5.0.5:
+ resolution: {integrity: sha512-JhZUT7JFcQy/EzW605k/ktHtncoo9vnyW/2GspNYwFlN1C/WmjuV/xtS04e9SOkL2sTdw0VAZ2UGCcQ9lR6p6w==}
+
classnames@2.5.1:
resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==}
@@ -3533,8 +3721,12 @@ packages:
resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
engines: {node: '>= 6'}
- comment-json@4.2.3:
- resolution: {integrity: sha512-SsxdiOf064DWoZLH799Ata6u7iV658A11PlWtZATDlXPpKGJnbJZ5Z24ybixAi+LUUqJ/GKowAejtC5GFUG7Tw==}
+ commander@8.3.0:
+ resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==}
+ engines: {node: '>= 12'}
+
+ comment-json@4.2.5:
+ resolution: {integrity: sha512-bKw/r35jR3HGt5PEPm1ljsQQGyCrR8sFGNiN5L+ykDHdpO8Smxkrkla9Yi6NkQyUrb8V54PGhfMs6NrIwtxtdw==}
engines: {node: '>= 6'}
component-emitter@1.3.1:
@@ -3580,12 +3772,12 @@ packages:
cookie-signature@1.0.6:
resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==}
- cookie@0.4.2:
- resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==}
+ cookie@0.7.1:
+ resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==}
engines: {node: '>= 0.6'}
- cookie@0.6.0:
- resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==}
+ cookie@0.7.2:
+ resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==}
engines: {node: '>= 0.6'}
cookiejar@2.1.4:
@@ -3635,12 +3827,11 @@ packages:
resolution: {integrity: sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==}
engines: {node: '>=12.0.0'}
- cron@3.1.7:
- resolution: {integrity: sha512-tlBg7ARsAMQLzgwqVxy8AZl/qlTc5nibqYwtNGoCrd+cV+ugI+tvZC1oT/8dFH8W455YrywGykx/KMmAqOr7Jw==}
+ cron@3.2.1:
+ resolution: {integrity: sha512-w2n5l49GMmmkBFEsH9FIDhjZ1n1QgTMOCMGuQtOXs5veNiosZmso6bQGuqOJSYAXXrG84WQFVneNk+Yt0Ua9iw==}
- cross-spawn@7.0.3:
- resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
- engines: {node: '>= 8'}
+ cron@3.3.2:
+ resolution: {integrity: sha512-7o2PH9vKRd4PxB8c2GsHRozfHYT+gIhZG0DI+vzGOdWo42mofO/ooYnyU0CCh27aKzCrUKMAwAwi7xJ84xKSug==}
cross-spawn@7.0.6:
resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
@@ -3660,6 +3851,58 @@ packages:
custom-error-instance@2.1.1:
resolution: {integrity: sha512-p6JFxJc3M4OTD2li2qaHkDCw9SfMw82Ldr6OC9Je1aXiGfhx2W8p3GaoeaGrPJTUN9NirTM/KTxHWMUdR1rsUg==}
+ d3-array@3.2.4:
+ resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==}
+ engines: {node: '>=12'}
+
+ d3-color@3.1.0:
+ resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==}
+ engines: {node: '>=12'}
+
+ d3-dag@1.1.0:
+ resolution: {integrity: sha512-N8IxsIHcUaIxLrV3cElTC47kVJGFiY3blqSuJubQhyhYBJs0syfFPTnRSj2Cq0LBxxi4mzJmcqCvHIv9sPdILQ==}
+
+ d3-dispatch@3.0.1:
+ resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==}
+ engines: {node: '>=12'}
+
+ d3-drag@3.0.0:
+ resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==}
+ engines: {node: '>=12'}
+
+ d3-ease@3.0.1:
+ resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==}
+ engines: {node: '>=12'}
+
+ d3-hierarchy@3.1.2:
+ resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==}
+ engines: {node: '>=12'}
+
+ d3-interpolate@3.0.1:
+ resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==}
+ engines: {node: '>=12'}
+
+ d3-selection@3.0.0:
+ resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==}
+ engines: {node: '>=12'}
+
+ d3-timer@3.0.1:
+ resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==}
+ engines: {node: '>=12'}
+
+ d3-transition@3.0.1:
+ resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==}
+ engines: {node: '>=12'}
+ peerDependencies:
+ d3-selection: 2 - 3
+
+ d3-zoom@3.0.0:
+ resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==}
+ engines: {node: '>=12'}
+
+ dagre@0.8.5:
+ resolution: {integrity: sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw==}
+
date-fns@2.30.0:
resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==}
engines: {node: '>=0.11'}
@@ -3675,8 +3918,8 @@ packages:
supports-color:
optional: true
- debug@4.3.5:
- resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==}
+ debug@4.3.7:
+ resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==}
engines: {node: '>=6.0'}
peerDependencies:
supports-color: '*'
@@ -3697,6 +3940,9 @@ packages:
resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==}
engines: {node: '>=0.10.0'}
+ decode-named-character-reference@1.0.2:
+ resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==}
+
decode-uri-component@0.2.2:
resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==}
engines: {node: '>=0.10'}
@@ -3712,6 +3958,10 @@ packages:
deep-is@0.1.4:
resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
+ deepmerge@1.5.2:
+ resolution: {integrity: sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==}
+ engines: {node: '>=0.10.0'}
+
deepmerge@4.3.1:
resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==}
engines: {node: '>=0.10.0'}
@@ -3740,6 +3990,10 @@ packages:
resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==}
engines: {node: '>= 0.8'}
+ dequal@2.0.3:
+ resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
+ engines: {node: '>=6'}
+
destroy@1.2.0:
resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==}
engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
@@ -3766,6 +4020,10 @@ packages:
resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==}
engines: {node: '>=0.3.1'}
+ diff@5.2.0:
+ resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==}
+ engines: {node: '>=0.3.1'}
+
dir-glob@3.0.1:
resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
engines: {node: '>=8'}
@@ -3792,6 +4050,10 @@ packages:
resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==}
engines: {node: '>=12'}
+ dunder-proto@1.0.1:
+ resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
+ engines: {node: '>= 0.4'}
+
duplexer2@0.1.4:
resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==}
@@ -3809,11 +4071,11 @@ packages:
engines: {node: '>=0.10.0'}
hasBin: true
- electron-to-chromium@1.4.823:
- resolution: {integrity: sha512-4h+oPeAiGQOHFyUJOqpoEcPj/xxlicxBzOErVeYVMMmAiXUXsGpsFd0QXBMaUUbnD8hhSfLf9uw+MlsoIA7j5w==}
+ electron-to-chromium@1.5.79:
+ resolution: {integrity: sha512-nYOxJNxQ9Om4EC88BE4pPoNI8xwSFf8pU/BAeOl4Hh/b/i6V4biTAzwV7pXi3ARKeoYO5JZKMIXTryXSVer5RA==}
- electron-to-chromium@1.5.76:
- resolution: {integrity: sha512-CjVQyG7n7Sr+eBXE86HIulnL5N8xZY1sgmOPGuq/F0Rr0FJq63lg0kEtOIDfZBk44FnDLf6FUJ+dsJcuiUDdDQ==}
+ elkjs@0.9.3:
+ resolution: {integrity: sha512-f/ZeWvW/BCXbhGEf1Ujp29EASo/lk1FDnETgNKwJrsVvGZhUWCZyg3xLJjAsxfOmt8KjswHmI5EwCQcPMpOYhQ==}
emittery@0.13.1:
resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==}
@@ -3832,6 +4094,10 @@ packages:
resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==}
engines: {node: '>= 0.8'}
+ encodeurl@2.0.0:
+ resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==}
+ engines: {node: '>= 0.8'}
+
encoding-down@6.3.0:
resolution: {integrity: sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw==}
engines: {node: '>=6'}
@@ -3844,18 +4110,25 @@ packages:
resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==}
engines: {node: '>=10.0.0'}
- engine.io@6.5.5:
- resolution: {integrity: sha512-C5Pn8Wk+1vKBoHghJODM63yk8MvrO9EWZUfkAt5HAqIgPE4/8FF0PEGHXtEd40l223+cE5ABWuPzm38PHFXfMA==}
+ engine.io@6.6.2:
+ resolution: {integrity: sha512-gmNvsYi9C8iErnZdVcJnvCpSKbWTt1E8+JZo8b+daLninywUWi5NQ5STSHZ9rFjFO7imNcvb8Pc5pe/wMR5xEw==}
engines: {node: '>=10.2.0'}
- enhanced-resolve@5.17.0:
- resolution: {integrity: sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==}
+ enhanced-resolve@2.3.0:
+ resolution: {integrity: sha512-n6e4bsCpzsP0OB76X+vEWhySUQI8GHPVFVK+3QkX35tbryy2WoeGeK5kQ+oxzgDVHjIZyz5fyS60Mi3EpQLc0Q==}
+ engines: {node: '>=0.6'}
+
+ enhanced-resolve@5.18.0:
+ resolution: {integrity: sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==}
engines: {node: '>=10.13.0'}
entities@4.5.0:
resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
engines: {node: '>=0.12'}
+ err-code@3.0.1:
+ resolution: {integrity: sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==}
+
errno@0.1.8:
resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==}
hasBin: true
@@ -3863,16 +4136,20 @@ packages:
error-ex@1.3.2:
resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==}
- es-define-property@1.0.0:
- resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==}
+ es-define-property@1.0.1:
+ resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==}
engines: {node: '>= 0.4'}
es-errors@1.3.0:
resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
engines: {node: '>= 0.4'}
- es-module-lexer@1.5.4:
- resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==}
+ es-module-lexer@1.6.0:
+ resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==}
+
+ es-object-atoms@1.0.0:
+ resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==}
+ engines: {node: '>= 0.4'}
esbuild@0.21.5:
resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==}
@@ -3884,10 +4161,6 @@ packages:
engines: {node: '>=18'}
hasBin: true
- escalade@3.1.2:
- resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==}
- engines: {node: '>=6'}
-
escalade@3.2.0:
resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
engines: {node: '>=6'}
@@ -3913,8 +4186,8 @@ packages:
peerDependencies:
eslint: '>=7.0.0'
- eslint-plugin-prettier@5.1.3:
- resolution: {integrity: sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==}
+ eslint-plugin-prettier@5.2.1:
+ resolution: {integrity: sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==}
engines: {node: ^14.18.0 || >=16.0.0}
peerDependencies:
'@types/eslint': '>=8.0.0'
@@ -3944,11 +4217,6 @@ packages:
peerDependencies:
eslint: '>=8.40'
- eslint-plugin-react-refresh@0.4.8:
- resolution: {integrity: sha512-MIKAclwaDFIiYtVBLzDdm16E+Ty4GwhB6wZlCAG1R3Ur+F9Qbo6PRxpA5DK7XtDgm+WlCoAY2WxAwqhmIDHg6Q==}
- peerDependencies:
- eslint: '>=7'
-
eslint-scope@5.1.1:
resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==}
engines: {node: '>=8.0.0'}
@@ -3969,8 +4237,8 @@ packages:
resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- eslint@8.57.0:
- resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==}
+ eslint@8.57.1:
+ resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options.
hasBin: true
@@ -4025,6 +4293,9 @@ packages:
resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==}
engines: {node: '>= 0.6'}
+ eventemitter3@4.0.7:
+ resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==}
+
eventemitter3@5.0.1:
resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==}
@@ -4048,8 +4319,8 @@ packages:
resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
- express@4.19.2:
- resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==}
+ express@4.21.2:
+ resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==}
engines: {node: '>= 0.10.0'}
external-editor@3.1.0:
@@ -4066,8 +4337,8 @@ packages:
fast-diff@1.3.0:
resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==}
- fast-glob@3.3.2:
- resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==}
+ fast-glob@3.3.3:
+ resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==}
engines: {node: '>=8.6.0'}
fast-json-stable-stringify@2.1.0:
@@ -4079,16 +4350,19 @@ packages:
fast-safe-stringify@2.1.1:
resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==}
+ fast-uri@3.0.5:
+ resolution: {integrity: sha512-5JnBCWpFlMo0a3ciDy/JckMzzv1U9coZrIhedq+HXxxUfDTAiS0LA8OKVao4G9BxmCVck/jtA5r3KAtRWEyD8Q==}
+
fast-xml-parser@4.4.1:
resolution: {integrity: sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==}
hasBin: true
- fast-xml-parser@4.5.0:
- resolution: {integrity: sha512-/PlTQCI96+fZMAOLMZK4CWG1ItCbfZ/0jx7UIJFChPNrx7tcEgerUgWbeieCM9MfHInUDyK8DWYZ+YrywDJuTg==}
+ fast-xml-parser@4.5.1:
+ resolution: {integrity: sha512-y655CeyUQ+jj7KBbYMc4FG01V8ZQqjN+gDYGJ50RtfsUB8iG9AmwmwoAgeKLJdmueKKMrH1RJ7yXHTSoczdv5w==}
hasBin: true
- fastq@1.17.1:
- resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==}
+ fastq@1.18.0:
+ resolution: {integrity: sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==}
fb-watchman@2.0.2:
resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==}
@@ -4113,6 +4387,10 @@ packages:
resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==}
engines: {node: '>=16.0.0'}
+ file-selector@2.1.2:
+ resolution: {integrity: sha512-QgXo+mXTe8ljeqUFaX3QVHc5osSItJ/Km+xpocx0aSqWGMSCf6qYs/VnzZgS864Pjn5iceMRFigeAV7AfTlaig==}
+ engines: {node: '>= 12'}
+
filelist@1.0.4:
resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==}
@@ -4124,8 +4402,8 @@ packages:
resolution: {integrity: sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==}
engines: {node: '>=0.10.0'}
- finalhandler@1.2.0:
- resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==}
+ finalhandler@1.3.1:
+ resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==}
engines: {node: '>= 0.8'}
find-up@3.0.0:
@@ -4148,15 +4426,15 @@ packages:
resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==}
engines: {node: '>=16'}
- flatted@3.3.1:
- resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==}
+ flatted@3.3.2:
+ resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==}
fluent-ffmpeg@2.1.3:
resolution: {integrity: sha512-Be3narBNt2s6bsaqP6Jzq91heDgOEaDCJAXcE3qcma/EJBSy5FB4cvO31XBInuAuKBx8Kptf8dkhjK0IOru39Q==}
engines: {node: '>=18'}
- follow-redirects@1.15.6:
- resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==}
+ follow-redirects@1.15.9:
+ resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==}
engines: {node: '>=4.0'}
peerDependencies:
debug: '*'
@@ -4167,8 +4445,8 @@ packages:
for-each@0.3.3:
resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==}
- foreground-child@3.2.1:
- resolution: {integrity: sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==}
+ foreground-child@3.3.0:
+ resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==}
engines: {node: '>=14'}
fork-ts-checker-webpack-plugin@9.0.2:
@@ -4178,8 +4456,8 @@ packages:
typescript: '>3.6.0'
webpack: ^5.11.0
- form-data@4.0.0:
- resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==}
+ form-data@4.0.1:
+ resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==}
engines: {node: '>= 6'}
formidable@2.1.2:
@@ -4192,8 +4470,8 @@ packages:
fraction.js@4.3.7:
resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==}
- framer-motion@11.15.0:
- resolution: {integrity: sha512-MLk8IvZntxOMg7lDBLw2qgTHHv664bYoYmnFTmE0Gm/FW67aOJk0WM3ctMcG+Xhcv+vh5uyyXwxvxhSeJzSe+w==}
+ framer-motion@11.16.0:
+ resolution: {integrity: sha512-oL2AWqLQuw0+CNEUa0sz3mWC/n3i147CckvpQn8bLRs30b+HxTxlRi0YR2FpHHhAbWV7DKjNdHU42KHLfBWh/g==}
peerDependencies:
'@emotion/is-prop-valid': '*'
react: ^18.0.0 || ^19.0.0
@@ -4244,18 +4522,29 @@ packages:
resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
engines: {node: '>=6.9.0'}
+ get-browser-rtc@1.1.0:
+ resolution: {integrity: sha512-MghbMJ61EJrRsDe7w1Bvqt3ZsBuqhce5nrn/XAwgwOXhcsz53/ltdxOse1h/8eKXj5slzxdsz56g5rzOFSGwfQ==}
+
get-caller-file@2.0.5:
resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
engines: {node: 6.* || 8.* || >= 10.*}
- get-intrinsic@1.2.4:
- resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==}
+ get-intrinsic@1.2.7:
+ resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==}
engines: {node: '>= 0.4'}
+ get-own-enumerable-keys@1.0.0:
+ resolution: {integrity: sha512-PKsK2FSrQCyxcGHsGrLDcK0lx+0Ke+6e8KFFozA9/fIQLhQzPaRvJFdcz7+Axg3jUH/Mq+NI4xa5u/UT2tQskA==}
+ engines: {node: '>=14.16'}
+
get-package-type@0.1.0:
resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==}
engines: {node: '>=8.0.0'}
+ get-proto@1.0.1:
+ resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}
+ engines: {node: '>= 0.4'}
+
get-stream@6.0.1:
resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
engines: {node: '>=10'}
@@ -4271,11 +4560,6 @@ packages:
glob-to-regexp@0.4.1:
resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==}
- glob@10.4.2:
- resolution: {integrity: sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==}
- engines: {node: '>=16 || 14 >=14.18'}
- hasBin: true
-
glob@10.4.5:
resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==}
hasBin: true
@@ -4314,8 +4598,9 @@ packages:
peerDependencies:
csstype: ^3.0.10
- gopd@1.0.1:
- resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==}
+ gopd@1.2.0:
+ resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}
+ engines: {node: '>= 0.4'}
graceful-fs@4.2.11:
resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
@@ -4323,9 +4608,8 @@ packages:
graphemer@1.4.0:
resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
- has-flag@3.0.0:
- resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==}
- engines: {node: '>=4'}
+ graphlib@2.1.8:
+ resolution: {integrity: sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==}
has-flag@4.0.0:
resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
@@ -4338,12 +4622,8 @@ packages:
has-property-descriptors@1.0.2:
resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==}
- has-proto@1.0.3:
- resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==}
- engines: {node: '>= 0.4'}
-
- has-symbols@1.0.3:
- resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==}
+ has-symbols@1.1.0:
+ resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==}
engines: {node: '>= 0.4'}
has-tostringtag@1.0.2:
@@ -4385,8 +4665,8 @@ packages:
ieee754@1.2.1:
resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
- ignore@5.3.1:
- resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==}
+ ignore@5.3.2:
+ resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
engines: {node: '>= 4'}
immediate@3.0.6:
@@ -4399,8 +4679,8 @@ packages:
resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
engines: {node: '>=6'}
- import-local@3.1.0:
- resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==}
+ import-local@3.2.0:
+ resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==}
engines: {node: '>=8'}
hasBin: true
@@ -4423,8 +4703,12 @@ packages:
resolution: {integrity: sha512-vI2w4zl/mDluHt9YEQ/543VTCwPKWiHzKtm9dM2V0NdFcqEexDAjUHzO1oA60HRNaVifGXXM1tRRNluLVHa0Kg==}
engines: {node: '>=18'}
- ioredis@5.4.1:
- resolution: {integrity: sha512-2YZsvl7jopIa1gaePkeMtd9rAcSjOOjPtpcLlOeusyO+XH2SK5ZcT+UCrElPP+WVIInh2TzeI4XW9ENaSLVVHA==}
+ internmap@2.0.3:
+ resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==}
+ engines: {node: '>=12'}
+
+ ioredis@5.4.2:
+ resolution: {integrity: sha512-0SZXGNGZ+WzISQ67QDyZ2x0+wVxjjUndtD8oSeik/4ajifeiRufed8fCb8QW8VMyi4MXcS+UO1k/0NGhvq1PAg==}
engines: {node: '>=12.22.0'}
ipaddr.js@1.9.1:
@@ -4435,8 +4719,8 @@ packages:
resolution: {integrity: sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==}
engines: {node: '>= 10'}
- is-arguments@1.1.1:
- resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==}
+ is-arguments@1.2.0:
+ resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==}
engines: {node: '>= 0.4'}
is-arrayish@0.2.1:
@@ -4453,8 +4737,8 @@ packages:
resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
engines: {node: '>= 0.4'}
- is-core-module@2.14.0:
- resolution: {integrity: sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==}
+ is-core-module@2.16.1:
+ resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==}
engines: {node: '>= 0.4'}
is-extglob@2.1.1:
@@ -4473,8 +4757,8 @@ packages:
resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==}
engines: {node: '>=6'}
- is-generator-function@1.0.10:
- resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==}
+ is-generator-function@1.1.0:
+ resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==}
engines: {node: '>= 0.4'}
is-glob@4.0.3:
@@ -4489,16 +4773,28 @@ packages:
resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
engines: {node: '>=0.12.0'}
+ is-obj@3.0.0:
+ resolution: {integrity: sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==}
+ engines: {node: '>=12'}
+
is-path-inside@3.0.3:
resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==}
engines: {node: '>=8'}
+ is-regex@1.2.1:
+ resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==}
+ engines: {node: '>= 0.4'}
+
+ is-regexp@3.1.0:
+ resolution: {integrity: sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA==}
+ engines: {node: '>=12'}
+
is-stream@2.0.1:
resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
engines: {node: '>=8'}
- is-typed-array@1.1.13:
- resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==}
+ is-typed-array@1.1.15:
+ resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==}
engines: {node: '>= 0.4'}
is-unicode-supported@0.1.0:
@@ -4553,11 +4849,14 @@ packages:
resolution: {integrity: sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==}
engines: {node: 20 || >=22}
- jake@10.9.1:
- resolution: {integrity: sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w==}
+ jake@10.9.2:
+ resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==}
engines: {node: '>=10'}
hasBin: true
+ javascript-lp-solver@0.4.24:
+ resolution: {integrity: sha512-5edoDKnMrt/u3M6GnZKDDIPxOyFOg+WrwDv8mjNiMC2DePhy2H9/FFQgf4ggywaXT1utvkxusJcjQUER72cZmA==}
+
jest-changed-files@29.7.0:
resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
@@ -4691,8 +4990,8 @@ packages:
node-notifier:
optional: true
- jiti@1.21.6:
- resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==}
+ jiti@1.21.7:
+ resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==}
hasBin: true
joycon@3.1.1:
@@ -4713,9 +5012,9 @@ packages:
resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
hasBin: true
- jsesc@2.5.2:
- resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==}
- engines: {node: '>=4'}
+ jsesc@3.1.0:
+ resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==}
+ engines: {node: '>=6'}
hasBin: true
json-buffer@3.0.1:
@@ -4763,6 +5062,10 @@ packages:
jws@3.2.2:
resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==}
+ katex@0.16.19:
+ resolution: {integrity: sha512-3IA6DYVhxhBabjSLTNO9S4+OliA3Qvb8pBQXMfC4WxXJgLwZgnfDl0BmB4z6nBMdznBsZ+CGM8DrGZ5hcguDZg==}
+ hasBin: true
+
keyv@4.5.4:
resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
@@ -4770,6 +5073,10 @@ packages:
resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==}
engines: {node: '>=6'}
+ kleur@4.1.5:
+ resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==}
+ engines: {node: '>=6'}
+
lazystream@1.0.1:
resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==}
engines: {node: '>= 0.6.3'}
@@ -4832,10 +5139,6 @@ packages:
lie@3.3.0:
resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==}
- lilconfig@3.1.2:
- resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==}
- engines: {node: '>=14'}
-
lilconfig@3.1.3:
resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==}
engines: {node: '>=14'}
@@ -4866,6 +5169,9 @@ packages:
resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
engines: {node: '>=10'}
+ lodash-es@4.17.21:
+ resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==}
+
lodash._baseiteratee@4.7.0:
resolution: {integrity: sha512-nqB9M+wITz0BX/Q2xg6fQ8mLkyfF7MU7eE+MNBNjTHFKeKaZAPEzEg+E8LWxKWf1DQVflNEn9N49yAuqKh2mWQ==}
@@ -4884,6 +5190,9 @@ packages:
lodash._stringtopath@4.8.0:
resolution: {integrity: sha512-SXL66C731p0xPDC5LZg4wI5H+dJo/EO4KTqOMwLYCH3+FmmfAKJEZCm6ohGpI+T1xwsDsJCfL4OnhorllvlTPQ==}
+ lodash.clonedeep@4.5.0:
+ resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==}
+
lodash.debounce@4.0.8:
resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==}
@@ -4986,8 +5295,8 @@ packages:
ltgt@2.2.1:
resolution: {integrity: sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA==}
- luxon@3.4.4:
- resolution: {integrity: sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA==}
+ luxon@3.5.0:
+ resolution: {integrity: sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==}
engines: {node: '>=12'}
magic-string@0.30.8:
@@ -5004,6 +5313,16 @@ packages:
makeerror@1.0.12:
resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==}
+ math-intrinsics@1.1.0:
+ resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
+ engines: {node: '>= 0.4'}
+
+ mdast-util-from-markdown@1.3.1:
+ resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==}
+
+ mdast-util-to-string@3.2.0:
+ resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==}
+
media-typer@0.3.0:
resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==}
engines: {node: '>= 0.6'}
@@ -5015,8 +5334,11 @@ packages:
memoize-one@5.2.1:
resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==}
- merge-descriptors@1.0.1:
- resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==}
+ memory-fs@0.3.0:
+ resolution: {integrity: sha512-QTNXnl79X97kZ9jJk/meJrtDuvgvRakX5LU7HZW1L7MsXHuSTwoMIzN9tOLLH3Xfsj/gbsSqX/ovnsqz246zKQ==}
+
+ merge-descriptors@1.0.3:
+ resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==}
merge-stream@2.0.0:
resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
@@ -5029,9 +5351,68 @@ packages:
resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==}
engines: {node: '>= 0.6'}
- micromatch@4.0.7:
- resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==}
- engines: {node: '>=8.6'}
+ micromark-core-commonmark@1.1.0:
+ resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==}
+
+ micromark-factory-destination@1.1.0:
+ resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==}
+
+ micromark-factory-label@1.1.0:
+ resolution: {integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==}
+
+ micromark-factory-space@1.1.0:
+ resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==}
+
+ micromark-factory-title@1.1.0:
+ resolution: {integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==}
+
+ micromark-factory-whitespace@1.1.0:
+ resolution: {integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==}
+
+ micromark-util-character@1.2.0:
+ resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==}
+
+ micromark-util-chunked@1.1.0:
+ resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==}
+
+ micromark-util-classify-character@1.1.0:
+ resolution: {integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==}
+
+ micromark-util-combine-extensions@1.1.0:
+ resolution: {integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==}
+
+ micromark-util-decode-numeric-character-reference@1.1.0:
+ resolution: {integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==}
+
+ micromark-util-decode-string@1.1.0:
+ resolution: {integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==}
+
+ micromark-util-encode@1.1.0:
+ resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==}
+
+ micromark-util-html-tag-name@1.2.0:
+ resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==}
+
+ micromark-util-normalize-identifier@1.1.0:
+ resolution: {integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==}
+
+ micromark-util-resolve-all@1.1.0:
+ resolution: {integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==}
+
+ micromark-util-sanitize-uri@1.2.0:
+ resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==}
+
+ micromark-util-subtokenize@1.1.0:
+ resolution: {integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==}
+
+ micromark-util-symbol@1.1.0:
+ resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==}
+
+ micromark-util-types@1.1.0:
+ resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==}
+
+ micromark@3.2.0:
+ resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==}
micromatch@4.0.8:
resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
@@ -5081,8 +5462,8 @@ packages:
minimist@1.2.8:
resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
- minio@8.0.1:
- resolution: {integrity: sha512-FzDO6yGnqLtm8sp3mXafWtiRUOslJSSg/aI0v9YbN5vjw5KLoODKAROCyi766NIvTSxcfHBrbhCSGk1A+MOzDg==}
+ minio@8.0.3:
+ resolution: {integrity: sha512-+FIYQ+HZ5GrBjEmIYienRgEikqaTWAflXIV5lJOtUzfYxn3NvjQx7BsJSORXExlqgzWxKTWsqkyk2wiyFjs9/w==}
engines: {node: ^16 || ^18 || >=20}
minipass@7.1.2:
@@ -5096,18 +5477,19 @@ packages:
resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==}
hasBin: true
- motion-dom@11.14.3:
- resolution: {integrity: sha512-lW+D2wBy5vxLJi6aCP0xyxTxlTfiu+b+zcpVbGVFUxotwThqhdpPRSmX8xztAgtZMPMeU0WGVn/k1w4I+TbPqA==}
+ motion-dom@11.16.0:
+ resolution: {integrity: sha512-4bmEwajSdrljzDAYpu6ceEdtI4J5PH25fmN8YSx7Qxk6OMrC10CXM0D5y+VO/pFZjhmCvm2bGf7Rus482kwhzA==}
- motion-utils@11.14.3:
- resolution: {integrity: sha512-Xg+8xnqIJTpr0L/cidfTTBFkvRw26ZtGGuIhA94J9PQ2p4mEa06Xx7QVYZH0BP+EpMSaDlu+q0I0mmvwADPsaQ==}
+ motion-utils@11.16.0:
+ resolution: {integrity: sha512-ngdWPjg31rD4WGXFi0eZ00DQQqKKu04QExyv/ymlC+3k+WIgYVFbt6gS5JsFPbJODTF/r8XiE/X+SsoT9c0ocw==}
+
+ mri@1.2.0:
+ resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==}
+ engines: {node: '>=4'}
ms@2.0.0:
resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
- ms@2.1.2:
- resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
-
ms@2.1.3:
resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
@@ -5115,8 +5497,8 @@ packages:
resolution: {integrity: sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==}
hasBin: true
- msgpackr@1.11.0:
- resolution: {integrity: sha512-I8qXuuALqJe5laEBYoFykChhSXLikZmUhccjGsPuSJ/7uPip2TJ7lwdIQwWSAi0jGZDXv4WOP8Qg65QZRuXxXw==}
+ msgpackr@1.11.2:
+ resolution: {integrity: sha512-F9UngXRlPyWCDEASDpTf6c9uNhGPTqnTeLVt7bN+bU1eajoR/8V9ys2BRaV5C/e5ihE6sJ9uPIKaYt6bFuO32g==}
multer@1.4.4-lts.1:
resolution: {integrity: sha512-WeSGziVj6+Z2/MwQo3GvqzgR+9Uc+qt8SwHKh3gvNPiISKfsMfG4SvCOFYlxxgkXt7yIV2i1yczehm0EOKIxIg==}
@@ -5138,8 +5520,8 @@ packages:
nanoid-cjs@0.0.7:
resolution: {integrity: sha512-z72crZ0JcTb5s40Pm9Vk99qfEw9Oe1qyVjK/kpelCKyZDH8YTX4HejSfp54PMJT8F5rmsiBpG6wfVAGAhLEFhA==}
- nanoid@3.3.7:
- resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==}
+ nanoid@3.3.8:
+ resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==}
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
@@ -5198,9 +5580,6 @@ packages:
node-int64@0.4.0:
resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==}
- node-releases@2.0.14:
- resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==}
-
node-releases@2.0.19:
resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==}
@@ -5224,8 +5603,8 @@ packages:
resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==}
engines: {node: '>= 6'}
- object-inspect@1.13.2:
- resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==}
+ object-inspect@1.13.3:
+ resolution: {integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==}
engines: {node: '>= 0.4'}
on-finished@2.4.1:
@@ -5275,12 +5654,15 @@ packages:
resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
engines: {node: '>=6'}
- package-json-from-dist@1.0.0:
- resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==}
+ package-json-from-dist@1.0.1:
+ resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==}
pako@1.0.11:
resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==}
+ parchment@3.0.0:
+ resolution: {integrity: sha512-HUrJFQ/StvgmXRcQ1ftY6VEZUq3jA2t9ncFN4F84J/vN0/FPpQF+8FKXb3l6fLces6q0uOHj6NJn+2xvZnxO6A==}
+
parent-module@1.0.1:
resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
engines: {node: '>=6'}
@@ -5320,18 +5702,18 @@ packages:
resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==}
engines: {node: 20 || >=22}
- path-to-regexp@0.1.7:
- resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==}
+ path-to-regexp@0.1.12:
+ resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==}
- path-to-regexp@3.2.0:
- resolution: {integrity: sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA==}
+ path-to-regexp@3.3.0:
+ resolution: {integrity: sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==}
path-type@4.0.0:
resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
engines: {node: '>=8'}
- picocolors@1.0.1:
- resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==}
+ pdf-lib@1.17.1:
+ resolution: {integrity: sha512-V/mpyJAoTsN4cnP31vc0wfNA1+p20evqqnap0KLoRUN0Yk/p3wN52DOEsL4oBFcLdb76hlpKPtzJIgo67j/XLw==}
picocolors@1.1.1:
resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
@@ -5438,8 +5820,8 @@ packages:
resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==}
engines: {node: '>=6.0.0'}
- prettier@3.3.2:
- resolution: {integrity: sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==}
+ prettier@3.4.2:
+ resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==}
engines: {node: '>=14'}
hasBin: true
@@ -5482,14 +5864,18 @@ packages:
pure-rand@6.1.0:
resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==}
- qs@6.11.0:
- resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==}
+ qs@6.13.0:
+ resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==}
engines: {node: '>=0.6'}
- qs@6.12.3:
- resolution: {integrity: sha512-AWJm14H1vVaO/iNZ4/hO+HyaTehuy9nRqVdkTqlJt0HWvBiBIEXFmb4C0DGeYo3Xes9rrEW+TxHsaigCbN5ICQ==}
+ qs@6.13.1:
+ resolution: {integrity: sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg==}
engines: {node: '>=0.6'}
+ quadprog@1.6.1:
+ resolution: {integrity: sha512-fN5Jkcjlln/b3pJkseDKREf89JkKIyu6cKIVXisgL6ocKPQ0yTp9n6NZUAq3otEPPw78WZMG9K0o9WsfKyMWJw==}
+ engines: {node: '>=8.x'}
+
query-string@7.1.3:
resolution: {integrity: sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==}
engines: {node: '>=6'}
@@ -5500,6 +5886,14 @@ packages:
queue-microtask@1.2.3:
resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
+ quill-delta@5.1.0:
+ resolution: {integrity: sha512-X74oCeRI4/p0ucjb5Ma8adTXd9Scumz367kkMK5V/IatcX6A0vlgLgKbzXWy5nZmCGeNJm2oQX0d2Eqj+ZIlCA==}
+ engines: {node: '>= 12.0.0'}
+
+ quill@2.0.3:
+ resolution: {integrity: sha512-xEYQBqfYx/sfb33VJiKnSJp8ehloavImQ2A6564GAbqG55PGw1dAWUn1MUbQB62t0azawUS2CZZhWCjO8gRvTw==}
+ engines: {npm: '>=8.2.3'}
+
raf-schd@4.0.3:
resolution: {integrity: sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==}
@@ -5514,26 +5908,26 @@ packages:
resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==}
engines: {node: '>= 0.8'}
- rc-cascader@3.28.1:
- resolution: {integrity: sha512-9+8oHIMWVLHxuaapDiqFNmD9KSyKN/P4bo9x/MBuDbyTqP8f2/POmmZxdXWBO3yq/uE3pKyQCXYNUxrNfHRv2A==}
+ rc-cascader@3.32.0:
+ resolution: {integrity: sha512-U1N1N3Pt6DGcVWhZTUYqnE0JeoyphrjIJQztXSgDd50DBfhbZrjTn/TMf/qKQnC7KTMDb4eNwvo/U9LOpFJ+DQ==}
peerDependencies:
react: '>=16.9.0'
react-dom: '>=16.9.0'
- rc-checkbox@3.3.0:
- resolution: {integrity: sha512-Ih3ZaAcoAiFKJjifzwsGiT/f/quIkxJoklW4yKGho14Olulwn8gN7hOBve0/WGDg5o/l/5mL0w7ff7/YGvefVw==}
+ rc-checkbox@3.5.0:
+ resolution: {integrity: sha512-aOAQc3E98HteIIsSqm6Xk2FPKIER6+5vyEFMZfo73TqM+VVAIqOkHoPjgKLqSNtVLWScoaM7vY2ZrGEheI79yg==}
peerDependencies:
react: '>=16.9.0'
react-dom: '>=16.9.0'
- rc-collapse@3.7.3:
- resolution: {integrity: sha512-60FJcdTRn0X5sELF18TANwtVi7FtModq649H11mYF1jh83DniMoM4MqY627sEKRCTm4+WXfGDcB7hY5oW6xhyw==}
+ rc-collapse@3.9.0:
+ resolution: {integrity: sha512-swDdz4QZ4dFTo4RAUMLL50qP0EY62N2kvmk2We5xYdRwcRn8WcYtuetCJpwpaCbUfUt5+huLpVxhvmnK+PHrkA==}
peerDependencies:
react: '>=16.9.0'
react-dom: '>=16.9.0'
- rc-dialog@9.5.2:
- resolution: {integrity: sha512-qVUjc8JukG+j/pNaHVSRa2GO2/KbV2thm7yO4hepQ902eGdYK913sGkwg/fh9yhKYV1ql3BKIN2xnud3rEXAPw==}
+ rc-dialog@9.6.0:
+ resolution: {integrity: sha512-ApoVi9Z8PaCQg6FsUzS8yvBEQy0ZL2PkuvAgrmohPkN3okps5WZ5WQWPc1RNuiOKaAYv8B97ACdsFU5LizzCqg==}
peerDependencies:
react: '>=16.9.0'
react-dom: '>=16.9.0'
@@ -5544,57 +5938,57 @@ packages:
react: '>=16.9.0'
react-dom: '>=16.9.0'
- rc-dropdown@4.2.0:
- resolution: {integrity: sha512-odM8Ove+gSh0zU27DUj5cG1gNKg7mLWBYzB5E4nNLrLwBmYEgYP43vHKDGOVZcJSVElQBI0+jTQgjnq0NfLjng==}
+ rc-dropdown@4.2.1:
+ resolution: {integrity: sha512-YDAlXsPv3I1n42dv1JpdM7wJ+gSUBfeyPK59ZpBD9jQhK9jVuxpjj3NmWQHOBceA1zEPVX84T2wbdb2SD0UjmA==}
peerDependencies:
react: '>=16.11.0'
react-dom: '>=16.11.0'
- rc-field-form@2.4.0:
- resolution: {integrity: sha512-XZ/lF9iqf9HXApIHQHqzJK5v2w4mkUMsVqAzOyWVzoiwwXEavY6Tpuw7HavgzIoD+huVff4JghSGcgEfX6eycg==}
+ rc-field-form@2.7.0:
+ resolution: {integrity: sha512-hgKsCay2taxzVnBPZl+1n4ZondsV78G++XVsMIJCAoioMjlMQR9YwAp7JZDIECzIu2Z66R+f4SFIRrO2DjDNAA==}
engines: {node: '>=8.x'}
peerDependencies:
react: '>=16.9.0'
react-dom: '>=16.9.0'
- rc-image@7.9.0:
- resolution: {integrity: sha512-l4zqO5E0quuLMCtdKfBgj4Suv8tIS011F5k1zBBlK25iMjjiNHxA0VeTzGFtUZERSA45gvpXDg8/P6qNLjR25g==}
+ rc-image@7.11.0:
+ resolution: {integrity: sha512-aZkTEZXqeqfPZtnSdNUnKQA0N/3MbgR7nUnZ+/4MfSFWPFHZau4p5r5ShaI0KPEMnNjv4kijSCFq/9wtJpwykw==}
peerDependencies:
react: '>=16.9.0'
react-dom: '>=16.9.0'
- rc-input-number@9.2.0:
- resolution: {integrity: sha512-5XZFhBCV5f9UQ62AZ2hFbEY8iZT/dm23Q1kAg0H8EvOgD3UDbYYJAayoVIkM3lQaCqYAW5gV0yV3vjw1XtzWHg==}
+ rc-input-number@9.4.0:
+ resolution: {integrity: sha512-Tiy4DcXcFXAf9wDhN8aUAyMeCLHJUHA/VA/t7Hj8ZEx5ETvxG7MArDOSE6psbiSCo+vJPm4E3fGN710ITVn6GA==}
peerDependencies:
react: '>=16.9.0'
react-dom: '>=16.9.0'
- rc-input@1.6.3:
- resolution: {integrity: sha512-wI4NzuqBS8vvKr8cljsvnTUqItMfG1QbJoxovCgL+DX4eVUcHIjVwharwevIxyy7H/jbLryh+K7ysnJr23aWIA==}
+ rc-input@1.7.2:
+ resolution: {integrity: sha512-g3nYONnl4edWj2FfVoxsU3Ec4XTE+Hb39Kfh2MFxMZjp/0gGyPUgy/v7ZhS27ZxUFNkuIDYXm9PJsLyJbtg86A==}
peerDependencies:
react: '>=16.0.0'
react-dom: '>=16.0.0'
- rc-mentions@2.15.0:
- resolution: {integrity: sha512-f5v5i7VdqvBDXbphoqcQWmXDif2Msd2arritVoWybrVDuHE6nQ7XCYsybHbV//WylooK52BFDouFvyaRDtXZEw==}
+ rc-mentions@2.19.1:
+ resolution: {integrity: sha512-KK3bAc/bPFI993J3necmaMXD2reZTzytZdlTvkeBbp50IGH1BDPDvxLdHDUrpQx2b2TGaVJsn+86BvYa03kGqA==}
peerDependencies:
react: '>=16.9.0'
react-dom: '>=16.9.0'
- rc-menu@9.14.1:
- resolution: {integrity: sha512-5wlRb3M8S4yGlWhSoEYJ7ZVRElyScdcpUHxgiLxkeig1tEdyKrnED3B2fhpN0Rrpdp9jyhnmZR/Lwq2fH5VvDQ==}
+ rc-menu@9.16.0:
+ resolution: {integrity: sha512-vAL0yqPkmXWk3+YKRkmIR8TYj3RVdEt3ptG2jCJXWNAvQbT0VJJdRyHZ7kG/l1JsZlB+VJq/VcYOo69VR4oD+w==}
peerDependencies:
react: '>=16.9.0'
react-dom: '>=16.9.0'
- rc-motion@2.9.2:
- resolution: {integrity: sha512-fUAhHKLDdkAXIDLH0GYwof3raS58dtNUmzLF2MeiR8o6n4thNpSDQhOqQzWE4WfFZDCi9VEN8n7tiB7czREcyw==}
+ rc-motion@2.9.5:
+ resolution: {integrity: sha512-w+XTUrfh7ArbYEd2582uDrEhmBHwK1ZENJiSJVb7uRxdE7qJSYjbO2eksRXmndqyKqKoYPc9ClpPh5242mV1vA==}
peerDependencies:
react: '>=16.9.0'
react-dom: '>=16.9.0'
- rc-notification@5.6.0:
- resolution: {integrity: sha512-TGQW5T7waOxLwgJG7fXcw8l7AQiFOjaZ7ISF5PrU526nunHRNcTMuzKihQHaF4E/h/KfOCDk3Mv8eqzbu2e28w==}
+ rc-notification@5.6.2:
+ resolution: {integrity: sha512-Id4IYMoii3zzrG0lB0gD6dPgJx4Iu95Xu0BQrhHIbp7ZnAZbLqdqQ73aIWH0d0UFcElxwaKjnzNovTjo7kXz7g==}
engines: {node: '>=8.x'}
peerDependencies:
react: '>=16.9.0'
@@ -5606,14 +6000,14 @@ packages:
react: '>=16.9.0'
react-dom: '>=16.9.0'
- rc-pagination@4.2.0:
- resolution: {integrity: sha512-V6qeANJsT6tmOcZ4XiUmj8JXjRLbkusuufpuoBw2GiAn94fIixYjFLmbruD1Sbhn8fPLDnWawPp4CN37zQorvw==}
+ rc-pagination@5.0.0:
+ resolution: {integrity: sha512-QjrPvbAQwps93iluvFM62AEYglGYhWW2q/nliQqmvkTi4PXP4HHoh00iC1Sa5LLVmtWQHmG73fBi2x6H6vFHRg==}
peerDependencies:
react: '>=16.9.0'
react-dom: '>=16.9.0'
- rc-picker@4.6.14:
- resolution: {integrity: sha512-7DuTfUFdkxmsNpWQ0TWv6FPGna5e6KKC4nxtx3x9xhumLz7jb3fhlDdWQvqEL6tpt9DOb1+N5j+wB+lDOSS9kg==}
+ rc-picker@4.9.2:
+ resolution: {integrity: sha512-SLW4PRudODOomipKI0dvykxW4P8LOqtMr17MOaLU6NQJhkh9SZeh44a/8BMxwv5T6e3kiIeYc9k5jFg2Mv35Pg==}
engines: {node: '>=8.x'}
peerDependencies:
date-fns: '>= 2.x'
@@ -5645,27 +6039,27 @@ packages:
react: '>=16.9.0'
react-dom: '>=16.9.0'
- rc-resize-observer@1.4.0:
- resolution: {integrity: sha512-PnMVyRid9JLxFavTjeDXEXo65HCRqbmLBw9xX9gfC4BZiSzbLXKzW3jPz+J0P71pLbD5tBMTT+mkstV5gD0c9Q==}
+ rc-resize-observer@1.4.3:
+ resolution: {integrity: sha512-YZLjUbyIWox8E9i9C3Tm7ia+W7euPItNWSPX5sCcQTYbnwDb5uNpnLHQCG1f22oZWUhLw4Mv2tFmeWe68CDQRQ==}
peerDependencies:
react: '>=16.9.0'
react-dom: '>=16.9.0'
- rc-segmented@2.3.0:
- resolution: {integrity: sha512-I3FtM5Smua/ESXutFfb8gJ8ZPcvFR+qUgeeGFQHBOvRiRKyAk4aBE5nfqrxXx+h8/vn60DQjOt6i4RNtrbOobg==}
+ rc-segmented@2.7.0:
+ resolution: {integrity: sha512-liijAjXz+KnTRVnxxXG2sYDGd6iLL7VpGGdR8gwoxAXy2KglviKCxLWZdjKYJzYzGSUwKDSTdYk8brj54Bn5BA==}
peerDependencies:
react: '>=16.0.0'
react-dom: '>=16.0.0'
- rc-select@14.15.2:
- resolution: {integrity: sha512-oNoXlaFmpqXYcQDzcPVLrEqS2J9c+/+oJuGrlXeVVX/gVgrbHa5YcyiRUXRydFjyuA7GP3elRuLF7Y3Tfwltlw==}
+ rc-select@14.16.4:
+ resolution: {integrity: sha512-jP6qf7+vjnxGvPpfPWbGYfFlSl3h8L2XcD4O7g2GYXmEeBC0mw+nPD7i++OOE8v3YGqP8xtYjRKAWCMLfjgxlw==}
engines: {node: '>=8.x'}
peerDependencies:
react: '*'
react-dom: '*'
- rc-slider@11.1.5:
- resolution: {integrity: sha512-b77H5PbjMKsvkYXAYIkn50QuFX6ICQmCTibDinI9q+BHx65/TV4TeU25+oadhSRzykxs0/vBWeKBwRyySOeWlg==}
+ rc-slider@11.1.8:
+ resolution: {integrity: sha512-2gg/72YFSpKP+Ja5AjC5DPL1YnV8DEITDQrcc1eASrUYjl0esptaBVJBh5nLTXCCp15eD8EuGjwezVGSHhs9tQ==}
engines: {node: '>=8.x'}
peerDependencies:
react: '>=16.9.0'
@@ -5684,59 +6078,59 @@ packages:
react: '>=16.9.0'
react-dom: '>=16.9.0'
- rc-table@7.45.7:
- resolution: {integrity: sha512-wi9LetBL1t1csxyGkMB2p3mCiMt+NDexMlPbXHvQFmBBAsMxrgNSAPwUci2zDLUq9m8QdWc1Nh8suvrpy9mXrg==}
+ rc-table@7.50.1:
+ resolution: {integrity: sha512-+kt7uQvJUsGBwVStrFwS6lMuQTY1TlH7Zh82PB7JflbD968qXyZ6tSTyQjXW0ObFsqpKB/lprdqqU4fl6cj9Uw==}
engines: {node: '>=8.x'}
peerDependencies:
react: '>=16.9.0'
react-dom: '>=16.9.0'
- rc-tabs@15.1.1:
- resolution: {integrity: sha512-Tc7bJvpEdkWIVCUL7yQrMNBJY3j44NcyWS48jF/UKMXuUlzaXK+Z/pEL5LjGcTadtPvVmNqA40yv7hmr+tCOAw==}
+ rc-tabs@15.5.0:
+ resolution: {integrity: sha512-NrDcTaUJLh9UuDdMBkjKTn97U9iXG44s9D03V5NHkhEDWO5/nC6PwC3RhkCWFMKB9hh+ryqgZ+TIr1b9Jd/hnQ==}
engines: {node: '>=8.x'}
peerDependencies:
react: '>=16.9.0'
react-dom: '>=16.9.0'
- rc-textarea@1.8.1:
- resolution: {integrity: sha512-bm36N2ZqwZAP60ZQg2OY9mPdqWC+m6UTjHc+CqEZOxb3Ia29BGHazY/s5bI8M4113CkqTzhtFUDNA078ZiOx3Q==}
+ rc-textarea@1.9.0:
+ resolution: {integrity: sha512-dQW/Bc/MriPBTugj2Kx9PMS5eXCCGn2cxoIaichjbNvOiARlaHdI99j4DTxLl/V8+PIfW06uFy7kjfUIDDKyxQ==}
peerDependencies:
react: '>=16.9.0'
react-dom: '>=16.9.0'
- rc-tooltip@6.2.0:
- resolution: {integrity: sha512-iS/3iOAvtDh9GIx1ulY7EFUXUtktFccNLsARo3NPgLf0QW9oT0w3dA9cYWlhqAKmD+uriEwdWz1kH0Qs4zk2Aw==}
+ rc-tooltip@6.3.2:
+ resolution: {integrity: sha512-oA4HZIiZJbUQ5ojigM0y4XtWxaH/aQlJSzknjICRWNpqyemy1sL3X3iEQV2eSPBWEq+bqU3+aSs81z+28j9luA==}
peerDependencies:
react: '>=16.9.0'
react-dom: '>=16.9.0'
- rc-tree-select@5.23.0:
- resolution: {integrity: sha512-aQGi2tFSRw1WbXv0UVXPzHm09E0cSvUVZMLxQtMv3rnZZpNmdRXWrnd9QkLNlVH31F+X5rgghmdSFF3yZW0N9A==}
+ rc-tree-select@5.26.0:
+ resolution: {integrity: sha512-aRS6LeFO00ScvsxyyXp8nYUe+CsJ+6WMPuSNay90TUHGOmWnacaC43F5XAveUnskSIL+Svp+Nw2od7ANd8puFQ==}
peerDependencies:
react: '*'
react-dom: '*'
- rc-tree@5.9.0:
- resolution: {integrity: sha512-CPrgOvm9d/9E+izTONKSngNzQdIEjMox2PBufWjS1wf7vxtvmCWzK1SlpHbRY6IaBfJIeZ+88RkcIevf729cRg==}
+ rc-tree@5.12.4:
+ resolution: {integrity: sha512-Up5NVYMprq9ijtcp01nf9Dkk6RJaRdt/fBCe9U2Cx+IBoVfR+gaUKPijDlMQX7XVgyfD89ivTz8jHM3XggdvyA==}
engines: {node: '>=10.x'}
peerDependencies:
react: '*'
react-dom: '*'
- rc-upload@4.7.0:
- resolution: {integrity: sha512-eUwxYNHlsYe5vYhKFAUGrQG95JrnPzY+BmPi1Daq39fWNl/eOc7v4UODuWrVp2LFkQBuV3cMCG/I68iub6oBrg==}
+ rc-upload@4.8.1:
+ resolution: {integrity: sha512-toEAhwl4hjLAI1u8/CgKWt30BR06ulPa4iGQSMvSXoHzO88gPCslxqV/mnn4gJU7PDoltGIC9Eh+wkeudqgHyw==}
peerDependencies:
react: '>=16.9.0'
react-dom: '>=16.9.0'
- rc-util@5.43.0:
- resolution: {integrity: sha512-AzC7KKOXFqAdIBqdGWepL9Xn7cm3vnAmjlHqUnoQaTMZYhM4VlXGLkkHHxj/BZ7Td0+SOPKB4RGPboBVKT9htw==}
+ rc-util@5.44.3:
+ resolution: {integrity: sha512-q6KCcOFk3rv/zD3MckhJteZxb0VjAIFuf622B7ElK4vfrZdAzs16XR5p3VTdy3+U5jfJU5ACz4QnhLSuAGe5dA==}
peerDependencies:
react: '>=16.9.0'
react-dom: '>=16.9.0'
- rc-virtual-list@3.14.5:
- resolution: {integrity: sha512-ZMOnkCLv2wUN8Jz7yI4XiSLa9THlYvf00LuMhb1JlsQCewuU7ydPuHw1rGVPhe9VZYl/5UqODtNd7QKJ2DMGfg==}
+ rc-virtual-list@3.17.0:
+ resolution: {integrity: sha512-h0jPHWt8/Ots9eiGVSGQTxwrSuQ3kxqL/ERKubv8zzIMICGQaDDWm/JoUa31MdQUC7PKDMiy5KDLkNfHcWo+iQ==}
engines: {node: '>=8.x'}
peerDependencies:
react: '>=16.9.0'
@@ -5765,19 +6159,31 @@ packages:
react: '>= 16.3.0'
react-dom: '>= 16.3.0'
+ react-dropzone@14.3.5:
+ resolution: {integrity: sha512-9nDUaEEpqZLOz5v5SUcFA0CjM4vq8YbqO0WRls+EYT7+DvxUdzDPKNCPLqGfj3YL9MsniCLCD4RFA6M95V6KMQ==}
+ engines: {node: '>= 10.13'}
+ peerDependencies:
+ react: '>= 16.8 || 18.0.0'
+
react-hook-form@7.54.2:
resolution: {integrity: sha512-eHpAUgUjWbZocoQYUHposymRb4ZP6d0uwUnooL2uOybA9/3tPUvoAKqEWK1WaSiTxxOfTpffNZP7QwlnM3/gEg==}
engines: {node: '>=18.0.0'}
peerDependencies:
react: ^16.8.0 || ^17 || ^18 || ^19
- react-hot-toast@2.4.1:
- resolution: {integrity: sha512-j8z+cQbWIM5LY37pR6uZR6D4LfseplqnuAO4co4u8917hBUvXlEqyP1ZzqVLcqoyUesZZv/ImreoCeHVDpE5pQ==}
+ react-hot-toast@2.5.1:
+ resolution: {integrity: sha512-54Gq1ZD1JbmAb4psp9bvFHjS7lje+8ubboUmvKZkCsQBLH6AOpZ9JemfRvIdHcfb9AZXRaFLrb3qUobGYDJhFQ==}
engines: {node: '>=10'}
peerDependencies:
react: '>=16'
react-dom: '>=16'
+ react-hotkeys-hook@4.6.1:
+ resolution: {integrity: sha512-XlZpbKUj9tkfgPgT9gA+1p7Ey6vFIZHttUjPqpTdyT5nqQ8mHL7elxvSbaC+dpSiHUSmr21Ya1mDxBZG3aje4Q==}
+ peerDependencies:
+ react: '>=16.8.1'
+ react-dom: '>=16.8.1'
+
react-is@16.13.1:
resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
@@ -5808,15 +6214,15 @@ packages:
peerDependencies:
react: '>= 16.3'
- react-router-dom@6.24.1:
- resolution: {integrity: sha512-U19KtXqooqw967Vw0Qcn5cOvrX5Ejo9ORmOtJMzYWtCT4/WOfFLIZGGsVLxcd9UkBO0mSTZtXqhZBsWlHr7+Sg==}
+ react-router-dom@6.28.1:
+ resolution: {integrity: sha512-YraE27C/RdjcZwl5UCqF/ffXnZDxpJdk9Q6jw38SZHjXs7NNdpViq2l2c7fO7+4uWaEfcwfGCv3RSg4e1By/fQ==}
engines: {node: '>=14.0.0'}
peerDependencies:
react: '>=16.8'
react-dom: '>=16.8'
- react-router@6.24.1:
- resolution: {integrity: sha512-PTXFXGK2pyXpHzVo3rR9H7ip4lSPZZc0bHG5CARmj65fTT6qG7sTngmb6lcYu1gf3y/8KxORoy9yn59pGpCnpg==}
+ react-router@6.28.1:
+ resolution: {integrity: sha512-2omQTA3rkMljmrvvo6WtewGdVh45SpL9hGiCI9uUrwGGfNFDIvGK4gYJsKlJoNVi6AQZcopSCballL+QGOm7fA==}
engines: {node: '>=14.0.0'}
peerDependencies:
react: '>=16.8'
@@ -5825,10 +6231,6 @@ packages:
resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==}
engines: {node: '>=0.10.0'}
- react@18.3.1:
- resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==}
- engines: {node: '>=0.10.0'}
-
read-cache@1.0.0:
resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==}
@@ -5892,6 +6294,10 @@ packages:
resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==}
engines: {node: '>=8'}
+ resolve-from@2.0.0:
+ resolution: {integrity: sha512-qpFcKaXsq8+oRoLilkwyc7zHGF5i9Q2/25NIgLQQ/+VVv9rU4qvr6nXVAw1DsnXJyQkZsR4Ytfbtg5ehfcUssQ==}
+ engines: {node: '>=0.10.0'}
+
resolve-from@4.0.0:
resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
engines: {node: '>=4'}
@@ -5900,12 +6306,13 @@ packages:
resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==}
engines: {node: '>=8'}
- resolve.exports@2.0.2:
- resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==}
+ resolve.exports@2.0.3:
+ resolution: {integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==}
engines: {node: '>=10'}
- resolve@1.22.8:
- resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==}
+ resolve@1.22.10:
+ resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==}
+ engines: {node: '>= 0.4'}
hasBin: true
restore-cursor@3.1.0:
@@ -5935,13 +6342,8 @@ packages:
engines: {node: 20 || >=22}
hasBin: true
- rollup@4.18.1:
- resolution: {integrity: sha512-Elx2UT8lzxxOXMpy5HWQGZqkrQOtrVDDa/bm9l10+U4rQnVzbL/LgZ4NOM1MPIDyHk69W4InuYDF5dzRh4Kw1A==}
- engines: {node: '>=18.0.0', npm: '>=8.0.0'}
- hasBin: true
-
- rollup@4.29.1:
- resolution: {integrity: sha512-RaJ45M/kmJUzSWDs1Nnd5DdV4eerC98idtUOVr6FfKcgxqvjwHmxc5upLF9qZU9EpsVzzhleFahrT3shLuJzIw==}
+ rollup@4.30.1:
+ resolution: {integrity: sha512-mlJ4glW020fPuLi7DkM/lN97mYEZGWeqBnrljzN0gs7GLctqX3lNWxKQ7Gl712UAX+6fog/L3jh4gb7R6aVi3w==}
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
hasBin: true
@@ -5959,12 +6361,20 @@ packages:
rxjs@7.8.1:
resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==}
+ sade@1.8.1:
+ resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==}
+ engines: {node: '>=6'}
+
safe-buffer@5.1.2:
resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==}
safe-buffer@5.2.1:
resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
+ safe-regex-test@1.1.0:
+ resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==}
+ engines: {node: '>= 0.4'}
+
safer-buffer@2.1.2:
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
@@ -5982,6 +6392,10 @@ packages:
resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==}
engines: {node: '>= 10.13.0'}
+ schema-utils@4.3.0:
+ resolution: {integrity: sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==}
+ engines: {node: '>= 10.13.0'}
+
scroll-into-view-if-needed@3.1.0:
resolution: {integrity: sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==}
@@ -5989,25 +6403,20 @@ packages:
resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
hasBin: true
- semver@7.6.2:
- resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==}
- engines: {node: '>=10'}
- hasBin: true
-
semver@7.6.3:
resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==}
engines: {node: '>=10'}
hasBin: true
- send@0.18.0:
- resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==}
+ send@0.19.0:
+ resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==}
engines: {node: '>= 0.8.0'}
serialize-javascript@6.0.2:
resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==}
- serve-static@1.15.0:
- resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==}
+ serve-static@1.16.2:
+ resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==}
engines: {node: '>= 0.8.0'}
set-blocking@2.0.0:
@@ -6035,8 +6444,9 @@ packages:
resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
engines: {node: '>=8'}
- shell-quote@1.8.1:
- resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==}
+ shell-quote@1.8.2:
+ resolution: {integrity: sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==}
+ engines: {node: '>= 0.4'}
should-equal@2.0.0:
resolution: {integrity: sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==}
@@ -6056,8 +6466,20 @@ packages:
should@13.2.3:
resolution: {integrity: sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==}
- side-channel@1.0.6:
- resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==}
+ side-channel-list@1.0.0:
+ resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==}
+ engines: {node: '>= 0.4'}
+
+ side-channel-map@1.0.1:
+ resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==}
+ engines: {node: '>= 0.4'}
+
+ side-channel-weakmap@1.0.2:
+ resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==}
+ engines: {node: '>= 0.4'}
+
+ side-channel@1.1.0:
+ resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==}
engines: {node: '>= 0.4'}
signal-exit@3.0.7:
@@ -6067,6 +6489,9 @@ packages:
resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
engines: {node: '>=14'}
+ simple-peer@9.11.1:
+ resolution: {integrity: sha512-D1SaWpOW8afq1CZGWB8xTfrT3FekjQmPValrqncJMX7QFl8YwhrPTZvMCANLtgBwwdS+7zURyqxDDEmY558tTw==}
+
simple-swizzle@0.2.2:
resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==}
@@ -6091,8 +6516,8 @@ packages:
resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==}
engines: {node: '>=10.0.0'}
- socket.io@4.7.5:
- resolution: {integrity: sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==}
+ socket.io@4.8.1:
+ resolution: {integrity: sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==}
engines: {node: '>=10.2.0'}
source-map-js@1.2.1:
@@ -6141,8 +6566,8 @@ packages:
stream-chain@2.2.5:
resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==}
- stream-json@1.8.0:
- resolution: {integrity: sha512-HZfXngYHUAr1exT4fxlbc1IOce1RYxp2ldeaf97LYCOPSoOqY/1Psp7iGvpb+6JIOgkra9zDYnPX01hGAHzEPw==}
+ stream-json@1.9.1:
+ resolution: {integrity: sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==}
streamsearch@1.1.0:
resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==}
@@ -6177,6 +6602,10 @@ packages:
string_decoder@1.3.0:
resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
+ stringify-object@5.0.0:
+ resolution: {integrity: sha512-zaJYxz2FtcMb4f+g60KsRNFOpVMUyuJgA51Zi5Z1DOTC3S59+OQiVOzE9GZt0x72uBGWKsQIuBKeF9iusmKFsg==}
+ engines: {node: '>=14.16'}
+
strip-ansi@5.2.0:
resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==}
engines: {node: '>=6'}
@@ -6225,18 +6654,14 @@ packages:
resolution: {integrity: sha512-1UT/mspW3nxtKquTiOUvg9h9Yo8cOZTX/N4HIlrs4tkNo+72mkXNKjJ4LQ+KaK/k5Iy+PRii4hBdgHOSaAurIg==}
engines: {node: '>=16'}
- superjson@2.2.1:
- resolution: {integrity: sha512-8iGv75BYOa0xRJHK5vRLEjE2H/i4lulTjzpUXic3Eg8akftYjkmQDa8JARQ42rlczXyFR3IeRoeFCc7RxHsYZA==}
+ superjson@2.2.2:
+ resolution: {integrity: sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==}
engines: {node: '>=16'}
supertest@6.3.4:
resolution: {integrity: sha512-erY3HFDG0dPnhw4U+udPfrzXa4xhSG+n4rxfRuZWCUvjFWwKl+OxWf/7zk50s84/fAAs7vf5QAb9uRa0cCykxw==}
engines: {node: '>=6.4.0'}
- supports-color@5.5.0:
- resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
- engines: {node: '>=4'}
-
supports-color@7.2.0:
resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
engines: {node: '>=8'}
@@ -6256,8 +6681,8 @@ packages:
resolution: {integrity: sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==}
engines: {node: '>=0.10'}
- synckit@0.8.8:
- resolution: {integrity: sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==}
+ synckit@0.9.2:
+ resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==}
engines: {node: ^14.18.0 || >=16.0.0}
tabbable@6.2.0:
@@ -6271,6 +6696,10 @@ packages:
engines: {node: '>=14.0.0'}
hasBin: true
+ tapable@0.2.9:
+ resolution: {integrity: sha512-2wsvQ+4GwBvLPLWsNfLCDYGsW6xb7aeC6utq2Qh0PFwgEy7K7dsma9Jsmb2zSQj7GvYAyUGSntLtsv++GmgL1A==}
+ engines: {node: '>=0.6'}
+
tapable@2.2.1:
resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==}
engines: {node: '>=6'}
@@ -6279,8 +6708,12 @@ packages:
resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==}
engines: {node: '>=6'}
- terser-webpack-plugin@5.3.10:
- resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==}
+ tern@0.24.3:
+ resolution: {integrity: sha512-Z8uvtdWIlFn1GWy0HW5FhZ8VDryZwoJUdnjZU25C7/PBOltLIn1uv+WF3rVq6S1761YbsmbZYRP/l0ZJBCkvrw==}
+ hasBin: true
+
+ terser-webpack-plugin@5.3.11:
+ resolution: {integrity: sha512-RVCsMfuD0+cTt3EwX8hSl2Ks56EbFHWmhluwcqoPKtBnfjiT6olaq7PRIRfhyU8nnC2MrnDrBLfrD/RGE+cVXQ==}
engines: {node: '>= 10.13.0'}
peerDependencies:
'@swc/core': '*'
@@ -6295,8 +6728,8 @@ packages:
uglify-js:
optional: true
- terser@5.31.2:
- resolution: {integrity: sha512-LGyRZVFm/QElZHy/CPr/O4eNZOZIzsrQ92y4v9UJe/pFJjypje2yI3C2FmPtvUEnhadlSbmG2nXtdcjHOjCfxw==}
+ terser@5.37.0:
+ resolution: {integrity: sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==}
engines: {node: '>=10'}
hasBin: true
@@ -6348,10 +6781,6 @@ packages:
tmpl@1.0.5:
resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==}
- to-fast-properties@2.0.0:
- resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
- engines: {node: '>=4'}
-
to-regex-range@5.0.1:
resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
engines: {node: '>=8.0'}
@@ -6381,17 +6810,23 @@ packages:
resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==}
hasBin: true
- ts-api-utils@1.3.0:
- resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==}
+ ts-api-utils@1.4.3:
+ resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==}
engines: {node: '>=16'}
peerDependencies:
typescript: '>=4.2.0'
+ ts-api-utils@2.0.0:
+ resolution: {integrity: sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ==}
+ engines: {node: '>=18.12'}
+ peerDependencies:
+ typescript: '>=4.8.4'
+
ts-interface-checker@0.1.13:
resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==}
- ts-jest@29.2.2:
- resolution: {integrity: sha512-sSW7OooaKT34AAngP6k1VS669a0HdLxkQZnlC7T76sckGCokXFnvJ3yRlQZGRTAoV5K19HfSgCiSwWOSIfcYlg==}
+ ts-jest@29.2.5:
+ resolution: {integrity: sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA==}
engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0}
hasBin: true
peerDependencies:
@@ -6435,16 +6870,19 @@ packages:
'@swc/wasm':
optional: true
- tsconfig-paths-webpack-plugin@4.1.0:
- resolution: {integrity: sha512-xWFISjviPydmtmgeUAuXp4N1fky+VCtfhOkDUFIv5ea7p4wuTomI4QTrXvFBX2S4jZsmyTSrStQl+E+4w+RzxA==}
+ tsconfig-paths-webpack-plugin@4.2.0:
+ resolution: {integrity: sha512-zbem3rfRS8BgeNK50Zz5SIQgXzLafiHjOwUAvk/38/o1jHn/V5QAgVUcz884or7WYcPaH3N2CIfUc2u0ul7UcA==}
engines: {node: '>=10.13.0'}
tsconfig-paths@4.2.0:
resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==}
engines: {node: '>=6'}
- tslib@2.6.3:
- resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==}
+ tslib@1.14.1:
+ resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==}
+
+ tslib@2.8.1:
+ resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
tsup@8.3.5:
resolution: {integrity: sha512-Tunf6r6m6tnZsG9GYWndg0z8dEV7fD733VBFzFJ5Vcm1FtlXB8xBD/rtrBi2a3YKEV7hHtxiZtW5EAVADoe1pA==}
@@ -6465,8 +6903,8 @@ packages:
typescript:
optional: true
- tus-js-client@4.1.0:
- resolution: {integrity: sha512-e/nC/kJahvNYBcnwcqzuhFIvVELMMpbVXIoOOKdUn74SdQCvJd2JjqV2jZLv2EFOVbV4qLiO0lV7BxBXF21b6Q==}
+ tus-js-client@4.2.3:
+ resolution: {integrity: sha512-UkQUCeDWKh5AwArcasIJWcL5EP66XPypKQtsdPu82wNnTea8eAUHdpDx3DcfZgDERAiCII895zMYkXri4M1wzw==}
engines: {node: '>=18'}
type-check@0.4.0:
@@ -6492,23 +6930,13 @@ packages:
typedarray@0.0.6:
resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==}
- typescript-eslint@8.18.2:
- resolution: {integrity: sha512-KuXezG6jHkvC3MvizeXgupZzaG5wjhU3yE8E7e6viOvAvD9xAWYp8/vy0WULTGe9DYDWcQu7aW03YIV3mSitrQ==}
+ typescript-eslint@8.19.1:
+ resolution: {integrity: sha512-LKPUQpdEMVOeKluHi8md7rwLcoXHhwvWp3x+sJkMuq3gGm9yaYJtPo8sRZSblMFJ5pcOGCAak/scKf1mvZDlQw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <5.8.0'
- typescript@5.3.3:
- resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==}
- engines: {node: '>=14.17'}
- hasBin: true
-
- typescript@5.5.3:
- resolution: {integrity: sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==}
- engines: {node: '>=14.17'}
- hasBin: true
-
typescript@5.7.2:
resolution: {integrity: sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==}
engines: {node: '>=14.17'}
@@ -6518,8 +6946,11 @@ packages:
resolution: {integrity: sha512-u3xV3X7uzvi5b1MncmZo3i2Aw222Zk1keqLA1YkHldREkAhAqi65wuPfe7lHx8H/Wzy+8CE7S7uS3jekIM5s8g==}
engines: {node: '>=8'}
- undici-types@5.26.5:
- resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
+ undici-types@6.19.8:
+ resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==}
+
+ unist-util-stringify-position@3.0.3:
+ resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==}
universalify@2.0.1:
resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
@@ -6532,12 +6963,6 @@ packages:
unzipper@0.10.14:
resolution: {integrity: sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==}
- update-browserslist-db@1.1.0:
- resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==}
- hasBin: true
- peerDependencies:
- browserslist: '>= 4.21.0'
-
update-browserslist-db@1.1.1:
resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==}
hasBin: true
@@ -6555,6 +6980,11 @@ packages:
peerDependencies:
react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ use-sync-external-store@1.4.0:
+ resolution: {integrity: sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+
util-deprecate@1.0.2:
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
@@ -6569,6 +6999,10 @@ packages:
resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==}
hasBin: true
+ uuid@11.0.3:
+ resolution: {integrity: sha512-d0z310fCWv5dJwnX1Y/MncBAqGMKEzlBb1AOf7z9K8ALnd0utBX/msg/fA0+sbyN1ihbMsLhrBlnl1ak7Wa0rg==}
+ hasBin: true
+
uuid@8.3.2:
resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==}
hasBin: true
@@ -6577,6 +7011,11 @@ packages:
resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==}
hasBin: true
+ uvu@0.5.6:
+ resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==}
+ engines: {node: '>=8'}
+ hasBin: true
+
uzip@0.20201231.0:
resolution: {integrity: sha512-OZeJfZP+R0z9D6TmBgLq2LHzSSptGMGDGigGiEe0pr8UBe/7fdflgHlHBNDASTXB5jnFuxHpNaJywSg8YFeGng==}
@@ -6591,38 +7030,10 @@ packages:
resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
engines: {node: '>= 0.8'}
- vite-plugin-svgr@4.2.0:
- resolution: {integrity: sha512-SC7+FfVtNQk7So0XMjrrtLAbEC8qjFPifyD7+fs/E6aaNdVde6umlVVh0QuwDLdOMu7vp5RiGFsB70nj5yo0XA==}
+ vite-plugin-svgr@4.3.0:
+ resolution: {integrity: sha512-Jy9qLB2/PyWklpYy0xk0UU3TlU0t2UMpJXZvf+hWII1lAmRHrOUKi11Uw8N3rxoNk7atZNYO3pR3vI1f7oi+6w==}
peerDependencies:
- vite: ^2.6.0 || 3 || 4 || 5
-
- vite@5.3.5:
- resolution: {integrity: sha512-MdjglKR6AQXQb9JGiS7Rc2wC6uMjcm7Go/NHNO63EwiJXfuk9PgqiP/n5IDJCziMkfw9n4Ubp7lttNwz+8ZVKA==}
- engines: {node: ^18.0.0 || >=20.0.0}
- hasBin: true
- peerDependencies:
- '@types/node': ^18.0.0 || >=20.0.0
- less: '*'
- lightningcss: ^1.21.0
- sass: '*'
- stylus: '*'
- sugarss: '*'
- terser: ^5.4.0
- peerDependenciesMeta:
- '@types/node':
- optional: true
- less:
- optional: true
- lightningcss:
- optional: true
- sass:
- optional: true
- stylus:
- optional: true
- sugarss:
- optional: true
- terser:
- optional: true
+ vite: '>=2.6.0'
vite@5.4.11:
resolution: {integrity: sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==}
@@ -6658,8 +7069,8 @@ packages:
walker@1.0.8:
resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==}
- watchpack@2.4.1:
- resolution: {integrity: sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==}
+ watchpack@2.4.2:
+ resolution: {integrity: sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==}
engines: {node: '>=10.13.0'}
wcwidth@1.0.1:
@@ -6682,8 +7093,8 @@ packages:
resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==}
engines: {node: '>=10.13.0'}
- webpack@5.92.1:
- resolution: {integrity: sha512-JECQ7IwJb+7fgUFBlrJzbyu3GEuNBcdqr1LD7IbSzwkSmIevTm8PF+wej3Oxuz/JFBUZ6O1o43zsPkwm1C4TmA==}
+ webpack@5.97.1:
+ resolution: {integrity: sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==}
engines: {node: '>=10.13.0'}
hasBin: true
peerDependencies:
@@ -6701,8 +7112,8 @@ packages:
which-module@2.0.1:
resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==}
- which-typed-array@1.1.15:
- resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==}
+ which-typed-array@1.1.18:
+ resolution: {integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==}
engines: {node: '>= 0.4'}
which@1.3.1:
@@ -6741,6 +7152,18 @@ packages:
resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==}
engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
+ ws@7.5.10:
+ resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==}
+ engines: {node: '>=8.3.0'}
+ peerDependencies:
+ bufferutil: ^4.0.1
+ utf-8-validate: ^5.0.2
+ peerDependenciesMeta:
+ bufferutil:
+ optional: true
+ utf-8-validate:
+ optional: true
+
ws@8.17.1:
resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==}
engines: {node: '>=10.0.0'}
@@ -6765,8 +7188,12 @@ packages:
utf-8-validate:
optional: true
- xml2js@0.5.0:
- resolution: {integrity: sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==}
+ xml-js@1.6.11:
+ resolution: {integrity: sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==}
+ hasBin: true
+
+ xml2js@0.6.2:
+ resolution: {integrity: sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==}
engines: {node: '>=4.0.0'}
xmlbuilder@11.0.1:
@@ -6785,6 +7212,19 @@ packages:
peerDependencies:
yjs: ^13.0.0
+ y-protocols@1.0.6:
+ resolution: {integrity: sha512-vHRF2L6iT3rwj1jub/K5tYcTT/mEYDUppgNPXwp8fmLpui9f7Yeq3OEtTLVF012j39QnV+KEQpNqoN7CWU7Y9Q==}
+ engines: {node: '>=16.0.0', npm: '>=8.0.0'}
+ peerDependencies:
+ yjs: ^13.0.0
+
+ y-webrtc@10.3.0:
+ resolution: {integrity: sha512-KalJr7dCgUgyVFxoG3CQYbpS0O2qybegD0vI4bYnYHI0MOwoVbucED3RZ5f2o1a5HZb1qEssUKS0H/Upc6p1lA==}
+ engines: {node: '>=12'}
+ hasBin: true
+ peerDependencies:
+ yjs: ^13.6.8
+
y18n@4.0.3:
resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==}
@@ -6798,8 +7238,8 @@ packages:
yallist@4.0.0:
resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
- yaml@2.4.5:
- resolution: {integrity: sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==}
+ yaml@2.7.0:
+ resolution: {integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==}
engines: {node: '>= 14'}
hasBin: true
@@ -6833,25 +7273,58 @@ packages:
resolution: {integrity: sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==}
engines: {node: '>= 10'}
- zod@3.23.8:
- resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==}
+ zod@3.24.1:
+ resolution: {integrity: sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==}
+
+ zustand@4.5.6:
+ resolution: {integrity: sha512-ibr/n1hBzLLj5Y+yUcU7dYw8p6WnIVzdJbnX+1YpaScvZVF2ziugqHs+LAmHw4lWO9c/zRj+K1ncgWDQuthEdQ==}
+ engines: {node: '>=12.7.0'}
+ peerDependencies:
+ '@types/react': '>=16.8'
+ immer: '>=9.0.6'
+ react: '>=16.8'
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ immer:
+ optional: true
+ react:
+ optional: true
+
+ zustand@5.0.3:
+ resolution: {integrity: sha512-14fwWQtU3pH4dE0dOpdMiWjddcH+QzKIgk1cl8epwSE7yag43k/AD/m4L6+K7DytAOr9gGBe3/EXj9g7cdostg==}
+ engines: {node: '>=12.20.0'}
+ peerDependencies:
+ '@types/react': '>=18.0.0'
+ immer: '>=9.0.6'
+ react: '>=18.0.0'
+ use-sync-external-store: '>=1.2.0'
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ immer:
+ optional: true
+ react:
+ optional: true
+ use-sync-external-store:
+ optional: true
snapshots:
'@ag-grid-community/client-side-row-model@32.3.3':
dependencies:
'@ag-grid-community/core': 32.3.3
- tslib: 2.6.3
+ tslib: 2.8.1
'@ag-grid-community/core@32.3.3':
dependencies:
ag-charts-types: 10.3.3
- tslib: 2.6.3
+ tslib: 2.8.1
'@ag-grid-community/csv-export@32.3.3':
dependencies:
'@ag-grid-community/core': 32.3.3
- tslib: 2.6.3
+ tslib: 2.8.1
'@ag-grid-community/react@32.3.3(@ag-grid-community/core@32.3.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
dependencies:
@@ -6923,16 +7396,16 @@ snapshots:
dependencies:
'@ag-grid-community/core': 32.3.3
'@ag-grid-enterprise/core': 32.3.3
- tslib: 2.6.3
+ tslib: 2.8.1
'@alloc/quick-lru@5.2.0': {}
'@ampproject/remapping@2.3.0':
dependencies:
- '@jridgewell/gen-mapping': 0.3.5
+ '@jridgewell/gen-mapping': 0.3.8
'@jridgewell/trace-mapping': 0.3.25
- '@angular-devkit/core@17.3.8(chokidar@3.6.0)':
+ '@angular-devkit/core@17.3.11(chokidar@3.6.0)':
dependencies:
ajv: 8.12.0
ajv-formats: 2.1.1(ajv@8.12.0)
@@ -6943,10 +7416,10 @@ snapshots:
optionalDependencies:
chokidar: 3.6.0
- '@angular-devkit/schematics-cli@17.3.8(chokidar@3.6.0)':
+ '@angular-devkit/schematics-cli@17.3.11(chokidar@3.6.0)':
dependencies:
- '@angular-devkit/core': 17.3.8(chokidar@3.6.0)
- '@angular-devkit/schematics': 17.3.8(chokidar@3.6.0)
+ '@angular-devkit/core': 17.3.11(chokidar@3.6.0)
+ '@angular-devkit/schematics': 17.3.11(chokidar@3.6.0)
ansi-colors: 4.1.3
inquirer: 9.2.15
symbol-observable: 4.0.0
@@ -6954,9 +7427,9 @@ snapshots:
transitivePeerDependencies:
- chokidar
- '@angular-devkit/schematics@17.3.8(chokidar@3.6.0)':
+ '@angular-devkit/schematics@17.3.11(chokidar@3.6.0)':
dependencies:
- '@angular-devkit/core': 17.3.8(chokidar@3.6.0)
+ '@angular-devkit/core': 17.3.11(chokidar@3.6.0)
jsonc-parser: 3.2.1
magic-string: 0.30.8
ora: 5.4.1
@@ -6964,49 +7437,49 @@ snapshots:
transitivePeerDependencies:
- chokidar
- '@ant-design/colors@7.1.0':
+ '@ant-design/colors@7.2.0':
dependencies:
- '@ctrl/tinycolor': 3.6.1
+ '@ant-design/fast-color': 2.0.6
- '@ant-design/cssinjs-utils@1.0.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
+ '@ant-design/cssinjs-utils@1.1.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
dependencies:
- '@ant-design/cssinjs': 1.21.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- '@babel/runtime': 7.25.0
- rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ '@ant-design/cssinjs': 1.22.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ '@babel/runtime': 7.26.0
+ rc-util: 5.44.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
- '@ant-design/cssinjs@1.21.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
+ '@ant-design/cssinjs@1.22.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
dependencies:
- '@babel/runtime': 7.25.0
+ '@babel/runtime': 7.26.0
'@emotion/hash': 0.8.0
'@emotion/unitless': 0.7.5
classnames: 2.5.1
csstype: 3.1.3
- rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-util: 5.44.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
stylis: 4.3.4
'@ant-design/fast-color@2.0.6':
dependencies:
- '@babel/runtime': 7.25.0
+ '@babel/runtime': 7.26.0
'@ant-design/icons-svg@4.4.2': {}
- '@ant-design/icons@5.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
+ '@ant-design/icons@5.5.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
dependencies:
- '@ant-design/colors': 7.1.0
+ '@ant-design/colors': 7.2.0
'@ant-design/icons-svg': 4.4.2
- '@babel/runtime': 7.25.0
+ '@babel/runtime': 7.26.0
classnames: 2.5.1
- rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-util: 5.44.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
'@ant-design/react-slick@1.1.2(react@18.2.0)':
dependencies:
- '@babel/runtime': 7.25.0
+ '@babel/runtime': 7.26.0
classnames: 2.5.1
json2mq: 0.2.0
react: 18.2.0
@@ -7017,13 +7490,13 @@ snapshots:
dependencies:
'@aws-crypto/util': 5.2.0
'@aws-sdk/types': 3.723.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@aws-crypto/crc32c@5.2.0':
dependencies:
'@aws-crypto/util': 5.2.0
'@aws-sdk/types': 3.723.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@aws-crypto/sha1-browser@5.2.0':
dependencies:
@@ -7032,7 +7505,7 @@ snapshots:
'@aws-sdk/types': 3.723.0
'@aws-sdk/util-locate-window': 3.723.0
'@smithy/util-utf8': 2.3.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@aws-crypto/sha256-browser@5.2.0':
dependencies:
@@ -7042,23 +7515,23 @@ snapshots:
'@aws-sdk/types': 3.723.0
'@aws-sdk/util-locate-window': 3.723.0
'@smithy/util-utf8': 2.3.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@aws-crypto/sha256-js@5.2.0':
dependencies:
'@aws-crypto/util': 5.2.0
'@aws-sdk/types': 3.723.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@aws-crypto/supports-web-crypto@5.2.0':
dependencies:
- tslib: 2.6.3
+ tslib: 2.8.1
'@aws-crypto/util@5.2.0':
dependencies:
'@aws-sdk/types': 3.723.0
'@smithy/util-utf8': 2.3.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@aws-sdk/client-s3@3.723.0':
dependencies:
@@ -7119,7 +7592,7 @@ snapshots:
'@smithy/util-stream': 4.0.0
'@smithy/util-utf8': 4.0.0
'@smithy/util-waiter': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
transitivePeerDependencies:
- aws-crt
@@ -7164,7 +7637,7 @@ snapshots:
'@smithy/util-middleware': 4.0.0
'@smithy/util-retry': 4.0.0
'@smithy/util-utf8': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
transitivePeerDependencies:
- aws-crt
@@ -7207,7 +7680,7 @@ snapshots:
'@smithy/util-middleware': 4.0.0
'@smithy/util-retry': 4.0.0
'@smithy/util-utf8': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
transitivePeerDependencies:
- aws-crt
@@ -7252,7 +7725,7 @@ snapshots:
'@smithy/util-middleware': 4.0.0
'@smithy/util-retry': 4.0.0
'@smithy/util-utf8': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
transitivePeerDependencies:
- aws-crt
@@ -7268,7 +7741,7 @@ snapshots:
'@smithy/types': 4.0.0
'@smithy/util-middleware': 4.0.0
fast-xml-parser: 4.4.1
- tslib: 2.6.3
+ tslib: 2.8.1
'@aws-sdk/credential-provider-env@3.723.0':
dependencies:
@@ -7276,7 +7749,7 @@ snapshots:
'@aws-sdk/types': 3.723.0
'@smithy/property-provider': 4.0.0
'@smithy/types': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@aws-sdk/credential-provider-http@3.723.0':
dependencies:
@@ -7289,7 +7762,7 @@ snapshots:
'@smithy/smithy-client': 4.0.0
'@smithy/types': 4.0.0
'@smithy/util-stream': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@aws-sdk/credential-provider-ini@3.723.0(@aws-sdk/client-sso-oidc@3.723.0(@aws-sdk/client-sts@3.723.0))(@aws-sdk/client-sts@3.723.0)':
dependencies:
@@ -7305,7 +7778,7 @@ snapshots:
'@smithy/property-provider': 4.0.0
'@smithy/shared-ini-file-loader': 4.0.0
'@smithy/types': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
transitivePeerDependencies:
- '@aws-sdk/client-sso-oidc'
- aws-crt
@@ -7323,7 +7796,7 @@ snapshots:
'@smithy/property-provider': 4.0.0
'@smithy/shared-ini-file-loader': 4.0.0
'@smithy/types': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
transitivePeerDependencies:
- '@aws-sdk/client-sso-oidc'
- '@aws-sdk/client-sts'
@@ -7336,7 +7809,7 @@ snapshots:
'@smithy/property-provider': 4.0.0
'@smithy/shared-ini-file-loader': 4.0.0
'@smithy/types': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@aws-sdk/credential-provider-sso@3.723.0(@aws-sdk/client-sso-oidc@3.723.0(@aws-sdk/client-sts@3.723.0))':
dependencies:
@@ -7347,7 +7820,7 @@ snapshots:
'@smithy/property-provider': 4.0.0
'@smithy/shared-ini-file-loader': 4.0.0
'@smithy/types': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
transitivePeerDependencies:
- '@aws-sdk/client-sso-oidc'
- aws-crt
@@ -7359,7 +7832,7 @@ snapshots:
'@aws-sdk/types': 3.723.0
'@smithy/property-provider': 4.0.0
'@smithy/types': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@aws-sdk/middleware-bucket-endpoint@3.723.0':
dependencies:
@@ -7369,14 +7842,14 @@ snapshots:
'@smithy/protocol-http': 5.0.0
'@smithy/types': 4.0.0
'@smithy/util-config-provider': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@aws-sdk/middleware-expect-continue@3.723.0':
dependencies:
'@aws-sdk/types': 3.723.0
'@smithy/protocol-http': 5.0.0
'@smithy/types': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@aws-sdk/middleware-flexible-checksums@3.723.0':
dependencies:
@@ -7392,33 +7865,33 @@ snapshots:
'@smithy/util-middleware': 4.0.0
'@smithy/util-stream': 4.0.0
'@smithy/util-utf8': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@aws-sdk/middleware-host-header@3.723.0':
dependencies:
'@aws-sdk/types': 3.723.0
'@smithy/protocol-http': 5.0.0
'@smithy/types': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@aws-sdk/middleware-location-constraint@3.723.0':
dependencies:
'@aws-sdk/types': 3.723.0
'@smithy/types': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@aws-sdk/middleware-logger@3.723.0':
dependencies:
'@aws-sdk/types': 3.723.0
'@smithy/types': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@aws-sdk/middleware-recursion-detection@3.723.0':
dependencies:
'@aws-sdk/types': 3.723.0
'@smithy/protocol-http': 5.0.0
'@smithy/types': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@aws-sdk/middleware-sdk-s3@3.723.0':
dependencies:
@@ -7435,13 +7908,13 @@ snapshots:
'@smithy/util-middleware': 4.0.0
'@smithy/util-stream': 4.0.0
'@smithy/util-utf8': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@aws-sdk/middleware-ssec@3.723.0':
dependencies:
'@aws-sdk/types': 3.723.0
'@smithy/types': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@aws-sdk/middleware-user-agent@3.723.0':
dependencies:
@@ -7451,7 +7924,7 @@ snapshots:
'@smithy/core': 3.0.0
'@smithy/protocol-http': 5.0.0
'@smithy/types': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@aws-sdk/region-config-resolver@3.723.0':
dependencies:
@@ -7460,7 +7933,7 @@ snapshots:
'@smithy/types': 4.0.0
'@smithy/util-config-provider': 4.0.0
'@smithy/util-middleware': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@aws-sdk/signature-v4-multi-region@3.723.0':
dependencies:
@@ -7469,7 +7942,7 @@ snapshots:
'@smithy/protocol-http': 5.0.0
'@smithy/signature-v4': 5.0.0
'@smithy/types': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@aws-sdk/token-providers@3.723.0(@aws-sdk/client-sso-oidc@3.723.0(@aws-sdk/client-sts@3.723.0))':
dependencies:
@@ -7478,34 +7951,34 @@ snapshots:
'@smithy/property-provider': 4.0.0
'@smithy/shared-ini-file-loader': 4.0.0
'@smithy/types': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@aws-sdk/types@3.723.0':
dependencies:
'@smithy/types': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@aws-sdk/util-arn-parser@3.723.0':
dependencies:
- tslib: 2.6.3
+ tslib: 2.8.1
'@aws-sdk/util-endpoints@3.723.0':
dependencies:
'@aws-sdk/types': 3.723.0
'@smithy/types': 4.0.0
'@smithy/util-endpoints': 3.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@aws-sdk/util-locate-window@3.723.0':
dependencies:
- tslib: 2.6.3
+ tslib: 2.8.1
'@aws-sdk/util-user-agent-browser@3.723.0':
dependencies:
'@aws-sdk/types': 3.723.0
'@smithy/types': 4.0.0
bowser: 2.11.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@aws-sdk/util-user-agent-node@3.723.0':
dependencies:
@@ -7513,32 +7986,33 @@ snapshots:
'@aws-sdk/types': 3.723.0
'@smithy/node-config-provider': 4.0.0
'@smithy/types': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@aws-sdk/xml-builder@3.723.0':
dependencies:
'@smithy/types': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
- '@babel/code-frame@7.24.7':
+ '@babel/code-frame@7.26.2':
dependencies:
- '@babel/highlight': 7.24.7
- picocolors: 1.0.1
+ '@babel/helper-validator-identifier': 7.25.9
+ js-tokens: 4.0.0
+ picocolors: 1.1.1
- '@babel/compat-data@7.24.7': {}
+ '@babel/compat-data@7.26.3': {}
- '@babel/core@7.24.7':
+ '@babel/core@7.26.0':
dependencies:
'@ampproject/remapping': 2.3.0
- '@babel/code-frame': 7.24.7
- '@babel/generator': 7.24.7
- '@babel/helper-compilation-targets': 7.24.7
- '@babel/helper-module-transforms': 7.24.7(@babel/core@7.24.7)
- '@babel/helpers': 7.24.7
- '@babel/parser': 7.24.7
- '@babel/template': 7.24.7
- '@babel/traverse': 7.24.7
- '@babel/types': 7.24.7
+ '@babel/code-frame': 7.26.2
+ '@babel/generator': 7.26.3
+ '@babel/helper-compilation-targets': 7.25.9
+ '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0)
+ '@babel/helpers': 7.26.0
+ '@babel/parser': 7.26.3
+ '@babel/template': 7.25.9
+ '@babel/traverse': 7.26.4
+ '@babel/types': 7.26.3
convert-source-map: 2.0.0
debug: 4.4.0
gensync: 1.0.0-beta.2
@@ -7547,197 +8021,176 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@babel/generator@7.24.7':
+ '@babel/generator@7.26.3':
dependencies:
- '@babel/types': 7.24.7
- '@jridgewell/gen-mapping': 0.3.5
+ '@babel/parser': 7.26.3
+ '@babel/types': 7.26.3
+ '@jridgewell/gen-mapping': 0.3.8
'@jridgewell/trace-mapping': 0.3.25
- jsesc: 2.5.2
+ jsesc: 3.1.0
- '@babel/helper-compilation-targets@7.24.7':
+ '@babel/helper-compilation-targets@7.25.9':
dependencies:
- '@babel/compat-data': 7.24.7
- '@babel/helper-validator-option': 7.24.7
- browserslist: 4.23.2
+ '@babel/compat-data': 7.26.3
+ '@babel/helper-validator-option': 7.25.9
+ browserslist: 4.24.3
lru-cache: 5.1.1
semver: 6.3.1
- '@babel/helper-environment-visitor@7.24.7':
+ '@babel/helper-module-imports@7.25.9':
dependencies:
- '@babel/types': 7.24.7
-
- '@babel/helper-function-name@7.24.7':
- dependencies:
- '@babel/template': 7.24.7
- '@babel/types': 7.24.7
-
- '@babel/helper-hoist-variables@7.24.7':
- dependencies:
- '@babel/types': 7.24.7
-
- '@babel/helper-module-imports@7.24.7':
- dependencies:
- '@babel/traverse': 7.24.7
- '@babel/types': 7.24.7
+ '@babel/traverse': 7.26.4
+ '@babel/types': 7.26.3
transitivePeerDependencies:
- supports-color
- '@babel/helper-module-transforms@7.24.7(@babel/core@7.24.7)':
+ '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-environment-visitor': 7.24.7
- '@babel/helper-module-imports': 7.24.7
- '@babel/helper-simple-access': 7.24.7
- '@babel/helper-split-export-declaration': 7.24.7
- '@babel/helper-validator-identifier': 7.24.7
+ '@babel/core': 7.26.0
+ '@babel/helper-module-imports': 7.25.9
+ '@babel/helper-validator-identifier': 7.25.9
+ '@babel/traverse': 7.26.4
transitivePeerDependencies:
- supports-color
- '@babel/helper-plugin-utils@7.24.7': {}
+ '@babel/helper-plugin-utils@7.25.9': {}
- '@babel/helper-simple-access@7.24.7':
+ '@babel/helper-string-parser@7.25.9': {}
+
+ '@babel/helper-validator-identifier@7.25.9': {}
+
+ '@babel/helper-validator-option@7.25.9': {}
+
+ '@babel/helpers@7.26.0':
dependencies:
- '@babel/traverse': 7.24.7
- '@babel/types': 7.24.7
- transitivePeerDependencies:
- - supports-color
+ '@babel/template': 7.25.9
+ '@babel/types': 7.26.3
- '@babel/helper-split-export-declaration@7.24.7':
+ '@babel/parser@7.26.3':
dependencies:
- '@babel/types': 7.24.7
+ '@babel/types': 7.26.3
- '@babel/helper-string-parser@7.24.7': {}
-
- '@babel/helper-validator-identifier@7.24.7': {}
-
- '@babel/helper-validator-option@7.24.7': {}
-
- '@babel/helpers@7.24.7':
+ '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.26.0)':
dependencies:
- '@babel/template': 7.24.7
- '@babel/types': 7.24.7
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
- '@babel/highlight@7.24.7':
+ '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.26.0)':
dependencies:
- '@babel/helper-validator-identifier': 7.24.7
- chalk: 2.4.2
- js-tokens: 4.0.0
- picocolors: 1.0.1
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
- '@babel/parser@7.24.7':
+ '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.26.0)':
dependencies:
- '@babel/types': 7.24.7
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
- '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.7)':
+ '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
- '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.24.7)':
+ '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
- '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.7)':
+ '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
- '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.7)':
+ '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
- '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.7)':
+ '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
- '@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.24.7)':
+ '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
- '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.7)':
+ '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
- '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.7)':
+ '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
- '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.7)':
+ '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
- '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.7)':
+ '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
- '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.7)':
+ '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
- '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.7)':
+ '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
- '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.7)':
+ '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
- '@babel/plugin-syntax-typescript@7.24.7(@babel/core@7.24.7)':
+ '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
- '@babel/plugin-transform-react-jsx-self@7.24.7(@babel/core@7.24.7)':
+ '@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
- '@babel/plugin-transform-react-jsx-source@7.24.7(@babel/core@7.24.7)':
+ '@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
- '@babel/runtime@7.25.0':
+ '@babel/runtime@7.26.0':
dependencies:
regenerator-runtime: 0.14.1
- '@babel/template@7.24.7':
+ '@babel/template@7.25.9':
dependencies:
- '@babel/code-frame': 7.24.7
- '@babel/parser': 7.24.7
- '@babel/types': 7.24.7
+ '@babel/code-frame': 7.26.2
+ '@babel/parser': 7.26.3
+ '@babel/types': 7.26.3
- '@babel/traverse@7.24.7':
+ '@babel/traverse@7.26.4':
dependencies:
- '@babel/code-frame': 7.24.7
- '@babel/generator': 7.24.7
- '@babel/helper-environment-visitor': 7.24.7
- '@babel/helper-function-name': 7.24.7
- '@babel/helper-hoist-variables': 7.24.7
- '@babel/helper-split-export-declaration': 7.24.7
- '@babel/parser': 7.24.7
- '@babel/types': 7.24.7
+ '@babel/code-frame': 7.26.2
+ '@babel/generator': 7.26.3
+ '@babel/parser': 7.26.3
+ '@babel/template': 7.25.9
+ '@babel/types': 7.26.3
debug: 4.4.0
globals: 11.12.0
transitivePeerDependencies:
- supports-color
- '@babel/types@7.24.7':
+ '@babel/types@7.26.3':
dependencies:
- '@babel/helper-string-parser': 7.24.7
- '@babel/helper-validator-identifier': 7.24.7
- to-fast-properties: 2.0.0
+ '@babel/helper-string-parser': 7.25.9
+ '@babel/helper-validator-identifier': 7.25.9
'@bcoe/v8-coverage@0.2.3': {}
@@ -7748,11 +8201,40 @@ snapshots:
dependencies:
'@jridgewell/trace-mapping': 0.3.9
- '@ctrl/tinycolor@3.6.1': {}
+ '@dagrejs/dagre@1.1.4':
+ dependencies:
+ '@dagrejs/graphlib': 2.2.4
+
+ '@dagrejs/graphlib@2.2.4': {}
+
+ '@dnd-kit/accessibility@3.1.1(react@18.2.0)':
+ dependencies:
+ react: 18.2.0
+ tslib: 2.8.1
+
+ '@dnd-kit/core@6.3.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
+ dependencies:
+ '@dnd-kit/accessibility': 3.1.1(react@18.2.0)
+ '@dnd-kit/utilities': 3.2.2(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ tslib: 2.8.1
+
+ '@dnd-kit/sortable@10.0.0(@dnd-kit/core@6.3.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0)':
+ dependencies:
+ '@dnd-kit/core': 6.3.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ '@dnd-kit/utilities': 3.2.2(react@18.2.0)
+ react: 18.2.0
+ tslib: 2.8.1
+
+ '@dnd-kit/utilities@3.2.2(react@18.2.0)':
+ dependencies:
+ react: 18.2.0
+ tslib: 2.8.1
'@emnapi/runtime@1.3.1':
dependencies:
- tslib: 2.6.3
+ tslib: 2.8.1
optional: true
'@emotion/hash@0.8.0': {}
@@ -7903,18 +8385,16 @@ snapshots:
'@esbuild/win32-x64@0.24.2':
optional: true
- '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)':
+ '@eslint-community/eslint-utils@4.4.1(eslint@8.57.1)':
dependencies:
- eslint: 8.57.0
+ eslint: 8.57.1
eslint-visitor-keys: 3.4.3
- '@eslint-community/eslint-utils@4.4.0(eslint@9.17.0(jiti@1.21.6))':
+ '@eslint-community/eslint-utils@4.4.1(eslint@9.17.0(jiti@1.21.7))':
dependencies:
- eslint: 9.17.0(jiti@1.21.6)
+ eslint: 9.17.0(jiti@1.21.7)
eslint-visitor-keys: 3.4.3
- '@eslint-community/regexpp@4.11.0': {}
-
'@eslint-community/regexpp@4.12.1': {}
'@eslint/config-array@0.19.1':
@@ -7935,7 +8415,7 @@ snapshots:
debug: 4.4.0
espree: 9.6.1
globals: 13.24.0
- ignore: 5.3.1
+ ignore: 5.3.2
import-fresh: 3.3.0
js-yaml: 4.1.0
minimatch: 3.1.2
@@ -7949,7 +8429,7 @@ snapshots:
debug: 4.4.0
espree: 10.3.0
globals: 14.0.0
- ignore: 5.3.1
+ ignore: 5.3.2
import-fresh: 3.3.0
js-yaml: 4.1.0
minimatch: 3.1.2
@@ -7957,7 +8437,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@eslint/js@8.57.0': {}
+ '@eslint/js@8.57.1': {}
'@eslint/js@9.17.0': {}
@@ -7986,36 +8466,36 @@ snapshots:
lodash.isundefined: 3.0.1
lodash.uniq: 4.5.0
- '@floating-ui/core@1.6.8':
+ '@floating-ui/core@1.6.9':
dependencies:
- '@floating-ui/utils': 0.2.8
+ '@floating-ui/utils': 0.2.9
- '@floating-ui/dom@1.6.12':
+ '@floating-ui/dom@1.6.13':
dependencies:
- '@floating-ui/core': 1.6.8
- '@floating-ui/utils': 0.2.8
+ '@floating-ui/core': 1.6.9
+ '@floating-ui/utils': 0.2.9
'@floating-ui/react-dom@2.1.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
dependencies:
- '@floating-ui/dom': 1.6.12
+ '@floating-ui/dom': 1.6.13
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
'@floating-ui/react@0.26.28(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
dependencies:
'@floating-ui/react-dom': 2.1.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- '@floating-ui/utils': 0.2.8
+ '@floating-ui/utils': 0.2.9
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
tabbable: 6.2.0
- '@floating-ui/utils@0.2.8': {}
+ '@floating-ui/utils@0.2.9': {}
'@heroicons/react@2.2.0(react@18.2.0)':
dependencies:
react: 18.2.0
- '@hookform/resolvers@3.9.1(react-hook-form@7.54.2(react@18.2.0))':
+ '@hookform/resolvers@3.10.0(react-hook-form@7.54.2(react@18.2.0))':
dependencies:
react-hook-form: 7.54.2(react@18.2.0)
@@ -8026,7 +8506,7 @@ snapshots:
'@humanfs/core': 0.19.1
'@humanwhocodes/retry': 0.3.1
- '@humanwhocodes/config-array@0.11.14':
+ '@humanwhocodes/config-array@0.13.0':
dependencies:
'@humanwhocodes/object-schema': 2.0.3
debug: 4.4.0
@@ -8141,27 +8621,27 @@ snapshots:
'@jest/console@29.7.0':
dependencies:
'@jest/types': 29.6.3
- '@types/node': 20.14.10
+ '@types/node': 20.17.12
chalk: 4.1.2
jest-message-util: 29.7.0
jest-util: 29.7.0
slash: 3.0.0
- '@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.6.13)(@types/node@20.14.10)(typescript@5.7.2))':
+ '@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.10.6)(@types/node@20.17.12)(typescript@5.7.2))':
dependencies:
'@jest/console': 29.7.0
'@jest/reporters': 29.7.0
'@jest/test-result': 29.7.0
'@jest/transform': 29.7.0
'@jest/types': 29.6.3
- '@types/node': 20.14.10
+ '@types/node': 20.17.12
ansi-escapes: 4.3.2
chalk: 4.1.2
ci-info: 3.9.0
exit: 0.1.2
graceful-fs: 4.2.11
jest-changed-files: 29.7.0
- jest-config: 29.7.0(@types/node@20.14.10)(ts-node@10.9.2(@swc/core@1.6.13)(@types/node@20.14.10)(typescript@5.7.2))
+ jest-config: 29.7.0(@types/node@20.17.12)(ts-node@10.9.2(@swc/core@1.10.6)(@types/node@20.17.12)(typescript@5.7.2))
jest-haste-map: 29.7.0
jest-message-util: 29.7.0
jest-regex-util: 29.6.3
@@ -8173,7 +8653,7 @@ snapshots:
jest-util: 29.7.0
jest-validate: 29.7.0
jest-watcher: 29.7.0
- micromatch: 4.0.7
+ micromatch: 4.0.8
pretty-format: 29.7.0
slash: 3.0.0
strip-ansi: 6.0.1
@@ -8186,7 +8666,7 @@ snapshots:
dependencies:
'@jest/fake-timers': 29.7.0
'@jest/types': 29.6.3
- '@types/node': 20.14.10
+ '@types/node': 20.17.12
jest-mock: 29.7.0
'@jest/expect-utils@29.7.0':
@@ -8204,7 +8684,7 @@ snapshots:
dependencies:
'@jest/types': 29.6.3
'@sinonjs/fake-timers': 10.3.0
- '@types/node': 20.14.10
+ '@types/node': 20.17.12
jest-message-util: 29.7.0
jest-mock: 29.7.0
jest-util: 29.7.0
@@ -8226,7 +8706,7 @@ snapshots:
'@jest/transform': 29.7.0
'@jest/types': 29.6.3
'@jridgewell/trace-mapping': 0.3.25
- '@types/node': 20.14.10
+ '@types/node': 20.17.12
chalk: 4.1.2
collect-v8-coverage: 1.0.2
exit: 0.1.2
@@ -8273,7 +8753,7 @@ snapshots:
'@jest/transform@29.7.0':
dependencies:
- '@babel/core': 7.24.7
+ '@babel/core': 7.26.0
'@jest/types': 29.6.3
'@jridgewell/trace-mapping': 0.3.25
babel-plugin-istanbul: 6.1.1
@@ -8284,7 +8764,7 @@ snapshots:
jest-haste-map: 29.7.0
jest-regex-util: 29.6.3
jest-util: 29.7.0
- micromatch: 4.0.7
+ micromatch: 4.0.8
pirates: 4.0.6
slash: 3.0.0
write-file-atomic: 4.0.2
@@ -8296,11 +8776,11 @@ snapshots:
'@jest/schemas': 29.6.3
'@types/istanbul-lib-coverage': 2.0.6
'@types/istanbul-reports': 3.0.4
- '@types/node': 20.14.10
- '@types/yargs': 17.0.32
+ '@types/node': 20.17.12
+ '@types/yargs': 17.0.33
chalk: 4.1.2
- '@jridgewell/gen-mapping@0.3.5':
+ '@jridgewell/gen-mapping@0.3.8':
dependencies:
'@jridgewell/set-array': 1.2.1
'@jridgewell/sourcemap-codec': 1.5.0
@@ -8312,7 +8792,7 @@ snapshots:
'@jridgewell/source-map@0.3.6':
dependencies:
- '@jridgewell/gen-mapping': 0.3.5
+ '@jridgewell/gen-mapping': 0.3.8
'@jridgewell/trace-mapping': 0.3.25
'@jridgewell/sourcemap-codec@1.5.0': {}
@@ -8329,7 +8809,7 @@ snapshots:
'@ljharb/through@2.3.13':
dependencies:
- call-bind: 1.0.7
+ call-bind: 1.0.8
'@lukeed/csprng@1.1.0': {}
@@ -8351,159 +8831,148 @@ snapshots:
'@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3':
optional: true
- '@nestjs/bull-shared@10.2.0(@nestjs/common@10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.10(@nestjs/common@10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.10)(@nestjs/websockets@10.3.10)(reflect-metadata@0.2.2)(rxjs@7.8.1))':
+ '@nestjs/bull-shared@10.2.3(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.15)(@nestjs/websockets@10.4.15)(reflect-metadata@0.2.2)(rxjs@7.8.1))':
dependencies:
- '@nestjs/common': 10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1)
- '@nestjs/core': 10.3.10(@nestjs/common@10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.10)(@nestjs/websockets@10.3.10)(reflect-metadata@0.2.2)(rxjs@7.8.1)
- tslib: 2.6.3
+ '@nestjs/common': 10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1)
+ '@nestjs/core': 10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.15)(@nestjs/websockets@10.4.15)(reflect-metadata@0.2.2)(rxjs@7.8.1)
+ tslib: 2.8.1
- '@nestjs/bullmq@10.2.0(@nestjs/common@10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.10(@nestjs/common@10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.10)(@nestjs/websockets@10.3.10)(reflect-metadata@0.2.2)(rxjs@7.8.1))(bullmq@5.12.0)':
+ '@nestjs/bullmq@10.2.3(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.15)(@nestjs/websockets@10.4.15)(reflect-metadata@0.2.2)(rxjs@7.8.1))(bullmq@5.34.8)':
dependencies:
- '@nestjs/bull-shared': 10.2.0(@nestjs/common@10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.10(@nestjs/common@10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.10)(@nestjs/websockets@10.3.10)(reflect-metadata@0.2.2)(rxjs@7.8.1))
- '@nestjs/common': 10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1)
- '@nestjs/core': 10.3.10(@nestjs/common@10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.10)(@nestjs/websockets@10.3.10)(reflect-metadata@0.2.2)(rxjs@7.8.1)
- bullmq: 5.12.0
- tslib: 2.6.3
+ '@nestjs/bull-shared': 10.2.3(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.15)(@nestjs/websockets@10.4.15)(reflect-metadata@0.2.2)(rxjs@7.8.1))
+ '@nestjs/common': 10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1)
+ '@nestjs/core': 10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.15)(@nestjs/websockets@10.4.15)(reflect-metadata@0.2.2)(rxjs@7.8.1)
+ bullmq: 5.34.8
+ tslib: 2.8.1
- '@nestjs/cli@10.4.2(@swc/core@1.6.13)':
+ '@nestjs/cli@10.4.9(@swc/core@1.10.6)':
dependencies:
- '@angular-devkit/core': 17.3.8(chokidar@3.6.0)
- '@angular-devkit/schematics': 17.3.8(chokidar@3.6.0)
- '@angular-devkit/schematics-cli': 17.3.8(chokidar@3.6.0)
- '@nestjs/schematics': 10.1.2(chokidar@3.6.0)(typescript@5.3.3)
+ '@angular-devkit/core': 17.3.11(chokidar@3.6.0)
+ '@angular-devkit/schematics': 17.3.11(chokidar@3.6.0)
+ '@angular-devkit/schematics-cli': 17.3.11(chokidar@3.6.0)
+ '@nestjs/schematics': 10.2.3(chokidar@3.6.0)(typescript@5.7.2)
chalk: 4.1.2
chokidar: 3.6.0
cli-table3: 0.6.5
commander: 4.1.1
- fork-ts-checker-webpack-plugin: 9.0.2(typescript@5.3.3)(webpack@5.92.1(@swc/core@1.6.13))
- glob: 10.4.2
+ fork-ts-checker-webpack-plugin: 9.0.2(typescript@5.7.2)(webpack@5.97.1(@swc/core@1.10.6))
+ glob: 10.4.5
inquirer: 8.2.6
node-emoji: 1.11.0
ora: 5.4.1
tree-kill: 1.2.2
tsconfig-paths: 4.2.0
- tsconfig-paths-webpack-plugin: 4.1.0
- typescript: 5.3.3
- webpack: 5.92.1(@swc/core@1.6.13)
+ tsconfig-paths-webpack-plugin: 4.2.0
+ typescript: 5.7.2
+ webpack: 5.97.1(@swc/core@1.10.6)
webpack-node-externals: 3.0.0
optionalDependencies:
- '@swc/core': 1.6.13
+ '@swc/core': 1.10.6(@swc/helpers@0.5.15)
transitivePeerDependencies:
- esbuild
- uglify-js
- webpack-cli
- '@nestjs/common@10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1)':
+ '@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1)':
dependencies:
iterare: 1.2.1
reflect-metadata: 0.2.2
rxjs: 7.8.1
- tslib: 2.6.3
+ tslib: 2.8.1
uid: 2.0.2
- '@nestjs/config@3.2.3(@nestjs/common@10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1))(rxjs@7.8.1)':
+ '@nestjs/config@3.3.0(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(rxjs@7.8.1)':
dependencies:
- '@nestjs/common': 10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1)
+ '@nestjs/common': 10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1)
dotenv: 16.4.5
dotenv-expand: 10.0.0
lodash: 4.17.21
rxjs: 7.8.1
- '@nestjs/core@10.3.10(@nestjs/common@10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.10)(@nestjs/websockets@10.3.10)(reflect-metadata@0.2.2)(rxjs@7.8.1)':
+ '@nestjs/core@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.15)(@nestjs/websockets@10.4.15)(reflect-metadata@0.2.2)(rxjs@7.8.1)':
dependencies:
- '@nestjs/common': 10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1)
+ '@nestjs/common': 10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1)
'@nuxtjs/opencollective': 0.3.2
fast-safe-stringify: 2.1.1
iterare: 1.2.1
- path-to-regexp: 3.2.0
+ path-to-regexp: 3.3.0
reflect-metadata: 0.2.2
rxjs: 7.8.1
- tslib: 2.6.3
+ tslib: 2.8.1
uid: 2.0.2
optionalDependencies:
- '@nestjs/platform-express': 10.3.10(@nestjs/common@10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.10)
- '@nestjs/websockets': 10.3.10(@nestjs/common@10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.10)(@nestjs/platform-socket.io@10.4.1)(reflect-metadata@0.2.2)(rxjs@7.8.1)
+ '@nestjs/platform-express': 10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15)
+ '@nestjs/websockets': 10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15)(@nestjs/platform-socket.io@10.4.15)(reflect-metadata@0.2.2)(rxjs@7.8.1)
transitivePeerDependencies:
- encoding
- '@nestjs/jwt@10.2.0(@nestjs/common@10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1))':
+ '@nestjs/jwt@10.2.0(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))':
dependencies:
- '@nestjs/common': 10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1)
+ '@nestjs/common': 10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1)
'@types/jsonwebtoken': 9.0.5
jsonwebtoken: 9.0.2
- '@nestjs/platform-express@10.3.10(@nestjs/common@10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.10)':
+ '@nestjs/platform-express@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15)':
dependencies:
- '@nestjs/common': 10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1)
- '@nestjs/core': 10.3.10(@nestjs/common@10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.10)(@nestjs/websockets@10.3.10)(reflect-metadata@0.2.2)(rxjs@7.8.1)
- body-parser: 1.20.2
+ '@nestjs/common': 10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1)
+ '@nestjs/core': 10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.15)(@nestjs/websockets@10.4.15)(reflect-metadata@0.2.2)(rxjs@7.8.1)
+ body-parser: 1.20.3
cors: 2.8.5
- express: 4.19.2
+ express: 4.21.2
multer: 1.4.4-lts.1
- tslib: 2.6.3
+ tslib: 2.8.1
transitivePeerDependencies:
- supports-color
- '@nestjs/platform-socket.io@10.4.1(@nestjs/common@10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/websockets@10.3.10)(rxjs@7.8.1)':
+ '@nestjs/platform-socket.io@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/websockets@10.4.15)(rxjs@7.8.1)':
dependencies:
- '@nestjs/common': 10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1)
- '@nestjs/websockets': 10.3.10(@nestjs/common@10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.10)(@nestjs/platform-socket.io@10.4.1)(reflect-metadata@0.2.2)(rxjs@7.8.1)
+ '@nestjs/common': 10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1)
+ '@nestjs/websockets': 10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15)(@nestjs/platform-socket.io@10.4.15)(reflect-metadata@0.2.2)(rxjs@7.8.1)
rxjs: 7.8.1
- socket.io: 4.7.5
- tslib: 2.6.3
+ socket.io: 4.8.1
+ tslib: 2.8.1
transitivePeerDependencies:
- bufferutil
- supports-color
- utf-8-validate
- '@nestjs/schedule@4.1.0(@nestjs/common@10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.10(@nestjs/common@10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.10)(@nestjs/websockets@10.3.10)(reflect-metadata@0.2.2)(rxjs@7.8.1))':
+ '@nestjs/schedule@4.1.2(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.15)(@nestjs/websockets@10.4.15)(reflect-metadata@0.2.2)(rxjs@7.8.1))':
dependencies:
- '@nestjs/common': 10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1)
- '@nestjs/core': 10.3.10(@nestjs/common@10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.10)(@nestjs/websockets@10.3.10)(reflect-metadata@0.2.2)(rxjs@7.8.1)
- cron: 3.1.7
- uuid: 10.0.0
+ '@nestjs/common': 10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1)
+ '@nestjs/core': 10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.15)(@nestjs/websockets@10.4.15)(reflect-metadata@0.2.2)(rxjs@7.8.1)
+ cron: 3.2.1
+ uuid: 11.0.3
- '@nestjs/schematics@10.1.2(chokidar@3.6.0)(typescript@5.3.3)':
+ '@nestjs/schematics@10.2.3(chokidar@3.6.0)(typescript@5.7.2)':
dependencies:
- '@angular-devkit/core': 17.3.8(chokidar@3.6.0)
- '@angular-devkit/schematics': 17.3.8(chokidar@3.6.0)
- comment-json: 4.2.3
- jsonc-parser: 3.3.1
- pluralize: 8.0.0
- typescript: 5.3.3
- transitivePeerDependencies:
- - chokidar
-
- '@nestjs/schematics@10.1.2(chokidar@3.6.0)(typescript@5.7.2)':
- dependencies:
- '@angular-devkit/core': 17.3.8(chokidar@3.6.0)
- '@angular-devkit/schematics': 17.3.8(chokidar@3.6.0)
- comment-json: 4.2.3
+ '@angular-devkit/core': 17.3.11(chokidar@3.6.0)
+ '@angular-devkit/schematics': 17.3.11(chokidar@3.6.0)
+ comment-json: 4.2.5
jsonc-parser: 3.3.1
pluralize: 8.0.0
typescript: 5.7.2
transitivePeerDependencies:
- chokidar
- '@nestjs/testing@10.3.10(@nestjs/common@10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.10(@nestjs/common@10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.10)(@nestjs/websockets@10.3.10)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.10(@nestjs/common@10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.10))':
+ '@nestjs/testing@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.15)(@nestjs/websockets@10.4.15)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15))':
dependencies:
- '@nestjs/common': 10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1)
- '@nestjs/core': 10.3.10(@nestjs/common@10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.10)(@nestjs/websockets@10.3.10)(reflect-metadata@0.2.2)(rxjs@7.8.1)
- tslib: 2.6.3
+ '@nestjs/common': 10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1)
+ '@nestjs/core': 10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.15)(@nestjs/websockets@10.4.15)(reflect-metadata@0.2.2)(rxjs@7.8.1)
+ tslib: 2.8.1
optionalDependencies:
- '@nestjs/platform-express': 10.3.10(@nestjs/common@10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.10)
+ '@nestjs/platform-express': 10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15)
- '@nestjs/websockets@10.3.10(@nestjs/common@10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.10)(@nestjs/platform-socket.io@10.4.1)(reflect-metadata@0.2.2)(rxjs@7.8.1)':
+ '@nestjs/websockets@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15)(@nestjs/platform-socket.io@10.4.15)(reflect-metadata@0.2.2)(rxjs@7.8.1)':
dependencies:
- '@nestjs/common': 10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1)
- '@nestjs/core': 10.3.10(@nestjs/common@10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.10)(@nestjs/websockets@10.3.10)(reflect-metadata@0.2.2)(rxjs@7.8.1)
+ '@nestjs/common': 10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1)
+ '@nestjs/core': 10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.15)(@nestjs/websockets@10.4.15)(reflect-metadata@0.2.2)(rxjs@7.8.1)
iterare: 1.2.1
object-hash: 3.0.0
reflect-metadata: 0.2.2
rxjs: 7.8.1
- tslib: 2.6.3
+ tslib: 2.8.1
optionalDependencies:
- '@nestjs/platform-socket.io': 10.4.1(@nestjs/common@10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/websockets@10.3.10)(rxjs@7.8.1)
+ '@nestjs/platform-socket.io': 10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/websockets@10.4.15)(rxjs@7.8.1)
'@nodelib/fs.scandir@2.1.5':
dependencies:
@@ -8515,7 +8984,7 @@ snapshots:
'@nodelib/fs.walk@1.2.8':
dependencies:
'@nodelib/fs.scandir': 2.1.5
- fastq: 1.17.1
+ fastq: 1.18.0
'@nuxtjs/opencollective@0.3.2':
dependencies:
@@ -8525,6 +8994,14 @@ snapshots:
transitivePeerDependencies:
- encoding
+ '@pdf-lib/standard-fonts@1.0.0':
+ dependencies:
+ pako: 1.0.11
+
+ '@pdf-lib/upng@1.0.1':
+ dependencies:
+ pako: 1.0.11
+
'@phc/format@1.0.0': {}
'@pkgjs/parseargs@0.11.0':
@@ -8559,70 +9036,70 @@ snapshots:
'@rc-component/async-validator@5.0.4':
dependencies:
- '@babel/runtime': 7.25.0
+ '@babel/runtime': 7.26.0
'@rc-component/color-picker@2.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
dependencies:
'@ant-design/fast-color': 2.0.6
- '@babel/runtime': 7.25.0
+ '@babel/runtime': 7.26.0
classnames: 2.5.1
- rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-util: 5.44.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
'@rc-component/context@1.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
dependencies:
- '@babel/runtime': 7.25.0
- rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ '@babel/runtime': 7.26.0
+ rc-util: 5.44.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
'@rc-component/mini-decimal@1.1.0':
dependencies:
- '@babel/runtime': 7.25.0
+ '@babel/runtime': 7.26.0
'@rc-component/mutate-observer@1.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
dependencies:
- '@babel/runtime': 7.25.0
+ '@babel/runtime': 7.26.0
classnames: 2.5.1
- rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-util: 5.44.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
'@rc-component/portal@1.1.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
dependencies:
- '@babel/runtime': 7.25.0
+ '@babel/runtime': 7.26.0
classnames: 2.5.1
- rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-util: 5.44.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
'@rc-component/qrcode@1.0.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
dependencies:
- '@babel/runtime': 7.25.0
+ '@babel/runtime': 7.26.0
classnames: 2.5.1
- rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-util: 5.44.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
'@rc-component/tour@1.15.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
dependencies:
- '@babel/runtime': 7.25.0
+ '@babel/runtime': 7.26.0
'@rc-component/portal': 1.1.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- '@rc-component/trigger': 2.2.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ '@rc-component/trigger': 2.2.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
classnames: 2.5.1
- rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-util: 5.44.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
- '@rc-component/trigger@2.2.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
+ '@rc-component/trigger@2.2.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
dependencies:
- '@babel/runtime': 7.25.0
+ '@babel/runtime': 7.26.0
'@rc-component/portal': 1.1.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
classnames: 2.5.1
- rc-motion: 2.9.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- rc-resize-observer: 1.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-motion: 2.9.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-resize-observer: 1.4.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-util: 5.44.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
@@ -8632,119 +9109,71 @@ snapshots:
generic-pool: 3.9.0
yallist: 4.0.0
- '@remix-run/router@1.17.1': {}
+ '@remix-run/router@1.21.0': {}
- '@rollup/pluginutils@5.1.0(rollup@4.29.1)':
+ '@rollup/pluginutils@5.1.4(rollup@4.30.1)':
dependencies:
- '@types/estree': 1.0.5
+ '@types/estree': 1.0.6
estree-walker: 2.0.2
- picomatch: 2.3.1
+ picomatch: 4.0.2
optionalDependencies:
- rollup: 4.29.1
+ rollup: 4.30.1
- '@rollup/rollup-android-arm-eabi@4.18.1':
+ '@rollup/rollup-android-arm-eabi@4.30.1':
optional: true
- '@rollup/rollup-android-arm-eabi@4.29.1':
+ '@rollup/rollup-android-arm64@4.30.1':
optional: true
- '@rollup/rollup-android-arm64@4.18.1':
+ '@rollup/rollup-darwin-arm64@4.30.1':
optional: true
- '@rollup/rollup-android-arm64@4.29.1':
+ '@rollup/rollup-darwin-x64@4.30.1':
optional: true
- '@rollup/rollup-darwin-arm64@4.18.1':
+ '@rollup/rollup-freebsd-arm64@4.30.1':
optional: true
- '@rollup/rollup-darwin-arm64@4.29.1':
+ '@rollup/rollup-freebsd-x64@4.30.1':
optional: true
- '@rollup/rollup-darwin-x64@4.18.1':
+ '@rollup/rollup-linux-arm-gnueabihf@4.30.1':
optional: true
- '@rollup/rollup-darwin-x64@4.29.1':
+ '@rollup/rollup-linux-arm-musleabihf@4.30.1':
optional: true
- '@rollup/rollup-freebsd-arm64@4.29.1':
+ '@rollup/rollup-linux-arm64-gnu@4.30.1':
optional: true
- '@rollup/rollup-freebsd-x64@4.29.1':
+ '@rollup/rollup-linux-arm64-musl@4.30.1':
optional: true
- '@rollup/rollup-linux-arm-gnueabihf@4.18.1':
+ '@rollup/rollup-linux-loongarch64-gnu@4.30.1':
optional: true
- '@rollup/rollup-linux-arm-gnueabihf@4.29.1':
+ '@rollup/rollup-linux-powerpc64le-gnu@4.30.1':
optional: true
- '@rollup/rollup-linux-arm-musleabihf@4.18.1':
+ '@rollup/rollup-linux-riscv64-gnu@4.30.1':
optional: true
- '@rollup/rollup-linux-arm-musleabihf@4.29.1':
+ '@rollup/rollup-linux-s390x-gnu@4.30.1':
optional: true
- '@rollup/rollup-linux-arm64-gnu@4.18.1':
+ '@rollup/rollup-linux-x64-gnu@4.30.1':
optional: true
- '@rollup/rollup-linux-arm64-gnu@4.29.1':
+ '@rollup/rollup-linux-x64-musl@4.30.1':
optional: true
- '@rollup/rollup-linux-arm64-musl@4.18.1':
+ '@rollup/rollup-win32-arm64-msvc@4.30.1':
optional: true
- '@rollup/rollup-linux-arm64-musl@4.29.1':
+ '@rollup/rollup-win32-ia32-msvc@4.30.1':
optional: true
- '@rollup/rollup-linux-loongarch64-gnu@4.29.1':
- optional: true
-
- '@rollup/rollup-linux-powerpc64le-gnu@4.18.1':
- optional: true
-
- '@rollup/rollup-linux-powerpc64le-gnu@4.29.1':
- optional: true
-
- '@rollup/rollup-linux-riscv64-gnu@4.18.1':
- optional: true
-
- '@rollup/rollup-linux-riscv64-gnu@4.29.1':
- optional: true
-
- '@rollup/rollup-linux-s390x-gnu@4.18.1':
- optional: true
-
- '@rollup/rollup-linux-s390x-gnu@4.29.1':
- optional: true
-
- '@rollup/rollup-linux-x64-gnu@4.18.1':
- optional: true
-
- '@rollup/rollup-linux-x64-gnu@4.29.1':
- optional: true
-
- '@rollup/rollup-linux-x64-musl@4.18.1':
- optional: true
-
- '@rollup/rollup-linux-x64-musl@4.29.1':
- optional: true
-
- '@rollup/rollup-win32-arm64-msvc@4.18.1':
- optional: true
-
- '@rollup/rollup-win32-arm64-msvc@4.29.1':
- optional: true
-
- '@rollup/rollup-win32-ia32-msvc@4.18.1':
- optional: true
-
- '@rollup/rollup-win32-ia32-msvc@4.29.1':
- optional: true
-
- '@rollup/rollup-win32-x64-msvc@4.18.1':
- optional: true
-
- '@rollup/rollup-win32-x64-msvc@4.29.1':
+ '@rollup/rollup-win32-x64-msvc@4.30.1':
optional: true
'@shopify/semaphore@3.1.0': {}
@@ -8762,16 +9191,16 @@ snapshots:
'@smithy/abort-controller@4.0.0':
dependencies:
'@smithy/types': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@smithy/chunked-blob-reader-native@4.0.0':
dependencies:
'@smithy/util-base64': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@smithy/chunked-blob-reader@5.0.0':
dependencies:
- tslib: 2.6.3
+ tslib: 2.8.1
'@smithy/config-resolver@4.0.0':
dependencies:
@@ -8779,7 +9208,7 @@ snapshots:
'@smithy/types': 4.0.0
'@smithy/util-config-provider': 4.0.0
'@smithy/util-middleware': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@smithy/core@3.0.0':
dependencies:
@@ -8790,7 +9219,7 @@ snapshots:
'@smithy/util-middleware': 4.0.0
'@smithy/util-stream': 4.0.0
'@smithy/util-utf8': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@smithy/credential-provider-imds@4.0.0':
dependencies:
@@ -8798,37 +9227,37 @@ snapshots:
'@smithy/property-provider': 4.0.0
'@smithy/types': 4.0.0
'@smithy/url-parser': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@smithy/eventstream-codec@4.0.0':
dependencies:
'@aws-crypto/crc32': 5.2.0
'@smithy/types': 4.0.0
'@smithy/util-hex-encoding': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@smithy/eventstream-serde-browser@4.0.0':
dependencies:
'@smithy/eventstream-serde-universal': 4.0.0
'@smithy/types': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@smithy/eventstream-serde-config-resolver@4.0.0':
dependencies:
'@smithy/types': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@smithy/eventstream-serde-node@4.0.0':
dependencies:
'@smithy/eventstream-serde-universal': 4.0.0
'@smithy/types': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@smithy/eventstream-serde-universal@4.0.0':
dependencies:
'@smithy/eventstream-codec': 4.0.0
'@smithy/types': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@smithy/fetch-http-handler@5.0.0':
dependencies:
@@ -8836,52 +9265,52 @@ snapshots:
'@smithy/querystring-builder': 4.0.0
'@smithy/types': 4.0.0
'@smithy/util-base64': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@smithy/hash-blob-browser@4.0.0':
dependencies:
'@smithy/chunked-blob-reader': 5.0.0
'@smithy/chunked-blob-reader-native': 4.0.0
'@smithy/types': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@smithy/hash-node@4.0.0':
dependencies:
'@smithy/types': 4.0.0
'@smithy/util-buffer-from': 4.0.0
'@smithy/util-utf8': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@smithy/hash-stream-node@4.0.0':
dependencies:
'@smithy/types': 4.0.0
'@smithy/util-utf8': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@smithy/invalid-dependency@4.0.0':
dependencies:
'@smithy/types': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@smithy/is-array-buffer@2.2.0':
dependencies:
- tslib: 2.6.3
+ tslib: 2.8.1
'@smithy/is-array-buffer@4.0.0':
dependencies:
- tslib: 2.6.3
+ tslib: 2.8.1
'@smithy/md5-js@4.0.0':
dependencies:
'@smithy/types': 4.0.0
'@smithy/util-utf8': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@smithy/middleware-content-length@4.0.0':
dependencies:
'@smithy/protocol-http': 5.0.0
'@smithy/types': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@smithy/middleware-endpoint@4.0.0':
dependencies:
@@ -8892,7 +9321,7 @@ snapshots:
'@smithy/types': 4.0.0
'@smithy/url-parser': 4.0.0
'@smithy/util-middleware': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@smithy/middleware-retry@4.0.0':
dependencies:
@@ -8903,25 +9332,25 @@ snapshots:
'@smithy/types': 4.0.0
'@smithy/util-middleware': 4.0.0
'@smithy/util-retry': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
uuid: 9.0.1
'@smithy/middleware-serde@4.0.0':
dependencies:
'@smithy/types': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@smithy/middleware-stack@4.0.0':
dependencies:
'@smithy/types': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@smithy/node-config-provider@4.0.0':
dependencies:
'@smithy/property-provider': 4.0.0
'@smithy/shared-ini-file-loader': 4.0.0
'@smithy/types': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@smithy/node-http-handler@4.0.0':
dependencies:
@@ -8929,28 +9358,28 @@ snapshots:
'@smithy/protocol-http': 5.0.0
'@smithy/querystring-builder': 4.0.0
'@smithy/types': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@smithy/property-provider@4.0.0':
dependencies:
'@smithy/types': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@smithy/protocol-http@5.0.0':
dependencies:
'@smithy/types': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@smithy/querystring-builder@4.0.0':
dependencies:
'@smithy/types': 4.0.0
'@smithy/util-uri-escape': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@smithy/querystring-parser@4.0.0':
dependencies:
'@smithy/types': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@smithy/service-error-classification@4.0.0':
dependencies:
@@ -8959,7 +9388,7 @@ snapshots:
'@smithy/shared-ini-file-loader@4.0.0':
dependencies:
'@smithy/types': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@smithy/signature-v4@5.0.0':
dependencies:
@@ -8970,7 +9399,7 @@ snapshots:
'@smithy/util-middleware': 4.0.0
'@smithy/util-uri-escape': 4.0.0
'@smithy/util-utf8': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@smithy/smithy-client@4.0.0':
dependencies:
@@ -8980,45 +9409,45 @@ snapshots:
'@smithy/protocol-http': 5.0.0
'@smithy/types': 4.0.0
'@smithy/util-stream': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@smithy/types@4.0.0':
dependencies:
- tslib: 2.6.3
+ tslib: 2.8.1
'@smithy/url-parser@4.0.0':
dependencies:
'@smithy/querystring-parser': 4.0.0
'@smithy/types': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@smithy/util-base64@4.0.0':
dependencies:
'@smithy/util-buffer-from': 4.0.0
'@smithy/util-utf8': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@smithy/util-body-length-browser@4.0.0':
dependencies:
- tslib: 2.6.3
+ tslib: 2.8.1
'@smithy/util-body-length-node@4.0.0':
dependencies:
- tslib: 2.6.3
+ tslib: 2.8.1
'@smithy/util-buffer-from@2.2.0':
dependencies:
'@smithy/is-array-buffer': 2.2.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@smithy/util-buffer-from@4.0.0':
dependencies:
'@smithy/is-array-buffer': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@smithy/util-config-provider@4.0.0':
dependencies:
- tslib: 2.6.3
+ tslib: 2.8.1
'@smithy/util-defaults-mode-browser@4.0.0':
dependencies:
@@ -9026,7 +9455,7 @@ snapshots:
'@smithy/smithy-client': 4.0.0
'@smithy/types': 4.0.0
bowser: 2.11.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@smithy/util-defaults-mode-node@4.0.0':
dependencies:
@@ -9036,28 +9465,28 @@ snapshots:
'@smithy/property-provider': 4.0.0
'@smithy/smithy-client': 4.0.0
'@smithy/types': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@smithy/util-endpoints@3.0.0':
dependencies:
'@smithy/node-config-provider': 4.0.0
'@smithy/types': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@smithy/util-hex-encoding@4.0.0':
dependencies:
- tslib: 2.6.3
+ tslib: 2.8.1
'@smithy/util-middleware@4.0.0':
dependencies:
'@smithy/types': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@smithy/util-retry@4.0.0':
dependencies:
'@smithy/service-error-classification': 4.0.0
'@smithy/types': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@smithy/util-stream@4.0.0':
dependencies:
@@ -9068,80 +9497,82 @@ snapshots:
'@smithy/util-buffer-from': 4.0.0
'@smithy/util-hex-encoding': 4.0.0
'@smithy/util-utf8': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@smithy/util-uri-escape@4.0.0':
dependencies:
- tslib: 2.6.3
+ tslib: 2.8.1
'@smithy/util-utf8@2.3.0':
dependencies:
'@smithy/util-buffer-from': 2.2.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@smithy/util-utf8@4.0.0':
dependencies:
'@smithy/util-buffer-from': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@smithy/util-waiter@4.0.0':
dependencies:
'@smithy/abort-controller': 4.0.0
'@smithy/types': 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.1
'@socket.io/component-emitter@3.1.2': {}
- '@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.24.7)':
- dependencies:
- '@babel/core': 7.24.7
+ '@svgdotjs/svg.js@3.2.0': {}
- '@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.24.7)':
+ '@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
+ '@babel/core': 7.26.0
- '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.24.7)':
+ '@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
+ '@babel/core': 7.26.0
- '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0(@babel/core@7.24.7)':
+ '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
+ '@babel/core': 7.26.0
- '@svgr/babel-plugin-svg-dynamic-title@8.0.0(@babel/core@7.24.7)':
+ '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
+ '@babel/core': 7.26.0
- '@svgr/babel-plugin-svg-em-dimensions@8.0.0(@babel/core@7.24.7)':
+ '@svgr/babel-plugin-svg-dynamic-title@8.0.0(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
+ '@babel/core': 7.26.0
- '@svgr/babel-plugin-transform-react-native-svg@8.1.0(@babel/core@7.24.7)':
+ '@svgr/babel-plugin-svg-em-dimensions@8.0.0(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
+ '@babel/core': 7.26.0
- '@svgr/babel-plugin-transform-svg-component@8.0.0(@babel/core@7.24.7)':
+ '@svgr/babel-plugin-transform-react-native-svg@8.1.0(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
+ '@babel/core': 7.26.0
- '@svgr/babel-preset@8.1.0(@babel/core@7.24.7)':
+ '@svgr/babel-plugin-transform-svg-component@8.0.0(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@svgr/babel-plugin-add-jsx-attribute': 8.0.0(@babel/core@7.24.7)
- '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.24.7)
- '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.24.7)
- '@svgr/babel-plugin-replace-jsx-attribute-value': 8.0.0(@babel/core@7.24.7)
- '@svgr/babel-plugin-svg-dynamic-title': 8.0.0(@babel/core@7.24.7)
- '@svgr/babel-plugin-svg-em-dimensions': 8.0.0(@babel/core@7.24.7)
- '@svgr/babel-plugin-transform-react-native-svg': 8.1.0(@babel/core@7.24.7)
- '@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.24.7)
+ '@babel/core': 7.26.0
- '@svgr/core@8.1.0(typescript@5.5.3)':
+ '@svgr/babel-preset@8.1.0(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@svgr/babel-preset': 8.1.0(@babel/core@7.24.7)
+ '@babel/core': 7.26.0
+ '@svgr/babel-plugin-add-jsx-attribute': 8.0.0(@babel/core@7.26.0)
+ '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.26.0)
+ '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.26.0)
+ '@svgr/babel-plugin-replace-jsx-attribute-value': 8.0.0(@babel/core@7.26.0)
+ '@svgr/babel-plugin-svg-dynamic-title': 8.0.0(@babel/core@7.26.0)
+ '@svgr/babel-plugin-svg-em-dimensions': 8.0.0(@babel/core@7.26.0)
+ '@svgr/babel-plugin-transform-react-native-svg': 8.1.0(@babel/core@7.26.0)
+ '@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.26.0)
+
+ '@svgr/core@8.1.0(typescript@5.7.2)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@svgr/babel-preset': 8.1.0(@babel/core@7.26.0)
camelcase: 6.3.0
- cosmiconfig: 8.3.6(typescript@5.5.3)
+ cosmiconfig: 8.3.6(typescript@5.7.2)
snake-case: 3.0.4
transitivePeerDependencies:
- supports-color
@@ -9149,109 +9580,113 @@ snapshots:
'@svgr/hast-util-to-babel-ast@8.0.0':
dependencies:
- '@babel/types': 7.24.7
+ '@babel/types': 7.26.3
entities: 4.5.0
- '@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0(typescript@5.5.3))':
+ '@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0(typescript@5.7.2))':
dependencies:
- '@babel/core': 7.24.7
- '@svgr/babel-preset': 8.1.0(@babel/core@7.24.7)
- '@svgr/core': 8.1.0(typescript@5.5.3)
+ '@babel/core': 7.26.0
+ '@svgr/babel-preset': 8.1.0(@babel/core@7.26.0)
+ '@svgr/core': 8.1.0(typescript@5.7.2)
'@svgr/hast-util-to-babel-ast': 8.0.0
svg-parser: 2.0.4
transitivePeerDependencies:
- supports-color
- '@swc/core-darwin-arm64@1.6.13':
+ '@swc/core-darwin-arm64@1.10.6':
optional: true
- '@swc/core-darwin-x64@1.6.13':
+ '@swc/core-darwin-x64@1.10.6':
optional: true
- '@swc/core-linux-arm-gnueabihf@1.6.13':
+ '@swc/core-linux-arm-gnueabihf@1.10.6':
optional: true
- '@swc/core-linux-arm64-gnu@1.6.13':
+ '@swc/core-linux-arm64-gnu@1.10.6':
optional: true
- '@swc/core-linux-arm64-musl@1.6.13':
+ '@swc/core-linux-arm64-musl@1.10.6':
optional: true
- '@swc/core-linux-x64-gnu@1.6.13':
+ '@swc/core-linux-x64-gnu@1.10.6':
optional: true
- '@swc/core-linux-x64-musl@1.6.13':
+ '@swc/core-linux-x64-musl@1.10.6':
optional: true
- '@swc/core-win32-arm64-msvc@1.6.13':
+ '@swc/core-win32-arm64-msvc@1.10.6':
optional: true
- '@swc/core-win32-ia32-msvc@1.6.13':
+ '@swc/core-win32-ia32-msvc@1.10.6':
optional: true
- '@swc/core-win32-x64-msvc@1.6.13':
+ '@swc/core-win32-x64-msvc@1.10.6':
optional: true
- '@swc/core@1.6.13':
+ '@swc/core@1.10.6(@swc/helpers@0.5.15)':
dependencies:
'@swc/counter': 0.1.3
- '@swc/types': 0.1.9
+ '@swc/types': 0.1.17
optionalDependencies:
- '@swc/core-darwin-arm64': 1.6.13
- '@swc/core-darwin-x64': 1.6.13
- '@swc/core-linux-arm-gnueabihf': 1.6.13
- '@swc/core-linux-arm64-gnu': 1.6.13
- '@swc/core-linux-arm64-musl': 1.6.13
- '@swc/core-linux-x64-gnu': 1.6.13
- '@swc/core-linux-x64-musl': 1.6.13
- '@swc/core-win32-arm64-msvc': 1.6.13
- '@swc/core-win32-ia32-msvc': 1.6.13
- '@swc/core-win32-x64-msvc': 1.6.13
+ '@swc/core-darwin-arm64': 1.10.6
+ '@swc/core-darwin-x64': 1.10.6
+ '@swc/core-linux-arm-gnueabihf': 1.10.6
+ '@swc/core-linux-arm64-gnu': 1.10.6
+ '@swc/core-linux-arm64-musl': 1.10.6
+ '@swc/core-linux-x64-gnu': 1.10.6
+ '@swc/core-linux-x64-musl': 1.10.6
+ '@swc/core-win32-arm64-msvc': 1.10.6
+ '@swc/core-win32-ia32-msvc': 1.10.6
+ '@swc/core-win32-x64-msvc': 1.10.6
+ '@swc/helpers': 0.5.15
'@swc/counter@0.1.3': {}
- '@swc/types@0.1.9':
+ '@swc/helpers@0.5.15':
+ dependencies:
+ tslib: 2.8.1
+ optional: true
+
+ '@swc/types@0.1.17':
dependencies:
'@swc/counter': 0.1.3
- '@tanstack/query-async-storage-persister@5.51.9':
+ '@tanstack/query-async-storage-persister@5.62.16':
dependencies:
- '@tanstack/query-persist-client-core': 5.51.9
+ '@tanstack/query-persist-client-core': 5.62.16
- '@tanstack/query-core@5.51.9': {}
+ '@tanstack/query-core@5.62.16': {}
- '@tanstack/query-core@5.55.4': {}
-
- '@tanstack/query-persist-client-core@5.51.9':
+ '@tanstack/query-persist-client-core@5.62.16':
dependencies:
- '@tanstack/query-core': 5.51.9
+ '@tanstack/query-core': 5.62.16
- '@tanstack/react-query-persist-client@5.51.11(@tanstack/react-query@5.55.4(react@18.2.0))(react@18.2.0)':
+ '@tanstack/react-query-persist-client@5.62.16(@tanstack/react-query@5.62.16(react@18.2.0))(react@18.2.0)':
dependencies:
- '@tanstack/query-persist-client-core': 5.51.9
- '@tanstack/react-query': 5.55.4(react@18.2.0)
+ '@tanstack/query-persist-client-core': 5.62.16
+ '@tanstack/react-query': 5.62.16(react@18.2.0)
react: 18.2.0
- '@tanstack/react-query@5.55.4(react@18.2.0)':
+ '@tanstack/react-query@5.62.16(react@18.2.0)':
dependencies:
- '@tanstack/query-core': 5.55.4
+ '@tanstack/query-core': 5.62.16
react: 18.2.0
'@trpc/client@11.0.0-rc.456(@trpc/server@11.0.0-rc.456)':
dependencies:
'@trpc/server': 11.0.0-rc.456
- '@trpc/react-query@11.0.0-rc.456(@tanstack/react-query@5.55.4(react@18.2.0))(@trpc/client@11.0.0-rc.456(@trpc/server@11.0.0-rc.456))(@trpc/server@11.0.0-rc.456)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
+ '@trpc/react-query@11.0.0-rc.456(@tanstack/react-query@5.62.16(react@18.2.0))(@trpc/client@11.0.0-rc.456(@trpc/server@11.0.0-rc.456))(@trpc/server@11.0.0-rc.456)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
dependencies:
- '@tanstack/react-query': 5.55.4(react@18.2.0)
+ '@tanstack/react-query': 5.62.16(react@18.2.0)
'@trpc/client': 11.0.0-rc.456(@trpc/server@11.0.0-rc.456)
'@trpc/server': 11.0.0-rc.456
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
- '@trpc/react-query@11.0.0-rc.456(@tanstack/react-query@5.55.4(react@18.2.0))(@trpc/client@11.0.0-rc.456(@trpc/server@11.0.0-rc.456))(@trpc/server@11.0.0-rc.456)(react-dom@18.3.1(react@18.2.0))(react@18.2.0)':
+ '@trpc/react-query@11.0.0-rc.456(@tanstack/react-query@5.62.16(react@18.2.0))(@trpc/client@11.0.0-rc.456(@trpc/server@11.0.0-rc.456))(@trpc/server@11.0.0-rc.456)(react-dom@18.3.1(react@18.2.0))(react@18.2.0)':
dependencies:
- '@tanstack/react-query': 5.55.4(react@18.2.0)
+ '@tanstack/react-query': 5.62.16(react@18.2.0)
'@trpc/client': 11.0.0-rc.456(@trpc/server@11.0.0-rc.456)
'@trpc/server': 11.0.0-rc.456
react: 18.2.0
@@ -9269,33 +9704,33 @@ snapshots:
'@types/babel__core@7.20.5':
dependencies:
- '@babel/parser': 7.24.7
- '@babel/types': 7.24.7
+ '@babel/parser': 7.26.3
+ '@babel/types': 7.26.3
'@types/babel__generator': 7.6.8
'@types/babel__template': 7.4.4
'@types/babel__traverse': 7.20.6
'@types/babel__generator@7.6.8':
dependencies:
- '@babel/types': 7.24.7
+ '@babel/types': 7.26.3
'@types/babel__template@7.4.4':
dependencies:
- '@babel/parser': 7.24.7
- '@babel/types': 7.24.7
+ '@babel/parser': 7.26.3
+ '@babel/types': 7.26.3
'@types/babel__traverse@7.20.6':
dependencies:
- '@babel/types': 7.24.7
+ '@babel/types': 7.26.3
'@types/body-parser@1.19.5':
dependencies:
'@types/connect': 3.4.38
- '@types/node': 20.14.10
+ '@types/node': 20.17.12
'@types/connect@3.4.38':
dependencies:
- '@types/node': 20.14.10
+ '@types/node': 20.17.12
'@types/cookie@0.4.1': {}
@@ -9303,7 +9738,30 @@ snapshots:
'@types/cors@2.8.17':
dependencies:
- '@types/node': 20.14.10
+ '@types/node': 20.17.12
+
+ '@types/d3-color@3.1.3': {}
+
+ '@types/d3-drag@3.0.7':
+ dependencies:
+ '@types/d3-selection': 3.0.11
+
+ '@types/d3-interpolate@3.0.4':
+ dependencies:
+ '@types/d3-color': 3.1.3
+
+ '@types/d3-selection@3.0.11': {}
+
+ '@types/d3-transition@3.0.9':
+ dependencies:
+ '@types/d3-selection': 3.0.11
+
+ '@types/d3-zoom@3.0.8':
+ dependencies:
+ '@types/d3-interpolate': 3.0.4
+ '@types/d3-selection': 3.0.11
+
+ '@types/dagre@0.7.52': {}
'@types/debug@4.1.12':
dependencies:
@@ -9311,47 +9769,45 @@ snapshots:
'@types/eslint-scope@3.7.7':
dependencies:
- '@types/eslint': 8.56.10
- '@types/estree': 1.0.5
+ '@types/eslint': 9.6.1
+ '@types/estree': 1.0.6
- '@types/eslint@8.56.10':
+ '@types/eslint@9.6.1':
dependencies:
- '@types/estree': 1.0.5
+ '@types/estree': 1.0.6
'@types/json-schema': 7.0.15
- '@types/estree@1.0.5': {}
-
'@types/estree@1.0.6': {}
- '@types/exceljs@1.3.0':
+ '@types/exceljs@1.3.2':
dependencies:
exceljs: 4.4.0
- '@types/express-serve-static-core@4.19.5':
+ '@types/express-serve-static-core@4.19.6':
dependencies:
- '@types/node': 20.14.10
- '@types/qs': 6.9.15
+ '@types/node': 20.17.12
+ '@types/qs': 6.9.17
'@types/range-parser': 1.2.7
'@types/send': 0.17.4
'@types/express@4.17.21':
dependencies:
'@types/body-parser': 1.19.5
- '@types/express-serve-static-core': 4.19.5
- '@types/qs': 6.9.15
+ '@types/express-serve-static-core': 4.19.6
+ '@types/qs': 6.9.17
'@types/serve-static': 1.15.7
'@types/fluent-ffmpeg@2.1.27':
dependencies:
- '@types/node': 20.14.10
+ '@types/node': 20.17.12
'@types/graceful-fs@4.1.9':
dependencies:
- '@types/node': 20.14.10
+ '@types/node': 20.17.12
'@types/hoist-non-react-statics@3.3.6':
dependencies:
- '@types/react': 18.3.3
+ '@types/react': 18.2.38
hoist-non-react-statics: 3.3.2
'@types/http-errors@2.0.4': {}
@@ -9366,7 +9822,7 @@ snapshots:
dependencies:
'@types/istanbul-lib-report': 3.0.3
- '@types/jest@29.5.12':
+ '@types/jest@29.5.14':
dependencies:
expect: 29.7.0
pretty-format: 29.7.0
@@ -9375,7 +9831,9 @@ snapshots:
'@types/jsonwebtoken@9.0.5':
dependencies:
- '@types/node': 20.14.10
+ '@types/node': 20.17.12
+
+ '@types/katex@0.16.7': {}
'@types/lodash.throttle@4.1.9':
dependencies:
@@ -9385,6 +9843,14 @@ snapshots:
'@types/luxon@3.4.2': {}
+ '@types/mdast@3.0.15':
+ dependencies:
+ '@types/unist': 2.0.11
+
+ '@types/mdast@4.0.4':
+ dependencies:
+ '@types/unist': 2.0.11
+
'@types/methods@1.1.4': {}
'@types/mime-types@2.1.4': {}
@@ -9399,163 +9865,174 @@ snapshots:
'@types/multistream@4.1.3':
dependencies:
- '@types/node': 20.14.10
+ '@types/node': 20.17.12
'@types/node@14.18.63': {}
- '@types/node@20.14.10':
+ '@types/node@20.17.12':
dependencies:
- undici-types: 5.26.5
+ undici-types: 6.19.8
- '@types/prop-types@15.7.12': {}
+ '@types/prop-types@15.7.14': {}
- '@types/qs@6.9.15': {}
+ '@types/qs@6.9.17': {}
'@types/range-parser@1.2.7': {}
- '@types/react-dom@18.3.0':
+ '@types/react-dom@18.2.15':
dependencies:
- '@types/react': 18.3.3
+ '@types/react': 18.3.18
'@types/react-redux@7.1.34':
dependencies:
'@types/hoist-non-react-statics': 3.3.6
- '@types/react': 18.3.3
+ '@types/react': 18.2.38
hoist-non-react-statics: 3.3.2
redux: 4.2.1
- '@types/react@18.3.3':
+ '@types/react@18.2.38':
dependencies:
- '@types/prop-types': 15.7.12
+ '@types/prop-types': 15.7.14
+ '@types/scheduler': 0.23.0
csstype: 3.1.3
+ '@types/react@18.3.18':
+ dependencies:
+ '@types/prop-types': 15.7.14
+ csstype: 3.1.3
+
+ '@types/scheduler@0.23.0': {}
+
'@types/semver@7.5.8': {}
'@types/send@0.17.4':
dependencies:
'@types/mime': 1.3.5
- '@types/node': 20.14.10
+ '@types/node': 20.17.12
'@types/serve-static@1.15.7':
dependencies:
'@types/http-errors': 2.0.4
- '@types/node': 20.14.10
+ '@types/node': 20.17.12
'@types/send': 0.17.4
'@types/stack-utils@2.0.3': {}
- '@types/superagent@8.1.7':
+ '@types/superagent@8.1.9':
dependencies:
'@types/cookiejar': 2.1.5
'@types/methods': 1.1.4
- '@types/node': 20.14.10
+ '@types/node': 20.17.12
+ form-data: 4.0.1
'@types/supertest@6.0.2':
dependencies:
'@types/methods': 1.1.4
- '@types/superagent': 8.1.7
+ '@types/superagent': 8.1.9
+
+ '@types/unist@2.0.11': {}
'@types/uuid@10.0.0': {}
'@types/ws@8.5.13':
dependencies:
- '@types/node': 20.14.10
+ '@types/node': 20.17.12
'@types/yargs-parser@21.0.3': {}
- '@types/yargs@17.0.32':
+ '@types/yargs@17.0.33':
dependencies:
'@types/yargs-parser': 21.0.3
- '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.7.2))(eslint@8.57.0)(typescript@5.7.2)':
+ '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2)':
dependencies:
- '@eslint-community/regexpp': 4.11.0
- '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.7.2)
+ '@eslint-community/regexpp': 4.12.1
+ '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.7.2)
'@typescript-eslint/scope-manager': 6.21.0
- '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.0)(typescript@5.7.2)
- '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.7.2)
+ '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.1)(typescript@5.7.2)
+ '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.7.2)
'@typescript-eslint/visitor-keys': 6.21.0
debug: 4.4.0
- eslint: 8.57.0
+ eslint: 8.57.1
graphemer: 1.4.0
- ignore: 5.3.1
+ ignore: 5.3.2
natural-compare: 1.4.0
- semver: 7.6.2
- ts-api-utils: 1.3.0(typescript@5.7.2)
+ semver: 7.6.3
+ ts-api-utils: 1.4.3(typescript@5.7.2)
optionalDependencies:
typescript: 5.7.2
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/eslint-plugin@7.16.0(@typescript-eslint/parser@7.16.0(eslint@8.57.0)(typescript@5.5.3))(eslint@8.57.0)(typescript@5.5.3)':
+ '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2)':
dependencies:
- '@eslint-community/regexpp': 4.11.0
- '@typescript-eslint/parser': 7.16.0(eslint@8.57.0)(typescript@5.5.3)
- '@typescript-eslint/scope-manager': 7.16.0
- '@typescript-eslint/type-utils': 7.16.0(eslint@8.57.0)(typescript@5.5.3)
- '@typescript-eslint/utils': 7.16.0(eslint@8.57.0)(typescript@5.5.3)
- '@typescript-eslint/visitor-keys': 7.16.0
- eslint: 8.57.0
+ '@eslint-community/regexpp': 4.12.1
+ '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.7.2)
+ '@typescript-eslint/scope-manager': 7.18.0
+ '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.1)(typescript@5.7.2)
+ '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.7.2)
+ '@typescript-eslint/visitor-keys': 7.18.0
+ eslint: 8.57.1
graphemer: 1.4.0
- ignore: 5.3.1
+ ignore: 5.3.2
natural-compare: 1.4.0
- ts-api-utils: 1.3.0(typescript@5.5.3)
+ ts-api-utils: 1.4.3(typescript@5.7.2)
optionalDependencies:
- typescript: 5.5.3
- transitivePeerDependencies:
- - supports-color
-
- '@typescript-eslint/eslint-plugin@8.18.2(@typescript-eslint/parser@8.18.2(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2))(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2)':
- dependencies:
- '@eslint-community/regexpp': 4.11.0
- '@typescript-eslint/parser': 8.18.2(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2)
- '@typescript-eslint/scope-manager': 8.18.2
- '@typescript-eslint/type-utils': 8.18.2(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2)
- '@typescript-eslint/utils': 8.18.2(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2)
- '@typescript-eslint/visitor-keys': 8.18.2
- eslint: 9.17.0(jiti@1.21.6)
- graphemer: 1.4.0
- ignore: 5.3.1
- natural-compare: 1.4.0
- ts-api-utils: 1.3.0(typescript@5.7.2)
typescript: 5.7.2
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.7.2)':
+ '@typescript-eslint/eslint-plugin@8.19.1(@typescript-eslint/parser@8.19.1(eslint@9.17.0(jiti@1.21.7))(typescript@5.7.2))(eslint@9.17.0(jiti@1.21.7))(typescript@5.7.2)':
+ dependencies:
+ '@eslint-community/regexpp': 4.12.1
+ '@typescript-eslint/parser': 8.19.1(eslint@9.17.0(jiti@1.21.7))(typescript@5.7.2)
+ '@typescript-eslint/scope-manager': 8.19.1
+ '@typescript-eslint/type-utils': 8.19.1(eslint@9.17.0(jiti@1.21.7))(typescript@5.7.2)
+ '@typescript-eslint/utils': 8.19.1(eslint@9.17.0(jiti@1.21.7))(typescript@5.7.2)
+ '@typescript-eslint/visitor-keys': 8.19.1
+ eslint: 9.17.0(jiti@1.21.7)
+ graphemer: 1.4.0
+ ignore: 5.3.2
+ natural-compare: 1.4.0
+ ts-api-utils: 2.0.0(typescript@5.7.2)
+ typescript: 5.7.2
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.7.2)':
dependencies:
'@typescript-eslint/scope-manager': 6.21.0
'@typescript-eslint/types': 6.21.0
'@typescript-eslint/typescript-estree': 6.21.0(typescript@5.7.2)
'@typescript-eslint/visitor-keys': 6.21.0
debug: 4.4.0
- eslint: 8.57.0
+ eslint: 8.57.1
optionalDependencies:
typescript: 5.7.2
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/parser@7.16.0(eslint@8.57.0)(typescript@5.5.3)':
+ '@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2)':
dependencies:
- '@typescript-eslint/scope-manager': 7.16.0
- '@typescript-eslint/types': 7.16.0
- '@typescript-eslint/typescript-estree': 7.16.0(typescript@5.5.3)
- '@typescript-eslint/visitor-keys': 7.16.0
+ '@typescript-eslint/scope-manager': 7.18.0
+ '@typescript-eslint/types': 7.18.0
+ '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.7.2)
+ '@typescript-eslint/visitor-keys': 7.18.0
debug: 4.4.0
- eslint: 8.57.0
+ eslint: 8.57.1
optionalDependencies:
- typescript: 5.5.3
+ typescript: 5.7.2
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/parser@8.18.2(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2)':
+ '@typescript-eslint/parser@8.19.1(eslint@9.17.0(jiti@1.21.7))(typescript@5.7.2)':
dependencies:
- '@typescript-eslint/scope-manager': 8.18.2
- '@typescript-eslint/types': 8.18.2
- '@typescript-eslint/typescript-estree': 8.18.2(typescript@5.7.2)
- '@typescript-eslint/visitor-keys': 8.18.2
+ '@typescript-eslint/scope-manager': 8.19.1
+ '@typescript-eslint/types': 8.19.1
+ '@typescript-eslint/typescript-estree': 8.19.1(typescript@5.7.2)
+ '@typescript-eslint/visitor-keys': 8.19.1
debug: 4.4.0
- eslint: 9.17.0(jiti@1.21.6)
+ eslint: 9.17.0(jiti@1.21.7)
typescript: 5.7.2
transitivePeerDependencies:
- supports-color
@@ -9565,56 +10042,56 @@ snapshots:
'@typescript-eslint/types': 6.21.0
'@typescript-eslint/visitor-keys': 6.21.0
- '@typescript-eslint/scope-manager@7.16.0':
+ '@typescript-eslint/scope-manager@7.18.0':
dependencies:
- '@typescript-eslint/types': 7.16.0
- '@typescript-eslint/visitor-keys': 7.16.0
+ '@typescript-eslint/types': 7.18.0
+ '@typescript-eslint/visitor-keys': 7.18.0
- '@typescript-eslint/scope-manager@8.18.2':
+ '@typescript-eslint/scope-manager@8.19.1':
dependencies:
- '@typescript-eslint/types': 8.18.2
- '@typescript-eslint/visitor-keys': 8.18.2
+ '@typescript-eslint/types': 8.19.1
+ '@typescript-eslint/visitor-keys': 8.19.1
- '@typescript-eslint/type-utils@6.21.0(eslint@8.57.0)(typescript@5.7.2)':
+ '@typescript-eslint/type-utils@6.21.0(eslint@8.57.1)(typescript@5.7.2)':
dependencies:
'@typescript-eslint/typescript-estree': 6.21.0(typescript@5.7.2)
- '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.7.2)
+ '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.7.2)
debug: 4.4.0
- eslint: 8.57.0
- ts-api-utils: 1.3.0(typescript@5.7.2)
+ eslint: 8.57.1
+ ts-api-utils: 1.4.3(typescript@5.7.2)
optionalDependencies:
typescript: 5.7.2
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/type-utils@7.16.0(eslint@8.57.0)(typescript@5.5.3)':
+ '@typescript-eslint/type-utils@7.18.0(eslint@8.57.1)(typescript@5.7.2)':
dependencies:
- '@typescript-eslint/typescript-estree': 7.16.0(typescript@5.5.3)
- '@typescript-eslint/utils': 7.16.0(eslint@8.57.0)(typescript@5.5.3)
+ '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.7.2)
+ '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.7.2)
debug: 4.4.0
- eslint: 8.57.0
- ts-api-utils: 1.3.0(typescript@5.5.3)
+ eslint: 8.57.1
+ ts-api-utils: 1.4.3(typescript@5.7.2)
optionalDependencies:
- typescript: 5.5.3
+ typescript: 5.7.2
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/type-utils@8.18.2(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2)':
+ '@typescript-eslint/type-utils@8.19.1(eslint@9.17.0(jiti@1.21.7))(typescript@5.7.2)':
dependencies:
- '@typescript-eslint/typescript-estree': 8.18.2(typescript@5.7.2)
- '@typescript-eslint/utils': 8.18.2(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2)
+ '@typescript-eslint/typescript-estree': 8.19.1(typescript@5.7.2)
+ '@typescript-eslint/utils': 8.19.1(eslint@9.17.0(jiti@1.21.7))(typescript@5.7.2)
debug: 4.4.0
- eslint: 9.17.0(jiti@1.21.6)
- ts-api-utils: 1.3.0(typescript@5.7.2)
+ eslint: 9.17.0(jiti@1.21.7)
+ ts-api-utils: 2.0.0(typescript@5.7.2)
typescript: 5.7.2
transitivePeerDependencies:
- supports-color
'@typescript-eslint/types@6.21.0': {}
- '@typescript-eslint/types@7.16.0': {}
+ '@typescript-eslint/types@7.18.0': {}
- '@typescript-eslint/types@8.18.2': {}
+ '@typescript-eslint/types@8.19.1': {}
'@typescript-eslint/typescript-estree@6.21.0(typescript@5.7.2)':
dependencies:
@@ -9624,74 +10101,74 @@ snapshots:
globby: 11.1.0
is-glob: 4.0.3
minimatch: 9.0.3
- semver: 7.6.2
- ts-api-utils: 1.3.0(typescript@5.7.2)
+ semver: 7.6.3
+ ts-api-utils: 1.4.3(typescript@5.7.2)
optionalDependencies:
typescript: 5.7.2
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/typescript-estree@7.16.0(typescript@5.5.3)':
+ '@typescript-eslint/typescript-estree@7.18.0(typescript@5.7.2)':
dependencies:
- '@typescript-eslint/types': 7.16.0
- '@typescript-eslint/visitor-keys': 7.16.0
+ '@typescript-eslint/types': 7.18.0
+ '@typescript-eslint/visitor-keys': 7.18.0
debug: 4.4.0
globby: 11.1.0
is-glob: 4.0.3
minimatch: 9.0.5
- semver: 7.6.2
- ts-api-utils: 1.3.0(typescript@5.5.3)
+ semver: 7.6.3
+ ts-api-utils: 1.4.3(typescript@5.7.2)
optionalDependencies:
- typescript: 5.5.3
- transitivePeerDependencies:
- - supports-color
-
- '@typescript-eslint/typescript-estree@8.18.2(typescript@5.7.2)':
- dependencies:
- '@typescript-eslint/types': 8.18.2
- '@typescript-eslint/visitor-keys': 8.18.2
- debug: 4.4.0
- fast-glob: 3.3.2
- is-glob: 4.0.3
- minimatch: 9.0.5
- semver: 7.6.2
- ts-api-utils: 1.3.0(typescript@5.7.2)
typescript: 5.7.2
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/utils@6.21.0(eslint@8.57.0)(typescript@5.7.2)':
+ '@typescript-eslint/typescript-estree@8.19.1(typescript@5.7.2)':
dependencies:
- '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0)
+ '@typescript-eslint/types': 8.19.1
+ '@typescript-eslint/visitor-keys': 8.19.1
+ debug: 4.4.0
+ fast-glob: 3.3.3
+ is-glob: 4.0.3
+ minimatch: 9.0.5
+ semver: 7.6.3
+ ts-api-utils: 2.0.0(typescript@5.7.2)
+ typescript: 5.7.2
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/utils@6.21.0(eslint@8.57.1)(typescript@5.7.2)':
+ dependencies:
+ '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1)
'@types/json-schema': 7.0.15
'@types/semver': 7.5.8
'@typescript-eslint/scope-manager': 6.21.0
'@typescript-eslint/types': 6.21.0
'@typescript-eslint/typescript-estree': 6.21.0(typescript@5.7.2)
- eslint: 8.57.0
- semver: 7.6.2
+ eslint: 8.57.1
+ semver: 7.6.3
transitivePeerDependencies:
- supports-color
- typescript
- '@typescript-eslint/utils@7.16.0(eslint@8.57.0)(typescript@5.5.3)':
+ '@typescript-eslint/utils@7.18.0(eslint@8.57.1)(typescript@5.7.2)':
dependencies:
- '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0)
- '@typescript-eslint/scope-manager': 7.16.0
- '@typescript-eslint/types': 7.16.0
- '@typescript-eslint/typescript-estree': 7.16.0(typescript@5.5.3)
- eslint: 8.57.0
+ '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1)
+ '@typescript-eslint/scope-manager': 7.18.0
+ '@typescript-eslint/types': 7.18.0
+ '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.7.2)
+ eslint: 8.57.1
transitivePeerDependencies:
- supports-color
- typescript
- '@typescript-eslint/utils@8.18.2(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2)':
+ '@typescript-eslint/utils@8.19.1(eslint@9.17.0(jiti@1.21.7))(typescript@5.7.2)':
dependencies:
- '@eslint-community/eslint-utils': 4.4.0(eslint@9.17.0(jiti@1.21.6))
- '@typescript-eslint/scope-manager': 8.18.2
- '@typescript-eslint/types': 8.18.2
- '@typescript-eslint/typescript-estree': 8.18.2(typescript@5.7.2)
- eslint: 9.17.0(jiti@1.21.6)
+ '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0(jiti@1.21.7))
+ '@typescript-eslint/scope-manager': 8.19.1
+ '@typescript-eslint/types': 8.19.1
+ '@typescript-eslint/typescript-estree': 8.19.1(typescript@5.7.2)
+ eslint: 9.17.0(jiti@1.21.7)
typescript: 5.7.2
transitivePeerDependencies:
- supports-color
@@ -9701,116 +10178,137 @@ snapshots:
'@typescript-eslint/types': 6.21.0
eslint-visitor-keys: 3.4.3
- '@typescript-eslint/visitor-keys@7.16.0':
+ '@typescript-eslint/visitor-keys@7.18.0':
dependencies:
- '@typescript-eslint/types': 7.16.0
+ '@typescript-eslint/types': 7.18.0
eslint-visitor-keys: 3.4.3
- '@typescript-eslint/visitor-keys@8.18.2':
+ '@typescript-eslint/visitor-keys@8.19.1':
dependencies:
- '@typescript-eslint/types': 8.18.2
+ '@typescript-eslint/types': 8.19.1
eslint-visitor-keys: 4.2.0
- '@ungap/structured-clone@1.2.0': {}
+ '@ungap/structured-clone@1.2.1': {}
- '@vitejs/plugin-react-swc@3.7.0(vite@5.4.11(@types/node@20.14.10)(terser@5.31.2))':
+ '@vitejs/plugin-react-swc@3.7.2(@swc/helpers@0.5.15)(vite@5.4.11(@types/node@20.17.12)(terser@5.37.0))':
dependencies:
- '@swc/core': 1.6.13
- vite: 5.4.11(@types/node@20.14.10)(terser@5.31.2)
+ '@swc/core': 1.10.6(@swc/helpers@0.5.15)
+ vite: 5.4.11(@types/node@20.17.12)(terser@5.37.0)
transitivePeerDependencies:
- '@swc/helpers'
- '@vitejs/plugin-react@4.3.1(vite@5.3.5(@types/node@20.14.10)(terser@5.31.2))':
+ '@vitejs/plugin-react@4.3.4(vite@5.4.11(@types/node@20.17.12)(terser@5.37.0))':
dependencies:
- '@babel/core': 7.24.7
- '@babel/plugin-transform-react-jsx-self': 7.24.7(@babel/core@7.24.7)
- '@babel/plugin-transform-react-jsx-source': 7.24.7(@babel/core@7.24.7)
+ '@babel/core': 7.26.0
+ '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.0)
'@types/babel__core': 7.20.5
react-refresh: 0.14.2
- vite: 5.3.5(@types/node@20.14.10)(terser@5.31.2)
+ vite: 5.4.11(@types/node@20.17.12)(terser@5.37.0)
transitivePeerDependencies:
- supports-color
- '@webassemblyjs/ast@1.12.1':
+ '@webassemblyjs/ast@1.14.1':
dependencies:
- '@webassemblyjs/helper-numbers': 1.11.6
- '@webassemblyjs/helper-wasm-bytecode': 1.11.6
+ '@webassemblyjs/helper-numbers': 1.13.2
+ '@webassemblyjs/helper-wasm-bytecode': 1.13.2
- '@webassemblyjs/floating-point-hex-parser@1.11.6': {}
+ '@webassemblyjs/floating-point-hex-parser@1.13.2': {}
- '@webassemblyjs/helper-api-error@1.11.6': {}
+ '@webassemblyjs/helper-api-error@1.13.2': {}
- '@webassemblyjs/helper-buffer@1.12.1': {}
+ '@webassemblyjs/helper-buffer@1.14.1': {}
- '@webassemblyjs/helper-numbers@1.11.6':
+ '@webassemblyjs/helper-numbers@1.13.2':
dependencies:
- '@webassemblyjs/floating-point-hex-parser': 1.11.6
- '@webassemblyjs/helper-api-error': 1.11.6
+ '@webassemblyjs/floating-point-hex-parser': 1.13.2
+ '@webassemblyjs/helper-api-error': 1.13.2
'@xtuc/long': 4.2.2
- '@webassemblyjs/helper-wasm-bytecode@1.11.6': {}
+ '@webassemblyjs/helper-wasm-bytecode@1.13.2': {}
- '@webassemblyjs/helper-wasm-section@1.12.1':
+ '@webassemblyjs/helper-wasm-section@1.14.1':
dependencies:
- '@webassemblyjs/ast': 1.12.1
- '@webassemblyjs/helper-buffer': 1.12.1
- '@webassemblyjs/helper-wasm-bytecode': 1.11.6
- '@webassemblyjs/wasm-gen': 1.12.1
+ '@webassemblyjs/ast': 1.14.1
+ '@webassemblyjs/helper-buffer': 1.14.1
+ '@webassemblyjs/helper-wasm-bytecode': 1.13.2
+ '@webassemblyjs/wasm-gen': 1.14.1
- '@webassemblyjs/ieee754@1.11.6':
+ '@webassemblyjs/ieee754@1.13.2':
dependencies:
'@xtuc/ieee754': 1.2.0
- '@webassemblyjs/leb128@1.11.6':
+ '@webassemblyjs/leb128@1.13.2':
dependencies:
'@xtuc/long': 4.2.2
- '@webassemblyjs/utf8@1.11.6': {}
+ '@webassemblyjs/utf8@1.13.2': {}
- '@webassemblyjs/wasm-edit@1.12.1':
+ '@webassemblyjs/wasm-edit@1.14.1':
dependencies:
- '@webassemblyjs/ast': 1.12.1
- '@webassemblyjs/helper-buffer': 1.12.1
- '@webassemblyjs/helper-wasm-bytecode': 1.11.6
- '@webassemblyjs/helper-wasm-section': 1.12.1
- '@webassemblyjs/wasm-gen': 1.12.1
- '@webassemblyjs/wasm-opt': 1.12.1
- '@webassemblyjs/wasm-parser': 1.12.1
- '@webassemblyjs/wast-printer': 1.12.1
+ '@webassemblyjs/ast': 1.14.1
+ '@webassemblyjs/helper-buffer': 1.14.1
+ '@webassemblyjs/helper-wasm-bytecode': 1.13.2
+ '@webassemblyjs/helper-wasm-section': 1.14.1
+ '@webassemblyjs/wasm-gen': 1.14.1
+ '@webassemblyjs/wasm-opt': 1.14.1
+ '@webassemblyjs/wasm-parser': 1.14.1
+ '@webassemblyjs/wast-printer': 1.14.1
- '@webassemblyjs/wasm-gen@1.12.1':
+ '@webassemblyjs/wasm-gen@1.14.1':
dependencies:
- '@webassemblyjs/ast': 1.12.1
- '@webassemblyjs/helper-wasm-bytecode': 1.11.6
- '@webassemblyjs/ieee754': 1.11.6
- '@webassemblyjs/leb128': 1.11.6
- '@webassemblyjs/utf8': 1.11.6
+ '@webassemblyjs/ast': 1.14.1
+ '@webassemblyjs/helper-wasm-bytecode': 1.13.2
+ '@webassemblyjs/ieee754': 1.13.2
+ '@webassemblyjs/leb128': 1.13.2
+ '@webassemblyjs/utf8': 1.13.2
- '@webassemblyjs/wasm-opt@1.12.1':
+ '@webassemblyjs/wasm-opt@1.14.1':
dependencies:
- '@webassemblyjs/ast': 1.12.1
- '@webassemblyjs/helper-buffer': 1.12.1
- '@webassemblyjs/wasm-gen': 1.12.1
- '@webassemblyjs/wasm-parser': 1.12.1
+ '@webassemblyjs/ast': 1.14.1
+ '@webassemblyjs/helper-buffer': 1.14.1
+ '@webassemblyjs/wasm-gen': 1.14.1
+ '@webassemblyjs/wasm-parser': 1.14.1
- '@webassemblyjs/wasm-parser@1.12.1':
+ '@webassemblyjs/wasm-parser@1.14.1':
dependencies:
- '@webassemblyjs/ast': 1.12.1
- '@webassemblyjs/helper-api-error': 1.11.6
- '@webassemblyjs/helper-wasm-bytecode': 1.11.6
- '@webassemblyjs/ieee754': 1.11.6
- '@webassemblyjs/leb128': 1.11.6
- '@webassemblyjs/utf8': 1.11.6
+ '@webassemblyjs/ast': 1.14.1
+ '@webassemblyjs/helper-api-error': 1.13.2
+ '@webassemblyjs/helper-wasm-bytecode': 1.13.2
+ '@webassemblyjs/ieee754': 1.13.2
+ '@webassemblyjs/leb128': 1.13.2
+ '@webassemblyjs/utf8': 1.13.2
- '@webassemblyjs/wast-printer@1.12.1':
+ '@webassemblyjs/wast-printer@1.14.1':
dependencies:
- '@webassemblyjs/ast': 1.12.1
+ '@webassemblyjs/ast': 1.14.1
'@xtuc/long': 4.2.2
'@xtuc/ieee754@1.2.0': {}
'@xtuc/long@4.2.2': {}
+ '@xyflow/react@12.3.6(@types/react@18.2.38)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
+ dependencies:
+ '@xyflow/system': 0.0.47
+ classcat: 5.0.5
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ zustand: 4.5.6(@types/react@18.2.38)(react@18.2.0)
+ transitivePeerDependencies:
+ - '@types/react'
+ - immer
+
+ '@xyflow/system@0.0.47':
+ dependencies:
+ '@types/d3-drag': 3.0.7
+ '@types/d3-selection': 3.0.11
+ '@types/d3-transition': 3.0.9
+ '@types/d3-zoom': 3.0.8
+ d3-drag: 3.0.0
+ d3-selection: 3.0.0
+ d3-zoom: 3.0.0
+
'@zxing/text-encoding@0.9.0':
optional: true
@@ -9835,23 +10333,21 @@ snapshots:
mime-types: 2.1.35
negotiator: 0.6.3
- acorn-import-attributes@1.9.5(acorn@8.12.1):
- dependencies:
- acorn: 8.12.1
-
- acorn-jsx@5.3.2(acorn@8.12.1):
- dependencies:
- acorn: 8.12.1
-
acorn-jsx@5.3.2(acorn@8.14.0):
dependencies:
acorn: 8.14.0
- acorn-walk@8.3.3:
+ acorn-loose@6.1.0:
dependencies:
- acorn: 8.12.1
+ acorn: 6.4.2
- acorn@8.12.1: {}
+ acorn-walk@6.2.0: {}
+
+ acorn-walk@8.3.4:
+ dependencies:
+ acorn: 8.14.0
+
+ acorn@6.4.2: {}
acorn@8.14.0: {}
@@ -9884,10 +10380,19 @@ snapshots:
optionalDependencies:
ajv: 8.12.0
+ ajv-formats@2.1.1(ajv@8.17.1):
+ optionalDependencies:
+ ajv: 8.17.1
+
ajv-keywords@3.5.2(ajv@6.12.6):
dependencies:
ajv: 6.12.6
+ ajv-keywords@5.1.0(ajv@8.17.1):
+ dependencies:
+ ajv: 8.17.1
+ fast-deep-equal: 3.1.3
+
ajv@6.12.6:
dependencies:
fast-deep-equal: 3.1.3
@@ -9902,6 +10407,13 @@ snapshots:
require-from-string: 2.0.2
uri-js: 4.4.1
+ ajv@8.17.1:
+ dependencies:
+ fast-deep-equal: 3.1.3
+ fast-uri: 3.0.5
+ json-schema-traverse: 1.0.0
+ require-from-string: 2.0.2
+
ansi-colors@4.1.3: {}
ansi-escapes@4.3.2:
@@ -9912,7 +10424,7 @@ snapshots:
ansi-regex@5.0.1: {}
- ansi-regex@6.0.1: {}
+ ansi-regex@6.1.0: {}
ansi-styles@3.2.1:
dependencies:
@@ -9926,55 +10438,55 @@ snapshots:
ansi-styles@6.2.1: {}
- antd@5.20.6(date-fns@2.30.0)(luxon@3.4.4)(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
+ antd@5.23.0(date-fns@2.30.0)(luxon@3.5.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
dependencies:
- '@ant-design/colors': 7.1.0
- '@ant-design/cssinjs': 1.21.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- '@ant-design/cssinjs-utils': 1.0.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- '@ant-design/icons': 5.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ '@ant-design/colors': 7.2.0
+ '@ant-design/cssinjs': 1.22.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ '@ant-design/cssinjs-utils': 1.1.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ '@ant-design/fast-color': 2.0.6
+ '@ant-design/icons': 5.5.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
'@ant-design/react-slick': 1.1.2(react@18.2.0)
- '@babel/runtime': 7.25.0
- '@ctrl/tinycolor': 3.6.1
+ '@babel/runtime': 7.26.0
'@rc-component/color-picker': 2.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
'@rc-component/mutate-observer': 1.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
'@rc-component/qrcode': 1.0.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
'@rc-component/tour': 1.15.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- '@rc-component/trigger': 2.2.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ '@rc-component/trigger': 2.2.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
classnames: 2.5.1
copy-to-clipboard: 3.3.3
dayjs: 1.11.13
- rc-cascader: 3.28.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- rc-checkbox: 3.3.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- rc-collapse: 3.7.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- rc-dialog: 9.5.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-cascader: 3.32.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-checkbox: 3.5.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-collapse: 3.9.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-dialog: 9.6.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
rc-drawer: 7.2.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- rc-dropdown: 4.2.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- rc-field-form: 2.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- rc-image: 7.9.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- rc-input: 1.6.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- rc-input-number: 9.2.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- rc-mentions: 2.15.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- rc-menu: 9.14.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- rc-motion: 2.9.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- rc-notification: 5.6.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- rc-pagination: 4.2.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- rc-picker: 4.6.14(date-fns@2.30.0)(dayjs@1.11.13)(luxon@3.4.4)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-dropdown: 4.2.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-field-form: 2.7.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-image: 7.11.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-input: 1.7.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-input-number: 9.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-mentions: 2.19.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-menu: 9.16.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-motion: 2.9.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-notification: 5.6.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-pagination: 5.0.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-picker: 4.9.2(date-fns@2.30.0)(dayjs@1.11.13)(luxon@3.5.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
rc-progress: 4.0.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
rc-rate: 2.13.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- rc-resize-observer: 1.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- rc-segmented: 2.3.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- rc-select: 14.15.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- rc-slider: 11.1.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-resize-observer: 1.4.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-segmented: 2.7.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-select: 14.16.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-slider: 11.1.8(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
rc-steps: 6.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
rc-switch: 4.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- rc-table: 7.45.7(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- rc-tabs: 15.1.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- rc-textarea: 1.8.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- rc-tooltip: 6.2.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- rc-tree: 5.9.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- rc-tree-select: 5.23.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- rc-upload: 4.7.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-table: 7.50.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-tabs: 15.5.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-textarea: 1.9.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-tooltip: 6.3.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-tree: 5.12.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-tree-select: 5.26.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-upload: 4.8.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-util: 5.44.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
scroll-into-view-if-needed: 3.1.0
@@ -10022,7 +10534,7 @@ snapshots:
archiver@5.3.2:
dependencies:
archiver-utils: 2.1.0
- async: 3.2.5
+ async: 3.2.6
buffer-crc32: 0.2.13
readable-stream: 3.6.2
readdir-glob: 1.1.3
@@ -10049,25 +10561,25 @@ snapshots:
array-timsort@1.0.3: {}
- array-tree-filter@2.1.0: {}
-
array-union@2.1.0: {}
asap@2.0.6: {}
async@0.2.10: {}
- async@3.2.5: {}
+ async@3.2.6: {}
asynckit@0.4.0: {}
+ attr-accept@2.2.5: {}
+
autoprefixer@10.4.20(postcss@8.4.49):
dependencies:
browserslist: 4.24.3
caniuse-lite: 1.0.30001690
fraction.js: 4.3.7
normalize-range: 0.1.2
- picocolors: 1.0.1
+ picocolors: 1.1.1
postcss: 8.4.49
postcss-value-parser: 4.2.0
@@ -10075,21 +10587,21 @@ snapshots:
dependencies:
possible-typed-array-names: 1.0.0
- axios@1.7.3:
+ axios@1.7.9:
dependencies:
- follow-redirects: 1.15.6
- form-data: 4.0.0
+ follow-redirects: 1.15.9
+ form-data: 4.0.1
proxy-from-env: 1.1.0
transitivePeerDependencies:
- debug
- babel-jest@29.7.0(@babel/core@7.24.7):
+ babel-jest@29.7.0(@babel/core@7.26.0):
dependencies:
- '@babel/core': 7.24.7
+ '@babel/core': 7.26.0
'@jest/transform': 29.7.0
'@types/babel__core': 7.20.5
babel-plugin-istanbul: 6.1.1
- babel-preset-jest: 29.6.3(@babel/core@7.24.7)
+ babel-preset-jest: 29.6.3(@babel/core@7.26.0)
chalk: 4.1.2
graceful-fs: 4.2.11
slash: 3.0.0
@@ -10098,7 +10610,7 @@ snapshots:
babel-plugin-istanbul@6.1.1:
dependencies:
- '@babel/helper-plugin-utils': 7.24.7
+ '@babel/helper-plugin-utils': 7.25.9
'@istanbuljs/load-nyc-config': 1.1.0
'@istanbuljs/schema': 0.1.3
istanbul-lib-instrument: 5.2.1
@@ -10108,32 +10620,35 @@ snapshots:
babel-plugin-jest-hoist@29.6.3:
dependencies:
- '@babel/template': 7.24.7
- '@babel/types': 7.24.7
+ '@babel/template': 7.25.9
+ '@babel/types': 7.26.3
'@types/babel__core': 7.20.5
'@types/babel__traverse': 7.20.6
- babel-preset-current-node-syntax@1.0.1(@babel/core@7.24.7):
+ babel-preset-current-node-syntax@1.1.0(@babel/core@7.26.0):
dependencies:
- '@babel/core': 7.24.7
- '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.7)
- '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.24.7)
- '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.7)
- '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.7)
- '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.7)
- '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.7)
- '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.7)
- '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.7)
- '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.7)
- '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.7)
- '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.7)
- '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.7)
+ '@babel/core': 7.26.0
+ '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.26.0)
+ '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.26.0)
+ '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.26.0)
+ '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.26.0)
+ '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.0)
+ '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.26.0)
+ '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.26.0)
+ '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.26.0)
+ '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.26.0)
+ '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.26.0)
+ '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.26.0)
+ '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.26.0)
+ '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.26.0)
+ '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.26.0)
+ '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.26.0)
- babel-preset-jest@29.6.3(@babel/core@7.24.7):
+ babel-preset-jest@29.6.3(@babel/core@7.26.0):
dependencies:
- '@babel/core': 7.24.7
+ '@babel/core': 7.26.0
babel-plugin-jest-hoist: 29.6.3
- babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.7)
+ babel-preset-current-node-syntax: 1.1.0(@babel/core@7.26.0)
balanced-match@1.0.2: {}
@@ -10162,7 +10677,7 @@ snapshots:
bluebird@3.4.7: {}
- body-parser@1.20.2:
+ body-parser@1.20.3:
dependencies:
bytes: 3.1.2
content-type: 1.0.5
@@ -10172,7 +10687,7 @@ snapshots:
http-errors: 2.0.0
iconv-lite: 0.4.24
on-finished: 2.4.1
- qs: 6.11.0
+ qs: 6.13.0
raw-body: 2.5.2
type-is: 1.6.18
unpipe: 1.0.0
@@ -10200,17 +10715,10 @@ snapshots:
browser-or-node@2.1.1: {}
- browserslist@4.23.2:
- dependencies:
- caniuse-lite: 1.0.30001641
- electron-to-chromium: 1.4.823
- node-releases: 2.0.14
- update-browserslist-db: 1.1.0(browserslist@4.23.2)
-
browserslist@4.24.3:
dependencies:
caniuse-lite: 1.0.30001690
- electron-to-chromium: 1.5.76
+ electron-to-chromium: 1.5.79
node-releases: 2.0.19
update-browserslist-db: 1.1.1(browserslist@4.24.3)
@@ -10237,16 +10745,21 @@ snapshots:
base64-js: 1.5.1
ieee754: 1.2.1
+ buffer@6.0.3:
+ dependencies:
+ base64-js: 1.5.1
+ ieee754: 1.2.1
+
buffers@0.1.1: {}
- bullmq@5.12.0:
+ bullmq@5.34.8:
dependencies:
cron-parser: 4.9.0
- ioredis: 5.4.1
- msgpackr: 1.11.0
+ ioredis: 5.4.2
+ msgpackr: 1.11.2
node-abort-controller: 3.1.1
- semver: 7.6.2
- tslib: 2.6.3
+ semver: 7.6.3
+ tslib: 2.8.1
uuid: 9.0.1
transitivePeerDependencies:
- supports-color
@@ -10264,14 +10777,23 @@ snapshots:
cac@6.7.14: {}
- call-bind@1.0.7:
+ call-bind-apply-helpers@1.0.1:
dependencies:
- es-define-property: 1.0.0
es-errors: 1.3.0
function-bind: 1.1.2
- get-intrinsic: 1.2.4
+
+ call-bind@1.0.8:
+ dependencies:
+ call-bind-apply-helpers: 1.0.1
+ es-define-property: 1.0.1
+ get-intrinsic: 1.2.7
set-function-length: 1.2.2
+ call-bound@1.0.3:
+ dependencies:
+ call-bind-apply-helpers: 1.0.1
+ get-intrinsic: 1.2.7
+
callsites@3.1.0: {}
camelcase-css@2.0.1: {}
@@ -10280,29 +10802,23 @@ snapshots:
camelcase@6.3.0: {}
- caniuse-lite@1.0.30001641: {}
-
caniuse-lite@1.0.30001690: {}
chainsaw@0.1.0:
dependencies:
traverse: 0.3.9
- chalk@2.4.2:
- dependencies:
- ansi-styles: 3.2.1
- escape-string-regexp: 1.0.5
- supports-color: 5.5.0
-
chalk@4.1.2:
dependencies:
ansi-styles: 4.3.0
supports-color: 7.2.0
- chalk@5.3.0: {}
+ chalk@5.4.1: {}
char-regex@1.0.2: {}
+ character-entities@2.0.2: {}
+
chardet@0.7.0: {}
chokidar-cli@3.0.0:
@@ -10332,12 +10848,14 @@ snapshots:
ci-info@3.9.0: {}
- cjs-module-lexer@1.3.1: {}
+ cjs-module-lexer@1.4.1: {}
class-variance-authority@0.7.1:
dependencies:
clsx: 2.1.1
+ classcat@5.0.5: {}
+
classnames@2.5.1: {}
cli-cursor@3.1.0:
@@ -10415,7 +10933,9 @@ snapshots:
commander@4.1.1: {}
- comment-json@4.2.3:
+ commander@8.3.0: {}
+
+ comment-json@4.2.5:
dependencies:
array-timsort: 1.0.3
core-util-is: 1.0.3
@@ -10449,7 +10969,7 @@ snapshots:
date-fns: 2.30.0
lodash: 4.17.21
rxjs: 7.8.1
- shell-quote: 1.8.1
+ shell-quote: 1.8.2
spawn-command: 0.0.2
supports-color: 8.1.1
tree-kill: 1.2.2
@@ -10469,9 +10989,9 @@ snapshots:
cookie-signature@1.0.6: {}
- cookie@0.4.2: {}
+ cookie@0.7.1: {}
- cookie@0.6.0: {}
+ cookie@0.7.2: {}
cookiejar@2.1.4: {}
@@ -10490,23 +11010,14 @@ snapshots:
object-assign: 4.1.1
vary: 1.1.2
- cosmiconfig@8.3.6(typescript@5.3.3):
+ cosmiconfig@8.3.6(typescript@5.7.2):
dependencies:
import-fresh: 3.3.0
js-yaml: 4.1.0
parse-json: 5.2.0
path-type: 4.0.0
optionalDependencies:
- typescript: 5.3.3
-
- cosmiconfig@8.3.6(typescript@5.5.3):
- dependencies:
- import-fresh: 3.3.0
- js-yaml: 4.1.0
- parse-json: 5.2.0
- path-type: 4.0.0
- optionalDependencies:
- typescript: 5.5.3
+ typescript: 5.7.2
crc-32@1.2.2: {}
@@ -10515,13 +11026,13 @@ snapshots:
crc-32: 1.2.2
readable-stream: 3.6.2
- create-jest@29.7.0(@types/node@20.14.10)(ts-node@10.9.2(@swc/core@1.6.13)(@types/node@20.14.10)(typescript@5.7.2)):
+ create-jest@29.7.0(@types/node@20.17.12)(ts-node@10.9.2(@swc/core@1.10.6)(@types/node@20.17.12)(typescript@5.7.2)):
dependencies:
'@jest/types': 29.6.3
chalk: 4.1.2
exit: 0.1.2
graceful-fs: 4.2.11
- jest-config: 29.7.0(@types/node@20.14.10)(ts-node@10.9.2(@swc/core@1.6.13)(@types/node@20.14.10)(typescript@5.7.2))
+ jest-config: 29.7.0(@types/node@20.17.12)(ts-node@10.9.2(@swc/core@1.10.6)(@types/node@20.17.12)(typescript@5.7.2))
jest-util: 29.7.0
prompts: 2.4.2
transitivePeerDependencies:
@@ -10534,18 +11045,17 @@ snapshots:
cron-parser@4.9.0:
dependencies:
- luxon: 3.4.4
+ luxon: 3.5.0
- cron@3.1.7:
+ cron@3.2.1:
dependencies:
'@types/luxon': 3.4.2
- luxon: 3.4.4
+ luxon: 3.5.0
- cross-spawn@7.0.3:
+ cron@3.3.2:
dependencies:
- path-key: 3.1.1
- shebang-command: 2.0.0
- which: 2.0.2
+ '@types/luxon': 3.4.2
+ luxon: 3.5.0
cross-spawn@7.0.6:
dependencies:
@@ -10563,9 +11073,63 @@ snapshots:
custom-error-instance@2.1.1: {}
+ d3-array@3.2.4:
+ dependencies:
+ internmap: 2.0.3
+
+ d3-color@3.1.0: {}
+
+ d3-dag@1.1.0:
+ dependencies:
+ d3-array: 3.2.4
+ javascript-lp-solver: 0.4.24
+ quadprog: 1.6.1
+ stringify-object: 5.0.0
+
+ d3-dispatch@3.0.1: {}
+
+ d3-drag@3.0.0:
+ dependencies:
+ d3-dispatch: 3.0.1
+ d3-selection: 3.0.0
+
+ d3-ease@3.0.1: {}
+
+ d3-hierarchy@3.1.2: {}
+
+ d3-interpolate@3.0.1:
+ dependencies:
+ d3-color: 3.1.0
+
+ d3-selection@3.0.0: {}
+
+ d3-timer@3.0.1: {}
+
+ d3-transition@3.0.1(d3-selection@3.0.0):
+ dependencies:
+ d3-color: 3.1.0
+ d3-dispatch: 3.0.1
+ d3-ease: 3.0.1
+ d3-interpolate: 3.0.1
+ d3-selection: 3.0.0
+ d3-timer: 3.0.1
+
+ d3-zoom@3.0.0:
+ dependencies:
+ d3-dispatch: 3.0.1
+ d3-drag: 3.0.0
+ d3-interpolate: 3.0.1
+ d3-selection: 3.0.0
+ d3-transition: 3.0.1(d3-selection@3.0.0)
+
+ dagre@0.8.5:
+ dependencies:
+ graphlib: 2.1.8
+ lodash: 4.17.21
+
date-fns@2.30.0:
dependencies:
- '@babel/runtime': 7.25.0
+ '@babel/runtime': 7.26.0
dayjs@1.11.13: {}
@@ -10573,9 +11137,9 @@ snapshots:
dependencies:
ms: 2.0.0
- debug@4.3.5:
+ debug@4.3.7:
dependencies:
- ms: 2.1.2
+ ms: 2.1.3
debug@4.4.0:
dependencies:
@@ -10583,12 +11147,18 @@ snapshots:
decamelize@1.2.0: {}
+ decode-named-character-reference@1.0.2:
+ dependencies:
+ character-entities: 2.0.2
+
decode-uri-component@0.2.2: {}
dedent@1.5.3: {}
deep-is@0.1.4: {}
+ deepmerge@1.5.2: {}
+
deepmerge@4.3.1: {}
defaults@1.0.4:
@@ -10602,9 +11172,9 @@ snapshots:
define-data-property@1.1.4:
dependencies:
- es-define-property: 1.0.0
+ es-define-property: 1.0.1
es-errors: 1.3.0
- gopd: 1.0.1
+ gopd: 1.2.0
delayed-stream@1.0.0: {}
@@ -10612,6 +11182,8 @@ snapshots:
depd@2.0.0: {}
+ dequal@2.0.3: {}
+
destroy@1.2.0: {}
detect-libc@2.0.3: {}
@@ -10629,6 +11201,8 @@ snapshots:
diff@4.0.2: {}
+ diff@5.2.0: {}
+
dir-glob@3.0.1:
dependencies:
path-type: 4.0.0
@@ -10642,7 +11216,7 @@ snapshots:
dot-case@3.0.4:
dependencies:
no-case: 3.0.4
- tslib: 2.6.3
+ tslib: 2.8.1
dotenv-expand@10.0.0: {}
@@ -10650,6 +11224,12 @@ snapshots:
dotenv@16.4.7: {}
+ dunder-proto@1.0.1:
+ dependencies:
+ call-bind-apply-helpers: 1.0.1
+ es-errors: 1.3.0
+ gopd: 1.2.0
+
duplexer2@0.1.4:
dependencies:
readable-stream: 2.3.8
@@ -10664,11 +11244,11 @@ snapshots:
ejs@3.1.10:
dependencies:
- jake: 10.9.1
+ jake: 10.9.2
- electron-to-chromium@1.4.823: {}
+ electron-to-chromium@1.5.79: {}
- electron-to-chromium@1.5.76: {}
+ elkjs@0.9.3: {}
emittery@0.13.1: {}
@@ -10680,6 +11260,8 @@ snapshots:
encodeurl@1.0.2: {}
+ encodeurl@2.0.0: {}
+
encoding-down@6.3.0:
dependencies:
abstract-leveldown: 6.3.0
@@ -10693,16 +11275,16 @@ snapshots:
engine.io-parser@5.2.3: {}
- engine.io@6.5.5:
+ engine.io@6.6.2:
dependencies:
'@types/cookie': 0.4.1
'@types/cors': 2.8.17
- '@types/node': 20.14.10
+ '@types/node': 20.17.12
accepts: 1.3.8
base64id: 2.0.0
- cookie: 0.4.2
+ cookie: 0.7.2
cors: 2.8.5
- debug: 4.3.5
+ debug: 4.3.7
engine.io-parser: 5.2.3
ws: 8.17.1
transitivePeerDependencies:
@@ -10710,13 +11292,22 @@ snapshots:
- supports-color
- utf-8-validate
- enhanced-resolve@5.17.0:
+ enhanced-resolve@2.3.0:
+ dependencies:
+ graceful-fs: 4.2.11
+ memory-fs: 0.3.0
+ object-assign: 4.1.1
+ tapable: 0.2.9
+
+ enhanced-resolve@5.18.0:
dependencies:
graceful-fs: 4.2.11
tapable: 2.2.1
entities@4.5.0: {}
+ err-code@3.0.1: {}
+
errno@0.1.8:
dependencies:
prr: 1.0.1
@@ -10725,13 +11316,15 @@ snapshots:
dependencies:
is-arrayish: 0.2.1
- es-define-property@1.0.0:
- dependencies:
- get-intrinsic: 1.2.4
+ es-define-property@1.0.1: {}
es-errors@1.3.0: {}
- es-module-lexer@1.5.4: {}
+ es-module-lexer@1.6.0: {}
+
+ es-object-atoms@1.0.0:
+ dependencies:
+ es-errors: 1.3.0
esbuild@0.21.5:
optionalDependencies:
@@ -10787,8 +11380,6 @@ snapshots:
'@esbuild/win32-ia32': 0.24.2
'@esbuild/win32-x64': 0.24.2
- escalade@3.1.2: {}
-
escalade@3.2.0: {}
escape-html@1.0.3: {}
@@ -10799,35 +11390,35 @@ snapshots:
escape-string-regexp@4.0.0: {}
- eslint-config-prettier@9.1.0(eslint@8.57.0):
+ eslint-config-prettier@9.1.0(eslint@8.57.1):
dependencies:
- eslint: 8.57.0
+ eslint: 8.57.1
- eslint-plugin-prettier@5.1.3(@types/eslint@8.56.10)(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.3.2):
+ eslint-plugin-prettier@5.2.1(@types/eslint@9.6.1)(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.4.2):
dependencies:
- eslint: 8.57.0
- prettier: 3.3.2
+ eslint: 8.57.1
+ prettier: 3.4.2
prettier-linter-helpers: 1.0.0
- synckit: 0.8.8
+ synckit: 0.9.2
optionalDependencies:
- '@types/eslint': 8.56.10
- eslint-config-prettier: 9.1.0(eslint@8.57.0)
+ '@types/eslint': 9.6.1
+ eslint-config-prettier: 9.1.0(eslint@8.57.1)
- eslint-plugin-react-hooks@4.6.2(eslint@8.57.0):
+ eslint-plugin-react-hooks@4.6.2(eslint@8.57.1):
dependencies:
- eslint: 8.57.0
+ eslint: 8.57.1
- eslint-plugin-react-hooks@5.1.0(eslint@9.17.0(jiti@1.21.6)):
+ eslint-plugin-react-hooks@5.1.0(eslint@9.17.0(jiti@1.21.7)):
dependencies:
- eslint: 9.17.0(jiti@1.21.6)
+ eslint: 9.17.0(jiti@1.21.7)
- eslint-plugin-react-refresh@0.4.16(eslint@9.17.0(jiti@1.21.6)):
+ eslint-plugin-react-refresh@0.4.16(eslint@8.57.1):
dependencies:
- eslint: 9.17.0(jiti@1.21.6)
+ eslint: 8.57.1
- eslint-plugin-react-refresh@0.4.8(eslint@8.57.0):
+ eslint-plugin-react-refresh@0.4.16(eslint@9.17.0(jiti@1.21.7)):
dependencies:
- eslint: 8.57.0
+ eslint: 9.17.0(jiti@1.21.7)
eslint-scope@5.1.1:
dependencies:
@@ -10848,19 +11439,19 @@ snapshots:
eslint-visitor-keys@4.2.0: {}
- eslint@8.57.0:
+ eslint@8.57.1:
dependencies:
- '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0)
- '@eslint-community/regexpp': 4.11.0
+ '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1)
+ '@eslint-community/regexpp': 4.12.1
'@eslint/eslintrc': 2.1.4
- '@eslint/js': 8.57.0
- '@humanwhocodes/config-array': 0.11.14
+ '@eslint/js': 8.57.1
+ '@humanwhocodes/config-array': 0.13.0
'@humanwhocodes/module-importer': 1.0.1
'@nodelib/fs.walk': 1.2.8
- '@ungap/structured-clone': 1.2.0
+ '@ungap/structured-clone': 1.2.1
ajv: 6.12.6
chalk: 4.1.2
- cross-spawn: 7.0.3
+ cross-spawn: 7.0.6
debug: 4.4.0
doctrine: 3.0.0
escape-string-regexp: 4.0.0
@@ -10875,7 +11466,7 @@ snapshots:
glob-parent: 6.0.2
globals: 13.24.0
graphemer: 1.4.0
- ignore: 5.3.1
+ ignore: 5.3.2
imurmurhash: 0.1.4
is-glob: 4.0.3
is-path-inside: 3.0.3
@@ -10891,9 +11482,9 @@ snapshots:
transitivePeerDependencies:
- supports-color
- eslint@9.17.0(jiti@1.21.6):
+ eslint@9.17.0(jiti@1.21.7):
dependencies:
- '@eslint-community/eslint-utils': 4.4.0(eslint@9.17.0(jiti@1.21.6))
+ '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0(jiti@1.21.7))
'@eslint-community/regexpp': 4.12.1
'@eslint/config-array': 0.19.1
'@eslint/core': 0.9.1
@@ -10919,7 +11510,7 @@ snapshots:
file-entry-cache: 8.0.0
find-up: 5.0.0
glob-parent: 6.0.2
- ignore: 5.3.1
+ ignore: 5.3.2
imurmurhash: 0.1.4
is-glob: 4.0.3
json-stable-stringify-without-jsonify: 1.0.1
@@ -10928,7 +11519,7 @@ snapshots:
natural-compare: 1.4.0
optionator: 0.9.4
optionalDependencies:
- jiti: 1.21.6
+ jiti: 1.21.7
transitivePeerDependencies:
- supports-color
@@ -10940,8 +11531,8 @@ snapshots:
espree@9.6.1:
dependencies:
- acorn: 8.12.1
- acorn-jsx: 5.3.2(acorn@8.12.1)
+ acorn: 8.14.0
+ acorn-jsx: 5.3.2(acorn@8.14.0)
eslint-visitor-keys: 3.4.3
esprima@4.0.1: {}
@@ -10964,6 +11555,8 @@ snapshots:
etag@1.8.1: {}
+ eventemitter3@4.0.7: {}
+
eventemitter3@5.0.1: {}
events@3.3.0: {}
@@ -10982,7 +11575,7 @@ snapshots:
execa@5.1.1:
dependencies:
- cross-spawn: 7.0.3
+ cross-spawn: 7.0.6
get-stream: 6.0.1
human-signals: 2.1.0
is-stream: 2.0.1
@@ -11002,34 +11595,34 @@ snapshots:
jest-message-util: 29.7.0
jest-util: 29.7.0
- express@4.19.2:
+ express@4.21.2:
dependencies:
accepts: 1.3.8
array-flatten: 1.1.1
- body-parser: 1.20.2
+ body-parser: 1.20.3
content-disposition: 0.5.4
content-type: 1.0.5
- cookie: 0.6.0
+ cookie: 0.7.1
cookie-signature: 1.0.6
debug: 2.6.9
depd: 2.0.0
- encodeurl: 1.0.2
+ encodeurl: 2.0.0
escape-html: 1.0.3
etag: 1.8.1
- finalhandler: 1.2.0
+ finalhandler: 1.3.1
fresh: 0.5.2
http-errors: 2.0.0
- merge-descriptors: 1.0.1
+ merge-descriptors: 1.0.3
methods: 1.1.2
on-finished: 2.4.1
parseurl: 1.3.3
- path-to-regexp: 0.1.7
+ path-to-regexp: 0.1.12
proxy-addr: 2.0.7
- qs: 6.11.0
+ qs: 6.13.0
range-parser: 1.2.1
safe-buffer: 5.2.1
- send: 0.18.0
- serve-static: 1.15.0
+ send: 0.19.0
+ serve-static: 1.16.2
setprototypeof: 1.2.0
statuses: 2.0.1
type-is: 1.6.18
@@ -11053,13 +11646,13 @@ snapshots:
fast-diff@1.3.0: {}
- fast-glob@3.3.2:
+ fast-glob@3.3.3:
dependencies:
'@nodelib/fs.stat': 2.0.5
'@nodelib/fs.walk': 1.2.8
glob-parent: 5.1.2
merge2: 1.4.1
- micromatch: 4.0.7
+ micromatch: 4.0.8
fast-json-stable-stringify@2.1.0: {}
@@ -11067,15 +11660,17 @@ snapshots:
fast-safe-stringify@2.1.1: {}
+ fast-uri@3.0.5: {}
+
fast-xml-parser@4.4.1:
dependencies:
strnum: 1.0.5
- fast-xml-parser@4.5.0:
+ fast-xml-parser@4.5.1:
dependencies:
strnum: 1.0.5
- fastq@1.17.1:
+ fastq@1.18.0:
dependencies:
reusify: 1.0.4
@@ -11099,6 +11694,10 @@ snapshots:
dependencies:
flat-cache: 4.0.1
+ file-selector@2.1.2:
+ dependencies:
+ tslib: 2.8.1
+
filelist@1.0.4:
dependencies:
minimatch: 5.1.6
@@ -11109,10 +11708,10 @@ snapshots:
filter-obj@1.1.0: {}
- finalhandler@1.2.0:
+ finalhandler@1.3.1:
dependencies:
debug: 2.6.9
- encodeurl: 1.0.2
+ encodeurl: 2.0.0
escape-html: 1.0.3
on-finished: 2.4.1
parseurl: 1.3.3
@@ -11137,51 +11736,51 @@ snapshots:
flat-cache@3.2.0:
dependencies:
- flatted: 3.3.1
+ flatted: 3.3.2
keyv: 4.5.4
rimraf: 3.0.2
flat-cache@4.0.1:
dependencies:
- flatted: 3.3.1
+ flatted: 3.3.2
keyv: 4.5.4
- flatted@3.3.1: {}
+ flatted@3.3.2: {}
fluent-ffmpeg@2.1.3:
dependencies:
async: 0.2.10
which: 1.3.1
- follow-redirects@1.15.6: {}
+ follow-redirects@1.15.9: {}
for-each@0.3.3:
dependencies:
is-callable: 1.2.7
- foreground-child@3.2.1:
+ foreground-child@3.3.0:
dependencies:
- cross-spawn: 7.0.3
+ cross-spawn: 7.0.6
signal-exit: 4.1.0
- fork-ts-checker-webpack-plugin@9.0.2(typescript@5.3.3)(webpack@5.92.1(@swc/core@1.6.13)):
+ fork-ts-checker-webpack-plugin@9.0.2(typescript@5.7.2)(webpack@5.97.1(@swc/core@1.10.6)):
dependencies:
- '@babel/code-frame': 7.24.7
+ '@babel/code-frame': 7.26.2
chalk: 4.1.2
chokidar: 3.6.0
- cosmiconfig: 8.3.6(typescript@5.3.3)
+ cosmiconfig: 8.3.6(typescript@5.7.2)
deepmerge: 4.3.1
fs-extra: 10.1.0
memfs: 3.5.3
minimatch: 3.1.2
node-abort-controller: 3.1.1
schema-utils: 3.3.0
- semver: 7.6.2
+ semver: 7.6.3
tapable: 2.2.1
- typescript: 5.3.3
- webpack: 5.92.1(@swc/core@1.6.13)
+ typescript: 5.7.2
+ webpack: 5.97.1(@swc/core@1.10.6)
- form-data@4.0.0:
+ form-data@4.0.1:
dependencies:
asynckit: 0.4.0
combined-stream: 1.0.8
@@ -11192,17 +11791,17 @@ snapshots:
dezalgo: 1.0.4
hexoid: 1.0.0
once: 1.4.0
- qs: 6.12.3
+ qs: 6.13.1
forwarded@0.2.0: {}
fraction.js@4.3.7: {}
- framer-motion@11.15.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
+ framer-motion@11.16.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
dependencies:
- motion-dom: 11.14.3
- motion-utils: 11.14.3
- tslib: 2.6.3
+ motion-dom: 11.16.0
+ motion-utils: 11.16.0
+ tslib: 2.8.1
optionalDependencies:
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
@@ -11237,18 +11836,32 @@ snapshots:
gensync@1.0.0-beta.2: {}
+ get-browser-rtc@1.1.0: {}
+
get-caller-file@2.0.5: {}
- get-intrinsic@1.2.4:
+ get-intrinsic@1.2.7:
dependencies:
+ call-bind-apply-helpers: 1.0.1
+ es-define-property: 1.0.1
es-errors: 1.3.0
+ es-object-atoms: 1.0.0
function-bind: 1.1.2
- has-proto: 1.0.3
- has-symbols: 1.0.3
+ get-proto: 1.0.1
+ gopd: 1.2.0
+ has-symbols: 1.1.0
hasown: 2.0.2
+ math-intrinsics: 1.1.0
+
+ get-own-enumerable-keys@1.0.0: {}
get-package-type@0.1.0: {}
+ get-proto@1.0.1:
+ dependencies:
+ dunder-proto: 1.0.1
+ es-object-atoms: 1.0.0
+
get-stream@6.0.1: {}
glob-parent@5.1.2:
@@ -11261,31 +11874,22 @@ snapshots:
glob-to-regexp@0.4.1: {}
- glob@10.4.2:
- dependencies:
- foreground-child: 3.2.1
- jackspeak: 3.4.3
- minimatch: 9.0.5
- minipass: 7.1.2
- package-json-from-dist: 1.0.0
- path-scurry: 1.11.1
-
glob@10.4.5:
dependencies:
- foreground-child: 3.2.1
+ foreground-child: 3.3.0
jackspeak: 3.4.3
minimatch: 9.0.5
minipass: 7.1.2
- package-json-from-dist: 1.0.0
+ package-json-from-dist: 1.0.1
path-scurry: 1.11.1
glob@11.0.0:
dependencies:
- foreground-child: 3.2.1
+ foreground-child: 3.3.0
jackspeak: 4.0.2
minimatch: 10.0.1
minipass: 7.1.2
- package-json-from-dist: 1.0.0
+ package-json-from-dist: 1.0.1
path-scurry: 2.0.0
glob@7.2.3:
@@ -11311,8 +11915,8 @@ snapshots:
dependencies:
array-union: 2.1.0
dir-glob: 3.0.1
- fast-glob: 3.3.2
- ignore: 5.3.1
+ fast-glob: 3.3.3
+ ignore: 5.3.2
merge2: 1.4.1
slash: 3.0.0
@@ -11320,15 +11924,15 @@ snapshots:
dependencies:
csstype: 3.1.3
- gopd@1.0.1:
- dependencies:
- get-intrinsic: 1.2.4
+ gopd@1.2.0: {}
graceful-fs@4.2.11: {}
graphemer@1.4.0: {}
- has-flag@3.0.0: {}
+ graphlib@2.1.8:
+ dependencies:
+ lodash: 4.17.21
has-flag@4.0.0: {}
@@ -11336,15 +11940,13 @@ snapshots:
has-property-descriptors@1.0.2:
dependencies:
- es-define-property: 1.0.0
+ es-define-property: 1.0.1
- has-proto@1.0.3: {}
-
- has-symbols@1.0.3: {}
+ has-symbols@1.1.0: {}
has-tostringtag@1.0.2:
dependencies:
- has-symbols: 1.0.3
+ has-symbols: 1.1.0
hasown@2.0.2:
dependencies:
@@ -11378,7 +11980,7 @@ snapshots:
ieee754@1.2.1: {}
- ignore@5.3.1: {}
+ ignore@5.3.2: {}
immediate@3.0.6: {}
@@ -11389,7 +11991,7 @@ snapshots:
parent-module: 1.0.1
resolve-from: 4.0.0
- import-local@3.1.0:
+ import-local@3.2.0:
dependencies:
pkg-dir: 4.2.0
resolve-cwd: 3.0.0
@@ -11425,7 +12027,7 @@ snapshots:
dependencies:
'@ljharb/through': 2.3.13
ansi-escapes: 4.3.2
- chalk: 5.3.0
+ chalk: 5.4.1
cli-cursor: 3.1.0
cli-width: 4.1.0
external-editor: 3.1.0
@@ -11439,7 +12041,9 @@ snapshots:
strip-ansi: 6.0.1
wrap-ansi: 6.2.0
- ioredis@5.4.1:
+ internmap@2.0.3: {}
+
+ ioredis@5.4.2:
dependencies:
'@ioredis/commands': 1.2.0
cluster-key-slot: 1.1.2
@@ -11457,9 +12061,9 @@ snapshots:
ipaddr.js@2.2.0: {}
- is-arguments@1.1.1:
+ is-arguments@1.2.0:
dependencies:
- call-bind: 1.0.7
+ call-bound: 1.0.3
has-tostringtag: 1.0.2
is-arrayish@0.2.1: {}
@@ -11472,7 +12076,7 @@ snapshots:
is-callable@1.2.7: {}
- is-core-module@2.14.0:
+ is-core-module@2.16.1:
dependencies:
hasown: 2.0.2
@@ -11484,9 +12088,12 @@ snapshots:
is-generator-fn@2.1.0: {}
- is-generator-function@1.0.10:
+ is-generator-function@1.1.0:
dependencies:
+ call-bound: 1.0.3
+ get-proto: 1.0.1
has-tostringtag: 1.0.2
+ safe-regex-test: 1.1.0
is-glob@4.0.3:
dependencies:
@@ -11496,13 +12103,24 @@ snapshots:
is-number@7.0.0: {}
+ is-obj@3.0.0: {}
+
is-path-inside@3.0.3: {}
+ is-regex@1.2.1:
+ dependencies:
+ call-bound: 1.0.3
+ gopd: 1.2.0
+ has-tostringtag: 1.0.2
+ hasown: 2.0.2
+
+ is-regexp@3.1.0: {}
+
is-stream@2.0.1: {}
- is-typed-array@1.1.13:
+ is-typed-array@1.1.15:
dependencies:
- which-typed-array: 1.1.15
+ which-typed-array: 1.1.18
is-unicode-supported@0.1.0: {}
@@ -11518,8 +12136,8 @@ snapshots:
istanbul-lib-instrument@5.2.1:
dependencies:
- '@babel/core': 7.24.7
- '@babel/parser': 7.24.7
+ '@babel/core': 7.26.0
+ '@babel/parser': 7.26.3
'@istanbuljs/schema': 0.1.3
istanbul-lib-coverage: 3.2.2
semver: 6.3.1
@@ -11528,11 +12146,11 @@ snapshots:
istanbul-lib-instrument@6.0.3:
dependencies:
- '@babel/core': 7.24.7
- '@babel/parser': 7.24.7
+ '@babel/core': 7.26.0
+ '@babel/parser': 7.26.3
'@istanbuljs/schema': 0.1.3
istanbul-lib-coverage: 3.2.2
- semver: 7.6.2
+ semver: 7.6.3
transitivePeerDependencies:
- supports-color
@@ -11567,13 +12185,15 @@ snapshots:
dependencies:
'@isaacs/cliui': 8.0.2
- jake@10.9.1:
+ jake@10.9.2:
dependencies:
- async: 3.2.5
+ async: 3.2.6
chalk: 4.1.2
filelist: 1.0.4
minimatch: 3.1.2
+ javascript-lp-solver@0.4.24: {}
+
jest-changed-files@29.7.0:
dependencies:
execa: 5.1.1
@@ -11586,7 +12206,7 @@ snapshots:
'@jest/expect': 29.7.0
'@jest/test-result': 29.7.0
'@jest/types': 29.6.3
- '@types/node': 20.14.10
+ '@types/node': 20.17.12
chalk: 4.1.2
co: 4.6.0
dedent: 1.5.3
@@ -11606,16 +12226,16 @@ snapshots:
- babel-plugin-macros
- supports-color
- jest-cli@29.7.0(@types/node@20.14.10)(ts-node@10.9.2(@swc/core@1.6.13)(@types/node@20.14.10)(typescript@5.7.2)):
+ jest-cli@29.7.0(@types/node@20.17.12)(ts-node@10.9.2(@swc/core@1.10.6)(@types/node@20.17.12)(typescript@5.7.2)):
dependencies:
- '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.6.13)(@types/node@20.14.10)(typescript@5.7.2))
+ '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.6)(@types/node@20.17.12)(typescript@5.7.2))
'@jest/test-result': 29.7.0
'@jest/types': 29.6.3
chalk: 4.1.2
- create-jest: 29.7.0(@types/node@20.14.10)(ts-node@10.9.2(@swc/core@1.6.13)(@types/node@20.14.10)(typescript@5.7.2))
+ create-jest: 29.7.0(@types/node@20.17.12)(ts-node@10.9.2(@swc/core@1.10.6)(@types/node@20.17.12)(typescript@5.7.2))
exit: 0.1.2
- import-local: 3.1.0
- jest-config: 29.7.0(@types/node@20.14.10)(ts-node@10.9.2(@swc/core@1.6.13)(@types/node@20.14.10)(typescript@5.7.2))
+ import-local: 3.2.0
+ jest-config: 29.7.0(@types/node@20.17.12)(ts-node@10.9.2(@swc/core@1.10.6)(@types/node@20.17.12)(typescript@5.7.2))
jest-util: 29.7.0
jest-validate: 29.7.0
yargs: 17.7.2
@@ -11625,12 +12245,12 @@ snapshots:
- supports-color
- ts-node
- jest-config@29.7.0(@types/node@20.14.10)(ts-node@10.9.2(@swc/core@1.6.13)(@types/node@20.14.10)(typescript@5.7.2)):
+ jest-config@29.7.0(@types/node@20.17.12)(ts-node@10.9.2(@swc/core@1.10.6)(@types/node@20.17.12)(typescript@5.7.2)):
dependencies:
- '@babel/core': 7.24.7
+ '@babel/core': 7.26.0
'@jest/test-sequencer': 29.7.0
'@jest/types': 29.6.3
- babel-jest: 29.7.0(@babel/core@7.24.7)
+ babel-jest: 29.7.0(@babel/core@7.26.0)
chalk: 4.1.2
ci-info: 3.9.0
deepmerge: 4.3.1
@@ -11644,14 +12264,14 @@ snapshots:
jest-runner: 29.7.0
jest-util: 29.7.0
jest-validate: 29.7.0
- micromatch: 4.0.7
+ micromatch: 4.0.8
parse-json: 5.2.0
pretty-format: 29.7.0
slash: 3.0.0
strip-json-comments: 3.1.1
optionalDependencies:
- '@types/node': 20.14.10
- ts-node: 10.9.2(@swc/core@1.6.13)(@types/node@20.14.10)(typescript@5.7.2)
+ '@types/node': 20.17.12
+ ts-node: 10.9.2(@swc/core@1.10.6)(@types/node@20.17.12)(typescript@5.7.2)
transitivePeerDependencies:
- babel-plugin-macros
- supports-color
@@ -11680,7 +12300,7 @@ snapshots:
'@jest/environment': 29.7.0
'@jest/fake-timers': 29.7.0
'@jest/types': 29.6.3
- '@types/node': 20.14.10
+ '@types/node': 20.17.12
jest-mock: 29.7.0
jest-util: 29.7.0
@@ -11690,14 +12310,14 @@ snapshots:
dependencies:
'@jest/types': 29.6.3
'@types/graceful-fs': 4.1.9
- '@types/node': 20.14.10
+ '@types/node': 20.17.12
anymatch: 3.1.3
fb-watchman: 2.0.2
graceful-fs: 4.2.11
jest-regex-util: 29.6.3
jest-util: 29.7.0
jest-worker: 29.7.0
- micromatch: 4.0.7
+ micromatch: 4.0.8
walker: 1.0.8
optionalDependencies:
fsevents: 2.3.3
@@ -11716,12 +12336,12 @@ snapshots:
jest-message-util@29.7.0:
dependencies:
- '@babel/code-frame': 7.24.7
+ '@babel/code-frame': 7.26.2
'@jest/types': 29.6.3
'@types/stack-utils': 2.0.3
chalk: 4.1.2
graceful-fs: 4.2.11
- micromatch: 4.0.7
+ micromatch: 4.0.8
pretty-format: 29.7.0
slash: 3.0.0
stack-utils: 2.0.6
@@ -11729,7 +12349,7 @@ snapshots:
jest-mock@29.7.0:
dependencies:
'@jest/types': 29.6.3
- '@types/node': 20.14.10
+ '@types/node': 20.17.12
jest-util: 29.7.0
jest-pnp-resolver@1.2.3(jest-resolve@29.7.0):
@@ -11753,8 +12373,8 @@ snapshots:
jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0)
jest-util: 29.7.0
jest-validate: 29.7.0
- resolve: 1.22.8
- resolve.exports: 2.0.2
+ resolve: 1.22.10
+ resolve.exports: 2.0.3
slash: 3.0.0
jest-runner@29.7.0:
@@ -11764,7 +12384,7 @@ snapshots:
'@jest/test-result': 29.7.0
'@jest/transform': 29.7.0
'@jest/types': 29.6.3
- '@types/node': 20.14.10
+ '@types/node': 20.17.12
chalk: 4.1.2
emittery: 0.13.1
graceful-fs: 4.2.11
@@ -11792,9 +12412,9 @@ snapshots:
'@jest/test-result': 29.7.0
'@jest/transform': 29.7.0
'@jest/types': 29.6.3
- '@types/node': 20.14.10
+ '@types/node': 20.17.12
chalk: 4.1.2
- cjs-module-lexer: 1.3.1
+ cjs-module-lexer: 1.4.1
collect-v8-coverage: 1.0.2
glob: 7.2.3
graceful-fs: 4.2.11
@@ -11812,15 +12432,15 @@ snapshots:
jest-snapshot@29.7.0:
dependencies:
- '@babel/core': 7.24.7
- '@babel/generator': 7.24.7
- '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.24.7)
- '@babel/plugin-syntax-typescript': 7.24.7(@babel/core@7.24.7)
- '@babel/types': 7.24.7
+ '@babel/core': 7.26.0
+ '@babel/generator': 7.26.3
+ '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.0)
+ '@babel/types': 7.26.3
'@jest/expect-utils': 29.7.0
'@jest/transform': 29.7.0
'@jest/types': 29.6.3
- babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.7)
+ babel-preset-current-node-syntax: 1.1.0(@babel/core@7.26.0)
chalk: 4.1.2
expect: 29.7.0
graceful-fs: 4.2.11
@@ -11831,14 +12451,14 @@ snapshots:
jest-util: 29.7.0
natural-compare: 1.4.0
pretty-format: 29.7.0
- semver: 7.6.2
+ semver: 7.6.3
transitivePeerDependencies:
- supports-color
jest-util@29.7.0:
dependencies:
'@jest/types': 29.6.3
- '@types/node': 20.14.10
+ '@types/node': 20.17.12
chalk: 4.1.2
ci-info: 3.9.0
graceful-fs: 4.2.11
@@ -11857,7 +12477,7 @@ snapshots:
dependencies:
'@jest/test-result': 29.7.0
'@jest/types': 29.6.3
- '@types/node': 20.14.10
+ '@types/node': 20.17.12
ansi-escapes: 4.3.2
chalk: 4.1.2
emittery: 0.13.1
@@ -11866,30 +12486,30 @@ snapshots:
jest-worker@27.5.1:
dependencies:
- '@types/node': 20.14.10
+ '@types/node': 20.17.12
merge-stream: 2.0.0
supports-color: 8.1.1
jest-worker@29.7.0:
dependencies:
- '@types/node': 20.14.10
+ '@types/node': 20.17.12
jest-util: 29.7.0
merge-stream: 2.0.0
supports-color: 8.1.1
- jest@29.7.0(@types/node@20.14.10)(ts-node@10.9.2(@swc/core@1.6.13)(@types/node@20.14.10)(typescript@5.7.2)):
+ jest@29.7.0(@types/node@20.17.12)(ts-node@10.9.2(@swc/core@1.10.6)(@types/node@20.17.12)(typescript@5.7.2)):
dependencies:
- '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.6.13)(@types/node@20.14.10)(typescript@5.7.2))
+ '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.6)(@types/node@20.17.12)(typescript@5.7.2))
'@jest/types': 29.6.3
- import-local: 3.1.0
- jest-cli: 29.7.0(@types/node@20.14.10)(ts-node@10.9.2(@swc/core@1.6.13)(@types/node@20.14.10)(typescript@5.7.2))
+ import-local: 3.2.0
+ jest-cli: 29.7.0(@types/node@20.17.12)(ts-node@10.9.2(@swc/core@1.10.6)(@types/node@20.17.12)(typescript@5.7.2))
transitivePeerDependencies:
- '@types/node'
- babel-plugin-macros
- supports-color
- ts-node
- jiti@1.21.6: {}
+ jiti@1.21.7: {}
joycon@3.1.1: {}
@@ -11906,7 +12526,7 @@ snapshots:
dependencies:
argparse: 2.0.1
- jsesc@2.5.2: {}
+ jsesc@3.1.0: {}
json-buffer@3.0.1: {}
@@ -11945,7 +12565,7 @@ snapshots:
lodash.isstring: 4.0.1
lodash.once: 4.1.1
ms: 2.1.3
- semver: 7.6.2
+ semver: 7.6.3
jszip@3.10.1:
dependencies:
@@ -11965,12 +12585,18 @@ snapshots:
jwa: 1.4.1
safe-buffer: 5.2.1
+ katex@0.16.19:
+ dependencies:
+ commander: 8.3.0
+
keyv@4.5.4:
dependencies:
json-buffer: 3.0.1
kleur@3.0.3: {}
+ kleur@4.1.5: {}
+
lazystream@1.0.1:
dependencies:
readable-stream: 2.3.8
@@ -12042,8 +12668,6 @@ snapshots:
dependencies:
immediate: 3.0.6
- lilconfig@3.1.2: {}
-
lilconfig@3.1.3: {}
lines-and-columns@1.2.4: {}
@@ -12067,6 +12691,8 @@ snapshots:
dependencies:
p-locate: 5.0.0
+ lodash-es@4.17.21: {}
+
lodash._baseiteratee@4.7.0:
dependencies:
lodash._stringtopath: 4.8.0
@@ -12086,6 +12712,8 @@ snapshots:
dependencies:
lodash._basetostring: 4.12.0
+ lodash.clonedeep@4.5.0: {}
+
lodash.debounce@4.0.8: {}
lodash.defaults@4.2.0: {}
@@ -12152,7 +12780,7 @@ snapshots:
lower-case@2.0.2:
dependencies:
- tslib: 2.6.3
+ tslib: 2.8.1
lru-cache@10.4.3: {}
@@ -12164,7 +12792,7 @@ snapshots:
ltgt@2.2.1: {}
- luxon@3.4.4: {}
+ luxon@3.5.0: {}
magic-string@0.30.8:
dependencies:
@@ -12172,7 +12800,7 @@ snapshots:
make-dir@4.0.0:
dependencies:
- semver: 7.6.2
+ semver: 7.6.3
make-error@1.3.6: {}
@@ -12180,6 +12808,29 @@ snapshots:
dependencies:
tmpl: 1.0.5
+ math-intrinsics@1.1.0: {}
+
+ mdast-util-from-markdown@1.3.1:
+ dependencies:
+ '@types/mdast': 3.0.15
+ '@types/unist': 2.0.11
+ decode-named-character-reference: 1.0.2
+ mdast-util-to-string: 3.2.0
+ micromark: 3.2.0
+ micromark-util-decode-numeric-character-reference: 1.1.0
+ micromark-util-decode-string: 1.1.0
+ micromark-util-normalize-identifier: 1.1.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
+ unist-util-stringify-position: 3.0.3
+ uvu: 0.5.6
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-to-string@3.2.0:
+ dependencies:
+ '@types/mdast': 3.0.15
+
media-typer@0.3.0: {}
memfs@3.5.3:
@@ -12188,7 +12839,12 @@ snapshots:
memoize-one@5.2.1: {}
- merge-descriptors@1.0.1: {}
+ memory-fs@0.3.0:
+ dependencies:
+ errno: 0.1.8
+ readable-stream: 2.3.8
+
+ merge-descriptors@1.0.3: {}
merge-stream@2.0.0: {}
@@ -12196,10 +12852,138 @@ snapshots:
methods@1.1.2: {}
- micromatch@4.0.7:
+ micromark-core-commonmark@1.1.0:
dependencies:
- braces: 3.0.3
- picomatch: 2.3.1
+ decode-named-character-reference: 1.0.2
+ micromark-factory-destination: 1.1.0
+ micromark-factory-label: 1.1.0
+ micromark-factory-space: 1.1.0
+ micromark-factory-title: 1.1.0
+ micromark-factory-whitespace: 1.1.0
+ micromark-util-character: 1.2.0
+ micromark-util-chunked: 1.1.0
+ micromark-util-classify-character: 1.1.0
+ micromark-util-html-tag-name: 1.2.0
+ micromark-util-normalize-identifier: 1.1.0
+ micromark-util-resolve-all: 1.1.0
+ micromark-util-subtokenize: 1.1.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
+ uvu: 0.5.6
+
+ micromark-factory-destination@1.1.0:
+ dependencies:
+ micromark-util-character: 1.2.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
+
+ micromark-factory-label@1.1.0:
+ dependencies:
+ micromark-util-character: 1.2.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
+ uvu: 0.5.6
+
+ micromark-factory-space@1.1.0:
+ dependencies:
+ micromark-util-character: 1.2.0
+ micromark-util-types: 1.1.0
+
+ micromark-factory-title@1.1.0:
+ dependencies:
+ micromark-factory-space: 1.1.0
+ micromark-util-character: 1.2.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
+
+ micromark-factory-whitespace@1.1.0:
+ dependencies:
+ micromark-factory-space: 1.1.0
+ micromark-util-character: 1.2.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
+
+ micromark-util-character@1.2.0:
+ dependencies:
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
+
+ micromark-util-chunked@1.1.0:
+ dependencies:
+ micromark-util-symbol: 1.1.0
+
+ micromark-util-classify-character@1.1.0:
+ dependencies:
+ micromark-util-character: 1.2.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
+
+ micromark-util-combine-extensions@1.1.0:
+ dependencies:
+ micromark-util-chunked: 1.1.0
+ micromark-util-types: 1.1.0
+
+ micromark-util-decode-numeric-character-reference@1.1.0:
+ dependencies:
+ micromark-util-symbol: 1.1.0
+
+ micromark-util-decode-string@1.1.0:
+ dependencies:
+ decode-named-character-reference: 1.0.2
+ micromark-util-character: 1.2.0
+ micromark-util-decode-numeric-character-reference: 1.1.0
+ micromark-util-symbol: 1.1.0
+
+ micromark-util-encode@1.1.0: {}
+
+ micromark-util-html-tag-name@1.2.0: {}
+
+ micromark-util-normalize-identifier@1.1.0:
+ dependencies:
+ micromark-util-symbol: 1.1.0
+
+ micromark-util-resolve-all@1.1.0:
+ dependencies:
+ micromark-util-types: 1.1.0
+
+ micromark-util-sanitize-uri@1.2.0:
+ dependencies:
+ micromark-util-character: 1.2.0
+ micromark-util-encode: 1.1.0
+ micromark-util-symbol: 1.1.0
+
+ micromark-util-subtokenize@1.1.0:
+ dependencies:
+ micromark-util-chunked: 1.1.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
+ uvu: 0.5.6
+
+ micromark-util-symbol@1.1.0: {}
+
+ micromark-util-types@1.1.0: {}
+
+ micromark@3.2.0:
+ dependencies:
+ '@types/debug': 4.1.12
+ debug: 4.4.0
+ decode-named-character-reference: 1.0.2
+ micromark-core-commonmark: 1.1.0
+ micromark-factory-space: 1.1.0
+ micromark-util-character: 1.2.0
+ micromark-util-chunked: 1.1.0
+ micromark-util-combine-extensions: 1.1.0
+ micromark-util-decode-numeric-character-reference: 1.1.0
+ micromark-util-encode: 1.1.0
+ micromark-util-normalize-identifier: 1.1.0
+ micromark-util-resolve-all: 1.1.0
+ micromark-util-sanitize-uri: 1.2.0
+ micromark-util-subtokenize: 1.1.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
+ uvu: 0.5.6
+ transitivePeerDependencies:
+ - supports-color
micromatch@4.0.8:
dependencies:
@@ -12240,22 +13024,22 @@ snapshots:
minimist@1.2.8: {}
- minio@8.0.1:
+ minio@8.0.3:
dependencies:
- async: 3.2.5
+ async: 3.2.6
block-stream2: 2.1.0
browser-or-node: 2.1.1
buffer-crc32: 1.0.0
eventemitter3: 5.0.1
- fast-xml-parser: 4.5.0
+ fast-xml-parser: 4.5.1
ipaddr.js: 2.2.0
lodash: 4.17.21
mime-types: 2.1.35
query-string: 7.1.3
- stream-json: 1.8.0
+ stream-json: 1.9.1
through2: 4.0.2
web-encoding: 1.1.5
- xml2js: 0.5.0
+ xml2js: 0.6.2
minipass@7.1.2: {}
@@ -12265,14 +13049,16 @@ snapshots:
dependencies:
minimist: 1.2.8
- motion-dom@11.14.3: {}
+ motion-dom@11.16.0:
+ dependencies:
+ motion-utils: 11.16.0
- motion-utils@11.14.3: {}
+ motion-utils@11.16.0: {}
+
+ mri@1.2.0: {}
ms@2.0.0: {}
- ms@2.1.2: {}
-
ms@2.1.3: {}
msgpackr-extract@3.0.3:
@@ -12287,7 +13073,7 @@ snapshots:
'@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.3
optional: true
- msgpackr@1.11.0:
+ msgpackr@1.11.2:
optionalDependencies:
msgpackr-extract: 3.0.3
@@ -12320,7 +13106,7 @@ snapshots:
dependencies:
nanoid: 5.0.9
- nanoid@3.3.7: {}
+ nanoid@3.3.8: {}
nanoid@5.0.9: {}
@@ -12335,7 +13121,7 @@ snapshots:
no-case@3.0.4:
dependencies:
lower-case: 2.0.2
- tslib: 2.6.3
+ tslib: 2.8.1
node-abort-controller@3.1.1: {}
@@ -12360,8 +13146,6 @@ snapshots:
node-int64@0.4.0: {}
- node-releases@2.0.14: {}
-
node-releases@2.0.19: {}
normalize-path@3.0.0: {}
@@ -12376,7 +13160,7 @@ snapshots:
object-hash@3.0.0: {}
- object-inspect@1.13.2: {}
+ object-inspect@1.13.3: {}
on-finished@2.4.1:
dependencies:
@@ -12435,17 +13219,19 @@ snapshots:
p-try@2.2.0: {}
- package-json-from-dist@1.0.0: {}
+ package-json-from-dist@1.0.1: {}
pako@1.0.11: {}
+ parchment@3.0.0: {}
+
parent-module@1.0.1:
dependencies:
callsites: 3.1.0
parse-json@5.2.0:
dependencies:
- '@babel/code-frame': 7.24.7
+ '@babel/code-frame': 7.26.2
error-ex: 1.3.2
json-parse-even-better-errors: 2.3.1
lines-and-columns: 1.2.4
@@ -12472,13 +13258,18 @@ snapshots:
lru-cache: 11.0.2
minipass: 7.1.2
- path-to-regexp@0.1.7: {}
+ path-to-regexp@0.1.12: {}
- path-to-regexp@3.2.0: {}
+ path-to-regexp@3.3.0: {}
path-type@4.0.0: {}
- picocolors@1.0.1: {}
+ pdf-lib@1.17.1:
+ dependencies:
+ '@pdf-lib/standard-fonts': 1.0.0
+ '@pdf-lib/upng': 1.0.1
+ pako: 1.0.11
+ tslib: 1.14.1
picocolors@1.1.1: {}
@@ -12507,28 +13298,28 @@ snapshots:
postcss: 8.4.49
postcss-value-parser: 4.2.0
read-cache: 1.0.0
- resolve: 1.22.8
+ resolve: 1.22.10
postcss-js@4.0.1(postcss@8.4.49):
dependencies:
camelcase-css: 2.0.1
postcss: 8.4.49
- postcss-load-config@4.0.2(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.6.13)(@types/node@20.14.10)(typescript@5.7.2)):
+ postcss-load-config@4.0.2(postcss@8.4.49)(ts-node@10.9.2(@types/node@20.17.12)(typescript@5.7.2)):
dependencies:
lilconfig: 3.1.3
- yaml: 2.4.5
+ yaml: 2.7.0
optionalDependencies:
postcss: 8.4.49
- ts-node: 10.9.2(@swc/core@1.6.13)(@types/node@20.14.10)(typescript@5.7.2)
+ ts-node: 10.9.2(@swc/core@1.10.6)(@types/node@20.17.12)(typescript@5.7.2)
- postcss-load-config@6.0.1(jiti@1.21.6)(postcss@8.4.49)(yaml@2.4.5):
+ postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.4.49)(yaml@2.7.0):
dependencies:
- lilconfig: 3.1.2
+ lilconfig: 3.1.3
optionalDependencies:
- jiti: 1.21.6
+ jiti: 1.21.7
postcss: 8.4.49
- yaml: 2.4.5
+ yaml: 2.7.0
postcss-nested@6.2.0(postcss@8.4.49):
dependencies:
@@ -12544,7 +13335,7 @@ snapshots:
postcss@8.4.49:
dependencies:
- nanoid: 3.3.7
+ nanoid: 3.3.8
picocolors: 1.1.1
source-map-js: 1.2.1
@@ -12554,7 +13345,7 @@ snapshots:
dependencies:
fast-diff: 1.3.0
- prettier@3.3.2: {}
+ prettier@3.4.2: {}
pretty-format@29.7.0:
dependencies:
@@ -12598,13 +13389,15 @@ snapshots:
pure-rand@6.1.0: {}
- qs@6.11.0:
+ qs@6.13.0:
dependencies:
- side-channel: 1.0.6
+ side-channel: 1.1.0
- qs@6.12.3:
+ qs@6.13.1:
dependencies:
- side-channel: 1.0.6
+ side-channel: 1.1.0
+
+ quadprog@1.6.1: {}
query-string@7.1.3:
dependencies:
@@ -12617,6 +13410,19 @@ snapshots:
queue-microtask@1.2.3: {}
+ quill-delta@5.1.0:
+ dependencies:
+ fast-diff: 1.3.0
+ lodash.clonedeep: 4.5.0
+ lodash.isequal: 4.5.0
+
+ quill@2.0.3:
+ dependencies:
+ eventemitter3: 5.0.1
+ lodash-es: 4.17.21
+ parchment: 3.0.0
+ quill-delta: 5.1.0
+
raf-schd@4.0.3: {}
randombytes@2.1.0:
@@ -12632,330 +13438,329 @@ snapshots:
iconv-lite: 0.4.24
unpipe: 1.0.0
- rc-cascader@3.28.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
+ rc-cascader@3.32.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
dependencies:
- '@babel/runtime': 7.25.0
- array-tree-filter: 2.1.0
+ '@babel/runtime': 7.26.0
classnames: 2.5.1
- rc-select: 14.15.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- rc-tree: 5.9.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-select: 14.16.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-tree: 5.12.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-util: 5.44.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
- rc-checkbox@3.3.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
+ rc-checkbox@3.5.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
dependencies:
- '@babel/runtime': 7.25.0
+ '@babel/runtime': 7.26.0
classnames: 2.5.1
- rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-util: 5.44.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
- rc-collapse@3.7.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
+ rc-collapse@3.9.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
dependencies:
- '@babel/runtime': 7.25.0
+ '@babel/runtime': 7.26.0
classnames: 2.5.1
- rc-motion: 2.9.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-motion: 2.9.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-util: 5.44.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
- rc-dialog@9.5.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
+ rc-dialog@9.6.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
dependencies:
- '@babel/runtime': 7.25.0
+ '@babel/runtime': 7.26.0
'@rc-component/portal': 1.1.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
classnames: 2.5.1
- rc-motion: 2.9.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-motion: 2.9.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-util: 5.44.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
rc-drawer@7.2.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
dependencies:
- '@babel/runtime': 7.25.0
+ '@babel/runtime': 7.26.0
'@rc-component/portal': 1.1.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
classnames: 2.5.1
- rc-motion: 2.9.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-motion: 2.9.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-util: 5.44.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
- rc-dropdown@4.2.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
+ rc-dropdown@4.2.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
dependencies:
- '@babel/runtime': 7.25.0
- '@rc-component/trigger': 2.2.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ '@babel/runtime': 7.26.0
+ '@rc-component/trigger': 2.2.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
classnames: 2.5.1
- rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-util: 5.44.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
- rc-field-form@2.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
+ rc-field-form@2.7.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
dependencies:
- '@babel/runtime': 7.25.0
+ '@babel/runtime': 7.26.0
'@rc-component/async-validator': 5.0.4
- rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-util: 5.44.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
- rc-image@7.9.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
+ rc-image@7.11.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
dependencies:
- '@babel/runtime': 7.25.0
+ '@babel/runtime': 7.26.0
'@rc-component/portal': 1.1.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
classnames: 2.5.1
- rc-dialog: 9.5.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- rc-motion: 2.9.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-dialog: 9.6.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-motion: 2.9.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-util: 5.44.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
- rc-input-number@9.2.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
+ rc-input-number@9.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
dependencies:
- '@babel/runtime': 7.25.0
+ '@babel/runtime': 7.26.0
'@rc-component/mini-decimal': 1.1.0
classnames: 2.5.1
- rc-input: 1.6.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-input: 1.7.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-util: 5.44.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
- rc-input@1.6.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
+ rc-input@1.7.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
dependencies:
- '@babel/runtime': 7.25.0
+ '@babel/runtime': 7.26.0
classnames: 2.5.1
- rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-util: 5.44.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
- rc-mentions@2.15.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
+ rc-mentions@2.19.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
dependencies:
- '@babel/runtime': 7.25.0
- '@rc-component/trigger': 2.2.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ '@babel/runtime': 7.26.0
+ '@rc-component/trigger': 2.2.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
classnames: 2.5.1
- rc-input: 1.6.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- rc-menu: 9.14.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- rc-textarea: 1.8.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-input: 1.7.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-menu: 9.16.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-textarea: 1.9.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-util: 5.44.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
- rc-menu@9.14.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
+ rc-menu@9.16.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
dependencies:
- '@babel/runtime': 7.25.0
- '@rc-component/trigger': 2.2.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ '@babel/runtime': 7.26.0
+ '@rc-component/trigger': 2.2.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
classnames: 2.5.1
- rc-motion: 2.9.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-motion: 2.9.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
rc-overflow: 1.3.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-util: 5.44.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
- rc-motion@2.9.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
+ rc-motion@2.9.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
dependencies:
- '@babel/runtime': 7.25.0
+ '@babel/runtime': 7.26.0
classnames: 2.5.1
- rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-util: 5.44.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
- rc-notification@5.6.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
+ rc-notification@5.6.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
dependencies:
- '@babel/runtime': 7.25.0
+ '@babel/runtime': 7.26.0
classnames: 2.5.1
- rc-motion: 2.9.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-motion: 2.9.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-util: 5.44.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
rc-overflow@1.3.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
dependencies:
- '@babel/runtime': 7.25.0
+ '@babel/runtime': 7.26.0
classnames: 2.5.1
- rc-resize-observer: 1.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-resize-observer: 1.4.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-util: 5.44.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
- rc-pagination@4.2.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
+ rc-pagination@5.0.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
dependencies:
- '@babel/runtime': 7.25.0
+ '@babel/runtime': 7.26.0
classnames: 2.5.1
- rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-util: 5.44.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
- rc-picker@4.6.14(date-fns@2.30.0)(dayjs@1.11.13)(luxon@3.4.4)(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
+ rc-picker@4.9.2(date-fns@2.30.0)(dayjs@1.11.13)(luxon@3.5.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
dependencies:
- '@babel/runtime': 7.25.0
- '@rc-component/trigger': 2.2.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ '@babel/runtime': 7.26.0
+ '@rc-component/trigger': 2.2.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
classnames: 2.5.1
rc-overflow: 1.3.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- rc-resize-observer: 1.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-resize-observer: 1.4.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-util: 5.44.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
optionalDependencies:
date-fns: 2.30.0
dayjs: 1.11.13
- luxon: 3.4.4
+ luxon: 3.5.0
rc-progress@4.0.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
dependencies:
- '@babel/runtime': 7.25.0
+ '@babel/runtime': 7.26.0
classnames: 2.5.1
- rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-util: 5.44.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
rc-rate@2.13.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
dependencies:
- '@babel/runtime': 7.25.0
+ '@babel/runtime': 7.26.0
classnames: 2.5.1
- rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-util: 5.44.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
- rc-resize-observer@1.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
+ rc-resize-observer@1.4.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
dependencies:
- '@babel/runtime': 7.25.0
+ '@babel/runtime': 7.26.0
classnames: 2.5.1
- rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-util: 5.44.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
resize-observer-polyfill: 1.5.1
- rc-segmented@2.3.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
+ rc-segmented@2.7.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
dependencies:
- '@babel/runtime': 7.25.0
+ '@babel/runtime': 7.26.0
classnames: 2.5.1
- rc-motion: 2.9.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-motion: 2.9.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-util: 5.44.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
- rc-select@14.15.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
+ rc-select@14.16.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
dependencies:
- '@babel/runtime': 7.25.0
- '@rc-component/trigger': 2.2.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ '@babel/runtime': 7.26.0
+ '@rc-component/trigger': 2.2.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
classnames: 2.5.1
- rc-motion: 2.9.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-motion: 2.9.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
rc-overflow: 1.3.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- rc-virtual-list: 3.14.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-util: 5.44.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-virtual-list: 3.17.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
- rc-slider@11.1.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
+ rc-slider@11.1.8(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
dependencies:
- '@babel/runtime': 7.25.0
+ '@babel/runtime': 7.26.0
classnames: 2.5.1
- rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-util: 5.44.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
rc-steps@6.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
dependencies:
- '@babel/runtime': 7.25.0
+ '@babel/runtime': 7.26.0
classnames: 2.5.1
- rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-util: 5.44.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
rc-switch@4.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
dependencies:
- '@babel/runtime': 7.25.0
+ '@babel/runtime': 7.26.0
classnames: 2.5.1
- rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-util: 5.44.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
- rc-table@7.45.7(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
+ rc-table@7.50.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
dependencies:
- '@babel/runtime': 7.25.0
+ '@babel/runtime': 7.26.0
'@rc-component/context': 1.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
classnames: 2.5.1
- rc-resize-observer: 1.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- rc-virtual-list: 3.14.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-resize-observer: 1.4.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-util: 5.44.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-virtual-list: 3.17.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
- rc-tabs@15.1.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
+ rc-tabs@15.5.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
dependencies:
- '@babel/runtime': 7.25.0
+ '@babel/runtime': 7.26.0
classnames: 2.5.1
- rc-dropdown: 4.2.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- rc-menu: 9.14.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- rc-motion: 2.9.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- rc-resize-observer: 1.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-dropdown: 4.2.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-menu: 9.16.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-motion: 2.9.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-resize-observer: 1.4.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-util: 5.44.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
- rc-textarea@1.8.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
+ rc-textarea@1.9.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
dependencies:
- '@babel/runtime': 7.25.0
+ '@babel/runtime': 7.26.0
classnames: 2.5.1
- rc-input: 1.6.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- rc-resize-observer: 1.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-input: 1.7.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-resize-observer: 1.4.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-util: 5.44.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
- rc-tooltip@6.2.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
+ rc-tooltip@6.3.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
dependencies:
- '@babel/runtime': 7.25.0
- '@rc-component/trigger': 2.2.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ '@babel/runtime': 7.26.0
+ '@rc-component/trigger': 2.2.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
classnames: 2.5.1
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
- rc-tree-select@5.23.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
+ rc-tree-select@5.26.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
dependencies:
- '@babel/runtime': 7.25.0
+ '@babel/runtime': 7.26.0
classnames: 2.5.1
- rc-select: 14.15.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- rc-tree: 5.9.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-select: 14.16.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-tree: 5.12.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-util: 5.44.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
- rc-tree@5.9.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
+ rc-tree@5.12.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
dependencies:
- '@babel/runtime': 7.25.0
+ '@babel/runtime': 7.26.0
classnames: 2.5.1
- rc-motion: 2.9.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- rc-virtual-list: 3.14.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-motion: 2.9.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-util: 5.44.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-virtual-list: 3.17.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
- rc-upload@4.7.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
+ rc-upload@4.8.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
dependencies:
- '@babel/runtime': 7.25.0
+ '@babel/runtime': 7.26.0
classnames: 2.5.1
- rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-util: 5.44.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
- rc-util@5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
+ rc-util@5.44.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
dependencies:
- '@babel/runtime': 7.25.0
+ '@babel/runtime': 7.26.0
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
react-is: 18.3.1
- rc-virtual-list@3.14.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
+ rc-virtual-list@3.17.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
dependencies:
- '@babel/runtime': 7.25.0
+ '@babel/runtime': 7.26.0
classnames: 2.5.1
- rc-resize-observer: 1.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-resize-observer: 1.4.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ rc-util: 5.44.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
react-beautiful-dnd@13.1.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
dependencies:
- '@babel/runtime': 7.25.0
+ '@babel/runtime': 7.26.0
css-box-model: 1.2.1
memoize-one: 5.2.1
raf-schd: 4.0.3
@@ -12979,12 +13784,6 @@ snapshots:
react: 18.2.0
scheduler: 0.23.2
- react-dom@18.3.1(react@18.3.1):
- dependencies:
- loose-envify: 1.4.0
- react: 18.3.1
- scheduler: 0.23.2
-
react-draggable@4.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
dependencies:
clsx: 1.2.1
@@ -12992,17 +13791,28 @@ snapshots:
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
+ react-dropzone@14.3.5(react@18.2.0):
+ dependencies:
+ attr-accept: 2.2.5
+ file-selector: 2.1.2
+ prop-types: 15.8.1
+ react: 18.2.0
+
react-hook-form@7.54.2(react@18.2.0):
dependencies:
react: 18.2.0
- react-hot-toast@2.4.1(csstype@3.1.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
+ react-hot-toast@2.5.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
dependencies:
+ csstype: 3.1.3
goober: 2.1.16(csstype@3.1.3)
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
- transitivePeerDependencies:
- - csstype
+
+ react-hotkeys-hook@4.6.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
+ dependencies:
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
react-is@16.13.1: {}
@@ -13012,7 +13822,7 @@ snapshots:
react-redux@7.2.9(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
dependencies:
- '@babel/runtime': 7.25.0
+ '@babel/runtime': 7.26.0
'@types/react-redux': 7.1.34
hoist-non-react-statics: 3.3.2
loose-envify: 1.4.0
@@ -13032,26 +13842,22 @@ snapshots:
transitivePeerDependencies:
- react-dom
- react-router-dom@6.24.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
+ react-router-dom@6.28.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
dependencies:
- '@remix-run/router': 1.17.1
+ '@remix-run/router': 1.21.0
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
- react-router: 6.24.1(react@18.2.0)
+ react-router: 6.28.1(react@18.2.0)
- react-router@6.24.1(react@18.2.0):
+ react-router@6.28.1(react@18.2.0):
dependencies:
- '@remix-run/router': 1.17.1
+ '@remix-run/router': 1.21.0
react: 18.2.0
react@18.2.0:
dependencies:
loose-envify: 1.4.0
- react@18.3.1:
- dependencies:
- loose-envify: 1.4.0
-
read-cache@1.0.0:
dependencies:
pify: 2.3.0
@@ -13090,7 +13896,7 @@ snapshots:
redux@4.2.1:
dependencies:
- '@babel/runtime': 7.25.0
+ '@babel/runtime': 7.26.0
reflect-metadata@0.2.2: {}
@@ -13112,15 +13918,17 @@ snapshots:
dependencies:
resolve-from: 5.0.0
+ resolve-from@2.0.0: {}
+
resolve-from@4.0.0: {}
resolve-from@5.0.0: {}
- resolve.exports@2.0.2: {}
+ resolve.exports@2.0.3: {}
- resolve@1.22.8:
+ resolve@1.22.10:
dependencies:
- is-core-module: 2.14.0
+ is-core-module: 2.16.1
path-parse: 1.0.7
supports-preserve-symlinks-flag: 1.0.0
@@ -13144,53 +13952,31 @@ snapshots:
rimraf@6.0.1:
dependencies:
glob: 11.0.0
- package-json-from-dist: 1.0.0
+ package-json-from-dist: 1.0.1
- rollup@4.18.1:
- dependencies:
- '@types/estree': 1.0.5
- optionalDependencies:
- '@rollup/rollup-android-arm-eabi': 4.18.1
- '@rollup/rollup-android-arm64': 4.18.1
- '@rollup/rollup-darwin-arm64': 4.18.1
- '@rollup/rollup-darwin-x64': 4.18.1
- '@rollup/rollup-linux-arm-gnueabihf': 4.18.1
- '@rollup/rollup-linux-arm-musleabihf': 4.18.1
- '@rollup/rollup-linux-arm64-gnu': 4.18.1
- '@rollup/rollup-linux-arm64-musl': 4.18.1
- '@rollup/rollup-linux-powerpc64le-gnu': 4.18.1
- '@rollup/rollup-linux-riscv64-gnu': 4.18.1
- '@rollup/rollup-linux-s390x-gnu': 4.18.1
- '@rollup/rollup-linux-x64-gnu': 4.18.1
- '@rollup/rollup-linux-x64-musl': 4.18.1
- '@rollup/rollup-win32-arm64-msvc': 4.18.1
- '@rollup/rollup-win32-ia32-msvc': 4.18.1
- '@rollup/rollup-win32-x64-msvc': 4.18.1
- fsevents: 2.3.3
-
- rollup@4.29.1:
+ rollup@4.30.1:
dependencies:
'@types/estree': 1.0.6
optionalDependencies:
- '@rollup/rollup-android-arm-eabi': 4.29.1
- '@rollup/rollup-android-arm64': 4.29.1
- '@rollup/rollup-darwin-arm64': 4.29.1
- '@rollup/rollup-darwin-x64': 4.29.1
- '@rollup/rollup-freebsd-arm64': 4.29.1
- '@rollup/rollup-freebsd-x64': 4.29.1
- '@rollup/rollup-linux-arm-gnueabihf': 4.29.1
- '@rollup/rollup-linux-arm-musleabihf': 4.29.1
- '@rollup/rollup-linux-arm64-gnu': 4.29.1
- '@rollup/rollup-linux-arm64-musl': 4.29.1
- '@rollup/rollup-linux-loongarch64-gnu': 4.29.1
- '@rollup/rollup-linux-powerpc64le-gnu': 4.29.1
- '@rollup/rollup-linux-riscv64-gnu': 4.29.1
- '@rollup/rollup-linux-s390x-gnu': 4.29.1
- '@rollup/rollup-linux-x64-gnu': 4.29.1
- '@rollup/rollup-linux-x64-musl': 4.29.1
- '@rollup/rollup-win32-arm64-msvc': 4.29.1
- '@rollup/rollup-win32-ia32-msvc': 4.29.1
- '@rollup/rollup-win32-x64-msvc': 4.29.1
+ '@rollup/rollup-android-arm-eabi': 4.30.1
+ '@rollup/rollup-android-arm64': 4.30.1
+ '@rollup/rollup-darwin-arm64': 4.30.1
+ '@rollup/rollup-darwin-x64': 4.30.1
+ '@rollup/rollup-freebsd-arm64': 4.30.1
+ '@rollup/rollup-freebsd-x64': 4.30.1
+ '@rollup/rollup-linux-arm-gnueabihf': 4.30.1
+ '@rollup/rollup-linux-arm-musleabihf': 4.30.1
+ '@rollup/rollup-linux-arm64-gnu': 4.30.1
+ '@rollup/rollup-linux-arm64-musl': 4.30.1
+ '@rollup/rollup-linux-loongarch64-gnu': 4.30.1
+ '@rollup/rollup-linux-powerpc64le-gnu': 4.30.1
+ '@rollup/rollup-linux-riscv64-gnu': 4.30.1
+ '@rollup/rollup-linux-s390x-gnu': 4.30.1
+ '@rollup/rollup-linux-x64-gnu': 4.30.1
+ '@rollup/rollup-linux-x64-musl': 4.30.1
+ '@rollup/rollup-win32-arm64-msvc': 4.30.1
+ '@rollup/rollup-win32-ia32-msvc': 4.30.1
+ '@rollup/rollup-win32-x64-msvc': 4.30.1
fsevents: 2.3.3
run-async@2.4.1: {}
@@ -13203,12 +13989,22 @@ snapshots:
rxjs@7.8.1:
dependencies:
- tslib: 2.6.3
+ tslib: 2.8.1
+
+ sade@1.8.1:
+ dependencies:
+ mri: 1.2.0
safe-buffer@5.1.2: {}
safe-buffer@5.2.1: {}
+ safe-regex-test@1.1.0:
+ dependencies:
+ call-bound: 1.0.3
+ es-errors: 1.3.0
+ is-regex: 1.2.1
+
safer-buffer@2.1.2: {}
sax@1.4.1: {}
@@ -13227,17 +14023,22 @@ snapshots:
ajv: 6.12.6
ajv-keywords: 3.5.2(ajv@6.12.6)
+ schema-utils@4.3.0:
+ dependencies:
+ '@types/json-schema': 7.0.15
+ ajv: 8.17.1
+ ajv-formats: 2.1.1(ajv@8.17.1)
+ ajv-keywords: 5.1.0(ajv@8.17.1)
+
scroll-into-view-if-needed@3.1.0:
dependencies:
compute-scroll-into-view: 3.1.0
semver@6.3.1: {}
- semver@7.6.2: {}
-
semver@7.6.3: {}
- send@0.18.0:
+ send@0.19.0:
dependencies:
debug: 2.6.9
depd: 2.0.0
@@ -13259,12 +14060,12 @@ snapshots:
dependencies:
randombytes: 2.1.0
- serve-static@1.15.0:
+ serve-static@1.16.2:
dependencies:
- encodeurl: 1.0.2
+ encodeurl: 2.0.0
escape-html: 1.0.3
parseurl: 1.3.3
- send: 0.18.0
+ send: 0.19.0
transitivePeerDependencies:
- supports-color
@@ -13275,8 +14076,8 @@ snapshots:
define-data-property: 1.1.4
es-errors: 1.3.0
function-bind: 1.1.2
- get-intrinsic: 1.2.4
- gopd: 1.0.1
+ get-intrinsic: 1.2.7
+ gopd: 1.2.0
has-property-descriptors: 1.0.2
setimmediate@1.0.5: {}
@@ -13315,7 +14116,7 @@ snapshots:
shebang-regex@3.0.0: {}
- shell-quote@1.8.1: {}
+ shell-quote@1.8.2: {}
should-equal@2.0.0:
dependencies:
@@ -13343,17 +14144,50 @@ snapshots:
should-type-adaptors: 1.1.0
should-util: 1.0.1
- side-channel@1.0.6:
+ side-channel-list@1.0.0:
dependencies:
- call-bind: 1.0.7
es-errors: 1.3.0
- get-intrinsic: 1.2.4
- object-inspect: 1.13.2
+ object-inspect: 1.13.3
+
+ side-channel-map@1.0.1:
+ dependencies:
+ call-bound: 1.0.3
+ es-errors: 1.3.0
+ get-intrinsic: 1.2.7
+ object-inspect: 1.13.3
+
+ side-channel-weakmap@1.0.2:
+ dependencies:
+ call-bound: 1.0.3
+ es-errors: 1.3.0
+ get-intrinsic: 1.2.7
+ object-inspect: 1.13.3
+ side-channel-map: 1.0.1
+
+ side-channel@1.1.0:
+ dependencies:
+ es-errors: 1.3.0
+ object-inspect: 1.13.3
+ side-channel-list: 1.0.0
+ side-channel-map: 1.0.1
+ side-channel-weakmap: 1.0.2
signal-exit@3.0.7: {}
signal-exit@4.1.0: {}
+ simple-peer@9.11.1:
+ dependencies:
+ buffer: 6.0.3
+ debug: 4.4.0
+ err-code: 3.0.1
+ get-browser-rtc: 1.1.0
+ queue-microtask: 1.2.3
+ randombytes: 2.1.0
+ readable-stream: 3.6.2
+ transitivePeerDependencies:
+ - supports-color
+
simple-swizzle@0.2.2:
dependencies:
is-arrayish: 0.3.2
@@ -13367,11 +14201,11 @@ snapshots:
snake-case@3.0.4:
dependencies:
dot-case: 3.0.4
- tslib: 2.6.3
+ tslib: 2.8.1
socket.io-adapter@2.5.5:
dependencies:
- debug: 4.3.5
+ debug: 4.3.7
ws: 8.17.1
transitivePeerDependencies:
- bufferutil
@@ -13381,17 +14215,17 @@ snapshots:
socket.io-parser@4.2.4:
dependencies:
'@socket.io/component-emitter': 3.1.2
- debug: 4.3.5
+ debug: 4.3.7
transitivePeerDependencies:
- supports-color
- socket.io@4.7.5:
+ socket.io@4.8.1:
dependencies:
accepts: 1.3.8
base64id: 2.0.0
cors: 2.8.5
- debug: 4.3.5
- engine.io: 6.5.5
+ debug: 4.3.7
+ engine.io: 6.6.2
socket.io-adapter: 2.5.5
socket.io-parser: 4.2.4
transitivePeerDependencies:
@@ -13435,7 +14269,7 @@ snapshots:
stream-chain@2.2.5: {}
- stream-json@1.8.0:
+ stream-json@1.9.1:
dependencies:
stream-chain: 2.2.5
@@ -13476,6 +14310,12 @@ snapshots:
dependencies:
safe-buffer: 5.2.1
+ stringify-object@5.0.0:
+ dependencies:
+ get-own-enumerable-keys: 1.0.0
+ is-obj: 3.0.0
+ is-regexp: 3.1.0
+
strip-ansi@5.2.0:
dependencies:
ansi-regex: 4.1.1
@@ -13486,7 +14326,7 @@ snapshots:
strip-ansi@7.1.0:
dependencies:
- ansi-regex: 6.0.1
+ ansi-regex: 6.1.0
strip-bom@3.0.0: {}
@@ -13502,7 +14342,7 @@ snapshots:
sucrase@3.35.0:
dependencies:
- '@jridgewell/gen-mapping': 0.3.5
+ '@jridgewell/gen-mapping': 0.3.8
commander: 4.1.1
glob: 10.4.5
lines-and-columns: 1.2.4
@@ -13516,12 +14356,12 @@ snapshots:
cookiejar: 2.1.4
debug: 4.4.0
fast-safe-stringify: 2.1.1
- form-data: 4.0.0
+ form-data: 4.0.1
formidable: 2.1.2
methods: 1.1.2
mime: 2.6.0
- qs: 6.12.3
- semver: 7.6.2
+ qs: 6.13.1
+ semver: 7.6.3
transitivePeerDependencies:
- supports-color
@@ -13529,7 +14369,7 @@ snapshots:
dependencies:
copy-anything: 3.0.5
- superjson@2.2.1:
+ superjson@2.2.2:
dependencies:
copy-anything: 3.0.5
@@ -13540,10 +14380,6 @@ snapshots:
transitivePeerDependencies:
- supports-color
- supports-color@5.5.0:
- dependencies:
- has-flag: 3.0.0
-
supports-color@7.2.0:
dependencies:
has-flag: 4.0.0
@@ -13558,26 +14394,26 @@ snapshots:
symbol-observable@4.0.0: {}
- synckit@0.8.8:
+ synckit@0.9.2:
dependencies:
'@pkgr/core': 0.1.1
- tslib: 2.6.3
+ tslib: 2.8.1
tabbable@6.2.0: {}
tailwind-merge@2.6.0: {}
- tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.6.13)(@types/node@20.14.10)(typescript@5.7.2)):
+ tailwindcss@3.4.17(ts-node@10.9.2(@types/node@20.17.12)(typescript@5.7.2)):
dependencies:
'@alloc/quick-lru': 5.2.0
arg: 5.0.2
chokidar: 3.6.0
didyoumean: 1.2.2
dlv: 1.1.3
- fast-glob: 3.3.2
+ fast-glob: 3.3.3
glob-parent: 6.0.2
is-glob: 4.0.3
- jiti: 1.21.6
+ jiti: 1.21.7
lilconfig: 3.1.3
micromatch: 4.0.8
normalize-path: 3.0.0
@@ -13586,14 +14422,16 @@ snapshots:
postcss: 8.4.49
postcss-import: 15.1.0(postcss@8.4.49)
postcss-js: 4.0.1(postcss@8.4.49)
- postcss-load-config: 4.0.2(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.6.13)(@types/node@20.14.10)(typescript@5.7.2))
+ postcss-load-config: 4.0.2(postcss@8.4.49)(ts-node@10.9.2(@types/node@20.17.12)(typescript@5.7.2))
postcss-nested: 6.2.0(postcss@8.4.49)
postcss-selector-parser: 6.1.2
- resolve: 1.22.8
+ resolve: 1.22.10
sucrase: 3.35.0
transitivePeerDependencies:
- ts-node
+ tapable@0.2.9: {}
+
tapable@2.2.1: {}
tar-stream@2.2.0:
@@ -13604,21 +14442,31 @@ snapshots:
inherits: 2.0.4
readable-stream: 3.6.2
- terser-webpack-plugin@5.3.10(@swc/core@1.6.13)(webpack@5.92.1(@swc/core@1.6.13)):
+ tern@0.24.3:
+ dependencies:
+ acorn: 6.4.2
+ acorn-loose: 6.1.0
+ acorn-walk: 6.2.0
+ enhanced-resolve: 2.3.0
+ glob: 7.2.3
+ minimatch: 3.1.2
+ resolve-from: 2.0.0
+
+ terser-webpack-plugin@5.3.11(@swc/core@1.10.6)(webpack@5.97.1(@swc/core@1.10.6)):
dependencies:
'@jridgewell/trace-mapping': 0.3.25
jest-worker: 27.5.1
- schema-utils: 3.3.0
+ schema-utils: 4.3.0
serialize-javascript: 6.0.2
- terser: 5.31.2
- webpack: 5.92.1(@swc/core@1.6.13)
+ terser: 5.37.0
+ webpack: 5.97.1(@swc/core@1.10.6)
optionalDependencies:
- '@swc/core': 1.6.13
+ '@swc/core': 1.10.6(@swc/helpers@0.5.15)
- terser@5.31.2:
+ terser@5.37.0:
dependencies:
'@jridgewell/source-map': 0.3.6
- acorn: 8.12.1
+ acorn: 8.14.0
commander: 2.20.3
source-map-support: 0.5.21
@@ -13665,8 +14513,6 @@ snapshots:
tmpl@1.0.5: {}
- to-fast-properties@2.0.0: {}
-
to-regex-range@5.0.1:
dependencies:
is-number: 7.0.0
@@ -13689,55 +14535,55 @@ snapshots:
tree-kill@1.2.2: {}
- ts-api-utils@1.3.0(typescript@5.5.3):
+ ts-api-utils@1.4.3(typescript@5.7.2):
dependencies:
- typescript: 5.5.3
+ typescript: 5.7.2
- ts-api-utils@1.3.0(typescript@5.7.2):
+ ts-api-utils@2.0.0(typescript@5.7.2):
dependencies:
typescript: 5.7.2
ts-interface-checker@0.1.13: {}
- ts-jest@29.2.2(@babel/core@7.24.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.7))(jest@29.7.0(@types/node@20.14.10)(ts-node@10.9.2(@swc/core@1.6.13)(@types/node@20.14.10)(typescript@5.7.2)))(typescript@5.7.2):
+ ts-jest@29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@20.17.12)(ts-node@10.9.2(@swc/core@1.10.6)(@types/node@20.17.12)(typescript@5.7.2)))(typescript@5.7.2):
dependencies:
bs-logger: 0.2.6
ejs: 3.1.10
fast-json-stable-stringify: 2.1.0
- jest: 29.7.0(@types/node@20.14.10)(ts-node@10.9.2(@swc/core@1.6.13)(@types/node@20.14.10)(typescript@5.7.2))
+ jest: 29.7.0(@types/node@20.17.12)(ts-node@10.9.2(@swc/core@1.10.6)(@types/node@20.17.12)(typescript@5.7.2))
jest-util: 29.7.0
json5: 2.2.3
lodash.memoize: 4.1.2
make-error: 1.3.6
- semver: 7.6.2
+ semver: 7.6.3
typescript: 5.7.2
yargs-parser: 21.1.1
optionalDependencies:
- '@babel/core': 7.24.7
+ '@babel/core': 7.26.0
'@jest/transform': 29.7.0
'@jest/types': 29.6.3
- babel-jest: 29.7.0(@babel/core@7.24.7)
+ babel-jest: 29.7.0(@babel/core@7.26.0)
- ts-loader@9.5.1(typescript@5.7.2)(webpack@5.92.1(@swc/core@1.6.13)):
+ ts-loader@9.5.1(typescript@5.7.2)(webpack@5.97.1(@swc/core@1.10.6)):
dependencies:
chalk: 4.1.2
- enhanced-resolve: 5.17.0
- micromatch: 4.0.7
- semver: 7.6.2
+ enhanced-resolve: 5.18.0
+ micromatch: 4.0.8
+ semver: 7.6.3
source-map: 0.7.4
typescript: 5.7.2
- webpack: 5.92.1(@swc/core@1.6.13)
+ webpack: 5.97.1(@swc/core@1.10.6)
- ts-node@10.9.2(@swc/core@1.6.13)(@types/node@20.14.10)(typescript@5.7.2):
+ ts-node@10.9.2(@swc/core@1.10.6)(@types/node@20.17.12)(typescript@5.7.2):
dependencies:
'@cspotcode/source-map-support': 0.8.1
'@tsconfig/node10': 1.0.11
'@tsconfig/node12': 1.0.11
'@tsconfig/node14': 1.0.3
'@tsconfig/node16': 1.0.4
- '@types/node': 20.14.10
- acorn: 8.12.1
- acorn-walk: 8.3.3
+ '@types/node': 20.17.12
+ acorn: 8.14.0
+ acorn-walk: 8.3.4
arg: 4.1.3
create-require: 1.1.1
diff: 4.0.2
@@ -13746,12 +14592,13 @@ snapshots:
v8-compile-cache-lib: 3.0.1
yn: 3.1.1
optionalDependencies:
- '@swc/core': 1.6.13
+ '@swc/core': 1.10.6(@swc/helpers@0.5.15)
- tsconfig-paths-webpack-plugin@4.1.0:
+ tsconfig-paths-webpack-plugin@4.2.0:
dependencies:
chalk: 4.1.2
- enhanced-resolve: 5.17.0
+ enhanced-resolve: 5.18.0
+ tapable: 2.2.1
tsconfig-paths: 4.2.0
tsconfig-paths@4.2.0:
@@ -13760,9 +14607,11 @@ snapshots:
minimist: 1.2.8
strip-bom: 3.0.0
- tslib@2.6.3: {}
+ tslib@1.14.1: {}
- tsup@8.3.5(@swc/core@1.6.13)(jiti@1.21.6)(postcss@8.4.49)(typescript@5.7.2)(yaml@2.4.5):
+ tslib@2.8.1: {}
+
+ tsup@8.3.5(@swc/core@1.10.6)(jiti@1.21.7)(postcss@8.4.49)(typescript@5.7.2)(yaml@2.7.0):
dependencies:
bundle-require: 5.1.0(esbuild@0.24.2)
cac: 6.7.14
@@ -13772,16 +14621,16 @@ snapshots:
esbuild: 0.24.2
joycon: 3.1.1
picocolors: 1.1.1
- postcss-load-config: 6.0.1(jiti@1.21.6)(postcss@8.4.49)(yaml@2.4.5)
+ postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.4.49)(yaml@2.7.0)
resolve-from: 5.0.0
- rollup: 4.29.1
+ rollup: 4.30.1
source-map: 0.8.0-beta.0
sucrase: 3.35.0
tinyexec: 0.3.2
tinyglobby: 0.2.10
tree-kill: 1.2.2
optionalDependencies:
- '@swc/core': 1.6.13
+ '@swc/core': 1.10.6(@swc/helpers@0.5.15)
postcss: 8.4.49
typescript: 5.7.2
transitivePeerDependencies:
@@ -13790,7 +14639,7 @@ snapshots:
- tsx
- yaml
- tus-js-client@4.1.0:
+ tus-js-client@4.2.3:
dependencies:
buffer-from: 1.1.2
combine-errors: 3.0.3
@@ -13817,27 +14666,27 @@ snapshots:
typedarray@0.0.6: {}
- typescript-eslint@8.18.2(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2):
+ typescript-eslint@8.19.1(eslint@9.17.0(jiti@1.21.7))(typescript@5.7.2):
dependencies:
- '@typescript-eslint/eslint-plugin': 8.18.2(@typescript-eslint/parser@8.18.2(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2))(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2)
- '@typescript-eslint/parser': 8.18.2(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2)
- '@typescript-eslint/utils': 8.18.2(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2)
- eslint: 9.17.0(jiti@1.21.6)
+ '@typescript-eslint/eslint-plugin': 8.19.1(@typescript-eslint/parser@8.19.1(eslint@9.17.0(jiti@1.21.7))(typescript@5.7.2))(eslint@9.17.0(jiti@1.21.7))(typescript@5.7.2)
+ '@typescript-eslint/parser': 8.19.1(eslint@9.17.0(jiti@1.21.7))(typescript@5.7.2)
+ '@typescript-eslint/utils': 8.19.1(eslint@9.17.0(jiti@1.21.7))(typescript@5.7.2)
+ eslint: 9.17.0(jiti@1.21.7)
typescript: 5.7.2
transitivePeerDependencies:
- supports-color
- typescript@5.3.3: {}
-
- typescript@5.5.3: {}
-
typescript@5.7.2: {}
uid@2.0.2:
dependencies:
'@lukeed/csprng': 1.1.0
- undici-types@5.26.5: {}
+ undici-types@6.19.8: {}
+
+ unist-util-stringify-position@3.0.3:
+ dependencies:
+ '@types/unist': 2.0.11
universalify@2.0.1: {}
@@ -13856,12 +14705,6 @@ snapshots:
readable-stream: 2.3.8
setimmediate: 1.0.5
- update-browserslist-db@1.1.0(browserslist@4.23.2):
- dependencies:
- browserslist: 4.23.2
- escalade: 3.1.2
- picocolors: 1.0.1
-
update-browserslist-db@1.1.1(browserslist@4.24.3):
dependencies:
browserslist: 4.24.3
@@ -13881,24 +14724,37 @@ snapshots:
dependencies:
react: 18.2.0
+ use-sync-external-store@1.4.0(react@18.2.0):
+ dependencies:
+ react: 18.2.0
+
util-deprecate@1.0.2: {}
util@0.12.5:
dependencies:
inherits: 2.0.4
- is-arguments: 1.1.1
- is-generator-function: 1.0.10
- is-typed-array: 1.1.13
- which-typed-array: 1.1.15
+ is-arguments: 1.2.0
+ is-generator-function: 1.1.0
+ is-typed-array: 1.1.15
+ which-typed-array: 1.1.18
utils-merge@1.0.1: {}
uuid@10.0.0: {}
+ uuid@11.0.3: {}
+
uuid@8.3.2: {}
uuid@9.0.1: {}
+ uvu@0.5.6:
+ dependencies:
+ dequal: 2.0.3
+ diff: 5.2.0
+ kleur: 4.1.5
+ sade: 1.8.1
+
uzip@0.20201231.0: {}
v8-compile-cache-lib@3.0.1: {}
@@ -13911,42 +14767,32 @@ snapshots:
vary@1.1.2: {}
- vite-plugin-svgr@4.2.0(rollup@4.29.1)(typescript@5.5.3)(vite@5.3.5(@types/node@20.14.10)(terser@5.31.2)):
+ vite-plugin-svgr@4.3.0(rollup@4.30.1)(typescript@5.7.2)(vite@5.4.11(@types/node@20.17.12)(terser@5.37.0)):
dependencies:
- '@rollup/pluginutils': 5.1.0(rollup@4.29.1)
- '@svgr/core': 8.1.0(typescript@5.5.3)
- '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.5.3))
- vite: 5.3.5(@types/node@20.14.10)(terser@5.31.2)
+ '@rollup/pluginutils': 5.1.4(rollup@4.30.1)
+ '@svgr/core': 8.1.0(typescript@5.7.2)
+ '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.7.2))
+ vite: 5.4.11(@types/node@20.17.12)(terser@5.37.0)
transitivePeerDependencies:
- rollup
- supports-color
- typescript
- vite@5.3.5(@types/node@20.14.10)(terser@5.31.2):
+ vite@5.4.11(@types/node@20.17.12)(terser@5.37.0):
dependencies:
esbuild: 0.21.5
postcss: 8.4.49
- rollup: 4.18.1
+ rollup: 4.30.1
optionalDependencies:
- '@types/node': 20.14.10
+ '@types/node': 20.17.12
fsevents: 2.3.3
- terser: 5.31.2
-
- vite@5.4.11(@types/node@20.14.10)(terser@5.31.2):
- dependencies:
- esbuild: 0.21.5
- postcss: 8.4.49
- rollup: 4.29.1
- optionalDependencies:
- '@types/node': 20.14.10
- fsevents: 2.3.3
- terser: 5.31.2
+ terser: 5.37.0
walker@1.0.8:
dependencies:
makeerror: 1.0.12
- watchpack@2.4.1:
+ watchpack@2.4.2:
dependencies:
glob-to-regexp: 0.4.1
graceful-fs: 4.2.11
@@ -13969,19 +14815,18 @@ snapshots:
webpack-sources@3.2.3: {}
- webpack@5.92.1(@swc/core@1.6.13):
+ webpack@5.97.1(@swc/core@1.10.6):
dependencies:
'@types/eslint-scope': 3.7.7
- '@types/estree': 1.0.5
- '@webassemblyjs/ast': 1.12.1
- '@webassemblyjs/wasm-edit': 1.12.1
- '@webassemblyjs/wasm-parser': 1.12.1
- acorn: 8.12.1
- acorn-import-attributes: 1.9.5(acorn@8.12.1)
- browserslist: 4.23.2
+ '@types/estree': 1.0.6
+ '@webassemblyjs/ast': 1.14.1
+ '@webassemblyjs/wasm-edit': 1.14.1
+ '@webassemblyjs/wasm-parser': 1.14.1
+ acorn: 8.14.0
+ browserslist: 4.24.3
chrome-trace-event: 1.0.4
- enhanced-resolve: 5.17.0
- es-module-lexer: 1.5.4
+ enhanced-resolve: 5.18.0
+ es-module-lexer: 1.6.0
eslint-scope: 5.1.1
events: 3.3.0
glob-to-regexp: 0.4.1
@@ -13992,8 +14837,8 @@ snapshots:
neo-async: 2.6.2
schema-utils: 3.3.0
tapable: 2.2.1
- terser-webpack-plugin: 5.3.10(@swc/core@1.6.13)(webpack@5.92.1(@swc/core@1.6.13))
- watchpack: 2.4.1
+ terser-webpack-plugin: 5.3.11(@swc/core@1.10.6)(webpack@5.97.1(@swc/core@1.10.6))
+ watchpack: 2.4.2
webpack-sources: 3.2.3
transitivePeerDependencies:
- '@swc/core'
@@ -14013,12 +14858,13 @@ snapshots:
which-module@2.0.1: {}
- which-typed-array@1.1.15:
+ which-typed-array@1.1.18:
dependencies:
available-typed-arrays: 1.0.7
- call-bind: 1.0.7
+ call-bind: 1.0.8
+ call-bound: 1.0.3
for-each: 0.3.3
- gopd: 1.0.1
+ gopd: 1.2.0
has-tostringtag: 1.0.2
which@1.3.1:
@@ -14062,11 +14908,17 @@ snapshots:
imurmurhash: 0.1.4
signal-exit: 3.0.7
+ ws@7.5.10: {}
+
ws@8.17.1: {}
ws@8.18.0: {}
- xml2js@0.5.0:
+ xml-js@1.6.11:
+ dependencies:
+ sax: 1.4.1
+
+ xml2js@0.6.2:
dependencies:
sax: 1.4.1
xmlbuilder: 11.0.1
@@ -14083,6 +14935,24 @@ snapshots:
lib0: 0.2.99
yjs: 13.6.21
+ y-protocols@1.0.6(yjs@13.6.21):
+ dependencies:
+ lib0: 0.2.99
+ yjs: 13.6.21
+
+ y-webrtc@10.3.0(yjs@13.6.21):
+ dependencies:
+ lib0: 0.2.99
+ simple-peer: 9.11.1
+ y-protocols: 1.0.6(yjs@13.6.21)
+ yjs: 13.6.21
+ optionalDependencies:
+ ws: 8.18.0
+ transitivePeerDependencies:
+ - bufferutil
+ - supports-color
+ - utf-8-validate
+
y18n@4.0.3: {}
y18n@5.0.8: {}
@@ -14091,7 +14961,7 @@ snapshots:
yallist@4.0.0: {}
- yaml@2.4.5: {}
+ yaml@2.7.0: {}
yargs-parser@13.1.2:
dependencies:
@@ -14116,7 +14986,7 @@ snapshots:
yargs@17.7.2:
dependencies:
cliui: 8.0.1
- escalade: 3.1.2
+ escalade: 3.2.0
get-caller-file: 2.0.5
require-directory: 2.1.1
string-width: 4.2.3
@@ -14137,4 +15007,17 @@ snapshots:
compress-commons: 4.1.2
readable-stream: 3.6.2
- zod@3.23.8: {}
+ zod@3.24.1: {}
+
+ zustand@4.5.6(@types/react@18.2.38)(react@18.2.0):
+ dependencies:
+ use-sync-external-store: 1.4.0(react@18.2.0)
+ optionalDependencies:
+ '@types/react': 18.2.38
+ react: 18.2.0
+
+ zustand@5.0.3(@types/react@18.2.38)(react@18.2.0)(use-sync-external-store@1.4.0(react@18.2.0)):
+ optionalDependencies:
+ '@types/react': 18.2.38
+ react: 18.2.0
+ use-sync-external-store: 1.4.0(react@18.2.0)