@hankchen/canvas-editor-vue 0.5.0 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{canvas-CX1RdlFC.js → canvas-CptBzpwT.js} +7 -7
- package/dist/canvas.js +1 -1
- package/dist/index.js +12 -12
- package/dist/layer-panel/addMenu.d.ts +46 -14
- package/dist/layer-panel/index.d.ts +3 -2
- package/dist/{layer-panel-kOceTf8H.js → layer-panel-Cz-tmbJJ.js} +192 -192
- package/dist/layer-panel.js +1 -1
- package/dist/{property-panel-B32ZBQdf.js → property-panel-OBqd6D8W.js} +326 -322
- package/dist/property-panel.js +2 -2
- package/dist/shared/index.d.ts +10 -3
- package/dist/shared/shortcutsHelp.d.ts +4 -1
- package/dist/shared/useDataSourceSchema.d.ts +3 -1
- package/dist/shared/useDropdownMenu.d.ts +107 -2
- package/dist/shared/useExpressionDiagnostics.d.ts +11 -0
- package/dist/shared.js +7 -7
- package/dist/{status-bar-_PvEXyq8.js → status-bar-DCuK2R88.js} +67 -65
- package/dist/status-bar.js +1 -1
- package/dist/style.css +1 -1
- package/dist/{uploadFile-D1RY-ji0.js → uploadFile-DbB-KhII.js} +11 -7
- package/dist/useDataSourceSchema-CG9EGzwc.js +464 -0
- package/package.json +2 -2
- package/dist/useDataSourceSchema-CGbldbUj.js +0 -237
package/dist/property-panel.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { a as e, c as t, d as n, f as r, i, l as a, n as o, o as s, r as c, s as l, t as u, u as d } from "./property-panel-
|
|
2
|
-
import { i as f, r as p } from "./uploadFile-
|
|
1
|
+
import { a as e, c as t, d as n, f as r, i, l as a, n as o, o as s, r as c, s as l, t as u, u as d } from "./property-panel-OBqd6D8W.js";
|
|
2
|
+
import { i as f, r as p } from "./uploadFile-DbB-KhII.js";
|
|
3
3
|
export { l as CANVAS_FIELD_SECTIONS, t as FIELD_SECTIONS_BY_TYPE, p as FONT_PICKER_KEY, e as IMAGE_UPLOAD_KEY, o as PropertyField, u as PropertyPanel, i as controlRegistry, a as fieldSectionsForPath, d as fieldSectionsForType, f as injectFontPicker, s as injectImageUpload, n as layerRoleAt, r as readField, c as usePropertyPanel };
|
package/dist/shared/index.d.ts
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* 跨域切片桥出口:选择/视口/历史/快捷键切片桥、快捷键帮助面板(开合单例态 +
|
|
3
3
|
* 展示件)、快捷键展示侧纯函数与常量(键位符号/平台侦测/武装提示句——包内
|
|
4
|
-
* 散落组件与宿主工具栏共用,editor-top-toolbar 工单 03
|
|
4
|
+
* 散落组件与宿主工具栏共用,editor-top-toolbar 工单 03 起入出口;带档变体提示
|
|
5
|
+
* armLayerCreatePresetHint 住 layer-panel 域 addMenu——面板预设二级分发专用,
|
|
6
|
+
* 单域消费不进 shared,评审整改 F1)、可编辑目标
|
|
5
7
|
* 谓词、面板图标统一封装、DOM File 上传组装、状态栏瞬时反馈单例、下拉菜单底座
|
|
6
8
|
* (呈现件 + 开合逻辑 composable;工具栏三下拉内建触发钮直用,状态栏缩放菜单/
|
|
7
9
|
* 面板+经 #trigger/#body 受控插槽迁移消费——issues/05)与表达式补全五件(数据
|
|
8
|
-
*
|
|
10
|
+
* 契约/锚点测量/浮层控件/上下文判定与候选源适配——属性面板与画布文本
|
|
9
11
|
* 编辑两域共用)及裸路径补全控件 usePathCompletion(rows-path-completion 工单
|
|
10
12
|
* 02:复用同门 Popup/Anchor/applyCompletion,触发语义分轨——裸路径输入即弹)、
|
|
11
13
|
* rowsPath 候选源组装 rowsPathCompletionSource(工单 03/04:「行数组」文案置入
|
|
@@ -19,6 +21,11 @@
|
|
|
19
21
|
* 两浮层与选择器菜单共用)。
|
|
20
22
|
* 这是唯一允许被各域引用的层——域间横向 import 被依赖红线
|
|
21
23
|
* (editor-vue-*-isolation)禁止,跨域消费一律收口到这里。
|
|
24
|
+
* 下拉底座(editor-top-toolbar 工单 02 起入出口):composable 与基础条目类型。
|
|
25
|
+
* 两段式 submenu 件(canvas-web-preset-submenu 工单 02:类型 DropdownSubmenuEntry、
|
|
26
|
+
* 判定 isSubmenuEntry、开合/翻转/二级键盘/焦点落点各纯函数)与包内消费域一样
|
|
27
|
+
* 只经 useDropdownMenu 模块直引(呈现件/面板/工具栏/单测),无 barrel 消费者,
|
|
28
|
+
* 不重复入出口(评审整改 F3 收敛——纯函数/类型导出按真实消费面入 barrel)。
|
|
22
29
|
*/
|
|
23
30
|
export { default as HelpDialog } from './HelpDialog';
|
|
24
31
|
export { default as DropdownMenu } from './DropdownMenu';
|
|
@@ -39,7 +46,7 @@ export { pathPickerEntries, type PathPickerEntry } from './pathPickerModel';
|
|
|
39
46
|
export { placePopupInViewport, POPUP_GAP, POPUP_MARGIN, type PopupAnchorBox, type PopupViewportPosition, } from './popupPosition';
|
|
40
47
|
export { useHistory, type HistoryAvailability } from './useHistory';
|
|
41
48
|
export { useSelection } from './useSelection';
|
|
42
|
-
export { useDataSourceSchema } from './useDataSourceSchema';
|
|
49
|
+
export { useDataSourceSchema, useDataSourceSchemaRejection } from './useDataSourceSchema';
|
|
43
50
|
export { useShortcuts } from './useShortcuts';
|
|
44
51
|
export { useShortcutsHelp, type ShortcutsHelp } from './useShortcutsHelp';
|
|
45
52
|
export { useTransientFeedback, type TransientFeedback } from './useTransientFeedback';
|
|
@@ -19,7 +19,10 @@ export declare function shortcutActionLabel(action: EditorShortcutAction, platfo
|
|
|
19
19
|
* 武装建层的状态栏瞬时提示(canvas-web-drag-create 工单 03):面板新增项与
|
|
20
20
|
* T/G/Q/I 层型快捷键两入口共用同一句(LayerPanel 与 useShortcuts 直引此常量,
|
|
21
21
|
* 文案单点维护)。瞬时语义 = show 后数秒自动清空(useTransientFeedback TTL),
|
|
22
|
-
*
|
|
22
|
+
* 武装本身是待命态,不随解除主动撤提示。带档变体(「画拉建{层型}({档名})」
|
|
23
|
+
* 句式,面板预设二级分发专用)住 layer-panel 域 addMenu 的
|
|
24
|
+
* armLayerCreatePresetHint(评审整改 F1 迁入——单域消费不进 shared),尾句复用
|
|
25
|
+
* 本常量。
|
|
23
26
|
*/
|
|
24
27
|
export declare const ARM_LAYER_CREATE_HINT = "\u753B\u62C9\u6216\u70B9\u51FB\u843D\u5C42\uFF0CEsc \u53D6\u6D88";
|
|
25
28
|
/**
|
|
@@ -1,3 +1,5 @@
|
|
|
1
1
|
import { ComputedRef } from 'vue';
|
|
2
|
-
import { EditorSession, ExpressionSchemaNode } from '@hankchen/canvas-editor';
|
|
2
|
+
import { DataSourceSchemaRejection, EditorSession, ExpressionSchemaNode } from '@hankchen/canvas-editor';
|
|
3
3
|
export declare function useDataSourceSchema(editor: EditorSession): ComputedRef<ExpressionSchemaNode | null>;
|
|
4
|
+
/** 声明拒绝详情桥(声明被拒呈现面,2b):null = 未注入/已编译/已清除 */
|
|
5
|
+
export declare function useDataSourceSchemaRejection(editor: EditorSession): ComputedRef<DataSourceSchemaRejection | null>;
|
|
@@ -13,8 +13,30 @@ export interface DropdownMenuItem {
|
|
|
13
13
|
dataAttrs?: Readonly<Record<string, string>>;
|
|
14
14
|
run: () => void;
|
|
15
15
|
}
|
|
16
|
-
/**
|
|
17
|
-
|
|
16
|
+
/**
|
|
17
|
+
* 两段式 submenu 条目(canvas-web-preset-submenu 工单 02):一级行渲染为左右两
|
|
18
|
+
* 段命中区——主体(label + 可选 shortcut 灰字后缀)点击/Enter = run + 收菜单
|
|
19
|
+
* (直建语义,spec 决策 3「保点一级直达」);右缘 ▸ 钮悬停/点击唤出 children
|
|
20
|
+
* 二级浮层(预设项,title 承载归属说明)。children 收完整 DropdownMenuEntry
|
|
21
|
+
* (容纳分隔符);dataAttrs 透传主体钮(面板 data-add-layer 同缝);keepsOpen
|
|
22
|
+
* 无此形态——主体分发无条件收菜单(spec 门控拍板)。
|
|
23
|
+
*/
|
|
24
|
+
export interface DropdownSubmenuEntry {
|
|
25
|
+
kind: 'submenu';
|
|
26
|
+
label: string;
|
|
27
|
+
title?: string;
|
|
28
|
+
disabled?: boolean;
|
|
29
|
+
shortcut?: string;
|
|
30
|
+
dataAttrs?: Readonly<Record<string, string>>;
|
|
31
|
+
/** 主体点击/Enter = 直建(run + 收整个菜单) */
|
|
32
|
+
run: () => void;
|
|
33
|
+
/** 预设二级条目(子项 run = 带 preset 直建,装配归宿主——工单 03 消费) */
|
|
34
|
+
children: readonly DropdownMenuEntry[];
|
|
35
|
+
}
|
|
36
|
+
/** submenu 形态判定(kind 字段只此形态持有,in 判定窄化联合) */
|
|
37
|
+
export declare function isSubmenuEntry(entry: DropdownMenuEntry): entry is DropdownSubmenuEntry;
|
|
38
|
+
/** 菜单条目 = 菜单项 | 两段式 submenu | 分隔符(成员间可插,排列▾/视图▾ 各需一段) */
|
|
39
|
+
export type DropdownMenuEntry = DropdownMenuItem | DropdownSubmenuEntry | 'separator';
|
|
18
40
|
export interface DropdownMenuController {
|
|
19
41
|
/** 菜单开合态(触发钮 aria-expanded 与菜单 v-if 同源) */
|
|
20
42
|
open: Ref<boolean>;
|
|
@@ -49,3 +71,86 @@ export type MenuFocusKey = 'ArrowDown' | 'ArrowUp' | 'Home' | 'End';
|
|
|
49
71
|
* 时 ↓ 落首个启用项、↑ 落末个;全置灰返回 -1,调用方回焦菜单根。
|
|
50
72
|
*/
|
|
51
73
|
export declare function nextEnabledItemIndex(enabled: readonly boolean[], current: number, key: MenuFocusKey): number;
|
|
74
|
+
/** 二级开合动作(指针门控的语义输入):open = ▸ 悬停/键盘 →(恒开指定行);
|
|
75
|
+
* toggle = ▸ 点击(同行翻转、异行换开);close = 移出菜单/菜单随收/子项分发 */
|
|
76
|
+
export interface SubmenuToggleAction<T> {
|
|
77
|
+
type: 'open' | 'toggle' | 'close';
|
|
78
|
+
/** open/toggle 的目标条目(close 时无意义,恒 null) */
|
|
79
|
+
target?: T;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* 二级开合切换(纯函数):单开不变量——任一时刻至多一行二级在场。open 换开
|
|
83
|
+
* (异行收旧开新、同行保持)、toggle 同行翻转(已开收、未开开)、close 全关。
|
|
84
|
+
*/
|
|
85
|
+
export declare function nextOpenSubmenu<T>(current: T | null, action: SubmenuToggleAction<T>): T | null;
|
|
86
|
+
/** 二级浮层锚点盒(触发行 ▸ 的视口坐标,getBoundingClientRect 同形四轴) */
|
|
87
|
+
export interface SubmenuAnchorBox {
|
|
88
|
+
top: number;
|
|
89
|
+
bottom: number;
|
|
90
|
+
left: number;
|
|
91
|
+
right: number;
|
|
92
|
+
}
|
|
93
|
+
/** 二级浮层落点(视口坐标,fixed 直用);side = 弹出侧(右缘放不下翻左) */
|
|
94
|
+
export interface SubmenuPlacement {
|
|
95
|
+
left: number;
|
|
96
|
+
top: number;
|
|
97
|
+
side: 'right' | 'left';
|
|
98
|
+
}
|
|
99
|
+
/** 二级浮层与触发行的屏幕间隙(px,主菜单 MENU_GAP_PX 同值语义) */
|
|
100
|
+
export declare const SUBMENU_GAP_PX = 6;
|
|
101
|
+
/** 二级浮层与视口边缘的最小留白(px,主菜单 VIEWPORT_MARGIN_PX 同值语义) */
|
|
102
|
+
export declare const SUBMENU_VIEWPORT_MARGIN_PX = 2;
|
|
103
|
+
/**
|
|
104
|
+
* 二级浮层定位(纯函数):默认弹触发行右侧(左缘 = 行右缘 + 间隙、顶缘对齐行
|
|
105
|
+
* 顶缘);右缘放不下翻左侧(右缘 = 行左缘 − 间隙);水平/垂直都钳位进视口。
|
|
106
|
+
* 宽/高度量不到(0——首帧未渲染/降级)按「放得下/不移动」处理,不误翻转不误
|
|
107
|
+
* 收口(首帧锚点直用,渲染后调用方补量钳位——主菜单弹层两段式定位同惯例)。
|
|
108
|
+
* 纯几何、零 DOM、Node 可测。
|
|
109
|
+
*/
|
|
110
|
+
export declare function placeSubmenuInViewport(options: {
|
|
111
|
+
anchor: SubmenuAnchorBox;
|
|
112
|
+
flyoutWidth: number;
|
|
113
|
+
flyoutHeight: number;
|
|
114
|
+
viewportWidth: number;
|
|
115
|
+
viewportHeight: number;
|
|
116
|
+
/** 触发行与浮层的间隙;缺省 SUBMENU_GAP_PX */
|
|
117
|
+
gap?: number;
|
|
118
|
+
/** 视口留白;缺省 SUBMENU_VIEWPORT_MARGIN_PX */
|
|
119
|
+
margin?: number;
|
|
120
|
+
}): SubmenuPlacement;
|
|
121
|
+
/**
|
|
122
|
+
* 二级浮层键盘动作(纯函数):焦点在二级浮层子项上时的按键决策——↑↓/Home/End
|
|
123
|
+
* 推进(落点仍归 nextEnabledItemIndex)、←/Esc 收二级(菜单留场,两段收的第一
|
|
124
|
+
* 段)、Enter/Space 激活焦点子项(带 preset 直建)、Tab 收整个菜单(沿现状,
|
|
125
|
+
* 不 preventDefault 由调用方保证)、其余 none(模态吞掉)。
|
|
126
|
+
*/
|
|
127
|
+
export type SubmenuKeyAction = {
|
|
128
|
+
type: 'none';
|
|
129
|
+
} | {
|
|
130
|
+
type: 'move';
|
|
131
|
+
key: MenuFocusKey;
|
|
132
|
+
} | {
|
|
133
|
+
type: 'close';
|
|
134
|
+
} | {
|
|
135
|
+
type: 'activate';
|
|
136
|
+
} | {
|
|
137
|
+
type: 'close-menu';
|
|
138
|
+
};
|
|
139
|
+
export declare function submenuKeyAction(key: string): SubmenuKeyAction;
|
|
140
|
+
/**
|
|
141
|
+
* 开焦点落点(纯函数):条目 DOM 序首个启用项(无 disabled 属性),全置灰或空
|
|
142
|
+
* 清单回落容器根(菜单根/二级浮层根 tabindex=-1 可编程聚焦)。菜单开时入菜单
|
|
143
|
+
* 与二级键盘开入首项共用同一判定。
|
|
144
|
+
*/
|
|
145
|
+
export declare function focusTargetOnOpen(items: readonly HTMLElement[], container: HTMLElement): HTMLElement;
|
|
146
|
+
/**
|
|
147
|
+
* 收二级回焦落点(纯函数):焦点在两段式行宿主内 → 该行 ▸ 钮(APG「关子菜单
|
|
148
|
+
* 回父项」惯例);焦点不在行内(防御路径)→ null = 不迁焦(只收不追焦)。
|
|
149
|
+
*/
|
|
150
|
+
export declare function focusTargetOnSubmenuClose(active: HTMLElement | null): HTMLElement | null;
|
|
151
|
+
/**
|
|
152
|
+
* 收菜单回焦落点(纯函数):触发钮元素在场 → 回焦该钮(APG menu button 惯例,
|
|
153
|
+
* 幸免菜单 v-if 卸载时焦点坠 body);#trigger 自绘钮未接 triggerRef 的退化 →
|
|
154
|
+
* null = 不迁焦。哪些收起路回焦(点外收不回焦等)的编排归呈现件。
|
|
155
|
+
*/
|
|
156
|
+
export declare function focusTargetOnMenuClose(trigger: HTMLElement | null): HTMLElement | null;
|
|
@@ -2,6 +2,17 @@ import { ComputedRef, MaybeRefOrGetter, Ref } from 'vue';
|
|
|
2
2
|
import { ExpressionFragmentDiagnostic } from '@hankchen/canvas-editor';
|
|
3
3
|
/** 诊断汇总文案:多处取首条 kind 带计数;无诊断返回空串 */
|
|
4
4
|
export declare function expressionDiagnosticHint(diagnostics: readonly ExpressionFragmentDiagnostic[]): string;
|
|
5
|
+
/**
|
|
6
|
+
* 资源字段绑定门引导(resource-expression-single-ref 呈现面):资源字段表达式态
|
|
7
|
+
* 未注入数据源声明 → 选择器无菜单(引用以声明为门)——弱提示行说明缺席原因。
|
|
8
|
+
*/
|
|
9
|
+
export declare const RESOURCE_BINDING_HINT = "\u7ED1\u5B9A\u6570\u636E\u6E90\u540E\u53EF\u9009\u62E9\u5B57\u6BB5";
|
|
10
|
+
/**
|
|
11
|
+
* 资源单值门的提示文案(ADR 0020 呈现面):门是内容引用约束,不是语法错——
|
|
12
|
+
* 不走「表达式语法错误」框架,按修复通道在场与否给动作指引(菜单点选是资源面
|
|
13
|
+
* 唯一写入口);违例 kind(拼接/函数/字面残留)只进诊断面,呈现统一按通道分流。
|
|
14
|
+
*/
|
|
15
|
+
export declare function resourceDiagnosticHint(hasSource: boolean): string;
|
|
5
16
|
export declare function useExpressionDiagnostics(options: {
|
|
6
17
|
/** 宿主输入元素(textarea/input),模板 ref 传入 */
|
|
7
18
|
target: Ref<HTMLTextAreaElement | HTMLInputElement | null>;
|
package/dist/shared.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { a as e, i as t, n, o as r, r as i, s as a, t as o } from "./popupPosition-Ck5Gsvjy.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { i as
|
|
2
|
+
import { i as s, n as c, r as l, t as u } from "./resourceTemplate-cdcQtp9a.js";
|
|
3
|
+
import { c as d, i as f, n as p, s as m, t as h } from "./useTransientFeedback-CTjmMmFF.js";
|
|
4
|
+
import { c as g, d as _, i as v, l as y, n as b, o as x, r as S, t as C, u as w } from "./uploadFile-DbB-KhII.js";
|
|
5
5
|
import { n as T, t as E } from "./usePathCompletion-Do17CQ6l.js";
|
|
6
6
|
import { n as D, t as O } from "./useViewport-D9Ipevzs.js";
|
|
7
|
-
import {
|
|
8
|
-
import { t as
|
|
9
|
-
import { n as
|
|
10
|
-
export {
|
|
7
|
+
import { i as k, n as A, r as j, t as M } from "./useDataSourceSchema-CG9EGzwc.js";
|
|
8
|
+
import { t as N } from "./useShortcutsHelp-CsyarO2P.js";
|
|
9
|
+
import { n as P, r as F, t as I } from "./shared-wuupBoZg.js";
|
|
10
|
+
export { f as ARM_LAYER_CREATE_HINT, j as DropdownMenu, r as ExpressionCompletionPopup, l as ExpressionPathPicker, S as FONT_PICKER_KEY, F as HelpDialog, o as POPUP_GAP, n as POPUP_MARGIN, a as PanelIcon, e as applyCompletion, u as attachResourceTemplate, m as detectShortcutPlatform, w as expressionCompletionSource, x as expressionDiagnosticHint, _ as expressionFieldContext, v as injectFontPicker, p as isEditableEventTarget, t as measureCursorAnchor, s as pathPickerEntries, i as placePopupInViewport, T as rowsPathCompletionSource, b as selectionFieldMergeKey, d as shortcutActionLabel, c as stripResourceTemplate, C as uploadFileFromDom, M as useDataSourceSchema, A as useDataSourceSchemaRejection, k as useDropdownMenu, y as useExpressionCompletion, g as useExpressionDiagnostics, P as useHistory, E as usePathCompletion, D as useSelection, I as useShortcuts, N as useShortcutsHelp, h as useTransientFeedback, O as useViewport };
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { a as e } from "./layerPath-uy2ywyld.js";
|
|
2
2
|
import { c as t, s as n, t as r, u as i } from "./useTransientFeedback-CTjmMmFF.js";
|
|
3
3
|
import { n as a, t as o } from "./useViewport-D9Ipevzs.js";
|
|
4
|
-
import { n as s,
|
|
5
|
-
import { t as
|
|
6
|
-
import { Fragment as
|
|
4
|
+
import { n as s, r as c, t as l } from "./useDataSourceSchema-CG9EGzwc.js";
|
|
5
|
+
import { t as u } from "./useShortcutsHelp-CsyarO2P.js";
|
|
6
|
+
import { Fragment as d, computed as f, createCommentVNode as p, createElementBlock as m, createElementVNode as h, createVNode as g, defineComponent as _, onScopeDispose as v, openBlock as y, shallowRef as b, toDisplayString as x, unref as S, withCtx as C } from "vue";
|
|
7
7
|
//#region src/status-bar/layerPathLabel.ts
|
|
8
|
-
function
|
|
8
|
+
function w(e) {
|
|
9
9
|
let t = `图层 ${String(e[1])}`;
|
|
10
10
|
for (let n = 2; n < e.length; n += 1) {
|
|
11
11
|
let r = e[n];
|
|
@@ -19,7 +19,7 @@ function C(e) {
|
|
|
19
19
|
}
|
|
20
20
|
//#endregion
|
|
21
21
|
//#region src/status-bar/layerGeometryLabel.ts
|
|
22
|
-
var
|
|
22
|
+
var T = {
|
|
23
23
|
"top-left": "左上",
|
|
24
24
|
top: "中上",
|
|
25
25
|
"top-right": "右上",
|
|
@@ -30,49 +30,49 @@ var w = {
|
|
|
30
30
|
bottom: "中下",
|
|
31
31
|
"bottom-right": "右下"
|
|
32
32
|
};
|
|
33
|
-
function
|
|
34
|
-
return `x=${Math.round(e.x)} y=${Math.round(e.y)} · ${Math.round(t.width)}×${Math.round(t.height)} · ${
|
|
33
|
+
function E(e, t) {
|
|
34
|
+
return `x=${Math.round(e.x)} y=${Math.round(e.y)} · ${Math.round(t.width)}×${Math.round(t.height)} · ${T[e.anchor]}锚`;
|
|
35
35
|
}
|
|
36
36
|
//#endregion
|
|
37
37
|
//#region src/status-bar/useDoc.ts
|
|
38
|
-
function
|
|
39
|
-
let t =
|
|
38
|
+
function D(e) {
|
|
39
|
+
let t = b(e.store.doc), n = e.subscribe((n) => {
|
|
40
40
|
n.scope === "doc" && (t.value = e.store.doc);
|
|
41
41
|
});
|
|
42
|
-
return
|
|
42
|
+
return v(n, !0), f(() => t.value);
|
|
43
43
|
}
|
|
44
44
|
//#endregion
|
|
45
45
|
//#region src/status-bar/StatusBar.vue?vue&type=script&setup=true&lang.ts
|
|
46
|
-
var
|
|
46
|
+
var O = {
|
|
47
47
|
class: "cn-statusbar",
|
|
48
48
|
role: "status",
|
|
49
49
|
"aria-label": "编辑器状态栏"
|
|
50
|
-
},
|
|
50
|
+
}, k = [
|
|
51
51
|
"aria-expanded",
|
|
52
52
|
"onClick",
|
|
53
53
|
"onKeydown"
|
|
54
|
-
],
|
|
54
|
+
], A = {
|
|
55
55
|
class: "cn-statusbar__segment",
|
|
56
56
|
"data-selection": ""
|
|
57
|
-
},
|
|
57
|
+
}, j = {
|
|
58
58
|
class: "cn-statusbar__segment cn-statusbar__segment--pending",
|
|
59
59
|
"data-pending": ""
|
|
60
|
-
},
|
|
60
|
+
}, M = {
|
|
61
61
|
class: "cn-statusbar__segment",
|
|
62
62
|
"data-geometry": ""
|
|
63
|
-
},
|
|
63
|
+
}, N = {
|
|
64
64
|
class: "cn-statusbar__segment",
|
|
65
65
|
"data-resource": ""
|
|
66
|
-
},
|
|
66
|
+
}, P = {
|
|
67
67
|
class: "cn-statusbar__segment",
|
|
68
68
|
"data-save": ""
|
|
69
|
-
},
|
|
69
|
+
}, F = {
|
|
70
70
|
class: "cn-statusbar__segment",
|
|
71
71
|
"data-schema": ""
|
|
72
|
-
},
|
|
72
|
+
}, I = {
|
|
73
73
|
class: "cn-statusbar__segment",
|
|
74
74
|
"data-feedback": ""
|
|
75
|
-
},
|
|
75
|
+
}, L = /*#__PURE__*/ i(/* @__PURE__ */ _({
|
|
76
76
|
__name: "StatusBar",
|
|
77
77
|
props: {
|
|
78
78
|
editor: {},
|
|
@@ -82,58 +82,60 @@ var D = {
|
|
|
82
82
|
feedback: { default: "" }
|
|
83
83
|
},
|
|
84
84
|
setup(i) {
|
|
85
|
-
let
|
|
86
|
-
let e =
|
|
87
|
-
return e === null ? "未选中图层" :
|
|
88
|
-
}),
|
|
89
|
-
let t =
|
|
85
|
+
let _ = i, v = o(_.editor), b = a(_.editor), T = D(_.editor), L = l(_.editor), R = s(_.editor), z = f(() => Math.round(v.value.zoom * 100)), B = f(() => {
|
|
86
|
+
let e = b.value;
|
|
87
|
+
return e === null ? "未选中图层" : w(e);
|
|
88
|
+
}), V = f(() => {
|
|
89
|
+
let t = b.value, n = T.value;
|
|
90
90
|
if (t === null || n === null) return null;
|
|
91
|
-
let r = e(n, t), i =
|
|
92
|
-
return !r || !i ? null :
|
|
93
|
-
}),
|
|
94
|
-
let e =
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
91
|
+
let r = e(n, t), i = _.editor.layerBoxAt(t);
|
|
92
|
+
return !r || !i ? null : E(r.position, i);
|
|
93
|
+
}), H = f(() => {
|
|
94
|
+
let e = L.value;
|
|
95
|
+
if (e !== null) return `schema 已注入顶层 ${e.properties?.size ?? 0} 键`;
|
|
96
|
+
let t = R.value;
|
|
97
|
+
return t === null ? "schema 未注入" : `schema 声明被拒:${t.detail}`;
|
|
98
|
+
}), { toggle: U } = u(), W = `快捷键帮助(${t("helpShortcuts", n())})`, G = r(), K = f(() => _.feedback === "" ? G.message.value : _.feedback);
|
|
99
|
+
function q(e) {
|
|
100
|
+
let { width: t, height: n } = _.editor.getSurfaceSize();
|
|
101
|
+
_.editor.zoomAt(t / 2, n / 2, v.value.zoom * e);
|
|
100
102
|
}
|
|
101
|
-
let
|
|
103
|
+
let J = f(() => [
|
|
102
104
|
{
|
|
103
105
|
label: "100%",
|
|
104
106
|
dataAttrs: { "data-zoom-100": "" },
|
|
105
|
-
run: () =>
|
|
107
|
+
run: () => _.editor.resetZoom()
|
|
106
108
|
},
|
|
107
109
|
{
|
|
108
110
|
label: "适应画布",
|
|
109
111
|
dataAttrs: { "data-zoom-fit": "" },
|
|
110
|
-
run: () =>
|
|
112
|
+
run: () => _.editor.fitToSurface()
|
|
111
113
|
},
|
|
112
114
|
{
|
|
113
115
|
label: "适应选区",
|
|
114
116
|
dataAttrs: { "data-zoom-fit-selection": "" },
|
|
115
|
-
run: () =>
|
|
117
|
+
run: () => _.editor.fitToSelection()
|
|
116
118
|
},
|
|
117
119
|
{
|
|
118
120
|
label: "放大",
|
|
119
121
|
title: "放大(以视口中心为锚)",
|
|
120
122
|
dataAttrs: { "data-zoom-in": "" },
|
|
121
|
-
run: () =>
|
|
123
|
+
run: () => q(1.25)
|
|
122
124
|
},
|
|
123
125
|
{
|
|
124
126
|
label: "缩小",
|
|
125
127
|
title: "缩小(以视口中心为锚)",
|
|
126
128
|
dataAttrs: { "data-zoom-out": "" },
|
|
127
|
-
run: () =>
|
|
129
|
+
run: () => q(1 / 1.25)
|
|
128
130
|
}
|
|
129
131
|
]);
|
|
130
|
-
return (e, t) => (
|
|
131
|
-
|
|
132
|
+
return (e, t) => (y(), m("footer", O, [
|
|
133
|
+
g(c, {
|
|
132
134
|
label: "缩放",
|
|
133
135
|
direction: "up",
|
|
134
|
-
items:
|
|
136
|
+
items: J.value
|
|
135
137
|
}, {
|
|
136
|
-
trigger:
|
|
138
|
+
trigger: C(({ open: e, toggle: t, triggerRef: n, onKeydown: r }) => [h("button", {
|
|
137
139
|
ref: n,
|
|
138
140
|
type: "button",
|
|
139
141
|
class: "cn-statusbar__segment cn-statusbar__zoom-trigger",
|
|
@@ -143,53 +145,53 @@ var D = {
|
|
|
143
145
|
title: "缩放",
|
|
144
146
|
onClick: t,
|
|
145
147
|
onKeydown: r
|
|
146
|
-
},
|
|
148
|
+
}, x(z.value) + "% ", 41, k)]),
|
|
147
149
|
_: 1
|
|
148
150
|
}, 8, ["items"]),
|
|
149
|
-
t[6] ||=
|
|
151
|
+
t[6] ||= h("span", {
|
|
150
152
|
class: "cn-statusbar__divider",
|
|
151
153
|
"aria-hidden": "true"
|
|
152
154
|
}, null, -1),
|
|
153
|
-
|
|
154
|
-
|
|
155
|
+
h("span", A, x(B.value), 1),
|
|
156
|
+
_.pendingCount > 0 ? (y(), m(d, { key: 0 }, [t[1] ||= h("span", {
|
|
155
157
|
class: "cn-statusbar__divider",
|
|
156
158
|
"aria-hidden": "true"
|
|
157
|
-
}, null, -1),
|
|
158
|
-
|
|
159
|
+
}, null, -1), h("span", j, " 物化中 " + x(_.pendingCount), 1)], 64)) : p("", !0),
|
|
160
|
+
V.value === null ? p("", !0) : (y(), m(d, { key: 1 }, [t[2] ||= h("span", {
|
|
159
161
|
class: "cn-statusbar__divider",
|
|
160
162
|
"aria-hidden": "true"
|
|
161
|
-
}, null, -1),
|
|
162
|
-
|
|
163
|
+
}, null, -1), h("span", M, x(V.value), 1)], 64)),
|
|
164
|
+
_.resourceNote === "" ? p("", !0) : (y(), m(d, { key: 2 }, [t[3] ||= h("span", {
|
|
163
165
|
class: "cn-statusbar__divider",
|
|
164
166
|
"aria-hidden": "true"
|
|
165
|
-
}, null, -1),
|
|
166
|
-
|
|
167
|
+
}, null, -1), h("span", N, x(_.resourceNote), 1)], 64)),
|
|
168
|
+
_.saveState === void 0 ? p("", !0) : (y(), m(d, { key: 3 }, [t[4] ||= h("span", {
|
|
167
169
|
class: "cn-statusbar__divider",
|
|
168
170
|
"aria-hidden": "true"
|
|
169
|
-
}, null, -1),
|
|
170
|
-
t[7] ||=
|
|
171
|
+
}, null, -1), h("span", P, x(_.saveState === "dirty" ? "● 未保存" : "○ 已保存"), 1)], 64)),
|
|
172
|
+
t[7] ||= h("span", {
|
|
171
173
|
class: "cn-statusbar__divider",
|
|
172
174
|
"aria-hidden": "true"
|
|
173
175
|
}, null, -1),
|
|
174
|
-
|
|
175
|
-
|
|
176
|
+
h("span", F, x(H.value), 1),
|
|
177
|
+
K.value === "" ? p("", !0) : (y(), m(d, { key: 4 }, [t[5] ||= h("span", {
|
|
176
178
|
class: "cn-statusbar__divider",
|
|
177
179
|
"aria-hidden": "true"
|
|
178
|
-
}, null, -1),
|
|
179
|
-
t[8] ||=
|
|
180
|
+
}, null, -1), h("span", I, x(K.value), 1)], 64)),
|
|
181
|
+
t[8] ||= h("span", {
|
|
180
182
|
class: "cn-statusbar__divider",
|
|
181
183
|
"aria-hidden": "true"
|
|
182
184
|
}, null, -1),
|
|
183
|
-
|
|
185
|
+
h("button", {
|
|
184
186
|
type: "button",
|
|
185
187
|
class: "cn-statusbar__segment cn-statusbar__help",
|
|
186
188
|
"data-help": "",
|
|
187
189
|
"aria-haspopup": "dialog",
|
|
188
|
-
title:
|
|
189
|
-
onClick: t[0] ||= (...e) =>
|
|
190
|
+
title: W,
|
|
191
|
+
onClick: t[0] ||= (...e) => S(U) && S(U)(...e)
|
|
190
192
|
}, " 快捷键 ")
|
|
191
193
|
]));
|
|
192
194
|
}
|
|
193
|
-
}), [["__scopeId", "data-v-
|
|
195
|
+
}), [["__scopeId", "data-v-ea2a5856"]]);
|
|
194
196
|
//#endregion
|
|
195
|
-
export {
|
|
197
|
+
export { E as n, w as r, L as t };
|
package/dist/status-bar.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { n as e, r as t, t as n } from "./status-bar-
|
|
1
|
+
import { n as e, r as t, t as n } from "./status-bar-DCuK2R88.js";
|
|
2
2
|
export { n as StatusBar, e as formatLayerGeometry, t as formatLayerPath };
|
package/dist/style.css
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
.cn-align-float[data-v-9a761d37]{--cn-fg:#e6edf7;--cn-muted:#7c8ca5;--cn-field-line:#2a3a57;--cn-accent:#38bdf8;--cn-hover:#16223a;border:1px solid var(--cn-field-line);-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);color:var(--cn-fg);-webkit-user-select:none;user-select:none;background:#0b1220eb;border-radius:9px;align-items:center;gap:4px;padding:5px 8px;display:inline-flex;box-shadow:0 10px 26px #00000073}.cn-align-float__group[data-v-9a761d37]{align-items:center;gap:2px;display:flex}.cn-align-float__divider[data-v-9a761d37]{background:var(--cn-field-line);width:1px;height:16px}.cn-align-float__key[data-v-9a761d37]{width:24px;height:24px;color:var(--cn-fg);cursor:pointer;background:0 0;border:none;border-radius:6px;place-content:center;padding:0;display:grid}.cn-align-float__key[data-v-9a761d37]:hover:not(:disabled){background:var(--cn-hover);color:var(--cn-accent)}.cn-align-float--disabled[data-v-9a761d37]{color:var(--cn-muted)}.cn-align-float--disabled .cn-align-float__key[data-v-9a761d37]{color:var(--cn-muted);cursor:not-allowed}.cn-context-menu[data-v-e554ef38]{--cn-bg:#0b1220;--cn-bg-elevated:#101a2e;--cn-fg:#e6edf7;--cn-muted:#7c8ca5;--cn-line:#1e2a40;--cn-field:#94a3b812;--cn-accent:#38bdf8;--cn-accent-soft:#38bdf81f;--cn-danger:#f87171;z-index:30;background:var(--cn-bg-elevated);border:1px solid var(--cn-line);border-radius:10px;flex-direction:column;gap:2px;min-width:120px;padding:4px;display:flex;position:absolute;box-shadow:0 12px 32px #0206178c}.cn-context-menu__item[data-v-e554ef38]{color:var(--cn-fg);text-align:left;cursor:pointer;background:0 0;border:0;border-radius:6px;padding:6px 12px;font-size:13px;line-height:1.4}.cn-context-menu__item[data-v-e554ef38]:hover:not(:disabled){background:var(--cn-accent-soft);color:var(--cn-accent)}.cn-context-menu__item[data-v-e554ef38]:disabled{color:var(--cn-muted);cursor:not-allowed}.cn-context-menu__item--delete[data-v-e554ef38]:hover:not(:disabled){color:var(--cn-danger);background:#f871711f}.cn-context-menu__form[data-v-e554ef38]{flex-direction:column;gap:6px;min-width:180px;padding:4px;display:flex}.cn-context-menu__hint[data-v-e554ef38]{color:var(--cn-muted);margin:0;padding:0 4px;font-size:11px;line-height:1.5}.cn-context-menu__hint--error[data-v-e554ef38]{color:var(--cn-danger)}.cn-context-menu__input[data-v-e554ef38]{border:1px solid var(--cn-line);background:var(--cn-field);color:var(--cn-fg);border-radius:6px;outline:none;padding:5px 8px;font-size:12px;line-height:1.4}.cn-context-menu__input[data-v-e554ef38]:focus{border-color:var(--cn-accent)}.cn-context-menu__input--invalid[data-v-e554ef38]{border-color:var(--cn-danger)}.cn-context-menu__form-actions[data-v-e554ef38]{gap:4px;display:flex}.cn-context-menu__form-actions .cn-context-menu__item[data-v-e554ef38]{text-align:center;flex:1}.cn-context-menu__item--confirm[data-v-e554ef38]{background:var(--cn-accent-soft);color:var(--cn-accent)}.cn-find-bar[data-v-71f0a3ae]{--cn-fg:#e6edf7;--cn-muted:#7c8ca5;--cn-field-line:#2a3a57;--cn-accent:#38bdf8;--cn-hover:#16223a;z-index:25;border:1px solid var(--cn-field-line);-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);color:var(--cn-fg);-webkit-user-select:none;user-select:none;background:#0b1220eb;border-radius:9px;align-items:center;gap:6px;padding:6px 8px;display:inline-flex;position:absolute;top:12px;left:50%;transform:translate(-50%);box-shadow:0 10px 26px #00000073}.cn-find-bar__input[data-v-71f0a3ae]{border:1px solid var(--cn-field-line);width:132px;color:var(--cn-fg);background:#0b1220e6;border-radius:6px;padding:4px 8px;font-size:13px;line-height:1.4}.cn-find-bar__input[data-v-71f0a3ae]::placeholder{color:var(--cn-muted)}.cn-find-bar__input[data-v-71f0a3ae]:focus{border-color:var(--cn-accent);outline:none}.cn-find-bar__count[data-v-71f0a3ae]{text-align:center;min-width:56px;color:var(--cn-muted);white-space:nowrap;font-size:12px}.cn-find-bar__note[data-v-71f0a3ae]{color:var(--cn-accent);white-space:nowrap;font-size:12px}.cn-find-bar__key[data-v-71f0a3ae]{width:24px;height:24px;color:var(--cn-fg);cursor:pointer;background:0 0;border:none;border-radius:6px;place-content:center;padding:0;display:grid}.cn-find-bar__action[data-v-71f0a3ae]{white-space:nowrap;color:var(--cn-fg);cursor:pointer;background:0 0;border:none;border-radius:6px;padding:4px 10px;font-size:12px;line-height:1.4}.cn-find-bar__key[data-v-71f0a3ae]:hover:not(:disabled),.cn-find-bar__action[data-v-71f0a3ae]:hover:not(:disabled){background:var(--cn-hover);color:var(--cn-accent)}.cn-find-bar__key[data-v-71f0a3ae]:disabled,.cn-find-bar__action[data-v-71f0a3ae]:disabled{color:var(--cn-muted);cursor:not-allowed}.cn-edit-toolbar[data-v-dcead501]{--cn-bg-elevated:#101a2e;--cn-fg:#e6edf7;--cn-muted:#7c8ca5;--cn-line:#1e2a40;--cn-accent:#38bdf8;--cn-accent-soft:#38bdf81f;z-index:30;background:var(--cn-bg-elevated);border:1px solid var(--cn-line);pointer-events:auto;-webkit-user-select:none;user-select:none;border-radius:8px;align-items:stretch;gap:2px;padding:3px;display:inline-flex;position:absolute;top:0;left:0;box-shadow:0 8px 20px #02061773}.cn-edit-toolbar__segment+.cn-edit-toolbar__segment[data-v-dcead501]{border-left:1px solid var(--cn-line);margin-left:2px;padding-left:3px}.cn-edit-toolbar__segment[data-v-dcead501]{border-radius:5px;align-items:center;display:inline-flex;overflow:hidden}.cn-edit-toolbar__item[data-v-dcead501]{color:var(--cn-muted);white-space:nowrap;cursor:pointer;background:0 0;border:0;padding:3px 10px;font-size:11px;line-height:1.4}.cn-edit-toolbar__item+.cn-edit-toolbar__item[data-v-dcead501]{border-left:1px solid var(--cn-line)}.cn-edit-toolbar__item[data-v-dcead501]:hover{color:var(--cn-fg)}.cn-edit-toolbar__item--active[data-v-dcead501]{background:var(--cn-accent-soft);color:var(--cn-accent);cursor:default}.cn-edit-toolbar__icon-item[data-v-dcead501]{justify-content:center;align-items:center;padding:3px 6px;display:inline-flex}.cn-edit-toolbar__font[data-v-dcead501]{max-width:110px;height:22px;color:var(--cn-fg);cursor:pointer;background:0 0;border:0;border-radius:4px;padding:0 2px;font-size:11px;line-height:1.4}.cn-edit-toolbar__font[data-v-dcead501]:focus-visible{outline:1px solid var(--cn-accent)}.cn-edit-toolbar__font option[data-v-dcead501]{background:var(--cn-bg-elevated);color:var(--cn-fg)}.cn-edit-toolbar__mini[data-v-dcead501]{color:var(--cn-muted);cursor:pointer;background:0 0;border:0;justify-content:center;align-items:center;padding:3px 4px;display:inline-flex}.cn-edit-toolbar__mini[data-v-dcead501]:hover{color:var(--cn-fg)}.cn-edit-toolbar__size[data-v-dcead501]{border:1px solid var(--cn-line);width:34px;height:20px;color:var(--cn-fg);text-align:center;appearance:textfield;background:0 0;border-radius:4px;padding:0 2px;font-size:11px;line-height:1.4}.cn-edit-toolbar__size[data-v-dcead501]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.cn-edit-toolbar__size[data-v-dcead501]::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.cn-edit-toolbar__size[data-v-dcead501]:focus-visible{outline:1px solid var(--cn-accent)}.cn-edit-toolbar__color[data-v-dcead501]{border:1px solid var(--cn-line);cursor:pointer;background:0 0;border-radius:4px;width:24px;height:20px;padding:0}.cn-edit-toolbar__color[data-v-dcead501]:focus-visible{outline:1px solid var(--cn-accent)}.cn-text-overlay[data-v-9e96d660]{pointer-events:none;position:absolute;inset:0}.cn-text-overlay__textarea[data-v-9e96d660]{resize:none;-webkit-user-select:text;user-select:text;pointer-events:auto;letter-spacing:normal;text-transform:none;background:0 0;border:0;outline:none;margin:0;padding:0;font-style:normal;font-weight:400;position:absolute;top:0;left:0;overflow:hidden}.cn-text-overlay__diagnostic[data-v-9e96d660]{text-overflow:ellipsis;white-space:nowrap;color:#f87171;pointer-events:none;-webkit-user-select:none;user-select:none;background:#0b1220e0;border:1px solid #f8717166;border-radius:4px;max-width:240px;padding:2px 6px;font-size:12px;line-height:16px;position:absolute;top:0;left:0;overflow:hidden}.cn-surface[data-v-2327ee46]{touch-action:none;-webkit-user-select:none;user-select:none;position:relative;overflow:hidden}.cn-surface__canvas[data-v-2327ee46]{width:100%;height:100%;display:block;position:absolute;inset:0}.cn-surface__canvas--overlay[data-v-2327ee46]{pointer-events:none}.cn-surface--pannable[data-v-2327ee46]{cursor:grab}.cn-surface--panning[data-v-2327ee46]{cursor:grabbing}.cn-surface__drop-hint[data-v-2327ee46]{z-index:20;pointer-events:none;background:#38bdf814;border:2px dashed #38bdf899;border-radius:12px;justify-content:center;align-items:center;display:flex;position:absolute;inset:8px}.cn-surface__drop-hint-text[data-v-2327ee46]{color:#38bdf8;background:#0b1220;border-radius:8px;padding:6px 14px;font-size:13px;line-height:1.4}.cn-guides[data-v-61872121]{--cn-guide-line:#38bdf8;--cn-guide-glow:#38bdf866;--cn-guide-will-delete:#f87171;--cn-guide-will-delete-glow:#f8717173;--cn-snap-line:#fb7185;--cn-snap-glow:#fb718573;--cn-snap-dash:4px;--cn-guide-hit:9px;--cn-guide-clip-radius:12px;border-radius:var(--cn-guide-clip-radius);pointer-events:none;-webkit-user-select:none;user-select:none;position:absolute;inset:0;overflow:hidden}.cn-guides__guide[data-v-61872121]{pointer-events:auto;touch-action:none;position:absolute}.cn-guides__guide--vertical[data-v-61872121]{width:var(--cn-guide-hit);cursor:ew-resize;transform:translate(-50%)}.cn-guides__guide--horizontal[data-v-61872121]{height:var(--cn-guide-hit);cursor:ns-resize;transform:translateY(-50%)}.cn-guides__guide--vertical[data-v-61872121]:after,.cn-guides__guide--horizontal[data-v-61872121]:after{content:"";background:var(--cn-guide-line);box-shadow:0 0 6px var(--cn-guide-glow);position:absolute}.cn-guides__guide--vertical[data-v-61872121]:after{width:1px;top:0;bottom:0;left:calc(50% - .5px)}.cn-guides__guide--horizontal[data-v-61872121]:after{height:1px;top:calc(50% - .5px);left:0;right:0}.cn-guides__guide--preview[data-v-61872121]{pointer-events:none}.cn-guides__guide--preview[data-v-61872121]:after{opacity:.85}.cn-guides__guide--grabbed[data-v-61872121]:after{opacity:.75}.cn-guides__guide--will-delete[data-v-61872121]:after{background:var(--cn-guide-will-delete);box-shadow:0 0 6px var(--cn-guide-will-delete-glow)}.cn-guides__snap[data-v-61872121]{pointer-events:none;filter:drop-shadow(0 0 3px var(--cn-snap-glow));position:absolute}.cn-guides__snap--vertical[data-v-61872121]{background-image:repeating-linear-gradient(to bottom, var(--cn-snap-line) 0 var(--cn-snap-dash), transparent var(--cn-snap-dash) calc(var(--cn-snap-dash) * 2));width:1px}.cn-guides__snap--horizontal[data-v-61872121]{background-image:repeating-linear-gradient(to right, var(--cn-snap-line) 0 var(--cn-snap-dash), transparent var(--cn-snap-dash) calc(var(--cn-snap-dash) * 2));height:1px}.cn-ruler[data-v-5bd7248c]{--cn-ruler-thickness:20px;--cn-ruler-bg:#0b1220eb;--cn-ruler-line:#1e2a40;--cn-ruler-tick:#7c8ca5;--cn-ruler-label:#aab6c8;--cn-ruler-font:"SF Mono", Menlo, Consolas, monospace;pointer-events:none;-webkit-user-select:none;user-select:none;width:100%;height:100%;font-family:var(--cn-ruler-font);position:relative}.cn-ruler__bar[data-v-5bd7248c]{pointer-events:auto;touch-action:none;background:var(--cn-ruler-bg);position:absolute;top:0;left:0;overflow:hidden}.cn-ruler__bar--top[data-v-5bd7248c]{height:var(--cn-ruler-thickness);border-bottom:1px solid var(--cn-ruler-line);right:0}.cn-ruler__bar--left[data-v-5bd7248c]{width:var(--cn-ruler-thickness);border-right:1px solid var(--cn-ruler-line);bottom:0}.cn-ruler__corner[data-v-5bd7248c]{z-index:1;width:var(--cn-ruler-thickness);height:var(--cn-ruler-thickness);background:var(--cn-ruler-bg);border-right:1px solid var(--cn-ruler-line);border-bottom:1px solid var(--cn-ruler-line);position:absolute;top:0;left:0}.cn-ruler__tick[data-v-5bd7248c]{background:var(--cn-ruler-tick);position:absolute}.cn-ruler__bar--top .cn-ruler__tick[data-v-5bd7248c]{width:1px;height:4px;bottom:0}.cn-ruler__bar--top .cn-ruler__tick--major[data-v-5bd7248c]{height:8px}.cn-ruler__bar--left .cn-ruler__tick[data-v-5bd7248c]{width:4px;height:1px;right:0}.cn-ruler__bar--left .cn-ruler__tick--major[data-v-5bd7248c]{width:8px}.cn-ruler__label[data-v-5bd7248c]{white-space:nowrap;color:var(--cn-ruler-label);font-size:9px;line-height:1;position:absolute}.cn-ruler__bar--top .cn-ruler__label[data-v-5bd7248c]{bottom:9px;left:3px}.cn-ruler__bar--left .cn-ruler__label[data-v-5bd7248c]{writing-mode:vertical-rl;top:2px;right:10px}.cn-dropdown[data-v-ec8a19c1]{--cn-fg:#e6edf7;--cn-fg-2:#c3cddd;--cn-muted:#7c8ca5;--cn-line:#1e2a40;--cn-bg-elevated:#101a2e;--cn-hover:#16223a;--cn-accent:#38bdf8;--cn-accent-soft:#38bdf81f;display:inline-flex;position:relative}.cn-dropdown__trigger[data-v-ec8a19c1]{white-space:nowrap;color:var(--cn-fg-2);cursor:pointer;background:0 0;border:none;border-radius:6px;align-items:center;gap:3px;padding:5px 9px;font-size:13px;display:inline-flex}.cn-dropdown__trigger[data-v-ec8a19c1]:hover{background:var(--cn-hover);color:var(--cn-fg)}.cn-dropdown__caret[data-v-ec8a19c1]{color:var(--cn-muted);font-size:10px;line-height:1}.cn-dropdown__menu[data-v-ec8a19c1]{z-index:40;background:var(--cn-bg-elevated);border:1px solid var(--cn-line);border-radius:10px;flex-direction:column;gap:2px;min-width:148px;padding:4px;display:flex;position:fixed;box-shadow:0 12px 32px #0206178c}.cn-dropdown__item[data-v-ec8a19c1]{color:var(--cn-fg);text-align:left;white-space:nowrap;cursor:pointer;background:0 0;border:0;border-radius:6px;justify-content:space-between;align-items:center;gap:14px;padding:6px 12px;font-size:12px;line-height:1.4;display:flex}.cn-dropdown__item[data-v-ec8a19c1]:hover:not(:disabled){background:var(--cn-accent-soft);color:var(--cn-accent)}.cn-dropdown__item[data-v-ec8a19c1]:disabled{color:var(--cn-muted);cursor:not-allowed}.cn-dropdown__shortcut[data-v-ec8a19c1]{color:var(--cn-muted);font-variant-numeric:tabular-nums;flex:none;font-size:11px;line-height:1.4}.cn-dropdown__separator[data-v-ec8a19c1]{background:var(--cn-line);flex:none;height:1px;margin:3px 6px}.cn-statusbar[data-v-040479fb]{--cn-bg:#0b1220;--cn-bg-elevated:#101a2e;--cn-fg:#e6edf7;--cn-muted:#7c8ca5;--cn-line:#1e2a40;--cn-accent:#38bdf8;background-color:var(--cn-bg);color:var(--cn-muted);font-variant-numeric:tabular-nums;-webkit-user-select:none;user-select:none;align-items:center;gap:10px;padding:6px 12px;font-size:12px;line-height:1.4;display:flex}.cn-statusbar__segment[data-v-040479fb]{white-space:nowrap}.cn-statusbar__zoom-trigger[data-v-040479fb]{font:inherit;color:inherit;font-variant-numeric:tabular-nums;cursor:pointer;background:0 0;border:0;padding:0}.cn-statusbar__zoom-trigger[data-v-040479fb]:hover{color:var(--cn-accent)}.cn-statusbar__help[data-v-040479fb]{font:inherit;color:inherit;cursor:pointer;background:0 0;border:0;padding:0}.cn-statusbar__help[data-v-040479fb]:hover,.cn-statusbar__segment--pending[data-v-040479fb]{color:var(--cn-accent)}.cn-statusbar__divider[data-v-040479fb]{background:var(--cn-line);width:1px;height:12px}.cn-help[data-v-486e5be3]{--cn-bg:#0b1220;--cn-bg-elevated:#101a2e;--cn-fg:#e6edf7;--cn-muted:#7c8ca5;--cn-line:#1e2a40;--cn-accent:#38bdf8;z-index:50;background:#0206178c;justify-content:center;align-items:center;padding:24px;display:flex;position:fixed;inset:0}.cn-help__panel[data-v-486e5be3]{background:var(--cn-bg-elevated);border:1px solid var(--cn-line);border-radius:12px;flex-direction:column;min-width:320px;max-width:480px;max-height:100%;display:flex;box-shadow:0 24px 64px #02061799}.cn-help__header[data-v-486e5be3]{border-bottom:1px solid var(--cn-line);justify-content:space-between;align-items:center;padding:12px 16px;display:flex}.cn-help__title[data-v-486e5be3]{color:var(--cn-fg);margin:0;font-size:14px;font-weight:600;line-height:1.4}.cn-help__close[data-v-486e5be3]{color:var(--cn-muted);cursor:pointer;background:0 0;border:0;border-radius:6px;padding:2px 8px;font-size:13px;line-height:1.4}.cn-help__close[data-v-486e5be3]:hover{color:var(--cn-fg);background:#94a3b812}.cn-help__body[data-v-486e5be3]{padding:8px 16px 16px;overflow-y:auto}.cn-help__section[data-v-486e5be3]{margin-top:12px}.cn-help__section[data-v-486e5be3]:first-child{margin-top:8px}.cn-help__section-title[data-v-486e5be3]{color:var(--cn-accent);margin:0 0 4px;font-size:11px;font-weight:600;line-height:1.4}.cn-help__list[data-v-486e5be3]{margin:0;padding:0;list-style:none}.cn-help__row[data-v-486e5be3]{justify-content:space-between;align-items:baseline;gap:16px;padding:3px 0;display:flex}.cn-help__label[data-v-486e5be3]{color:var(--cn-fg);font-size:12px;line-height:1.5}.cn-help__keys[data-v-486e5be3]{border:1px solid var(--cn-line);color:var(--cn-muted);white-space:nowrap;background:#94a3b812;border-radius:5px;flex-shrink:0;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;line-height:1.4}
|
|
1
|
+
.cn-align-float[data-v-9a761d37]{--cn-fg:#e6edf7;--cn-muted:#7c8ca5;--cn-field-line:#2a3a57;--cn-accent:#38bdf8;--cn-hover:#16223a;border:1px solid var(--cn-field-line);-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);color:var(--cn-fg);-webkit-user-select:none;user-select:none;background:#0b1220eb;border-radius:9px;align-items:center;gap:4px;padding:5px 8px;display:inline-flex;box-shadow:0 10px 26px #00000073}.cn-align-float__group[data-v-9a761d37]{align-items:center;gap:2px;display:flex}.cn-align-float__divider[data-v-9a761d37]{background:var(--cn-field-line);width:1px;height:16px}.cn-align-float__key[data-v-9a761d37]{width:24px;height:24px;color:var(--cn-fg);cursor:pointer;background:0 0;border:none;border-radius:6px;place-content:center;padding:0;display:grid}.cn-align-float__key[data-v-9a761d37]:hover:not(:disabled){background:var(--cn-hover);color:var(--cn-accent)}.cn-align-float--disabled[data-v-9a761d37]{color:var(--cn-muted)}.cn-align-float--disabled .cn-align-float__key[data-v-9a761d37]{color:var(--cn-muted);cursor:not-allowed}.cn-context-menu[data-v-e554ef38]{--cn-bg:#0b1220;--cn-bg-elevated:#101a2e;--cn-fg:#e6edf7;--cn-muted:#7c8ca5;--cn-line:#1e2a40;--cn-field:#94a3b812;--cn-accent:#38bdf8;--cn-accent-soft:#38bdf81f;--cn-danger:#f87171;z-index:30;background:var(--cn-bg-elevated);border:1px solid var(--cn-line);border-radius:10px;flex-direction:column;gap:2px;min-width:120px;padding:4px;display:flex;position:absolute;box-shadow:0 12px 32px #0206178c}.cn-context-menu__item[data-v-e554ef38]{color:var(--cn-fg);text-align:left;cursor:pointer;background:0 0;border:0;border-radius:6px;padding:6px 12px;font-size:13px;line-height:1.4}.cn-context-menu__item[data-v-e554ef38]:hover:not(:disabled){background:var(--cn-accent-soft);color:var(--cn-accent)}.cn-context-menu__item[data-v-e554ef38]:disabled{color:var(--cn-muted);cursor:not-allowed}.cn-context-menu__item--delete[data-v-e554ef38]:hover:not(:disabled){color:var(--cn-danger);background:#f871711f}.cn-context-menu__form[data-v-e554ef38]{flex-direction:column;gap:6px;min-width:180px;padding:4px;display:flex}.cn-context-menu__hint[data-v-e554ef38]{color:var(--cn-muted);margin:0;padding:0 4px;font-size:11px;line-height:1.5}.cn-context-menu__hint--error[data-v-e554ef38]{color:var(--cn-danger)}.cn-context-menu__input[data-v-e554ef38]{border:1px solid var(--cn-line);background:var(--cn-field);color:var(--cn-fg);border-radius:6px;outline:none;padding:5px 8px;font-size:12px;line-height:1.4}.cn-context-menu__input[data-v-e554ef38]:focus{border-color:var(--cn-accent)}.cn-context-menu__input--invalid[data-v-e554ef38]{border-color:var(--cn-danger)}.cn-context-menu__form-actions[data-v-e554ef38]{gap:4px;display:flex}.cn-context-menu__form-actions .cn-context-menu__item[data-v-e554ef38]{text-align:center;flex:1}.cn-context-menu__item--confirm[data-v-e554ef38]{background:var(--cn-accent-soft);color:var(--cn-accent)}.cn-find-bar[data-v-71f0a3ae]{--cn-fg:#e6edf7;--cn-muted:#7c8ca5;--cn-field-line:#2a3a57;--cn-accent:#38bdf8;--cn-hover:#16223a;z-index:25;border:1px solid var(--cn-field-line);-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);color:var(--cn-fg);-webkit-user-select:none;user-select:none;background:#0b1220eb;border-radius:9px;align-items:center;gap:6px;padding:6px 8px;display:inline-flex;position:absolute;top:12px;left:50%;transform:translate(-50%);box-shadow:0 10px 26px #00000073}.cn-find-bar__input[data-v-71f0a3ae]{border:1px solid var(--cn-field-line);width:132px;color:var(--cn-fg);background:#0b1220e6;border-radius:6px;padding:4px 8px;font-size:13px;line-height:1.4}.cn-find-bar__input[data-v-71f0a3ae]::placeholder{color:var(--cn-muted)}.cn-find-bar__input[data-v-71f0a3ae]:focus{border-color:var(--cn-accent);outline:none}.cn-find-bar__count[data-v-71f0a3ae]{text-align:center;min-width:56px;color:var(--cn-muted);white-space:nowrap;font-size:12px}.cn-find-bar__note[data-v-71f0a3ae]{color:var(--cn-accent);white-space:nowrap;font-size:12px}.cn-find-bar__key[data-v-71f0a3ae]{width:24px;height:24px;color:var(--cn-fg);cursor:pointer;background:0 0;border:none;border-radius:6px;place-content:center;padding:0;display:grid}.cn-find-bar__action[data-v-71f0a3ae]{white-space:nowrap;color:var(--cn-fg);cursor:pointer;background:0 0;border:none;border-radius:6px;padding:4px 10px;font-size:12px;line-height:1.4}.cn-find-bar__key[data-v-71f0a3ae]:hover:not(:disabled),.cn-find-bar__action[data-v-71f0a3ae]:hover:not(:disabled){background:var(--cn-hover);color:var(--cn-accent)}.cn-find-bar__key[data-v-71f0a3ae]:disabled,.cn-find-bar__action[data-v-71f0a3ae]:disabled{color:var(--cn-muted);cursor:not-allowed}.cn-edit-toolbar[data-v-dcead501]{--cn-bg-elevated:#101a2e;--cn-fg:#e6edf7;--cn-muted:#7c8ca5;--cn-line:#1e2a40;--cn-accent:#38bdf8;--cn-accent-soft:#38bdf81f;z-index:30;background:var(--cn-bg-elevated);border:1px solid var(--cn-line);pointer-events:auto;-webkit-user-select:none;user-select:none;border-radius:8px;align-items:stretch;gap:2px;padding:3px;display:inline-flex;position:absolute;top:0;left:0;box-shadow:0 8px 20px #02061773}.cn-edit-toolbar__segment+.cn-edit-toolbar__segment[data-v-dcead501]{border-left:1px solid var(--cn-line);margin-left:2px;padding-left:3px}.cn-edit-toolbar__segment[data-v-dcead501]{border-radius:5px;align-items:center;display:inline-flex;overflow:hidden}.cn-edit-toolbar__item[data-v-dcead501]{color:var(--cn-muted);white-space:nowrap;cursor:pointer;background:0 0;border:0;padding:3px 10px;font-size:11px;line-height:1.4}.cn-edit-toolbar__item+.cn-edit-toolbar__item[data-v-dcead501]{border-left:1px solid var(--cn-line)}.cn-edit-toolbar__item[data-v-dcead501]:hover{color:var(--cn-fg)}.cn-edit-toolbar__item--active[data-v-dcead501]{background:var(--cn-accent-soft);color:var(--cn-accent);cursor:default}.cn-edit-toolbar__icon-item[data-v-dcead501]{justify-content:center;align-items:center;padding:3px 6px;display:inline-flex}.cn-edit-toolbar__font[data-v-dcead501]{max-width:110px;height:22px;color:var(--cn-fg);cursor:pointer;background:0 0;border:0;border-radius:4px;padding:0 2px;font-size:11px;line-height:1.4}.cn-edit-toolbar__font[data-v-dcead501]:focus-visible{outline:1px solid var(--cn-accent)}.cn-edit-toolbar__font option[data-v-dcead501]{background:var(--cn-bg-elevated);color:var(--cn-fg)}.cn-edit-toolbar__mini[data-v-dcead501]{color:var(--cn-muted);cursor:pointer;background:0 0;border:0;justify-content:center;align-items:center;padding:3px 4px;display:inline-flex}.cn-edit-toolbar__mini[data-v-dcead501]:hover{color:var(--cn-fg)}.cn-edit-toolbar__size[data-v-dcead501]{border:1px solid var(--cn-line);width:34px;height:20px;color:var(--cn-fg);text-align:center;appearance:textfield;background:0 0;border-radius:4px;padding:0 2px;font-size:11px;line-height:1.4}.cn-edit-toolbar__size[data-v-dcead501]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.cn-edit-toolbar__size[data-v-dcead501]::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.cn-edit-toolbar__size[data-v-dcead501]:focus-visible{outline:1px solid var(--cn-accent)}.cn-edit-toolbar__color[data-v-dcead501]{border:1px solid var(--cn-line);cursor:pointer;background:0 0;border-radius:4px;width:24px;height:20px;padding:0}.cn-edit-toolbar__color[data-v-dcead501]:focus-visible{outline:1px solid var(--cn-accent)}.cn-text-overlay[data-v-9e96d660]{pointer-events:none;position:absolute;inset:0}.cn-text-overlay__textarea[data-v-9e96d660]{resize:none;-webkit-user-select:text;user-select:text;pointer-events:auto;letter-spacing:normal;text-transform:none;background:0 0;border:0;outline:none;margin:0;padding:0;font-style:normal;font-weight:400;position:absolute;top:0;left:0;overflow:hidden}.cn-text-overlay__diagnostic[data-v-9e96d660]{text-overflow:ellipsis;white-space:nowrap;color:#f87171;pointer-events:none;-webkit-user-select:none;user-select:none;background:#0b1220e0;border:1px solid #f8717166;border-radius:4px;max-width:240px;padding:2px 6px;font-size:12px;line-height:16px;position:absolute;top:0;left:0;overflow:hidden}.cn-surface[data-v-2327ee46]{touch-action:none;-webkit-user-select:none;user-select:none;position:relative;overflow:hidden}.cn-surface__canvas[data-v-2327ee46]{width:100%;height:100%;display:block;position:absolute;inset:0}.cn-surface__canvas--overlay[data-v-2327ee46]{pointer-events:none}.cn-surface--pannable[data-v-2327ee46]{cursor:grab}.cn-surface--panning[data-v-2327ee46]{cursor:grabbing}.cn-surface__drop-hint[data-v-2327ee46]{z-index:20;pointer-events:none;background:#38bdf814;border:2px dashed #38bdf899;border-radius:12px;justify-content:center;align-items:center;display:flex;position:absolute;inset:8px}.cn-surface__drop-hint-text[data-v-2327ee46]{color:#38bdf8;background:#0b1220;border-radius:8px;padding:6px 14px;font-size:13px;line-height:1.4}.cn-guides[data-v-61872121]{--cn-guide-line:#38bdf8;--cn-guide-glow:#38bdf866;--cn-guide-will-delete:#f87171;--cn-guide-will-delete-glow:#f8717173;--cn-snap-line:#fb7185;--cn-snap-glow:#fb718573;--cn-snap-dash:4px;--cn-guide-hit:9px;--cn-guide-clip-radius:12px;border-radius:var(--cn-guide-clip-radius);pointer-events:none;-webkit-user-select:none;user-select:none;position:absolute;inset:0;overflow:hidden}.cn-guides__guide[data-v-61872121]{pointer-events:auto;touch-action:none;position:absolute}.cn-guides__guide--vertical[data-v-61872121]{width:var(--cn-guide-hit);cursor:ew-resize;transform:translate(-50%)}.cn-guides__guide--horizontal[data-v-61872121]{height:var(--cn-guide-hit);cursor:ns-resize;transform:translateY(-50%)}.cn-guides__guide--vertical[data-v-61872121]:after,.cn-guides__guide--horizontal[data-v-61872121]:after{content:"";background:var(--cn-guide-line);box-shadow:0 0 6px var(--cn-guide-glow);position:absolute}.cn-guides__guide--vertical[data-v-61872121]:after{width:1px;top:0;bottom:0;left:calc(50% - .5px)}.cn-guides__guide--horizontal[data-v-61872121]:after{height:1px;top:calc(50% - .5px);left:0;right:0}.cn-guides__guide--preview[data-v-61872121]{pointer-events:none}.cn-guides__guide--preview[data-v-61872121]:after{opacity:.85}.cn-guides__guide--grabbed[data-v-61872121]:after{opacity:.75}.cn-guides__guide--will-delete[data-v-61872121]:after{background:var(--cn-guide-will-delete);box-shadow:0 0 6px var(--cn-guide-will-delete-glow)}.cn-guides__snap[data-v-61872121]{pointer-events:none;filter:drop-shadow(0 0 3px var(--cn-snap-glow));position:absolute}.cn-guides__snap--vertical[data-v-61872121]{background-image:repeating-linear-gradient(to bottom, var(--cn-snap-line) 0 var(--cn-snap-dash), transparent var(--cn-snap-dash) calc(var(--cn-snap-dash) * 2));width:1px}.cn-guides__snap--horizontal[data-v-61872121]{background-image:repeating-linear-gradient(to right, var(--cn-snap-line) 0 var(--cn-snap-dash), transparent var(--cn-snap-dash) calc(var(--cn-snap-dash) * 2));height:1px}.cn-ruler[data-v-5bd7248c]{--cn-ruler-thickness:20px;--cn-ruler-bg:#0b1220eb;--cn-ruler-line:#1e2a40;--cn-ruler-tick:#7c8ca5;--cn-ruler-label:#aab6c8;--cn-ruler-font:"SF Mono", Menlo, Consolas, monospace;pointer-events:none;-webkit-user-select:none;user-select:none;width:100%;height:100%;font-family:var(--cn-ruler-font);position:relative}.cn-ruler__bar[data-v-5bd7248c]{pointer-events:auto;touch-action:none;background:var(--cn-ruler-bg);position:absolute;top:0;left:0;overflow:hidden}.cn-ruler__bar--top[data-v-5bd7248c]{height:var(--cn-ruler-thickness);border-bottom:1px solid var(--cn-ruler-line);right:0}.cn-ruler__bar--left[data-v-5bd7248c]{width:var(--cn-ruler-thickness);border-right:1px solid var(--cn-ruler-line);bottom:0}.cn-ruler__corner[data-v-5bd7248c]{z-index:1;width:var(--cn-ruler-thickness);height:var(--cn-ruler-thickness);background:var(--cn-ruler-bg);border-right:1px solid var(--cn-ruler-line);border-bottom:1px solid var(--cn-ruler-line);position:absolute;top:0;left:0}.cn-ruler__tick[data-v-5bd7248c]{background:var(--cn-ruler-tick);position:absolute}.cn-ruler__bar--top .cn-ruler__tick[data-v-5bd7248c]{width:1px;height:4px;bottom:0}.cn-ruler__bar--top .cn-ruler__tick--major[data-v-5bd7248c]{height:8px}.cn-ruler__bar--left .cn-ruler__tick[data-v-5bd7248c]{width:4px;height:1px;right:0}.cn-ruler__bar--left .cn-ruler__tick--major[data-v-5bd7248c]{width:8px}.cn-ruler__label[data-v-5bd7248c]{white-space:nowrap;color:var(--cn-ruler-label);font-size:9px;line-height:1;position:absolute}.cn-ruler__bar--top .cn-ruler__label[data-v-5bd7248c]{bottom:9px;left:3px}.cn-ruler__bar--left .cn-ruler__label[data-v-5bd7248c]{writing-mode:vertical-rl;top:2px;right:10px}.cn-dropdown[data-v-f39579b0]{--cn-fg:#e6edf7;--cn-fg-2:#c3cddd;--cn-muted:#7c8ca5;--cn-line:#1e2a40;--cn-bg-elevated:#101a2e;--cn-hover:#16223a;--cn-accent:#38bdf8;--cn-accent-soft:#38bdf81f;display:inline-flex;position:relative}.cn-dropdown__trigger[data-v-f39579b0]{white-space:nowrap;color:var(--cn-fg-2);cursor:pointer;background:0 0;border:none;border-radius:6px;align-items:center;gap:3px;padding:5px 9px;font-size:13px;display:inline-flex}.cn-dropdown__trigger[data-v-f39579b0]:hover{background:var(--cn-hover);color:var(--cn-fg)}.cn-dropdown__caret[data-v-f39579b0]{color:var(--cn-muted);font-size:10px;line-height:1}.cn-dropdown__menu[data-v-f39579b0]{z-index:40;background:var(--cn-bg-elevated);border:1px solid var(--cn-line);border-radius:10px;flex-direction:column;gap:2px;min-width:148px;padding:4px;display:flex;position:fixed;box-shadow:0 12px 32px #0206178c}.cn-dropdown__item[data-v-f39579b0]{color:var(--cn-fg);text-align:left;white-space:nowrap;cursor:pointer;background:0 0;border:0;border-radius:6px;justify-content:space-between;align-items:center;gap:14px;padding:6px 12px;font-size:12px;line-height:1.4;display:flex}.cn-dropdown__item[data-v-f39579b0]:hover:not(:disabled){background:var(--cn-accent-soft);color:var(--cn-accent)}.cn-dropdown__item[data-v-f39579b0]:disabled{color:var(--cn-muted);cursor:not-allowed}.cn-dropdown__shortcut[data-v-f39579b0]{color:var(--cn-muted);font-variant-numeric:tabular-nums;flex:none;font-size:11px;line-height:1.4}.cn-dropdown__separator[data-v-f39579b0]{background:var(--cn-line);flex:none;height:1px;margin:3px 6px}.cn-dropdown__submenu-host[data-v-f39579b0]{align-items:stretch;display:flex}.cn-dropdown__submenu-main[data-v-f39579b0]{flex:auto;min-width:0}.cn-dropdown__submenu-arrow[data-v-f39579b0]{width:20px;color:var(--cn-muted);cursor:pointer;background:0 0;border:0;border-radius:6px;flex:none;justify-content:center;align-items:center;padding:0;font-size:10px;line-height:1;display:inline-flex}.cn-dropdown__submenu-arrow[data-v-f39579b0]:hover:not(:disabled){background:var(--cn-accent-soft);color:var(--cn-accent)}.cn-dropdown__submenu-arrow[data-v-f39579b0]:disabled{color:var(--cn-muted);cursor:not-allowed}.cn-dropdown__submenu[data-v-f39579b0]{z-index:41;background:var(--cn-bg-elevated);border:1px solid var(--cn-line);border-radius:10px;flex-direction:column;gap:2px;min-width:132px;padding:4px;display:flex;position:fixed;box-shadow:0 12px 32px #0206178c}.cn-dropdown__submenu[data-v-f39579b0]:before{content:"";width:6px;position:absolute;top:0;bottom:0;left:-6px}.cn-dropdown__submenu--left[data-v-f39579b0]:before{left:auto;right:-6px}.cn-statusbar[data-v-ea2a5856]{--cn-bg:#0b1220;--cn-bg-elevated:#101a2e;--cn-fg:#e6edf7;--cn-muted:#7c8ca5;--cn-line:#1e2a40;--cn-accent:#38bdf8;background-color:var(--cn-bg);color:var(--cn-muted);font-variant-numeric:tabular-nums;-webkit-user-select:none;user-select:none;align-items:center;gap:10px;padding:6px 12px;font-size:12px;line-height:1.4;display:flex}.cn-statusbar__segment[data-v-ea2a5856]{white-space:nowrap}.cn-statusbar__zoom-trigger[data-v-ea2a5856]{font:inherit;color:inherit;font-variant-numeric:tabular-nums;cursor:pointer;background:0 0;border:0;padding:0}.cn-statusbar__zoom-trigger[data-v-ea2a5856]:hover{color:var(--cn-accent)}.cn-statusbar__help[data-v-ea2a5856]{font:inherit;color:inherit;cursor:pointer;background:0 0;border:0;padding:0}.cn-statusbar__help[data-v-ea2a5856]:hover,.cn-statusbar__segment--pending[data-v-ea2a5856]{color:var(--cn-accent)}.cn-statusbar__divider[data-v-ea2a5856]{background:var(--cn-line);width:1px;height:12px}.cn-help[data-v-486e5be3]{--cn-bg:#0b1220;--cn-bg-elevated:#101a2e;--cn-fg:#e6edf7;--cn-muted:#7c8ca5;--cn-line:#1e2a40;--cn-accent:#38bdf8;z-index:50;background:#0206178c;justify-content:center;align-items:center;padding:24px;display:flex;position:fixed;inset:0}.cn-help__panel[data-v-486e5be3]{background:var(--cn-bg-elevated);border:1px solid var(--cn-line);border-radius:12px;flex-direction:column;min-width:320px;max-width:480px;max-height:100%;display:flex;box-shadow:0 24px 64px #02061799}.cn-help__header[data-v-486e5be3]{border-bottom:1px solid var(--cn-line);justify-content:space-between;align-items:center;padding:12px 16px;display:flex}.cn-help__title[data-v-486e5be3]{color:var(--cn-fg);margin:0;font-size:14px;font-weight:600;line-height:1.4}.cn-help__close[data-v-486e5be3]{color:var(--cn-muted);cursor:pointer;background:0 0;border:0;border-radius:6px;padding:2px 8px;font-size:13px;line-height:1.4}.cn-help__close[data-v-486e5be3]:hover{color:var(--cn-fg);background:#94a3b812}.cn-help__body[data-v-486e5be3]{padding:8px 16px 16px;overflow-y:auto}.cn-help__section[data-v-486e5be3]{margin-top:12px}.cn-help__section[data-v-486e5be3]:first-child{margin-top:8px}.cn-help__section-title[data-v-486e5be3]{color:var(--cn-accent);margin:0 0 4px;font-size:11px;font-weight:600;line-height:1.4}.cn-help__list[data-v-486e5be3]{margin:0;padding:0;list-style:none}.cn-help__row[data-v-486e5be3]{justify-content:space-between;align-items:baseline;gap:16px;padding:3px 0;display:flex}.cn-help__label[data-v-486e5be3]{color:var(--cn-fg);font-size:12px;line-height:1.5}.cn-help__keys[data-v-486e5be3]{border:1px solid var(--cn-line);color:var(--cn-muted);white-space:nowrap;background:#94a3b812;border-radius:5px;flex-shrink:0;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;line-height:1.4}
|
|
2
2
|
/*$vite$:1*/
|
|
@@ -474,7 +474,11 @@ function G(e) {
|
|
|
474
474
|
let n = W[t.kind], r = e.length;
|
|
475
475
|
return r > 1 ? `${r} 处表达式语法错误:${n}` : `表达式语法错误:${n}`;
|
|
476
476
|
}
|
|
477
|
-
|
|
477
|
+
var K = "绑定数据源后可选择字段";
|
|
478
|
+
function q(e) {
|
|
479
|
+
return e ? "资源内容需为单个字段引用,点击右侧按钮选择数据字段" : "当前内容不是字段引用,绑定数据源后可选择字段";
|
|
480
|
+
}
|
|
481
|
+
function J(e) {
|
|
478
482
|
let t = b(""), n = null;
|
|
479
483
|
function r() {
|
|
480
484
|
n !== null && (t.value = n.value);
|
|
@@ -494,18 +498,18 @@ function K(e) {
|
|
|
494
498
|
}
|
|
495
499
|
//#endregion
|
|
496
500
|
//#region src/shared/fontPicker.ts
|
|
497
|
-
var
|
|
498
|
-
function
|
|
499
|
-
return h(
|
|
501
|
+
var Y = Symbol("canvas-font-picker");
|
|
502
|
+
function X() {
|
|
503
|
+
return h(Y, null);
|
|
500
504
|
}
|
|
501
505
|
//#endregion
|
|
502
506
|
//#region src/shared/mergeKey.ts
|
|
503
|
-
function
|
|
507
|
+
function Z(e, t) {
|
|
504
508
|
return `sel:${e.join(".")}:${t.join(".")}`;
|
|
505
509
|
}
|
|
506
510
|
//#endregion
|
|
507
511
|
//#region src/shared/uploadFile.ts
|
|
508
|
-
async function
|
|
512
|
+
async function Q(e) {
|
|
509
513
|
return {
|
|
510
514
|
name: e.name,
|
|
511
515
|
mime: e.type,
|
|
@@ -513,4 +517,4 @@ async function X(e) {
|
|
|
513
517
|
};
|
|
514
518
|
}
|
|
515
519
|
//#endregion
|
|
516
|
-
export {
|
|
520
|
+
export { K as a, J as c, B as d, C as f, X as i, U as l, Z as n, G as o, Y as r, q as s, Q as t, V as u };
|