@oomol-lab/open-flow 0.1.0-beta.81 → 0.1.0-beta.83
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +35 -0
- package/dist/browser/{FlowCanvas-CrsiDHK8.js → FlowCanvas-ChbukrDh.js} +879 -535
- package/dist/browser/{createResourceDialog-CS3u9ga9.js → createResourceDialog-Bi4fUnbD.js} +5 -4
- package/dist/browser/{dialog-CFlvkliO.js → dialog-BzoSxhXQ.js} +1 -1
- package/dist/browser/{exportPng-BOPfjeEi.js → exportPng-CrAFfOaD.js} +187 -70
- package/dist/browser/{flowChanges-CFj5pL4Y.js → flowChanges-C567g-Pc.js} +2675 -93
- package/dist/browser/{flowWorkspace-BeQaeJ3e.js → flowWorkspace-rvcneG4q.js} +980 -2621
- package/dist/browser/licenses.md +2 -2
- package/dist/browser/{markdownContent-frwDfQQU.js → markdownContent-B-GLj5DU.js} +18 -40
- package/dist/browser/{markdownContent-CAG_CQfH.js → markdownContent-D8G_oNOe.js} +18 -41
- package/dist/browser/preview.css +125 -80
- package/dist/browser/preview.js +1093 -379
- package/dist/browser/{tooltip-BDcVTNpu.js → tooltip-DGj5pudg.js} +1 -1
- package/dist/browser/ui.css +45 -0
- package/dist/browser/{dist-CHwj9BhV.js → videoLink-NAWDmBtf.js} +35 -1
- package/dist/browser/workbench-contract.d.ts +6 -0
- package/dist/browser/workbench.css +296 -251
- package/dist/browser/workbench.d.ts +2 -0
- package/dist/browser/workbench.js +294 -141
- package/dist/browser/{workbenchSelect-Ci0KCYv9.js → workbenchSelect-BIaEVTx6.js} +2 -2
- package/dist/browser/{ContentIcon-CMn0c-kl.js → wrapLayout-C4moMKgb.js} +4400 -4148
- package/dist/command/index.js +43 -41
- package/dist/common/authoring.d.ts +1 -1
- package/dist/common/control-api-conformance.js +306 -2
- package/dist/common/control-api.d.ts +20 -0
- package/dist/common/control-api.js +306 -4
- package/dist/common/control-requests.d.ts +3 -5
- package/dist/common/control-requests.js +5 -7
- package/dist/common/flow-encoding.d.ts +1 -0
- package/dist/common/flow-encoding.js +167 -1
- package/dist/common/flow-semantics.js +20 -0
- package/dist/common/flow-workflowBundle.d.ts +27 -0
- package/dist/common/flow-workflowFile.d.ts +2 -0
- package/dist/common/flow-workflowReferences.d.ts +4 -0
- package/dist/common/mcp.d.ts +2 -0
- package/dist/common/mcp.js +312 -4
- package/dist/render/browser/licenses.md +4047 -0
- package/dist/render/browser/runtime.css +14914 -0
- package/dist/render/browser/runtime.js +267526 -0
- package/dist/render/common/png.d.ts +32 -0
- package/dist/render/node/index.d.ts +11 -0
- package/dist/render/node/index.js +9508 -0
- package/dist/render/node/licenses.md +75 -0
- package/package.json +12 -2
- package/src/control/common/api.ts +50 -0
- package/src/control/common/flowDecoders.ts +2 -0
- package/src/control/common/mcp.ts +4 -4
- package/src/control/common/requests.ts +12 -1
- package/src/flow/common/encoding.ts +1 -0
- package/src/flow/common/workflowBundle.ts +117 -0
- package/src/flow/common/workflowFile.ts +4 -0
- package/src/flow/common/workflowReferences.ts +20 -0
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { o as __toESM, t as __commonJSMin } from "./rolldown-runtime-CEgmsyvS.js";
|
|
2
|
-
import {
|
|
1
|
+
import { i as __require, o as __toESM, t as __commonJSMin } from "./rolldown-runtime-CEgmsyvS.js";
|
|
2
|
+
import { A as DropdownMenuItem, E as DropdownMenu, O as DropdownMenuContent, P as DropdownMenuSeparator, Q as uiLocales, R as DropdownMenuTrigger, S as spriteIcon, T as useIconifyData, V as useCompositeItem, _ as Z, a as CompositeRoot, at as ja_default$3, b as imageIcon, c as PopoverContent, ct as I18n, et as waitBranchLocales, f as PopoverTitle, h as ScrollArea, i as Textarea, it as ko_default$3, lt as providerIconAppearance, n as wrapLayout, nt as zh_CN_default$3, o as ACTIVE_COMPOSITE_ITEM, ot as fr_default$3, p as PopoverTrigger, r as canvasDirection, rt as ru_default$3, s as Popover, st as en_default$3, tt as zh_TW_default$3, ut as Checkbox, v as ContentIcon, w as useIconifyCollectionLoader, x as placeholderIcon } from "./wrapLayout-C4moMKgb.js";
|
|
3
3
|
import { a as derive, i as compute, l as val, t as arrayShallowEqual } from "./dist-bO8nvHFH.js";
|
|
4
|
-
import { a as toPlainObject, l as useTranslate, o as I18nProvider, u as useVal } from "./dist-BFmpkX4P.js";
|
|
5
|
-
import { $n as inputClear, A as string$1, Bn as transitionStatusMapping, Br as
|
|
6
|
-
import { $t as defaultItemEquality, B as authoringDefinitionSchemas, D as nodeSystemOutputPorts, Dt as matchesSchema, Et as comparePorts, Ft as flowStateViewSchema, G as workflowAgentToolSchema, Gt as SelectTrigger, H as connectorCapabilitySchema, Ht as SelectGroup, I as otherwiseOutput, It as skipDuplicatesConfigSchema, J as webhookResponseAllowsBody, Jt as hasNullItemLabel, K as webhookHeaderValuePort, Kt as SelectValue, Lt as skipDuplicatesTask, Mt as format, N as nodeInputMappings, Nt as flowStateSummarySchema, Ot as portsAssignable, Pt as flowStateValuesSchema, Q as workflowOutputsPort, Qt as compareItemEquality, Rt as dequal$1, S as resourceNameIssue, Tt as webhookSupportsBody, U as decodeRevisionContent, Ut as SelectItem, V as connectorAgentToolSchema, Vt as SelectContent, W as httpCapabilitySchema, Xt as stringifyAsLabel, Y as webhookResponseInputs, Yt as isGroupedItems, Z as webhookStatusCodePort, Zt as stringifyAsValue, _ as applyFlowChanges$1, a as DialogFooter, ct as httpRequestInputs, d as Field, dt as withHttpParameterFields, en as findItemIndex, ft as withHttpParameterSource, gt as renamedPort, h as FieldLabel, ht as renameOutputMapping, i as DialogDescription, in as Input, it as checkJsonDepth, j as conditionInputPorts, jt as isSchemaKeyword, k as clearConditionBindings, kt as schemaObject, mt as remapInputMappings, n as DialogClose, nn as selectedValueIncludes, nt as retryConfigurationSchema, o as DialogHeader, p as FieldError, pt as httpHeaderNameIssue, q as webhookHeadersPort, qt as resolveAriaLabelledBy, r as DialogContent, rn as Label, s as DialogTitle, st as httpRequestConfigSchema, t as Dialog, tn as removeItem, ut as httpRequestTask, v as isTriggerNode, x as normalizeNodeName, xt as decisionTask, y as nextNodeName, z as agentToolFields, zt as Select } from "./dialog-
|
|
4
|
+
import { a as toPlainObject, l as useTranslate, o as I18nProvider, s as useI18n, u as useVal } from "./dist-BFmpkX4P.js";
|
|
5
|
+
import { $n as inputClear, A as string$1, Bn as transitionStatusMapping, Br as useStableCallback, C as literal, Cr as cn, Dn as getTarget, Dr as EMPTY_ARRAY, E as object$2, En as contains, Er as useRenderElement, Et as useFloatingRootContext, F as IndexGuessBehavior, Fr as formatErrorMessage, Ft as useDismiss, Gn as createGenericEventDetails, I as useCompositeListItem, In as useTransitionStatus, Ir as mergeProps, It as useClick, Jn as closePress, Kt as DROPDOWN_COLLISION_AVOIDANCE, Ln as useOpenChangeComplete, Lr as useIsoLayoutEffect, Lt as FloatingFocusManager, M as unknown, Mn as ownerDocument, Mr as useButton, Nn as useLabelableId, O as record$3, On as isAndroid, Or as EMPTY_OBJECT, Qn as inputChange, Qt as useStore, S as lazy$1, Sn as stopEvent, Sr as buttonVariants, T as number, Tn as activeElement, Tr as clsx, Un as useValueChanged, Vr as useRefWithInit, Wn as createChangeEventDetails, Wr as isElement, Wt as FloatingPortal, Yn as escapeKey, Zt as Store, _ as array, _r as fieldValidityMapping, an as useOnFirstRender, at as useAnchorPositioning, b as int, br as useControlled, bt as useListNavigation, ct as CompositeList, dr as useFormContext, er as inputPress, et as useAnchoredPopupScrollLock, fr as useRegisterFieldControl, ft as popupStateMapping, g as _enum, gr as DEFAULT_FIELD_STATE_ATTRIBUTES, ht as useOpenInteractionType, i as TooltipTrigger, in as useValueAsRef, it as InternalBackdrop, j as union, jr as useMergedRefs, k as strictObject, kn as isFirefox, kr as NOOP, lt as inertValue, mr as useBaseUiId, n as TooltipContent, nr as listNavigation, nt as usePositioner, p as timeZoneOffsetMinutes, pr as useFieldRootContext, pt as pressableTriggerOpenStateMapping, rn as createSelector, rr as none, rt as getDisabledMountTransitionStyles, sn as useTimeout, st as useDirection, t as Tooltip, tr as itemPress, ur as useLabelableContext, ut as getPseudoElementBounds, v as boolean, vr as visuallyHidden, vt as useTypeahead, wn as isInteractiveElement, wr as cva, x as json$3, xr as Button, xt as useInteractions, y as discriminatedUnion, yr as visuallyHiddenInput, zn as TransitionStatusDataAttributes } from "./tooltip-DGj5pudg.js";
|
|
6
|
+
import { $t as defaultItemEquality, B as authoringDefinitionSchemas, D as nodeSystemOutputPorts, Dt as matchesSchema, Et as comparePorts, Ft as flowStateViewSchema, G as workflowAgentToolSchema, Gt as SelectTrigger, H as connectorCapabilitySchema, Ht as SelectGroup, I as otherwiseOutput, It as skipDuplicatesConfigSchema, J as webhookResponseAllowsBody, Jt as hasNullItemLabel, K as webhookHeaderValuePort, Kt as SelectValue, Lt as skipDuplicatesTask, Mt as format, N as nodeInputMappings, Nt as flowStateSummarySchema, Ot as portsAssignable, Pt as flowStateValuesSchema, Q as workflowOutputsPort, Qt as compareItemEquality, Rt as dequal$1, S as resourceNameIssue, Tt as webhookSupportsBody, U as decodeRevisionContent, Ut as SelectItem, V as connectorAgentToolSchema, Vt as SelectContent, W as httpCapabilitySchema, Xt as stringifyAsLabel, Y as webhookResponseInputs, Yt as isGroupedItems, Z as webhookStatusCodePort, Zt as stringifyAsValue, _ as applyFlowChanges$1, a as DialogFooter, ct as httpRequestInputs, d as Field, dt as withHttpParameterFields, en as findItemIndex, ft as withHttpParameterSource, gt as renamedPort, h as FieldLabel, ht as renameOutputMapping, i as DialogDescription, in as Input, it as checkJsonDepth, j as conditionInputPorts, jt as isSchemaKeyword, k as clearConditionBindings, kt as schemaObject, mt as remapInputMappings, n as DialogClose, nn as selectedValueIncludes, nt as retryConfigurationSchema, o as DialogHeader, p as FieldError, pt as httpHeaderNameIssue, q as webhookHeadersPort, qt as resolveAriaLabelledBy, r as DialogContent, rn as Label, s as DialogTitle, st as httpRequestConfigSchema, t as Dialog, tn as removeItem, ut as httpRequestTask, v as isTriggerNode, x as normalizeNodeName, xt as decisionTask, y as nextNodeName, z as agentToolFields, zt as Select } from "./dialog-BzoSxhXQ.js";
|
|
7
7
|
import { a as uiLanguages, n as isUiLanguage, r as resolveUiLanguage } from "./languages-gYzoQqCi.js";
|
|
8
8
|
import "./lib-Dws05GHj.js";
|
|
9
9
|
import { i as objectValue, s as valueType, t as initialValue } from "./value-BbFQZZ_V.js";
|
|
@@ -1670,12 +1670,12 @@ function decodeLiveDetails(value) {
|
|
|
1670
1670
|
publication: current,
|
|
1671
1671
|
status,
|
|
1672
1672
|
enabled: source.enabled,
|
|
1673
|
-
entries: decodeEntries(source.entries, current),
|
|
1673
|
+
entries: decodeEntries$1(source.entries, current),
|
|
1674
1674
|
version: 1
|
|
1675
1675
|
};
|
|
1676
1676
|
}
|
|
1677
1677
|
/** Both producers and consumers enforce the same published-entry invariants. */
|
|
1678
|
-
function decodeEntries(values, current) {
|
|
1678
|
+
function decodeEntries$1(values, current) {
|
|
1679
1679
|
const parsed = array(entrySchema).safeParse(values);
|
|
1680
1680
|
if (!parsed.success) return invalidResponse();
|
|
1681
1681
|
const ids = /* @__PURE__ */ new Set();
|
|
@@ -1856,6 +1856,8 @@ var envelope = strictObject({
|
|
|
1856
1856
|
kind: literal("open-flow-workflow"),
|
|
1857
1857
|
version: literal(1),
|
|
1858
1858
|
name: string$1().optional(),
|
|
1859
|
+
icon: string$1().optional(),
|
|
1860
|
+
description: string$1().optional(),
|
|
1859
1861
|
content: unknown(),
|
|
1860
1862
|
presentation: record$3(string$1(), json$3()).optional()
|
|
1861
1863
|
});
|
|
@@ -1868,9 +1870,6 @@ function decodeWorkflowFile(value) {
|
|
|
1868
1870
|
content: decodeRevisionContent(file.content)
|
|
1869
1871
|
};
|
|
1870
1872
|
}
|
|
1871
|
-
function parseWorkflowFile(text) {
|
|
1872
|
-
return decodeWorkflowFile(JSON.parse(text));
|
|
1873
|
-
}
|
|
1874
1873
|
function cleanInput(input) {
|
|
1875
1874
|
if (input.kind != "sources" || !input.sources.some((source) => source.kind == "binding")) return input;
|
|
1876
1875
|
const sources = input.sources.filter((source) => source.kind != "binding");
|
|
@@ -1935,6 +1934,78 @@ function workflowFileName(name) {
|
|
|
1935
1934
|
function workflowNameFromFile(name) {
|
|
1936
1935
|
return name.replace(/(?:\.openflow)?\.json$/i, "");
|
|
1937
1936
|
}
|
|
1937
|
+
//#endregion
|
|
1938
|
+
//#region src/flow/common/workflowBundle.ts
|
|
1939
|
+
var entries$1 = array(strictObject({
|
|
1940
|
+
flowId: string$1().min(1),
|
|
1941
|
+
file: unknown()
|
|
1942
|
+
})).min(1);
|
|
1943
|
+
var bundleSchema = strictObject({
|
|
1944
|
+
kind: literal("open-flow-workflow-bundle"),
|
|
1945
|
+
version: literal(1),
|
|
1946
|
+
entryFlowId: string$1().min(1),
|
|
1947
|
+
workflows: entries$1
|
|
1948
|
+
});
|
|
1949
|
+
var previewSchema = strictObject({
|
|
1950
|
+
version: literal(1),
|
|
1951
|
+
entryFlowId: string$1().min(1),
|
|
1952
|
+
workflows: entries$1,
|
|
1953
|
+
unavailableFlowIds: array(string$1().min(1))
|
|
1954
|
+
});
|
|
1955
|
+
function decodeEntries(value, entryFlowId, unavailableFlowIds = []) {
|
|
1956
|
+
const workflows = value.map(({ flowId, file }) => ({
|
|
1957
|
+
flowId,
|
|
1958
|
+
file: decodeWorkflowFile(file)
|
|
1959
|
+
}));
|
|
1960
|
+
const ids = new Set(workflows.map(({ flowId }) => flowId));
|
|
1961
|
+
if (ids.size != workflows.length || !ids.has(entryFlowId)) throw new TypeError("Workflow identities must be unique and include the entry workflow.");
|
|
1962
|
+
const unavailable = new Set(unavailableFlowIds);
|
|
1963
|
+
if (unavailable.size != unavailableFlowIds.length || unavailableFlowIds.some((id) => ids.has(id))) throw new TypeError("Invalid unavailable workflow identities.");
|
|
1964
|
+
for (const { file } of workflows) for (const node of Object.values(file.content.document.graph.nodes)) for (const { target } of nodeWorkflowReferences(node)) if (target.flowId && !ids.has(target.flowId) && !unavailable.has(target.flowId)) throw new TypeError("A referenced workflow is missing from the bundle.");
|
|
1965
|
+
return workflows;
|
|
1966
|
+
}
|
|
1967
|
+
function decodeWorkflowBundle(value) {
|
|
1968
|
+
checkJsonDepth(value, -4);
|
|
1969
|
+
const bundle = bundleSchema.parse(value);
|
|
1970
|
+
return {
|
|
1971
|
+
...bundle,
|
|
1972
|
+
workflows: decodeEntries(bundle.workflows, bundle.entryFlowId)
|
|
1973
|
+
};
|
|
1974
|
+
}
|
|
1975
|
+
function decodeWorkflowExportPreview(value) {
|
|
1976
|
+
checkJsonDepth(value, -4);
|
|
1977
|
+
const preview = previewSchema.parse(value);
|
|
1978
|
+
return {
|
|
1979
|
+
...preview,
|
|
1980
|
+
workflows: decodeEntries(preview.workflows, preview.entryFlowId, preview.unavailableFlowIds)
|
|
1981
|
+
};
|
|
1982
|
+
}
|
|
1983
|
+
function cleanWorkflowBundle(value) {
|
|
1984
|
+
const bundle = decodeWorkflowBundle(value);
|
|
1985
|
+
return {
|
|
1986
|
+
...bundle,
|
|
1987
|
+
workflows: bundle.workflows.map(({ flowId, file }) => ({
|
|
1988
|
+
flowId,
|
|
1989
|
+
file: cleanWorkflowFile(file).file
|
|
1990
|
+
}))
|
|
1991
|
+
};
|
|
1992
|
+
}
|
|
1993
|
+
function workflowBundleFromPreview(preview) {
|
|
1994
|
+
if (preview.unavailableFlowIds.length) throw new TypeError("Some referenced workflows are unavailable.");
|
|
1995
|
+
return cleanWorkflowBundle({
|
|
1996
|
+
kind: "open-flow-workflow-bundle",
|
|
1997
|
+
version: 1,
|
|
1998
|
+
entryFlowId: preview.entryFlowId,
|
|
1999
|
+
workflows: preview.workflows
|
|
2000
|
+
});
|
|
2001
|
+
}
|
|
2002
|
+
function encodeWorkflowBundle(bundle) {
|
|
2003
|
+
return `${JSON.stringify(cleanWorkflowBundle(bundle), null, 2)}\n`;
|
|
2004
|
+
}
|
|
2005
|
+
function parseWorkflowImportFile(text) {
|
|
2006
|
+
const value = JSON.parse(text);
|
|
2007
|
+
return value != null && typeof value == "object" && "kind" in value && value.kind == "open-flow-workflow-bundle" ? decodeWorkflowBundle(value) : decodeWorkflowFile(value);
|
|
2008
|
+
}
|
|
1938
2009
|
new TextEncoder();
|
|
1939
2010
|
//#endregion
|
|
1940
2011
|
//#region src/control/common/providerAccess.ts
|
|
@@ -2370,6 +2441,13 @@ function hasJsonShape(root) {
|
|
|
2370
2441
|
}
|
|
2371
2442
|
}
|
|
2372
2443
|
}
|
|
2444
|
+
function isJsonValue(value) {
|
|
2445
|
+
try {
|
|
2446
|
+
return hasJsonShape(value);
|
|
2447
|
+
} catch {
|
|
2448
|
+
return false;
|
|
2449
|
+
}
|
|
2450
|
+
}
|
|
2373
2451
|
function isJsonObject(value) {
|
|
2374
2452
|
try {
|
|
2375
2453
|
return value != null && typeof value == "object" && !Array.isArray(value) && hasJsonShape(value);
|
|
@@ -3288,6 +3366,8 @@ function flow(value) {
|
|
|
3288
3366
|
resourceReferences: resourceReferences(source.resourceReferences),
|
|
3289
3367
|
flowId: string(source.flowId),
|
|
3290
3368
|
name: string(source.name),
|
|
3369
|
+
...source.icon === void 0 ? {} : { icon: string(source.icon) },
|
|
3370
|
+
...source.description === void 0 ? {} : { description: string(source.description) },
|
|
3291
3371
|
status,
|
|
3292
3372
|
updatedAt: string(source.updatedAt),
|
|
3293
3373
|
version: 1
|
|
@@ -3778,6 +3858,18 @@ function decodeTagListItem(value) {
|
|
|
3778
3858
|
}
|
|
3779
3859
|
//#endregion
|
|
3780
3860
|
//#region src/control/common/api.ts
|
|
3861
|
+
function decodeWorkflowBundleImportResult(value) {
|
|
3862
|
+
const source = record$2(value);
|
|
3863
|
+
if (source.version != 1 || !Array.isArray(source.flows) || source.flows.length == 0) return invalidResponse();
|
|
3864
|
+
const entry = flow(source.flow);
|
|
3865
|
+
const flows = source.flows.map(flow);
|
|
3866
|
+
if (new Set(flows.map((item) => item.flowId)).size != flows.length || !flows.some((item) => item.flowId == entry.flowId)) return invalidResponse();
|
|
3867
|
+
return {
|
|
3868
|
+
version: 1,
|
|
3869
|
+
flow: entry,
|
|
3870
|
+
flows
|
|
3871
|
+
};
|
|
3872
|
+
}
|
|
3781
3873
|
function isRunTerminalEvent(event) {
|
|
3782
3874
|
return event?.kind == "run.completed" || event?.kind == "run.failed" || event?.kind == "run.canceled" || event?.kind == "run.indeterminate";
|
|
3783
3875
|
}
|
|
@@ -4095,6 +4187,32 @@ var ControlClient = class {
|
|
|
4095
4187
|
return invalidResponse();
|
|
4096
4188
|
}
|
|
4097
4189
|
}
|
|
4190
|
+
async getFlowExportPreview(flowId) {
|
|
4191
|
+
const value = await this.request(`/v1/flows/${segment$1(flowId)}/export-preview`);
|
|
4192
|
+
try {
|
|
4193
|
+
return decodeWorkflowExportPreview(value);
|
|
4194
|
+
} catch {
|
|
4195
|
+
return invalidResponse();
|
|
4196
|
+
}
|
|
4197
|
+
}
|
|
4198
|
+
async exportFlowBundle(flowId) {
|
|
4199
|
+
const preview = await this.getFlowExportPreview(flowId);
|
|
4200
|
+
if (preview.unavailableFlowIds.length) throw new ApiError(400, "flow.invalid", "Some referenced workflows are unavailable.");
|
|
4201
|
+
return workflowBundleFromPreview(preview);
|
|
4202
|
+
}
|
|
4203
|
+
async importFlowBundle(file, options = {}) {
|
|
4204
|
+
return decodeWorkflowBundleImportResult(await this.request("/v1/flows/import-bundle", {
|
|
4205
|
+
method: "POST",
|
|
4206
|
+
headers: { "Idempotency-Key": options.idempotencyKey ?? `flow-${randomId()}` },
|
|
4207
|
+
body: JSON.stringify({
|
|
4208
|
+
file,
|
|
4209
|
+
name: options.name,
|
|
4210
|
+
teamId: options.teamId,
|
|
4211
|
+
tagIds: options.tagIds,
|
|
4212
|
+
version: 1
|
|
4213
|
+
})
|
|
4214
|
+
}));
|
|
4215
|
+
}
|
|
4098
4216
|
async importFlow(file, options = {}) {
|
|
4099
4217
|
return flow(await this.request("/v1/flows/import", {
|
|
4100
4218
|
method: "POST",
|
|
@@ -5289,13 +5407,13 @@ function FeishuEventPicker({ value, onChange, disabled = false, allowedEvents })
|
|
|
5289
5407
|
//#region src/canvas/browser/i18n/timeZoneLocales.ts
|
|
5290
5408
|
/** The IANA-keyed city names shared by the canvas schedule summary and schedule editor. */
|
|
5291
5409
|
var timeZoneLocales = {
|
|
5292
|
-
"en": { timeZoneNames: en_default$
|
|
5293
|
-
"zh-CN": { timeZoneNames: zh_CN_default$
|
|
5294
|
-
"zh-TW": { timeZoneNames: zh_TW_default$
|
|
5295
|
-
"ja": { timeZoneNames: ja_default$
|
|
5296
|
-
"ko": { timeZoneNames: ko_default$
|
|
5297
|
-
"ru": { timeZoneNames: ru_default$
|
|
5298
|
-
"fr": { timeZoneNames: fr_default$
|
|
5410
|
+
"en": { timeZoneNames: en_default$3.timeZoneNames },
|
|
5411
|
+
"zh-CN": { timeZoneNames: zh_CN_default$3.timeZoneNames },
|
|
5412
|
+
"zh-TW": { timeZoneNames: zh_TW_default$3.timeZoneNames },
|
|
5413
|
+
"ja": { timeZoneNames: ja_default$3.timeZoneNames },
|
|
5414
|
+
"ko": { timeZoneNames: ko_default$3.timeZoneNames },
|
|
5415
|
+
"ru": { timeZoneNames: ru_default$3.timeZoneNames },
|
|
5416
|
+
"fr": { timeZoneNames: fr_default$3.timeZoneNames }
|
|
5299
5417
|
};
|
|
5300
5418
|
//#endregion
|
|
5301
5419
|
//#region src/form/browser/locales.ts
|
|
@@ -6227,14 +6345,24 @@ var resources = {
|
|
|
6227
6345
|
"exportFlow": "Export workflow",
|
|
6228
6346
|
"exportPng": "Export PNG image",
|
|
6229
6347
|
"exportPngFrame": "Show frame",
|
|
6348
|
+
"exportPngCompact": "Compact layout",
|
|
6230
6349
|
"exportPngLight": "Light",
|
|
6231
6350
|
"exportPngDark": "Dark",
|
|
6232
|
-
"exportPngPending": "Exporting PNG…",
|
|
6233
|
-
"exportPngPendingDescription": "Preparing the workflow and image resources. Large images may take a little longer.",
|
|
6234
6351
|
"exportPngComplete": "PNG image exported.",
|
|
6235
6352
|
"exportPngPartial": "PNG image exported. Some images were replaced with placeholders.",
|
|
6236
6353
|
"exportPngFailed": "Could not export the PNG image. Please try again.",
|
|
6237
|
-
"importInvalid": "Invalid or unsupported workflow file."
|
|
6354
|
+
"importInvalid": "Invalid or unsupported workflow file.",
|
|
6355
|
+
"exportPngAspectRatio": "Canvas ratio",
|
|
6356
|
+
"exportPngAuto": "Auto",
|
|
6357
|
+
"exportPngLayout": "Layout",
|
|
6358
|
+
"exportPngOriginal": "Original",
|
|
6359
|
+
"exportPngTheme": "Theme",
|
|
6360
|
+
"exportPngPreview": "Preview",
|
|
6361
|
+
"exportPngPreviewPending": "Generating preview…",
|
|
6362
|
+
"exportPngPreviewFailed": "Could not generate the preview.",
|
|
6363
|
+
"exportPngPreviewPartial": "Some images could not load and were replaced with placeholders.",
|
|
6364
|
+
"exportPngDownload": "Download PNG",
|
|
6365
|
+
"exportPngPreviewRetry": "Retry"
|
|
6238
6366
|
},
|
|
6239
6367
|
inspector: /* @__PURE__ */ JSON.parse("{\"outline\":\"Node outline\",\"backToOutline\":\"Back to node outline\",\"emptyOutline\":\"No nodes yet\",\"triggers\":\"Triggers\",\"nodes\":\"Nodes\",\"multipleSelected\":\"{{count}} nodes selected\",\"account\":{\"contactAdmin\":\"You do not have permission to perform this operation. Contact an administrator.\",\"accessTitle\":\"Access permissions\",\"manageFlowAccess\":\"Connections available to Code\",\"configureAccess\":\"Choose an account\",\"manageAccount\":\"Manage accounts\",\"required\":\"Account connection required\",\"addAccount\":\"Add account\",\"manage\":\"Manage\",\"authorizationPending\":\"Finish authorization in the Connection page, then return here to refresh this account.\",\"chooseAccount\":\"Choose an account\",\"deferred\":\"Not configured for now\",\"clearDeferred\":\"Clear selection\",\"noAccounts\":\"No accounts available\",\"connectBeforeRun\":\"Connect {{service}} before this block can run or be published.\",\"connectService\":\"Connect {{service}}\",\"connection\":\"Connection\",\"loading\":\"Loading connections…\",\"oomolBuiltIn\":\"OOMOL Built-in\",\"missing\":\"The account selected for this node is unavailable. Choose another account or manage connections.\",\"refreshFailed\":\"Connections could not be refreshed.\",\"retry\":\"Retry\",\"status\":{\"disconnected\":\"This Connection is disconnected. Reconnect it or choose another account.\",\"error\":\"This Connection has an error. Repair it or choose another account.\",\"reauth_required\":\"This Connection needs authorization again. Reconnect it or choose another account.\"},\"statusUnavailable\":\"Connection status is unavailable for {{action}}.\",\"teamDefault\":\"Team default\",\"title\":\"Account\",\"unavailable\":\"unavailable\"},\"close\":\"Close inspector\",\"configurationRequired\":\"Configuration required\",\"diagnostics\":\"Diagnostics\",\"errors\":{\"jsonObject\":\"{{label}} must be a JSON object.\",\"portDefinitions\":\"Enter valid port definitions.\"},\"node\":{\"nameDuplicate\":\"A node with this name already exists in this graph.\",\"nameEmpty\":\"Node name cannot be empty.\",\"timeout\":\"Timeout (ms)\",\"maxExecutions\":\"Node execution limit\",\"maxExecutionsError\":\"Node execution limit must be a positive integer.\",\"timeoutError\":\"Timeout must be a positive integer in milliseconds.\",\"title\":\"Node settings\",\"description\":\"Purpose\",\"describe\":\"Describe what this step does.\",\"icon\":\"Icon\",\"name\":\"Title\",\"retry\":\"Retry on error\",\"retryCount\":\"Up to {{count}} retries\",\"retryInterval\":\"Retry interval\",\"retryError\":\"Use an interval of 1–60 whole seconds.\",\"retryHint\":\"The retry count is the number of additional attempts after the first execution. Retries repeat the entire node and may repeat external operations. The timeout includes all attempts and intervals.\",\"retryNone\":\"No retries\",\"retrySeconds\":\"seconds\",\"retryHelp\":\"About retries\",\"retryOnce\":\"Retry once\",\"onError\":\"On failure\",\"onErrorStop\":\"Stop workflow\",\"onErrorOutput\":\"Output to error port\",\"onErrorHelp\":\"About failure handling\",\"onErrorHint\":\"After retries fail, write the error to the system error output and continue along existing connections. On success, error is null. Cancellation, timeouts, resource limits and indeterminate outcomes still stop execution.\",\"systemOutputs\":\"System outputs\",\"systemError\":\"Error information (system)\",\"errorFields\":{\"error\":\"Error information when the node fails; null on success.\",\"code\":\"A code identifying the type of error.\",\"message\":\"A description of the error, with sensitive content redacted.\",\"nodeId\":\"The ID of the node that failed.\",\"nodeName\":\"The node name at the time of failure.\",\"runId\":\"The ID of this workflow run.\",\"executionId\":\"The ID of this node execution, shared across its retry attempts.\"}},\"selectNode\":\"Select one Draft node to inspect and edit it.\",\"locateNode\":\"Locate this node on the canvas\",\"task\":{\"sharedPermissions\":\"Use Flow shared permission group\",\"sharedPermissionsHint\":\"Use all Actions authorized by the Flow permission group. No need to add them to this node.\",\"httpHosts\":\"HTTP hosts\",\"httpHostsHint\":\"One host per line. *.example.com includes subdomains.\",\"httpHostsInvalid\":\"\\\"{{host}}\\\" is not a valid host. Use a host name such as api.example.com.\",\"httpHostsLimit\":\"Declare at most {{count}} hosts.\",\"addAction\":\"Add Action\",\"removeAction\":\"Remove Action\",\"actionAccount\":\"Account\",\"chooseAccount\":\"Choose an account\",\"permissionSaveFailed\":\"Could not save Code permissions. Retry the change.\",\"chatText\":\"Chat text\",\"connectorAction\":\"Connector action\",\"definition\":\"Task definition\",\"discardCode\":\"Discard changes\",\"editorLoading\":\"Loading editor…\",\"editorUnavailable\":\"The code editor couldn’t be loaded.\",\"inputPorts\":\"Input ports\",\"javascriptModule\":\"Code\",\"missing\":\"The referenced Task does not exist.\",\"outputPorts\":\"Output ports\",\"responseMode\":\"Response mode\",\"source\":\"Source\",\"structuredJson\":\"Structured JSON\",\"retrySave\":\"Retry save\",\"additionalInputs\":\"Additional inputs\",\"httpHostsUpdated\":\"Hosts changed elsewhere. The latest configuration is loaded; review it before saving.\"},\"wait\":{\"approval\":\"Approve or reject\",\"changeNotification\":\"Change\",\"continue\":\"Continue\",\"mode\":\"Resolution\",\"inputsLoading\":\"Loading notification parameters…\",\"pendingDescription\":\"The pending output fires once when waiting begins and provides confirmation links and related data. Connect it to send a message or run other steps.\",\"prompt\":\"Prompt\",\"promptError\":\"Prompt must contain 1 to 1,000 characters.\",\"autoContinue\":\"Automatic continuation\",\"autoOff\":\"Off\",\"autoAfter\":\"After a duration\",\"autoAt\":\"At a specific time\",\"autoSeconds\":\"Duration (seconds)\",\"autoDate\":\"Date and time\",\"autoInvalid\":\"Enter a positive duration or a valid date and time.\",\"autoDescription\":\"You can continue manually before the scheduled time.\"},\"title\":\"Inspector\",\"sources\":{\"loading\":\"Loading input sources…\",\"loadFailed\":\"Could not load input sources. Reopen the menu to retry.\",\"checkFailed\":\"Could not check this source.\",\"select\":\"Select input source\",\"title\":\"Input source\",\"sourceMissing\":\"The original input source no longer exists. Choose again.\",\"outputMissing\":\"“{{output}}” could not be found in “{{source}}”. Choose again.\",\"wholeObject\":\"Whole object\",\"fieldMissing\":\"Field {{field}} is no longer declared in “{{output}}”. Choose again.\",\"notReady\":\"“{{source}} {{handle}}” may not have a value when this step runs.\",\"sourceConflict\":\"These fields may have values at the same time: {{sources}}. Only one can be used here.\",\"incompatibleRight\":\"The right value type is incompatible with this comparison.\",\"incompatible\":\"Mismatch\",\"unverified\":\"Unverified\",\"schemaIncompatible\":\"The data format does not match.\",\"schemaPathIncompatible\":\"The data format of “{{path}}” does not match.\",\"schemaCompareFailed\":\"Could not check the data format. Check the JSON Schema.\",\"binaryIncompatible\":\"Binary data cannot be used here.\",\"artifactIncompatible\":\"File data cannot be used here.\",\"nullableIncompatible\":\"A value is required, but the selected field may be empty.\",\"typeIncompatible\":\"Expected {{target}}, but the selected field is {{source}}.\",\"propertyTypeIncompatible\":\"“{{path}}” must be {{target}}, but it is {{source}}.\",\"requiredIncompatible\":\"The required property “{{property}}” may be missing.\",\"enumIncompatible\":\"Some possible values are not accepted: {{values}}.\",\"constIncompatible\":\"Only {{target}} is accepted, but the selected field is always {{source}}.\",\"constraintSubject\":\"“{{path}}” \",\"minLength\":\"{{subject}}must contain at least {{value}} characters.\",\"maxLength\":\"{{subject}}must contain at most {{value}} characters.\",\"pattern\":\"{{subject}}must match {{value}}.\",\"minimum\":\"{{subject}}cannot be less than {{value}}.\",\"exclusiveMinimum\":\"{{subject}}must be greater than {{value}}.\",\"maximum\":\"{{subject}}cannot be greater than {{value}}.\",\"exclusiveMaximum\":\"{{subject}}must be less than {{value}}.\",\"multipleOf\":\"{{subject}}must be a multiple of {{value}}.\",\"minItems\":\"{{subject}}must contain at least {{value}} items.\",\"maxItems\":\"{{subject}}must contain at most {{value}} items.\",\"minProperties\":\"{{subject}}must contain at least {{value}} properties.\",\"maxProperties\":\"{{subject}}must contain at most {{value}} properties.\",\"integer\":\"Integer\",\"unknownType\":\"unknown type\",\"typeSeparator\":\" or \"},\"actions\":{\"flowAccess\":\"Available services\",\"flowAccessHint\":\"Manage connections shared by all Code nodes in this Flow\",\"chooseConnection\":\"Choose a {{provider}} connection\",\"connectionDescription\":\"The connection is inserted into this call. Flow provider access still controls whether it may be used.\",\"title\":\"Actions available to this code\",\"search\":\"Search actions\",\"description\":\"Choose the actions and accounts this code can use.\",\"empty\":\"No matching actions.\",\"remove\":\"Remove\",\"default\":\"Default account\",\"defaultHint\":\"Used when the call does not specify an account.\",\"removeAction\":\"Remove action\",\"explicit\":\"Choose explicitly in code\",\"connect\":\"Connect account\",\"refresh\":\"Refresh accounts\",\"aliases\":\"Update saved aliases\",\"add\":\"Add action\",\"cancel\":\"Cancel\",\"loading\":\"Searching…\",\"needsAccount\":\"Connect an account\",\"accounts\":\"{{count}} accounts\",\"public\":\"No account needed\",\"allowed\":\"Allowed accounts\",\"unavailable\":\"Unavailable\",\"details\":\"Connection details\",\"example\":\"Call example\",\"syntax\":\"Call syntax\",\"nested\":\"Provider method\",\"fullId\":\"Full ID\",\"copy\":\"Copy\",\"copied\":\"Copied\",\"copyError\":\"Copy failed. Select the code and copy it manually.\",\"introDescription\":\"Add actions as needed to call external apps through {{context}}.\",\"insertAction\":\"Insert code\",\"chooseAccounts\":\"Manage accounts\"},\"comment\":{\"markdown\":\"Markdown\",\"preview\":\"Preview\"},\"ports\":{\"reorder\":\"Reorder {{name}}\",\"reorderHint\":\"Drag to reorder within the group, or use Up / Down while focused.\",\"moved\":\"{{name}} moved to position {{position}}.\",\"groupSettings\":\"Group settings\",\"connected\":\"Connected\",\"sort\":\"Sort\",\"finishSorting\":\"Done sorting\",\"inputsTitle\":\"Inputs\",\"requiredInputs\":\"Required\",\"optionalInputs\":\"Optional\",\"noInputs\":\"This node does not require input data.\",\"noOutputs\":\"This node does not provide output data.\",\"outputsTitle\":\"Outputs\",\"valuesTitle\":\"Values\",\"columnHandle\":\"Handle\",\"columnName\":\"Name\",\"columnType\":\"Type\",\"columnValue\":\"Value\",\"builtIn\":{\"cron\":{\"scheduledAt\":\"The scheduled time that triggered this run, in ISO 8601 format.\"},\"webhook\":{\"headers\":\"The headers received with this Webhook request.\",\"query\":\"The URL query parameters received with this Webhook request.\",\"body\":\"The body received with this Webhook request.\",\"webhookUrl\":\"The Webhook URL that received this request, without query parameters.\"}},\"startParametersTitle\":\"Start parameters\"}}"),
|
|
6240
6368
|
language: { "label": "Language" },
|
|
@@ -7318,7 +7446,10 @@ var resources = {
|
|
|
7318
7446
|
"discardTitle": "Discard changes?",
|
|
7319
7447
|
"discardDescription": "Your Flow settings have not been saved.",
|
|
7320
7448
|
"continueEditing": "Continue editing",
|
|
7321
|
-
"discardChanges": "Discard changes"
|
|
7449
|
+
"discardChanges": "Discard changes",
|
|
7450
|
+
"icon": "Icon",
|
|
7451
|
+
"resetIcon": "Reset icon",
|
|
7452
|
+
"description": "Description"
|
|
7322
7453
|
},
|
|
7323
7454
|
flowState: {
|
|
7324
7455
|
"title": "Persistent data",
|
|
@@ -7332,7 +7463,7 @@ var resources = {
|
|
|
7332
7463
|
"clear": "Clear",
|
|
7333
7464
|
"orphaned": "Outside the current view",
|
|
7334
7465
|
"nearLimit": "Flow history is at least 80% full. Clear unused history.",
|
|
7335
|
-
"
|
|
7466
|
+
"usage": "Usage",
|
|
7336
7467
|
"scope": "Scope",
|
|
7337
7468
|
"refresh": "Refresh",
|
|
7338
7469
|
"cancel": "Cancel",
|
|
@@ -7360,7 +7491,7 @@ var resources = {
|
|
|
7360
7491
|
"pendingClear": "{{count}} pending; finish or cancel their Runs before clearing.",
|
|
7361
7492
|
"clearBlocked": "This history has pending records. Finish or cancel their Runs, then refresh.",
|
|
7362
7493
|
"clearSource": "Clear {{name}}",
|
|
7363
|
-
"
|
|
7494
|
+
"sourceUsage": "{{name}} usage",
|
|
7364
7495
|
"confirmTitle": "Clear {{name}}?",
|
|
7365
7496
|
"confirmValues": "This will clear {{count}} saved entries in {{scope}}. Subsequent Runs will no longer be able to read these values.",
|
|
7366
7497
|
"confirmHistory": "This will clear {{count}} deduplication records in {{scope}}. These items may be processed again.",
|
|
@@ -7371,6 +7502,14 @@ var resources = {
|
|
|
7371
7502
|
"loadFailed": "Unable to load",
|
|
7372
7503
|
"valuesHelp": "{{name}}: Content explicitly saved by the workflow, available to later runs.",
|
|
7373
7504
|
"historyHelp": "{{name}}: Item identifiers used to avoid processing duplicates."
|
|
7505
|
+
},
|
|
7506
|
+
workflowTransfer: {
|
|
7507
|
+
"includeDependencies": "Include referenced workflows",
|
|
7508
|
+
"workflowCount": "Workflows ({{count}})",
|
|
7509
|
+
"unavailable": "Unavailable workflows: {{count}}.",
|
|
7510
|
+
"export": "Export",
|
|
7511
|
+
"hostUnsupported": "This host does not support workflow bundle imports yet.",
|
|
7512
|
+
"unnamed": "Untitled workflow"
|
|
7374
7513
|
}
|
|
7375
7514
|
},
|
|
7376
7515
|
"zh-CN": {
|
|
@@ -7596,14 +7735,24 @@ var resources = {
|
|
|
7596
7735
|
"exportFlow": "导出工作流",
|
|
7597
7736
|
"exportPng": "导出 PNG 图片",
|
|
7598
7737
|
"exportPngFrame": "显示外框",
|
|
7738
|
+
"exportPngCompact": "紧凑布局",
|
|
7599
7739
|
"exportPngLight": "浅色",
|
|
7600
7740
|
"exportPngDark": "深色",
|
|
7601
|
-
"exportPngPending": "正在导出 PNG…",
|
|
7602
|
-
"exportPngPendingDescription": "正在处理工作流和图片资源,图片较大时可能需要一些时间。",
|
|
7603
7741
|
"exportPngComplete": "PNG 图片已导出。",
|
|
7604
7742
|
"exportPngPartial": "PNG 图片已导出,部分图片已用占位图替代。",
|
|
7605
7743
|
"exportPngFailed": "PNG 图片导出失败,请重试。",
|
|
7606
|
-
"importInvalid": "文件损坏或工作流格式不受支持。"
|
|
7744
|
+
"importInvalid": "文件损坏或工作流格式不受支持。",
|
|
7745
|
+
"exportPngAspectRatio": "画布比例",
|
|
7746
|
+
"exportPngAuto": "自动",
|
|
7747
|
+
"exportPngLayout": "布局",
|
|
7748
|
+
"exportPngOriginal": "原布局",
|
|
7749
|
+
"exportPngTheme": "主题",
|
|
7750
|
+
"exportPngPreview": "预览",
|
|
7751
|
+
"exportPngPreviewPending": "正在生成预览…",
|
|
7752
|
+
"exportPngPreviewFailed": "预览生成失败,请重试。",
|
|
7753
|
+
"exportPngPreviewPartial": "部分图片加载失败,已使用占位图。",
|
|
7754
|
+
"exportPngDownload": "下载 PNG",
|
|
7755
|
+
"exportPngPreviewRetry": "重试"
|
|
7607
7756
|
},
|
|
7608
7757
|
inspector: /* @__PURE__ */ JSON.parse("{\"outline\":\"节点大纲\",\"backToOutline\":\"返回节点大纲\",\"emptyOutline\":\"暂无节点\",\"triggers\":\"触发器\",\"nodes\":\"节点\",\"multipleSelected\":\"已选择 {{count}} 个节点\",\"account\":{\"contactAdmin\":\"你没有执行此操作的权限,请联系管理员。\",\"accessTitle\":\"访问权限\",\"manageFlowAccess\":\"Code 允许使用的连接\",\"configureAccess\":\"选择可用账号\",\"manageAccount\":\"管理账号\",\"required\":\"待连接账号\",\"addAccount\":\"添加账号\",\"manage\":\"管理\",\"authorizationPending\":\"请在 Connection 页面完成授权,返回这里后会刷新当前账号。\",\"chooseAccount\":\"选择账号\",\"deferred\":\"暂不设置\",\"clearDeferred\":\"清除选择\",\"noAccounts\":\"暂无可用账号\",\"connectBeforeRun\":\"请先连接 {{service}},此节点才能运行或发布。\",\"connectService\":\"连接 {{service}}\",\"connection\":\"连接\",\"loading\":\"正在加载连接…\",\"oomolBuiltIn\":\"OOMOL 内置账号\",\"missing\":\"此节点选择的账号当前不可用,请选择其他账号或管理账号。\",\"refreshFailed\":\"无法刷新 Connection。\",\"retry\":\"重试\",\"status\":{\"disconnected\":\"此 Connection 已断开,请重新连接或选择其他账号。\",\"error\":\"此 Connection 状态异常,请修复后重试或选择其他账号。\",\"reauth_required\":\"此 Connection 需要重新授权,请重新连接或选择其他账号。\"},\"statusUnavailable\":\"暂时无法获取 {{action}} 的连接状态。\",\"teamDefault\":\"团队默认\",\"title\":\"账号\",\"unavailable\":\"不可用\"},\"close\":\"关闭检查器\",\"configurationRequired\":\"配置待完成\",\"diagnostics\":\"诊断\",\"errors\":{\"jsonObject\":\"{{label}} 必须是 JSON 对象。\",\"portDefinitions\":\"请输入有效的端口定义。\"},\"node\":{\"nameDuplicate\":\"当前图中已存在同名节点。\",\"nameEmpty\":\"节点名称不能为空。\",\"timeout\":\"超时时间(毫秒)\",\"maxExecutions\":\"节点执行上限\",\"maxExecutionsError\":\"节点执行上限必须是正整数。\",\"timeoutError\":\"超时时间必须是以毫秒为单位的正整数。\",\"title\":\"节点设置\",\"description\":\"用途说明\",\"describe\":\"描述这一步要完成什么。\",\"icon\":\"图标\",\"name\":\"标题\",\"retry\":\"失败重试\",\"retryCount\":\"最多重试 {{count}} 次\",\"retryInterval\":\"重试间隔\",\"retryError\":\"间隔须为 1~60 整数秒。\",\"retryHint\":\"重试次数是首次执行失败后的追加次数。重试会重新执行整个节点,可能重复外部操作。超时包含全部尝试和等待间隔。\",\"retryNone\":\"不重试\",\"retrySeconds\":\"秒\",\"retryHelp\":\"重试说明\",\"retryOnce\":\"最多重试 1 次\",\"onError\":\"失败处理\",\"onErrorStop\":\"终止工作流\",\"onErrorOutput\":\"输出到 error 端口\",\"onErrorHelp\":\"失败处理说明\",\"onErrorHint\":\"重试后仍失败时,将错误写入系统 error 并沿现有连线继续。成功时 error 为 null。取消、超时、资源限制和结果不确定仍终止工作流。\",\"systemOutputs\":\"系统输出\",\"systemError\":\"错误信息(系统)\",\"errorFields\":{\"error\":\"节点失败时的错误信息;成功时为 null。\",\"code\":\"用于识别错误类型的错误码。\",\"message\":\"错误的说明信息,敏感内容已脱敏。\",\"nodeId\":\"发生错误的节点 ID。\",\"nodeName\":\"发生错误时的节点名称。\",\"runId\":\"本次工作流运行的 ID。\",\"executionId\":\"本次节点执行的 ID,多次重试共用此 ID。\"}},\"selectNode\":\"选择一个草稿节点以查看和编辑。\",\"locateNode\":\"在画布上定位该节点\",\"task\":{\"sharedPermissions\":\"使用 Flow 共享权限组\",\"sharedPermissionsHint\":\"直接使用 Flow 共享权限组已授权的全部 Actions,无需逐个添加。\",\"httpHosts\":\"HTTP 主机\",\"httpHostsHint\":\"每行一个主机,支持 *.example.com 子域名匹配。\",\"httpHostsInvalid\":\"“{{host}}”不是有效的主机,请填写 api.example.com 这样的主机名。\",\"httpHostsLimit\":\"最多声明 {{count}} 个主机。\",\"addAction\":\"添加 Action\",\"removeAction\":\"移除 Action\",\"actionAccount\":\"账号\",\"chooseAccount\":\"选择账号\",\"permissionSaveFailed\":\"无法保存 Code 权限,请重试。\",\"chatText\":\"对话文本\",\"connectorAction\":\"连接器操作\",\"definition\":\"任务定义\",\"discardCode\":\"放弃修改\",\"editorLoading\":\"正在加载编辑器…\",\"editorUnavailable\":\"代码编辑器加载失败。\",\"inputPorts\":\"输入端口\",\"javascriptModule\":\"代码\",\"missing\":\"引用的任务不存在。\",\"outputPorts\":\"输出端口\",\"responseMode\":\"响应模式\",\"source\":\"源代码\",\"structuredJson\":\"结构化 JSON\",\"retrySave\":\"重试保存\",\"additionalInputs\":\"附加输入\",\"httpHostsUpdated\":\"主机配置已在别处更新。已加载最新配置,请检查后再保存。\"},\"wait\":{\"approval\":\"通过或拒绝\",\"changeNotification\":\"更换\",\"continue\":\"继续\",\"mode\":\"处理方式\",\"inputsLoading\":\"正在加载通知参数…\",\"pendingDescription\":\"待确认出口在开始等待时触发一次,提供确认链接及相关数据。连接此出口可发送消息或执行其他步骤。\",\"prompt\":\"提示\",\"promptError\":\"提示必须包含 1 到 1,000 个字符。\",\"autoContinue\":\"自动继续\",\"autoOff\":\"关闭\",\"autoAfter\":\"等待一段时间\",\"autoAt\":\"到指定时间\",\"autoSeconds\":\"等待时长(秒)\",\"autoDate\":\"日期和时间\",\"autoInvalid\":\"请输入正数时长或有效的日期和时间。\",\"autoDescription\":\"可提前手动继续。\"},\"title\":\"检查器\",\"sources\":{\"loading\":\"正在加载输入来源…\",\"loadFailed\":\"无法加载输入来源,请重新打开菜单重试。\",\"checkFailed\":\"无法检查此来源。\",\"select\":\"选择输入来源\",\"title\":\"输入来源\",\"sourceMissing\":\"原输入来源已不存在,请重新选择。\",\"outputMissing\":\"“{{source}}”中找不到“{{output}}”,请重新选择。\",\"wholeObject\":\"整个对象\",\"fieldMissing\":\"“{{output}}”中已不再声明字段 {{field}},请重新选择。\",\"notReady\":\"运行到这里时,“{{source}} {{handle}}”可能还没有值。\",\"sourceConflict\":\"这些字段可能同时有值:{{sources}}。这里只能取一个。\",\"incompatibleRight\":\"右值类型不符合此比较的要求。\",\"incompatible\":\"不兼容\",\"unverified\":\"无法验证\",\"schemaIncompatible\":\"数据格式不匹配。\",\"schemaPathIncompatible\":\"“{{path}}”的数据格式不匹配。\",\"schemaCompareFailed\":\"无法检查数据格式,请检查 JSON Schema。\",\"binaryIncompatible\":\"不能使用二进制数据。\",\"artifactIncompatible\":\"不能使用文件数据。\",\"nullableIncompatible\":\"不能为空,但所选字段可能为空。\",\"typeIncompatible\":\"需要{{target}},但所选字段是{{source}}。\",\"propertyTypeIncompatible\":\"“{{path}}”需要{{target}},实际是{{source}}。\",\"requiredIncompatible\":\"不一定包含必填属性“{{property}}”。\",\"enumIncompatible\":\"可能出现不接受的值:{{values}}。\",\"constIncompatible\":\"只接受 {{target}},所选字段固定为 {{source}}。\",\"constraintSubject\":\"“{{path}}”\",\"minLength\":\"{{subject}}至少需要 {{value}} 个字符。\",\"maxLength\":\"{{subject}}最多接受 {{value}} 个字符。\",\"pattern\":\"{{subject}}文本格式应符合 {{value}}。\",\"minimum\":\"{{subject}}不能小于 {{value}}。\",\"exclusiveMinimum\":\"{{subject}}必须大于 {{value}}。\",\"maximum\":\"{{subject}}不能大于 {{value}}。\",\"exclusiveMaximum\":\"{{subject}}必须小于 {{value}}。\",\"multipleOf\":\"{{subject}}必须是 {{value}} 的倍数。\",\"minItems\":\"{{subject}}至少需要 {{value}} 项。\",\"maxItems\":\"{{subject}}最多接受 {{value}} 项。\",\"minProperties\":\"{{subject}}至少需要 {{value}} 个属性。\",\"maxProperties\":\"{{subject}}最多接受 {{value}} 个属性。\",\"integer\":\"整数\",\"unknownType\":\"未知类型\",\"typeSeparator\":\"或\"},\"actions\":{\"flowAccess\":\"可用服务\",\"flowAccessHint\":\"管理整个工作流的 Code 共享使用的连接\",\"chooseConnection\":\"选择 {{provider}} Connection\",\"connectionDescription\":\"Connection 将写入本次调用;是否允许使用仍由工作流 Provider Access 决定。\",\"title\":\"代码可调用的动作\",\"search\":\"搜索应用或动作…\",\"description\":\"搜索并添加这段代码需要调用的动作。\",\"empty\":\"没有匹配的 Action。\",\"remove\":\"移除\",\"default\":\"默认账号\",\"defaultHint\":\"调用时未指定账号,将使用此账号。\",\"removeAction\":\"移除动作\",\"explicit\":\"每次调用时指定\",\"connect\":\"连接账号\",\"refresh\":\"刷新账号\",\"aliases\":\"同步账号别名\",\"add\":\"添加动作\",\"cancel\":\"取消\",\"loading\":\"搜索中…\",\"needsAccount\":\"待连接账号\",\"accounts\":\"{{count}} 个账号\",\"public\":\"无需账号\",\"allowed\":\"允许使用的账号\",\"unavailable\":\"不可用\",\"details\":\"账号详情\",\"example\":\"调用示例\",\"syntax\":\"调用写法\",\"nested\":\"分层写法\",\"fullId\":\"完整 ID\",\"copy\":\"复制\",\"copied\":\"已复制\",\"copyError\":\"复制失败,请选中示例代码手动复制。\",\"introDescription\":\"按需添加动作,通过 {{context}} 调用外部应用。\",\"insertAction\":\"插入代码\",\"chooseAccounts\":\"管理账号\"},\"comment\":{\"markdown\":\"Markdown\",\"preview\":\"预览\"},\"ports\":{\"reorder\":\"调整 {{name}} 的顺序\",\"reorderHint\":\"拖动调整组内顺序,或聚焦后使用上、下方向键。\",\"moved\":\"{{name}} 已移至第 {{position}} 位。\",\"groupSettings\":\"分组设置\",\"connected\":\"已连接\",\"sort\":\"排序\",\"finishSorting\":\"完成排序\",\"inputsTitle\":\"输入\",\"requiredInputs\":\"必填\",\"optionalInputs\":\"选填\",\"noInputs\":\"此节点不需要输入数据\",\"noOutputs\":\"此节点不提供输出数据\",\"outputsTitle\":\"输出\",\"valuesTitle\":\"数据\",\"columnHandle\":\"Handle\",\"columnName\":\"名称\",\"columnType\":\"类型\",\"columnValue\":\"值\",\"builtIn\":{\"cron\":{\"scheduledAt\":\"本次运行的计划触发时间,采用 ISO 8601 格式。\"},\"webhook\":{\"headers\":\"此 Webhook 请求携带的请求头。\",\"query\":\"此 Webhook 请求携带的 URL 查询参数。\",\"body\":\"此 Webhook 请求携带的请求体。\",\"webhookUrl\":\"接收此次请求的 Webhook URL,不含查询参数。\"}},\"startParametersTitle\":\"启动参数\"}}"),
|
|
7609
7758
|
language: { "label": "语言" },
|
|
@@ -8687,7 +8836,10 @@ var resources = {
|
|
|
8687
8836
|
"discardTitle": "放弃修改?",
|
|
8688
8837
|
"discardDescription": "工作流设置的修改尚未保存。",
|
|
8689
8838
|
"continueEditing": "继续编辑",
|
|
8690
|
-
"discardChanges": "放弃修改"
|
|
8839
|
+
"discardChanges": "放弃修改",
|
|
8840
|
+
"icon": "图标",
|
|
8841
|
+
"resetIcon": "重置图标",
|
|
8842
|
+
"description": "描述"
|
|
8691
8843
|
},
|
|
8692
8844
|
flowState: {
|
|
8693
8845
|
"title": "持久化数据",
|
|
@@ -8701,7 +8853,7 @@ var resources = {
|
|
|
8701
8853
|
"clear": "清空",
|
|
8702
8854
|
"orphaned": "当前视图外",
|
|
8703
8855
|
"nearLimit": "该工作流的去重记录已使用至少 80%。请清理不再需要的记录。",
|
|
8704
|
-
"
|
|
8856
|
+
"usage": "用量",
|
|
8705
8857
|
"scope": "作用域",
|
|
8706
8858
|
"refresh": "刷新",
|
|
8707
8859
|
"cancel": "取消",
|
|
@@ -8729,7 +8881,7 @@ var resources = {
|
|
|
8729
8881
|
"pendingClear": "{{count}} 条待提交,相关运行结束或取消后可清理。",
|
|
8730
8882
|
"clearBlocked": "这些记录尚待提交。请等待相关运行结束或取消后再刷新。",
|
|
8731
8883
|
"clearSource": "清空{{name}}",
|
|
8732
|
-
"
|
|
8884
|
+
"sourceUsage": "{{name}}用量",
|
|
8733
8885
|
"confirmTitle": "清空「{{name}}」?",
|
|
8734
8886
|
"confirmValues": "将清空{{scope}}环境保存的 {{count}} 条数据,后续运行将无法读取这些值。",
|
|
8735
8887
|
"confirmHistory": "将清空{{scope}}环境的 {{count}} 条去重记录,这些条目之后可能再次被处理。",
|
|
@@ -8740,6 +8892,14 @@ var resources = {
|
|
|
8740
8892
|
"loadFailed": "加载失败",
|
|
8741
8893
|
"valuesHelp": "{{name}}:工作流主动保存的内容,后续运行可以继续读取。",
|
|
8742
8894
|
"historyHelp": "{{name}}:条目的识别标记,用来避免重复处理。"
|
|
8895
|
+
},
|
|
8896
|
+
workflowTransfer: {
|
|
8897
|
+
"includeDependencies": "包含引用的工作流",
|
|
8898
|
+
"workflowCount": "{{count}} 个工作流",
|
|
8899
|
+
"unavailable": "{{count}} 个引用的工作流不可用。",
|
|
8900
|
+
"export": "导出",
|
|
8901
|
+
"hostUnsupported": "当前宿主尚不支持导入工作流包。",
|
|
8902
|
+
"unnamed": "未命名工作流"
|
|
8743
8903
|
}
|
|
8744
8904
|
},
|
|
8745
8905
|
"zh-TW": {
|
|
@@ -8965,14 +9125,24 @@ var resources = {
|
|
|
8965
9125
|
"exportFlow": "匯出工作流",
|
|
8966
9126
|
"exportPng": "匯出 PNG 圖片",
|
|
8967
9127
|
"exportPngFrame": "顯示外框",
|
|
9128
|
+
"exportPngCompact": "緊湊配置",
|
|
8968
9129
|
"exportPngLight": "淺色",
|
|
8969
9130
|
"exportPngDark": "深色",
|
|
8970
|
-
"exportPngPending": "正在匯出 PNG…",
|
|
8971
|
-
"exportPngPendingDescription": "正在處理工作流程和圖片資源,圖片較大時可能需要一些時間。",
|
|
8972
9131
|
"exportPngComplete": "PNG 圖片已匯出。",
|
|
8973
9132
|
"exportPngPartial": "PNG 圖片已匯出,部分圖片已用佔位圖替代。",
|
|
8974
9133
|
"exportPngFailed": "PNG 圖片匯出失敗,請重試。",
|
|
8975
|
-
"importInvalid": "檔案損壞或工作流格式不受支援。"
|
|
9134
|
+
"importInvalid": "檔案損壞或工作流格式不受支援。",
|
|
9135
|
+
"exportPngAspectRatio": "畫布比例",
|
|
9136
|
+
"exportPngAuto": "自動",
|
|
9137
|
+
"exportPngLayout": "配置",
|
|
9138
|
+
"exportPngOriginal": "原配置",
|
|
9139
|
+
"exportPngTheme": "主題",
|
|
9140
|
+
"exportPngPreview": "預覽",
|
|
9141
|
+
"exportPngPreviewPending": "正在產生預覽…",
|
|
9142
|
+
"exportPngPreviewFailed": "無法產生預覽,請重試。",
|
|
9143
|
+
"exportPngPreviewPartial": "部分圖片載入失敗,已使用預留位置圖片。",
|
|
9144
|
+
"exportPngDownload": "下載 PNG",
|
|
9145
|
+
"exportPngPreviewRetry": "重試"
|
|
8976
9146
|
},
|
|
8977
9147
|
inspector: /* @__PURE__ */ JSON.parse("{\"outline\":\"節點大綱\",\"backToOutline\":\"返回節點大綱\",\"emptyOutline\":\"暫無節點\",\"triggers\":\"觸發器\",\"nodes\":\"節點\",\"multipleSelected\":\"已選擇 {{count}} 個節點\",\"account\":{\"contactAdmin\":\"你沒有執行此操作的權限,請聯絡管理員。\",\"accessTitle\":\"存取權限\",\"manageFlowAccess\":\"Code 允許使用的連線\",\"configureAccess\":\"選擇可用帳號\",\"manageAccount\":\"管理帳號\",\"required\":\"待連線帳號\",\"addAccount\":\"新增帳號\",\"manage\":\"管理\",\"authorizationPending\":\"請在 Connection 頁面完成授權,再回到這裡重新整理這個帳號。\",\"chooseAccount\":\"選擇帳號\",\"deferred\":\"暫不設定\",\"clearDeferred\":\"清除選擇\",\"noAccounts\":\"暫無可用帳號\",\"connectBeforeRun\":\"請先連接 {{service}},這個節點才能執行或發布。\",\"connectService\":\"連接 {{service}}\",\"connection\":\"Connection\",\"loading\":\"正在載入 Connection…\",\"oomolBuiltIn\":\"OOMOL 內建帳號\",\"missing\":\"此節點選擇的帳號目前無法使用,請選擇其他帳號或管理帳號。\",\"refreshFailed\":\"無法重新整理 Connection。\",\"retry\":\"重試\",\"status\":{\"disconnected\":\"這個 Connection 已中斷。請重新連接或選擇其他帳號。\",\"error\":\"這個 Connection 發生錯誤。請修復它或選擇其他帳號。\",\"reauth_required\":\"這個 Connection 需要重新授權。請重新連接或選擇其他帳號。\"},\"statusUnavailable\":\"無法取得 {{action}} 的 Connection 狀態。\",\"teamDefault\":\"團隊預設\",\"title\":\"帳號\",\"unavailable\":\"無法使用\"},\"close\":\"關閉檢查器\",\"configurationRequired\":\"尚未完成設定\",\"diagnostics\":\"診斷\",\"errors\":{\"jsonObject\":\"{{label}} 必須是 JSON 物件。\",\"portDefinitions\":\"請輸入有效的埠定義。\"},\"node\":{\"nameDuplicate\":\"目前圖中已存在同名節點。\",\"nameEmpty\":\"節點名稱不能為空。\",\"timeout\":\"逾時時間(毫秒)\",\"maxExecutions\":\"節點執行上限\",\"maxExecutionsError\":\"節點執行上限必須是正整數。\",\"timeoutError\":\"逾時時間必須是以毫秒為單位的正整數。\",\"title\":\"節點設定\",\"description\":\"用途說明\",\"describe\":\"描述這個步驟要完成什麼。\",\"icon\":\"圖示\",\"name\":\"標題\",\"retry\":\"失敗重試\",\"retryCount\":\"最多重試 {{count}} 次\",\"retryInterval\":\"重試間隔\",\"retryError\":\"間隔須為 1~60 整數秒。\",\"retryHint\":\"重試次數是首次執行失敗後的追加次數。重試會重新執行整個節點,可能重複外部操作。逾時包含全部嘗試和等待間隔。\",\"retryNone\":\"不重試\",\"retrySeconds\":\"秒\",\"retryHelp\":\"重試說明\",\"retryOnce\":\"最多重試 1 次\",\"onError\":\"失敗處理\",\"onErrorStop\":\"終止工作流程\",\"onErrorOutput\":\"輸出至 error 連接埠\",\"onErrorHelp\":\"失敗處理說明\",\"onErrorHint\":\"重試後仍失敗時,將錯誤寫入系統 error 並沿現有連線繼續。成功時 error 為 null。取消、逾時、資源限制及結果不確定仍終止工作流程。\",\"systemOutputs\":\"系統輸出\",\"systemError\":\"錯誤資訊(系統)\",\"errorFields\":{\"error\":\"節點失敗時的錯誤資訊;成功時為 null。\",\"code\":\"用於識別錯誤類型的錯誤碼。\",\"message\":\"錯誤的說明資訊,敏感內容已遮蔽。\",\"nodeId\":\"發生錯誤的節點 ID。\",\"nodeName\":\"發生錯誤時的節點名稱。\",\"runId\":\"本次工作流程執行的 ID。\",\"executionId\":\"本次節點執行的 ID,多次重試共用此 ID。\"}},\"selectNode\":\"選取一個草稿節點即可檢視並編輯它。\",\"locateNode\":\"在畫布上定位此節點\",\"task\":{\"sharedPermissions\":\"使用 Flow 共用權限群組\",\"sharedPermissionsHint\":\"直接使用 Flow 共用權限群組已授權的所有 Actions,無需逐一新增。\",\"httpHosts\":\"HTTP 主機\",\"httpHostsHint\":\"每行一個主機,支援 *.example.com 子網域比對。\",\"httpHostsInvalid\":\"「{{host}}」不是有效的主機,請填寫 api.example.com 這類主機名稱。\",\"httpHostsLimit\":\"最多宣告 {{count}} 個主機。\",\"addAction\":\"新增 Action\",\"removeAction\":\"移除 Action\",\"actionAccount\":\"帳號\",\"chooseAccount\":\"選擇帳號\",\"permissionSaveFailed\":\"無法儲存 Code 權限,請重試。\",\"chatText\":\"對話文字\",\"connectorAction\":\"Connector 操作\",\"definition\":\"任務定義\",\"discardCode\":\"放棄變更\",\"editorLoading\":\"正在載入編輯器…\",\"editorUnavailable\":\"無法載入程式碼編輯器。\",\"inputPorts\":\"輸入埠\",\"javascriptModule\":\"程式碼\",\"missing\":\"引用的任務不存在。\",\"outputPorts\":\"輸出埠\",\"responseMode\":\"回應模式\",\"source\":\"原始碼\",\"structuredJson\":\"結構化 JSON\",\"retrySave\":\"重試儲存\",\"additionalInputs\":\"附加輸入\",\"httpHostsUpdated\":\"主機設定已在別處更新。已載入最新設定,請檢查後再儲存。\"},\"wait\":{\"approval\":\"通過或拒絕\",\"changeNotification\":\"更換\",\"continue\":\"繼續\",\"mode\":\"處理方式\",\"inputsLoading\":\"正在載入通知參數…\",\"pendingDescription\":\"待確認出口在開始等待時觸發一次,提供確認連結及相關資料。連接此出口可傳送訊息或執行其他步驟。\",\"prompt\":\"提示\",\"promptError\":\"提示必須包含 1 到 1,000 個字元。\",\"autoContinue\":\"自動繼續\",\"autoOff\":\"關閉\",\"autoAfter\":\"等待一段時間\",\"autoAt\":\"到指定時間\",\"autoSeconds\":\"等待時長(秒)\",\"autoDate\":\"日期和時間\",\"autoInvalid\":\"請輸入正數時長或有效的日期和時間。\",\"autoDescription\":\"可提前手動繼續。\"},\"title\":\"檢查器\",\"sources\":{\"loading\":\"正在載入輸入來源…\",\"loadFailed\":\"無法載入輸入來源,請重新開啟選單重試。\",\"checkFailed\":\"無法檢查此來源。\",\"select\":\"選擇輸入來源\",\"title\":\"輸入來源\",\"sourceMissing\":\"原輸入來源已不存在,請重新選擇。\",\"outputMissing\":\"「{{source}}」中找不到「{{output}}」,請重新選擇。\",\"wholeObject\":\"整個物件\",\"fieldMissing\":\"「{{output}}」中已不再宣告欄位 {{field}},請重新選擇。\",\"notReady\":\"執行到這裡時,「{{source}} {{handle}}」可能還沒有值。\",\"sourceConflict\":\"這些欄位可能同時有值:{{sources}}。這裡只能取一個。\",\"incompatibleRight\":\"右值類型不符合此比較的要求。\",\"incompatible\":\"不相容\",\"unverified\":\"無法驗證\",\"schemaIncompatible\":\"資料格式不符。\",\"schemaPathIncompatible\":\"「{{path}}」的資料格式不符。\",\"schemaCompareFailed\":\"無法檢查資料格式,請檢查 JSON Schema。\",\"binaryIncompatible\":\"不能使用二進位資料。\",\"artifactIncompatible\":\"不能使用檔案資料。\",\"nullableIncompatible\":\"不能為空,但所選欄位可能為空。\",\"typeIncompatible\":\"需要{{target}},但所選欄位是{{source}}。\",\"propertyTypeIncompatible\":\"「{{path}}」需要{{target}},實際是{{source}}。\",\"requiredIncompatible\":\"不一定包含必填屬性「{{property}}」。\",\"enumIncompatible\":\"可能出現不接受的值:{{values}}。\",\"constIncompatible\":\"只接受 {{target}},所選欄位固定為 {{source}}。\",\"constraintSubject\":\"「{{path}}」\",\"minLength\":\"{{subject}}至少需要 {{value}} 個字元。\",\"maxLength\":\"{{subject}}最多接受 {{value}} 個字元。\",\"pattern\":\"{{subject}}文字格式應符合 {{value}}。\",\"minimum\":\"{{subject}}不能小於 {{value}}。\",\"exclusiveMinimum\":\"{{subject}}必須大於 {{value}}。\",\"maximum\":\"{{subject}}不能大於 {{value}}。\",\"exclusiveMaximum\":\"{{subject}}必須小於 {{value}}。\",\"multipleOf\":\"{{subject}}必須是 {{value}} 的倍數。\",\"minItems\":\"{{subject}}至少需要 {{value}} 項。\",\"maxItems\":\"{{subject}}最多接受 {{value}} 項。\",\"minProperties\":\"{{subject}}至少需要 {{value}} 個屬性。\",\"maxProperties\":\"{{subject}}最多接受 {{value}} 個屬性。\",\"integer\":\"整數\",\"unknownType\":\"未知類型\",\"typeSeparator\":\"或\"},\"actions\":{\"flowAccess\":\"可用服務\",\"flowAccessHint\":\"管理此 Flow 中所有 Code 節點共用的連線\",\"chooseConnection\":\"選擇 {{provider}} Connection\",\"connectionDescription\":\"Connection 將寫入這次呼叫;是否允許使用仍由 Flow Provider Access 決定。\",\"title\":\"程式碼可呼叫的動作\",\"search\":\"搜尋應用程式或動作…\",\"description\":\"搜尋並新增這段程式碼需要呼叫的動作。\",\"empty\":\"沒有符合的 Action。\",\"remove\":\"移除\",\"default\":\"預設帳號\",\"defaultHint\":\"呼叫時未指定帳號,將使用此帳號。\",\"removeAction\":\"移除動作\",\"explicit\":\"在程式碼中明確選擇\",\"connect\":\"連接帳號\",\"refresh\":\"重新整理帳號\",\"aliases\":\"同步帳號別名\",\"add\":\"新增動作\",\"cancel\":\"取消\",\"loading\":\"搜尋中…\",\"needsAccount\":\"待連接帳號\",\"accounts\":\"{{count}} 個帳號\",\"public\":\"無需帳號\",\"allowed\":\"可用帳號\",\"unavailable\":\"無法使用\",\"details\":\"帳號詳情\",\"example\":\"呼叫範例\",\"syntax\":\"呼叫寫法\",\"nested\":\"分層寫法\",\"fullId\":\"完整 ID\",\"copy\":\"複製\",\"copied\":\"已複製\",\"copyError\":\"複製失敗,請選取範例程式碼手動複製。\",\"introDescription\":\"依需求新增動作,透過 {{context}} 呼叫外部應用程式。\",\"insertAction\":\"插入程式碼\",\"chooseAccounts\":\"管理帳號\"},\"comment\":{\"markdown\":\"Markdown\",\"preview\":\"預覽\"},\"ports\":{\"reorder\":\"調整 {{name}} 的順序\",\"reorderHint\":\"拖動調整組內順序,或聚焦後使用上、下方向鍵。\",\"moved\":\"{{name}} 已移至第 {{position}} 位。\",\"groupSettings\":\"群組設定\",\"connected\":\"已連接\",\"sort\":\"排序\",\"finishSorting\":\"完成排序\",\"inputsTitle\":\"輸入\",\"requiredInputs\":\"必填\",\"optionalInputs\":\"選填\",\"noInputs\":\"此節點不需要輸入資料\",\"noOutputs\":\"此節點不提供輸出資料\",\"outputsTitle\":\"輸出\",\"valuesTitle\":\"資料\",\"columnHandle\":\"Handle\",\"columnName\":\"名稱\",\"columnType\":\"類型\",\"columnValue\":\"值\",\"builtIn\":{\"cron\":{\"scheduledAt\":\"本次執行的排程觸發時間,採用 ISO 8601 格式。\"},\"webhook\":{\"headers\":\"此 Webhook 請求攜帶的請求標頭。\",\"query\":\"此 Webhook 請求攜帶的 URL 查詢參數。\",\"body\":\"此 Webhook 請求攜帶的請求本文。\",\"webhookUrl\":\"接收此次請求的 Webhook URL,不含查詢參數。\"}},\"startParametersTitle\":\"啟動參數\"}}"),
|
|
8978
9148
|
language: { "label": "語言" },
|
|
@@ -10056,7 +10226,10 @@ var resources = {
|
|
|
10056
10226
|
"discardTitle": "放棄變更?",
|
|
10057
10227
|
"discardDescription": "工作流程設定的變更尚未儲存。",
|
|
10058
10228
|
"continueEditing": "繼續編輯",
|
|
10059
|
-
"discardChanges": "放棄變更"
|
|
10229
|
+
"discardChanges": "放棄變更",
|
|
10230
|
+
"icon": "圖示",
|
|
10231
|
+
"resetIcon": "重設圖示",
|
|
10232
|
+
"description": "說明"
|
|
10060
10233
|
},
|
|
10061
10234
|
flowState: {
|
|
10062
10235
|
"title": "持久化資料",
|
|
@@ -10070,7 +10243,7 @@ var resources = {
|
|
|
10070
10243
|
"clear": "清空",
|
|
10071
10244
|
"orphaned": "目前檢視之外",
|
|
10072
10245
|
"nearLimit": "此工作流的去重記錄已使用至少 80%。請清理不再需要的記錄。",
|
|
10073
|
-
"
|
|
10246
|
+
"usage": "用量",
|
|
10074
10247
|
"scope": "範圍",
|
|
10075
10248
|
"refresh": "重新整理",
|
|
10076
10249
|
"cancel": "取消",
|
|
@@ -10098,7 +10271,7 @@ var resources = {
|
|
|
10098
10271
|
"pendingClear": "{{count}} 筆待提交,相關執行結束或取消後可清理。",
|
|
10099
10272
|
"clearBlocked": "這些記錄尚待提交。請等待相關執行結束或取消後再重新整理。",
|
|
10100
10273
|
"clearSource": "清空{{name}}",
|
|
10101
|
-
"
|
|
10274
|
+
"sourceUsage": "{{name}}用量",
|
|
10102
10275
|
"confirmTitle": "清空「{{name}}」?",
|
|
10103
10276
|
"confirmValues": "將清空{{scope}}環境儲存的 {{count}} 筆資料,後續執行將無法讀取這些值。",
|
|
10104
10277
|
"confirmHistory": "將清空{{scope}}環境的 {{count}} 筆去重記錄,這些項目之後可能再次被處理。",
|
|
@@ -10109,6 +10282,14 @@ var resources = {
|
|
|
10109
10282
|
"loadFailed": "載入失敗",
|
|
10110
10283
|
"valuesHelp": "{{name}}:工作流主動儲存的內容,後續執行可以繼續讀取。",
|
|
10111
10284
|
"historyHelp": "{{name}}:項目的識別標記,用來避免重複處理。"
|
|
10285
|
+
},
|
|
10286
|
+
workflowTransfer: {
|
|
10287
|
+
"includeDependencies": "包含參照的工作流程",
|
|
10288
|
+
"workflowCount": "{{count}} 個工作流程",
|
|
10289
|
+
"unavailable": "{{count}} 個參照的工作流程無法使用。",
|
|
10290
|
+
"export": "匯出",
|
|
10291
|
+
"hostUnsupported": "目前的宿主尚未支援匯入工作流程套件。",
|
|
10292
|
+
"unnamed": "未命名工作流程"
|
|
10112
10293
|
}
|
|
10113
10294
|
},
|
|
10114
10295
|
"ja": {
|
|
@@ -10334,14 +10515,24 @@ var resources = {
|
|
|
10334
10515
|
"exportFlow": "ワークフローをエクスポート",
|
|
10335
10516
|
"exportPng": "PNG 画像をエクスポート",
|
|
10336
10517
|
"exportPngFrame": "フレームを表示",
|
|
10518
|
+
"exportPngCompact": "コンパクトな配置",
|
|
10337
10519
|
"exportPngLight": "ライト",
|
|
10338
10520
|
"exportPngDark": "ダーク",
|
|
10339
|
-
"exportPngPending": "PNG をエクスポート中…",
|
|
10340
|
-
"exportPngPendingDescription": "ワークフローと画像を準備しています。画像が大きい場合は時間がかかることがあります。",
|
|
10341
10521
|
"exportPngComplete": "PNG 画像をエクスポートしました。",
|
|
10342
10522
|
"exportPngPartial": "PNG 画像をエクスポートしました。一部の画像はプレースホルダーに置き換えられました。",
|
|
10343
10523
|
"exportPngFailed": "PNG 画像をエクスポートできませんでした。もう一度お試しください。",
|
|
10344
|
-
"importInvalid": "無効または未対応のワークフローファイルです。"
|
|
10524
|
+
"importInvalid": "無効または未対応のワークフローファイルです。",
|
|
10525
|
+
"exportPngAspectRatio": "キャンバス比率",
|
|
10526
|
+
"exportPngAuto": "自動",
|
|
10527
|
+
"exportPngLayout": "レイアウト",
|
|
10528
|
+
"exportPngOriginal": "元の配置",
|
|
10529
|
+
"exportPngTheme": "テーマ",
|
|
10530
|
+
"exportPngPreview": "プレビュー",
|
|
10531
|
+
"exportPngPreviewPending": "プレビューを生成中…",
|
|
10532
|
+
"exportPngPreviewFailed": "プレビューを生成できませんでした。",
|
|
10533
|
+
"exportPngPreviewPartial": "一部の画像を読み込めず、代替画像に置き換えました。",
|
|
10534
|
+
"exportPngDownload": "PNG をダウンロード",
|
|
10535
|
+
"exportPngPreviewRetry": "再試行"
|
|
10345
10536
|
},
|
|
10346
10537
|
inspector: /* @__PURE__ */ JSON.parse("{\"outline\":\"ノード一覧\",\"backToOutline\":\"ノード一覧に戻る\",\"emptyOutline\":\"ノードはまだありません\",\"triggers\":\"トリガー\",\"nodes\":\"ノード\",\"multipleSelected\":\"{{count}} 個のノードを選択中\",\"account\":{\"contactAdmin\":\"この操作を実行する権限がありません。管理者にお問い合わせください。\",\"accessTitle\":\"アクセス権限\",\"manageFlowAccess\":\"Code で使用できる接続\",\"configureAccess\":\"アカウントを選択\",\"manageAccount\":\"アカウントを管理\",\"required\":\"アカウント接続が必要\",\"addAccount\":\"アカウントを追加\",\"manage\":\"管理\",\"authorizationPending\":\"Connection ページで認証を完了してください。ここに戻ると、このアカウントが更新されます。\",\"chooseAccount\":\"アカウントを選択\",\"deferred\":\"今は設定しない\",\"clearDeferred\":\"選択をクリア\",\"noAccounts\":\"利用可能なアカウントがありません\",\"connectBeforeRun\":\"このノードを実行または公開するには、先に {{service}} を接続してください。\",\"connectService\":\"{{service}} を接続\",\"connection\":\"Connection\",\"loading\":\"Connection を読み込み中…\",\"oomolBuiltIn\":\"OOMOL 組み込みアカウント\",\"missing\":\"このノードで選択されたアカウントは現在利用できません。別のアカウントを選択するか、アカウントを管理してください。\",\"refreshFailed\":\"Connection を更新できませんでした。\",\"retry\":\"再試行\",\"status\":{\"disconnected\":\"この Connection は切断されています。再接続するか、別のアカウントを選択してください。\",\"error\":\"この Connection にエラーがあります。修復するか、別のアカウントを選択してください。\",\"reauth_required\":\"この Connection は再認証が必要です。再接続するか、別のアカウントを選択してください。\"},\"statusUnavailable\":\"{{action}} の Connection 状態を取得できません。\",\"teamDefault\":\"チームのデフォルト\",\"title\":\"アカウント\",\"unavailable\":\"利用不可\"},\"close\":\"インスペクターを閉じる\",\"configurationRequired\":\"設定が必要\",\"diagnostics\":\"診断\",\"errors\":{\"jsonObject\":\"{{label}} は JSON オブジェクトである必要があります。\",\"portDefinitions\":\"有効なポート定義を入力してください。\"},\"node\":{\"nameDuplicate\":\"このグラフには同じ名前のノードが既に存在します。\",\"nameEmpty\":\"ノード名を空にすることはできません。\",\"timeout\":\"タイムアウト(ミリ秒)\",\"maxExecutions\":\"ノード実行上限\",\"maxExecutionsError\":\"ノード実行上限は正の整数で指定してください。\",\"timeoutError\":\"タイムアウトはミリ秒単位の正の整数で指定してください。\",\"title\":\"ノード設定\",\"description\":\"目的\",\"describe\":\"このステップの目的を記述します。\",\"icon\":\"アイコン\",\"name\":\"タイトル\",\"retry\":\"失敗時の再試行\",\"retryCount\":\"最大 {{count}} 回再試行\",\"retryInterval\":\"再試行の間隔\",\"retryError\":\"間隔は 1~60 の整数秒で指定してください。\",\"retryHint\":\"再試行回数は、初回の実行に失敗した後に追加する試行の回数です。再試行はノード全体を再実行するため、外部操作が重複する場合があります。タイムアウトには全試行と待機時間を含みます。\",\"retryNone\":\"再試行しない\",\"retrySeconds\":\"秒\",\"retryHelp\":\"再試行について\",\"retryOnce\":\"最大 1 回再試行\",\"onError\":\"失敗時の処理\",\"onErrorStop\":\"ワークフローを停止\",\"onErrorOutput\":\"error ポートに出力\",\"onErrorHelp\":\"失敗時の処理について\",\"onErrorHint\":\"再試行後も失敗した場合、システム error にエラーを出力して既存の接続で続行します。成功時は null です。キャンセル、タイムアウト、リソース制限、結果不明の場合は停止します。\",\"systemOutputs\":\"システム出力\",\"systemError\":\"エラー情報(システム)\",\"errorFields\":{\"error\":\"ノードが失敗した場合のエラー情報。成功時は null です。\",\"code\":\"エラーの種類を識別するコード。\",\"message\":\"機密情報をマスクしたエラーの説明。\",\"nodeId\":\"エラーが発生したノードの ID。\",\"nodeName\":\"エラー発生時のノード名。\",\"runId\":\"今回のワークフロー実行の ID。\",\"executionId\":\"今回のノード実行の ID。再試行でも同じ ID を使用します。\"}},\"selectNode\":\"ドラフトのノードを 1 つ選択すると、内容を確認して編集できます。\",\"locateNode\":\"キャンバス上でこのノードを表示\",\"task\":{\"sharedPermissions\":\"Flow の共有権限グループを使用\",\"sharedPermissionsHint\":\"Flow の共有権限グループで許可されたすべての Action を使用します。個別の追加は不要です。\",\"httpHosts\":\"HTTP ホスト\",\"httpHostsHint\":\"1 行に 1 ホスト。*.example.com はサブドメインに一致します。\",\"httpHostsInvalid\":\"「{{host}}」は有効なホストではありません。api.example.com のようなホスト名を入力してください。\",\"httpHostsLimit\":\"宣言できるホストは最大 {{count}} 個です。\",\"addAction\":\"Action を追加\",\"removeAction\":\"Action を削除\",\"actionAccount\":\"アカウント\",\"chooseAccount\":\"アカウントを選択\",\"permissionSaveFailed\":\"Code の権限を保存できませんでした。再試行してください。\",\"chatText\":\"チャットテキスト\",\"connectorAction\":\"Connector アクション\",\"definition\":\"タスク定義\",\"discardCode\":\"変更を破棄\",\"editorLoading\":\"エディターを読み込み中…\",\"editorUnavailable\":\"コードエディターを読み込めませんでした。\",\"inputPorts\":\"入力ポート\",\"javascriptModule\":\"コード\",\"missing\":\"参照しているタスクが存在しません。\",\"outputPorts\":\"出力ポート\",\"responseMode\":\"応答モード\",\"source\":\"ソースコード\",\"structuredJson\":\"構造化 JSON\",\"retrySave\":\"保存を再試行\",\"additionalInputs\":\"追加入力\",\"httpHostsUpdated\":\"ホスト設定が別の場所で更新されました。最新の設定を読み込みました。確認してから保存してください。\"},\"wait\":{\"approval\":\"承認または拒否\",\"changeNotification\":\"変更\",\"continue\":\"続行\",\"mode\":\"処理方法\",\"inputsLoading\":\"通知パラメーターを読み込んでいます…\",\"pendingDescription\":\"確認待ち出力は待機開始時に一度だけ発火し、確認リンクと関連データを提供します。接続先でメッセージの送信や他のステップを実行できます。\",\"prompt\":\"プロンプト\",\"promptError\":\"プロンプトは1〜1,000文字で入力してください。\",\"autoContinue\":\"自動続行\",\"autoOff\":\"オフ\",\"autoAfter\":\"一定時間後\",\"autoAt\":\"指定日時\",\"autoSeconds\":\"待機時間(秒)\",\"autoDate\":\"日時\",\"autoInvalid\":\"正の待機時間または有効な日時を入力してください。\",\"autoDescription\":\"予定時刻前に手動で続行できます。\"},\"title\":\"インスペクター\",\"sources\":{\"loading\":\"入力元を読み込み中…\",\"loadFailed\":\"入力元を読み込めません。メニューを開き直してください。\",\"checkFailed\":\"このソースを確認できませんでした。\",\"select\":\"入力元を選択\",\"title\":\"入力元\",\"sourceMissing\":\"元の入力元は存在しません。選択し直してください。\",\"outputMissing\":\"「{{source}}」に「{{output}}」が見つかりません。選択し直してください。\",\"wholeObject\":\"オブジェクト全体\",\"fieldMissing\":\"「{{output}}」にフィールド {{field}} が宣言されていません。選択し直してください。\",\"notReady\":\"ここを実行するとき、「{{source}} {{handle}}」にまだ値がない可能性があります。\",\"sourceConflict\":\"同時に値を持つ可能性があります:{{sources}}。ここでは 1 つだけ使用できます。\",\"incompatibleRight\":\"右辺の値の型はこの比較に対応していません。\",\"incompatible\":\"非互換\",\"unverified\":\"未検証\",\"schemaIncompatible\":\"データ形式が一致しません。\",\"schemaPathIncompatible\":\"「{{path}}」のデータ形式が一致しません。\",\"schemaCompareFailed\":\"データ形式を確認できません。JSON Schema を確認してください。\",\"binaryIncompatible\":\"バイナリデータは使用できません。\",\"artifactIncompatible\":\"ファイルデータは使用できません。\",\"nullableIncompatible\":\"値が必要ですが、選択したフィールドは空になる可能性があります。\",\"typeIncompatible\":\"{{target}}が必要ですが、選択したフィールドは{{source}}です。\",\"propertyTypeIncompatible\":\"「{{path}}」は{{target}}である必要がありますが、実際は{{source}}です。\",\"requiredIncompatible\":\"必須プロパティ「{{property}}」がない可能性があります。\",\"enumIncompatible\":\"使用できない値が含まれる可能性があります:{{values}}。\",\"constIncompatible\":\"{{target}}のみ使用できますが、選択したフィールドは常に {{source}} です。\",\"constraintSubject\":\"「{{path}}」は\",\"minLength\":\"{{subject}}少なくとも {{value}} 文字必要です。\",\"maxLength\":\"{{subject}}最大 {{value}} 文字です。\",\"pattern\":\"{{subject}}{{value}} に一致する必要があります。\",\"minimum\":\"{{subject}}{{value}} 未満にできません。\",\"exclusiveMinimum\":\"{{subject}}{{value}} より大きい必要があります。\",\"maximum\":\"{{subject}}{{value}} を超えられません。\",\"exclusiveMaximum\":\"{{subject}}{{value}} より小さい必要があります。\",\"multipleOf\":\"{{subject}}{{value}} の倍数である必要があります。\",\"minItems\":\"{{subject}}少なくとも {{value}} 項必要です。\",\"maxItems\":\"{{subject}}最大 {{value}} 項です。\",\"minProperties\":\"{{subject}}少なくとも {{value}} 個のプロパティが必要です。\",\"maxProperties\":\"{{subject}}最大 {{value}} 個のプロパティです。\",\"integer\":\"整数\",\"unknownType\":\"不明な型\",\"typeSeparator\":\"または\"},\"actions\":{\"flowAccess\":\"利用可能なサービス\",\"flowAccessHint\":\"この Flow のすべての Code ノードで共有する接続を管理\",\"chooseConnection\":\"{{provider}} Connection を選択\",\"connectionDescription\":\"Connection はこの呼び出しに挿入されます。使用可否は引き続き Flow Provider Access によって制御されます。\",\"title\":\"このコードから呼び出せるアクション\",\"search\":\"Action を検索\",\"description\":\"このコードで使用する Action とアカウントを選択します。\",\"empty\":\"一致する Action はありません。\",\"remove\":\"削除\",\"default\":\"既定のアカウント\",\"defaultHint\":\"呼び出し時にアカウントを指定しない場合に使用します。\",\"removeAction\":\"アクションを削除\",\"explicit\":\"コード内で明示的に選択\",\"connect\":\"アカウントを接続\",\"refresh\":\"アカウントを更新\",\"aliases\":\"保存済みの別名を更新\",\"add\":\"アクションを追加\",\"cancel\":\"キャンセル\",\"loading\":\"検索中…\",\"needsAccount\":\"アカウントを接続\",\"accounts\":\"{{count}} アカウント\",\"public\":\"アカウント不要\",\"allowed\":\"使用するアカウント\",\"unavailable\":\"利用不可\",\"details\":\"接続の詳細\",\"example\":\"呼び出し例\",\"syntax\":\"呼び出し形式\",\"nested\":\"プロバイダー形式\",\"fullId\":\"完全な ID\",\"copy\":\"コピー\",\"copied\":\"コピー済み\",\"copyError\":\"コピーできませんでした。コードを選択して手動でコピーしてください。\",\"introDescription\":\"必要に応じてアクションを追加し、{{context}} から外部アプリを呼び出せます。\",\"insertAction\":\"コードを挿入\",\"chooseAccounts\":\"アカウントを管理\"},\"comment\":{\"markdown\":\"Markdown\",\"preview\":\"プレビュー\"},\"ports\":{\"reorder\":\"{{name}} の順序を変更\",\"reorderHint\":\"ドラッグでグループ内の順序を変更。フォーカス時は上下キーでも移動できます。\",\"moved\":\"{{name}} を {{position}} 番目に移動しました。\",\"groupSettings\":\"グループ設定\",\"connected\":\"接続済み\",\"sort\":\"並べ替え\",\"finishSorting\":\"並べ替えを完了\",\"inputsTitle\":\"入力\",\"requiredInputs\":\"必須\",\"optionalInputs\":\"任意\",\"noInputs\":\"このノードには入力データが必要ありません。\",\"noOutputs\":\"このノードは出力データを提供しません。\",\"outputsTitle\":\"出力\",\"valuesTitle\":\"値\",\"columnHandle\":\"Handle\",\"columnName\":\"名前\",\"columnType\":\"型\",\"columnValue\":\"値\",\"builtIn\":{\"cron\":{\"scheduledAt\":\"この実行をトリガーした予定時刻(ISO 8601 形式)です。\"},\"webhook\":{\"headers\":\"この Webhook リクエストで受信したリクエストヘッダーです。\",\"query\":\"この Webhook リクエストで受信した URL クエリパラメーターです。\",\"body\":\"この Webhook リクエストで受信したリクエストボディです。\",\"webhookUrl\":\"このリクエストを受信した Webhook URL(クエリパラメーターを除く)です。\"}},\"startParametersTitle\":\"開始パラメーター\"}}"),
|
|
10347
10538
|
language: { "label": "言語" },
|
|
@@ -11425,7 +11616,10 @@ var resources = {
|
|
|
11425
11616
|
"discardTitle": "変更を破棄しますか?",
|
|
11426
11617
|
"discardDescription": "ワークフロー設定の変更は保存されていません。",
|
|
11427
11618
|
"continueEditing": "編集を続ける",
|
|
11428
|
-
"discardChanges": "変更を破棄"
|
|
11619
|
+
"discardChanges": "変更を破棄",
|
|
11620
|
+
"icon": "アイコン",
|
|
11621
|
+
"resetIcon": "アイコンをリセット",
|
|
11622
|
+
"description": "説明"
|
|
11429
11623
|
},
|
|
11430
11624
|
flowState: {
|
|
11431
11625
|
"title": "永続データ",
|
|
@@ -11439,7 +11633,7 @@ var resources = {
|
|
|
11439
11633
|
"clear": "消去",
|
|
11440
11634
|
"orphaned": "現在のビューの外",
|
|
11441
11635
|
"nearLimit": "フローの重複履歴が 80% 以上使用されています。不要な履歴を削除してください。",
|
|
11442
|
-
"
|
|
11636
|
+
"usage": "使用量",
|
|
11443
11637
|
"scope": "スコープ",
|
|
11444
11638
|
"refresh": "更新",
|
|
11445
11639
|
"cancel": "キャンセル",
|
|
@@ -11467,7 +11661,7 @@ var resources = {
|
|
|
11467
11661
|
"pendingClear": "{{count}} 件が確定待ちです。関連する実行の完了またはキャンセル後に消去できます。",
|
|
11468
11662
|
"clearBlocked": "確定待ちの記録があります。関連する実行の完了またはキャンセル後に更新してください。",
|
|
11469
11663
|
"clearSource": "{{name}}を消去",
|
|
11470
|
-
"
|
|
11664
|
+
"sourceUsage": "{{name}}の使用量",
|
|
11471
11665
|
"confirmTitle": "「{{name}}」を消去しますか?",
|
|
11472
11666
|
"confirmValues": "{{scope}}環境の保存データ {{count}} 件を消去します。以降の実行ではこれらの値を読み取れなくなります。",
|
|
11473
11667
|
"confirmHistory": "{{scope}}環境の重複排除記録 {{count}} 件を消去します。これらの項目が再処理される場合があります。",
|
|
@@ -11478,6 +11672,14 @@ var resources = {
|
|
|
11478
11672
|
"loadFailed": "読み込みに失敗しました",
|
|
11479
11673
|
"valuesHelp": "{{name}}:フローが明示的に保存し、後続の実行で読み取れる内容です。",
|
|
11480
11674
|
"historyHelp": "{{name}}:同じ項目を繰り返し処理しないための識別情報です。"
|
|
11675
|
+
},
|
|
11676
|
+
workflowTransfer: {
|
|
11677
|
+
"includeDependencies": "参照先のワークフローを含める",
|
|
11678
|
+
"workflowCount": "ワークフロー({{count}} 件)",
|
|
11679
|
+
"unavailable": "参照先のワークフロー {{count}} 件を利用できません。",
|
|
11680
|
+
"export": "エクスポート",
|
|
11681
|
+
"hostUnsupported": "このホストはワークフローバンドルのインポートにまだ対応していません。",
|
|
11682
|
+
"unnamed": "無題のワークフロー"
|
|
11481
11683
|
}
|
|
11482
11684
|
},
|
|
11483
11685
|
"ko": {
|
|
@@ -11703,14 +11905,24 @@ var resources = {
|
|
|
11703
11905
|
"exportFlow": "워크플로 내보내기",
|
|
11704
11906
|
"exportPng": "PNG 이미지 내보내기",
|
|
11705
11907
|
"exportPngFrame": "프레임 표시",
|
|
11908
|
+
"exportPngCompact": "간결한 배치",
|
|
11706
11909
|
"exportPngLight": "라이트",
|
|
11707
11910
|
"exportPngDark": "다크",
|
|
11708
|
-
"exportPngPending": "PNG 내보내는 중…",
|
|
11709
|
-
"exportPngPendingDescription": "워크플로와 이미지를 준비하고 있습니다. 이미지가 크면 시간이 더 걸릴 수 있습니다.",
|
|
11710
11911
|
"exportPngComplete": "PNG 이미지를 내보냈습니다.",
|
|
11711
11912
|
"exportPngPartial": "PNG 이미지를 내보냈습니다. 일부 이미지는 자리 표시자로 대체되었습니다.",
|
|
11712
11913
|
"exportPngFailed": "PNG 이미지를 내보내지 못했습니다. 다시 시도해 주세요.",
|
|
11713
|
-
"importInvalid": "잘못되었거나 지원하지 않는 워크플로 파일입니다."
|
|
11914
|
+
"importInvalid": "잘못되었거나 지원하지 않는 워크플로 파일입니다.",
|
|
11915
|
+
"exportPngAspectRatio": "캔버스 비율",
|
|
11916
|
+
"exportPngAuto": "자동",
|
|
11917
|
+
"exportPngLayout": "레이아웃",
|
|
11918
|
+
"exportPngOriginal": "원래 배치",
|
|
11919
|
+
"exportPngTheme": "테마",
|
|
11920
|
+
"exportPngPreview": "미리보기",
|
|
11921
|
+
"exportPngPreviewPending": "미리보기 생성 중…",
|
|
11922
|
+
"exportPngPreviewFailed": "미리보기를 생성하지 못했습니다.",
|
|
11923
|
+
"exportPngPreviewPartial": "일부 이미지를 불러오지 못해 대체 이미지로 표시했습니다.",
|
|
11924
|
+
"exportPngDownload": "PNG 다운로드",
|
|
11925
|
+
"exportPngPreviewRetry": "다시 시도"
|
|
11714
11926
|
},
|
|
11715
11927
|
inspector: /* @__PURE__ */ JSON.parse("{\"outline\":\"노드 목록\",\"backToOutline\":\"노드 목록으로 돌아가기\",\"emptyOutline\":\"아직 노드가 없습니다\",\"triggers\":\"트리거\",\"nodes\":\"노드\",\"multipleSelected\":\"노드 {{count}}개 선택됨\",\"account\":{\"contactAdmin\":\"이 작업을 실행할 권한이 없습니다. 관리자에게 문의하세요.\",\"accessTitle\":\"접근 권한\",\"manageFlowAccess\":\"Code에서 사용할 수 있는 연결\",\"configureAccess\":\"계정 선택\",\"manageAccount\":\"계정 관리\",\"required\":\"계정 연결 필요\",\"addAccount\":\"계정 추가\",\"manage\":\"관리\",\"authorizationPending\":\"Connection 페이지에서 인증을 마친 뒤 여기로 돌아와 이 계정을 새로 고치세요.\",\"chooseAccount\":\"계정 선택\",\"deferred\":\"지금은 설정하지 않음\",\"clearDeferred\":\"선택 지우기\",\"noAccounts\":\"사용 가능한 계정이 없습니다\",\"connectBeforeRun\":\"이 블록을 실행하거나 게시하려면 먼저 {{service}}에 연결하세요.\",\"connectService\":\"{{service}} 연결\",\"connection\":\"Connection\",\"loading\":\"Connection 불러오는 중…\",\"oomolBuiltIn\":\"OOMOL 기본 제공 계정\",\"missing\":\"이 노드에서 선택한 계정을 현재 사용할 수 없습니다. 다른 계정을 선택하거나 계정을 관리하세요.\",\"refreshFailed\":\"Connection을 새로 고치지 못했습니다.\",\"retry\":\"다시 시도\",\"status\":{\"disconnected\":\"이 Connection은 연결이 끊어졌습니다. 다시 연결하거나 다른 계정을 선택하세요.\",\"error\":\"이 Connection에 오류가 있습니다. 문제를 해결하거나 다른 계정을 선택하세요.\",\"reauth_required\":\"이 Connection은 다시 인증해야 합니다. 다시 연결하거나 다른 계정을 선택하세요.\"},\"statusUnavailable\":\"{{action}}의 Connection 상태를 확인할 수 없습니다.\",\"teamDefault\":\"팀 기본값\",\"title\":\"계정\",\"unavailable\":\"사용할 수 없음\"},\"close\":\"인스펙터 닫기\",\"configurationRequired\":\"설정 필요\",\"diagnostics\":\"진단\",\"errors\":{\"jsonObject\":\"{{label}} 값은 JSON 객체여야 합니다.\",\"portDefinitions\":\"올바른 포트 정의를 입력하세요.\"},\"node\":{\"nameDuplicate\":\"이 그래프에 같은 이름의 노드가 이미 있습니다.\",\"nameEmpty\":\"노드 이름은 비워 둘 수 없습니다.\",\"timeout\":\"제한 시간(ms)\",\"maxExecutions\":\"노드 실행 한도\",\"maxExecutionsError\":\"노드 실행 한도는 양의 정수여야 합니다.\",\"timeoutError\":\"제한 시간은 밀리초 단위의 양의 정수여야 합니다.\",\"title\":\"노드 설정\",\"description\":\"목적\",\"describe\":\"이 단계의 목적을 설명하세요.\",\"icon\":\"아이콘\",\"name\":\"제목\",\"retry\":\"실패 시 재시도\",\"retryCount\":\"최대 {{count}}회 재시도\",\"retryInterval\":\"재시도 간격\",\"retryError\":\"간격은 1~60초의 정수로 입력하세요.\",\"retryHint\":\"재시도 횟수는 최초 실행 실패 후 추가로 시도하는 횟수입니다. 노드 전체를 다시 실행하므로 외부 작업이 중복될 수 있습니다. 제한 시간에는 모든 시도와 대기 시간이 포함됩니다.\",\"retryNone\":\"재시도 안 함\",\"retrySeconds\":\"초\",\"retryHelp\":\"재시도 안내\",\"retryOnce\":\"최대 1회 재시도\",\"onError\":\"실패 처리\",\"onErrorStop\":\"워크플로 중지\",\"onErrorOutput\":\"error 포트로 출력\",\"onErrorHelp\":\"실패 처리 안내\",\"onErrorHint\":\"재시도 후에도 실패하면 시스템 error에 오류를 기록하고 기존 연결을 따라 계속합니다. 성공 시 null입니다. 취소, 시간 초과, 리소스 제한 및 결과 불명 상태는 실행을 중지합니다.\",\"systemOutputs\":\"시스템 출력\",\"systemError\":\"오류 정보(시스템)\",\"errorFields\":{\"error\":\"노드 실패 시 오류 정보입니다. 성공 시 null입니다.\",\"code\":\"오류 유형을 식별하는 코드입니다.\",\"message\":\"민감한 내용이 가려진 오류 설명입니다.\",\"nodeId\":\"오류가 발생한 노드의 ID입니다.\",\"nodeName\":\"오류 발생 시점의 노드 이름입니다.\",\"runId\":\"이번 워크플로 실행의 ID입니다.\",\"executionId\":\"이번 노드 실행의 ID입니다. 재시도에서도 같은 ID를 사용합니다.\"}},\"selectNode\":\"확인하고 편집할 초안 노드를 하나 선택하세요.\",\"locateNode\":\"캔버스에서 이 노드 위치 보기\",\"task\":{\"sharedPermissions\":\"Flow 공유 권한 그룹 사용\",\"sharedPermissionsHint\":\"Flow 공유 권한 그룹에서 승인한 모든 Action을 사용합니다. 개별적으로 추가할 필요가 없습니다.\",\"httpHosts\":\"HTTP 호스트\",\"httpHostsHint\":\"한 줄에 호스트 하나. *.example.com은 하위 도메인과 일치합니다.\",\"httpHostsInvalid\":\"\\\"{{host}}\\\"은(는) 올바른 호스트가 아닙니다. api.example.com 같은 호스트 이름을 입력하세요.\",\"httpHostsLimit\":\"호스트는 최대 {{count}}개까지 선언할 수 있습니다.\",\"addAction\":\"Action 추가\",\"removeAction\":\"Action 제거\",\"actionAccount\":\"계정\",\"chooseAccount\":\"계정 선택\",\"permissionSaveFailed\":\"Code 권한을 저장하지 못했습니다. 다시 시도하세요.\",\"chatText\":\"대화 텍스트\",\"connectorAction\":\"Connector 액션\",\"definition\":\"태스크 정의\",\"discardCode\":\"변경 사항 버리기\",\"editorLoading\":\"편집기 불러오는 중…\",\"editorUnavailable\":\"코드 편집기를 불러오지 못했습니다.\",\"inputPorts\":\"입력 포트\",\"javascriptModule\":\"코드\",\"missing\":\"참조된 태스크가 존재하지 않습니다.\",\"outputPorts\":\"출력 포트\",\"responseMode\":\"응답 모드\",\"source\":\"소스\",\"structuredJson\":\"구조화된 JSON\",\"retrySave\":\"저장 재시도\",\"additionalInputs\":\"추가 입력\",\"httpHostsUpdated\":\"다른 곳에서 호스트 설정이 변경되었습니다. 최신 설정을 불러왔습니다. 확인 후 저장하세요.\"},\"wait\":{\"approval\":\"승인 또는 거부\",\"changeNotification\":\"변경\",\"continue\":\"계속\",\"mode\":\"처리 방식\",\"inputsLoading\":\"알림 매개변수를 불러오는 중…\",\"pendingDescription\":\"확인 대기 출력은 대기가 시작될 때 한 번 실행되어 확인 링크와 관련 데이터를 제공합니다. 연결하여 메시지를 보내거나 다른 단계를 실행할 수 있습니다.\",\"prompt\":\"프롬프트\",\"promptError\":\"프롬프트는 1~1,000자여야 합니다.\",\"autoContinue\":\"자동 계속\",\"autoOff\":\"끄기\",\"autoAfter\":\"일정 시간 후\",\"autoAt\":\"지정 시간에\",\"autoSeconds\":\"대기 시간(초)\",\"autoDate\":\"날짜 및 시간\",\"autoInvalid\":\"양수 대기 시간 또는 유효한 날짜와 시간을 입력하세요.\",\"autoDescription\":\"예정 시간 전에 수동으로 계속할 수 있습니다.\"},\"title\":\"인스펙터\",\"sources\":{\"loading\":\"입력 소스 불러오는 중…\",\"loadFailed\":\"입력 소스를 불러올 수 없습니다. 메뉴를 다시 열어 주세요.\",\"checkFailed\":\"이 소스를 확인할 수 없습니다.\",\"select\":\"입력 소스 선택\",\"title\":\"입력 소스\",\"sourceMissing\":\"기존 입력 소스가 더 이상 존재하지 않습니다. 다시 선택하세요.\",\"outputMissing\":\"“{{source}}”에서 “{{output}}”을(를) 찾을 수 없습니다. 다시 선택하세요.\",\"wholeObject\":\"전체 객체\",\"fieldMissing\":\"“{{output}}”에 {{field}} 필드가 선언되어 있지 않습니다. 다시 선택하세요.\",\"notReady\":\"여기까지 실행될 때 “{{source}} {{handle}}”에 아직 값이 없을 수 있습니다.\",\"sourceConflict\":\"다음 필드에 값이 동시에 있을 수 있습니다: {{sources}}. 여기서는 하나만 사용할 수 있습니다.\",\"incompatibleRight\":\"오른쪽 값의 형식이 이 비교와 호환되지 않습니다.\",\"incompatible\":\"호환되지 않음\",\"unverified\":\"확인되지 않음\",\"schemaIncompatible\":\"데이터 형식이 일치하지 않습니다.\",\"schemaPathIncompatible\":\"“{{path}}”의 데이터 형식이 일치하지 않습니다.\",\"schemaCompareFailed\":\"데이터 형식을 확인할 수 없습니다. JSON Schema를 확인하세요.\",\"binaryIncompatible\":\"바이너리 데이터는 사용할 수 없습니다.\",\"artifactIncompatible\":\"파일 데이터는 사용할 수 없습니다.\",\"nullableIncompatible\":\"값이 필요하지만 선택한 필드는 비어 있을 수 있습니다.\",\"typeIncompatible\":\"{{target}}이(가) 필요하지만 선택한 필드는 {{source}}입니다.\",\"propertyTypeIncompatible\":\"“{{path}}”은(는) {{target}}이어야 하지만 실제로는 {{source}}입니다.\",\"requiredIncompatible\":\"필수 속성 “{{property}}”이(가) 없을 수 있습니다.\",\"enumIncompatible\":\"허용되지 않는 값이 포함될 수 있습니다: {{values}}.\",\"constIncompatible\":\"{{target}}만 허용되지만 선택한 필드는 항상 {{source}}입니다.\",\"constraintSubject\":\"“{{path}}”은(는) \",\"minLength\":\"{{subject}}최소 {{value}}자여야 합니다.\",\"maxLength\":\"{{subject}}최대 {{value}}자여야 합니다.\",\"pattern\":\"{{subject}}{{value}} 형식과 일치해야 합니다.\",\"minimum\":\"{{subject}}{{value}}보다 작을 수 없습니다.\",\"exclusiveMinimum\":\"{{subject}}{{value}}보다 커야 합니다.\",\"maximum\":\"{{subject}}{{value}}보다 클 수 없습니다.\",\"exclusiveMaximum\":\"{{subject}}{{value}}보다 작아야 합니다.\",\"multipleOf\":\"{{subject}}{{value}}의 배수여야 합니다.\",\"minItems\":\"{{subject}}최소 {{value}}개 항목이 필요합니다.\",\"maxItems\":\"{{subject}}최대 {{value}}개 항목을 허용합니다.\",\"minProperties\":\"{{subject}}최소 {{value}}개 속성이 필요합니다.\",\"maxProperties\":\"{{subject}}최대 {{value}}개 속성을 허용합니다.\",\"integer\":\"정수\",\"unknownType\":\"알 수 없는 유형\",\"typeSeparator\":\" 또는 \"},\"actions\":{\"flowAccess\":\"사용 가능한 서비스\",\"flowAccessHint\":\"이 Flow의 모든 Code 노드가 공유하는 연결 관리\",\"chooseConnection\":\"{{provider}} Connection 선택\",\"connectionDescription\":\"Connection이 이 호출에 삽입됩니다. 사용 가능 여부는 계속 Flow Provider Access에서 제어합니다.\",\"title\":\"이 코드에서 호출할 수 있는 작업\",\"search\":\"Action 검색\",\"description\":\"이 코드에서 사용할 Action과 계정을 선택하세요.\",\"empty\":\"일치하는 Action이 없습니다.\",\"remove\":\"제거\",\"default\":\"기본 계정\",\"defaultHint\":\"호출 시 계정을 지정하지 않으면 이 계정을 사용합니다.\",\"removeAction\":\"액션 제거\",\"explicit\":\"코드에서 명시적으로 선택\",\"connect\":\"계정 연결\",\"refresh\":\"계정 새로 고침\",\"aliases\":\"저장된 별칭 업데이트\",\"add\":\"액션 추가\",\"cancel\":\"취소\",\"loading\":\"검색 중…\",\"needsAccount\":\"계정 연결 필요\",\"accounts\":\"계정 {{count}}개\",\"public\":\"계정 불필요\",\"allowed\":\"사용할 계정\",\"unavailable\":\"사용 불가\",\"details\":\"연결 세부 정보\",\"example\":\"호출 예제\",\"syntax\":\"호출 형식\",\"nested\":\"계층형\",\"fullId\":\"전체 ID\",\"copy\":\"복사\",\"copied\":\"복사됨\",\"copyError\":\"복사하지 못했습니다. 코드를 선택하여 직접 복사하세요.\",\"introDescription\":\"필요한 작업을 추가하고 {{context}}로 외부 앱을 호출하세요.\",\"insertAction\":\"코드 삽입\",\"chooseAccounts\":\"계정 관리\"},\"comment\":{\"markdown\":\"Markdown\",\"preview\":\"미리보기\"},\"ports\":{\"reorder\":\"{{name}} 순서 변경\",\"reorderHint\":\"그룹 안에서 드래그하거나 포커스 후 위 / 아래 키로 순서를 변경하세요.\",\"moved\":\"{{name}}이(가) {{position}}번째로 이동했습니다.\",\"groupSettings\":\"그룹 설정\",\"connected\":\"연결됨\",\"sort\":\"순서 변경\",\"finishSorting\":\"순서 변경 완료\",\"inputsTitle\":\"입력\",\"requiredInputs\":\"필수\",\"optionalInputs\":\"선택\",\"noInputs\":\"이 노드에는 입력 데이터가 필요하지 않습니다.\",\"noOutputs\":\"이 노드는 출력 데이터를 제공하지 않습니다.\",\"outputsTitle\":\"출력\",\"valuesTitle\":\"값\",\"columnHandle\":\"Handle\",\"columnName\":\"이름\",\"columnType\":\"유형\",\"columnValue\":\"값\",\"builtIn\":{\"cron\":{\"scheduledAt\":\"이 실행을 트리거한 예약 시간이며 ISO 8601 형식입니다.\"},\"webhook\":{\"headers\":\"이 Webhook 요청과 함께 수신된 요청 헤더입니다.\",\"query\":\"이 Webhook 요청과 함께 수신된 URL 쿼리 매개변수입니다.\",\"body\":\"이 Webhook 요청과 함께 수신된 요청 본문입니다.\",\"webhookUrl\":\"이 요청을 수신한 Webhook URL이며 쿼리 매개변수는 포함하지 않습니다.\"}},\"startParametersTitle\":\"시작 매개변수\"}}"),
|
|
11716
11928
|
language: { "label": "언어" },
|
|
@@ -12794,7 +13006,10 @@ var resources = {
|
|
|
12794
13006
|
"discardTitle": "변경 사항을 버릴까요?",
|
|
12795
13007
|
"discardDescription": "워크플로 설정의 변경 사항이 저장되지 않았습니다.",
|
|
12796
13008
|
"continueEditing": "계속 편집",
|
|
12797
|
-
"discardChanges": "변경 사항 버리기"
|
|
13009
|
+
"discardChanges": "변경 사항 버리기",
|
|
13010
|
+
"icon": "아이콘",
|
|
13011
|
+
"resetIcon": "아이콘 초기화",
|
|
13012
|
+
"description": "설명"
|
|
12798
13013
|
},
|
|
12799
13014
|
flowState: {
|
|
12800
13015
|
"title": "영구 데이터",
|
|
@@ -12808,7 +13023,7 @@ var resources = {
|
|
|
12808
13023
|
"clear": "지우기",
|
|
12809
13024
|
"orphaned": "현재 보기 외부",
|
|
12810
13025
|
"nearLimit": "Flow 중복 기록이 80% 이상 찼습니다. 필요 없는 기록을 지우세요.",
|
|
12811
|
-
"
|
|
13026
|
+
"usage": "사용량",
|
|
12812
13027
|
"scope": "범위",
|
|
12813
13028
|
"refresh": "새로 고침",
|
|
12814
13029
|
"cancel": "취소",
|
|
@@ -12836,7 +13051,7 @@ var resources = {
|
|
|
12836
13051
|
"pendingClear": "{{count}}개 확정 대기 중. 관련 실행이 완료되거나 취소된 후 지울 수 있습니다.",
|
|
12837
13052
|
"clearBlocked": "확정 대기 중인 기록이 있습니다. 관련 실행을 완료하거나 취소한 후 새로 고침하세요.",
|
|
12838
13053
|
"clearSource": "{{name}} 지우기",
|
|
12839
|
-
"
|
|
13054
|
+
"sourceUsage": "{{name}} 사용량",
|
|
12840
13055
|
"confirmTitle": "{{name}}을(를) 지울까요?",
|
|
12841
13056
|
"confirmValues": "{{scope}} 환경에 저장된 데이터 {{count}}개를 지웁니다. 이후 실행에서 이 값을 읽을 수 없습니다.",
|
|
12842
13057
|
"confirmHistory": "{{scope}} 환경의 중복 제거 기록 {{count}}개를 지웁니다. 해당 항목이 다시 처리될 수 있습니다.",
|
|
@@ -12847,6 +13062,14 @@ var resources = {
|
|
|
12847
13062
|
"loadFailed": "불러오기 실패",
|
|
12848
13063
|
"valuesHelp": "{{name}}: 워크플로가 직접 저장하여 이후 실행에서 읽을 수 있는 내용입니다.",
|
|
12849
13064
|
"historyHelp": "{{name}}: 같은 항목을 반복 처리하지 않기 위한 식별 정보입니다."
|
|
13065
|
+
},
|
|
13066
|
+
workflowTransfer: {
|
|
13067
|
+
"includeDependencies": "참조된 워크플로 포함",
|
|
13068
|
+
"workflowCount": "워크플로 {{count}}개",
|
|
13069
|
+
"unavailable": "참조된 워크플로 {{count}}개를 사용할 수 없습니다.",
|
|
13070
|
+
"export": "내보내기",
|
|
13071
|
+
"hostUnsupported": "이 호스트는 아직 워크플로 번들 가져오기를 지원하지 않습니다.",
|
|
13072
|
+
"unnamed": "이름 없는 워크플로"
|
|
12850
13073
|
}
|
|
12851
13074
|
},
|
|
12852
13075
|
"ru": {
|
|
@@ -13072,14 +13295,24 @@ var resources = {
|
|
|
13072
13295
|
"exportFlow": "Экспортировать процесс",
|
|
13073
13296
|
"exportPng": "Экспорт изображения PNG",
|
|
13074
13297
|
"exportPngFrame": "Показать рамку",
|
|
13298
|
+
"exportPngCompact": "Компактная компоновка",
|
|
13075
13299
|
"exportPngLight": "Светлая",
|
|
13076
13300
|
"exportPngDark": "Тёмная",
|
|
13077
|
-
"exportPngPending": "Экспорт PNG…",
|
|
13078
|
-
"exportPngPendingDescription": "Подготовка рабочего процесса и изображений. Большие изображения могут потребовать больше времени.",
|
|
13079
13301
|
"exportPngComplete": "Изображение PNG экспортировано.",
|
|
13080
13302
|
"exportPngPartial": "Изображение PNG экспортировано. Некоторые изображения заменены заглушками.",
|
|
13081
13303
|
"exportPngFailed": "Не удалось экспортировать изображение PNG. Повторите попытку.",
|
|
13082
|
-
"importInvalid": "Некорректный или неподдерживаемый файл процесса."
|
|
13304
|
+
"importInvalid": "Некорректный или неподдерживаемый файл процесса.",
|
|
13305
|
+
"exportPngAspectRatio": "Пропорции холста",
|
|
13306
|
+
"exportPngAuto": "Авто",
|
|
13307
|
+
"exportPngLayout": "Компоновка",
|
|
13308
|
+
"exportPngOriginal": "Исходная",
|
|
13309
|
+
"exportPngTheme": "Тема",
|
|
13310
|
+
"exportPngPreview": "Предпросмотр",
|
|
13311
|
+
"exportPngPreviewPending": "Создание предпросмотра…",
|
|
13312
|
+
"exportPngPreviewFailed": "Не удалось создать предпросмотр.",
|
|
13313
|
+
"exportPngPreviewPartial": "Некоторые изображения заменены заглушками.",
|
|
13314
|
+
"exportPngDownload": "Скачать PNG",
|
|
13315
|
+
"exportPngPreviewRetry": "Повторить"
|
|
13083
13316
|
},
|
|
13084
13317
|
inspector: /* @__PURE__ */ JSON.parse("{\"outline\":\"Список узлов\",\"backToOutline\":\"Вернуться к списку узлов\",\"emptyOutline\":\"Узлов пока нет\",\"triggers\":\"Триггеры\",\"nodes\":\"Узлы\",\"multipleSelected\":\"Выбрано узлов: {{count}}\",\"account\":{\"contactAdmin\":\"У вас нет прав для выполнения этой операции. Обратитесь к администратору.\",\"accessTitle\":\"Права доступа\",\"manageFlowAccess\":\"Подключения, доступные Code\",\"configureAccess\":\"Выбрать аккаунт\",\"manageAccount\":\"Управление аккаунтами\",\"required\":\"Требуется подключение аккаунта\",\"addAccount\":\"Добавить аккаунт\",\"manage\":\"Управление\",\"authorizationPending\":\"Завершите авторизацию на странице Connection, затем вернитесь сюда, чтобы обновить этот аккаунт.\",\"chooseAccount\":\"Выберите аккаунт\",\"deferred\":\"Пока не настраивать\",\"clearDeferred\":\"Сбросить выбор\",\"noAccounts\":\"Нет доступных аккаунтов\",\"connectBeforeRun\":\"Подключите {{service}}, чтобы этот узел можно было запускать и публиковать.\",\"connectService\":\"Подключить {{service}}\",\"connection\":\"Connection\",\"loading\":\"Загрузка Connection…\",\"oomolBuiltIn\":\"Встроенный аккаунт OOMOL\",\"missing\":\"Выбранный для этого узла аккаунт недоступен. Выберите другой аккаунт или откройте управление подключениями.\",\"refreshFailed\":\"Не удалось обновить Connection.\",\"retry\":\"Повторить\",\"status\":{\"disconnected\":\"Этот Connection отключён. Подключите его заново или выберите другой аккаунт.\",\"error\":\"В этом Connection ошибка. Исправьте её или выберите другой аккаунт.\",\"reauth_required\":\"Этому Connection нужна повторная авторизация. Подключите его заново или выберите другой аккаунт.\"},\"statusUnavailable\":\"Статус Connection недоступен для {{action}}.\",\"teamDefault\":\"По умолчанию для команды\",\"title\":\"Аккаунт\",\"unavailable\":\"недоступно\"},\"close\":\"Закрыть инспектор\",\"configurationRequired\":\"Требуется настройка\",\"diagnostics\":\"Диагностика\",\"errors\":{\"jsonObject\":\"{{label}} должен быть JSON-объектом.\",\"portDefinitions\":\"Введите корректные определения портов.\"},\"node\":{\"nameDuplicate\":\"Узел с таким именем уже существует в этом графе.\",\"nameEmpty\":\"Имя узла не может быть пустым.\",\"timeout\":\"Время ожидания (мс)\",\"maxExecutions\":\"Лимит выполнений узла\",\"maxExecutionsError\":\"Лимит выполнений узла должен быть положительным целым числом.\",\"timeoutError\":\"Время ожидания должно быть положительным целым числом в миллисекундах.\",\"title\":\"Настройки узла\",\"description\":\"Назначение\",\"describe\":\"Опишите назначение этого шага.\",\"icon\":\"Значок\",\"name\":\"Заголовок\",\"retry\":\"Повторять при ошибке\",\"retryCount\":\"До {{count}} повторов\",\"retryInterval\":\"Интервал повторов\",\"retryError\":\"Укажите целый интервал от 1 до 60 секунд.\",\"retryHint\":\"Число повторов означает дополнительные попытки после неудачной первой попытки. Повтор запускает весь узел заново и может повторить внешние операции. Тайм-аут включает все попытки и интервалы.\",\"retryNone\":\"Без повторов\",\"retrySeconds\":\"сек.\",\"retryHelp\":\"О повторах\",\"retryOnce\":\"Не более 1 повтора\",\"onError\":\"При ошибке\",\"onErrorStop\":\"Остановить процесс\",\"onErrorOutput\":\"Вывод в порт error\",\"onErrorHelp\":\"Обработка ошибок\",\"onErrorHint\":\"После неудачных повторов записать ошибку в системный выход error и продолжить по существующим связям. При успехе error равен null. Отмена, тайм-ауты, ограничения ресурсов и неопределённые результаты останавливают выполнение.\",\"systemOutputs\":\"Системные выходы\",\"systemError\":\"Ошибка (системная)\",\"errorFields\":{\"error\":\"Информация об ошибке узла; при успешном выполнении — null.\",\"code\":\"Код, определяющий тип ошибки.\",\"message\":\"Описание ошибки со скрытыми конфиденциальными данными.\",\"nodeId\":\"Идентификатор узла, в котором произошла ошибка.\",\"nodeName\":\"Имя узла на момент ошибки.\",\"runId\":\"Идентификатор этого запуска рабочего процесса.\",\"executionId\":\"Идентификатор этого выполнения узла, общий для всех повторных попыток.\"}},\"selectNode\":\"Выберите один узел черновика, чтобы просмотреть и изменить его.\",\"locateNode\":\"Найти этот узел на холсте\",\"task\":{\"sharedPermissions\":\"Использовать общую группу разрешений Flow\",\"sharedPermissionsHint\":\"Используйте все Actions, разрешённые общей группой Flow. Добавлять их в узел по отдельности не нужно.\",\"httpHosts\":\"HTTP-хосты\",\"httpHostsHint\":\"Один хост на строку. *.example.com включает поддомены.\",\"httpHostsInvalid\":\"«{{host}}» — недопустимый хост. Укажите имя хоста, например api.example.com.\",\"httpHostsLimit\":\"Можно объявить не более {{count}} хостов.\",\"addAction\":\"Добавить Action\",\"removeAction\":\"Удалить Action\",\"actionAccount\":\"Аккаунт\",\"chooseAccount\":\"Выбрать аккаунт\",\"permissionSaveFailed\":\"Не удалось сохранить разрешения Code. Повторите попытку.\",\"chatText\":\"Текст чата\",\"connectorAction\":\"Действие Connector\",\"definition\":\"Определение задачи\",\"discardCode\":\"Отменить изменения\",\"editorLoading\":\"Загрузка редактора…\",\"editorUnavailable\":\"Не удалось загрузить редактор кода.\",\"inputPorts\":\"Входные порты\",\"javascriptModule\":\"Код\",\"missing\":\"Указанная задача не существует.\",\"outputPorts\":\"Выходные порты\",\"responseMode\":\"Режим ответа\",\"source\":\"Исходный код\",\"structuredJson\":\"Структурированный JSON\",\"retrySave\":\"Повторить сохранение\",\"additionalInputs\":\"Дополнительные входы\",\"httpHostsUpdated\":\"Настройки хостов изменены в другом месте. Загружена новая конфигурация; проверьте её перед сохранением.\"},\"wait\":{\"approval\":\"Одобрить или отклонить\",\"changeNotification\":\"Изменить\",\"continue\":\"Продолжить\",\"mode\":\"Обработка\",\"inputsLoading\":\"Загрузка параметров уведомления…\",\"pendingDescription\":\"Выход ожидания срабатывает один раз при начале ожидания и передаёт ссылки подтверждения и связанные данные. Подключите его для отправки сообщения или выполнения других шагов.\",\"prompt\":\"Запрос\",\"promptError\":\"Запрос должен содержать от 1 до 1 000 символов.\",\"autoContinue\":\"Автоматическое продолжение\",\"autoOff\":\"Выключено\",\"autoAfter\":\"Через интервал\",\"autoAt\":\"В указанное время\",\"autoSeconds\":\"Длительность (секунды)\",\"autoDate\":\"Дата и время\",\"autoInvalid\":\"Введите положительную длительность или корректные дату и время.\",\"autoDescription\":\"До указанного времени можно продолжить вручную.\"},\"title\":\"Инспектор\",\"sources\":{\"loading\":\"Загрузка источников входных данных…\",\"loadFailed\":\"Не удалось загрузить источники входных данных. Откройте меню ещё раз.\",\"checkFailed\":\"Не удалось проверить этот источник.\",\"select\":\"Выбрать источник входных данных\",\"title\":\"Источник входных данных\",\"sourceMissing\":\"Исходный источник входных данных больше не существует. Выберите другой.\",\"outputMissing\":\"«{{output}}» не найден в «{{source}}». Выберите снова.\",\"wholeObject\":\"Весь объект\",\"fieldMissing\":\"Поле {{field}} больше не объявлено в «{{output}}». Выберите снова.\",\"notReady\":\"К моменту выполнения этого шага у «{{source}} {{handle}}» может ещё не быть значения.\",\"sourceConflict\":\"Эти поля могут иметь значения одновременно: {{sources}}. Здесь можно использовать только одно.\",\"incompatibleRight\":\"Тип правого значения несовместим с этим сравнением.\",\"incompatible\":\"Несовместимо\",\"unverified\":\"Не проверено\",\"schemaIncompatible\":\"Формат данных не совпадает.\",\"schemaPathIncompatible\":\"Формат данных «{{path}}» не совпадает.\",\"schemaCompareFailed\":\"Не удалось проверить формат данных. Проверьте схему JSON.\",\"binaryIncompatible\":\"Двоичные данные здесь использовать нельзя.\",\"artifactIncompatible\":\"Файловые данные здесь использовать нельзя.\",\"nullableIncompatible\":\"Требуется значение, но выбранное поле может быть пустым.\",\"typeIncompatible\":\"Ожидается {{target}}, но выбранное поле имеет тип {{source}}.\",\"propertyTypeIncompatible\":\"«{{path}}» должно иметь тип {{target}}, но имеет тип {{source}}.\",\"requiredIncompatible\":\"Обязательное свойство «{{property}}» может отсутствовать.\",\"enumIncompatible\":\"Некоторые возможные значения не принимаются: {{values}}.\",\"constIncompatible\":\"Принимается только {{target}}, но выбранное поле всегда равно {{source}}.\",\"constraintSubject\":\"«{{path}}» \",\"minLength\":\"{{subject}}должно содержать не менее {{value}} символов.\",\"maxLength\":\"{{subject}}должно содержать не более {{value}} символов.\",\"pattern\":\"{{subject}}должно соответствовать {{value}}.\",\"minimum\":\"{{subject}}не может быть меньше {{value}}.\",\"exclusiveMinimum\":\"{{subject}}должно быть больше {{value}}.\",\"maximum\":\"{{subject}}не может быть больше {{value}}.\",\"exclusiveMaximum\":\"{{subject}}должно быть меньше {{value}}.\",\"multipleOf\":\"{{subject}}должно быть кратно {{value}}.\",\"minItems\":\"{{subject}}должно содержать не менее {{value}} элементов.\",\"maxItems\":\"{{subject}}должно содержать не более {{value}} элементов.\",\"minProperties\":\"{{subject}}должно содержать не менее {{value}} свойств.\",\"maxProperties\":\"{{subject}}должно содержать не более {{value}} свойств.\",\"integer\":\"Целое число\",\"unknownType\":\"неизвестный тип\",\"typeSeparator\":\" или \"},\"actions\":{\"flowAccess\":\"Доступные сервисы\",\"flowAccessHint\":\"Управлять подключениями, общими для всех узлов Code в этом Flow\",\"chooseConnection\":\"Выбрать подключение {{provider}}\",\"connectionDescription\":\"Подключение будет вставлено в этот вызов. Возможность его использования по-прежнему контролирует Flow Provider Access.\",\"title\":\"Действия, доступные коду\",\"search\":\"Поиск действий\",\"description\":\"Выберите действия и аккаунты, доступные этому коду.\",\"empty\":\"Подходящих действий нет.\",\"remove\":\"Удалить\",\"default\":\"Аккаунт по умолчанию\",\"defaultHint\":\"Используется, если при вызове не указан аккаунт.\",\"removeAction\":\"Удалить действие\",\"explicit\":\"Выбирать явно в коде\",\"connect\":\"Подключить аккаунт\",\"refresh\":\"Обновить аккаунты\",\"aliases\":\"Обновить сохранённые псевдонимы\",\"add\":\"Добавить действие\",\"cancel\":\"Отмена\",\"loading\":\"Поиск…\",\"needsAccount\":\"Подключите аккаунт\",\"accounts\":\"Аккаунты: {{count}}\",\"public\":\"Без аккаунта\",\"allowed\":\"Разрешённые аккаунты\",\"unavailable\":\"Недоступен\",\"details\":\"Данные подключений\",\"example\":\"Пример вызова\",\"syntax\":\"Синтаксис вызова\",\"nested\":\"Через провайдера\",\"fullId\":\"Полный ID\",\"copy\":\"Копировать\",\"copied\":\"Скопировано\",\"copyError\":\"Не удалось скопировать. Выделите код и скопируйте вручную.\",\"introDescription\":\"При необходимости добавьте действия для вызова внешних приложений через {{context}}.\",\"insertAction\":\"Вставить код\",\"chooseAccounts\":\"Управление аккаунтами\"},\"comment\":{\"markdown\":\"Markdown\",\"preview\":\"Предпросмотр\"},\"ports\":{\"reorder\":\"Изменить порядок {{name}}\",\"reorderHint\":\"Перетащите внутри группы или используйте стрелки вверх / вниз при фокусе.\",\"moved\":\"{{name}} перемещён на позицию {{position}}.\",\"groupSettings\":\"Настройки группы\",\"connected\":\"Подключено\",\"sort\":\"Изменить порядок\",\"finishSorting\":\"Готово\",\"inputsTitle\":\"Входы\",\"requiredInputs\":\"Обязательные\",\"optionalInputs\":\"Необязательные\",\"noInputs\":\"Этому узлу не требуются входные данные.\",\"noOutputs\":\"Этот узел не предоставляет выходных данных.\",\"outputsTitle\":\"Выходы\",\"valuesTitle\":\"Значения\",\"columnHandle\":\"Handle\",\"columnName\":\"Имя\",\"columnType\":\"Тип\",\"columnValue\":\"Значение\",\"builtIn\":{\"cron\":{\"scheduledAt\":\"Запланированное время этого запуска в формате ISO 8601.\"},\"webhook\":{\"headers\":\"Заголовки, полученные с этим Webhook-запросом.\",\"query\":\"Параметры URL-запроса, полученные с этим Webhook-запросом.\",\"body\":\"Тело, полученное с этим Webhook-запросом.\",\"webhookUrl\":\"URL Webhook, получивший этот запрос, без параметров запроса.\"}},\"startParametersTitle\":\"Параметры запуска\"}}"),
|
|
13085
13318
|
language: { "label": "Язык" },
|
|
@@ -14163,7 +14396,10 @@ var resources = {
|
|
|
14163
14396
|
"discardTitle": "Отменить изменения?",
|
|
14164
14397
|
"discardDescription": "Изменения настроек процесса не сохранены.",
|
|
14165
14398
|
"continueEditing": "Продолжить редактирование",
|
|
14166
|
-
"discardChanges": "Отменить изменения"
|
|
14399
|
+
"discardChanges": "Отменить изменения",
|
|
14400
|
+
"icon": "Значок",
|
|
14401
|
+
"resetIcon": "Сбросить значок",
|
|
14402
|
+
"description": "Описание"
|
|
14167
14403
|
},
|
|
14168
14404
|
flowState: {
|
|
14169
14405
|
"title": "Постоянные данные",
|
|
@@ -14177,7 +14413,7 @@ var resources = {
|
|
|
14177
14413
|
"clear": "Очистить",
|
|
14178
14414
|
"orphaned": "Вне текущего представления",
|
|
14179
14415
|
"nearLimit": "История Flow заполнена минимум на 80 %. Удалите ненужные записи.",
|
|
14180
|
-
"
|
|
14416
|
+
"usage": "Использование",
|
|
14181
14417
|
"scope": "Область",
|
|
14182
14418
|
"refresh": "Обновить",
|
|
14183
14419
|
"cancel": "Отмена",
|
|
@@ -14205,7 +14441,7 @@ var resources = {
|
|
|
14205
14441
|
"pendingClear": "Ожидают фиксации: {{count}}. Завершите или отмените связанные запуски перед очисткой.",
|
|
14206
14442
|
"clearBlocked": "Есть записи, ожидающие фиксации. Завершите или отмените связанные запуски и обновите данные.",
|
|
14207
14443
|
"clearSource": "Очистить {{name}}",
|
|
14208
|
-
"
|
|
14444
|
+
"sourceUsage": "Использование: {{name}}",
|
|
14209
14445
|
"confirmTitle": "Очистить «{{name}}»?",
|
|
14210
14446
|
"confirmValues": "Будут удалены сохранённые записи ({{count}}) в среде «{{scope}}». Последующие запуски не смогут прочитать эти значения.",
|
|
14211
14447
|
"confirmHistory": "Будут удалены записи дедупликации ({{count}}) в среде «{{scope}}». Эти элементы могут быть обработаны повторно.",
|
|
@@ -14216,6 +14452,14 @@ var resources = {
|
|
|
14216
14452
|
"loadFailed": "Не удалось загрузить",
|
|
14217
14453
|
"valuesHelp": "{{name}}: данные, явно сохранённые процессом для чтения в следующих запусках.",
|
|
14218
14454
|
"historyHelp": "{{name}}: идентификаторы элементов, предотвращающие повторную обработку."
|
|
14455
|
+
},
|
|
14456
|
+
workflowTransfer: {
|
|
14457
|
+
"includeDependencies": "Включить связанные процессы",
|
|
14458
|
+
"workflowCount": "Процессы ({{count}})",
|
|
14459
|
+
"unavailable": "Связанные процессы недоступны: {{count}}.",
|
|
14460
|
+
"export": "Экспортировать",
|
|
14461
|
+
"hostUnsupported": "Этот хост пока не поддерживает импорт пакетов процессов.",
|
|
14462
|
+
"unnamed": "Процесс без названия"
|
|
14219
14463
|
}
|
|
14220
14464
|
},
|
|
14221
14465
|
"fr": {
|
|
@@ -14441,14 +14685,24 @@ var resources = {
|
|
|
14441
14685
|
"exportFlow": "Exporter le workflow",
|
|
14442
14686
|
"exportPng": "Exporter une image PNG",
|
|
14443
14687
|
"exportPngFrame": "Afficher le cadre",
|
|
14688
|
+
"exportPngCompact": "Disposition compacte",
|
|
14444
14689
|
"exportPngLight": "Clair",
|
|
14445
14690
|
"exportPngDark": "Sombre",
|
|
14446
|
-
"exportPngPending": "Exportation du PNG…",
|
|
14447
|
-
"exportPngPendingDescription": "Préparation du workflow et des images. Les images volumineuses peuvent prendre un peu plus de temps.",
|
|
14448
14691
|
"exportPngComplete": "Image PNG exportée.",
|
|
14449
14692
|
"exportPngPartial": "Image PNG exportée. Certaines images ont été remplacées par des espaces réservés.",
|
|
14450
14693
|
"exportPngFailed": "Impossible d’exporter l’image PNG. Veuillez réessayer.",
|
|
14451
|
-
"importInvalid": "Fichier de workflow invalide ou non pris en charge."
|
|
14694
|
+
"importInvalid": "Fichier de workflow invalide ou non pris en charge.",
|
|
14695
|
+
"exportPngAspectRatio": "Format du canevas",
|
|
14696
|
+
"exportPngAuto": "Auto",
|
|
14697
|
+
"exportPngLayout": "Disposition",
|
|
14698
|
+
"exportPngOriginal": "Originale",
|
|
14699
|
+
"exportPngTheme": "Thème",
|
|
14700
|
+
"exportPngPreview": "Aperçu",
|
|
14701
|
+
"exportPngPreviewPending": "Génération de l’aperçu…",
|
|
14702
|
+
"exportPngPreviewFailed": "Impossible de générer l’aperçu.",
|
|
14703
|
+
"exportPngPreviewPartial": "Certaines images ont été remplacées par des espaces réservés.",
|
|
14704
|
+
"exportPngDownload": "Télécharger le PNG",
|
|
14705
|
+
"exportPngPreviewRetry": "Réessayer"
|
|
14452
14706
|
},
|
|
14453
14707
|
inspector: /* @__PURE__ */ JSON.parse("{\"outline\":\"Liste des nœuds\",\"backToOutline\":\"Retour à la liste des nœuds\",\"emptyOutline\":\"Aucun nœud pour le moment\",\"triggers\":\"Déclencheurs\",\"nodes\":\"Nœuds\",\"multipleSelected\":\"{{count}} nœuds sélectionnés\",\"account\":{\"contactAdmin\":\"Vous n’avez pas l’autorisation d’effectuer cette opération. Contactez un administrateur.\",\"accessTitle\":\"Autorisations d’accès\",\"manageFlowAccess\":\"Connexions disponibles pour Code\",\"configureAccess\":\"Choisir un compte\",\"manageAccount\":\"Gérer les comptes\",\"required\":\"Compte à connecter\",\"addAccount\":\"Ajouter un compte\",\"manage\":\"Gérer\",\"authorizationPending\":\"Terminez l'autorisation sur la page Connection, puis revenez ici pour actualiser ce compte.\",\"chooseAccount\":\"Choisir un compte\",\"deferred\":\"Ne pas configurer maintenant\",\"clearDeferred\":\"Effacer la sélection\",\"noAccounts\":\"Aucun compte disponible\",\"connectBeforeRun\":\"Connectez {{service}} pour que ce bloc puisse être exécuté ou publié.\",\"connectService\":\"Connecter {{service}}\",\"connection\":\"Connection\",\"loading\":\"Chargement des Connections…\",\"oomolBuiltIn\":\"Compte intégré OOMOL\",\"missing\":\"Le compte sélectionné pour ce nœud est indisponible. Choisissez un autre compte ou gérez les connexions.\",\"refreshFailed\":\"Impossible d'actualiser les Connections.\",\"retry\":\"Réessayer\",\"status\":{\"disconnected\":\"Cette Connection est déconnectée. Reconnectez-la ou choisissez un autre compte.\",\"error\":\"Cette Connection présente une erreur. Réparez-la ou choisissez un autre compte.\",\"reauth_required\":\"Cette Connection doit être autorisée à nouveau. Reconnectez-la ou choisissez un autre compte.\"},\"statusUnavailable\":\"Le statut de la Connection est indisponible pour {{action}}.\",\"teamDefault\":\"Par défaut de l'équipe\",\"title\":\"Compte\",\"unavailable\":\"indisponible\"},\"close\":\"Fermer l'inspecteur\",\"configurationRequired\":\"Configuration requise\",\"diagnostics\":\"Diagnostics\",\"errors\":{\"jsonObject\":\"{{label}} doit être un objet JSON.\",\"portDefinitions\":\"Saisissez des définitions de ports valides.\"},\"node\":{\"nameDuplicate\":\"Un nœud portant ce nom existe déjà dans ce graphe.\",\"nameEmpty\":\"Le nom du nœud ne peut pas être vide.\",\"timeout\":\"Délai d'expiration (ms)\",\"maxExecutions\":\"Limite d’exécutions du nœud\",\"maxExecutionsError\":\"La limite d’exécutions du nœud doit être un entier positif.\",\"timeoutError\":\"Le délai d'expiration doit être un entier positif exprimé en millisecondes.\",\"title\":\"Paramètres du nœud\",\"description\":\"Objectif\",\"describe\":\"Décrivez le rôle de cette étape.\",\"icon\":\"Icône\",\"name\":\"Titre\",\"retry\":\"Réessayer en cas d’erreur\",\"retryCount\":\"Nouvelles tentatives : {{count}} max.\",\"retryInterval\":\"Intervalle\",\"retryError\":\"Indiquez un intervalle entier de 1 à 60 secondes.\",\"retryHint\":\"Le nombre de nouvelles tentatives s’ajoute à la première exécution en cas d’échec. Chaque tentative réexécute le nœud entier et peut répéter des opérations externes. Le délai maximal inclut toutes les tentatives et les intervalles.\",\"retryNone\":\"Aucune nouvelle tentative\",\"retrySeconds\":\"secondes\",\"retryHelp\":\"À propos des nouvelles tentatives\",\"retryOnce\":\"Une nouvelle tentative max.\",\"onError\":\"En cas d’échec\",\"onErrorStop\":\"Arrêter le workflow\",\"onErrorOutput\":\"Sortir vers le port error\",\"onErrorHelp\":\"Gestion des échecs\",\"onErrorHint\":\"Après les nouvelles tentatives, placer l’erreur dans la sortie système error et continuer par les connexions existantes. En cas de succès, error vaut null. Annulation, délais, limites de ressources et résultats indéterminés arrêtent toujours l’exécution.\",\"systemOutputs\":\"Sorties système\",\"systemError\":\"Erreur (système)\",\"errorFields\":{\"error\":\"Informations sur l’erreur en cas d’échec du nœud ; null en cas de réussite.\",\"code\":\"Code identifiant le type d’erreur.\",\"message\":\"Description de l’erreur, avec les informations sensibles masquées.\",\"nodeId\":\"Identifiant du nœud ayant échoué.\",\"nodeName\":\"Nom du nœud au moment de l’échec.\",\"runId\":\"Identifiant de cette exécution du workflow.\",\"executionId\":\"Identifiant de cette exécution du nœud, commun à toutes ses tentatives.\"}},\"selectNode\":\"Sélectionnez un nœud du Brouillon pour l'inspecter et le modifier.\",\"locateNode\":\"Localiser ce nœud sur le canevas\",\"task\":{\"sharedPermissions\":\"Utiliser le groupe d’autorisations partagé du Flow\",\"sharedPermissionsHint\":\"Utilisez toutes les Actions autorisées par le groupe du Flow, sans les ajouter à ce nœud.\",\"httpHosts\":\"Hôtes HTTP\",\"httpHostsHint\":\"Un hôte par ligne. *.example.com inclut les sous-domaines.\",\"httpHostsInvalid\":\"« {{host}} » n’est pas un hôte valide. Utilisez un nom d’hôte comme api.example.com.\",\"httpHostsLimit\":\"Déclarez au plus {{count}} hôtes.\",\"addAction\":\"Ajouter une action\",\"removeAction\":\"Supprimer l’action\",\"actionAccount\":\"Compte\",\"chooseAccount\":\"Choisir un compte\",\"permissionSaveFailed\":\"Impossible d’enregistrer les autorisations Code. Réessayez.\",\"chatText\":\"Texte de conversation\",\"connectorAction\":\"Action Connector\",\"definition\":\"Définition de la tâche\",\"discardCode\":\"Abandonner les modifications\",\"editorLoading\":\"Chargement de l'éditeur…\",\"editorUnavailable\":\"Impossible de charger l'éditeur de code.\",\"inputPorts\":\"Ports d'entrée\",\"javascriptModule\":\"Code\",\"missing\":\"La tâche référencée n'existe pas.\",\"outputPorts\":\"Ports de sortie\",\"responseMode\":\"Mode de réponse\",\"source\":\"Source\",\"structuredJson\":\"JSON structuré\",\"retrySave\":\"Réessayer\",\"additionalInputs\":\"Entrées supplémentaires\",\"httpHostsUpdated\":\"Les hôtes ont été modifiés ailleurs. La dernière configuration est chargée ; vérifiez-la avant d’enregistrer.\"},\"wait\":{\"approval\":\"Approuver ou refuser\",\"changeNotification\":\"Changer\",\"continue\":\"Continuer\",\"mode\":\"Traitement\",\"inputsLoading\":\"Chargement des paramètres de notification…\",\"pendingDescription\":\"La sortie en attente se déclenche une fois au début de l’attente et fournit les liens de confirmation et les données associées. Reliez-la pour envoyer un message ou exécuter d’autres étapes.\",\"prompt\":\"Invite\",\"promptError\":\"L’invite doit contenir entre 1 et 1 000 caractères.\",\"autoContinue\":\"Reprise automatique\",\"autoOff\":\"Désactivée\",\"autoAfter\":\"Après une durée\",\"autoAt\":\"À une date précise\",\"autoSeconds\":\"Durée (secondes)\",\"autoDate\":\"Date et heure\",\"autoInvalid\":\"Saisissez une durée positive ou une date et une heure valides.\",\"autoDescription\":\"Vous pouvez reprendre manuellement avant l’heure prévue.\"},\"title\":\"Inspecteur\",\"sources\":{\"loading\":\"Chargement des sources d’entrée…\",\"loadFailed\":\"Impossible de charger les sources d’entrée. Rouvrez le menu pour réessayer.\",\"checkFailed\":\"Impossible de vérifier cette source.\",\"select\":\"Sélectionner la source d’entrée\",\"title\":\"Source d’entrée\",\"sourceMissing\":\"La source d’entrée d’origine n’existe plus. Choisissez-en une autre.\",\"outputMissing\":\"« {{output}} » est introuvable dans « {{source}} ». Choisissez à nouveau.\",\"wholeObject\":\"Objet entier\",\"fieldMissing\":\"Le champ {{field}} n’est plus déclaré dans « {{output}} ». Choisissez à nouveau.\",\"notReady\":\"« {{source}} {{handle}} » peut ne pas avoir de valeur lors de cette étape.\",\"sourceConflict\":\"Ces champs peuvent avoir une valeur en même temps : {{sources}}. Un seul peut être utilisé ici.\",\"incompatibleRight\":\"Le type de la valeur de droite est incompatible avec cette comparaison.\",\"incompatible\":\"Incompatible\",\"unverified\":\"Non vérifié\",\"schemaIncompatible\":\"Le format des données ne correspond pas.\",\"schemaPathIncompatible\":\"Le format de « {{path}} » ne correspond pas.\",\"schemaCompareFailed\":\"Impossible de vérifier le format. Vérifiez le schéma JSON.\",\"binaryIncompatible\":\"Les données binaires ne peuvent pas être utilisées ici.\",\"artifactIncompatible\":\"Les données de fichier ne peuvent pas être utilisées ici.\",\"nullableIncompatible\":\"Une valeur est requise, mais le champ sélectionné peut être vide.\",\"typeIncompatible\":\"Le type attendu est {{target}}, mais le champ sélectionné est de type {{source}}.\",\"propertyTypeIncompatible\":\"« {{path}} » doit être de type {{target}}, mais est de type {{source}}.\",\"requiredIncompatible\":\"La propriété requise « {{property}} » peut être absente.\",\"enumIncompatible\":\"Certaines valeurs possibles ne sont pas acceptées : {{values}}.\",\"constIncompatible\":\"Seul {{target}} est accepté, mais le champ sélectionné vaut toujours {{source}}.\",\"constraintSubject\":\"« {{path}} » \",\"minLength\":\"{{subject}}doit contenir au moins {{value}} caractères.\",\"maxLength\":\"{{subject}}doit contenir au plus {{value}} caractères.\",\"pattern\":\"{{subject}}doit correspondre à {{value}}.\",\"minimum\":\"{{subject}}ne peut pas être inférieur à {{value}}.\",\"exclusiveMinimum\":\"{{subject}}doit être supérieur à {{value}}.\",\"maximum\":\"{{subject}}ne peut pas être supérieur à {{value}}.\",\"exclusiveMaximum\":\"{{subject}}doit être inférieur à {{value}}.\",\"multipleOf\":\"{{subject}}doit être un multiple de {{value}}.\",\"minItems\":\"{{subject}}doit contenir au moins {{value}} éléments.\",\"maxItems\":\"{{subject}}doit contenir au plus {{value}} éléments.\",\"minProperties\":\"{{subject}}doit contenir au moins {{value}} propriétés.\",\"maxProperties\":\"{{subject}}doit contenir au plus {{value}} propriétés.\",\"integer\":\"Entier\",\"unknownType\":\"type inconnu\",\"typeSeparator\":\" ou \"},\"actions\":{\"flowAccess\":\"Services disponibles\",\"flowAccessHint\":\"Gérer les connexions partagées par tous les nœuds Code de ce Flow\",\"chooseConnection\":\"Choisir une connexion {{provider}}\",\"connectionDescription\":\"La connexion est insérée dans cet appel. L’accès Provider du Flow détermine toujours si elle peut être utilisée.\",\"title\":\"Actions accessibles au code\",\"search\":\"Rechercher des actions\",\"description\":\"Choisissez les actions et les comptes autorisés pour ce code.\",\"empty\":\"Aucune action correspondante.\",\"remove\":\"Retirer\",\"default\":\"Compte par défaut\",\"defaultHint\":\"Compte utilisé si aucun compte n’est précisé lors de l’appel.\",\"removeAction\":\"Retirer l’action\",\"explicit\":\"Choisir explicitement dans le code\",\"connect\":\"Connecter un compte\",\"refresh\":\"Actualiser les comptes\",\"aliases\":\"Mettre à jour les alias enregistrés\",\"add\":\"Ajouter une action\",\"cancel\":\"Annuler\",\"loading\":\"Recherche…\",\"needsAccount\":\"Connecter un compte\",\"accounts\":\"{{count}} comptes\",\"public\":\"Sans compte\",\"allowed\":\"Comptes autorisés\",\"unavailable\":\"Indisponible\",\"details\":\"Détails des connexions\",\"example\":\"Exemple d’appel\",\"syntax\":\"Syntaxe d’appel\",\"nested\":\"Par fournisseur\",\"fullId\":\"ID complet\",\"copy\":\"Copier\",\"copied\":\"Copié\",\"copyError\":\"Échec de la copie. Sélectionnez le code pour le copier manuellement.\",\"introDescription\":\"Ajoutez des actions au besoin pour appeler des applications externes via {{context}}.\",\"insertAction\":\"Insérer le code\",\"chooseAccounts\":\"Gérer les comptes\"},\"comment\":{\"markdown\":\"Markdown\",\"preview\":\"Aperçu\"},\"ports\":{\"reorder\":\"Réordonner {{name}}\",\"reorderHint\":\"Glissez dans le groupe ou utilisez les flèches haut / bas au clavier.\",\"moved\":\"{{name}} déplacé en position {{position}}.\",\"groupSettings\":\"Paramètres du groupe\",\"connected\":\"Connecté\",\"sort\":\"Réordonner\",\"finishSorting\":\"Terminer\",\"inputsTitle\":\"Entrées\",\"requiredInputs\":\"Obligatoires\",\"optionalInputs\":\"Facultatifs\",\"noInputs\":\"Ce nœud ne nécessite pas de données d’entrée.\",\"noOutputs\":\"Ce nœud ne fournit pas de données de sortie.\",\"outputsTitle\":\"Sorties\",\"valuesTitle\":\"Valeurs\",\"columnHandle\":\"Handle\",\"columnName\":\"Nom\",\"columnType\":\"Type\",\"columnValue\":\"Valeur\",\"builtIn\":{\"cron\":{\"scheduledAt\":\"Heure planifiée ayant déclenché cette exécution, au format ISO 8601.\"},\"webhook\":{\"headers\":\"Les en-têtes reçus avec cette requête Webhook.\",\"query\":\"Les paramètres de requête URL reçus avec cette requête Webhook.\",\"body\":\"Le corps reçu avec cette requête Webhook.\",\"webhookUrl\":\"L’URL Webhook ayant reçu cette requête, sans les paramètres de requête.\"}},\"startParametersTitle\":\"Paramètres de démarrage\"}}"),
|
|
14454
14708
|
language: { "label": "Langue" },
|
|
@@ -15532,7 +15786,10 @@ var resources = {
|
|
|
15532
15786
|
"discardTitle": "Ignorer les modifications ?",
|
|
15533
15787
|
"discardDescription": "Les modifications des paramètres du workflow n’ont pas été enregistrées.",
|
|
15534
15788
|
"continueEditing": "Continuer à modifier",
|
|
15535
|
-
"discardChanges": "Ignorer les modifications"
|
|
15789
|
+
"discardChanges": "Ignorer les modifications",
|
|
15790
|
+
"icon": "Icône",
|
|
15791
|
+
"resetIcon": "Réinitialiser l’icône",
|
|
15792
|
+
"description": "Description"
|
|
15536
15793
|
},
|
|
15537
15794
|
flowState: {
|
|
15538
15795
|
"title": "Données persistantes",
|
|
@@ -15546,7 +15803,7 @@ var resources = {
|
|
|
15546
15803
|
"clear": "Effacer",
|
|
15547
15804
|
"orphaned": "Hors de la vue actuelle",
|
|
15548
15805
|
"nearLimit": "L’historique du Flow est rempli à au moins 80 %. Effacez les entrées inutiles.",
|
|
15549
|
-
"
|
|
15806
|
+
"usage": "Utilisation",
|
|
15550
15807
|
"scope": "Portée",
|
|
15551
15808
|
"refresh": "Actualiser",
|
|
15552
15809
|
"cancel": "Annuler",
|
|
@@ -15574,7 +15831,7 @@ var resources = {
|
|
|
15574
15831
|
"pendingClear": "{{count}} en attente de validation. Terminez ou annulez les exécutions concernées avant de vider.",
|
|
15575
15832
|
"clearBlocked": "Des entrées sont en attente de validation. Terminez ou annulez les exécutions concernées, puis actualisez.",
|
|
15576
15833
|
"clearSource": "Vider {{name}}",
|
|
15577
|
-
"
|
|
15834
|
+
"sourceUsage": "Utilisation de {{name}}",
|
|
15578
15835
|
"confirmTitle": "Vider « {{name}} » ?",
|
|
15579
15836
|
"confirmValues": "Cela supprimera {{count}} entrées enregistrées en environnement {{scope}}. Les exécutions suivantes ne pourront plus lire ces valeurs.",
|
|
15580
15837
|
"confirmHistory": "Cela supprimera {{count}} entrées de déduplication en environnement {{scope}}. Ces éléments pourront être traités à nouveau.",
|
|
@@ -15585,6 +15842,14 @@ var resources = {
|
|
|
15585
15842
|
"loadFailed": "Chargement impossible",
|
|
15586
15843
|
"valuesHelp": "{{name}} : contenu enregistré explicitement par le workflow, accessible aux exécutions suivantes.",
|
|
15587
15844
|
"historyHelp": "{{name}} : identifiants des éléments utilisés pour éviter les traitements en double."
|
|
15845
|
+
},
|
|
15846
|
+
workflowTransfer: {
|
|
15847
|
+
"includeDependencies": "Inclure les workflows référencés",
|
|
15848
|
+
"workflowCount": "Workflows ({{count}})",
|
|
15849
|
+
"unavailable": "Workflows référencés indisponibles : {{count}}.",
|
|
15850
|
+
"export": "Exporter",
|
|
15851
|
+
"hostUnsupported": "Cet hôte ne prend pas encore en charge l’import de lots de workflows.",
|
|
15852
|
+
"unnamed": "Workflow sans nom"
|
|
15588
15853
|
}
|
|
15589
15854
|
}
|
|
15590
15855
|
};
|
|
@@ -16431,6 +16696,326 @@ function EmptyContent({ className, ...props }) {
|
|
|
16431
16696
|
});
|
|
16432
16697
|
}
|
|
16433
16698
|
//#endregion
|
|
16699
|
+
//#region ../../node_modules/.bun/@iconify+utils@3.1.4/node_modules/@iconify/utils/lib/icon/defaults.js
|
|
16700
|
+
/** Default values for dimensions */
|
|
16701
|
+
var defaultIconDimensions = Object.freeze({
|
|
16702
|
+
left: 0,
|
|
16703
|
+
top: 0,
|
|
16704
|
+
width: 16,
|
|
16705
|
+
height: 16
|
|
16706
|
+
});
|
|
16707
|
+
/** Default values for transformations */
|
|
16708
|
+
var defaultIconTransformations = Object.freeze({
|
|
16709
|
+
rotate: 0,
|
|
16710
|
+
vFlip: false,
|
|
16711
|
+
hFlip: false
|
|
16712
|
+
});
|
|
16713
|
+
/** Default values for all optional IconifyIcon properties */
|
|
16714
|
+
var defaultIconProps = Object.freeze({
|
|
16715
|
+
...defaultIconDimensions,
|
|
16716
|
+
...defaultIconTransformations
|
|
16717
|
+
});
|
|
16718
|
+
/** Default values for all properties used in ExtendedIconifyIcon */
|
|
16719
|
+
var defaultExtendedIconProps = Object.freeze({
|
|
16720
|
+
...defaultIconProps,
|
|
16721
|
+
body: "",
|
|
16722
|
+
hidden: false
|
|
16723
|
+
});
|
|
16724
|
+
//#endregion
|
|
16725
|
+
//#region ../../node_modules/.bun/@iconify+utils@3.1.4/node_modules/@iconify/utils/lib/customisations/defaults.js
|
|
16726
|
+
/**
|
|
16727
|
+
* Default icon customisations values
|
|
16728
|
+
*/
|
|
16729
|
+
var defaultIconSizeCustomisations = Object.freeze({
|
|
16730
|
+
width: null,
|
|
16731
|
+
height: null
|
|
16732
|
+
});
|
|
16733
|
+
var defaultIconCustomisations = Object.freeze({
|
|
16734
|
+
...defaultIconSizeCustomisations,
|
|
16735
|
+
...defaultIconTransformations
|
|
16736
|
+
});
|
|
16737
|
+
//#endregion
|
|
16738
|
+
//#region ../../node_modules/.bun/@iconify+utils@3.1.4/node_modules/@iconify/utils/lib/icon/transformations.js
|
|
16739
|
+
/**
|
|
16740
|
+
* Merge transformations
|
|
16741
|
+
*/
|
|
16742
|
+
function mergeIconTransformations(obj1, obj2) {
|
|
16743
|
+
const result = {};
|
|
16744
|
+
if (!obj1.hFlip !== !obj2.hFlip) result.hFlip = true;
|
|
16745
|
+
if (!obj1.vFlip !== !obj2.vFlip) result.vFlip = true;
|
|
16746
|
+
const rotate = ((obj1.rotate || 0) + (obj2.rotate || 0)) % 4;
|
|
16747
|
+
if (rotate) result.rotate = rotate;
|
|
16748
|
+
return result;
|
|
16749
|
+
}
|
|
16750
|
+
//#endregion
|
|
16751
|
+
//#region ../../node_modules/.bun/@iconify+utils@3.1.4/node_modules/@iconify/utils/lib/icon/merge.js
|
|
16752
|
+
/**
|
|
16753
|
+
* Merge icon and alias
|
|
16754
|
+
*
|
|
16755
|
+
* Can also be used to merge default values and icon
|
|
16756
|
+
*/
|
|
16757
|
+
function mergeIconData(parent, child) {
|
|
16758
|
+
const result = mergeIconTransformations(parent, child);
|
|
16759
|
+
for (const key in defaultExtendedIconProps) if (key in defaultIconTransformations) {
|
|
16760
|
+
if (key in parent && !(key in result)) result[key] = defaultIconTransformations[key];
|
|
16761
|
+
} else if (key in child) result[key] = child[key];
|
|
16762
|
+
else if (key in parent) result[key] = parent[key];
|
|
16763
|
+
return result;
|
|
16764
|
+
}
|
|
16765
|
+
//#endregion
|
|
16766
|
+
//#region ../../node_modules/.bun/@iconify+utils@3.1.4/node_modules/@iconify/utils/lib/icon-set/tree.js
|
|
16767
|
+
/**
|
|
16768
|
+
* Resolve icon set icons
|
|
16769
|
+
*
|
|
16770
|
+
* Returns parent icon for each icon
|
|
16771
|
+
*/
|
|
16772
|
+
function getIconsTree(data, names) {
|
|
16773
|
+
const icons = data.icons;
|
|
16774
|
+
const aliases = data.aliases || Object.create(null);
|
|
16775
|
+
const resolved = Object.create(null);
|
|
16776
|
+
function resolve(name) {
|
|
16777
|
+
if (icons[name]) return resolved[name] = [];
|
|
16778
|
+
if (!(name in resolved)) {
|
|
16779
|
+
resolved[name] = null;
|
|
16780
|
+
const parent = aliases[name] && aliases[name].parent;
|
|
16781
|
+
const value = parent && resolve(parent);
|
|
16782
|
+
if (value) resolved[name] = [parent].concat(value);
|
|
16783
|
+
}
|
|
16784
|
+
return resolved[name];
|
|
16785
|
+
}
|
|
16786
|
+
(names || Object.keys(icons).concat(Object.keys(aliases))).forEach(resolve);
|
|
16787
|
+
return resolved;
|
|
16788
|
+
}
|
|
16789
|
+
//#endregion
|
|
16790
|
+
//#region ../../node_modules/.bun/@iconify+utils@3.1.4/node_modules/@iconify/utils/lib/icon-set/get-icon.js
|
|
16791
|
+
/**
|
|
16792
|
+
* Get icon data, using prepared aliases tree
|
|
16793
|
+
*/
|
|
16794
|
+
function internalGetIconData(data, name, tree) {
|
|
16795
|
+
const icons = data.icons;
|
|
16796
|
+
const aliases = data.aliases || Object.create(null);
|
|
16797
|
+
let currentProps = {};
|
|
16798
|
+
function parse(name) {
|
|
16799
|
+
currentProps = mergeIconData(icons[name] || aliases[name], currentProps);
|
|
16800
|
+
}
|
|
16801
|
+
parse(name);
|
|
16802
|
+
tree.forEach(parse);
|
|
16803
|
+
return mergeIconData(data, currentProps);
|
|
16804
|
+
}
|
|
16805
|
+
/**
|
|
16806
|
+
* Get data for icon
|
|
16807
|
+
*/
|
|
16808
|
+
function getIconData(data, name) {
|
|
16809
|
+
if (data.icons[name]) return internalGetIconData(data, name, []);
|
|
16810
|
+
const tree = getIconsTree(data, [name])[name];
|
|
16811
|
+
return tree ? internalGetIconData(data, name, tree) : null;
|
|
16812
|
+
}
|
|
16813
|
+
//#endregion
|
|
16814
|
+
//#region ../../node_modules/.bun/@iconify+utils@3.1.4/node_modules/@iconify/utils/lib/svg/size.js
|
|
16815
|
+
/**
|
|
16816
|
+
* Regular expressions for calculating dimensions
|
|
16817
|
+
*/
|
|
16818
|
+
var unitsSplit = /(-?[0-9.]*[0-9]+[0-9.]*)/g;
|
|
16819
|
+
var unitsTest = /^-?[0-9.]*[0-9]+[0-9.]*$/g;
|
|
16820
|
+
function calculateSize(size, ratio, precision) {
|
|
16821
|
+
if (ratio === 1) return size;
|
|
16822
|
+
precision = precision || 100;
|
|
16823
|
+
if (typeof size === "number") return Math.ceil(size * ratio * precision) / precision;
|
|
16824
|
+
if (typeof size !== "string") return size;
|
|
16825
|
+
const oldParts = size.split(unitsSplit);
|
|
16826
|
+
if (oldParts === null || !oldParts.length) return size;
|
|
16827
|
+
const newParts = [];
|
|
16828
|
+
let code = oldParts.shift();
|
|
16829
|
+
let isNumber = unitsTest.test(code);
|
|
16830
|
+
while (true) {
|
|
16831
|
+
if (isNumber) {
|
|
16832
|
+
const num = parseFloat(code);
|
|
16833
|
+
if (isNaN(num)) newParts.push(code);
|
|
16834
|
+
else newParts.push(Math.ceil(num * ratio * precision) / precision);
|
|
16835
|
+
} else newParts.push(code);
|
|
16836
|
+
code = oldParts.shift();
|
|
16837
|
+
if (code === void 0) return newParts.join("");
|
|
16838
|
+
isNumber = !isNumber;
|
|
16839
|
+
}
|
|
16840
|
+
}
|
|
16841
|
+
//#endregion
|
|
16842
|
+
//#region ../../node_modules/.bun/@iconify+utils@3.1.4/node_modules/@iconify/utils/lib/svg/defs.js
|
|
16843
|
+
function splitSVGDefs(content, tag = "defs") {
|
|
16844
|
+
let defs = "";
|
|
16845
|
+
const index = content.indexOf("<" + tag);
|
|
16846
|
+
while (index >= 0) {
|
|
16847
|
+
const start = content.indexOf(">", index);
|
|
16848
|
+
const end = content.indexOf("</" + tag);
|
|
16849
|
+
if (start === -1 || end === -1) break;
|
|
16850
|
+
const endEnd = content.indexOf(">", end);
|
|
16851
|
+
if (endEnd === -1) break;
|
|
16852
|
+
defs += content.slice(start + 1, end).trim();
|
|
16853
|
+
content = content.slice(0, index).trim() + content.slice(endEnd + 1);
|
|
16854
|
+
}
|
|
16855
|
+
return {
|
|
16856
|
+
defs,
|
|
16857
|
+
content
|
|
16858
|
+
};
|
|
16859
|
+
}
|
|
16860
|
+
/**
|
|
16861
|
+
* Merge defs and content
|
|
16862
|
+
*/
|
|
16863
|
+
function mergeDefsAndContent(defs, content) {
|
|
16864
|
+
return defs ? "<defs>" + defs + "</defs>" + content : content;
|
|
16865
|
+
}
|
|
16866
|
+
/**
|
|
16867
|
+
* Wrap SVG content, without wrapping definitions
|
|
16868
|
+
*/
|
|
16869
|
+
function wrapSVGContent(body, start, end) {
|
|
16870
|
+
const split = splitSVGDefs(body);
|
|
16871
|
+
return mergeDefsAndContent(split.defs, start + split.content + end);
|
|
16872
|
+
}
|
|
16873
|
+
//#endregion
|
|
16874
|
+
//#region ../../node_modules/.bun/@iconify+utils@3.1.4/node_modules/@iconify/utils/lib/svg/build.js
|
|
16875
|
+
/**
|
|
16876
|
+
* Check if value should be unset. Allows multiple keywords
|
|
16877
|
+
*/
|
|
16878
|
+
var isUnsetKeyword = (value) => value === "unset" || value === "undefined" || value === "none";
|
|
16879
|
+
/**
|
|
16880
|
+
* Get SVG attributes and content from icon + customisations
|
|
16881
|
+
*
|
|
16882
|
+
* Does not generate style to make it compatible with frameworks that use objects for style, such as React.
|
|
16883
|
+
* Instead, it generates 'inline' value. If true, rendering engine should add verticalAlign: -0.125em to icon.
|
|
16884
|
+
*
|
|
16885
|
+
* Customisations should be normalised by platform specific parser.
|
|
16886
|
+
* Result should be converted to <svg> by platform specific parser.
|
|
16887
|
+
* Use replaceIDs to generate unique IDs for body.
|
|
16888
|
+
*/
|
|
16889
|
+
function iconToSVG(icon, customisations) {
|
|
16890
|
+
const fullIcon = {
|
|
16891
|
+
...defaultIconProps,
|
|
16892
|
+
...icon
|
|
16893
|
+
};
|
|
16894
|
+
const fullCustomisations = {
|
|
16895
|
+
...defaultIconCustomisations,
|
|
16896
|
+
...customisations
|
|
16897
|
+
};
|
|
16898
|
+
const box = {
|
|
16899
|
+
left: fullIcon.left,
|
|
16900
|
+
top: fullIcon.top,
|
|
16901
|
+
width: fullIcon.width,
|
|
16902
|
+
height: fullIcon.height
|
|
16903
|
+
};
|
|
16904
|
+
let body = fullIcon.body;
|
|
16905
|
+
[fullIcon, fullCustomisations].forEach((props) => {
|
|
16906
|
+
const transformations = [];
|
|
16907
|
+
const hFlip = props.hFlip;
|
|
16908
|
+
const vFlip = props.vFlip;
|
|
16909
|
+
let rotation = props.rotate;
|
|
16910
|
+
if (hFlip) if (vFlip) rotation += 2;
|
|
16911
|
+
else {
|
|
16912
|
+
transformations.push("translate(" + (box.width + box.left).toString() + " " + (0 - box.top).toString() + ")");
|
|
16913
|
+
transformations.push("scale(-1 1)");
|
|
16914
|
+
box.top = box.left = 0;
|
|
16915
|
+
}
|
|
16916
|
+
else if (vFlip) {
|
|
16917
|
+
transformations.push("translate(" + (0 - box.left).toString() + " " + (box.height + box.top).toString() + ")");
|
|
16918
|
+
transformations.push("scale(1 -1)");
|
|
16919
|
+
box.top = box.left = 0;
|
|
16920
|
+
}
|
|
16921
|
+
let tempValue;
|
|
16922
|
+
if (rotation < 0) rotation -= Math.floor(rotation / 4) * 4;
|
|
16923
|
+
rotation = rotation % 4;
|
|
16924
|
+
switch (rotation) {
|
|
16925
|
+
case 1:
|
|
16926
|
+
tempValue = box.height / 2 + box.top;
|
|
16927
|
+
transformations.unshift("rotate(90 " + tempValue.toString() + " " + tempValue.toString() + ")");
|
|
16928
|
+
break;
|
|
16929
|
+
case 2:
|
|
16930
|
+
transformations.unshift("rotate(180 " + (box.width / 2 + box.left).toString() + " " + (box.height / 2 + box.top).toString() + ")");
|
|
16931
|
+
break;
|
|
16932
|
+
case 3:
|
|
16933
|
+
tempValue = box.width / 2 + box.left;
|
|
16934
|
+
transformations.unshift("rotate(-90 " + tempValue.toString() + " " + tempValue.toString() + ")");
|
|
16935
|
+
}
|
|
16936
|
+
if (rotation % 2 === 1) {
|
|
16937
|
+
if (box.left !== box.top) {
|
|
16938
|
+
tempValue = box.left;
|
|
16939
|
+
box.left = box.top;
|
|
16940
|
+
box.top = tempValue;
|
|
16941
|
+
}
|
|
16942
|
+
if (box.width !== box.height) {
|
|
16943
|
+
tempValue = box.width;
|
|
16944
|
+
box.width = box.height;
|
|
16945
|
+
box.height = tempValue;
|
|
16946
|
+
}
|
|
16947
|
+
}
|
|
16948
|
+
if (transformations.length) body = wrapSVGContent(body, "<g transform=\"" + transformations.join(" ") + "\">", "</g>");
|
|
16949
|
+
});
|
|
16950
|
+
const customisationsWidth = fullCustomisations.width;
|
|
16951
|
+
const customisationsHeight = fullCustomisations.height;
|
|
16952
|
+
const boxWidth = box.width;
|
|
16953
|
+
const boxHeight = box.height;
|
|
16954
|
+
let width;
|
|
16955
|
+
let height;
|
|
16956
|
+
if (customisationsWidth === null) {
|
|
16957
|
+
height = customisationsHeight === null ? "1em" : customisationsHeight === "auto" ? boxHeight : customisationsHeight;
|
|
16958
|
+
width = calculateSize(height, boxWidth / boxHeight);
|
|
16959
|
+
} else {
|
|
16960
|
+
width = customisationsWidth === "auto" ? boxWidth : customisationsWidth;
|
|
16961
|
+
height = customisationsHeight === null ? calculateSize(width, boxHeight / boxWidth) : customisationsHeight === "auto" ? boxHeight : customisationsHeight;
|
|
16962
|
+
}
|
|
16963
|
+
const attributes = {};
|
|
16964
|
+
const setAttr = (prop, value) => {
|
|
16965
|
+
if (!isUnsetKeyword(value)) attributes[prop] = value.toString();
|
|
16966
|
+
};
|
|
16967
|
+
setAttr("width", width);
|
|
16968
|
+
setAttr("height", height);
|
|
16969
|
+
const viewBox = [
|
|
16970
|
+
box.left,
|
|
16971
|
+
box.top,
|
|
16972
|
+
boxWidth,
|
|
16973
|
+
boxHeight
|
|
16974
|
+
];
|
|
16975
|
+
attributes.viewBox = viewBox.join(" ");
|
|
16976
|
+
return {
|
|
16977
|
+
attributes,
|
|
16978
|
+
viewBox,
|
|
16979
|
+
body
|
|
16980
|
+
};
|
|
16981
|
+
}
|
|
16982
|
+
//#endregion
|
|
16983
|
+
//#region ../../node_modules/.bun/@iconify+utils@3.1.4/node_modules/@iconify/utils/lib/svg/id.js
|
|
16984
|
+
/**
|
|
16985
|
+
* Regular expression for finding ids
|
|
16986
|
+
*/
|
|
16987
|
+
var regex = /\sid="(\S+)"/g;
|
|
16988
|
+
/**
|
|
16989
|
+
* Counters
|
|
16990
|
+
*/
|
|
16991
|
+
var counters = /* @__PURE__ */ new Map();
|
|
16992
|
+
/**
|
|
16993
|
+
* Get unique new ID
|
|
16994
|
+
*/
|
|
16995
|
+
function nextID(id) {
|
|
16996
|
+
id = id.replace(/[0-9]+$/, "") || "a";
|
|
16997
|
+
const count = counters.get(id) || 0;
|
|
16998
|
+
counters.set(id, count + 1);
|
|
16999
|
+
return count ? `${id}${count}` : id;
|
|
17000
|
+
}
|
|
17001
|
+
/**
|
|
17002
|
+
* Replace IDs in SVG output with unique IDs
|
|
17003
|
+
*/
|
|
17004
|
+
function replaceIDs(body) {
|
|
17005
|
+
const ids = [];
|
|
17006
|
+
let match;
|
|
17007
|
+
while (match = regex.exec(body)) ids.push(match[1]);
|
|
17008
|
+
if (!ids.length) return body;
|
|
17009
|
+
const suffix = "suffix" + (Math.random() * 16777216 | Date.now()).toString(16);
|
|
17010
|
+
ids.forEach((id) => {
|
|
17011
|
+
const newID = nextID(id);
|
|
17012
|
+
const escapedID = id.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
17013
|
+
body = body.replace(new RegExp("([#;\"])(" + escapedID + ")([\")]|\\.[a-z])", "g"), "$1" + newID + suffix + "$3");
|
|
17014
|
+
});
|
|
17015
|
+
body = body.replace(new RegExp(suffix, "g"), "");
|
|
17016
|
+
return body;
|
|
17017
|
+
}
|
|
17018
|
+
//#endregion
|
|
16434
17019
|
//#region src/ui/browser/input-group.tsx
|
|
16435
17020
|
var InputGroup = React.forwardRef(function InputGroup({ className, ...props }, ref) {
|
|
16436
17021
|
return /* @__PURE__ */ jsx("div", {
|
|
@@ -16510,35 +17095,1877 @@ function useFlowQuery(store, query) {
|
|
|
16510
17095
|
nextCursor: useVal(catalog?.$.nextCursor)
|
|
16511
17096
|
};
|
|
16512
17097
|
}
|
|
17098
|
+
var IconPicker_module_default = {
|
|
17099
|
+
container: "IconPicker_container_1b462",
|
|
17100
|
+
filter: "IconPicker_filter_1b462",
|
|
17101
|
+
tabs: "IconPicker_tabs_1b462",
|
|
17102
|
+
colors: "IconPicker_colors_1b462",
|
|
17103
|
+
color: "IconPicker_color_1b462",
|
|
17104
|
+
panel: "IconPicker_panel_1b462",
|
|
17105
|
+
row: "IconPicker_row_1b462",
|
|
17106
|
+
icon: "IconPicker_icon_1b462",
|
|
17107
|
+
subtitle: "IconPicker_subtitle_1b462",
|
|
17108
|
+
loading: "IconPicker_loading_1b462",
|
|
17109
|
+
spin: "IconPicker_spin_1b462"
|
|
17110
|
+
};
|
|
16513
17111
|
//#endregion
|
|
16514
|
-
//#region ../../node_modules/.bun
|
|
16515
|
-
|
|
16516
|
-
|
|
16517
|
-
|
|
16518
|
-
|
|
16519
|
-
|
|
16520
|
-
|
|
16521
|
-
|
|
16522
|
-
|
|
16523
|
-
|
|
16524
|
-
|
|
16525
|
-
|
|
16526
|
-
|
|
17112
|
+
//#region ../../node_modules/.bun/fzf@0.5.2/node_modules/fzf/dist/fzf.es.js
|
|
17113
|
+
/** @license
|
|
17114
|
+
* fzf v0.5.2
|
|
17115
|
+
* Copyright (c) 2021 Ajit
|
|
17116
|
+
* Licensed under BSD 3-Clause
|
|
17117
|
+
*/
|
|
17118
|
+
var normalized = {
|
|
17119
|
+
216: "O",
|
|
17120
|
+
223: "s",
|
|
17121
|
+
248: "o",
|
|
17122
|
+
273: "d",
|
|
17123
|
+
295: "h",
|
|
17124
|
+
305: "i",
|
|
17125
|
+
320: "l",
|
|
17126
|
+
322: "l",
|
|
17127
|
+
359: "t",
|
|
17128
|
+
383: "s",
|
|
17129
|
+
384: "b",
|
|
17130
|
+
385: "B",
|
|
17131
|
+
387: "b",
|
|
17132
|
+
390: "O",
|
|
17133
|
+
392: "c",
|
|
17134
|
+
393: "D",
|
|
17135
|
+
394: "D",
|
|
17136
|
+
396: "d",
|
|
17137
|
+
398: "E",
|
|
17138
|
+
400: "E",
|
|
17139
|
+
402: "f",
|
|
17140
|
+
403: "G",
|
|
17141
|
+
407: "I",
|
|
17142
|
+
409: "k",
|
|
17143
|
+
410: "l",
|
|
17144
|
+
412: "M",
|
|
17145
|
+
413: "N",
|
|
17146
|
+
414: "n",
|
|
17147
|
+
415: "O",
|
|
17148
|
+
421: "p",
|
|
17149
|
+
427: "t",
|
|
17150
|
+
429: "t",
|
|
17151
|
+
430: "T",
|
|
17152
|
+
434: "V",
|
|
17153
|
+
436: "y",
|
|
17154
|
+
438: "z",
|
|
17155
|
+
477: "e",
|
|
17156
|
+
485: "g",
|
|
17157
|
+
544: "N",
|
|
17158
|
+
545: "d",
|
|
17159
|
+
549: "z",
|
|
17160
|
+
564: "l",
|
|
17161
|
+
565: "n",
|
|
17162
|
+
566: "t",
|
|
17163
|
+
567: "j",
|
|
17164
|
+
570: "A",
|
|
17165
|
+
571: "C",
|
|
17166
|
+
572: "c",
|
|
17167
|
+
573: "L",
|
|
17168
|
+
574: "T",
|
|
17169
|
+
575: "s",
|
|
17170
|
+
576: "z",
|
|
17171
|
+
579: "B",
|
|
17172
|
+
580: "U",
|
|
17173
|
+
581: "V",
|
|
17174
|
+
582: "E",
|
|
17175
|
+
583: "e",
|
|
17176
|
+
584: "J",
|
|
17177
|
+
585: "j",
|
|
17178
|
+
586: "Q",
|
|
17179
|
+
587: "q",
|
|
17180
|
+
588: "R",
|
|
17181
|
+
589: "r",
|
|
17182
|
+
590: "Y",
|
|
17183
|
+
591: "y",
|
|
17184
|
+
592: "a",
|
|
17185
|
+
593: "a",
|
|
17186
|
+
595: "b",
|
|
17187
|
+
596: "o",
|
|
17188
|
+
597: "c",
|
|
17189
|
+
598: "d",
|
|
17190
|
+
599: "d",
|
|
17191
|
+
600: "e",
|
|
17192
|
+
603: "e",
|
|
17193
|
+
604: "e",
|
|
17194
|
+
605: "e",
|
|
17195
|
+
606: "e",
|
|
17196
|
+
607: "j",
|
|
17197
|
+
608: "g",
|
|
17198
|
+
609: "g",
|
|
17199
|
+
610: "G",
|
|
17200
|
+
613: "h",
|
|
17201
|
+
614: "h",
|
|
17202
|
+
616: "i",
|
|
17203
|
+
618: "I",
|
|
17204
|
+
619: "l",
|
|
17205
|
+
620: "l",
|
|
17206
|
+
621: "l",
|
|
17207
|
+
623: "m",
|
|
17208
|
+
624: "m",
|
|
17209
|
+
625: "m",
|
|
17210
|
+
626: "n",
|
|
17211
|
+
627: "n",
|
|
17212
|
+
628: "N",
|
|
17213
|
+
629: "o",
|
|
17214
|
+
633: "r",
|
|
17215
|
+
634: "r",
|
|
17216
|
+
635: "r",
|
|
17217
|
+
636: "r",
|
|
17218
|
+
637: "r",
|
|
17219
|
+
638: "r",
|
|
17220
|
+
639: "r",
|
|
17221
|
+
640: "R",
|
|
17222
|
+
641: "R",
|
|
17223
|
+
642: "s",
|
|
17224
|
+
647: "t",
|
|
17225
|
+
648: "t",
|
|
17226
|
+
649: "u",
|
|
17227
|
+
651: "v",
|
|
17228
|
+
652: "v",
|
|
17229
|
+
653: "w",
|
|
17230
|
+
654: "y",
|
|
17231
|
+
655: "Y",
|
|
17232
|
+
656: "z",
|
|
17233
|
+
657: "z",
|
|
17234
|
+
663: "c",
|
|
17235
|
+
665: "B",
|
|
17236
|
+
666: "e",
|
|
17237
|
+
667: "G",
|
|
17238
|
+
668: "H",
|
|
17239
|
+
669: "j",
|
|
17240
|
+
670: "k",
|
|
17241
|
+
671: "L",
|
|
17242
|
+
672: "q",
|
|
17243
|
+
686: "h",
|
|
17244
|
+
867: "a",
|
|
17245
|
+
868: "e",
|
|
17246
|
+
869: "i",
|
|
17247
|
+
870: "o",
|
|
17248
|
+
871: "u",
|
|
17249
|
+
872: "c",
|
|
17250
|
+
873: "d",
|
|
17251
|
+
874: "h",
|
|
17252
|
+
875: "m",
|
|
17253
|
+
876: "r",
|
|
17254
|
+
877: "t",
|
|
17255
|
+
878: "v",
|
|
17256
|
+
879: "x",
|
|
17257
|
+
7424: "A",
|
|
17258
|
+
7427: "B",
|
|
17259
|
+
7428: "C",
|
|
17260
|
+
7429: "D",
|
|
17261
|
+
7431: "E",
|
|
17262
|
+
7432: "e",
|
|
17263
|
+
7433: "i",
|
|
17264
|
+
7434: "J",
|
|
17265
|
+
7435: "K",
|
|
17266
|
+
7436: "L",
|
|
17267
|
+
7437: "M",
|
|
17268
|
+
7438: "N",
|
|
17269
|
+
7439: "O",
|
|
17270
|
+
7440: "O",
|
|
17271
|
+
7441: "o",
|
|
17272
|
+
7442: "o",
|
|
17273
|
+
7443: "o",
|
|
17274
|
+
7446: "o",
|
|
17275
|
+
7447: "o",
|
|
17276
|
+
7448: "P",
|
|
17277
|
+
7449: "R",
|
|
17278
|
+
7450: "R",
|
|
17279
|
+
7451: "T",
|
|
17280
|
+
7452: "U",
|
|
17281
|
+
7453: "u",
|
|
17282
|
+
7454: "u",
|
|
17283
|
+
7455: "m",
|
|
17284
|
+
7456: "V",
|
|
17285
|
+
7457: "W",
|
|
17286
|
+
7458: "Z",
|
|
17287
|
+
7522: "i",
|
|
17288
|
+
7523: "r",
|
|
17289
|
+
7524: "u",
|
|
17290
|
+
7525: "v",
|
|
17291
|
+
7834: "a",
|
|
17292
|
+
7835: "s",
|
|
17293
|
+
8305: "i",
|
|
17294
|
+
8341: "h",
|
|
17295
|
+
8342: "k",
|
|
17296
|
+
8343: "l",
|
|
17297
|
+
8344: "m",
|
|
17298
|
+
8345: "n",
|
|
17299
|
+
8346: "p",
|
|
17300
|
+
8347: "s",
|
|
17301
|
+
8348: "t",
|
|
17302
|
+
8580: "c"
|
|
17303
|
+
};
|
|
17304
|
+
for (let i = "̀".codePointAt(0); i <= "ͯ".codePointAt(0); ++i) {
|
|
17305
|
+
const diacritic = String.fromCodePoint(i);
|
|
17306
|
+
for (const asciiChar of "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz") {
|
|
17307
|
+
const withDiacriticCodePoint = (asciiChar + diacritic).normalize().codePointAt(0);
|
|
17308
|
+
if (withDiacriticCodePoint > 126) normalized[withDiacriticCodePoint] = asciiChar;
|
|
17309
|
+
}
|
|
17310
|
+
}
|
|
17311
|
+
var ranges = {
|
|
17312
|
+
a: [7844, 7863],
|
|
17313
|
+
e: [7870, 7879],
|
|
17314
|
+
o: [7888, 7907],
|
|
17315
|
+
u: [7912, 7921]
|
|
17316
|
+
};
|
|
17317
|
+
for (const lowerChar of Object.keys(ranges)) {
|
|
17318
|
+
const upperChar = lowerChar.toUpperCase();
|
|
17319
|
+
for (let i = ranges[lowerChar][0]; i <= ranges[lowerChar][1]; ++i) normalized[i] = i % 2 === 0 ? upperChar : lowerChar;
|
|
17320
|
+
}
|
|
17321
|
+
function normalizeRune(rune) {
|
|
17322
|
+
if (rune < 192 || rune > 8580) return rune;
|
|
17323
|
+
const normalizedChar = normalized[rune];
|
|
17324
|
+
if (normalizedChar !== void 0) return normalizedChar.codePointAt(0);
|
|
17325
|
+
return rune;
|
|
17326
|
+
}
|
|
17327
|
+
function toShort(number) {
|
|
17328
|
+
return number;
|
|
17329
|
+
}
|
|
17330
|
+
function toInt(number) {
|
|
17331
|
+
return number;
|
|
17332
|
+
}
|
|
17333
|
+
function maxInt16(num1, num2) {
|
|
17334
|
+
return num1 > num2 ? num1 : num2;
|
|
17335
|
+
}
|
|
17336
|
+
var strToRunes = (str) => str.split("").map((s) => s.codePointAt(0));
|
|
17337
|
+
var whitespaceRunes = new Set(" \f\n\r \v\xA0 \u2028\u2029 ".split("").map((v) => v.codePointAt(0)));
|
|
17338
|
+
for (let codePoint = " ".codePointAt(0); codePoint <= " ".codePointAt(0); codePoint++) whitespaceRunes.add(codePoint);
|
|
17339
|
+
var MAX_ASCII = "".codePointAt(0);
|
|
17340
|
+
var CAPITAL_A_RUNE = "A".codePointAt(0);
|
|
17341
|
+
var CAPITAL_Z_RUNE = "Z".codePointAt(0);
|
|
17342
|
+
var SMALL_A_RUNE = "a".codePointAt(0);
|
|
17343
|
+
var SMALL_Z_RUNE = "z".codePointAt(0);
|
|
17344
|
+
var NUMERAL_ZERO_RUNE = "0".codePointAt(0);
|
|
17345
|
+
var NUMERAL_NINE_RUNE = "9".codePointAt(0);
|
|
17346
|
+
function indexAt(index, max, forward) {
|
|
17347
|
+
if (forward) return index;
|
|
17348
|
+
return max - index - 1;
|
|
17349
|
+
}
|
|
17350
|
+
var SCORE_MATCH = 16;
|
|
17351
|
+
var SCORE_GAP_START = -3;
|
|
17352
|
+
var SCORE_GAP_EXTENTION = -1;
|
|
17353
|
+
var BONUS_BOUNDARY = SCORE_MATCH / 2;
|
|
17354
|
+
var BONUS_NON_WORD = SCORE_MATCH / 2;
|
|
17355
|
+
var BONUS_CAMEL_123 = 7;
|
|
17356
|
+
var BONUS_CONSECUTIVE = 4;
|
|
17357
|
+
var BONUS_FIRST_CHAR_MULTIPLIER = 2;
|
|
17358
|
+
function createPosSet(withPos) {
|
|
17359
|
+
if (withPos) return /* @__PURE__ */ new Set();
|
|
17360
|
+
return null;
|
|
17361
|
+
}
|
|
17362
|
+
function alloc16(offset, slab2, size) {
|
|
17363
|
+
if (slab2 !== null && slab2.i16.length > offset + size) {
|
|
17364
|
+
const subarray = slab2.i16.subarray(offset, offset + size);
|
|
17365
|
+
return [offset + size, subarray];
|
|
17366
|
+
}
|
|
17367
|
+
return [offset, new Int16Array(size)];
|
|
17368
|
+
}
|
|
17369
|
+
function alloc32(offset, slab2, size) {
|
|
17370
|
+
if (slab2 !== null && slab2.i32.length > offset + size) {
|
|
17371
|
+
const subarray = slab2.i32.subarray(offset, offset + size);
|
|
17372
|
+
return [offset + size, subarray];
|
|
17373
|
+
}
|
|
17374
|
+
return [offset, new Int32Array(size)];
|
|
17375
|
+
}
|
|
17376
|
+
function charClassOfAscii(rune) {
|
|
17377
|
+
if (rune >= SMALL_A_RUNE && rune <= SMALL_Z_RUNE) return 1;
|
|
17378
|
+
else if (rune >= CAPITAL_A_RUNE && rune <= CAPITAL_Z_RUNE) return 2;
|
|
17379
|
+
else if (rune >= NUMERAL_ZERO_RUNE && rune <= NUMERAL_NINE_RUNE) return 4;
|
|
17380
|
+
else return 0;
|
|
17381
|
+
}
|
|
17382
|
+
function charClassOfNonAscii(rune) {
|
|
17383
|
+
const char = String.fromCodePoint(rune);
|
|
17384
|
+
if (char !== char.toUpperCase()) return 1;
|
|
17385
|
+
else if (char !== char.toLowerCase()) return 2;
|
|
17386
|
+
else if (char.match(/\p{Number}/gu) !== null) return 4;
|
|
17387
|
+
else if (char.match(/\p{Letter}/gu) !== null) return 3;
|
|
17388
|
+
return 0;
|
|
17389
|
+
}
|
|
17390
|
+
function charClassOf(rune) {
|
|
17391
|
+
if (rune <= MAX_ASCII) return charClassOfAscii(rune);
|
|
17392
|
+
return charClassOfNonAscii(rune);
|
|
17393
|
+
}
|
|
17394
|
+
function bonusFor(prevClass, currClass) {
|
|
17395
|
+
if (prevClass === 0 && currClass !== 0) return BONUS_BOUNDARY;
|
|
17396
|
+
else if (prevClass === 1 && currClass === 2 || prevClass !== 4 && currClass === 4) return BONUS_CAMEL_123;
|
|
17397
|
+
else if (currClass === 0) return BONUS_NON_WORD;
|
|
17398
|
+
return 0;
|
|
17399
|
+
}
|
|
17400
|
+
function bonusAt(input, idx) {
|
|
17401
|
+
if (idx === 0) return BONUS_BOUNDARY;
|
|
17402
|
+
return bonusFor(charClassOf(input[idx - 1]), charClassOf(input[idx]));
|
|
17403
|
+
}
|
|
17404
|
+
function trySkip(input, caseSensitive, char, from) {
|
|
17405
|
+
let rest = input.slice(from);
|
|
17406
|
+
let idx = rest.indexOf(char);
|
|
17407
|
+
if (idx === 0) return from;
|
|
17408
|
+
if (!caseSensitive && char >= SMALL_A_RUNE && char <= SMALL_Z_RUNE) {
|
|
17409
|
+
if (idx > 0) rest = rest.slice(0, idx);
|
|
17410
|
+
const uidx = rest.indexOf(char - 32);
|
|
17411
|
+
if (uidx >= 0) idx = uidx;
|
|
17412
|
+
}
|
|
17413
|
+
if (idx < 0) return -1;
|
|
17414
|
+
return from + idx;
|
|
17415
|
+
}
|
|
17416
|
+
function isAscii(runes) {
|
|
17417
|
+
for (const rune of runes) if (rune >= 128) return false;
|
|
17418
|
+
return true;
|
|
16527
17419
|
}
|
|
16528
|
-
function
|
|
16529
|
-
|
|
16530
|
-
if (!
|
|
16531
|
-
|
|
17420
|
+
function asciiFuzzyIndex(input, pattern, caseSensitive) {
|
|
17421
|
+
if (!isAscii(input)) return 0;
|
|
17422
|
+
if (!isAscii(pattern)) return -1;
|
|
17423
|
+
let firstIdx = 0, idx = 0;
|
|
17424
|
+
for (let pidx = 0; pidx < pattern.length; pidx++) {
|
|
17425
|
+
idx = trySkip(input, caseSensitive, pattern[pidx], idx);
|
|
17426
|
+
if (idx < 0) return -1;
|
|
17427
|
+
if (pidx === 0 && idx > 0) firstIdx = idx - 1;
|
|
17428
|
+
idx++;
|
|
17429
|
+
}
|
|
17430
|
+
return firstIdx;
|
|
17431
|
+
}
|
|
17432
|
+
var fuzzyMatchV2 = (caseSensitive, normalize, forward, input, pattern, withPos, slab2) => {
|
|
17433
|
+
const M = pattern.length;
|
|
17434
|
+
if (M === 0) return [{
|
|
17435
|
+
start: 0,
|
|
17436
|
+
end: 0,
|
|
17437
|
+
score: 0
|
|
17438
|
+
}, createPosSet(withPos)];
|
|
17439
|
+
const N = input.length;
|
|
17440
|
+
if (slab2 !== null && N * M > slab2.i16.length) return fuzzyMatchV1(caseSensitive, normalize, forward, input, pattern, withPos);
|
|
17441
|
+
const idx = asciiFuzzyIndex(input, pattern, caseSensitive);
|
|
17442
|
+
if (idx < 0) return [{
|
|
17443
|
+
start: -1,
|
|
17444
|
+
end: -1,
|
|
17445
|
+
score: 0
|
|
17446
|
+
}, null];
|
|
17447
|
+
let offset16 = 0, offset32 = 0, H0 = null, C0 = null, B = null, F = null;
|
|
17448
|
+
[offset16, H0] = alloc16(offset16, slab2, N);
|
|
17449
|
+
[offset16, C0] = alloc16(offset16, slab2, N);
|
|
17450
|
+
[offset16, B] = alloc16(offset16, slab2, N);
|
|
17451
|
+
[offset32, F] = alloc32(offset32, slab2, M);
|
|
17452
|
+
const [, T] = alloc32(offset32, slab2, N);
|
|
17453
|
+
for (let i = 0; i < T.length; i++) T[i] = input[i];
|
|
17454
|
+
let maxScore = toShort(0), maxScorePos = 0;
|
|
17455
|
+
let pidx = 0, lastIdx = 0;
|
|
17456
|
+
const pchar0 = pattern[0];
|
|
17457
|
+
let pchar = pattern[0], prevH0 = toShort(0), prevCharClass = 0, inGap = false;
|
|
17458
|
+
let Tsub = T.subarray(idx);
|
|
17459
|
+
let H0sub = H0.subarray(idx).subarray(0, Tsub.length), C0sub = C0.subarray(idx).subarray(0, Tsub.length), Bsub = B.subarray(idx).subarray(0, Tsub.length);
|
|
17460
|
+
for (let [off, char] of Tsub.entries()) {
|
|
17461
|
+
let charClass = null;
|
|
17462
|
+
if (char <= MAX_ASCII) {
|
|
17463
|
+
charClass = charClassOfAscii(char);
|
|
17464
|
+
if (!caseSensitive && charClass === 2) char += 32;
|
|
17465
|
+
} else {
|
|
17466
|
+
charClass = charClassOfNonAscii(char);
|
|
17467
|
+
if (!caseSensitive && charClass === 2) char = String.fromCodePoint(char).toLowerCase().codePointAt(0);
|
|
17468
|
+
if (normalize) char = normalizeRune(char);
|
|
17469
|
+
}
|
|
17470
|
+
Tsub[off] = char;
|
|
17471
|
+
const bonus = bonusFor(prevCharClass, charClass);
|
|
17472
|
+
Bsub[off] = bonus;
|
|
17473
|
+
prevCharClass = charClass;
|
|
17474
|
+
if (char === pchar) {
|
|
17475
|
+
if (pidx < M) {
|
|
17476
|
+
F[pidx] = toInt(idx + off);
|
|
17477
|
+
pidx++;
|
|
17478
|
+
pchar = pattern[Math.min(pidx, M - 1)];
|
|
17479
|
+
}
|
|
17480
|
+
lastIdx = idx + off;
|
|
17481
|
+
}
|
|
17482
|
+
if (char === pchar0) {
|
|
17483
|
+
const score = SCORE_MATCH + bonus * BONUS_FIRST_CHAR_MULTIPLIER;
|
|
17484
|
+
H0sub[off] = score;
|
|
17485
|
+
C0sub[off] = 1;
|
|
17486
|
+
if (M === 1 && (forward && score > maxScore || !forward && score >= maxScore)) {
|
|
17487
|
+
maxScore = score;
|
|
17488
|
+
maxScorePos = idx + off;
|
|
17489
|
+
if (forward && bonus === BONUS_BOUNDARY) break;
|
|
17490
|
+
}
|
|
17491
|
+
inGap = false;
|
|
17492
|
+
} else {
|
|
17493
|
+
if (inGap) H0sub[off] = maxInt16(prevH0 + SCORE_GAP_EXTENTION, 0);
|
|
17494
|
+
else H0sub[off] = maxInt16(prevH0 + SCORE_GAP_START, 0);
|
|
17495
|
+
C0sub[off] = 0;
|
|
17496
|
+
inGap = true;
|
|
17497
|
+
}
|
|
17498
|
+
prevH0 = H0sub[off];
|
|
17499
|
+
}
|
|
17500
|
+
if (pidx !== M) return [{
|
|
17501
|
+
start: -1,
|
|
17502
|
+
end: -1,
|
|
17503
|
+
score: 0
|
|
17504
|
+
}, null];
|
|
17505
|
+
if (M === 1) {
|
|
17506
|
+
const result = {
|
|
17507
|
+
start: maxScorePos,
|
|
17508
|
+
end: maxScorePos + 1,
|
|
17509
|
+
score: maxScore
|
|
17510
|
+
};
|
|
17511
|
+
if (!withPos) return [result, null];
|
|
17512
|
+
const pos2 = /* @__PURE__ */ new Set();
|
|
17513
|
+
pos2.add(maxScorePos);
|
|
17514
|
+
return [result, pos2];
|
|
17515
|
+
}
|
|
17516
|
+
const f0 = F[0];
|
|
17517
|
+
const width = lastIdx - f0 + 1;
|
|
17518
|
+
let H = null;
|
|
17519
|
+
[offset16, H] = alloc16(offset16, slab2, width * M);
|
|
17520
|
+
{
|
|
17521
|
+
const toCopy = H0.subarray(f0, lastIdx + 1);
|
|
17522
|
+
for (const [i, v] of toCopy.entries()) H[i] = v;
|
|
17523
|
+
}
|
|
17524
|
+
let [, C] = alloc16(offset16, slab2, width * M);
|
|
17525
|
+
{
|
|
17526
|
+
const toCopy = C0.subarray(f0, lastIdx + 1);
|
|
17527
|
+
for (const [i, v] of toCopy.entries()) C[i] = v;
|
|
17528
|
+
}
|
|
17529
|
+
const Fsub = F.subarray(1);
|
|
17530
|
+
const Psub = pattern.slice(1).slice(0, Fsub.length);
|
|
17531
|
+
for (const [off, f] of Fsub.entries()) {
|
|
17532
|
+
let inGap2 = false;
|
|
17533
|
+
const pchar2 = Psub[off], pidx2 = off + 1, row = pidx2 * width, Tsub2 = T.subarray(f, lastIdx + 1), Bsub2 = B.subarray(f).subarray(0, Tsub2.length), Csub = C.subarray(row + f - f0).subarray(0, Tsub2.length), Cdiag = C.subarray(row + f - f0 - 1 - width).subarray(0, Tsub2.length), Hsub = H.subarray(row + f - f0).subarray(0, Tsub2.length), Hdiag = H.subarray(row + f - f0 - 1 - width).subarray(0, Tsub2.length), Hleft = H.subarray(row + f - f0 - 1).subarray(0, Tsub2.length);
|
|
17534
|
+
Hleft[0] = 0;
|
|
17535
|
+
for (const [off2, char] of Tsub2.entries()) {
|
|
17536
|
+
const col = off2 + f;
|
|
17537
|
+
let s1 = 0, s2 = 0, consecutive = 0;
|
|
17538
|
+
if (inGap2) s2 = Hleft[off2] + SCORE_GAP_EXTENTION;
|
|
17539
|
+
else s2 = Hleft[off2] + SCORE_GAP_START;
|
|
17540
|
+
if (pchar2 === char) {
|
|
17541
|
+
s1 = Hdiag[off2] + SCORE_MATCH;
|
|
17542
|
+
let b = Bsub2[off2];
|
|
17543
|
+
consecutive = Cdiag[off2] + 1;
|
|
17544
|
+
if (b === BONUS_BOUNDARY) consecutive = 1;
|
|
17545
|
+
else if (consecutive > 1) b = maxInt16(b, maxInt16(BONUS_CONSECUTIVE, B[col - consecutive + 1]));
|
|
17546
|
+
if (s1 + b < s2) {
|
|
17547
|
+
s1 += Bsub2[off2];
|
|
17548
|
+
consecutive = 0;
|
|
17549
|
+
} else s1 += b;
|
|
17550
|
+
}
|
|
17551
|
+
Csub[off2] = consecutive;
|
|
17552
|
+
inGap2 = s1 < s2;
|
|
17553
|
+
const score = maxInt16(maxInt16(s1, s2), 0);
|
|
17554
|
+
if (pidx2 === M - 1 && (forward && score > maxScore || !forward && score >= maxScore)) {
|
|
17555
|
+
maxScore = score;
|
|
17556
|
+
maxScorePos = col;
|
|
17557
|
+
}
|
|
17558
|
+
Hsub[off2] = score;
|
|
17559
|
+
}
|
|
17560
|
+
}
|
|
17561
|
+
const pos = createPosSet(withPos);
|
|
17562
|
+
let j = f0;
|
|
17563
|
+
if (withPos && pos !== null) {
|
|
17564
|
+
let i = M - 1;
|
|
17565
|
+
j = maxScorePos;
|
|
17566
|
+
let preferMatch = true;
|
|
17567
|
+
while (true) {
|
|
17568
|
+
const I = i * width, j0 = j - f0, s = H[I + j0];
|
|
17569
|
+
let s1 = 0, s2 = 0;
|
|
17570
|
+
if (i > 0 && j >= F[i]) s1 = H[I - width + j0 - 1];
|
|
17571
|
+
if (j > F[i]) s2 = H[I + j0 - 1];
|
|
17572
|
+
if (s > s1 && (s > s2 || s === s2 && preferMatch)) {
|
|
17573
|
+
pos.add(j);
|
|
17574
|
+
if (i === 0) break;
|
|
17575
|
+
i--;
|
|
17576
|
+
}
|
|
17577
|
+
preferMatch = C[I + j0] > 1 || I + width + j0 + 1 < C.length && C[I + width + j0 + 1] > 0;
|
|
17578
|
+
j--;
|
|
17579
|
+
}
|
|
17580
|
+
}
|
|
17581
|
+
return [{
|
|
17582
|
+
start: j,
|
|
17583
|
+
end: maxScorePos + 1,
|
|
17584
|
+
score: maxScore
|
|
17585
|
+
}, pos];
|
|
17586
|
+
};
|
|
17587
|
+
function calculateScore(caseSensitive, normalize, text, pattern, sidx, eidx, withPos) {
|
|
17588
|
+
let pidx = 0, score = 0, inGap = false, consecutive = 0, firstBonus = toShort(0);
|
|
17589
|
+
const pos = createPosSet(withPos);
|
|
17590
|
+
let prevCharClass = 0;
|
|
17591
|
+
if (sidx > 0) prevCharClass = charClassOf(text[sidx - 1]);
|
|
17592
|
+
for (let idx = sidx; idx < eidx; idx++) {
|
|
17593
|
+
let rune = text[idx];
|
|
17594
|
+
const charClass = charClassOf(rune);
|
|
17595
|
+
if (!caseSensitive) {
|
|
17596
|
+
if (rune >= CAPITAL_A_RUNE && rune <= CAPITAL_Z_RUNE) rune += 32;
|
|
17597
|
+
else if (rune > MAX_ASCII) rune = String.fromCodePoint(rune).toLowerCase().codePointAt(0);
|
|
17598
|
+
}
|
|
17599
|
+
if (normalize) rune = normalizeRune(rune);
|
|
17600
|
+
if (rune === pattern[pidx]) {
|
|
17601
|
+
if (withPos && pos !== null) pos.add(idx);
|
|
17602
|
+
score += SCORE_MATCH;
|
|
17603
|
+
let bonus = bonusFor(prevCharClass, charClass);
|
|
17604
|
+
if (consecutive === 0) firstBonus = bonus;
|
|
17605
|
+
else {
|
|
17606
|
+
if (bonus === BONUS_BOUNDARY) firstBonus = bonus;
|
|
17607
|
+
bonus = maxInt16(maxInt16(bonus, firstBonus), BONUS_CONSECUTIVE);
|
|
17608
|
+
}
|
|
17609
|
+
if (pidx === 0) score += bonus * BONUS_FIRST_CHAR_MULTIPLIER;
|
|
17610
|
+
else score += bonus;
|
|
17611
|
+
inGap = false;
|
|
17612
|
+
consecutive++;
|
|
17613
|
+
pidx++;
|
|
17614
|
+
} else {
|
|
17615
|
+
if (inGap) score += SCORE_GAP_EXTENTION;
|
|
17616
|
+
else score += SCORE_GAP_START;
|
|
17617
|
+
inGap = true;
|
|
17618
|
+
consecutive = 0;
|
|
17619
|
+
firstBonus = 0;
|
|
17620
|
+
}
|
|
17621
|
+
prevCharClass = charClass;
|
|
17622
|
+
}
|
|
17623
|
+
return [score, pos];
|
|
17624
|
+
}
|
|
17625
|
+
var fuzzyMatchV1 = (caseSensitive, normalize, forward, text, pattern, withPos, slab2) => {
|
|
17626
|
+
if (pattern.length === 0) return [{
|
|
17627
|
+
start: 0,
|
|
17628
|
+
end: 0,
|
|
17629
|
+
score: 0
|
|
17630
|
+
}, null];
|
|
17631
|
+
if (asciiFuzzyIndex(text, pattern, caseSensitive) < 0) return [{
|
|
17632
|
+
start: -1,
|
|
17633
|
+
end: -1,
|
|
17634
|
+
score: 0
|
|
17635
|
+
}, null];
|
|
17636
|
+
let pidx = 0, sidx = -1, eidx = -1;
|
|
17637
|
+
const lenRunes = text.length;
|
|
17638
|
+
const lenPattern = pattern.length;
|
|
17639
|
+
for (let index = 0; index < lenRunes; index++) {
|
|
17640
|
+
let rune = text[indexAt(index, lenRunes, forward)];
|
|
17641
|
+
if (!caseSensitive) {
|
|
17642
|
+
if (rune >= CAPITAL_A_RUNE && rune <= CAPITAL_Z_RUNE) rune += 32;
|
|
17643
|
+
else if (rune > MAX_ASCII) rune = String.fromCodePoint(rune).toLowerCase().codePointAt(0);
|
|
17644
|
+
}
|
|
17645
|
+
if (normalize) rune = normalizeRune(rune);
|
|
17646
|
+
const pchar = pattern[indexAt(pidx, lenPattern, forward)];
|
|
17647
|
+
if (rune === pchar) {
|
|
17648
|
+
if (sidx < 0) sidx = index;
|
|
17649
|
+
pidx++;
|
|
17650
|
+
if (pidx === lenPattern) {
|
|
17651
|
+
eidx = index + 1;
|
|
17652
|
+
break;
|
|
17653
|
+
}
|
|
17654
|
+
}
|
|
17655
|
+
}
|
|
17656
|
+
if (sidx >= 0 && eidx >= 0) {
|
|
17657
|
+
pidx--;
|
|
17658
|
+
for (let index = eidx - 1; index >= sidx; index--) {
|
|
17659
|
+
let rune = text[indexAt(index, lenRunes, forward)];
|
|
17660
|
+
if (!caseSensitive) {
|
|
17661
|
+
if (rune >= CAPITAL_A_RUNE && rune <= CAPITAL_Z_RUNE) rune += 32;
|
|
17662
|
+
else if (rune > MAX_ASCII) rune = String.fromCodePoint(rune).toLowerCase().codePointAt(0);
|
|
17663
|
+
}
|
|
17664
|
+
const pchar = pattern[indexAt(pidx, lenPattern, forward)];
|
|
17665
|
+
if (rune === pchar) {
|
|
17666
|
+
pidx--;
|
|
17667
|
+
if (pidx < 0) {
|
|
17668
|
+
sidx = index;
|
|
17669
|
+
break;
|
|
17670
|
+
}
|
|
17671
|
+
}
|
|
17672
|
+
}
|
|
17673
|
+
if (!forward) {
|
|
17674
|
+
const sidxTemp = sidx;
|
|
17675
|
+
sidx = lenRunes - eidx;
|
|
17676
|
+
eidx = lenRunes - sidxTemp;
|
|
17677
|
+
}
|
|
17678
|
+
const [score, pos] = calculateScore(caseSensitive, normalize, text, pattern, sidx, eidx, withPos);
|
|
17679
|
+
return [{
|
|
17680
|
+
start: sidx,
|
|
17681
|
+
end: eidx,
|
|
17682
|
+
score
|
|
17683
|
+
}, pos];
|
|
17684
|
+
}
|
|
17685
|
+
return [{
|
|
17686
|
+
start: -1,
|
|
17687
|
+
end: -1,
|
|
17688
|
+
score: 0
|
|
17689
|
+
}, null];
|
|
17690
|
+
};
|
|
17691
|
+
var exactMatchNaive = (caseSensitive, normalize, forward, text, pattern, withPos, slab2) => {
|
|
17692
|
+
if (pattern.length === 0) return [{
|
|
17693
|
+
start: 0,
|
|
17694
|
+
end: 0,
|
|
17695
|
+
score: 0
|
|
17696
|
+
}, null];
|
|
17697
|
+
const lenRunes = text.length;
|
|
17698
|
+
const lenPattern = pattern.length;
|
|
17699
|
+
if (lenRunes < lenPattern) return [{
|
|
17700
|
+
start: -1,
|
|
17701
|
+
end: -1,
|
|
17702
|
+
score: 0
|
|
17703
|
+
}, null];
|
|
17704
|
+
if (asciiFuzzyIndex(text, pattern, caseSensitive) < 0) return [{
|
|
17705
|
+
start: -1,
|
|
17706
|
+
end: -1,
|
|
17707
|
+
score: 0
|
|
17708
|
+
}, null];
|
|
17709
|
+
let pidx = 0;
|
|
17710
|
+
let bestPos = -1, bonus = toShort(0), bestBonus = toShort(-1);
|
|
17711
|
+
for (let index = 0; index < lenRunes; index++) {
|
|
17712
|
+
const index_ = indexAt(index, lenRunes, forward);
|
|
17713
|
+
let rune = text[index_];
|
|
17714
|
+
if (!caseSensitive) {
|
|
17715
|
+
if (rune >= CAPITAL_A_RUNE && rune <= CAPITAL_Z_RUNE) rune += 32;
|
|
17716
|
+
else if (rune > MAX_ASCII) rune = String.fromCodePoint(rune).toLowerCase().codePointAt(0);
|
|
17717
|
+
}
|
|
17718
|
+
if (normalize) rune = normalizeRune(rune);
|
|
17719
|
+
const pidx_ = indexAt(pidx, lenPattern, forward);
|
|
17720
|
+
if (pattern[pidx_] === rune) {
|
|
17721
|
+
if (pidx_ === 0) bonus = bonusAt(text, index_);
|
|
17722
|
+
pidx++;
|
|
17723
|
+
if (pidx === lenPattern) {
|
|
17724
|
+
if (bonus > bestBonus) {
|
|
17725
|
+
bestPos = index;
|
|
17726
|
+
bestBonus = bonus;
|
|
17727
|
+
}
|
|
17728
|
+
if (bonus === BONUS_BOUNDARY) break;
|
|
17729
|
+
index -= pidx - 1;
|
|
17730
|
+
pidx = 0;
|
|
17731
|
+
bonus = 0;
|
|
17732
|
+
}
|
|
17733
|
+
} else {
|
|
17734
|
+
index -= pidx;
|
|
17735
|
+
pidx = 0;
|
|
17736
|
+
bonus = 0;
|
|
17737
|
+
}
|
|
17738
|
+
}
|
|
17739
|
+
if (bestPos >= 0) {
|
|
17740
|
+
let sidx = 0, eidx = 0;
|
|
17741
|
+
if (forward) {
|
|
17742
|
+
sidx = bestPos - lenPattern + 1;
|
|
17743
|
+
eidx = bestPos + 1;
|
|
17744
|
+
} else {
|
|
17745
|
+
sidx = lenRunes - (bestPos + 1);
|
|
17746
|
+
eidx = lenRunes - (bestPos - lenPattern + 1);
|
|
17747
|
+
}
|
|
17748
|
+
const [score] = calculateScore(caseSensitive, normalize, text, pattern, sidx, eidx, false);
|
|
17749
|
+
return [{
|
|
17750
|
+
start: sidx,
|
|
17751
|
+
end: eidx,
|
|
17752
|
+
score
|
|
17753
|
+
}, null];
|
|
17754
|
+
}
|
|
17755
|
+
return [{
|
|
17756
|
+
start: -1,
|
|
17757
|
+
end: -1,
|
|
17758
|
+
score: 0
|
|
17759
|
+
}, null];
|
|
17760
|
+
};
|
|
17761
|
+
var SLAB_16_SIZE = 102400;
|
|
17762
|
+
var SLAB_32_SIZE = 2048;
|
|
17763
|
+
function makeSlab(size16, size32) {
|
|
17764
|
+
return {
|
|
17765
|
+
i16: new Int16Array(size16),
|
|
17766
|
+
i32: new Int32Array(size32)
|
|
17767
|
+
};
|
|
16532
17768
|
}
|
|
16533
|
-
|
|
16534
|
-
|
|
16535
|
-
|
|
16536
|
-
|
|
17769
|
+
var slab = makeSlab(SLAB_16_SIZE, SLAB_32_SIZE);
|
|
17770
|
+
var buildPatternForBasicMatch = (query, casing, normalize) => {
|
|
17771
|
+
let caseSensitive = false;
|
|
17772
|
+
switch (casing) {
|
|
17773
|
+
case "smart-case":
|
|
17774
|
+
if (query.toLowerCase() !== query) caseSensitive = true;
|
|
17775
|
+
break;
|
|
17776
|
+
case "case-sensitive":
|
|
17777
|
+
caseSensitive = true;
|
|
17778
|
+
break;
|
|
17779
|
+
case "case-insensitive":
|
|
17780
|
+
query = query.toLowerCase();
|
|
17781
|
+
caseSensitive = false;
|
|
17782
|
+
}
|
|
17783
|
+
let queryRunes = strToRunes(query);
|
|
17784
|
+
if (normalize) queryRunes = queryRunes.map(normalizeRune);
|
|
17785
|
+
return {
|
|
17786
|
+
queryRunes,
|
|
17787
|
+
caseSensitive
|
|
17788
|
+
};
|
|
17789
|
+
};
|
|
17790
|
+
function getResultFromScoreMap(scoreMap, limit) {
|
|
17791
|
+
const scoresInDesc = Object.keys(scoreMap).map((v) => parseInt(v, 10)).sort((a, b) => b - a);
|
|
17792
|
+
let result = [];
|
|
17793
|
+
for (const score of scoresInDesc) {
|
|
17794
|
+
result = result.concat(scoreMap[score]);
|
|
17795
|
+
if (result.length >= limit) break;
|
|
17796
|
+
}
|
|
17797
|
+
return result;
|
|
16537
17798
|
}
|
|
16538
|
-
function
|
|
16539
|
-
return
|
|
17799
|
+
function getBasicMatchIter(scoreMap, queryRunes, caseSensitive) {
|
|
17800
|
+
return (idx) => {
|
|
17801
|
+
const itemRunes = this.runesList[idx];
|
|
17802
|
+
if (queryRunes.length > itemRunes.length) return;
|
|
17803
|
+
let [match, positions] = this.algoFn(caseSensitive, this.opts.normalize, this.opts.forward, itemRunes, queryRunes, true, slab);
|
|
17804
|
+
if (match.start === -1) return;
|
|
17805
|
+
if (this.opts.fuzzy === false) {
|
|
17806
|
+
positions = /* @__PURE__ */ new Set();
|
|
17807
|
+
for (let position = match.start; position < match.end; ++position) positions.add(position);
|
|
17808
|
+
}
|
|
17809
|
+
const scoreKey = this.opts.sort ? match.score : 0;
|
|
17810
|
+
if (scoreMap[scoreKey] === void 0) scoreMap[scoreKey] = [];
|
|
17811
|
+
scoreMap[scoreKey].push({
|
|
17812
|
+
item: this.items[idx],
|
|
17813
|
+
...match,
|
|
17814
|
+
positions: positions != null ? positions : /* @__PURE__ */ new Set()
|
|
17815
|
+
});
|
|
17816
|
+
};
|
|
16540
17817
|
}
|
|
16541
|
-
|
|
17818
|
+
var isNode = typeof __require !== "undefined" && typeof window === "undefined";
|
|
17819
|
+
function asyncMatcher(token, len, iter2, onFinish) {
|
|
17820
|
+
return new Promise((resolve, reject) => {
|
|
17821
|
+
const INCREMENT = 1e3;
|
|
17822
|
+
let i = 0, end = Math.min(INCREMENT, len);
|
|
17823
|
+
const step = () => {
|
|
17824
|
+
if (token.cancelled) return reject("search cancelled");
|
|
17825
|
+
for (; i < end; ++i) iter2(i);
|
|
17826
|
+
if (end < len) {
|
|
17827
|
+
end = Math.min(end + INCREMENT, len);
|
|
17828
|
+
isNode ? setImmediate(step) : setTimeout(step);
|
|
17829
|
+
} else resolve(onFinish());
|
|
17830
|
+
};
|
|
17831
|
+
step();
|
|
17832
|
+
});
|
|
17833
|
+
}
|
|
17834
|
+
function asyncBasicMatch(query, token) {
|
|
17835
|
+
const { queryRunes, caseSensitive } = buildPatternForBasicMatch(query, this.opts.casing, this.opts.normalize);
|
|
17836
|
+
const scoreMap = {};
|
|
17837
|
+
return asyncMatcher(token, this.runesList.length, getBasicMatchIter.bind(this)(scoreMap, queryRunes, caseSensitive), () => getResultFromScoreMap(scoreMap, this.opts.limit));
|
|
17838
|
+
}
|
|
17839
|
+
var defaultOpts = {
|
|
17840
|
+
limit: Infinity,
|
|
17841
|
+
selector: (v) => v,
|
|
17842
|
+
casing: "smart-case",
|
|
17843
|
+
normalize: true,
|
|
17844
|
+
fuzzy: "v2",
|
|
17845
|
+
tiebreakers: [],
|
|
17846
|
+
sort: true,
|
|
17847
|
+
forward: true
|
|
17848
|
+
};
|
|
17849
|
+
var BaseFinder = class {
|
|
17850
|
+
constructor(list, ...optionsTuple) {
|
|
17851
|
+
this.opts = {
|
|
17852
|
+
...defaultOpts,
|
|
17853
|
+
...optionsTuple[0]
|
|
17854
|
+
};
|
|
17855
|
+
this.items = list;
|
|
17856
|
+
this.runesList = list.map((item) => strToRunes(this.opts.selector(item).normalize()));
|
|
17857
|
+
this.algoFn = exactMatchNaive;
|
|
17858
|
+
switch (this.opts.fuzzy) {
|
|
17859
|
+
case "v2":
|
|
17860
|
+
this.algoFn = fuzzyMatchV2;
|
|
17861
|
+
break;
|
|
17862
|
+
case "v1": this.algoFn = fuzzyMatchV1;
|
|
17863
|
+
}
|
|
17864
|
+
}
|
|
17865
|
+
};
|
|
17866
|
+
({ ...defaultOpts });
|
|
17867
|
+
var asyncDefaultOpts = {
|
|
17868
|
+
...defaultOpts,
|
|
17869
|
+
match: asyncBasicMatch
|
|
17870
|
+
};
|
|
17871
|
+
var AsyncFinder = class extends BaseFinder {
|
|
17872
|
+
constructor(list, ...optionsTuple) {
|
|
17873
|
+
super(list, ...optionsTuple);
|
|
17874
|
+
this.opts = {
|
|
17875
|
+
...asyncDefaultOpts,
|
|
17876
|
+
...optionsTuple[0]
|
|
17877
|
+
};
|
|
17878
|
+
this.token = { cancelled: false };
|
|
17879
|
+
}
|
|
17880
|
+
async find(query) {
|
|
17881
|
+
this.token.cancelled = true;
|
|
17882
|
+
this.token = { cancelled: false };
|
|
17883
|
+
if (query.length === 0 || this.items.length === 0) return this.items.slice(0, this.opts.limit).map(createResultItemWithEmptyPos);
|
|
17884
|
+
query = query.normalize();
|
|
17885
|
+
return postProcessResultItems(await this.opts.match.bind(this)(query, this.token), this.opts);
|
|
17886
|
+
}
|
|
17887
|
+
};
|
|
17888
|
+
var createResultItemWithEmptyPos = (item) => ({
|
|
17889
|
+
item,
|
|
17890
|
+
start: -1,
|
|
17891
|
+
end: -1,
|
|
17892
|
+
score: 0,
|
|
17893
|
+
positions: /* @__PURE__ */ new Set()
|
|
17894
|
+
});
|
|
17895
|
+
function postProcessResultItems(result, opts) {
|
|
17896
|
+
if (opts.sort) {
|
|
17897
|
+
const { selector } = opts;
|
|
17898
|
+
result.sort((a, b) => {
|
|
17899
|
+
if (a.score === b.score) for (const tiebreaker of opts.tiebreakers) {
|
|
17900
|
+
const diff = tiebreaker(a, b, selector);
|
|
17901
|
+
if (diff !== 0) return diff;
|
|
17902
|
+
}
|
|
17903
|
+
return 0;
|
|
17904
|
+
});
|
|
17905
|
+
}
|
|
17906
|
+
if (Number.isFinite(opts.limit)) result.splice(opts.limit);
|
|
17907
|
+
return result;
|
|
17908
|
+
}
|
|
17909
|
+
var AsyncFzf = class {
|
|
17910
|
+
constructor(list, ...optionsTuple) {
|
|
17911
|
+
this.finder = new AsyncFinder(list, ...optionsTuple);
|
|
17912
|
+
this.find = this.finder.find.bind(this.finder);
|
|
17913
|
+
}
|
|
17914
|
+
};
|
|
17915
|
+
//#endregion
|
|
17916
|
+
//#region ../../node_modules/.bun/@base-ui+react@1.4.1+fa6c2f29eeb10566/node_modules/@base-ui/react/esm/tabs/root/TabsRootContext.js
|
|
17917
|
+
/**
|
|
17918
|
+
* @internal
|
|
17919
|
+
*/
|
|
17920
|
+
var TabsRootContext = /*#__PURE__*/ React.createContext(void 0);
|
|
17921
|
+
if (process.env.NODE_ENV !== "production") TabsRootContext.displayName = "TabsRootContext";
|
|
17922
|
+
function useTabsRootContext() {
|
|
17923
|
+
const context = React.useContext(TabsRootContext);
|
|
17924
|
+
if (context === void 0) throw new Error(process.env.NODE_ENV !== "production" ? "Base UI: TabsRootContext is missing. Tabs parts must be placed within <Tabs.Root>." : formatErrorMessage(64));
|
|
17925
|
+
return context;
|
|
17926
|
+
}
|
|
17927
|
+
//#endregion
|
|
17928
|
+
//#region ../../node_modules/.bun/@base-ui+react@1.4.1+fa6c2f29eeb10566/node_modules/@base-ui/react/esm/tabs/root/TabsRootDataAttributes.js
|
|
17929
|
+
var TabsRootDataAttributes = /*#__PURE__*/ function(TabsRootDataAttributes) {
|
|
17930
|
+
/**
|
|
17931
|
+
* Indicates the direction of the activation (based on the previous active tab).
|
|
17932
|
+
* @type {'left' | 'right' | 'up' | 'down' | 'none'}
|
|
17933
|
+
*/
|
|
17934
|
+
TabsRootDataAttributes["activationDirection"] = "data-activation-direction";
|
|
17935
|
+
/**
|
|
17936
|
+
* Indicates the orientation of the tabs.
|
|
17937
|
+
* @type {'horizontal' | 'vertical'}
|
|
17938
|
+
*/
|
|
17939
|
+
TabsRootDataAttributes["orientation"] = "data-orientation";
|
|
17940
|
+
return TabsRootDataAttributes;
|
|
17941
|
+
}({});
|
|
17942
|
+
//#endregion
|
|
17943
|
+
//#region ../../node_modules/.bun/@base-ui+react@1.4.1+fa6c2f29eeb10566/node_modules/@base-ui/react/esm/tabs/root/stateAttributesMapping.js
|
|
17944
|
+
var tabsStateAttributesMapping = { tabActivationDirection: (dir) => ({ [TabsRootDataAttributes.activationDirection]: dir }) };
|
|
17945
|
+
//#endregion
|
|
17946
|
+
//#region ../../node_modules/.bun/@base-ui+react@1.4.1+fa6c2f29eeb10566/node_modules/@base-ui/react/esm/tabs/root/TabsRoot.js
|
|
17947
|
+
/**
|
|
17948
|
+
* Groups the tabs and the corresponding panels.
|
|
17949
|
+
* Renders a `<div>` element.
|
|
17950
|
+
*
|
|
17951
|
+
* Documentation: [Base UI Tabs](https://base-ui.com/react/components/tabs)
|
|
17952
|
+
*/
|
|
17953
|
+
var TabsRoot = /*#__PURE__*/ React.forwardRef(function TabsRoot(componentProps, forwardedRef) {
|
|
17954
|
+
const { className, defaultValue: defaultValueProp = 0, onValueChange: onValueChangeProp, orientation = "horizontal", render, value: valueProp, style, ...elementProps } = componentProps;
|
|
17955
|
+
const hasExplicitDefaultValueProp = Object.hasOwn(componentProps, "defaultValue");
|
|
17956
|
+
const tabPanelRefs = React.useRef([]);
|
|
17957
|
+
const [mountedTabPanels, setMountedTabPanels] = React.useState(() => /* @__PURE__ */ new Map());
|
|
17958
|
+
const [value, setValue] = useControlled({
|
|
17959
|
+
controlled: valueProp,
|
|
17960
|
+
default: defaultValueProp,
|
|
17961
|
+
name: "Tabs",
|
|
17962
|
+
state: "value"
|
|
17963
|
+
});
|
|
17964
|
+
const isControlled = valueProp !== void 0;
|
|
17965
|
+
const [tabMap, setTabMap] = React.useState(() => /* @__PURE__ */ new Map());
|
|
17966
|
+
const getTabElementBySelectedValue = React.useCallback((selectedValue) => {
|
|
17967
|
+
if (selectedValue === void 0) return null;
|
|
17968
|
+
for (const [tabElement, tabMetadata] of tabMap.entries()) if (tabMetadata != null && selectedValue === (tabMetadata.value ?? tabMetadata.index)) return tabElement;
|
|
17969
|
+
return null;
|
|
17970
|
+
}, [tabMap]);
|
|
17971
|
+
const [activationDirectionState, setActivationDirectionState] = React.useState(() => ({
|
|
17972
|
+
previousValue: value,
|
|
17973
|
+
tabActivationDirection: "none"
|
|
17974
|
+
}));
|
|
17975
|
+
const { previousValue, tabActivationDirection: committedTabActivationDirection } = activationDirectionState;
|
|
17976
|
+
let tabActivationDirection = committedTabActivationDirection;
|
|
17977
|
+
let directionComputationIncomplete = false;
|
|
17978
|
+
if (previousValue !== value) {
|
|
17979
|
+
tabActivationDirection = computeActivationDirection(previousValue, value, orientation, tabMap);
|
|
17980
|
+
directionComputationIncomplete = previousValue != null && value != null && getTabElementBySelectedValue(value) == null;
|
|
17981
|
+
}
|
|
17982
|
+
const nextPreviousValue = directionComputationIncomplete ? previousValue : value;
|
|
17983
|
+
const shouldSyncActivationDirectionState = previousValue !== nextPreviousValue || committedTabActivationDirection !== tabActivationDirection;
|
|
17984
|
+
useIsoLayoutEffect(() => {
|
|
17985
|
+
if (!shouldSyncActivationDirectionState) return;
|
|
17986
|
+
setActivationDirectionState({
|
|
17987
|
+
previousValue: nextPreviousValue,
|
|
17988
|
+
tabActivationDirection
|
|
17989
|
+
});
|
|
17990
|
+
}, [
|
|
17991
|
+
nextPreviousValue,
|
|
17992
|
+
shouldSyncActivationDirectionState,
|
|
17993
|
+
tabActivationDirection
|
|
17994
|
+
]);
|
|
17995
|
+
const onValueChange = useStableCallback((newValue, eventDetails) => {
|
|
17996
|
+
eventDetails.activationDirection = computeActivationDirection(value, newValue, orientation, tabMap);
|
|
17997
|
+
onValueChangeProp?.(newValue, eventDetails);
|
|
17998
|
+
if (eventDetails.isCanceled) return;
|
|
17999
|
+
setValue(newValue);
|
|
18000
|
+
});
|
|
18001
|
+
const registerMountedTabPanel = useStableCallback((panelValue, panelId) => {
|
|
18002
|
+
setMountedTabPanels((prev) => {
|
|
18003
|
+
if (prev.get(panelValue) === panelId) return prev;
|
|
18004
|
+
const next = new Map(prev);
|
|
18005
|
+
next.set(panelValue, panelId);
|
|
18006
|
+
return next;
|
|
18007
|
+
});
|
|
18008
|
+
});
|
|
18009
|
+
const unregisterMountedTabPanel = useStableCallback((panelValue, panelId) => {
|
|
18010
|
+
setMountedTabPanels((prev) => {
|
|
18011
|
+
if (!prev.has(panelValue) || prev.get(panelValue) !== panelId) return prev;
|
|
18012
|
+
const next = new Map(prev);
|
|
18013
|
+
next.delete(panelValue);
|
|
18014
|
+
return next;
|
|
18015
|
+
});
|
|
18016
|
+
});
|
|
18017
|
+
const getTabPanelIdByValue = React.useCallback((tabValue) => {
|
|
18018
|
+
return mountedTabPanels.get(tabValue);
|
|
18019
|
+
}, [mountedTabPanels]);
|
|
18020
|
+
const getTabIdByPanelValue = React.useCallback((tabPanelValue) => {
|
|
18021
|
+
for (const tabMetadata of tabMap.values()) if (tabPanelValue === tabMetadata?.value) return tabMetadata?.id;
|
|
18022
|
+
}, [tabMap]);
|
|
18023
|
+
const tabsContextValue = React.useMemo(() => ({
|
|
18024
|
+
getTabElementBySelectedValue,
|
|
18025
|
+
getTabIdByPanelValue,
|
|
18026
|
+
getTabPanelIdByValue,
|
|
18027
|
+
onValueChange,
|
|
18028
|
+
orientation,
|
|
18029
|
+
registerMountedTabPanel,
|
|
18030
|
+
setTabMap,
|
|
18031
|
+
unregisterMountedTabPanel,
|
|
18032
|
+
tabActivationDirection,
|
|
18033
|
+
value
|
|
18034
|
+
}), [
|
|
18035
|
+
getTabElementBySelectedValue,
|
|
18036
|
+
getTabIdByPanelValue,
|
|
18037
|
+
getTabPanelIdByValue,
|
|
18038
|
+
onValueChange,
|
|
18039
|
+
orientation,
|
|
18040
|
+
registerMountedTabPanel,
|
|
18041
|
+
setTabMap,
|
|
18042
|
+
unregisterMountedTabPanel,
|
|
18043
|
+
tabActivationDirection,
|
|
18044
|
+
value
|
|
18045
|
+
]);
|
|
18046
|
+
const selectedTabMetadata = React.useMemo(() => {
|
|
18047
|
+
for (const tabMetadata of tabMap.values()) if (tabMetadata != null && tabMetadata.value === value) return tabMetadata;
|
|
18048
|
+
}, [tabMap, value]);
|
|
18049
|
+
const firstEnabledTabValue = React.useMemo(() => {
|
|
18050
|
+
for (const tabMetadata of tabMap.values()) if (tabMetadata != null && !tabMetadata.disabled) return tabMetadata.value;
|
|
18051
|
+
}, [tabMap]);
|
|
18052
|
+
useIsoLayoutEffect(() => {
|
|
18053
|
+
if (isControlled || tabMap.size === 0) return;
|
|
18054
|
+
const selectionIsDisabled = selectedTabMetadata?.disabled;
|
|
18055
|
+
const selectionIsMissing = selectedTabMetadata == null && value !== null;
|
|
18056
|
+
if (hasExplicitDefaultValueProp && selectionIsDisabled && value === defaultValueProp) return;
|
|
18057
|
+
if (!selectionIsDisabled && !selectionIsMissing) return;
|
|
18058
|
+
const fallbackValue = firstEnabledTabValue ?? null;
|
|
18059
|
+
if (value === fallbackValue) return;
|
|
18060
|
+
setValue(fallbackValue);
|
|
18061
|
+
setActivationDirectionState((prev) => {
|
|
18062
|
+
if (prev.tabActivationDirection === "none") return prev;
|
|
18063
|
+
return {
|
|
18064
|
+
...prev,
|
|
18065
|
+
tabActivationDirection: "none"
|
|
18066
|
+
};
|
|
18067
|
+
});
|
|
18068
|
+
}, [
|
|
18069
|
+
defaultValueProp,
|
|
18070
|
+
firstEnabledTabValue,
|
|
18071
|
+
hasExplicitDefaultValueProp,
|
|
18072
|
+
isControlled,
|
|
18073
|
+
selectedTabMetadata,
|
|
18074
|
+
setValue,
|
|
18075
|
+
tabMap,
|
|
18076
|
+
value
|
|
18077
|
+
]);
|
|
18078
|
+
const element = useRenderElement("div", componentProps, {
|
|
18079
|
+
state: {
|
|
18080
|
+
orientation,
|
|
18081
|
+
tabActivationDirection
|
|
18082
|
+
},
|
|
18083
|
+
ref: forwardedRef,
|
|
18084
|
+
props: elementProps,
|
|
18085
|
+
stateAttributesMapping: tabsStateAttributesMapping
|
|
18086
|
+
});
|
|
18087
|
+
return /*#__PURE__*/ jsx(TabsRootContext.Provider, {
|
|
18088
|
+
value: tabsContextValue,
|
|
18089
|
+
children: /*#__PURE__*/ jsx(CompositeList, {
|
|
18090
|
+
elementsRef: tabPanelRefs,
|
|
18091
|
+
children: element
|
|
18092
|
+
})
|
|
18093
|
+
});
|
|
18094
|
+
});
|
|
18095
|
+
if (process.env.NODE_ENV !== "production") TabsRoot.displayName = "TabsRoot";
|
|
18096
|
+
function computeActivationDirection(oldValue, newValue, orientation, tabMap) {
|
|
18097
|
+
if (oldValue == null || newValue == null) return "none";
|
|
18098
|
+
let oldTab = null;
|
|
18099
|
+
let newTab = null;
|
|
18100
|
+
for (const [tabElement, tabMetadata] of tabMap.entries()) {
|
|
18101
|
+
if (tabMetadata == null) continue;
|
|
18102
|
+
const tabValue = tabMetadata.value ?? tabMetadata.index;
|
|
18103
|
+
if (oldValue === tabValue) oldTab = tabElement;
|
|
18104
|
+
if (newValue === tabValue) newTab = tabElement;
|
|
18105
|
+
if (oldTab != null && newTab != null) break;
|
|
18106
|
+
}
|
|
18107
|
+
if (oldTab == null || newTab == null) {
|
|
18108
|
+
if (oldTab !== newTab && (typeof oldValue === "number" || typeof oldValue === "string") && typeof oldValue === typeof newValue) {
|
|
18109
|
+
if (orientation === "horizontal") return newValue > oldValue ? "right" : "left";
|
|
18110
|
+
return newValue > oldValue ? "down" : "up";
|
|
18111
|
+
}
|
|
18112
|
+
return "none";
|
|
18113
|
+
}
|
|
18114
|
+
const oldRect = oldTab.getBoundingClientRect();
|
|
18115
|
+
const newRect = newTab.getBoundingClientRect();
|
|
18116
|
+
if (orientation === "horizontal") {
|
|
18117
|
+
if (newRect.left < oldRect.left) return "left";
|
|
18118
|
+
if (newRect.left > oldRect.left) return "right";
|
|
18119
|
+
} else {
|
|
18120
|
+
if (newRect.top < oldRect.top) return "up";
|
|
18121
|
+
if (newRect.top > oldRect.top) return "down";
|
|
18122
|
+
}
|
|
18123
|
+
return "none";
|
|
18124
|
+
}
|
|
18125
|
+
//#endregion
|
|
18126
|
+
//#region ../../node_modules/.bun/@base-ui+react@1.4.1+fa6c2f29eeb10566/node_modules/@base-ui/react/esm/tabs/list/TabsListContext.js
|
|
18127
|
+
var TabsListContext = /*#__PURE__*/ React.createContext(void 0);
|
|
18128
|
+
if (process.env.NODE_ENV !== "production") TabsListContext.displayName = "TabsListContext";
|
|
18129
|
+
function useTabsListContext() {
|
|
18130
|
+
const context = React.useContext(TabsListContext);
|
|
18131
|
+
if (context === void 0) throw new Error(process.env.NODE_ENV !== "production" ? "Base UI: TabsListContext is missing. TabsList parts must be placed within <Tabs.List>." : formatErrorMessage(65));
|
|
18132
|
+
return context;
|
|
18133
|
+
}
|
|
18134
|
+
//#endregion
|
|
18135
|
+
//#region ../../node_modules/.bun/@base-ui+react@1.4.1+fa6c2f29eeb10566/node_modules/@base-ui/react/esm/tabs/tab/TabsTab.js
|
|
18136
|
+
/**
|
|
18137
|
+
* An individual interactive tab button that toggles the corresponding panel.
|
|
18138
|
+
* Renders a `<button>` element.
|
|
18139
|
+
*
|
|
18140
|
+
* Documentation: [Base UI Tabs](https://base-ui.com/react/components/tabs)
|
|
18141
|
+
*/
|
|
18142
|
+
var TabsTab = /*#__PURE__*/ React.forwardRef(function TabsTab(componentProps, forwardedRef) {
|
|
18143
|
+
const { className, disabled = false, render, value, id: idProp, nativeButton = true, style, ...elementProps } = componentProps;
|
|
18144
|
+
const { value: activeTabValue, getTabPanelIdByValue, orientation } = useTabsRootContext();
|
|
18145
|
+
const { activateOnFocus, highlightedTabIndex, onTabActivation, registerTabResizeObserverElement, setHighlightedTabIndex, tabsListElement } = useTabsListContext();
|
|
18146
|
+
const id = useBaseUiId(idProp);
|
|
18147
|
+
const tabMetadata = React.useMemo(() => ({
|
|
18148
|
+
disabled,
|
|
18149
|
+
id,
|
|
18150
|
+
value
|
|
18151
|
+
}), [
|
|
18152
|
+
disabled,
|
|
18153
|
+
id,
|
|
18154
|
+
value
|
|
18155
|
+
]);
|
|
18156
|
+
const { compositeProps, compositeRef, index } = useCompositeItem({ metadata: tabMetadata });
|
|
18157
|
+
const active = value === activeTabValue;
|
|
18158
|
+
const isNavigatingRef = React.useRef(false);
|
|
18159
|
+
const tabElementRef = React.useRef(null);
|
|
18160
|
+
React.useEffect(() => {
|
|
18161
|
+
const tabElement = tabElementRef.current;
|
|
18162
|
+
if (!tabElement) return;
|
|
18163
|
+
return registerTabResizeObserverElement(tabElement);
|
|
18164
|
+
}, [registerTabResizeObserverElement]);
|
|
18165
|
+
useIsoLayoutEffect(() => {
|
|
18166
|
+
if (isNavigatingRef.current) {
|
|
18167
|
+
isNavigatingRef.current = false;
|
|
18168
|
+
return;
|
|
18169
|
+
}
|
|
18170
|
+
if (!(active && index > -1 && highlightedTabIndex !== index)) return;
|
|
18171
|
+
const listElement = tabsListElement;
|
|
18172
|
+
if (listElement != null) {
|
|
18173
|
+
const activeEl = activeElement(ownerDocument(listElement));
|
|
18174
|
+
if (activeEl && contains(listElement, activeEl)) return;
|
|
18175
|
+
}
|
|
18176
|
+
if (!disabled) setHighlightedTabIndex(index);
|
|
18177
|
+
}, [
|
|
18178
|
+
active,
|
|
18179
|
+
index,
|
|
18180
|
+
highlightedTabIndex,
|
|
18181
|
+
setHighlightedTabIndex,
|
|
18182
|
+
disabled,
|
|
18183
|
+
tabsListElement
|
|
18184
|
+
]);
|
|
18185
|
+
const { getButtonProps, buttonRef } = useButton({
|
|
18186
|
+
disabled,
|
|
18187
|
+
native: nativeButton,
|
|
18188
|
+
focusableWhenDisabled: true
|
|
18189
|
+
});
|
|
18190
|
+
const tabPanelId = getTabPanelIdByValue(value);
|
|
18191
|
+
const isPressingRef = React.useRef(false);
|
|
18192
|
+
const isMainButtonRef = React.useRef(false);
|
|
18193
|
+
function onClick(event) {
|
|
18194
|
+
if (active || disabled) return;
|
|
18195
|
+
onTabActivation(value, createChangeEventDetails(none, event.nativeEvent, void 0, { activationDirection: "none" }));
|
|
18196
|
+
}
|
|
18197
|
+
function onFocus(event) {
|
|
18198
|
+
if (active) return;
|
|
18199
|
+
if (index > -1 && !disabled) setHighlightedTabIndex(index);
|
|
18200
|
+
if (disabled) return;
|
|
18201
|
+
if (activateOnFocus && (!isPressingRef.current || isPressingRef.current && isMainButtonRef.current)) onTabActivation(value, createChangeEventDetails(none, event.nativeEvent, void 0, { activationDirection: "none" }));
|
|
18202
|
+
}
|
|
18203
|
+
function onPointerDown(event) {
|
|
18204
|
+
if (active || disabled) return;
|
|
18205
|
+
isPressingRef.current = true;
|
|
18206
|
+
function handlePointerUp() {
|
|
18207
|
+
isPressingRef.current = false;
|
|
18208
|
+
isMainButtonRef.current = false;
|
|
18209
|
+
}
|
|
18210
|
+
if (!event.button || event.button === 0) {
|
|
18211
|
+
isMainButtonRef.current = true;
|
|
18212
|
+
ownerDocument(event.currentTarget).addEventListener("pointerup", handlePointerUp, { once: true });
|
|
18213
|
+
}
|
|
18214
|
+
}
|
|
18215
|
+
return useRenderElement("button", componentProps, {
|
|
18216
|
+
state: {
|
|
18217
|
+
disabled,
|
|
18218
|
+
active,
|
|
18219
|
+
orientation
|
|
18220
|
+
},
|
|
18221
|
+
ref: [
|
|
18222
|
+
forwardedRef,
|
|
18223
|
+
buttonRef,
|
|
18224
|
+
compositeRef,
|
|
18225
|
+
tabElementRef
|
|
18226
|
+
],
|
|
18227
|
+
props: [
|
|
18228
|
+
compositeProps,
|
|
18229
|
+
{
|
|
18230
|
+
role: "tab",
|
|
18231
|
+
"aria-controls": tabPanelId,
|
|
18232
|
+
"aria-selected": active,
|
|
18233
|
+
id,
|
|
18234
|
+
onClick,
|
|
18235
|
+
onFocus,
|
|
18236
|
+
onPointerDown,
|
|
18237
|
+
[ACTIVE_COMPOSITE_ITEM]: active ? "" : void 0,
|
|
18238
|
+
onKeyDownCapture() {
|
|
18239
|
+
isNavigatingRef.current = true;
|
|
18240
|
+
}
|
|
18241
|
+
},
|
|
18242
|
+
elementProps,
|
|
18243
|
+
getButtonProps
|
|
18244
|
+
]
|
|
18245
|
+
});
|
|
18246
|
+
});
|
|
18247
|
+
if (process.env.NODE_ENV !== "production") TabsTab.displayName = "TabsTab";
|
|
18248
|
+
//#endregion
|
|
18249
|
+
//#region ../../node_modules/.bun/@base-ui+react@1.4.1+fa6c2f29eeb10566/node_modules/@base-ui/react/esm/tabs/panel/TabsPanelDataAttributes.js
|
|
18250
|
+
var TabsPanelDataAttributes = function(TabsPanelDataAttributes) {
|
|
18251
|
+
/**
|
|
18252
|
+
* Indicates the index of the tab panel.
|
|
18253
|
+
*/
|
|
18254
|
+
TabsPanelDataAttributes["index"] = "data-index";
|
|
18255
|
+
/**
|
|
18256
|
+
* Indicates the direction of the activation (based on the previous active tab).
|
|
18257
|
+
* @type {'left' | 'right' | 'up' | 'down' | 'none'}
|
|
18258
|
+
*/
|
|
18259
|
+
TabsPanelDataAttributes["activationDirection"] = "data-activation-direction";
|
|
18260
|
+
/**
|
|
18261
|
+
* Indicates the orientation of the tabs.
|
|
18262
|
+
* @type {'horizontal' | 'vertical'}
|
|
18263
|
+
*/
|
|
18264
|
+
TabsPanelDataAttributes["orientation"] = "data-orientation";
|
|
18265
|
+
/**
|
|
18266
|
+
* Present when the panel is hidden.
|
|
18267
|
+
*/
|
|
18268
|
+
TabsPanelDataAttributes["hidden"] = "data-hidden";
|
|
18269
|
+
/**
|
|
18270
|
+
* Present when the panel is animating in.
|
|
18271
|
+
*/
|
|
18272
|
+
TabsPanelDataAttributes[TabsPanelDataAttributes["startingStyle"] = TransitionStatusDataAttributes.startingStyle] = "startingStyle";
|
|
18273
|
+
/**
|
|
18274
|
+
* Present when the panel is animating out.
|
|
18275
|
+
*/
|
|
18276
|
+
TabsPanelDataAttributes[TabsPanelDataAttributes["endingStyle"] = TransitionStatusDataAttributes.endingStyle] = "endingStyle";
|
|
18277
|
+
return TabsPanelDataAttributes;
|
|
18278
|
+
}({});
|
|
18279
|
+
//#endregion
|
|
18280
|
+
//#region ../../node_modules/.bun/@base-ui+react@1.4.1+fa6c2f29eeb10566/node_modules/@base-ui/react/esm/tabs/panel/TabsPanel.js
|
|
18281
|
+
var stateAttributesMapping$1 = {
|
|
18282
|
+
...tabsStateAttributesMapping,
|
|
18283
|
+
...transitionStatusMapping
|
|
18284
|
+
};
|
|
18285
|
+
/**
|
|
18286
|
+
* A panel displayed when the corresponding tab is active.
|
|
18287
|
+
* Renders a `<div>` element.
|
|
18288
|
+
*
|
|
18289
|
+
* Documentation: [Base UI Tabs](https://base-ui.com/react/components/tabs)
|
|
18290
|
+
*/
|
|
18291
|
+
var TabsPanel = /*#__PURE__*/ React.forwardRef(function TabPanel(componentProps, forwardedRef) {
|
|
18292
|
+
const { className, value, render, keepMounted = false, style, ...elementProps } = componentProps;
|
|
18293
|
+
const { value: selectedValue, getTabIdByPanelValue, orientation, tabActivationDirection, registerMountedTabPanel, unregisterMountedTabPanel } = useTabsRootContext();
|
|
18294
|
+
const id = useBaseUiId();
|
|
18295
|
+
const metadata = React.useMemo(() => ({
|
|
18296
|
+
id,
|
|
18297
|
+
value
|
|
18298
|
+
}), [id, value]);
|
|
18299
|
+
const { ref: listItemRef, index } = useCompositeListItem({ metadata });
|
|
18300
|
+
const open = value === selectedValue;
|
|
18301
|
+
const { mounted, transitionStatus, setMounted } = useTransitionStatus(open);
|
|
18302
|
+
const hidden = !mounted;
|
|
18303
|
+
const correspondingTabId = getTabIdByPanelValue(value);
|
|
18304
|
+
const state = {
|
|
18305
|
+
hidden,
|
|
18306
|
+
orientation,
|
|
18307
|
+
tabActivationDirection,
|
|
18308
|
+
transitionStatus
|
|
18309
|
+
};
|
|
18310
|
+
const panelRef = React.useRef(null);
|
|
18311
|
+
const element = useRenderElement("div", componentProps, {
|
|
18312
|
+
state,
|
|
18313
|
+
ref: [
|
|
18314
|
+
forwardedRef,
|
|
18315
|
+
listItemRef,
|
|
18316
|
+
panelRef
|
|
18317
|
+
],
|
|
18318
|
+
props: [{
|
|
18319
|
+
"aria-labelledby": correspondingTabId,
|
|
18320
|
+
hidden,
|
|
18321
|
+
id,
|
|
18322
|
+
role: "tabpanel",
|
|
18323
|
+
tabIndex: open ? 0 : -1,
|
|
18324
|
+
inert: inertValue(!open),
|
|
18325
|
+
[TabsPanelDataAttributes.index]: index
|
|
18326
|
+
}, elementProps],
|
|
18327
|
+
stateAttributesMapping: stateAttributesMapping$1
|
|
18328
|
+
});
|
|
18329
|
+
useOpenChangeComplete({
|
|
18330
|
+
open,
|
|
18331
|
+
ref: panelRef,
|
|
18332
|
+
onComplete() {
|
|
18333
|
+
if (!open) setMounted(false);
|
|
18334
|
+
}
|
|
18335
|
+
});
|
|
18336
|
+
useIsoLayoutEffect(() => {
|
|
18337
|
+
if (hidden && !keepMounted) return;
|
|
18338
|
+
if (id == null) return;
|
|
18339
|
+
registerMountedTabPanel(value, id);
|
|
18340
|
+
return () => {
|
|
18341
|
+
unregisterMountedTabPanel(value, id);
|
|
18342
|
+
};
|
|
18343
|
+
}, [
|
|
18344
|
+
hidden,
|
|
18345
|
+
keepMounted,
|
|
18346
|
+
value,
|
|
18347
|
+
id,
|
|
18348
|
+
registerMountedTabPanel,
|
|
18349
|
+
unregisterMountedTabPanel
|
|
18350
|
+
]);
|
|
18351
|
+
if (!(keepMounted || mounted)) return null;
|
|
18352
|
+
return element;
|
|
18353
|
+
});
|
|
18354
|
+
if (process.env.NODE_ENV !== "production") TabsPanel.displayName = "TabsPanel";
|
|
18355
|
+
//#endregion
|
|
18356
|
+
//#region ../../node_modules/.bun/@base-ui+react@1.4.1+fa6c2f29eeb10566/node_modules/@base-ui/react/esm/tabs/list/TabsList.js
|
|
18357
|
+
/**
|
|
18358
|
+
* Groups the individual tab buttons.
|
|
18359
|
+
* Renders a `<div>` element.
|
|
18360
|
+
*
|
|
18361
|
+
* Documentation: [Base UI Tabs](https://base-ui.com/react/components/tabs)
|
|
18362
|
+
*/
|
|
18363
|
+
var TabsList$1 = /*#__PURE__*/ React.forwardRef(function TabsList(componentProps, forwardedRef) {
|
|
18364
|
+
const { activateOnFocus = false, className, loopFocus = true, render, style, ...elementProps } = componentProps;
|
|
18365
|
+
const { onValueChange, orientation, value, setTabMap, tabActivationDirection } = useTabsRootContext();
|
|
18366
|
+
const [highlightedTabIndex, setHighlightedTabIndex] = React.useState(0);
|
|
18367
|
+
const [tabsListElement, setTabsListElement] = React.useState(null);
|
|
18368
|
+
const indicatorUpdateListenersRef = React.useRef(/* @__PURE__ */ new Set());
|
|
18369
|
+
const tabResizeObserverElementsRef = React.useRef(/* @__PURE__ */ new Set());
|
|
18370
|
+
const resizeObserverRef = React.useRef(null);
|
|
18371
|
+
const notifyIndicatorUpdateListeners = useStableCallback(() => {
|
|
18372
|
+
indicatorUpdateListenersRef.current.forEach((listener) => {
|
|
18373
|
+
listener();
|
|
18374
|
+
});
|
|
18375
|
+
});
|
|
18376
|
+
React.useEffect(() => {
|
|
18377
|
+
if (typeof ResizeObserver === "undefined") return;
|
|
18378
|
+
const resizeObserver = new ResizeObserver(() => {
|
|
18379
|
+
if (!indicatorUpdateListenersRef.current.size) return;
|
|
18380
|
+
notifyIndicatorUpdateListeners();
|
|
18381
|
+
});
|
|
18382
|
+
resizeObserverRef.current = resizeObserver;
|
|
18383
|
+
if (tabsListElement) resizeObserver.observe(tabsListElement);
|
|
18384
|
+
tabResizeObserverElementsRef.current.forEach((element) => {
|
|
18385
|
+
resizeObserver.observe(element);
|
|
18386
|
+
});
|
|
18387
|
+
return () => {
|
|
18388
|
+
resizeObserver.disconnect();
|
|
18389
|
+
resizeObserverRef.current = null;
|
|
18390
|
+
};
|
|
18391
|
+
}, [tabsListElement, notifyIndicatorUpdateListeners]);
|
|
18392
|
+
const registerIndicatorUpdateListener = useStableCallback((listener) => {
|
|
18393
|
+
indicatorUpdateListenersRef.current.add(listener);
|
|
18394
|
+
return () => {
|
|
18395
|
+
indicatorUpdateListenersRef.current.delete(listener);
|
|
18396
|
+
};
|
|
18397
|
+
});
|
|
18398
|
+
const registerTabResizeObserverElement = useStableCallback((element) => {
|
|
18399
|
+
tabResizeObserverElementsRef.current.add(element);
|
|
18400
|
+
resizeObserverRef.current?.observe(element);
|
|
18401
|
+
return () => {
|
|
18402
|
+
tabResizeObserverElementsRef.current.delete(element);
|
|
18403
|
+
resizeObserverRef.current?.unobserve(element);
|
|
18404
|
+
};
|
|
18405
|
+
});
|
|
18406
|
+
const onTabActivation = useStableCallback((newValue, eventDetails) => {
|
|
18407
|
+
if (newValue !== value) onValueChange(newValue, eventDetails);
|
|
18408
|
+
});
|
|
18409
|
+
const state = {
|
|
18410
|
+
orientation,
|
|
18411
|
+
tabActivationDirection
|
|
18412
|
+
};
|
|
18413
|
+
const defaultProps = {
|
|
18414
|
+
"aria-orientation": orientation === "vertical" ? "vertical" : void 0,
|
|
18415
|
+
role: "tablist"
|
|
18416
|
+
};
|
|
18417
|
+
const tabsListContextValue = React.useMemo(() => ({
|
|
18418
|
+
activateOnFocus,
|
|
18419
|
+
highlightedTabIndex,
|
|
18420
|
+
registerIndicatorUpdateListener,
|
|
18421
|
+
registerTabResizeObserverElement,
|
|
18422
|
+
onTabActivation,
|
|
18423
|
+
setHighlightedTabIndex,
|
|
18424
|
+
tabsListElement
|
|
18425
|
+
}), [
|
|
18426
|
+
activateOnFocus,
|
|
18427
|
+
highlightedTabIndex,
|
|
18428
|
+
registerIndicatorUpdateListener,
|
|
18429
|
+
registerTabResizeObserverElement,
|
|
18430
|
+
onTabActivation,
|
|
18431
|
+
setHighlightedTabIndex,
|
|
18432
|
+
tabsListElement
|
|
18433
|
+
]);
|
|
18434
|
+
return /*#__PURE__*/ jsx(TabsListContext.Provider, {
|
|
18435
|
+
value: tabsListContextValue,
|
|
18436
|
+
children: /*#__PURE__*/ jsx(CompositeRoot, {
|
|
18437
|
+
render,
|
|
18438
|
+
className,
|
|
18439
|
+
style,
|
|
18440
|
+
state,
|
|
18441
|
+
refs: [forwardedRef, setTabsListElement],
|
|
18442
|
+
props: [defaultProps, elementProps],
|
|
18443
|
+
stateAttributesMapping: tabsStateAttributesMapping,
|
|
18444
|
+
highlightedIndex: highlightedTabIndex,
|
|
18445
|
+
enableHomeAndEndKeys: true,
|
|
18446
|
+
loopFocus,
|
|
18447
|
+
orientation,
|
|
18448
|
+
onHighlightedIndexChange: setHighlightedTabIndex,
|
|
18449
|
+
onMapChange: setTabMap,
|
|
18450
|
+
disabledIndices: EMPTY_ARRAY
|
|
18451
|
+
})
|
|
18452
|
+
});
|
|
18453
|
+
});
|
|
18454
|
+
if (process.env.NODE_ENV !== "production") TabsList$1.displayName = "TabsList";
|
|
18455
|
+
//#endregion
|
|
18456
|
+
//#region src/ui/browser/tabs.tsx
|
|
18457
|
+
function Tabs({ className, orientation = "horizontal", ...props }) {
|
|
18458
|
+
return /* @__PURE__ */ jsx(TabsRoot, {
|
|
18459
|
+
"data-slot": "tabs",
|
|
18460
|
+
"data-orientation": orientation,
|
|
18461
|
+
className: cn("group/tabs flex gap-2 data-[orientation=horizontal]:flex-col", className),
|
|
18462
|
+
orientation,
|
|
18463
|
+
...props
|
|
18464
|
+
});
|
|
18465
|
+
}
|
|
18466
|
+
var tabsListVariants = cva("group/tabs-list inline-flex w-fit items-center justify-center rounded-lg text-muted-foreground group-data-[orientation=vertical]/tabs:h-fit group-data-[orientation=vertical]/tabs:flex-col data-[variant=line]:rounded-none", {
|
|
18467
|
+
variants: {
|
|
18468
|
+
size: {
|
|
18469
|
+
default: "p-[3px] group-data-[orientation=horizontal]/tabs:h-8",
|
|
18470
|
+
sm: "rounded-[6px] p-0.5 group-data-[orientation=horizontal]/tabs:h-6"
|
|
18471
|
+
},
|
|
18472
|
+
variant: {
|
|
18473
|
+
default: "bg-muted",
|
|
18474
|
+
line: "gap-1 bg-transparent",
|
|
18475
|
+
navigation: "gap-1 bg-transparent data-[variant=navigation]:p-0 group-data-[orientation=horizontal]/tabs:data-[variant=navigation]:h-auto",
|
|
18476
|
+
flat: "gap-1 bg-[color-mix(in_srgb,var(--ui-foreground)_8%,var(--ui-popover))] dark:bg-[color-mix(in_srgb,black_16%,var(--ui-popover))]"
|
|
18477
|
+
}
|
|
18478
|
+
},
|
|
18479
|
+
defaultVariants: {
|
|
18480
|
+
size: "default",
|
|
18481
|
+
variant: "default"
|
|
18482
|
+
}
|
|
18483
|
+
});
|
|
18484
|
+
function TabsList({ className, variant = "default", size = "default", ...props }) {
|
|
18485
|
+
return /* @__PURE__ */ jsx(TabsList$1, {
|
|
18486
|
+
"data-slot": "tabs-list",
|
|
18487
|
+
"data-variant": variant,
|
|
18488
|
+
"data-size": size,
|
|
18489
|
+
className: cn(tabsListVariants({
|
|
18490
|
+
variant,
|
|
18491
|
+
size
|
|
18492
|
+
}), className),
|
|
18493
|
+
...props
|
|
18494
|
+
});
|
|
18495
|
+
}
|
|
18496
|
+
function TabsTrigger({ className, ...props }) {
|
|
18497
|
+
return /* @__PURE__ */ jsx(TabsTab, {
|
|
18498
|
+
"data-slot": "tabs-trigger",
|
|
18499
|
+
className: cn("relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-1.5 py-0.5 text-sm font-medium whitespace-nowrap text-foreground/60 transition-[color,background-color,border-color,box-shadow,opacity] group-data-[orientation=vertical]/tabs:w-full group-data-[orientation=vertical]/tabs:justify-start hover:text-foreground focus-visible:border-border focus-visible:outline-2 focus-visible:outline-solid focus-visible:ring-0 focus-visible:aria-invalid:ring-0 focus-visible:outline-offset-1 focus-visible:outline-ring disabled:pointer-events-none disabled:opacity-50 has-data-[icon=inline-end]:pr-1 has-data-[icon=inline-start]:pl-1 aria-disabled:pointer-events-none aria-disabled:opacity-50 motion-reduce:transition-none dark:text-muted-foreground dark:hover:text-foreground group-data-[variant=default]/tabs-list:data-active:shadow-sm group-data-[variant=line]/tabs-list:data-active:shadow-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", "group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-active:bg-transparent dark:group-data-[variant=line]/tabs-list:data-active:border-transparent dark:group-data-[variant=line]/tabs-list:data-active:bg-transparent", "group-data-[variant=navigation]/tabs-list:h-auto group-data-[variant=navigation]/tabs-list:flex-none group-data-[variant=navigation]/tabs-list:rounded-[6px] group-data-[variant=navigation]/tabs-list:border-0 group-data-[variant=navigation]/tabs-list:px-3 group-data-[variant=navigation]/tabs-list:py-2 group-data-[variant=navigation]/tabs-list:text-[13px] group-data-[variant=navigation]/tabs-list:font-normal group-data-[variant=navigation]/tabs-list:text-muted-foreground group-data-[variant=navigation]/tabs-list:hover:bg-muted group-data-[variant=navigation]/tabs-list:hover:text-foreground group-data-[variant=navigation]/tabs-list:data-active:bg-muted group-data-[variant=navigation]/tabs-list:data-active:font-semibold group-data-[variant=navigation]/tabs-list:data-active:text-foreground dark:group-data-[variant=navigation]/tabs-list:data-active:bg-muted dark:group-data-[variant=navigation]/tabs-list:data-active:text-foreground", "group-data-[variant=flat]/tabs-list:h-full group-data-[variant=flat]/tabs-list:border-0 group-data-[variant=flat]/tabs-list:data-active:bg-popover group-data-[variant=flat]/tabs-list:data-active:shadow-[0_1px_2px_rgb(0_0_0/0.08)] dark:group-data-[variant=flat]/tabs-list:data-active:bg-[color-mix(in_srgb,var(--ui-foreground)_8%,var(--ui-popover))]", "data-active:bg-background data-active:text-foreground dark:data-active:border-input dark:data-active:bg-input/30 dark:data-active:text-foreground", "after:absolute after:bg-foreground after:opacity-0 after:transition-opacity group-data-[orientation=horizontal]/tabs:after:inset-x-0 group-data-[orientation=horizontal]/tabs:after:bottom-[-5px] group-data-[orientation=horizontal]/tabs:after:h-0.5 group-data-[orientation=vertical]/tabs:after:inset-y-0 group-data-[orientation=vertical]/tabs:after:-right-1 group-data-[orientation=vertical]/tabs:after:w-0.5 group-data-[variant=line]/tabs-list:data-active:after:opacity-100 motion-reduce:after:transition-none", "group-data-[size=sm]/tabs-list:rounded-[4px] group-data-[size=sm]/tabs-list:gap-1 group-data-[size=sm]/tabs-list:py-0 group-data-[size=sm]/tabs-list:text-[11px] group-data-[size=sm]/tabs-list:leading-4 group-data-[orientation=horizontal]/tabs:group-data-[size=sm]/tabs-list:after:bottom-[-4px]", "group-data-[variant=navigation]/tabs-list:group-data-[size=sm]/tabs-list:rounded-[4px] group-data-[variant=navigation]/tabs-list:group-data-[size=sm]/tabs-list:px-2 group-data-[variant=navigation]/tabs-list:group-data-[size=sm]/tabs-list:py-1 group-data-[variant=navigation]/tabs-list:group-data-[size=sm]/tabs-list:text-[12px]", className),
|
|
18500
|
+
...props
|
|
18501
|
+
});
|
|
18502
|
+
}
|
|
18503
|
+
function TabsContent({ className, ...props }) {
|
|
18504
|
+
return /* @__PURE__ */ jsx(TabsPanel, {
|
|
18505
|
+
"data-slot": "tabs-content",
|
|
18506
|
+
className: cn("flex-1 text-sm outline-none", className),
|
|
18507
|
+
...props
|
|
18508
|
+
});
|
|
18509
|
+
}
|
|
18510
|
+
//#endregion
|
|
18511
|
+
//#region src/ui/browser/icons/picker/IconPicker.tsx
|
|
18512
|
+
var translations = {
|
|
18513
|
+
"en": {
|
|
18514
|
+
emoji: "Emoji",
|
|
18515
|
+
icon: "Icon",
|
|
18516
|
+
random: "Random",
|
|
18517
|
+
filter: "Filter...",
|
|
18518
|
+
more: "More...",
|
|
18519
|
+
loading: "Loading...",
|
|
18520
|
+
carbon: "Carbon",
|
|
18521
|
+
close: "Close",
|
|
18522
|
+
color: "Color"
|
|
18523
|
+
},
|
|
18524
|
+
"zh-CN": {
|
|
18525
|
+
emoji: "Emoji",
|
|
18526
|
+
icon: "图标",
|
|
18527
|
+
random: "随机",
|
|
18528
|
+
filter: "搜索...",
|
|
18529
|
+
more: "更多...",
|
|
18530
|
+
loading: "加载中...",
|
|
18531
|
+
carbon: "Carbon",
|
|
18532
|
+
close: "关闭",
|
|
18533
|
+
color: "颜色"
|
|
18534
|
+
},
|
|
18535
|
+
"zh-TW": {
|
|
18536
|
+
emoji: "Emoji",
|
|
18537
|
+
icon: "圖示",
|
|
18538
|
+
random: "隨機",
|
|
18539
|
+
filter: "搜尋...",
|
|
18540
|
+
more: "更多...",
|
|
18541
|
+
loading: "載入中...",
|
|
18542
|
+
carbon: "Carbon",
|
|
18543
|
+
close: "關閉",
|
|
18544
|
+
color: "顏色"
|
|
18545
|
+
},
|
|
18546
|
+
"ja": {
|
|
18547
|
+
emoji: "絵文字",
|
|
18548
|
+
icon: "アイコン",
|
|
18549
|
+
random: "ランダム",
|
|
18550
|
+
filter: "検索…",
|
|
18551
|
+
more: "もっと見る…",
|
|
18552
|
+
loading: "読み込み中…",
|
|
18553
|
+
carbon: "Carbon",
|
|
18554
|
+
close: "閉じる",
|
|
18555
|
+
color: "色"
|
|
18556
|
+
},
|
|
18557
|
+
"ko": {
|
|
18558
|
+
emoji: "이모지",
|
|
18559
|
+
icon: "아이콘",
|
|
18560
|
+
random: "무작위",
|
|
18561
|
+
filter: "필터...",
|
|
18562
|
+
more: "더 보기...",
|
|
18563
|
+
loading: "불러오는 중...",
|
|
18564
|
+
carbon: "Carbon",
|
|
18565
|
+
close: "닫기",
|
|
18566
|
+
color: "색상"
|
|
18567
|
+
},
|
|
18568
|
+
"ru": {
|
|
18569
|
+
emoji: "Эмодзи",
|
|
18570
|
+
icon: "Значок",
|
|
18571
|
+
random: "Случайно",
|
|
18572
|
+
filter: "Фильтр…",
|
|
18573
|
+
more: "Ещё…",
|
|
18574
|
+
loading: "Загрузка…",
|
|
18575
|
+
carbon: "Carbon",
|
|
18576
|
+
close: "Закрыть",
|
|
18577
|
+
color: "Цвет"
|
|
18578
|
+
},
|
|
18579
|
+
"fr": {
|
|
18580
|
+
emoji: "Emoji",
|
|
18581
|
+
icon: "Icône",
|
|
18582
|
+
random: "Aléatoire",
|
|
18583
|
+
filter: "Filtrer...",
|
|
18584
|
+
more: "Plus...",
|
|
18585
|
+
loading: "Chargement...",
|
|
18586
|
+
carbon: "Carbon",
|
|
18587
|
+
close: "Fermer",
|
|
18588
|
+
color: "Couleur"
|
|
18589
|
+
}
|
|
18590
|
+
};
|
|
18591
|
+
var rememberLastTab;
|
|
18592
|
+
var rememberLastColor;
|
|
18593
|
+
function getTranslate(lang) {
|
|
18594
|
+
const data = translations[resolveUiLanguage([lang])];
|
|
18595
|
+
return (key) => data[key] || translations.en[key] || key;
|
|
18596
|
+
}
|
|
18597
|
+
var COLUMNS = 9;
|
|
18598
|
+
var CONTAINER_STYLE = {
|
|
18599
|
+
width: 308,
|
|
18600
|
+
height: 360
|
|
18601
|
+
};
|
|
18602
|
+
var MAX_ITEMS_INIT = 180;
|
|
18603
|
+
var MAX_ITEMS_STEP = 90;
|
|
18604
|
+
var COLORS = [
|
|
18605
|
+
"currentColor",
|
|
18606
|
+
"#CC3E44",
|
|
18607
|
+
"#E37933",
|
|
18608
|
+
"#CBCB41",
|
|
18609
|
+
"#8DC149",
|
|
18610
|
+
"#7494A3",
|
|
18611
|
+
"#519ABA",
|
|
18612
|
+
"#A074C4",
|
|
18613
|
+
"#F55385",
|
|
18614
|
+
"#6D8086"
|
|
18615
|
+
];
|
|
18616
|
+
function computeRows(iconifyData, filteredIcons, categories, collection) {
|
|
18617
|
+
const rows = [];
|
|
18618
|
+
if (!iconifyData) return rows;
|
|
18619
|
+
if (filteredIcons) for (let i = 0; i < filteredIcons.length; i += COLUMNS) rows.push(filteredIcons.slice(i, i + COLUMNS));
|
|
18620
|
+
else if (categories) for (const category in categories) {
|
|
18621
|
+
rows.push(category);
|
|
18622
|
+
const icons = categories[category];
|
|
18623
|
+
for (let i = 0; i < icons.length; i += COLUMNS) rows.push(icons.slice(i, i + COLUMNS));
|
|
18624
|
+
}
|
|
18625
|
+
else if (collection) {
|
|
18626
|
+
const icons = iconifyData[collection]?.icons.icons;
|
|
18627
|
+
if (icons) {
|
|
18628
|
+
filteredIcons = Object.keys(icons);
|
|
18629
|
+
for (let i = 0; i < filteredIcons.length; i += COLUMNS) rows.push(filteredIcons.slice(i, i + COLUMNS));
|
|
18630
|
+
}
|
|
18631
|
+
}
|
|
18632
|
+
return rows;
|
|
18633
|
+
}
|
|
18634
|
+
var ICON_SIZE = 32;
|
|
18635
|
+
var BUFFER_SIZE = 320;
|
|
18636
|
+
var ROW_STYLE = { height: ICON_SIZE };
|
|
18637
|
+
var PickerIcon = ({ iconSet, name, color }) => {
|
|
18638
|
+
const svg = useMemo(() => {
|
|
18639
|
+
const icon = getIconData(iconSet, name);
|
|
18640
|
+
if (!icon) return null;
|
|
18641
|
+
const result = iconToSVG(icon, {
|
|
18642
|
+
width: "1em",
|
|
18643
|
+
height: "1em"
|
|
18644
|
+
});
|
|
18645
|
+
return {
|
|
18646
|
+
body: replaceIDs(result.body),
|
|
18647
|
+
viewBox: result.attributes.viewBox
|
|
18648
|
+
};
|
|
18649
|
+
}, [iconSet, name]);
|
|
18650
|
+
if (!svg) return null;
|
|
18651
|
+
return /* @__PURE__ */ jsx("svg", {
|
|
18652
|
+
"aria-hidden": "true",
|
|
18653
|
+
className: clsx(IconPicker_module_default.icon, "text-lg"),
|
|
18654
|
+
focusable: "false",
|
|
18655
|
+
style: { color },
|
|
18656
|
+
viewBox: svg.viewBox,
|
|
18657
|
+
dangerouslySetInnerHTML: { __html: svg.body }
|
|
18658
|
+
});
|
|
18659
|
+
};
|
|
18660
|
+
function renderRow(index, row, iconSet, color) {
|
|
18661
|
+
return /* @__PURE__ */ jsx("div", {
|
|
18662
|
+
className: IconPicker_module_default.row,
|
|
18663
|
+
style: ROW_STYLE,
|
|
18664
|
+
children: Array.isArray(row) ? row.map((icon) => /* @__PURE__ */ jsx(Button, {
|
|
18665
|
+
variant: "ghost",
|
|
18666
|
+
size: "icon-sm",
|
|
18667
|
+
"aria-label": icon,
|
|
18668
|
+
"data-icon": icon,
|
|
18669
|
+
title: icon,
|
|
18670
|
+
type: "button",
|
|
18671
|
+
children: /* @__PURE__ */ jsx(PickerIcon, {
|
|
18672
|
+
iconSet,
|
|
18673
|
+
name: icon,
|
|
18674
|
+
color
|
|
18675
|
+
})
|
|
18676
|
+
}, icon)) : /* @__PURE__ */ jsx("div", {
|
|
18677
|
+
className: IconPicker_module_default.subtitle,
|
|
18678
|
+
children: row
|
|
18679
|
+
})
|
|
18680
|
+
}, index);
|
|
18681
|
+
}
|
|
18682
|
+
var IconPickerIconsPanel = ({ filteredIcons, collection, color, categories, onClick }) => {
|
|
18683
|
+
const iconifyData = useIconifyData(true);
|
|
18684
|
+
const iconSet = iconifyData?.[collection]?.icons;
|
|
18685
|
+
const [viewport, setViewport] = useState(null);
|
|
18686
|
+
const rows = useMemo(() => computeRows(iconifyData, filteredIcons, categories, collection), [
|
|
18687
|
+
iconifyData,
|
|
18688
|
+
filteredIcons,
|
|
18689
|
+
categories,
|
|
18690
|
+
collection
|
|
18691
|
+
]);
|
|
18692
|
+
return /* @__PURE__ */ jsx(ScrollArea, {
|
|
18693
|
+
className: IconPicker_module_default.panel,
|
|
18694
|
+
defer: false,
|
|
18695
|
+
events: { initialized: (instance) => setViewport(instance.elements().viewport) },
|
|
18696
|
+
onClick,
|
|
18697
|
+
children: viewport && iconSet && /* @__PURE__ */ jsx(Z, {
|
|
18698
|
+
data: rows,
|
|
18699
|
+
itemSize: ICON_SIZE,
|
|
18700
|
+
bufferSize: BUFFER_SIZE,
|
|
18701
|
+
scrollRef: { current: viewport },
|
|
18702
|
+
children: (row, index) => renderRow(index, row, iconSet, color)
|
|
18703
|
+
})
|
|
18704
|
+
});
|
|
18705
|
+
};
|
|
18706
|
+
var IconPicker = ({ className, emoji, carbon = true, defaultTab = rememberLastTab || (emoji ? "twemoji" : "carbon"), defaultColor = rememberLastColor || COLORS[0], locale, onChange, onCancel }) => {
|
|
18707
|
+
if (!emoji && !carbon) carbon = true;
|
|
18708
|
+
const i18n = useI18n(true);
|
|
18709
|
+
const language$ = locale || i18n?.lang$ || "en";
|
|
18710
|
+
const t = getTranslate(useVal(language$));
|
|
18711
|
+
const root = useRef(null);
|
|
18712
|
+
const [tab, setTab] = useState(defaultTab);
|
|
18713
|
+
const [searchText, setSearchText] = useState("");
|
|
18714
|
+
const [maxItems, setMaxItems] = useState(MAX_ITEMS_INIT);
|
|
18715
|
+
const [filteredIcons, setIcons] = useState(null);
|
|
18716
|
+
const [selectedColor, setColor] = useState(defaultColor);
|
|
18717
|
+
const [colorsPanel, setColorsPanel] = useState(false);
|
|
18718
|
+
const hasColors = tab === "carbon";
|
|
18719
|
+
const iconifyData = useIconifyData(true);
|
|
18720
|
+
const loadCollection = useIconifyCollectionLoader();
|
|
18721
|
+
useEffect(() => {
|
|
18722
|
+
loadCollection?.(tab).catch((error) => console.error(`Failed to load the ${tab} icon collection.`, error));
|
|
18723
|
+
}, [loadCollection, tab]);
|
|
18724
|
+
const fzf = useMemo(() => {
|
|
18725
|
+
const collection = iconifyData?.[tab];
|
|
18726
|
+
if (collection) return new AsyncFzf(Object.keys(collection.icons.icons), {
|
|
18727
|
+
casing: "case-insensitive",
|
|
18728
|
+
fuzzy: "v1"
|
|
18729
|
+
});
|
|
18730
|
+
return null;
|
|
18731
|
+
}, [iconifyData, tab]);
|
|
18732
|
+
const loadMore = useCallback(() => {
|
|
18733
|
+
setMaxItems((currentMaxItems) => currentMaxItems + MAX_ITEMS_STEP);
|
|
18734
|
+
}, []);
|
|
18735
|
+
const searchTimeout = useRef(0);
|
|
18736
|
+
useEffect(() => {
|
|
18737
|
+
clearTimeout(searchTimeout.current);
|
|
18738
|
+
if (searchText) {
|
|
18739
|
+
setIcons([]);
|
|
18740
|
+
if (!fzf || !searchText) return;
|
|
18741
|
+
let isMounted = true;
|
|
18742
|
+
searchTimeout.current = window.setTimeout(async () => {
|
|
18743
|
+
const result = await fzf.find(searchText);
|
|
18744
|
+
if (isMounted) {
|
|
18745
|
+
setMaxItems(MAX_ITEMS_INIT);
|
|
18746
|
+
setIcons(result.map((i) => i.item));
|
|
18747
|
+
}
|
|
18748
|
+
}, 200);
|
|
18749
|
+
return () => {
|
|
18750
|
+
isMounted = false;
|
|
18751
|
+
};
|
|
18752
|
+
} else setIcons(null);
|
|
18753
|
+
}, [fzf, searchText]);
|
|
18754
|
+
const onClickShuffle = useCallback(() => {
|
|
18755
|
+
const collection = iconifyData?.[tab];
|
|
18756
|
+
if (onChange && collection) {
|
|
18757
|
+
const keys = Object.keys(collection.icons.icons);
|
|
18758
|
+
const icon = keys[Math.floor(Math.random() * keys.length)];
|
|
18759
|
+
const color = COLORS[Math.floor(Math.random() * COLORS.length)];
|
|
18760
|
+
onChange(tab, icon, color, true);
|
|
18761
|
+
}
|
|
18762
|
+
}, [tab, onChange]);
|
|
18763
|
+
const toggleColorsPanel = useCallback(() => {
|
|
18764
|
+
setColorsPanel((e) => !e);
|
|
18765
|
+
}, []);
|
|
18766
|
+
const onClickColors = useCallback((event) => {
|
|
18767
|
+
const color = event.target.dataset.color;
|
|
18768
|
+
if (color) setColor(rememberLastColor = color);
|
|
18769
|
+
}, []);
|
|
18770
|
+
const onClickIcon = useCallback((event) => {
|
|
18771
|
+
const icon = event.target.dataset.icon;
|
|
18772
|
+
if (icon && onChange) onChange(tab, icon, selectedColor, false);
|
|
18773
|
+
}, [
|
|
18774
|
+
tab,
|
|
18775
|
+
selectedColor,
|
|
18776
|
+
onChange
|
|
18777
|
+
]);
|
|
18778
|
+
const onKeyDown = useCallback((event) => {
|
|
18779
|
+
if (event.key === "Escape" && onCancel) {
|
|
18780
|
+
event.stopPropagation();
|
|
18781
|
+
onCancel();
|
|
18782
|
+
}
|
|
18783
|
+
}, [onCancel]);
|
|
18784
|
+
useEffect(() => {
|
|
18785
|
+
root.current?.focus();
|
|
18786
|
+
}, []);
|
|
18787
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
18788
|
+
className: clsx(IconPicker_module_default.container, className),
|
|
18789
|
+
style: CONTAINER_STYLE,
|
|
18790
|
+
tabIndex: -1,
|
|
18791
|
+
onKeyDown,
|
|
18792
|
+
children: [
|
|
18793
|
+
/* @__PURE__ */ jsxs("div", {
|
|
18794
|
+
className: IconPicker_module_default.filter,
|
|
18795
|
+
children: [/* @__PURE__ */ jsxs(InputGroup, {
|
|
18796
|
+
className: "h-6",
|
|
18797
|
+
children: [/* @__PURE__ */ jsx(InputGroupAddon, { children: /* @__PURE__ */ jsx("i", {
|
|
18798
|
+
"aria-hidden": "true",
|
|
18799
|
+
className: "i-lucide-light:search text-sm"
|
|
18800
|
+
}) }), /* @__PURE__ */ jsx(InputGroupInput, {
|
|
18801
|
+
className: "h-full py-0 text-[11px] md:text-[11px]",
|
|
18802
|
+
"aria-label": t("filter"),
|
|
18803
|
+
autoComplete: "off",
|
|
18804
|
+
type: "search",
|
|
18805
|
+
placeholder: t("filter"),
|
|
18806
|
+
value: searchText,
|
|
18807
|
+
onChange: (e) => setSearchText(e.target.value),
|
|
18808
|
+
autoFocus: true
|
|
18809
|
+
})]
|
|
18810
|
+
}), /* @__PURE__ */ jsxs(Tooltip, { children: [/* @__PURE__ */ jsx(TooltipTrigger, {
|
|
18811
|
+
render: /* @__PURE__ */ jsx(Button, {
|
|
18812
|
+
variant: "ghost",
|
|
18813
|
+
size: "icon-xs",
|
|
18814
|
+
"aria-label": t("random"),
|
|
18815
|
+
onClick: onClickShuffle,
|
|
18816
|
+
type: "button"
|
|
18817
|
+
}),
|
|
18818
|
+
children: /* @__PURE__ */ jsx("i", {
|
|
18819
|
+
"aria-hidden": "true",
|
|
18820
|
+
className: "i-lucide-light:shuffle text-sm"
|
|
18821
|
+
})
|
|
18822
|
+
}), /* @__PURE__ */ jsx(TooltipContent, { children: t("random") })] })]
|
|
18823
|
+
}),
|
|
18824
|
+
/* @__PURE__ */ jsxs("div", {
|
|
18825
|
+
className: IconPicker_module_default.tabs,
|
|
18826
|
+
children: [
|
|
18827
|
+
/* @__PURE__ */ jsx(Tabs, {
|
|
18828
|
+
value: tab,
|
|
18829
|
+
onValueChange: (value) => {
|
|
18830
|
+
setTab(rememberLastTab = value);
|
|
18831
|
+
setColorsPanel(false);
|
|
18832
|
+
},
|
|
18833
|
+
className: "min-w-0 flex-1",
|
|
18834
|
+
children: /* @__PURE__ */ jsxs(TabsList, {
|
|
18835
|
+
variant: "flat",
|
|
18836
|
+
className: "w-full rounded-[6px] p-0.5 group-data-[orientation=horizontal]/tabs:h-6",
|
|
18837
|
+
children: [emoji && /* @__PURE__ */ jsx(TabsTrigger, {
|
|
18838
|
+
className: "text-[11px] group-data-[variant=flat]/tabs-list:rounded-[4px]",
|
|
18839
|
+
value: "twemoji",
|
|
18840
|
+
children: t("emoji")
|
|
18841
|
+
}), carbon && /* @__PURE__ */ jsx(TabsTrigger, {
|
|
18842
|
+
className: "text-[11px] group-data-[variant=flat]/tabs-list:rounded-[4px]",
|
|
18843
|
+
value: "carbon",
|
|
18844
|
+
children: t("carbon")
|
|
18845
|
+
})]
|
|
18846
|
+
})
|
|
18847
|
+
}),
|
|
18848
|
+
hasColors && /* @__PURE__ */ jsxs(Tooltip, { children: [/* @__PURE__ */ jsx(TooltipTrigger, {
|
|
18849
|
+
render: /* @__PURE__ */ jsx(Button, {
|
|
18850
|
+
variant: "ghost",
|
|
18851
|
+
size: "icon-xs",
|
|
18852
|
+
"aria-expanded": colorsPanel,
|
|
18853
|
+
"aria-label": t("color"),
|
|
18854
|
+
onClick: toggleColorsPanel,
|
|
18855
|
+
type: "button"
|
|
18856
|
+
}),
|
|
18857
|
+
children: /* @__PURE__ */ jsx("i", {
|
|
18858
|
+
"aria-hidden": "true",
|
|
18859
|
+
className: "i-lucide-light:palette text-sm",
|
|
18860
|
+
style: { color: selectedColor }
|
|
18861
|
+
})
|
|
18862
|
+
}), /* @__PURE__ */ jsx(TooltipContent, { children: t("color") })] }),
|
|
18863
|
+
/* @__PURE__ */ jsx("div", {
|
|
18864
|
+
onClick: onClickColors,
|
|
18865
|
+
className: IconPicker_module_default.colors,
|
|
18866
|
+
style: hasColors && colorsPanel ? {} : { display: "none" },
|
|
18867
|
+
children: COLORS.map((color) => /* @__PURE__ */ jsx("button", {
|
|
18868
|
+
"aria-label": `${t("color")}: ${color}`,
|
|
18869
|
+
"aria-pressed": selectedColor === color,
|
|
18870
|
+
className: IconPicker_module_default.color,
|
|
18871
|
+
"data-color": color,
|
|
18872
|
+
style: { backgroundColor: color },
|
|
18873
|
+
type: "button"
|
|
18874
|
+
}, color))
|
|
18875
|
+
})
|
|
18876
|
+
]
|
|
18877
|
+
}),
|
|
18878
|
+
iconifyData?.[tab] ? /* @__PURE__ */ jsx(IconPickerIconsPanel, {
|
|
18879
|
+
filteredIcons: filteredIcons?.slice(0, maxItems),
|
|
18880
|
+
collection: tab,
|
|
18881
|
+
categories: iconifyData?.[tab]?.metadata?.categories,
|
|
18882
|
+
color: selectedColor,
|
|
18883
|
+
onClick: onClickIcon
|
|
18884
|
+
}, tab) : /* @__PURE__ */ jsxs("div", {
|
|
18885
|
+
className: IconPicker_module_default.loading,
|
|
18886
|
+
children: [/* @__PURE__ */ jsx("i", { className: "i-codicon:loading" }), /* @__PURE__ */ jsx("span", { children: t("loading") })]
|
|
18887
|
+
}),
|
|
18888
|
+
filteredIcons && filteredIcons.length > maxItems && /* @__PURE__ */ jsx(Button, {
|
|
18889
|
+
variant: "ghost",
|
|
18890
|
+
size: "xs",
|
|
18891
|
+
className: "mx-3 mb-2 shrink-0 text-[11px]",
|
|
18892
|
+
onClick: loadMore,
|
|
18893
|
+
type: "button",
|
|
18894
|
+
children: t("more")
|
|
18895
|
+
})
|
|
18896
|
+
]
|
|
18897
|
+
});
|
|
18898
|
+
};
|
|
18899
|
+
//#endregion
|
|
18900
|
+
//#region src/ui/browser/icons/icon-picker-button.tsx
|
|
18901
|
+
function IconPickerButton({ children, className, disabled, label, onChange, side = "bottom", size = "icon-xs", variant = "ghost" }) {
|
|
18902
|
+
const [open, setOpen] = useState(false);
|
|
18903
|
+
const [container, setContainer] = useState(null);
|
|
18904
|
+
return /* @__PURE__ */ jsx("div", {
|
|
18905
|
+
className: "inline-flex",
|
|
18906
|
+
ref: setContainer,
|
|
18907
|
+
children: /* @__PURE__ */ jsxs(Popover, {
|
|
18908
|
+
open: open && !disabled,
|
|
18909
|
+
onOpenChange: setOpen,
|
|
18910
|
+
children: [/* @__PURE__ */ jsxs(Tooltip, { children: [/* @__PURE__ */ jsx(TooltipTrigger, {
|
|
18911
|
+
render: /* @__PURE__ */ jsx(PopoverTrigger, { render: /* @__PURE__ */ jsx(Button, {
|
|
18912
|
+
type: "button",
|
|
18913
|
+
"aria-label": label,
|
|
18914
|
+
className,
|
|
18915
|
+
disabled,
|
|
18916
|
+
size,
|
|
18917
|
+
variant
|
|
18918
|
+
}) }),
|
|
18919
|
+
children
|
|
18920
|
+
}), /* @__PURE__ */ jsx(TooltipContent, {
|
|
18921
|
+
container,
|
|
18922
|
+
children: label
|
|
18923
|
+
})] }), /* @__PURE__ */ jsx(PopoverContent, {
|
|
18924
|
+
"aria-label": label,
|
|
18925
|
+
container,
|
|
18926
|
+
side,
|
|
18927
|
+
className: "w-auto overflow-hidden border border-foreground/10 p-0 ring-0",
|
|
18928
|
+
children: /* @__PURE__ */ jsx(IconPicker, {
|
|
18929
|
+
emoji: true,
|
|
18930
|
+
onCancel: () => setOpen(false),
|
|
18931
|
+
onChange: (collection, icon, color) => {
|
|
18932
|
+
onChange(color.toLowerCase() === "currentcolor" ? `:${collection}:${icon}:` : `:${collection}:${icon}:${color}:`);
|
|
18933
|
+
setOpen(false);
|
|
18934
|
+
}
|
|
18935
|
+
})
|
|
18936
|
+
})]
|
|
18937
|
+
})
|
|
18938
|
+
});
|
|
18939
|
+
}
|
|
18940
|
+
//#endregion
|
|
18941
|
+
//#region ../../node_modules/.bun/@base-ui+react@1.4.1+fa6c2f29eeb10566/node_modules/@base-ui/react/esm/combobox/root/ComboboxRootContext.js
|
|
18942
|
+
var ComboboxRootContext = /*#__PURE__*/ React.createContext(void 0);
|
|
18943
|
+
if (process.env.NODE_ENV !== "production") ComboboxRootContext.displayName = "ComboboxRootContext";
|
|
18944
|
+
var ComboboxFloatingContext = /*#__PURE__*/ React.createContext(void 0);
|
|
18945
|
+
if (process.env.NODE_ENV !== "production") ComboboxFloatingContext.displayName = "ComboboxFloatingContext";
|
|
18946
|
+
var ComboboxDerivedItemsContext = /*#__PURE__*/ React.createContext(void 0);
|
|
18947
|
+
if (process.env.NODE_ENV !== "production") ComboboxDerivedItemsContext.displayName = "ComboboxDerivedItemsContext";
|
|
18948
|
+
var ComboboxInputValueContext = /*#__PURE__*/ React.createContext("");
|
|
18949
|
+
if (process.env.NODE_ENV !== "production") ComboboxInputValueContext.displayName = "ComboboxInputValueContext";
|
|
18950
|
+
function useComboboxRootContext() {
|
|
18951
|
+
const context = React.useContext(ComboboxRootContext);
|
|
18952
|
+
if (!context) throw new Error(process.env.NODE_ENV !== "production" ? "Base UI: ComboboxRootContext is missing. Combobox parts must be placed within <Combobox.Root>." : formatErrorMessage(22));
|
|
18953
|
+
return context;
|
|
18954
|
+
}
|
|
18955
|
+
function useComboboxFloatingContext() {
|
|
18956
|
+
const context = React.useContext(ComboboxFloatingContext);
|
|
18957
|
+
if (!context) throw new Error(process.env.NODE_ENV !== "production" ? "Base UI: ComboboxFloatingContext is missing. Combobox parts must be placed within <Combobox.Root>." : formatErrorMessage(23));
|
|
18958
|
+
return context;
|
|
18959
|
+
}
|
|
18960
|
+
function useComboboxDerivedItemsContext() {
|
|
18961
|
+
const context = React.useContext(ComboboxDerivedItemsContext);
|
|
18962
|
+
if (!context) throw new Error(process.env.NODE_ENV !== "production" ? "Base UI: ComboboxItemsContext is missing. Combobox parts must be placed within <Combobox.Root>." : formatErrorMessage(24));
|
|
18963
|
+
return context;
|
|
18964
|
+
}
|
|
18965
|
+
function useComboboxInputValueContext() {
|
|
18966
|
+
return React.useContext(ComboboxInputValueContext);
|
|
18967
|
+
}
|
|
18968
|
+
//#endregion
|
|
16542
18969
|
//#region ../../node_modules/.bun/@base-ui+react@1.4.1+fa6c2f29eeb10566/node_modules/@base-ui/react/esm/combobox/store.js
|
|
16543
18970
|
var selectors = {
|
|
16544
18971
|
id: createSelector((state) => state.id),
|
|
@@ -19406,6 +21833,8 @@ function FlowSettingsDialog({ flow, onClose, onSaved, finalFocus, ...context })
|
|
|
19406
21833
|
const t = useTranslate();
|
|
19407
21834
|
const original = useRef(flow).current;
|
|
19408
21835
|
const [name, setName] = useState(original.name);
|
|
21836
|
+
const [icon, setIcon] = useState(original.icon ?? null);
|
|
21837
|
+
const [description, setDescription] = useState(original.description ?? "");
|
|
19409
21838
|
const [ids, setIds] = useState(original.tagIds ?? []);
|
|
19410
21839
|
const [creating, setCreating] = useState(false);
|
|
19411
21840
|
const [pending, setPending] = useState(false);
|
|
@@ -19416,19 +21845,23 @@ function FlowSettingsDialog({ flow, onClose, onSaved, finalFocus, ...context })
|
|
|
19416
21845
|
const tags = useVal(context.store.tags.state);
|
|
19417
21846
|
const titleId = useId();
|
|
19418
21847
|
const tagsId = useId();
|
|
21848
|
+
const descriptionId = useId();
|
|
19419
21849
|
const issue = resourceNameIssue(name);
|
|
19420
21850
|
const nameChanged = name.trim() != original.name;
|
|
19421
21851
|
const tagsChanged = JSON.stringify(ids.toSorted()) != JSON.stringify((original.tagIds ?? []).toSorted());
|
|
21852
|
+
const iconChanged = icon != (original.icon ?? null);
|
|
21853
|
+
const descriptionChanged = description != (original.description ?? "");
|
|
21854
|
+
const changed = nameChanged || iconChanged || descriptionChanged || tagsChanged;
|
|
19422
21855
|
function requestClose(proceed = onClose) {
|
|
19423
21856
|
if (pending || creating) return;
|
|
19424
|
-
if (
|
|
21857
|
+
if (changed) {
|
|
19425
21858
|
leaveAction.current = proceed;
|
|
19426
21859
|
setConfirmDiscard(true);
|
|
19427
21860
|
} else proceed();
|
|
19428
21861
|
}
|
|
19429
21862
|
async function save() {
|
|
19430
21863
|
if (pending || creating || issue != null || tagsChanged && (tags.loading || tags.failed)) return;
|
|
19431
|
-
if (!
|
|
21864
|
+
if (!changed) {
|
|
19432
21865
|
onClose();
|
|
19433
21866
|
return;
|
|
19434
21867
|
}
|
|
@@ -19436,6 +21869,8 @@ function FlowSettingsDialog({ flow, onClose, onSaved, finalFocus, ...context })
|
|
|
19436
21869
|
try {
|
|
19437
21870
|
if (await context.store.updateFlowSettings(flow.flowId, {
|
|
19438
21871
|
...nameChanged ? { name: name.trim() } : {},
|
|
21872
|
+
...iconChanged ? { icon } : {},
|
|
21873
|
+
...descriptionChanged ? { description: description || null } : {},
|
|
19439
21874
|
...tagsChanged ? { tagIds: ids } : {}
|
|
19440
21875
|
})) {
|
|
19441
21876
|
onSaved?.();
|
|
@@ -19471,6 +21906,31 @@ function FlowSettingsDialog({ flow, onClose, onSaved, finalFocus, ...context })
|
|
|
19471
21906
|
className: "sr-only",
|
|
19472
21907
|
children: t("flowSettings.title")
|
|
19473
21908
|
}),
|
|
21909
|
+
/* @__PURE__ */ jsxs(Field, { children: [/* @__PURE__ */ jsx(FieldLabel, { children: t("flowSettings.icon") }), /* @__PURE__ */ jsxs("div", {
|
|
21910
|
+
className: "flex items-center gap-2",
|
|
21911
|
+
children: [/* @__PURE__ */ jsx(IconPickerButton, {
|
|
21912
|
+
label: t("flowSettings.icon"),
|
|
21913
|
+
disabled: pending,
|
|
21914
|
+
size: "icon",
|
|
21915
|
+
variant: "outline",
|
|
21916
|
+
onChange: setIcon,
|
|
21917
|
+
children: /* @__PURE__ */ jsx(ContentIcon, {
|
|
21918
|
+
src: icon ?? void 0,
|
|
21919
|
+
className: "size-5",
|
|
21920
|
+
fallback: /* @__PURE__ */ jsx("i", {
|
|
21921
|
+
"aria-hidden": "true",
|
|
21922
|
+
className: "i-lucide-light:workflow size-5"
|
|
21923
|
+
})
|
|
21924
|
+
})
|
|
21925
|
+
}), /* @__PURE__ */ jsx(Button, {
|
|
21926
|
+
type: "button",
|
|
21927
|
+
variant: "ghost",
|
|
21928
|
+
size: "sm",
|
|
21929
|
+
disabled: icon == null,
|
|
21930
|
+
onClick: () => setIcon(null),
|
|
21931
|
+
children: t("flowSettings.resetIcon")
|
|
21932
|
+
})]
|
|
21933
|
+
})] }),
|
|
19474
21934
|
/* @__PURE__ */ jsxs(Field, {
|
|
19475
21935
|
"data-invalid": issue != null,
|
|
19476
21936
|
children: [
|
|
@@ -19493,6 +21953,17 @@ function FlowSettingsDialog({ flow, onClose, onSaved, finalFocus, ...context })
|
|
|
19493
21953
|
})
|
|
19494
21954
|
]
|
|
19495
21955
|
}),
|
|
21956
|
+
/* @__PURE__ */ jsxs(Field, { children: [/* @__PURE__ */ jsx(FieldLabel, {
|
|
21957
|
+
htmlFor: descriptionId,
|
|
21958
|
+
children: t("flowSettings.description")
|
|
21959
|
+
}), /* @__PURE__ */ jsx(Textarea, {
|
|
21960
|
+
id: descriptionId,
|
|
21961
|
+
name: "flow-description",
|
|
21962
|
+
rows: 3,
|
|
21963
|
+
className: "max-h-40 resize-y",
|
|
21964
|
+
value: description,
|
|
21965
|
+
onChange: (event) => setDescription(event.target.value)
|
|
21966
|
+
})] }),
|
|
19496
21967
|
/* @__PURE__ */ jsxs(Field, { children: [/* @__PURE__ */ jsx(FieldLabel, {
|
|
19497
21968
|
htmlFor: tagsId,
|
|
19498
21969
|
children: t("tags.title")
|
|
@@ -19519,7 +21990,7 @@ function FlowSettingsDialog({ flow, onClose, onSaved, finalFocus, ...context })
|
|
|
19519
21990
|
children: t("common.cancel")
|
|
19520
21991
|
}), /* @__PURE__ */ jsx(Button, {
|
|
19521
21992
|
type: "submit",
|
|
19522
|
-
disabled: pending || creating || issue != null || !
|
|
21993
|
+
disabled: pending || creating || issue != null || !changed || tagsChanged && (tags.loading || tags.failed),
|
|
19523
21994
|
children: t("common.save")
|
|
19524
21995
|
})] })
|
|
19525
21996
|
]
|
|
@@ -19646,6 +22117,21 @@ function IdTooltip(props) {
|
|
|
19646
22117
|
}
|
|
19647
22118
|
//#endregion
|
|
19648
22119
|
//#region src/workbench/browser/runtime/shell/workflowExportMenuItem.tsx
|
|
22120
|
+
/** Finish the menu's focus restoration before an export dialog can open. */
|
|
22121
|
+
function useWorkflowExportAction(onExport) {
|
|
22122
|
+
const requested = useRef(false);
|
|
22123
|
+
return {
|
|
22124
|
+
onClick: () => {
|
|
22125
|
+
requested.current = true;
|
|
22126
|
+
},
|
|
22127
|
+
onOpenChangeComplete: (open) => {
|
|
22128
|
+
if (!open && requested.current) {
|
|
22129
|
+
requested.current = false;
|
|
22130
|
+
onExport?.();
|
|
22131
|
+
}
|
|
22132
|
+
}
|
|
22133
|
+
};
|
|
22134
|
+
}
|
|
19649
22135
|
function WorkflowExportMenuItem({ disabled, onClick, className }) {
|
|
19650
22136
|
const t = useTranslate();
|
|
19651
22137
|
return /* @__PURE__ */ jsxs(DropdownMenuItem, {
|
|
@@ -19659,6 +22145,103 @@ function WorkflowExportMenuItem({ disabled, onClick, className }) {
|
|
|
19659
22145
|
});
|
|
19660
22146
|
}
|
|
19661
22147
|
//#endregion
|
|
22148
|
+
//#region src/workbench/browser/runtime/shell/workflowTransfer.tsx
|
|
22149
|
+
function WorkflowListItem({ name }) {
|
|
22150
|
+
return /* @__PURE__ */ jsxs("li", {
|
|
22151
|
+
className: "flex items-start gap-2",
|
|
22152
|
+
children: [/* @__PURE__ */ jsx("i", {
|
|
22153
|
+
"aria-hidden": "true",
|
|
22154
|
+
className: "i-lucide-light:workflow mt-0.5 size-4 shrink-0 text-muted-foreground"
|
|
22155
|
+
}), /* @__PURE__ */ jsx("span", {
|
|
22156
|
+
className: "min-w-0 break-words",
|
|
22157
|
+
children: name
|
|
22158
|
+
})]
|
|
22159
|
+
});
|
|
22160
|
+
}
|
|
22161
|
+
function WorkflowBundleSummary({ bundle, entryName }) {
|
|
22162
|
+
const t = useTranslate();
|
|
22163
|
+
return /* @__PURE__ */ jsxs("details", {
|
|
22164
|
+
className: "group text-sm",
|
|
22165
|
+
children: [/* @__PURE__ */ jsxs("summary", {
|
|
22166
|
+
className: "flex cursor-pointer list-none items-center gap-2 text-muted-foreground [&::-webkit-details-marker]:hidden",
|
|
22167
|
+
children: [/* @__PURE__ */ jsx("i", {
|
|
22168
|
+
"aria-hidden": "true",
|
|
22169
|
+
className: "i-lucide-light:chevron-right shrink-0 group-open:rotate-90"
|
|
22170
|
+
}), t("workflowTransfer.workflowCount", { count: bundle.workflows.length })]
|
|
22171
|
+
}), /* @__PURE__ */ jsx("ul", {
|
|
22172
|
+
className: "m-0 mt-2 max-h-40 list-none space-y-1 overflow-y-auto p-0 pl-5",
|
|
22173
|
+
children: bundle.workflows.map(({ flowId, file }) => /* @__PURE__ */ jsx(WorkflowListItem, { name: flowId == bundle.entryFlowId ? entryName : file.name ?? t("workflowTransfer.unnamed") }, flowId))
|
|
22174
|
+
})]
|
|
22175
|
+
});
|
|
22176
|
+
}
|
|
22177
|
+
function ExportDialog({ preview, workspace, container }) {
|
|
22178
|
+
const t = useTranslate();
|
|
22179
|
+
const id = useId();
|
|
22180
|
+
const [includeDependencies, setIncludeDependencies] = useState(true);
|
|
22181
|
+
const workflows = includeDependencies ? preview.workflows : preview.workflows.filter((item) => item.flowId == preview.entryFlowId);
|
|
22182
|
+
const missing = includeDependencies ? preview.unavailableFlowIds.length : 0;
|
|
22183
|
+
return /* @__PURE__ */ jsx(Dialog, {
|
|
22184
|
+
open: true,
|
|
22185
|
+
onOpenChange: (open) => {
|
|
22186
|
+
if (!open) workspace.closeExport();
|
|
22187
|
+
},
|
|
22188
|
+
children: /* @__PURE__ */ jsxs(DialogContent, {
|
|
22189
|
+
container,
|
|
22190
|
+
showCloseButton: false,
|
|
22191
|
+
className: "max-h-[calc(100dvh-2rem)] grid-rows-[auto_auto_minmax(0,1fr)_auto]",
|
|
22192
|
+
children: [
|
|
22193
|
+
/* @__PURE__ */ jsx(DialogHeader, { children: /* @__PURE__ */ jsx(DialogTitle, { children: t("resource.exportFlow") }) }),
|
|
22194
|
+
/* @__PURE__ */ jsxs(Field, {
|
|
22195
|
+
orientation: "horizontal",
|
|
22196
|
+
children: [/* @__PURE__ */ jsx(Checkbox, {
|
|
22197
|
+
id,
|
|
22198
|
+
checked: includeDependencies,
|
|
22199
|
+
onCheckedChange: setIncludeDependencies
|
|
22200
|
+
}), /* @__PURE__ */ jsx(FieldLabel, {
|
|
22201
|
+
htmlFor: id,
|
|
22202
|
+
children: t("workflowTransfer.includeDependencies")
|
|
22203
|
+
})]
|
|
22204
|
+
}),
|
|
22205
|
+
/* @__PURE__ */ jsxs("div", {
|
|
22206
|
+
className: "min-h-0 overflow-y-auto",
|
|
22207
|
+
children: [
|
|
22208
|
+
/* @__PURE__ */ jsx("p", {
|
|
22209
|
+
className: "m-0 mb-2 text-xs text-muted-foreground",
|
|
22210
|
+
children: t("workflowTransfer.workflowCount", { count: workflows.length + missing })
|
|
22211
|
+
}),
|
|
22212
|
+
/* @__PURE__ */ jsx("ul", {
|
|
22213
|
+
className: "m-0 list-none space-y-2 p-0",
|
|
22214
|
+
children: workflows.map(({ flowId, file }) => /* @__PURE__ */ jsx(WorkflowListItem, { name: file.name ?? t("workflowTransfer.unnamed") }, flowId))
|
|
22215
|
+
}),
|
|
22216
|
+
missing > 0 && /* @__PURE__ */ jsx("p", {
|
|
22217
|
+
role: "alert",
|
|
22218
|
+
className: "m-0 mt-2 text-sm text-destructive",
|
|
22219
|
+
children: t("workflowTransfer.unavailable", { count: missing })
|
|
22220
|
+
})
|
|
22221
|
+
]
|
|
22222
|
+
}),
|
|
22223
|
+
/* @__PURE__ */ jsxs(DialogFooter, { children: [/* @__PURE__ */ jsx(Button, {
|
|
22224
|
+
variant: "outline",
|
|
22225
|
+
onClick: () => workspace.closeExport(),
|
|
22226
|
+
children: t("common.cancel")
|
|
22227
|
+
}), /* @__PURE__ */ jsx(Button, {
|
|
22228
|
+
disabled: missing > 0,
|
|
22229
|
+
onClick: () => workspace.completeExport(includeDependencies),
|
|
22230
|
+
children: t("workflowTransfer.export")
|
|
22231
|
+
})] })
|
|
22232
|
+
]
|
|
22233
|
+
})
|
|
22234
|
+
});
|
|
22235
|
+
}
|
|
22236
|
+
function WorkflowExportDialog({ workspace, container }) {
|
|
22237
|
+
const preview = useVal(workspace.exportPreview);
|
|
22238
|
+
return preview == null ? null : /* @__PURE__ */ jsx(ExportDialog, {
|
|
22239
|
+
preview,
|
|
22240
|
+
workspace,
|
|
22241
|
+
container
|
|
22242
|
+
}, preview.entryFlowId);
|
|
22243
|
+
}
|
|
22244
|
+
//#endregion
|
|
19662
22245
|
//#region ../../node_modules/.bun/dequal@2.0.3/node_modules/dequal/dist/index.mjs
|
|
19663
22246
|
var has = Object.prototype.hasOwnProperty;
|
|
19664
22247
|
function find(iter, tar, key) {
|
|
@@ -21292,11 +23875,10 @@ var RevisionView = class {
|
|
|
21292
23875
|
}
|
|
21293
23876
|
};
|
|
21294
23877
|
function revisionView(revision) {
|
|
21295
|
-
|
|
21296
|
-
if (
|
|
21297
|
-
|
|
21298
|
-
|
|
21299
|
-
}
|
|
23878
|
+
const cached = views.get(revision);
|
|
23879
|
+
if (cached) return cached;
|
|
23880
|
+
const view = new RevisionView(revision);
|
|
23881
|
+
views.set(revision, view);
|
|
21300
23882
|
return view;
|
|
21301
23883
|
}
|
|
21302
23884
|
function connectorAccessReferences(document) {
|
|
@@ -22073,7 +24655,7 @@ function nodeDiagnosticCount(node, diagnostics) {
|
|
|
22073
24655
|
return diagnostics.filter((diagnostic) => paths.some((path) => diagnostic.path.startsWith(path))).length;
|
|
22074
24656
|
}
|
|
22075
24657
|
function runProjection(revision, run, events) {
|
|
22076
|
-
if (run
|
|
24658
|
+
if (run == null || revision.revision.flowId == null || revision.revision.revisionId == null || run.flowId != revision.revision.flowId || run.revisionId != revision.revision.revisionId) return { nodes: /* @__PURE__ */ new Map() };
|
|
22077
24659
|
const active = run.status == "queued" || run.status == "starting" || run.status == "running" || run.status == "waiting";
|
|
22078
24660
|
const nodes = /* @__PURE__ */ new Map();
|
|
22079
24661
|
if ("waits" in run) for (const wait of run.waits) nodes.set(wait.nodeId, {
|
|
@@ -25500,4 +28082,4 @@ function updateHttpParameters(revision, nodeId, group, edit, bindingId) {
|
|
|
25500
28082
|
return cleanVariableBindings(content, [...operations, ...binding]);
|
|
25501
28083
|
}
|
|
25502
28084
|
//#endregion
|
|
25503
|
-
export { resourceValue as $,
|
|
28085
|
+
export { resourceValue as $, allConnectorConnectionsQuery as $n, WorkflowExportDialog as $t, schemaForEditor as A, TabsTrigger as An, serverAddress as Ar, actionWithConnections as At, datePickerValue as B, EmptyMedia as Bn, ApiError as Br, setNodeContentHidden as Bt, updateValue as C, selectors as Cn, inputValue as Cr, flowResourceReferences as Ct, defaultValueEditorSchema as D, Tabs as Dn, openApiTask as Dr, diagnosticMessage as Dt, supportsFeishuChatFilter as E, IconPickerButton as En, openApiFieldIssues as Er, diagnosticItems as Et, calendarChange as F, InputGroupInput as Fn, workflowCandidateGroup as Fr, removeComments as Ft, indexAddNodeOptions as G, SourceSelect as Gn, setCodeActions as Gt, isDateFormat as H, Badge as Hn, eventSourceKind as Hr, setVerticalNodeWidth as Ht, calendarDate as I, Empty as In, workflowCapability as Ir, restoreCanvasPresentation as It, scopedValue as J, EventSourceSetup as Jn, setServiceConnections as Jt, combineSources as K, createI18n as Kn, setConnectorConnection as Kt, dateFromTimeZone as L, EmptyContent as Ln, workflowSelectionTask as Lr, setCanvasLayout as Lt, getDefaultValue as M, followWorkbenchLink as Mn, sameWorkflowInterface as Mr, canvasPresentationChange as Mt, isUnconstrainedSchema as N, InputGroup as Nn, workflowAgentTool as Nr, commentIds as Nt, editorComponent as O, TabsContent as On, securityOptions as Or, diagnosticNodeId as Ot, typeOfSchema as P, InputGroupAddon as Pn, workflowCandidate as Pr, flowPresentation as Pt, resourceData as Q, randomId as Qn, WorkflowBundleSummary as Qt, dateInTimeZone as R, EmptyDescription as Rn, invalidResponse as Rr, setComment as Rt, updateTriggerConfig as S, ComboboxRoot as Sn, triggerConfigValues as Sr, revisionView as St, feishuResourceKind as T, useComboboxRootContext as Tn, object$1 as Tr, deriveInspectorDiagnostics as Tt, addNodeIntent as U, EventSourcesPage as Un, repairNodeNames as Ut, dateTimeWall as V, EmptyTitle as Vn, controlErrorCode as Vr, setNodePositions as Vt, deriveAddNodeOptions as W, SourceForm as Wn, resetInputValues as Wt, CacheResource as X, WorkbenchClient as Xn, updateTriggerSchedule as Xt, connectorActionPresentation as Y, errorNotice as Yn, updateStartInputDefs as Yt, observeResource as Z, normalizeFlowQuery as Zn, dequal as Zt, updateOutputPorts as _, ComboboxList as _n, workflowBundleFromPreview as _r, actionSummary as _t, nameCreatedNodes as a, FlowTagChips as an, webhookResponseDiagnostics as ar, getActionsCache as at, updateTaskAdditionalInputs as b, ComboboxInputGroup as bn, workflowNameFromFile as br, canCancelRun as bt, setInputVariable as c, selectionMenuItemClass as cn, normalizeTriggerOutputs as cr, getProvidersCache as ct, updateCondition as d, valueEditor_module_default as dn, isJsonObject as dr, loadJson as dt, WorkflowExportMenuItem as en, decodeResultList as er, action as et, updateHttpParameters as f, ComboboxItemIndicator as fn, isJsonValue as fr, designerGraph as ft, updateNodeSettings as g, ComboboxPortal as gn, parseWorkflowImportFile as gr, triggerNodeIcon as gt, updateNodeName as h, ComboboxPositioner as hn, encodeWorkflowBundle as hr, semanticNodeIcon as ht, deleteSelection as i, FlowSettingsDialog as in, resolutionOutputPorts as ir, decodeAppCatalogResponse as it, valueForEditor as j, useFlowQuery as jn, servers as jr, connectionCatalog as jt, editorGroups as k, TabsList as kn, selectOperation as kr, schemaMismatchMessage as kt, setTriggerConnection as l, ValueControl as ln, sampleErrorOutputs as lr, createPersistentCache as lt, updateNodeIcon as m, ComboboxPopup as mn, connectorActionMetadata as mr, nodeTitle as mt, agentTool as n, IdTooltip as nn, executionReachableNodes as nr, proxyResponse as nt, selectWebhookResponse as o, TagPicker as on, sourceOutputLabel as or, getAppCatalogCache as ot, updateNodeDescription as p, ComboboxItem as pn, connection as pr, nodeIcon as pt, mapSource as q, FeishuEventPicker as qn, setInputSources as qt, applyFlowChanges as r, FlowSettingsButton as rn, inputSourceCandidates as rr, validateAction as rt, setInputValue as s, selectionMenuContentClass as sn, sourcePort as sr, getConnectionsCache as st, addNode as t, useWorkflowExportAction as tn, decodeTriggerCatalog as tr, provider as tt, setTriggerEventSource as u, ValueEditorFeedback as un, triggerOutputDefinitions as ur, createSessionCache as ut, updateResolution as v, GroupCollectionProvider as vn, encodeWorkflowFile as vr, providerIcon as vt, updateWebhook as w, useComboboxInputValueContext as wn, listOperations as wr, Latest as wt, updateTaskPorts as x, ComboboxInput as xn, triggerConfigValue as xr, hasRunFilter as xt, updateTask as y, ComboboxTrigger as yn, workflowFileName as yr, RunStore as yt, datePickerChange as z, EmptyHeader as zn, record$2 as zr, setFlowViewport as zt };
|