@zerodep-dev/vue-tsx-pro-ui 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/dist/code-editor/CodeEditor.d.ts +18 -0
  2. package/dist/code-editor/CodeEditor.js +57 -0
  3. package/dist/code-editor/CodeEditor.js.map +1 -0
  4. package/dist/code-editor/editor.d.ts +52 -0
  5. package/dist/code-editor/editor.js +225 -0
  6. package/dist/code-editor/editor.js.map +1 -0
  7. package/dist/code-editor/index.d.ts +9 -0
  8. package/dist/code-editor/index.js +3 -0
  9. package/dist/config/lang/en-US.js +21 -3
  10. package/dist/config/lang/en-US.js.map +1 -1
  11. package/dist/config/lang/format.d.ts +2 -1
  12. package/dist/config/lang/format.js +9 -2
  13. package/dist/config/lang/format.js.map +1 -1
  14. package/dist/config/lang/lang.d.ts +19 -6
  15. package/dist/config/lang/lang.js +11 -2
  16. package/dist/config/lang/lang.js.map +1 -1
  17. package/dist/config/lang/zh-CN.js +21 -3
  18. package/dist/config/lang/zh-CN.js.map +1 -1
  19. package/dist/diagram/index.d.ts +2 -1
  20. package/dist/diagram/index.js +2 -1
  21. package/dist/diagram/layout.d.ts +57 -0
  22. package/dist/diagram/layout.js +50 -0
  23. package/dist/diagram/layout.js.map +1 -0
  24. package/dist/form/Field.d.ts +7 -0
  25. package/dist/form/Field.js +14 -3
  26. package/dist/form/Field.js.map +1 -1
  27. package/dist/form/useForm.d.ts +4 -1
  28. package/dist/form/useForm.js +35 -13
  29. package/dist/form/useForm.js.map +1 -1
  30. package/dist/index.d.ts +8 -5
  31. package/dist/index.js +8 -5
  32. package/dist/input/Combobox.js +1 -1
  33. package/dist/input/Combobox.js.map +1 -1
  34. package/dist/input/Mentions.js +1 -1
  35. package/dist/input/Mentions.js.map +1 -1
  36. package/dist/input/PeoplePickerPanel.js +11 -11
  37. package/dist/input/PeoplePickerPanel.js.map +1 -1
  38. package/dist/input/Select.js +1 -1
  39. package/dist/input/Select.js.map +1 -1
  40. package/dist/input/TreeSelect.js +1 -1
  41. package/dist/input/TreeSelect.js.map +1 -1
  42. package/dist/input/Upload.js +2 -1
  43. package/dist/input/Upload.js.map +1 -1
  44. package/dist/input/condition.d.ts +1 -1
  45. package/dist/input/condition.js +32 -14
  46. package/dist/input/condition.js.map +1 -1
  47. package/dist/input/people.d.ts +15 -14
  48. package/dist/input/people.js +5 -5
  49. package/dist/input/people.js.map +1 -1
  50. package/dist/input/remote-items.d.ts +4 -2
  51. package/dist/input/remote-items.js +7 -2
  52. package/dist/input/remote-items.js.map +1 -1
  53. package/dist/patterns/QueryTable.d.ts +3 -0
  54. package/dist/patterns/QueryTable.js +39 -14
  55. package/dist/patterns/QueryTable.js.map +1 -1
  56. package/dist/patterns/messages.d.ts +2 -0
  57. package/dist/patterns/messages.js +2 -0
  58. package/dist/patterns/messages.js.map +1 -1
  59. package/dist/utils/data/clone.d.ts +8 -0
  60. package/dist/utils/data/clone.js +21 -0
  61. package/dist/utils/data/clone.js.map +1 -0
  62. package/dist/utils/data/date.d.ts +10 -0
  63. package/dist/utils/data/date.js +13 -1
  64. package/dist/utils/data/date.js.map +1 -1
  65. package/dist/utils/data/numeric.d.ts +7 -0
  66. package/dist/utils/data/numeric.js +46 -1
  67. package/dist/utils/data/numeric.js.map +1 -1
  68. package/dist/utils/dom/download.d.ts +8 -1
  69. package/dist/utils/dom/download.js +19 -2
  70. package/dist/utils/dom/download.js.map +1 -1
  71. package/dist/utils/request/error-message.d.ts +17 -0
  72. package/dist/utils/request/error-message.js +50 -0
  73. package/dist/utils/request/error-message.js.map +1 -0
  74. package/dist/utils/request/http.d.ts +68 -4
  75. package/dist/utils/request/http.js +116 -23
  76. package/dist/utils/request/http.js.map +1 -1
  77. package/dist/utils/request/use-autosave.d.ts +35 -0
  78. package/dist/utils/request/use-autosave.js +69 -0
  79. package/dist/utils/request/use-autosave.js.map +1 -0
  80. package/package.json +57 -4
@@ -0,0 +1,18 @@
1
+ import type { Extension } from '@codemirror/state';
2
+ import { type PartProps } from '../utils/props';
3
+ import { type CodeEditorHandle } from './editor';
4
+ /** CodeEditor 的属性 */
5
+ export interface CodeEditorProps extends PartProps<'div'> {
6
+ /** 代码:父级写 _value={x} 双向绑定 */
7
+ _value?: string;
8
+ /** 编辑区的无障碍名称 */
9
+ 'aria-label': string;
10
+ /** 语言扩展(CodeMirror 的 json()、java()……);不给时是 TSX。只在挂载时读 */
11
+ language?: Extension;
12
+ /** 只读:能选中、复制、搜索,不能改 */
13
+ readonly?: boolean;
14
+ /** 编辑器建好了:拿到 CodeMirror 的视图,做撤销、读选区这类更细的操作 */
15
+ onReady?: (editor: CodeEditorHandle) => void;
16
+ }
17
+ /** 代码编辑器:语法高亮、括号匹配、缩进、搜索,颜色跟随主题 */
18
+ export declare const CodeEditor: import("@zerodep-dev/vue-tsx-pro-tsx").TsxComponent<CodeEditorProps>;
@@ -0,0 +1,57 @@
1
+ import { useConfig } from "../config/context.js";
2
+ import { mergeAttrs } from "../utils/props.js";
3
+ import { inputRecipe } from "../input/control.js";
4
+ import { createEditor } from "./editor.js";
5
+ import { createVNode, onBeforeUnmount, onMounted, shallowRef, watch } from "vue";
6
+ import { _component, bindable, readonlyProp, restProps } from "@zerodep-dev/vue-tsx-pro-tsx";
7
+ import * as css from "@zerodep-dev/vue-tsx-pro-tsx/styles";
8
+ //#region src/code-editor/CodeEditor.tsx
9
+ var styles = css.create({ root: {
10
+ display: "block",
11
+ height: "20rem",
12
+ paddingInline: 0,
13
+ overflow: "hidden"
14
+ } });
15
+ /** CodeEditor 的属性 */
16
+ /** 代码编辑器:语法高亮、括号匹配、缩进、搜索,颜色跟随主题 */
17
+ var CodeEditor = /*#__PURE__*/ _component((_props, _ctx) => {
18
+ const value = bindable(_props, "_value", () => "", _ctx.emit);
19
+ const label = readonlyProp(_props, "ariaLabel");
20
+ const language = readonlyProp(_props, "language");
21
+ const readonly = readonlyProp(_props, "readonly");
22
+ const onReady = readonlyProp(_props, "onReady");
23
+ const rest = restProps(_props, _ctx, true);
24
+ const config = useConfig();
25
+ let host = shallowRef(null);
26
+ let editor;
27
+ const isDark = () => config.theme.colorScheme === "dark";
28
+ onMounted(() => {
29
+ editor = createEditor(host.value, {
30
+ code: value.value,
31
+ dark: isDark(),
32
+ label: label.value,
33
+ language: language.value,
34
+ readonly: readonly.value,
35
+ onChange: (code) => value.value = code
36
+ });
37
+ onReady.value?.(editor);
38
+ });
39
+ onBeforeUnmount(() => editor?.destroy());
40
+ watch(() => value.value, (code) => editor?.setCode(code));
41
+ watch(isDark, (dark) => editor?.setDark(dark));
42
+ return () => createVNode("div", mergeAttrs({ sx: [inputRecipe().root, styles.root] }, rest, { ref: host }), null);
43
+ }, {
44
+ name: "CodeEditor",
45
+ props: [
46
+ "_value",
47
+ "onUpdate:_value",
48
+ "ariaLabel",
49
+ "language",
50
+ "readonly",
51
+ "onReady"
52
+ ]
53
+ });
54
+ //#endregion
55
+ export { CodeEditor };
56
+
57
+ //# sourceMappingURL=CodeEditor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CodeEditor.js","names":["_vtp_bindable","_vtp_readonlyProp","_vtp_restProps","_vue_shallowRef","_createVNode"],"sources":["../../src/code-editor/CodeEditor.tsx"],"sourcesContent":["/**\n * 代码编辑器组件:外壳与输入框相同(边框、悬停、焦点环),里面是 CodeMirror(editor.ts)。\n * CodeMirror 只在这个子路径里:页面用到编辑器时才随子路径加载,组件库主入口不带它。\n *\n * <CodeEditor _value={code} aria-label=\"代码\" sx={styles.editor} />\n * <CodeEditor _value={manifest} language={json()} aria-label=\"字段清单\" onReady={(editor) => …} />\n *\n * 高度由使用方给(sx),默认 20rem;未声明的属性落到外壳上。颜色、字体取主题 token,跟着主题变。\n */\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport type { Extension } from '@codemirror/state';\nimport { useConfig } from '../config/context';\nimport { inputRecipe } from '../input/control';\nimport { mergeAttrs, type PartProps } from '../utils/props';\nimport { onBeforeUnmount, onMounted, watch } from 'vue';\nimport { createEditor, type CodeEditorHandle } from './editor';\n\nconst styles = css.create({\n // 输入框外壳是一行的 inline-flex:改成整块,内边距交给 CodeMirror\n root: {\n display: 'block',\n height: '20rem',\n paddingInline: 0,\n overflow: 'hidden',\n },\n});\n\n/** CodeEditor 的属性 */\nexport interface CodeEditorProps extends PartProps<'div'> {\n /** 代码:父级写 _value={x} 双向绑定 */\n _value?: string;\n /** 编辑区的无障碍名称 */\n 'aria-label': string;\n /** 语言扩展(CodeMirror 的 json()、java()……);不给时是 TSX。只在挂载时读 */\n language?: Extension;\n /** 只读:能选中、复制、搜索,不能改 */\n readonly?: boolean;\n /** 编辑器建好了:拿到 CodeMirror 的视图,做撤销、读选区这类更细的操作 */\n onReady?: (editor: CodeEditorHandle) => void;\n}\n\n/** 代码编辑器:语法高亮、括号匹配、缩进、搜索,颜色跟随主题 */\nexport const CodeEditor = _component(\n ({\n _value: value = _bindable(''),\n 'aria-label': label,\n language,\n readonly,\n onReady,\n ...rest\n }: CodeEditorProps) => {\n const config = useConfig();\n let host = _state.raw<HTMLElement | null>(null);\n let editor: CodeEditorHandle | undefined;\n const isDark = () => config.theme.colorScheme === 'dark';\n\n onMounted(() => {\n editor = createEditor(host!, {\n code: value,\n dark: isDark(),\n label,\n language,\n readonly,\n onChange: (code) => (value = code),\n });\n onReady?.(editor);\n });\n onBeforeUnmount(() => editor?.destroy());\n watch(\n () => value,\n (code) => editor?.setCode(code),\n );\n watch(isDark, (dark) => editor?.setDark(dark));\n\n return () => (\n <div\n {...mergeAttrs<'div'>({ sx: [inputRecipe().root, styles.root] }, rest, {\n ref: _toRef(host),\n })}\n />\n );\n },\n);\n"],"mappings":";;;;;;;;AAkBA,IAAM,SAAS,IAAI,OAAO,EAExB,MAAM;CACJ,SAAS;CACT,QAAQ;CACR,eAAe;CACf,UAAU;AACZ,EACF,CAAC;;;AAiBD,IAAa,aAAa,0BACxB,QAAA,SAOuB;CAAA,MAAA,QAAAA,SAAA,QAAA,gBANK,IAAE,KAAA,IAAA;CAAA,MAAA,QAAAC,aAAA,QAAA,WAAA;CAAA,MAAA,WAAAA,aAAA,QAAA,UAAA;CAAA,MAAA,WAAAA,aAAA,QAAA,UAAA;CAAA,MAAA,UAAAA,aAAA,QAAA,SAAA;CAAA,MAKzB,OAAIC,UAAA,QAAA,MAAA,IAAA;CAEP,MAAM,SAAS,UAAU;CACzB,IAAI,OAAIC,WAAkC,IAAI;CAC9C,IAAI;CACJ,MAAM,eAAe,OAAO,MAAM,gBAAgB;CAElD,gBAAgB;EACd,SAAS,aAAY,KAAA,OAAQ;GAC3B,MAAI,MAAA;GACJ,MAAM,OAAO;GACb,OAAK,MAAA;GACL,UAAQ,SAAA;GACR,UAAQ,SAAA;GACR,WAAW,SAAU,MAAA,QAAQ;EAC/B,CAAC;EACD,QAAA,QAAU,MAAM;CAClB,CAAC;CACD,sBAAsB,QAAQ,QAAQ,CAAC;CACvC,YACE,MAAA,QACC,SAAS,QAAQ,QAAQ,IAAI,CAChC;CACA,MAAM,SAAS,SAAS,QAAQ,QAAQ,IAAI,CAAC;CAE7C,aAAOC,YAAA,OAEC,WAAkB,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,OAAO,IAAI,EAAE,GAAG,MAAM,EACrE,KAAG,KACL,CAAC,GAAC,IAAA;AAGR,GAAC;CAAA,MAAA;CAAA,OAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;CAAA;AAAA,CACH"}
@@ -0,0 +1,52 @@
1
+ import { type Extension } from '@codemirror/state';
2
+ import { EditorView } from '@codemirror/view';
3
+ /** 一处修改:把 [from, to) 换成 insert */
4
+ export interface CodeChange {
5
+ /** 开始位置(字符偏移,含) */
6
+ readonly from: number;
7
+ /** 结束位置(不含);等于 from 时是插入 */
8
+ readonly to: number;
9
+ /** 换上的文字;空串是删除 */
10
+ readonly insert: string;
11
+ }
12
+ /** 编辑器实例的操作 */
13
+ export interface CodeEditorHandle {
14
+ /** CodeMirror 的视图:读状态(view.state)、派发修改、做撤销等更细的操作 */
15
+ readonly view: EditorView;
16
+ /** 换掉全部代码(与当前内容相同时什么都不做) */
17
+ setCode(code: string): void;
18
+ /**
19
+ * 改几段代码(位置都按改之前的),当作用户的修改:进撤销历史、回传 onChange。
20
+ * 默认单独成一步撤销(可视化编辑器的一次操作);merge 为 true 时像打字一样,与紧挨着的上一次修改合成一步(属性面板里逐字输入)
21
+ */
22
+ edit(changes: readonly CodeChange[], options?: {
23
+ merge?: boolean;
24
+ }): void;
25
+ /** 撤销一步;没有可撤销的时返回 false */
26
+ undo(): boolean;
27
+ /** 重做一步;没有可重做的时返回 false */
28
+ redo(): boolean;
29
+ /** 光标移到第几行第几列(都从 1 起,超出时取最近的)、滚进视野并聚焦:编译错误列表点一条跳过去 */
30
+ goTo(line: number, column?: number): void;
31
+ /** 跟随站点主题的明暗 */
32
+ setDark(dark: boolean): void;
33
+ /** 拆掉编辑器(组件卸载时) */
34
+ destroy(): void;
35
+ }
36
+ /** createEditor 的选项 */
37
+ export interface CodeEditorOptions {
38
+ /** 初始代码 */
39
+ code: string;
40
+ /** 当前是不是暗色主题 */
41
+ dark: boolean;
42
+ /** 编辑区的无障碍名称 */
43
+ label: string;
44
+ /** 语言扩展;不给时是 TSX */
45
+ language?: Extension;
46
+ /** 只读:能选中、复制、搜索,不能改 */
47
+ readonly?: boolean;
48
+ /** 用户改了代码 */
49
+ onChange: (code: string) => void;
50
+ }
51
+ /** 在 parent 里创建编辑器 */
52
+ export declare function createEditor(parent: HTMLElement, { code, dark, label, language, readonly, onChange }: CodeEditorOptions): CodeEditorHandle;
@@ -0,0 +1,225 @@
1
+ import { colors, fontSizes, fonts, radii } from "../config/theme/tokens.js";
2
+ import { autocompletion, closeBrackets, closeBracketsKeymap, completionKeymap } from "@codemirror/autocomplete";
3
+ import { defaultKeymap, history, historyKeymap, indentWithTab, isolateHistory, redo, temporarilySetTabFocusMode, undo } from "@codemirror/commands";
4
+ import { javascript } from "@codemirror/lang-javascript";
5
+ import { HighlightStyle, bracketMatching, foldGutter, foldKeymap, indentOnInput, syntaxHighlighting } from "@codemirror/language";
6
+ import { highlightSelectionMatches, searchKeymap } from "@codemirror/search";
7
+ import { Annotation, Compartment, EditorState, Transaction } from "@codemirror/state";
8
+ import { EditorView, drawSelection, highlightActiveLine, highlightActiveLineGutter, keymap, lineNumbers } from "@codemirror/view";
9
+ import { tags } from "@lezer/highlight";
10
+ //#region src/code-editor/editor.ts
11
+ /**
12
+ * 代码编辑器的内核:CodeMirror 6。CodeEditor.tsx 挂载时建一个;不用 Vue 时也可以直接调 createEditor。
13
+ * 语言由使用方传(CodeMirror 的语言扩展,如 json()、java()),默认 TSX。
14
+ *
15
+ * 颜色、字体全部取主题 token(colors.code* 与 Shiki 代码块同一套),切换主题、主题编辑器调色都跟着变;
16
+ * 明暗只影响 CodeMirror 自带的少量默认样式,用 Compartment 切换。
17
+ * Tab 用来缩进;按 Esc 后再按 Tab 才把焦点移出编辑器(CodeMirror 的 tab-focus 模式),键盘用户不会被困住。
18
+ */
19
+ var c = (token) => String(token);
20
+ /** 标记 setCode 发起的修改:不当作用户编辑回传 */
21
+ var external = Annotation.define();
22
+ var highlightStyle = HighlightStyle.define([
23
+ {
24
+ tag: [
25
+ tags.keyword,
26
+ tags.modifier,
27
+ tags.operatorKeyword,
28
+ tags.self
29
+ ],
30
+ color: c(colors.codeKeyword)
31
+ },
32
+ {
33
+ tag: [
34
+ tags.string,
35
+ tags.special(tags.string),
36
+ tags.regexp
37
+ ],
38
+ color: c(colors.codeString)
39
+ },
40
+ {
41
+ tag: [
42
+ tags.number,
43
+ tags.bool,
44
+ tags.null,
45
+ tags.atom
46
+ ],
47
+ color: c(colors.codeNumber)
48
+ },
49
+ {
50
+ tag: [tags.function(tags.variableName), tags.function(tags.propertyName)],
51
+ color: c(colors.codeFunction)
52
+ },
53
+ {
54
+ tag: [
55
+ tags.typeName,
56
+ tags.className,
57
+ tags.namespace
58
+ ],
59
+ color: c(colors.codeType)
60
+ },
61
+ {
62
+ tag: tags.comment,
63
+ color: c(colors.codeComment),
64
+ fontStyle: "italic"
65
+ },
66
+ {
67
+ tag: [tags.punctuation, tags.angleBracket],
68
+ color: c(colors.codeComment)
69
+ },
70
+ {
71
+ tag: tags.tagName,
72
+ color: c(colors.codeTag)
73
+ },
74
+ {
75
+ tag: tags.attributeName,
76
+ color: c(colors.codeAttribute)
77
+ },
78
+ {
79
+ tag: tags.invalid,
80
+ color: c(colors.dangerText)
81
+ }
82
+ ]);
83
+ var theme = EditorView.theme({
84
+ "&": {
85
+ height: "100%",
86
+ color: c(colors.text),
87
+ backgroundColor: c(colors.surface),
88
+ fontSize: c(fontSizes.sm)
89
+ },
90
+ "&.cm-focused": { outline: "none" },
91
+ ".cm-scroller": {
92
+ fontFamily: c(fonts.mono),
93
+ lineHeight: "1.6",
94
+ scrollbarWidth: "thin",
95
+ scrollbarColor: `color-mix(in srgb, ${c(colors.textMuted)} 50%, transparent) transparent`
96
+ },
97
+ ".cm-content": {
98
+ caretColor: c(colors.text),
99
+ paddingBlock: "12px"
100
+ },
101
+ ".cm-cursor, .cm-dropCursor": { borderLeftColor: c(colors.text) },
102
+ "&.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground, .cm-selectionBackground, .cm-content ::selection": { backgroundColor: c(colors.selection) },
103
+ ".cm-activeLine": { backgroundColor: c(colors.surfaceMuted) },
104
+ ".cm-gutters": {
105
+ color: c(colors.codeComment),
106
+ backgroundColor: c(colors.surface),
107
+ border: "none"
108
+ },
109
+ ".cm-activeLineGutter": {
110
+ color: c(colors.text),
111
+ backgroundColor: c(colors.surfaceMuted)
112
+ },
113
+ "&.cm-focused .cm-matchingBracket": {
114
+ backgroundColor: c(colors.accentSoft),
115
+ outline: `1px solid ${c(colors.accentBorder)}`
116
+ },
117
+ ".cm-selectionMatch, .cm-searchMatch": { backgroundColor: c(colors.highlight) },
118
+ ".cm-tooltip": {
119
+ color: c(colors.text),
120
+ backgroundColor: c(colors.surfaceRaised),
121
+ border: `1px solid ${c(colors.border)}`,
122
+ borderRadius: c(radii.md),
123
+ overflow: "hidden"
124
+ },
125
+ ".cm-tooltip-autocomplete > ul": { fontFamily: c(fonts.mono) },
126
+ ".cm-tooltip-autocomplete > ul > li[aria-selected]": {
127
+ color: c(colors.text),
128
+ backgroundColor: c(colors.accentSoft)
129
+ },
130
+ ".cm-panels": {
131
+ color: c(colors.text),
132
+ backgroundColor: c(colors.surfaceMuted)
133
+ },
134
+ ".cm-panels-bottom": { borderTop: `1px solid ${c(colors.border)}` }
135
+ });
136
+ /** 在 parent 里创建编辑器 */
137
+ function createEditor(parent, { code, dark, label, language, readonly, onChange }) {
138
+ const darkMode = new Compartment();
139
+ const view = new EditorView({
140
+ parent,
141
+ state: EditorState.create({
142
+ doc: code,
143
+ extensions: [
144
+ lineNumbers(),
145
+ highlightActiveLineGutter(),
146
+ foldGutter(),
147
+ history(),
148
+ drawSelection(),
149
+ indentOnInput(),
150
+ bracketMatching(),
151
+ closeBrackets(),
152
+ autocompletion(),
153
+ highlightActiveLine(),
154
+ highlightSelectionMatches(),
155
+ language ?? javascript({
156
+ jsx: true,
157
+ typescript: true
158
+ }),
159
+ EditorState.readOnly.of(readonly === true),
160
+ syntaxHighlighting(highlightStyle),
161
+ EditorState.tabSize.of(2),
162
+ theme,
163
+ darkMode.of(EditorView.darkTheme.of(dark)),
164
+ EditorView.contentAttributes.of({ "aria-label": label }),
165
+ keymap.of([
166
+ ...closeBracketsKeymap,
167
+ ...completionKeymap,
168
+ ...searchKeymap,
169
+ ...foldKeymap,
170
+ ...historyKeymap,
171
+ ...defaultKeymap,
172
+ {
173
+ key: "Escape",
174
+ run: temporarilySetTabFocusMode
175
+ },
176
+ indentWithTab
177
+ ]),
178
+ EditorView.updateListener.of((update) => {
179
+ if (update.docChanged && update.transactions.some((tr) => !tr.annotation(external))) onChange(update.state.doc.toString());
180
+ })
181
+ ]
182
+ })
183
+ });
184
+ return {
185
+ view,
186
+ setCode(next) {
187
+ if (next === view.state.doc.toString()) return;
188
+ view.dispatch({
189
+ changes: {
190
+ from: 0,
191
+ to: view.state.doc.length,
192
+ insert: next
193
+ },
194
+ annotations: external.of(true)
195
+ });
196
+ },
197
+ edit(changes, { merge = false } = {}) {
198
+ if (changes.length === 0) return;
199
+ view.dispatch({
200
+ changes: [...changes],
201
+ annotations: merge ? Transaction.userEvent.of("input.type") : isolateHistory.of("full")
202
+ });
203
+ },
204
+ undo: () => undo(view),
205
+ redo: () => redo(view),
206
+ goTo(line, column = 1) {
207
+ const doc = view.state.doc;
208
+ const target = doc.line(Math.min(Math.max(line, 1), doc.lines));
209
+ const pos = target.from + Math.min(Math.max(column - 1, 0), target.length);
210
+ view.dispatch({
211
+ selection: { anchor: pos },
212
+ effects: EditorView.scrollIntoView(pos, { y: "center" })
213
+ });
214
+ view.focus();
215
+ },
216
+ setDark(next) {
217
+ view.dispatch({ effects: darkMode.reconfigure(EditorView.darkTheme.of(next)) });
218
+ },
219
+ destroy: () => view.destroy()
220
+ };
221
+ }
222
+ //#endregion
223
+ export { createEditor };
224
+
225
+ //# sourceMappingURL=editor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editor.js","names":[],"sources":["../../src/code-editor/editor.ts"],"sourcesContent":["/**\n * 代码编辑器的内核:CodeMirror 6。CodeEditor.tsx 挂载时建一个;不用 Vue 时也可以直接调 createEditor。\n * 语言由使用方传(CodeMirror 的语言扩展,如 json()、java()),默认 TSX。\n *\n * 颜色、字体全部取主题 token(colors.code* 与 Shiki 代码块同一套),切换主题、主题编辑器调色都跟着变;\n * 明暗只影响 CodeMirror 自带的少量默认样式,用 Compartment 切换。\n * Tab 用来缩进;按 Esc 后再按 Tab 才把焦点移出编辑器(CodeMirror 的 tab-focus 模式),键盘用户不会被困住。\n */\nimport {\n autocompletion,\n closeBrackets,\n closeBracketsKeymap,\n completionKeymap,\n} from '@codemirror/autocomplete';\nimport {\n defaultKeymap,\n history,\n historyKeymap,\n indentWithTab,\n isolateHistory,\n redo,\n temporarilySetTabFocusMode,\n undo,\n} from '@codemirror/commands';\nimport { javascript } from '@codemirror/lang-javascript';\nimport {\n bracketMatching,\n foldGutter,\n foldKeymap,\n HighlightStyle,\n indentOnInput,\n syntaxHighlighting,\n} from '@codemirror/language';\nimport { highlightSelectionMatches, searchKeymap } from '@codemirror/search';\nimport {\n Annotation,\n Compartment,\n EditorState,\n Transaction,\n type Extension,\n} from '@codemirror/state';\nimport {\n drawSelection,\n EditorView,\n highlightActiveLine,\n highlightActiveLineGutter,\n keymap,\n lineNumbers,\n} from '@codemirror/view';\nimport { tags } from '@lezer/highlight';\nimport { colors, fonts, fontSizes, radii } from '../config/theme/tokens';\n\n// token 在运行时是 var(--哈希) 字符串\nconst c = (token: unknown) => String(token);\n\n/** 标记 setCode 发起的修改:不当作用户编辑回传 */\nconst external = Annotation.define<boolean>();\n\nconst highlightStyle = HighlightStyle.define([\n {\n tag: [tags.keyword, tags.modifier, tags.operatorKeyword, tags.self],\n color: c(colors.codeKeyword),\n },\n { tag: [tags.string, tags.special(tags.string), tags.regexp], color: c(colors.codeString) },\n { tag: [tags.number, tags.bool, tags.null, tags.atom], color: c(colors.codeNumber) },\n {\n tag: [tags.function(tags.variableName), tags.function(tags.propertyName)],\n color: c(colors.codeFunction),\n },\n { tag: [tags.typeName, tags.className, tags.namespace], color: c(colors.codeType) },\n { tag: tags.comment, color: c(colors.codeComment), fontStyle: 'italic' },\n { tag: [tags.punctuation, tags.angleBracket], color: c(colors.codeComment) },\n { tag: tags.tagName, color: c(colors.codeTag) },\n { tag: tags.attributeName, color: c(colors.codeAttribute) },\n { tag: tags.invalid, color: c(colors.dangerText) },\n]);\n\nconst theme = EditorView.theme({\n '&': {\n height: '100%',\n color: c(colors.text),\n backgroundColor: c(colors.surface),\n fontSize: c(fontSizes.sm),\n },\n // 外框(CodeEditor)画焦点环\n '&.cm-focused': { outline: 'none' },\n '.cm-scroller': {\n fontFamily: c(fonts.mono),\n lineHeight: '1.6',\n // CodeMirror 自己管滚动,套不了 ScrollArea:原生滚动条改细,滑块取浮层滚动条(scrollAreaBarStyles.thumb)的颜色,外观一致\n scrollbarWidth: 'thin',\n scrollbarColor: `color-mix(in srgb, ${c(colors.textMuted)} 50%, transparent) transparent`,\n },\n '.cm-content': { caretColor: c(colors.text), paddingBlock: '12px' },\n '.cm-cursor, .cm-dropCursor': { borderLeftColor: c(colors.text) },\n '&.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground, .cm-selectionBackground, .cm-content ::selection':\n { backgroundColor: c(colors.selection) },\n '.cm-activeLine': { backgroundColor: c(colors.surfaceMuted) },\n // 行号与 CodeBlock 的同色:textPlaceholder 在编辑器底色上不到 4.5:1\n '.cm-gutters': {\n color: c(colors.codeComment),\n backgroundColor: c(colors.surface),\n border: 'none',\n },\n '.cm-activeLineGutter': { color: c(colors.text), backgroundColor: c(colors.surfaceMuted) },\n '&.cm-focused .cm-matchingBracket': {\n backgroundColor: c(colors.accentSoft),\n outline: `1px solid ${c(colors.accentBorder)}`,\n },\n '.cm-selectionMatch, .cm-searchMatch': { backgroundColor: c(colors.highlight) },\n '.cm-tooltip': {\n color: c(colors.text),\n backgroundColor: c(colors.surfaceRaised),\n border: `1px solid ${c(colors.border)}`,\n borderRadius: c(radii.md),\n overflow: 'hidden',\n },\n '.cm-tooltip-autocomplete > ul': { fontFamily: c(fonts.mono) },\n '.cm-tooltip-autocomplete > ul > li[aria-selected]': {\n color: c(colors.text),\n backgroundColor: c(colors.accentSoft),\n },\n '.cm-panels': { color: c(colors.text), backgroundColor: c(colors.surfaceMuted) },\n '.cm-panels-bottom': { borderTop: `1px solid ${c(colors.border)}` },\n});\n\n/** 一处修改:把 [from, to) 换成 insert */\nexport interface CodeChange {\n /** 开始位置(字符偏移,含) */\n readonly from: number;\n /** 结束位置(不含);等于 from 时是插入 */\n readonly to: number;\n /** 换上的文字;空串是删除 */\n readonly insert: string;\n}\n\n/** 编辑器实例的操作 */\nexport interface CodeEditorHandle {\n /** CodeMirror 的视图:读状态(view.state)、派发修改、做撤销等更细的操作 */\n readonly view: EditorView;\n /** 换掉全部代码(与当前内容相同时什么都不做) */\n setCode(code: string): void;\n /**\n * 改几段代码(位置都按改之前的),当作用户的修改:进撤销历史、回传 onChange。\n * 默认单独成一步撤销(可视化编辑器的一次操作);merge 为 true 时像打字一样,与紧挨着的上一次修改合成一步(属性面板里逐字输入)\n */\n edit(changes: readonly CodeChange[], options?: { merge?: boolean }): void;\n /** 撤销一步;没有可撤销的时返回 false */\n undo(): boolean;\n /** 重做一步;没有可重做的时返回 false */\n redo(): boolean;\n /** 光标移到第几行第几列(都从 1 起,超出时取最近的)、滚进视野并聚焦:编译错误列表点一条跳过去 */\n goTo(line: number, column?: number): void;\n /** 跟随站点主题的明暗 */\n setDark(dark: boolean): void;\n /** 拆掉编辑器(组件卸载时) */\n destroy(): void;\n}\n\n/** createEditor 的选项 */\nexport interface CodeEditorOptions {\n /** 初始代码 */\n code: string;\n /** 当前是不是暗色主题 */\n dark: boolean;\n /** 编辑区的无障碍名称 */\n label: string;\n /** 语言扩展;不给时是 TSX */\n language?: Extension;\n /** 只读:能选中、复制、搜索,不能改 */\n readonly?: boolean;\n /** 用户改了代码 */\n onChange: (code: string) => void;\n}\n\n/** 在 parent 里创建编辑器 */\nexport function createEditor(\n parent: HTMLElement,\n { code, dark, label, language, readonly, onChange }: CodeEditorOptions,\n): CodeEditorHandle {\n const darkMode = new Compartment();\n const view = new EditorView({\n parent,\n state: EditorState.create({\n doc: code,\n extensions: [\n lineNumbers(),\n highlightActiveLineGutter(),\n foldGutter(),\n history(),\n drawSelection(),\n indentOnInput(),\n bracketMatching(),\n closeBrackets(),\n autocompletion(),\n highlightActiveLine(),\n highlightSelectionMatches(),\n language ?? javascript({ jsx: true, typescript: true }),\n EditorState.readOnly.of(readonly === true),\n syntaxHighlighting(highlightStyle),\n EditorState.tabSize.of(2),\n theme,\n darkMode.of(EditorView.darkTheme.of(dark)),\n EditorView.contentAttributes.of({ 'aria-label': label }),\n keymap.of([\n ...closeBracketsKeymap,\n ...completionKeymap,\n ...searchKeymap,\n ...foldKeymap,\n ...historyKeymap,\n ...defaultKeymap,\n // 补全、搜索面板没有接住的 Esc:下一次 Tab 移出焦点\n { key: 'Escape', run: temporarilySetTabFocusMode },\n indentWithTab,\n ]),\n EditorView.updateListener.of((update) => {\n if (update.docChanged && update.transactions.some((tr) => !tr.annotation(external)))\n onChange(update.state.doc.toString());\n }),\n ],\n }),\n });\n return {\n view,\n setCode(next) {\n if (next === view.state.doc.toString()) return;\n view.dispatch({\n changes: { from: 0, to: view.state.doc.length, insert: next },\n annotations: external.of(true),\n });\n },\n edit(changes, { merge = false } = {}) {\n if (changes.length === 0) return;\n view.dispatch({\n changes: [...changes],\n annotations: merge ? Transaction.userEvent.of('input.type') : isolateHistory.of('full'),\n });\n },\n undo: () => undo(view),\n redo: () => redo(view),\n goTo(line, column = 1) {\n const doc = view.state.doc;\n const target = doc.line(Math.min(Math.max(line, 1), doc.lines));\n const pos = target.from + Math.min(Math.max(column - 1, 0), target.length);\n view.dispatch({\n selection: { anchor: pos },\n effects: EditorView.scrollIntoView(pos, { y: 'center' }),\n });\n view.focus();\n },\n setDark(next) {\n view.dispatch({ effects: darkMode.reconfigure(EditorView.darkTheme.of(next)) });\n },\n destroy: () => view.destroy(),\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAqDA,IAAM,KAAK,UAAmB,OAAO,KAAK;;AAG1C,IAAM,WAAW,WAAW,OAAgB;AAE5C,IAAM,iBAAiB,eAAe,OAAO;CAC3C;EACE,KAAK;GAAC,KAAK;GAAS,KAAK;GAAU,KAAK;GAAiB,KAAK;EAAI;EAClE,OAAO,EAAE,OAAO,WAAW;CAC7B;CACA;EAAE,KAAK;GAAC,KAAK;GAAQ,KAAK,QAAQ,KAAK,MAAM;GAAG,KAAK;EAAM;EAAG,OAAO,EAAE,OAAO,UAAU;CAAE;CAC1F;EAAE,KAAK;GAAC,KAAK;GAAQ,KAAK;GAAM,KAAK;GAAM,KAAK;EAAI;EAAG,OAAO,EAAE,OAAO,UAAU;CAAE;CACnF;EACE,KAAK,CAAC,KAAK,SAAS,KAAK,YAAY,GAAG,KAAK,SAAS,KAAK,YAAY,CAAC;EACxE,OAAO,EAAE,OAAO,YAAY;CAC9B;CACA;EAAE,KAAK;GAAC,KAAK;GAAU,KAAK;GAAW,KAAK;EAAS;EAAG,OAAO,EAAE,OAAO,QAAQ;CAAE;CAClF;EAAE,KAAK,KAAK;EAAS,OAAO,EAAE,OAAO,WAAW;EAAG,WAAW;CAAS;CACvE;EAAE,KAAK,CAAC,KAAK,aAAa,KAAK,YAAY;EAAG,OAAO,EAAE,OAAO,WAAW;CAAE;CAC3E;EAAE,KAAK,KAAK;EAAS,OAAO,EAAE,OAAO,OAAO;CAAE;CAC9C;EAAE,KAAK,KAAK;EAAe,OAAO,EAAE,OAAO,aAAa;CAAE;CAC1D;EAAE,KAAK,KAAK;EAAS,OAAO,EAAE,OAAO,UAAU;CAAE;AACnD,CAAC;AAED,IAAM,QAAQ,WAAW,MAAM;CAC7B,KAAK;EACH,QAAQ;EACR,OAAO,EAAE,OAAO,IAAI;EACpB,iBAAiB,EAAE,OAAO,OAAO;EACjC,UAAU,EAAE,UAAU,EAAE;CAC1B;CAEA,gBAAgB,EAAE,SAAS,OAAO;CAClC,gBAAgB;EACd,YAAY,EAAE,MAAM,IAAI;EACxB,YAAY;EAEZ,gBAAgB;EAChB,gBAAgB,sBAAsB,EAAE,OAAO,SAAS,EAAE;CAC5D;CACA,eAAe;EAAE,YAAY,EAAE,OAAO,IAAI;EAAG,cAAc;CAAO;CAClE,8BAA8B,EAAE,iBAAiB,EAAE,OAAO,IAAI,EAAE;CAChE,8HACE,EAAE,iBAAiB,EAAE,OAAO,SAAS,EAAE;CACzC,kBAAkB,EAAE,iBAAiB,EAAE,OAAO,YAAY,EAAE;CAE5D,eAAe;EACb,OAAO,EAAE,OAAO,WAAW;EAC3B,iBAAiB,EAAE,OAAO,OAAO;EACjC,QAAQ;CACV;CACA,wBAAwB;EAAE,OAAO,EAAE,OAAO,IAAI;EAAG,iBAAiB,EAAE,OAAO,YAAY;CAAE;CACzF,oCAAoC;EAClC,iBAAiB,EAAE,OAAO,UAAU;EACpC,SAAS,aAAa,EAAE,OAAO,YAAY;CAC7C;CACA,uCAAuC,EAAE,iBAAiB,EAAE,OAAO,SAAS,EAAE;CAC9E,eAAe;EACb,OAAO,EAAE,OAAO,IAAI;EACpB,iBAAiB,EAAE,OAAO,aAAa;EACvC,QAAQ,aAAa,EAAE,OAAO,MAAM;EACpC,cAAc,EAAE,MAAM,EAAE;EACxB,UAAU;CACZ;CACA,iCAAiC,EAAE,YAAY,EAAE,MAAM,IAAI,EAAE;CAC7D,qDAAqD;EACnD,OAAO,EAAE,OAAO,IAAI;EACpB,iBAAiB,EAAE,OAAO,UAAU;CACtC;CACA,cAAc;EAAE,OAAO,EAAE,OAAO,IAAI;EAAG,iBAAiB,EAAE,OAAO,YAAY;CAAE;CAC/E,qBAAqB,EAAE,WAAW,aAAa,EAAE,OAAO,MAAM,IAAI;AACpE,CAAC;;AAoDD,SAAgB,aACd,QACA,EAAE,MAAM,MAAM,OAAO,UAAU,UAAU,YACvB;CAClB,MAAM,WAAW,IAAI,YAAY;CACjC,MAAM,OAAO,IAAI,WAAW;EAC1B;EACA,OAAO,YAAY,OAAO;GACxB,KAAK;GACL,YAAY;IACV,YAAY;IACZ,0BAA0B;IAC1B,WAAW;IACX,QAAQ;IACR,cAAc;IACd,cAAc;IACd,gBAAgB;IAChB,cAAc;IACd,eAAe;IACf,oBAAoB;IACpB,0BAA0B;IAC1B,YAAY,WAAW;KAAE,KAAK;KAAM,YAAY;IAAK,CAAC;IACtD,YAAY,SAAS,GAAG,aAAa,IAAI;IACzC,mBAAmB,cAAc;IACjC,YAAY,QAAQ,GAAG,CAAC;IACxB;IACA,SAAS,GAAG,WAAW,UAAU,GAAG,IAAI,CAAC;IACzC,WAAW,kBAAkB,GAAG,EAAE,cAAc,MAAM,CAAC;IACvD,OAAO,GAAG;KACR,GAAG;KACH,GAAG;KACH,GAAG;KACH,GAAG;KACH,GAAG;KACH,GAAG;KAEH;MAAE,KAAK;MAAU,KAAK;KAA2B;KACjD;IACF,CAAC;IACD,WAAW,eAAe,IAAI,WAAW;KACvC,IAAI,OAAO,cAAc,OAAO,aAAa,MAAM,OAAO,CAAC,GAAG,WAAW,QAAQ,CAAC,GAChF,SAAS,OAAO,MAAM,IAAI,SAAS,CAAC;IACxC,CAAC;GACH;EACF,CAAC;CACH,CAAC;CACD,OAAO;EACL;EACA,QAAQ,MAAM;GACZ,IAAI,SAAS,KAAK,MAAM,IAAI,SAAS,GAAG;GACxC,KAAK,SAAS;IACZ,SAAS;KAAE,MAAM;KAAG,IAAI,KAAK,MAAM,IAAI;KAAQ,QAAQ;IAAK;IAC5D,aAAa,SAAS,GAAG,IAAI;GAC/B,CAAC;EACH;EACA,KAAK,SAAS,EAAE,QAAQ,UAAU,CAAC,GAAG;GACpC,IAAI,QAAQ,WAAW,GAAG;GAC1B,KAAK,SAAS;IACZ,SAAS,CAAC,GAAG,OAAO;IACpB,aAAa,QAAQ,YAAY,UAAU,GAAG,YAAY,IAAI,eAAe,GAAG,MAAM;GACxF,CAAC;EACH;EACA,YAAY,KAAK,IAAI;EACrB,YAAY,KAAK,IAAI;EACrB,KAAK,MAAM,SAAS,GAAG;GACrB,MAAM,MAAM,KAAK,MAAM;GACvB,MAAM,SAAS,IAAI,KAAK,KAAK,IAAI,KAAK,IAAI,MAAM,CAAC,GAAG,IAAI,KAAK,CAAC;GAC9D,MAAM,MAAM,OAAO,OAAO,KAAK,IAAI,KAAK,IAAI,SAAS,GAAG,CAAC,GAAG,OAAO,MAAM;GACzE,KAAK,SAAS;IACZ,WAAW,EAAE,QAAQ,IAAI;IACzB,SAAS,WAAW,eAAe,KAAK,EAAE,GAAG,SAAS,CAAC;GACzD,CAAC;GACD,KAAK,MAAM;EACb;EACA,QAAQ,MAAM;GACZ,KAAK,SAAS,EAAE,SAAS,SAAS,YAAY,WAAW,UAAU,GAAG,IAAI,CAAC,EAAE,CAAC;EAChF;EACA,eAAe,KAAK,QAAQ;CAC9B;AACF"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * 代码编辑器(子路径 `@zerodep-dev/vue-tsx-pro-ui/code-editor`):CodeMirror 6,颜色、字体取主题 token;Esc 后 Tab 移出焦点。
3
+ * 依赖可选的 peer:@codemirror/*(autocomplete、commands、lang-javascript、language、search、state、view)与 @lezer/highlight,用到时安装。
4
+ *
5
+ * import { CodeEditor } from '@zerodep-dev/vue-tsx-pro-ui/code-editor';
6
+ * <CodeEditor _value={source} aria-label="表单源码" />
7
+ */
8
+ export { CodeEditor, type CodeEditorProps } from './CodeEditor';
9
+ export { createEditor, type CodeChange, type CodeEditorHandle, type CodeEditorOptions, } from './editor';
@@ -0,0 +1,3 @@
1
+ import { createEditor } from "./editor.js";
2
+ import { CodeEditor } from "./CodeEditor.js";
3
+ export { CodeEditor, createEditor };
@@ -11,6 +11,24 @@ var enUS = {
11
11
  close: "Close",
12
12
  imagePreview: (alt) => `View larger: ${alt}`,
13
13
  imageError: "Image failed to load",
14
+ requestFailed: "Request failed. Try again later.",
15
+ errorCodes: {
16
+ "http.network": "Network connection failed. Check your network and try again.",
17
+ "http.timeout": ({ seconds }) => typeof seconds === "number" ? `The request timed out after ${seconds} s. Try again later.` : "The request timed out. Try again later.",
18
+ "http.aborted": "The request was canceled.",
19
+ "http.status": ({ status }) => typeof status === "number" ? `The service is unavailable (${status}). Try again later.` : "The service is unavailable. Try again later.",
20
+ "http.parse": "The service returned a response that could not be read. Try again later.",
21
+ "query.request-invalid": "The query is not valid. Check it and try again.",
22
+ "query.empty-result": "The record does not exist or was deleted.",
23
+ "query.too-many-rows": "More than one record matched, so none was chosen.",
24
+ "query.unexpected-row-count": "Someone else changed or deleted this record. Refresh and try again.",
25
+ "query.statement-timeout": "The query timed out. Narrow it down and try again.",
26
+ "query.execution-failed": "The data operation failed. Try again later.",
27
+ "query.invalid-row": "The record is incomplete and cannot be saved.",
28
+ "query.batch-write-failed": "Some records could not be saved, so none were.",
29
+ "query.transaction-closed": "Saving was interrupted. Try again.",
30
+ "query.quota-exceeded": "Browser storage is full. Free up space and try again."
31
+ },
14
32
  lightboxLabel: "Image viewer",
15
33
  lightboxZoomIn: "Zoom in",
16
34
  lightboxZoomOut: "Zoom out",
@@ -276,12 +294,12 @@ var enUS = {
276
294
  peopleTypes: {
277
295
  user: "Person",
278
296
  department: "Department",
279
- position: "Position"
297
+ role: "Role"
280
298
  },
281
- peopleSearch: "Search people, departments, positions",
299
+ peopleSearch: "Search people, departments, roles",
282
300
  peoplePages: "Browse by",
283
301
  peopleOrg: "Organization",
284
- peoplePositions: "Positions",
302
+ peopleRoles: "Roles",
285
303
  peopleRecent: "Recent",
286
304
  peopleRoot: "All",
287
305
  peopleChildren: "Open",
@@ -1 +1 @@
1
- {"version":3,"file":"en-US.js","names":[],"sources":["../../../src/config/lang/en-US.ts"],"sourcesContent":["import zodMessages from 'zod/v4/locales/en.js';\nimport type { Lang } from './lang';\n\n/** English (United States) */\nexport const enUS: Lang = {\n code: 'en-US',\n direction: 'ltr',\n calendar: 'gregory',\n currency: 'USD',\n\n confirm: 'OK',\n cancel: 'Cancel',\n close: 'Close',\n imagePreview: (alt) => `View larger: ${alt}`,\n imageError: 'Image failed to load',\n lightboxLabel: 'Image viewer',\n lightboxZoomIn: 'Zoom in',\n lightboxZoomOut: 'Zoom out',\n lightboxRotateLeft: 'Rotate left',\n lightboxRotateRight: 'Rotate right',\n lightboxReset: 'Reset',\n lightboxDownload: 'Download',\n lightboxPrevious: 'Previous image',\n lightboxNext: 'Next image',\n lightboxCounter: (index, total) => `${index} of ${total}`,\n descriptionsCopy: (label) => `Copy ${label}`,\n fieldCompareHeaders: ['Field', 'Before', 'After', 'Change'],\n fieldCompareTo: 'changed to',\n fieldCompareNone: 'No changes',\n timelineShowMore: (count) => `Show ${count} more`,\n timelineShowLess: 'Show less',\n timelineDetails: 'Details',\n mentionsList: 'People to mention',\n mentionsEmpty: 'No matching people',\n checklistStatus: {\n done: 'done',\n todo: 'to do',\n overdue: 'overdue',\n blocked: 'blocked',\n skipped: 'not applicable',\n },\n checklistItemState: (label, state) => `${label}: ${state}`,\n checklistIconsLabel: (parts) => parts.join('; '),\n checklistSummary: (done, total) => `${done} of ${total} done`,\n chartExport: 'Export',\n chartExportImage: 'Export image (PNG)',\n chartExportData: 'Export data (CSV)',\n chartExportName: 'chart',\n chartZoom: 'Visible range',\n chartZoomReset: 'Show all',\n chartZoomIn: 'Zoom in',\n chartZoomOut: 'Zoom out',\n chartZoomFit: 'Fit to view',\n chartZoomWheelHint: 'Hold Ctrl and scroll to zoom the map',\n chartSeries: 'Series',\n chartStart: 'Start',\n chartEnd: 'End',\n chartDuration: 'Duration',\n chartToday: 'Today',\n chartDays: (days) => (days === 1 ? '1 day' : `${days} days`),\n sparklineSummary: (count, first, last, min, max) =>\n `${count} values, from ${first} to ${last}, low ${min}, high ${max}`,\n clear: 'Clear',\n loading: 'Loading',\n remove: 'Remove',\n copy: 'Copy',\n copied: 'Copied',\n emptyValue: '—',\n formRequired: 'Required',\n formErrorSummary: (count) => (count === 1 ? 'There is 1 problem' : `There are ${count} problems`),\n formErrorItem: (label, message) => `${label}: ${message}`,\n formIssues: zodMessages().localeError,\n leaveTitle: 'Leave this page?',\n leaveDescription: 'You have unsaved changes that will be lost.',\n leaveConfirm: 'Leave',\n\n toasterLabel: 'Notifications',\n\n linkNewWindow: ' (opens in a new window)',\n passwordShow: 'Show password',\n characterCount: (count, max) =>\n max == null ? `${count} characters` : `${count} of ${max} characters`,\n sliderMin: 'Minimum',\n sliderMax: 'Maximum',\n indicatorCount: (count) => `${count} new`,\n indicatorDot: 'New',\n avatarMore: (count) => `${count} more`,\n numberDecrement: 'Decrease',\n numberIncrement: 'Increase',\n comboboxToggle: 'Show options',\n tableSelectAll: 'Select all',\n tableSelectColumn: 'Select',\n tableSelectRow: (row) => `Select row ${row}`,\n tableResizeColumn: (column) => `Resize column “${column}”`,\n tableEmpty: 'No data',\n tableSummary: 'Total',\n tableSelectedCount: (count) => `${count} selected`,\n listResultCount: (count) => (count === 1 ? '1 option' : `${count} options`),\n listLoadFailed: 'Failed to load. Try again.',\n tableClearSelection: 'Clear selection',\n tableDetails: 'Details',\n tableRowDetails: (row) => `Details of ${row}`,\n tableFilterColumn: (column, active) => `Filter “${column}”${active ? ' (filtered)' : ''}`,\n tableFilterSearch: 'Search',\n tableFilterClear: 'Clear filter',\n tableColumnMenu: (column) => `Actions for column “${column}”`,\n tableSortAscending: 'Sort ascending',\n tableSortDescending: 'Sort descending',\n tableSortClear: 'Clear sort',\n tableSortPriority: (priority, direction) => `sort ${priority}, ${direction}`,\n tablePinStart: 'Pin to start',\n tablePinEnd: 'Pin to end',\n tableUnpin: 'Unpin',\n tableMoveBackward: 'Move earlier',\n tableMoveForward: 'Move later',\n tableHideColumn: 'Hide column',\n tableColumnSettings: 'Columns',\n tableColumnSettingsReset: 'Reset',\n chartEmpty: 'No data',\n chartCategory: 'Category',\n chartValue: 'Value',\n chartShare: 'Share',\n chartTotal: 'Total',\n chartFlow: 'Flow',\n chartFlowLabel: (source, target) => `${source} → ${target}`,\n chartIncrease: 'Increase',\n chartDecrease: 'Decrease',\n chartChange: 'Change',\n chartCumulative: 'Cumulative',\n chartStepRate: 'Step conversion',\n chartOverallRate: 'Overall conversion',\n chartStage: 'Stage',\n chartLink: 'Link',\n chartDegree: (count) => `${count} ${count === 1 ? 'link' : 'links'}`,\n treeToggle: (row) => `Children of ${row}`,\n splitterResize: 'Resize panes',\n splitterCollapse: 'Collapse',\n splitterExpand: 'Expand',\n fileDrop: 'Click or drop files here',\n fileTooLarge: (max) => `File must be at most ${max}`,\n fileTypeRejected: 'This file type is not supported',\n uploadFailed: 'Upload failed',\n uploadDone: 'Uploaded',\n uploadRetry: (file) => `Retry uploading ${file}`,\n uploadRemove: (file) => `Remove ${file}`,\n uploadAddImage: 'Add image',\n uploadPasteHint: 'You can also paste images',\n progressTarget: (value) => `target ${value}`,\n backToTop: 'Back to top',\n ellipsisExpand: 'More',\n ellipsisCollapse: 'Less',\n ratingStar: (value) => (value === 1 ? '1 star' : `${value} stars`),\n ratingSummary: (value, count) => (value == null ? 'Not rated' : `${value} out of ${count} stars`),\n resultStatus: {\n 403: {\n title: 'Access denied',\n description: 'You need more permissions to see this page. Ask an administrator for access.',\n },\n 404: {\n title: 'Page not found',\n description: 'The address may be wrong, or the page has moved.',\n },\n 500: {\n title: 'Something went wrong',\n description:\n 'The server could not handle the request. Try again later, and contact an administrator if it keeps happening.',\n },\n },\n sortableHandle: (item) => `Move ${item}`,\n sortableInstructions:\n 'Press Space to pick up, use the arrow keys to move, Space again to drop, Escape to cancel',\n sortableGrabbed: (item, position, total) => `Picked up ${item}, position ${position} of ${total}`,\n sortableMoved: (item, position, total) => `${item} moved to position ${position} of ${total}`,\n sortableDropped: (item, position, total) => `Dropped ${item}, position ${position} of ${total}`,\n sortableCancelled: (item, position) => `Cancelled, ${item} returned to position ${position}`,\n sortableGroupInstructions:\n 'Press space to pick up, use the up and down arrow keys to move within a group and the left and right arrow keys to change group, press space again to drop, Escape to cancel',\n sortableGroupGrabbed: (item, group, position) =>\n `Picked up ${item}, position ${position} in ${group}`,\n sortableOver: (item, group, position, reason) =>\n reason\n ? `${group}: cannot drop, ${reason}`\n : `${item} over ${group}, position ${position}, press space to drop`,\n sortableGroupDropped: (item, group, position) =>\n `Dropped ${item} in ${group}, position ${position}`,\n sortableGroupCancelled: (item, group, position) =>\n `Cancelled, ${item} returned to ${group}, position ${position}`,\n sortableRejected: (item, reason) => `Cannot move: ${reason}. ${item} returned`,\n tourPrevious: 'Back',\n tourNext: 'Next',\n tourFinish: 'Done',\n tourSkip: 'Skip',\n tourProgress: (current, total) => `${current} of ${total}`,\n selectEmpty: 'No options',\n selectPlaceholder: 'Select…',\n selectSearch: 'Search',\n selectNoMatch: 'No matching options',\n selectCreate: (text) => `Create “${text}”`,\n selectSummary: (labels) => labels.join(', '),\n selectMoreTags: (count) => `+${count}`,\n paginationTotal: (total) => `${total.toLocaleString('en-US')} items`,\n paginationRange: (from, to, total) =>\n `${from.toLocaleString('en-US')}–${to.toLocaleString('en-US')} of ${total.toLocaleString('en-US')} items`,\n pagination: 'Pagination',\n pageSizeOption: (size) => `${size} / page`,\n pageSizeLabel: 'Items per page',\n pageJumpBefore: 'Go to',\n pageJumpAfter: '',\n pageJumpLabel: 'Go to page',\n contextMenuLabel: 'More actions',\n previousPage: 'Previous page',\n nextPage: 'Next page',\n pageLabel: (page) => `Page ${page}`,\n treeEmpty: 'No data',\n tabClose: (label) => `Close ${label}`,\n tabAdd: 'New tab',\n navBarMore: 'More',\n tabList: 'All tabs',\n tabScrollPrevious: 'Scroll back',\n tabScrollNext: 'Scroll forward',\n tabMoved: (label, position, total) => `Moved ${label} to position ${position} of ${total}`,\n treeNoMatch: 'No matching items',\n treeMoved: (item, parent, position) =>\n parent\n ? `Moved ${item} into ${parent} at position ${position}`\n : `Moved ${item} to the top level at position ${position}`,\n transferSource: 'Available',\n transferTarget: 'Selected',\n transferMoveTo: (title) => `Move to ${title}`,\n transferSelectAll: (title) => `Select all in ${title}`,\n transferCount: (checked, total) => `${checked} / ${total}`,\n transferMoved: (count, title) => `Moved ${count} ${count === 1 ? 'item' : 'items'} to ${title}`,\n conditionModes: { all: 'All of', any: 'Any of', none: 'None of', notAll: 'Not all of' },\n conditionMode: 'Match',\n conditionAnd: 'and',\n conditionOr: 'or',\n conditionOperators: {\n eq: 'equals',\n ne: 'does not equal',\n gt: 'greater than',\n gte: 'at least',\n lt: 'less than',\n lte: 'at most',\n between: 'between',\n in: 'is any of',\n notIn: 'is none of',\n contains: 'contains',\n notContains: 'does not contain',\n startsWith: 'starts with',\n exists: 'is not empty',\n empty: 'is empty',\n },\n conditionTypeOperators: {\n date: {\n eq: 'is',\n gt: 'is after',\n gte: 'is on or after',\n lt: 'is before',\n lte: 'is on or before',\n },\n select: { eq: 'is', ne: 'is not' },\n boolean: { eq: 'is' },\n },\n conditionTrue: 'Yes',\n conditionFalse: 'No',\n conditionTo: 'to',\n conditionRange: (low, high) =>\n low && high ? `${low} to ${high}` : low ? `${low} or more` : `${high} or less`,\n conditionValueSeparator: ', ',\n conditionAndJoiner: ', and ',\n conditionOrJoiner: ', or ',\n conditionNotPrefix: 'not: ',\n conditionField: 'Field',\n conditionOperator: 'Operator',\n conditionValue: (field) => `Value of ${field}`,\n conditionAddRule: 'Add condition',\n conditionAddGroup: 'Add group',\n conditionRemoveRule: 'Remove condition',\n conditionRemoveGroup: 'Remove group',\n conditionEmpty: 'No conditions yet',\n conditionGroup: 'Condition group',\n conditionRule: (index) => `Condition ${index}`,\n peopleTypes: { user: 'Person', department: 'Department', position: 'Position' },\n peopleSearch: 'Search people, departments, positions',\n peoplePages: 'Browse by',\n peopleOrg: 'Organization',\n peoplePositions: 'Positions',\n peopleRecent: 'Recent',\n peopleRoot: 'All',\n peopleChildren: 'Open',\n peopleOpen: (name) => `Open ${name}`,\n peopleCount: (count, max) => (max ? `${count} / ${max} selected` : `${count} selected`),\n peopleSelected: 'Selected',\n peopleRemove: (name) => `Remove ${name}`,\n peopleSelectAll: 'Select all',\n peopleEmpty: 'Nothing to choose here',\n peopleNoResult: 'No matches',\n peopleNothingSelected: 'Nothing selected yet',\n peoplePlaceholder: 'Choose people',\n breadcrumbs: 'Breadcrumb',\n breadcrumbsExpand: 'Show hidden levels',\n stepState: (state) =>\n ` (${{ complete: 'completed', upcoming: 'not started', error: 'error' }[state]})`,\n calendarPreviousMonth: 'Previous month',\n calendarNextMonth: 'Next month',\n calendarPreviousYear: 'Previous year',\n calendarNextYear: 'Next year',\n calendarYear: (year) => String(year),\n calendarQuarter: (quarter) => `Q${quarter}`,\n calendarBoardCount: (count) => `${count} ${count === 1 ? 'event' : 'events'}`,\n calendarBoardMore: (count) => `${count} more`,\n calendarPreviousDecade: 'Previous decade',\n calendarNextDecade: 'Next decade',\n calendarChooseMonth: (current) => `Choose month: ${current}`,\n calendarChooseYear: (current) => `Choose year: ${current}`,\n calendarWeek: 'Wk',\n calendarWeekNumber: (week) => `Week ${week}`,\n calendarToday: (date) => `Today, ${date}`,\n calendarPickEnd: 'Select an end date',\n datePickerOpen: 'Choose date',\n timePickerOpen: 'Choose time',\n dateRangeStart: 'Start date',\n dateRangeEnd: 'End date',\n dateRangePresets: 'Presets',\n datePickerPresets: 'Presets',\n datePickerThisQuarter: 'This quarter',\n dateRangePreset: {\n today: 'Today',\n yesterday: 'Yesterday',\n last7Days: 'Last 7 days',\n last30Days: 'Last 30 days',\n thisWeek: 'This week',\n thisMonth: 'This month',\n lastMonth: 'Last month',\n thisYear: 'This year',\n },\n timePickerNow: 'Now',\n dateFieldEmpty: 'Empty',\n dateFieldPlaceholders: {\n year: 'yyyy',\n month: 'mm',\n day: 'dd',\n quarter: 'q',\n week: 'ww',\n hour: '––',\n minute: '––',\n second: '––',\n dayPeriod: 'AM',\n },\n dateFieldPeriodPatterns: { quarter: 'Q{quarter} {year}', week: 'Week {week}, {year}' },\n\n modelViewerLoading: 'Loading model',\n modelViewerError: 'Couldn’t load the model',\n\n codeExpand: 'Show all',\n codeCollapse: 'Show less',\n headingAnchor: 'Link to this section',\n skipToContent: 'Skip to content',\n tableOfContents: 'On this page',\n drawerResize: 'Resize drawer',\n searchLabel: 'Search',\n searchPlaceholder: 'Search docs',\n searchEmpty: 'No results',\n themeLight: 'Light',\n themeSystem: 'System',\n themeDark: 'Dark',\n themePaper: 'Paper',\n themeMidnight: 'Midnight',\n themeHighContrast: 'High contrast',\n themeOcean: 'Ocean',\n themeForest: 'Forest',\n themeLemon: 'Lemon',\n themeSakura: 'Sakura',\n themeFestive: 'Festive',\n themeCyberpunk: 'Cyberpunk',\n themeCoffee: 'Coffee',\n colorPick: 'Pick a color',\n pagerLabel: 'Pagination',\n pagerPrevious: 'Previous',\n pagerNext: 'Next',\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"en-US.js","names":[],"sources":["../../../src/config/lang/en-US.ts"],"sourcesContent":["import zodMessages from 'zod/v4/locales/en.js';\nimport type { Lang } from './lang';\n\n/** English (United States) */\nexport const enUS: Lang = {\n code: 'en-US',\n direction: 'ltr',\n calendar: 'gregory',\n currency: 'USD',\n\n confirm: 'OK',\n cancel: 'Cancel',\n close: 'Close',\n imagePreview: (alt) => `View larger: ${alt}`,\n imageError: 'Image failed to load',\n requestFailed: 'Request failed. Try again later.',\n errorCodes: {\n 'http.network': 'Network connection failed. Check your network and try again.',\n 'http.timeout': ({ seconds }) =>\n typeof seconds === 'number'\n ? `The request timed out after ${seconds} s. Try again later.`\n : 'The request timed out. Try again later.',\n 'http.aborted': 'The request was canceled.',\n 'http.status': ({ status }) =>\n typeof status === 'number'\n ? `The service is unavailable (${status}). Try again later.`\n : 'The service is unavailable. Try again later.',\n 'http.parse': 'The service returned a response that could not be read. Try again later.',\n 'query.request-invalid': 'The query is not valid. Check it and try again.',\n 'query.empty-result': 'The record does not exist or was deleted.',\n 'query.too-many-rows': 'More than one record matched, so none was chosen.',\n 'query.unexpected-row-count':\n 'Someone else changed or deleted this record. Refresh and try again.',\n 'query.statement-timeout': 'The query timed out. Narrow it down and try again.',\n 'query.execution-failed': 'The data operation failed. Try again later.',\n 'query.invalid-row': 'The record is incomplete and cannot be saved.',\n 'query.batch-write-failed': 'Some records could not be saved, so none were.',\n 'query.transaction-closed': 'Saving was interrupted. Try again.',\n 'query.quota-exceeded': 'Browser storage is full. Free up space and try again.',\n },\n lightboxLabel: 'Image viewer',\n lightboxZoomIn: 'Zoom in',\n lightboxZoomOut: 'Zoom out',\n lightboxRotateLeft: 'Rotate left',\n lightboxRotateRight: 'Rotate right',\n lightboxReset: 'Reset',\n lightboxDownload: 'Download',\n lightboxPrevious: 'Previous image',\n lightboxNext: 'Next image',\n lightboxCounter: (index, total) => `${index} of ${total}`,\n descriptionsCopy: (label) => `Copy ${label}`,\n fieldCompareHeaders: ['Field', 'Before', 'After', 'Change'],\n fieldCompareTo: 'changed to',\n fieldCompareNone: 'No changes',\n timelineShowMore: (count) => `Show ${count} more`,\n timelineShowLess: 'Show less',\n timelineDetails: 'Details',\n mentionsList: 'People to mention',\n mentionsEmpty: 'No matching people',\n checklistStatus: {\n done: 'done',\n todo: 'to do',\n overdue: 'overdue',\n blocked: 'blocked',\n skipped: 'not applicable',\n },\n checklistItemState: (label, state) => `${label}: ${state}`,\n checklistIconsLabel: (parts) => parts.join('; '),\n checklistSummary: (done, total) => `${done} of ${total} done`,\n chartExport: 'Export',\n chartExportImage: 'Export image (PNG)',\n chartExportData: 'Export data (CSV)',\n chartExportName: 'chart',\n chartZoom: 'Visible range',\n chartZoomReset: 'Show all',\n chartZoomIn: 'Zoom in',\n chartZoomOut: 'Zoom out',\n chartZoomFit: 'Fit to view',\n chartZoomWheelHint: 'Hold Ctrl and scroll to zoom the map',\n chartSeries: 'Series',\n chartStart: 'Start',\n chartEnd: 'End',\n chartDuration: 'Duration',\n chartToday: 'Today',\n chartDays: (days) => (days === 1 ? '1 day' : `${days} days`),\n sparklineSummary: (count, first, last, min, max) =>\n `${count} values, from ${first} to ${last}, low ${min}, high ${max}`,\n clear: 'Clear',\n loading: 'Loading',\n remove: 'Remove',\n copy: 'Copy',\n copied: 'Copied',\n emptyValue: '—',\n formRequired: 'Required',\n formErrorSummary: (count) => (count === 1 ? 'There is 1 problem' : `There are ${count} problems`),\n formErrorItem: (label, message) => `${label}: ${message}`,\n formIssues: zodMessages().localeError,\n leaveTitle: 'Leave this page?',\n leaveDescription: 'You have unsaved changes that will be lost.',\n leaveConfirm: 'Leave',\n\n toasterLabel: 'Notifications',\n\n linkNewWindow: ' (opens in a new window)',\n passwordShow: 'Show password',\n characterCount: (count, max) =>\n max == null ? `${count} characters` : `${count} of ${max} characters`,\n sliderMin: 'Minimum',\n sliderMax: 'Maximum',\n indicatorCount: (count) => `${count} new`,\n indicatorDot: 'New',\n avatarMore: (count) => `${count} more`,\n numberDecrement: 'Decrease',\n numberIncrement: 'Increase',\n comboboxToggle: 'Show options',\n tableSelectAll: 'Select all',\n tableSelectColumn: 'Select',\n tableSelectRow: (row) => `Select row ${row}`,\n tableResizeColumn: (column) => `Resize column “${column}”`,\n tableEmpty: 'No data',\n tableSummary: 'Total',\n tableSelectedCount: (count) => `${count} selected`,\n listResultCount: (count) => (count === 1 ? '1 option' : `${count} options`),\n listLoadFailed: 'Failed to load. Try again.',\n tableClearSelection: 'Clear selection',\n tableDetails: 'Details',\n tableRowDetails: (row) => `Details of ${row}`,\n tableFilterColumn: (column, active) => `Filter “${column}”${active ? ' (filtered)' : ''}`,\n tableFilterSearch: 'Search',\n tableFilterClear: 'Clear filter',\n tableColumnMenu: (column) => `Actions for column “${column}”`,\n tableSortAscending: 'Sort ascending',\n tableSortDescending: 'Sort descending',\n tableSortClear: 'Clear sort',\n tableSortPriority: (priority, direction) => `sort ${priority}, ${direction}`,\n tablePinStart: 'Pin to start',\n tablePinEnd: 'Pin to end',\n tableUnpin: 'Unpin',\n tableMoveBackward: 'Move earlier',\n tableMoveForward: 'Move later',\n tableHideColumn: 'Hide column',\n tableColumnSettings: 'Columns',\n tableColumnSettingsReset: 'Reset',\n chartEmpty: 'No data',\n chartCategory: 'Category',\n chartValue: 'Value',\n chartShare: 'Share',\n chartTotal: 'Total',\n chartFlow: 'Flow',\n chartFlowLabel: (source, target) => `${source} → ${target}`,\n chartIncrease: 'Increase',\n chartDecrease: 'Decrease',\n chartChange: 'Change',\n chartCumulative: 'Cumulative',\n chartStepRate: 'Step conversion',\n chartOverallRate: 'Overall conversion',\n chartStage: 'Stage',\n chartLink: 'Link',\n chartDegree: (count) => `${count} ${count === 1 ? 'link' : 'links'}`,\n treeToggle: (row) => `Children of ${row}`,\n splitterResize: 'Resize panes',\n splitterCollapse: 'Collapse',\n splitterExpand: 'Expand',\n fileDrop: 'Click or drop files here',\n fileTooLarge: (max) => `File must be at most ${max}`,\n fileTypeRejected: 'This file type is not supported',\n uploadFailed: 'Upload failed',\n uploadDone: 'Uploaded',\n uploadRetry: (file) => `Retry uploading ${file}`,\n uploadRemove: (file) => `Remove ${file}`,\n uploadAddImage: 'Add image',\n uploadPasteHint: 'You can also paste images',\n progressTarget: (value) => `target ${value}`,\n backToTop: 'Back to top',\n ellipsisExpand: 'More',\n ellipsisCollapse: 'Less',\n ratingStar: (value) => (value === 1 ? '1 star' : `${value} stars`),\n ratingSummary: (value, count) => (value == null ? 'Not rated' : `${value} out of ${count} stars`),\n resultStatus: {\n 403: {\n title: 'Access denied',\n description: 'You need more permissions to see this page. Ask an administrator for access.',\n },\n 404: {\n title: 'Page not found',\n description: 'The address may be wrong, or the page has moved.',\n },\n 500: {\n title: 'Something went wrong',\n description:\n 'The server could not handle the request. Try again later, and contact an administrator if it keeps happening.',\n },\n },\n sortableHandle: (item) => `Move ${item}`,\n sortableInstructions:\n 'Press Space to pick up, use the arrow keys to move, Space again to drop, Escape to cancel',\n sortableGrabbed: (item, position, total) => `Picked up ${item}, position ${position} of ${total}`,\n sortableMoved: (item, position, total) => `${item} moved to position ${position} of ${total}`,\n sortableDropped: (item, position, total) => `Dropped ${item}, position ${position} of ${total}`,\n sortableCancelled: (item, position) => `Cancelled, ${item} returned to position ${position}`,\n sortableGroupInstructions:\n 'Press space to pick up, use the up and down arrow keys to move within a group and the left and right arrow keys to change group, press space again to drop, Escape to cancel',\n sortableGroupGrabbed: (item, group, position) =>\n `Picked up ${item}, position ${position} in ${group}`,\n sortableOver: (item, group, position, reason) =>\n reason\n ? `${group}: cannot drop, ${reason}`\n : `${item} over ${group}, position ${position}, press space to drop`,\n sortableGroupDropped: (item, group, position) =>\n `Dropped ${item} in ${group}, position ${position}`,\n sortableGroupCancelled: (item, group, position) =>\n `Cancelled, ${item} returned to ${group}, position ${position}`,\n sortableRejected: (item, reason) => `Cannot move: ${reason}. ${item} returned`,\n tourPrevious: 'Back',\n tourNext: 'Next',\n tourFinish: 'Done',\n tourSkip: 'Skip',\n tourProgress: (current, total) => `${current} of ${total}`,\n selectEmpty: 'No options',\n selectPlaceholder: 'Select…',\n selectSearch: 'Search',\n selectNoMatch: 'No matching options',\n selectCreate: (text) => `Create “${text}”`,\n selectSummary: (labels) => labels.join(', '),\n selectMoreTags: (count) => `+${count}`,\n paginationTotal: (total) => `${total.toLocaleString('en-US')} items`,\n paginationRange: (from, to, total) =>\n `${from.toLocaleString('en-US')}–${to.toLocaleString('en-US')} of ${total.toLocaleString('en-US')} items`,\n pagination: 'Pagination',\n pageSizeOption: (size) => `${size} / page`,\n pageSizeLabel: 'Items per page',\n pageJumpBefore: 'Go to',\n pageJumpAfter: '',\n pageJumpLabel: 'Go to page',\n contextMenuLabel: 'More actions',\n previousPage: 'Previous page',\n nextPage: 'Next page',\n pageLabel: (page) => `Page ${page}`,\n treeEmpty: 'No data',\n tabClose: (label) => `Close ${label}`,\n tabAdd: 'New tab',\n navBarMore: 'More',\n tabList: 'All tabs',\n tabScrollPrevious: 'Scroll back',\n tabScrollNext: 'Scroll forward',\n tabMoved: (label, position, total) => `Moved ${label} to position ${position} of ${total}`,\n treeNoMatch: 'No matching items',\n treeMoved: (item, parent, position) =>\n parent\n ? `Moved ${item} into ${parent} at position ${position}`\n : `Moved ${item} to the top level at position ${position}`,\n transferSource: 'Available',\n transferTarget: 'Selected',\n transferMoveTo: (title) => `Move to ${title}`,\n transferSelectAll: (title) => `Select all in ${title}`,\n transferCount: (checked, total) => `${checked} / ${total}`,\n transferMoved: (count, title) => `Moved ${count} ${count === 1 ? 'item' : 'items'} to ${title}`,\n conditionModes: { all: 'All of', any: 'Any of', none: 'None of', notAll: 'Not all of' },\n conditionMode: 'Match',\n conditionAnd: 'and',\n conditionOr: 'or',\n conditionOperators: {\n eq: 'equals',\n ne: 'does not equal',\n gt: 'greater than',\n gte: 'at least',\n lt: 'less than',\n lte: 'at most',\n between: 'between',\n in: 'is any of',\n notIn: 'is none of',\n contains: 'contains',\n notContains: 'does not contain',\n startsWith: 'starts with',\n exists: 'is not empty',\n empty: 'is empty',\n },\n conditionTypeOperators: {\n date: {\n eq: 'is',\n gt: 'is after',\n gte: 'is on or after',\n lt: 'is before',\n lte: 'is on or before',\n },\n select: { eq: 'is', ne: 'is not' },\n boolean: { eq: 'is' },\n },\n conditionTrue: 'Yes',\n conditionFalse: 'No',\n conditionTo: 'to',\n conditionRange: (low, high) =>\n low && high ? `${low} to ${high}` : low ? `${low} or more` : `${high} or less`,\n conditionValueSeparator: ', ',\n conditionAndJoiner: ', and ',\n conditionOrJoiner: ', or ',\n conditionNotPrefix: 'not: ',\n conditionField: 'Field',\n conditionOperator: 'Operator',\n conditionValue: (field) => `Value of ${field}`,\n conditionAddRule: 'Add condition',\n conditionAddGroup: 'Add group',\n conditionRemoveRule: 'Remove condition',\n conditionRemoveGroup: 'Remove group',\n conditionEmpty: 'No conditions yet',\n conditionGroup: 'Condition group',\n conditionRule: (index) => `Condition ${index}`,\n peopleTypes: { user: 'Person', department: 'Department', role: 'Role' },\n peopleSearch: 'Search people, departments, roles',\n peoplePages: 'Browse by',\n peopleOrg: 'Organization',\n peopleRoles: 'Roles',\n peopleRecent: 'Recent',\n peopleRoot: 'All',\n peopleChildren: 'Open',\n peopleOpen: (name) => `Open ${name}`,\n peopleCount: (count, max) => (max ? `${count} / ${max} selected` : `${count} selected`),\n peopleSelected: 'Selected',\n peopleRemove: (name) => `Remove ${name}`,\n peopleSelectAll: 'Select all',\n peopleEmpty: 'Nothing to choose here',\n peopleNoResult: 'No matches',\n peopleNothingSelected: 'Nothing selected yet',\n peoplePlaceholder: 'Choose people',\n breadcrumbs: 'Breadcrumb',\n breadcrumbsExpand: 'Show hidden levels',\n stepState: (state) =>\n ` (${{ complete: 'completed', upcoming: 'not started', error: 'error' }[state]})`,\n calendarPreviousMonth: 'Previous month',\n calendarNextMonth: 'Next month',\n calendarPreviousYear: 'Previous year',\n calendarNextYear: 'Next year',\n calendarYear: (year) => String(year),\n calendarQuarter: (quarter) => `Q${quarter}`,\n calendarBoardCount: (count) => `${count} ${count === 1 ? 'event' : 'events'}`,\n calendarBoardMore: (count) => `${count} more`,\n calendarPreviousDecade: 'Previous decade',\n calendarNextDecade: 'Next decade',\n calendarChooseMonth: (current) => `Choose month: ${current}`,\n calendarChooseYear: (current) => `Choose year: ${current}`,\n calendarWeek: 'Wk',\n calendarWeekNumber: (week) => `Week ${week}`,\n calendarToday: (date) => `Today, ${date}`,\n calendarPickEnd: 'Select an end date',\n datePickerOpen: 'Choose date',\n timePickerOpen: 'Choose time',\n dateRangeStart: 'Start date',\n dateRangeEnd: 'End date',\n dateRangePresets: 'Presets',\n datePickerPresets: 'Presets',\n datePickerThisQuarter: 'This quarter',\n dateRangePreset: {\n today: 'Today',\n yesterday: 'Yesterday',\n last7Days: 'Last 7 days',\n last30Days: 'Last 30 days',\n thisWeek: 'This week',\n thisMonth: 'This month',\n lastMonth: 'Last month',\n thisYear: 'This year',\n },\n timePickerNow: 'Now',\n dateFieldEmpty: 'Empty',\n dateFieldPlaceholders: {\n year: 'yyyy',\n month: 'mm',\n day: 'dd',\n quarter: 'q',\n week: 'ww',\n hour: '––',\n minute: '––',\n second: '––',\n dayPeriod: 'AM',\n },\n dateFieldPeriodPatterns: { quarter: 'Q{quarter} {year}', week: 'Week {week}, {year}' },\n\n modelViewerLoading: 'Loading model',\n modelViewerError: 'Couldn’t load the model',\n\n codeExpand: 'Show all',\n codeCollapse: 'Show less',\n headingAnchor: 'Link to this section',\n skipToContent: 'Skip to content',\n tableOfContents: 'On this page',\n drawerResize: 'Resize drawer',\n searchLabel: 'Search',\n searchPlaceholder: 'Search docs',\n searchEmpty: 'No results',\n themeLight: 'Light',\n themeSystem: 'System',\n themeDark: 'Dark',\n themePaper: 'Paper',\n themeMidnight: 'Midnight',\n themeHighContrast: 'High contrast',\n themeOcean: 'Ocean',\n themeForest: 'Forest',\n themeLemon: 'Lemon',\n themeSakura: 'Sakura',\n themeFestive: 'Festive',\n themeCyberpunk: 'Cyberpunk',\n themeCoffee: 'Coffee',\n colorPick: 'Pick a color',\n pagerLabel: 'Pagination',\n pagerPrevious: 'Previous',\n pagerNext: 'Next',\n};\n"],"mappings":"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"}
@@ -33,7 +33,8 @@ export declare function useFormat(): {
33
33
  fileSize: (bytes: number) => string;
34
34
  /**
35
35
  * 日期时间,带上语言的时区、日历与小时制;DateValue 按语言时区换算。
36
- * 也接受日期组件的 ISO 值:'2026-10-20'、'2026-10-20T14:30'、'14:30'(只有时间时配 timeStyle),格式不对时原样返回
36
+ * 也接受日期组件的 ISO 值:'2026-10-20'、'2026-10-20T14:30'、'14:30'(只有时间时配 timeStyle),
37
+ * 以及后端给的时刻(带 Z 或时差:'2026-10-20T06:30:00.19Z',按语言的时区显示);格式不对时原样返回
37
38
  */
38
39
  date: (value: Date | DateValue | string, options?: Intl.DateTimeFormatOptions) => string;
39
40
  /**
@@ -37,7 +37,8 @@ function useFormat() {
37
37
  },
38
38
  /**
39
39
  * 日期时间,带上语言的时区、日历与小时制;DateValue 按语言时区换算。
40
- * 也接受日期组件的 ISO 值:'2026-10-20'、'2026-10-20T14:30'、'14:30'(只有时间时配 timeStyle),格式不对时原样返回
40
+ * 也接受日期组件的 ISO 值:'2026-10-20'、'2026-10-20T14:30'、'14:30'(只有时间时配 timeStyle),
41
+ * 以及后端给的时刻(带 Z 或时差:'2026-10-20T06:30:00.19Z',按语言的时区显示);格式不对时原样返回
41
42
  */
42
43
  date: (value, options = { dateStyle: "medium" }) => {
43
44
  const parsed = typeof value === "string" ? parseIsoValue(value) : value;
@@ -101,8 +102,14 @@ function toIntl(value) {
101
102
  if (typeof value === "object") return value.toString();
102
103
  return typeof value === "string" ? value : value;
103
104
  }
104
- /** 日期组件的 ISO 值 → DateValue:日期、日期时间,或只有时间(放在任意一天上) */
105
+ /** 带 Z 或时差的 ISO 时刻(后端给的 timestamptz) */
106
+ var ABSOLUTE = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}(?::\d{2}(?:\.\d+)?)?(?:Z|[+-]\d{2}:?\d{2})$/;
107
+ /** 日期组件的 ISO 值 → DateValue:日期、日期时间,或只有时间(放在任意一天上);带时差的时刻 → Date */
105
108
  function parseIsoValue(value) {
109
+ if (ABSOLUTE.test(value)) {
110
+ const instant = new Date(value);
111
+ return Number.isNaN(instant.getTime()) ? null : instant;
112
+ }
106
113
  const time = parseIsoTime(value);
107
114
  if (time) return new CalendarDateTime(2e3, 1, 1, time.hour, time.minute, time.second);
108
115
  return parseIsoDateTime(value) ?? parseIsoDate(value);