@parallelworks/ui 0.19.0 → 0.19.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunks/memoryStore-CC91S5LP.js → ai/adapter/memoryStore.js} +2 -2
- package/dist/ai/adapter/mock/index.js +2 -80
- package/dist/ai/adapter/mock/mockAdapter.js +81 -0
- package/dist/ai/adapter/openai/createOpenAIStream.js +33 -0
- package/dist/ai/adapter/openai/errors.js +37 -0
- package/dist/ai/adapter/openai/index.js +5 -333
- package/dist/ai/adapter/openai/openaiAdapter.js +54 -0
- package/dist/ai/adapter/openai/responses.js +108 -0
- package/dist/ai/adapter/openai/sse.js +112 -0
- package/dist/{chunks/types-Yy0NrerF.js → ai/adapter/types.js} +1 -1
- package/dist/ai/agent/classifier.js +12 -0
- package/dist/ai/agent/diff.js +223 -0
- package/dist/ai/agent/diffHighlight.js +101 -0
- package/dist/ai/agent/permissions.js +29 -0
- package/dist/ai/agent/toolfmt.js +383 -0
- package/dist/ai/agent/transcript.js +127 -0
- package/dist/ai/components/AllocationSelector.js +56 -0
- package/dist/ai/components/AttachmentManager.js +144 -0
- package/dist/ai/components/AttachmentUpload.js +179 -0
- package/dist/ai/components/BlockedGroupBanner.js +29 -0
- package/dist/ai/components/BranchNavigator.js +57 -0
- package/dist/ai/components/ChatEmptyState.js +171 -0
- package/dist/ai/components/ChatInput.js +265 -0
- package/dist/ai/components/ChatLayout.js +15 -0
- package/dist/ai/components/ChatMessage.js +338 -0
- package/dist/ai/components/ChatMessageList.js +301 -0
- package/dist/ai/components/ChatSidebar.js +345 -0
- package/dist/ai/components/ChatThread.js +198 -0
- package/dist/ai/components/ComposerChrome.js +50 -0
- package/dist/ai/components/ComposerFrame.js +33 -0
- package/dist/ai/components/DragOverlay.js +20 -0
- package/dist/ai/components/ModelSelector.js +343 -0
- package/dist/ai/components/ShareDialog.js +260 -0
- package/dist/ai/components/SlashMenu.js +91 -0
- package/dist/ai/components/agent/ActivityLine.js +151 -0
- package/dist/ai/components/agent/AgentMessageParts.js +721 -0
- package/dist/ai/components/agent/PermissionPicker.js +38 -0
- package/dist/ai/components/attachmentKeys.js +10 -0
- package/dist/ai/core/ChatProvider.js +848 -0
- package/dist/ai/core/KeyboardShortcutsProvider.js +9 -0
- package/dist/ai/core/chatReducer.js +223 -0
- package/dist/ai/core/config.js +45 -0
- package/dist/ai/core/events.js +4 -0
- package/dist/ai/core/exportConversation.js +42 -0
- package/dist/ai/core/greeting.js +38 -0
- package/dist/ai/core/parts.js +84 -0
- package/dist/ai/core/useDragDrop.js +36 -0
- package/dist/ai/core/useKeyboardShortcuts.js +77 -0
- package/dist/ai/core/useSSEStream.js +98 -0
- package/dist/ai/index.js +43 -6644
- package/dist/ai/strings.js +175 -0
- package/dist/ai/ui/Avatar.js +35 -0
- package/dist/ai/ui/Dropdown.js +110 -0
- package/dist/ai/ui/Markdown.js +79 -0
- package/dist/ai/ui/Notice.js +77 -0
- package/dist/ai/ui/codeBreaks.js +36 -0
- package/dist/ai/ui/prose.js +13 -0
- package/dist/ai/ui/sidebar.js +148 -0
- package/dist/ai/utils.js +23 -0
- package/dist/components/AddMenu.js +46 -0
- package/dist/components/Avatar.js +46 -0
- package/dist/{chunks/BareModal-BtRiQezg.js → components/BareModal.js} +1 -1
- package/dist/components/Breadcrumbs.js +83 -0
- package/dist/components/Button.js +83 -0
- package/dist/components/Callout.js +23 -0
- package/dist/components/Card.js +31 -0
- package/dist/components/CollapsiblePanel.js +77 -0
- package/dist/{chunks/ConfirmModal-aOR4O1QE.js → components/ConfirmModal.js} +4 -9
- package/dist/components/CopyToClipboard.js +81 -0
- package/dist/{chunks/Markdown-CM-FenNE.js → components/CreateModal.js} +9 -116
- package/dist/components/DescriptionList.js +42 -0
- package/dist/components/Dropdown.js +349 -0
- package/dist/components/EmptyState.js +27 -0
- package/dist/components/Filter.js +32 -0
- package/dist/components/FilterPill.js +13 -0
- package/dist/components/IconButton.js +34 -0
- package/dist/{chunks/Indicator-hBSIxOPK.js → components/Indicator.js} +1 -1
- package/dist/components/Input.js +88 -0
- package/dist/components/LetterBadge.js +13 -0
- package/dist/components/Listbox.js +123 -0
- package/dist/{chunks/Loader-BXoXTZGc.js → components/Loader.js} +1 -1
- package/dist/components/Markdown.js +15 -0
- package/dist/components/MultiSelect.js +171 -0
- package/dist/components/Overview.js +39 -0
- package/dist/components/PageHeader.js +194 -0
- package/dist/components/Pagination.js +35 -0
- package/dist/{chunks/Provider-CDYurraE.js → components/Provider.js} +1 -1
- package/dist/{chunks/RequiredMark-DfLdYbYZ.js → components/RequiredMark.js} +1 -1
- package/dist/components/SectionHeader.js +11 -0
- package/dist/components/SettingModeOption.js +30 -0
- package/dist/components/SettingRow.js +35 -0
- package/dist/components/SettingsCard.js +31 -0
- package/dist/components/SettingsGroup.js +17 -0
- package/dist/components/Sort.js +42 -0
- package/dist/components/StatusBadge.js +63 -0
- package/dist/components/SwitchToggle.js +59 -0
- package/dist/{chunks/SwitchToggleSmall-FcsaYSTs.js → components/SwitchToggleSmall.js} +1 -1
- package/dist/{chunks/Table-DU2MW8xz.js → components/Table.js} +3 -3
- package/dist/components/Toggle.js +20 -0
- package/dist/{chunks/Tooltip-K5HJr4_p.js → components/Tooltip.js} +2 -27
- package/dist/{chunks/StatusBadge-C1Blx_cW.js → components/dropdownUtils.js} +2 -63
- package/dist/{chunks/focus-D_iZJTW1.js → components/focus.js} +1 -1
- package/dist/components/ghostButton.js +7 -0
- package/dist/components/inputClasses.js +4 -0
- package/dist/components/keys.js +27 -0
- package/dist/components/relativeTime.js +32 -0
- package/dist/{chunks/useCssIsDark-DHr05dG2.js → components/useCssIsDark.js} +1 -1
- package/dist/{chunks/duration-BOv8Phl8.js → duration.js} +1 -1
- package/dist/editor/Editor.js +13 -0
- package/dist/editor/EditorField.js +53 -0
- package/dist/editor/FormCodePanel.js +173 -0
- package/dist/{chunks/Monaco-DJ8MW-Dq.js → editor/Monaco.js} +4 -2
- package/dist/editor/index.js +6 -1
- package/dist/editor/themes.js +91 -0
- package/dist/editor/workers.js +29 -0
- package/dist/editor/yaml.js +15 -0
- package/dist/file-explorer/FileExplorer.js +1402 -0
- package/dist/file-explorer/FileExplorerContext.js +370 -0
- package/dist/{chunks/CodePreviewEditor-YqQBz1YL.js → file-explorer/FilePreview/CodePreviewEditor.js} +3 -2
- package/dist/file-explorer/FilePreview/Inline.js +45 -0
- package/dist/file-explorer/FilePreview/StreamedBadge.js +16 -0
- package/dist/file-explorer/FilePreview/Viewer.js +526 -0
- package/dist/file-explorer/FilePreview/index.js +266 -0
- package/dist/file-explorer/FilePreview/parse.js +63 -0
- package/dist/file-explorer/FilePreview/previewCache.js +98 -0
- package/dist/file-explorer/FilePreview/previewType.js +151 -0
- package/dist/file-explorer/FilePreview/readCappedBytes.js +196 -0
- package/dist/file-explorer/FilePreview/useObjectBlobUrl.js +95 -0
- package/dist/file-explorer/FilePreview/useObjectText.js +109 -0
- package/dist/file-explorer/FilePreview/usePresignedUrl.js +73 -0
- package/dist/file-explorer/FileRow.js +165 -0
- package/dist/file-explorer/FileRowsWindow.js +92 -0
- package/dist/file-explorer/FileTable.js +172 -0
- package/dist/file-explorer/FileTableHeaders.js +49 -0
- package/dist/file-explorer/LoadMoreRow.js +46 -0
- package/dist/file-explorer/TreeView.js +376 -0
- package/dist/file-explorer/helpers.js +537 -0
- package/dist/file-explorer/index.js +7 -5671
- package/dist/file-explorer/lib/batch.js +39 -0
- package/dist/file-explorer/lib/errors.js +9 -0
- package/dist/file-explorer/lib/paging.js +124 -0
- package/dist/file-explorer/lib/utils.js +322 -0
- package/dist/file-explorer/toasts.js +400 -0
- package/dist/file-explorer/treeRows.js +73 -0
- package/dist/file-explorer/useNearEnd.js +27 -0
- package/dist/form/FieldWrapper.js +54 -0
- package/dist/form/Fields/BooleanField.js +51 -0
- package/dist/form/Fields/CheckboxGroupField.js +72 -0
- package/dist/form/Fields/ColorField.js +33 -0
- package/dist/form/Fields/DropdownField.js +49 -0
- package/dist/form/Fields/DurationField.js +130 -0
- package/dist/form/Fields/LabelField.js +19 -0
- package/dist/form/Fields/MultiDropdownField.js +40 -0
- package/dist/form/Fields/NumberField.js +51 -0
- package/dist/form/Fields/ObjectField.js +54 -0
- package/dist/form/Fields/RadioField.js +49 -0
- package/dist/form/Fields/RangeField.js +58 -0
- package/dist/form/Fields/ResourceOptionIcon.js +21 -0
- package/dist/form/Fields/StepField.js +6 -0
- package/dist/form/Fields/StringField.js +37 -0
- package/dist/form/Fields/TextAreaField.js +31 -0
- package/dist/form/Fields/durationValidity.js +11 -0
- package/dist/form/Form.js +643 -0
- package/dist/form/SpecialTypes/DropdownWrapper.js +30 -0
- package/dist/form/SpecialTypes/FormikCustomDropdown.js +122 -0
- package/dist/form/SpecialTypes/FormikCustomInput.js +111 -0
- package/dist/form/SpecialTypes/FormikMultiSelectDropdown.js +31 -0
- package/dist/form/SpecialTypes/FormikNumericInput.js +60 -0
- package/dist/form/Wizard/WizardContainer.js +138 -0
- package/dist/form/Wizard/WizardNavigation.js +92 -0
- package/dist/form/Wizard/WizardStepContent.js +35 -0
- package/dist/form/Wizard/WizardStepIndicator.js +108 -0
- package/dist/form/Wizard/useWizardState.js +118 -0
- package/dist/form/Wizard/utils.js +34 -0
- package/dist/form/fieldContext.js +26 -0
- package/dist/form/fieldRegistry.js +50 -0
- package/dist/form/index.js +17 -2321
- package/dist/{chunks/FieldWrapper-Cszwg-4B.js → form/lib.js} +2 -97
- package/dist/form/useParsedOpts.js +62 -0
- package/dist/form/usePrevious.js +11 -0
- package/dist/form/utils/checkShowIfObject.js +14 -0
- package/dist/form/utils/duration.js +69 -0
- package/dist/form/utils/getParentValue.js +23 -0
- package/dist/form/utils/getPlaceholder.js +9 -0
- package/dist/form/utils/getValueUsingPath.js +23 -0
- package/dist/form/utils/secondaryField.js +22 -0
- package/dist/graph/AnnotationBanner.js +141 -0
- package/dist/graph/Collapse.js +41 -0
- package/dist/graph/DependencyGraph.js +1398 -0
- package/dist/graph/JobSummary.js +104 -0
- package/dist/graph/MatrixGroup.js +107 -0
- package/dist/graph/Reveal.js +57 -0
- package/dist/graph/TreeView.js +711 -0
- package/dist/graph/index.js +1 -2519
- package/dist/graph/types.js +6 -0
- package/dist/index.js +46 -599
- package/dist/list/ActionToolbar.js +184 -0
- package/dist/list/HoverCard.js +73 -0
- package/dist/list/ListPage.js +145 -0
- package/dist/list/ListPager.js +59 -0
- package/dist/list/ListTable.js +163 -0
- package/dist/list/ListViewControls.js +372 -0
- package/dist/list/RowContextMenu.js +350 -0
- package/dist/list/UserHoverCard.js +117 -0
- package/dist/list/index.js +11 -2
- package/dist/list/listSearch.js +137 -0
- package/dist/list/listView.js +210 -0
- package/dist/list/textEntry.js +10 -0
- package/dist/{chunks/logviewer-BTKuQWzw.js → logviewer/LogViewer.js} +4 -82
- package/dist/logviewer/index.js +2 -1
- package/dist/logviewer/segments.js +80 -0
- package/package.json +1 -1
- package/dist/chunks/PageHeader-0kG_iypP.js +0 -692
- package/dist/chunks/SwitchToggle-DShNdcao.js +0 -758
- package/dist/chunks/editor-Dk1rbV75.js +0 -361
- package/dist/chunks/list-CJm875m7.js +0 -1418
- /package/dist/{chunks/MarkdownImpl-CyeTVvSt.js → components/MarkdownImpl.js} +0 -0
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import cx from "classnames";
|
|
2
|
+
import { useMemo } from "react";
|
|
3
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
4
|
+
//#region src/form/Wizard/WizardStepIndicator.tsx
|
|
5
|
+
function WizardStepIndicator({ stepOrder, currentStep, steps, visitedSteps, invalidSteps, onStepClick, allowJump = false, hideStepNumbers = false }) {
|
|
6
|
+
const currentIndex = useMemo(() => stepOrder.indexOf(currentStep), [stepOrder, currentStep]);
|
|
7
|
+
const getStepStatus = (stepKey, index) => {
|
|
8
|
+
if (stepKey === currentStep) return "active";
|
|
9
|
+
if (index < currentIndex) return "completed";
|
|
10
|
+
return "upcoming";
|
|
11
|
+
};
|
|
12
|
+
const handleStepClick = (stepKey) => {
|
|
13
|
+
if (!allowJump || !visitedSteps.has(stepKey)) return;
|
|
14
|
+
onStepClick?.(stepKey);
|
|
15
|
+
};
|
|
16
|
+
const isClickable = (stepKey) => {
|
|
17
|
+
return allowJump && visitedSteps.has(stepKey) && stepKey !== currentStep;
|
|
18
|
+
};
|
|
19
|
+
return /* @__PURE__ */ jsx("div", {
|
|
20
|
+
className: "flex items-start justify-between w-full mb-2 gap-4 py-2",
|
|
21
|
+
children: stepOrder.map((stepKey, index) => {
|
|
22
|
+
const stepConfig = steps[stepKey];
|
|
23
|
+
const status = getStepStatus(stepKey, index);
|
|
24
|
+
const isInvalid = invalidSteps.has(stepKey);
|
|
25
|
+
const isClickable_ = isClickable(stepKey);
|
|
26
|
+
const isDotActive = status === "active";
|
|
27
|
+
const isDotCompleted = status === "completed";
|
|
28
|
+
const isDotUpcoming = status === "upcoming";
|
|
29
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
30
|
+
className: "flex flex-col items-center flex-1 relative",
|
|
31
|
+
children: [
|
|
32
|
+
/* @__PURE__ */ jsxs("button", {
|
|
33
|
+
type: "button",
|
|
34
|
+
onClick: () => handleStepClick(stepKey),
|
|
35
|
+
disabled: !isClickable_,
|
|
36
|
+
className: cx("w-12 h-12 rounded-full border-3 flex items-center justify-center font-bold text-base transition-all duration-300 flex-shrink-0 relative", {
|
|
37
|
+
"cursor-pointer": isClickable_,
|
|
38
|
+
"cursor-not-allowed": !isClickable_
|
|
39
|
+
}, {
|
|
40
|
+
"text-white": isDotActive,
|
|
41
|
+
"bg-green-500 border-green-600 text-white shadow-md": isDotCompleted && !isInvalid,
|
|
42
|
+
"bg-(--theme-border) theme-border theme-muted-text shadow-sm": isDotUpcoming && !isInvalid,
|
|
43
|
+
"bg-(--theme-muted-panel-bg) theme-border theme-muted-text shadow-sm": !isDotActive && !isDotCompleted && !isDotUpcoming && !isInvalid,
|
|
44
|
+
"bg-red-50 border-red-500 text-red-600 shadow-sm": isInvalid && status !== "active"
|
|
45
|
+
}),
|
|
46
|
+
style: isDotActive ? {
|
|
47
|
+
backgroundColor: "var(--theme-element)",
|
|
48
|
+
borderColor: "var(--theme-element)",
|
|
49
|
+
color: "var(--theme-element-text)",
|
|
50
|
+
boxShadow: "0 4px 12px rgba(0, 0, 0, 0.15)",
|
|
51
|
+
zIndex: 10
|
|
52
|
+
} : { zIndex: 10 },
|
|
53
|
+
"aria-label": `Step ${index + 1}: ${stepConfig?.title}`,
|
|
54
|
+
title: stepConfig?.title,
|
|
55
|
+
children: [!hideStepNumbers && /* @__PURE__ */ jsx("span", {
|
|
56
|
+
className: cx({ hidden: status === "completed" }),
|
|
57
|
+
children: index + 1
|
|
58
|
+
}), status === "completed" && /* @__PURE__ */ jsx("svg", {
|
|
59
|
+
"aria-hidden": "true",
|
|
60
|
+
className: "w-4 h-4",
|
|
61
|
+
fill: "none",
|
|
62
|
+
stroke: "currentColor",
|
|
63
|
+
viewBox: "0 0 24 24",
|
|
64
|
+
children: /* @__PURE__ */ jsx("path", {
|
|
65
|
+
strokeLinecap: "round",
|
|
66
|
+
strokeLinejoin: "round",
|
|
67
|
+
strokeWidth: 3,
|
|
68
|
+
d: "M5 13l4 4L19 7"
|
|
69
|
+
})
|
|
70
|
+
})]
|
|
71
|
+
}),
|
|
72
|
+
index < stepOrder.length - 1 && /* @__PURE__ */ jsx("div", {
|
|
73
|
+
className: cx("absolute h-1 transition-all duration-300", {
|
|
74
|
+
"bg-green-500": index < currentIndex,
|
|
75
|
+
"bg-(--theme-border)": index >= currentIndex,
|
|
76
|
+
"opacity-25": index >= currentIndex
|
|
77
|
+
}),
|
|
78
|
+
style: {
|
|
79
|
+
top: "24px",
|
|
80
|
+
left: "calc(50% + 24px)",
|
|
81
|
+
right: "-50%",
|
|
82
|
+
boxShadow: index < currentIndex ? "0 1px 2px rgba(34, 197, 94, 0.2)" : "none"
|
|
83
|
+
},
|
|
84
|
+
"aria-hidden": "true"
|
|
85
|
+
}),
|
|
86
|
+
/* @__PURE__ */ jsxs("div", {
|
|
87
|
+
className: "mt-2 text-center",
|
|
88
|
+
children: [/* @__PURE__ */ jsx("div", {
|
|
89
|
+
className: cx("text-sm text-center transition-colors duration-300 max-w-30", {
|
|
90
|
+
"font-bold text-green-600": isDotCompleted && !isInvalid,
|
|
91
|
+
"font-bold text-red-600": isInvalid && status !== "active",
|
|
92
|
+
"font-semibold theme-muted-text": !isDotActive && !isDotCompleted && !isInvalid,
|
|
93
|
+
"font-bold text-white": isDotActive
|
|
94
|
+
}),
|
|
95
|
+
style: isDotActive ? { color: "var(--theme-element)" } : {},
|
|
96
|
+
children: stepConfig?.title
|
|
97
|
+
}), stepConfig?.description && /* @__PURE__ */ jsx("div", {
|
|
98
|
+
className: "text-xs theme-muted-text mt-1 text-center max-w-30",
|
|
99
|
+
children: stepConfig.description
|
|
100
|
+
})]
|
|
101
|
+
})
|
|
102
|
+
]
|
|
103
|
+
}, stepKey);
|
|
104
|
+
})
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
//#endregion
|
|
108
|
+
export { WizardStepIndicator };
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { useCallback, useState } from "react";
|
|
2
|
+
//#region src/form/Wizard/useWizardState.ts
|
|
3
|
+
function useWizardState({ stepOrder, steps, validateStep, initialStep }) {
|
|
4
|
+
const firstStep = initialStep || stepOrder[0] || "";
|
|
5
|
+
const [currentStep, setCurrentStep] = useState(firstStep);
|
|
6
|
+
const [visitedSteps, setVisitedSteps] = useState(/* @__PURE__ */ new Set([firstStep]));
|
|
7
|
+
const [invalidSteps, setInvalidSteps] = useState(/* @__PURE__ */ new Set());
|
|
8
|
+
const currentStepIndex = stepOrder.indexOf(currentStep);
|
|
9
|
+
const isLastStep = currentStepIndex === stepOrder.length - 1;
|
|
10
|
+
const canGoBack = currentStepIndex > 0;
|
|
11
|
+
/**
|
|
12
|
+
* Mark step as visited
|
|
13
|
+
*/
|
|
14
|
+
const markStepVisited = useCallback((stepKey) => {
|
|
15
|
+
setVisitedSteps((prev) => /* @__PURE__ */ new Set([...prev, stepKey]));
|
|
16
|
+
}, []);
|
|
17
|
+
/**
|
|
18
|
+
* Mark step as invalid
|
|
19
|
+
*/
|
|
20
|
+
const markStepInvalid = useCallback((stepKey, invalid) => {
|
|
21
|
+
setInvalidSteps((prev) => {
|
|
22
|
+
const next = new Set(prev);
|
|
23
|
+
if (invalid) next.add(stepKey);
|
|
24
|
+
else next.delete(stepKey);
|
|
25
|
+
return next;
|
|
26
|
+
});
|
|
27
|
+
}, []);
|
|
28
|
+
const goToNext = useCallback(async () => {
|
|
29
|
+
if (isLastStep) return false;
|
|
30
|
+
if (steps[currentStep]?.validateOnNext !== false) {
|
|
31
|
+
if (!await validateStep(currentStep)) {
|
|
32
|
+
markStepInvalid(currentStep, true);
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
markStepInvalid(currentStep, false);
|
|
37
|
+
const nextStepKey = stepOrder[currentStepIndex + 1];
|
|
38
|
+
setCurrentStep(nextStepKey ?? "");
|
|
39
|
+
markStepVisited(nextStepKey ?? "");
|
|
40
|
+
return true;
|
|
41
|
+
}, [
|
|
42
|
+
currentStep,
|
|
43
|
+
currentStepIndex,
|
|
44
|
+
isLastStep,
|
|
45
|
+
steps,
|
|
46
|
+
stepOrder,
|
|
47
|
+
validateStep,
|
|
48
|
+
markStepInvalid,
|
|
49
|
+
markStepVisited
|
|
50
|
+
]);
|
|
51
|
+
const goToPrevious = useCallback(() => {
|
|
52
|
+
if (!canGoBack) return;
|
|
53
|
+
const prevStepKey = stepOrder[currentStepIndex - 1];
|
|
54
|
+
setCurrentStep(prevStepKey ?? "");
|
|
55
|
+
}, [
|
|
56
|
+
canGoBack,
|
|
57
|
+
currentStepIndex,
|
|
58
|
+
stepOrder
|
|
59
|
+
]);
|
|
60
|
+
const jumpToStep = useCallback((stepKey) => {
|
|
61
|
+
if (!stepOrder.includes(stepKey)) return false;
|
|
62
|
+
if (!visitedSteps.has(stepKey) && stepKey !== currentStep) return false;
|
|
63
|
+
setCurrentStep(stepKey);
|
|
64
|
+
return true;
|
|
65
|
+
}, [
|
|
66
|
+
stepOrder,
|
|
67
|
+
visitedSteps,
|
|
68
|
+
currentStep
|
|
69
|
+
]);
|
|
70
|
+
/**
|
|
71
|
+
* Reset wizard to initial state
|
|
72
|
+
*/
|
|
73
|
+
const reset = useCallback(() => {
|
|
74
|
+
setCurrentStep(firstStep);
|
|
75
|
+
setVisitedSteps(/* @__PURE__ */ new Set([firstStep]));
|
|
76
|
+
setInvalidSteps(/* @__PURE__ */ new Set());
|
|
77
|
+
}, [firstStep]);
|
|
78
|
+
/**
|
|
79
|
+
* Get current wizard state
|
|
80
|
+
*/
|
|
81
|
+
const getState = useCallback(() => {
|
|
82
|
+
return {
|
|
83
|
+
currentStep,
|
|
84
|
+
visitedSteps,
|
|
85
|
+
invalidSteps,
|
|
86
|
+
stepOrder,
|
|
87
|
+
totalSteps: stepOrder.length,
|
|
88
|
+
isLastStep,
|
|
89
|
+
canProceedToNext: !isLastStep,
|
|
90
|
+
canGoBack
|
|
91
|
+
};
|
|
92
|
+
}, [
|
|
93
|
+
currentStep,
|
|
94
|
+
visitedSteps,
|
|
95
|
+
invalidSteps,
|
|
96
|
+
stepOrder,
|
|
97
|
+
isLastStep,
|
|
98
|
+
canGoBack
|
|
99
|
+
]);
|
|
100
|
+
return {
|
|
101
|
+
currentStep,
|
|
102
|
+
visitedSteps,
|
|
103
|
+
invalidSteps,
|
|
104
|
+
isLastStep,
|
|
105
|
+
canGoBack,
|
|
106
|
+
currentStepIndex,
|
|
107
|
+
totalSteps: stepOrder.length,
|
|
108
|
+
goToNext,
|
|
109
|
+
goToPrevious,
|
|
110
|
+
jumpToStep,
|
|
111
|
+
reset,
|
|
112
|
+
markStepVisited,
|
|
113
|
+
markStepInvalid,
|
|
114
|
+
getState
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
//#endregion
|
|
118
|
+
export { useWizardState };
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
//#region src/form/Wizard/utils.ts
|
|
2
|
+
function isWizardMeta(value) {
|
|
3
|
+
return typeof value === "object" && value !== null && "wizard" in value;
|
|
4
|
+
}
|
|
5
|
+
function isStepField(field) {
|
|
6
|
+
return typeof field === "object" && field !== null && "type" in field && field.type === "step";
|
|
7
|
+
}
|
|
8
|
+
function parseWizardConfig(options) {
|
|
9
|
+
const meta = options["$meta"];
|
|
10
|
+
const wizardConfig = isWizardMeta(meta) ? meta.wizard : void 0;
|
|
11
|
+
if (!wizardConfig || wizardConfig.mode !== "wizard") return null;
|
|
12
|
+
const steps = {};
|
|
13
|
+
const stepOrder = [];
|
|
14
|
+
const otherFields = {};
|
|
15
|
+
Object.entries(options).forEach(([key, field]) => {
|
|
16
|
+
if (key === "$meta") return;
|
|
17
|
+
if (isStepField(field)) {
|
|
18
|
+
steps[key] = field;
|
|
19
|
+
stepOrder.push(key);
|
|
20
|
+
} else otherFields[key] = field;
|
|
21
|
+
});
|
|
22
|
+
if (stepOrder.length === 0) {
|
|
23
|
+
console.warn("Wizard mode enabled but no steps found");
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
return {
|
|
27
|
+
config: wizardConfig,
|
|
28
|
+
steps,
|
|
29
|
+
stepOrder,
|
|
30
|
+
otherFields
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
//#endregion
|
|
34
|
+
export { parseWizardConfig };
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { createContext, useContext } from "react";
|
|
2
|
+
//#region src/form/fieldContext.tsx
|
|
3
|
+
var FieldContext = createContext({ required: false });
|
|
4
|
+
var FieldProvider = FieldContext.Provider;
|
|
5
|
+
/** True when the surrounding FieldWrapper is showing the required asterisk. */
|
|
6
|
+
function useFieldRequired() {
|
|
7
|
+
return useContext(FieldContext).required;
|
|
8
|
+
}
|
|
9
|
+
/** Ties the single focusable control of a field to its FieldWrapper label. */
|
|
10
|
+
function useFieldControlProps() {
|
|
11
|
+
const { id, descriptionId } = useContext(FieldContext);
|
|
12
|
+
return {
|
|
13
|
+
id,
|
|
14
|
+
"aria-describedby": descriptionId
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
/** For controls and groups that can only be named through aria-labelledby. */
|
|
18
|
+
function useFieldLabelledByProps() {
|
|
19
|
+
const { labelId, descriptionId } = useContext(FieldContext);
|
|
20
|
+
return {
|
|
21
|
+
"aria-labelledby": labelId,
|
|
22
|
+
"aria-describedby": descriptionId
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
//#endregion
|
|
26
|
+
export { FieldProvider, useFieldControlProps, useFieldLabelledByProps, useFieldRequired };
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { useSlots } from "../components/Provider.js";
|
|
2
|
+
import NumberField from "./Fields/NumberField.js";
|
|
3
|
+
import BooleanField from "./Fields/BooleanField.js";
|
|
4
|
+
import CheckboxGroupField from "./Fields/CheckboxGroupField.js";
|
|
5
|
+
import ColorField from "./Fields/ColorField.js";
|
|
6
|
+
import DropdownField from "./Fields/DropdownField.js";
|
|
7
|
+
import DurationField_default from "./Fields/DurationField.js";
|
|
8
|
+
import LabelField from "./Fields/LabelField.js";
|
|
9
|
+
import MultiDropdownField from "./Fields/MultiDropdownField.js";
|
|
10
|
+
import ObjectField from "./Fields/ObjectField.js";
|
|
11
|
+
import RadioField from "./Fields/RadioField.js";
|
|
12
|
+
import RangeField from "./Fields/RangeField.js";
|
|
13
|
+
import StepField from "./Fields/StepField.js";
|
|
14
|
+
import StringField_default from "./Fields/StringField.js";
|
|
15
|
+
import TextAreaField from "./Fields/TextAreaField.js";
|
|
16
|
+
import { Suspense, createContext, useContext } from "react";
|
|
17
|
+
import { jsx } from "react/jsx-runtime";
|
|
18
|
+
//#region src/form/fieldRegistry.tsx
|
|
19
|
+
var CORE_FIELD_COMPONENTS = {
|
|
20
|
+
string: StringField_default,
|
|
21
|
+
password: StringField_default,
|
|
22
|
+
number: NumberField,
|
|
23
|
+
boolean: BooleanField,
|
|
24
|
+
dropdown: DropdownField,
|
|
25
|
+
textarea: TextAreaField,
|
|
26
|
+
range: RangeField,
|
|
27
|
+
duration: DurationField_default,
|
|
28
|
+
radio: RadioField,
|
|
29
|
+
label: LabelField,
|
|
30
|
+
color: ColorField,
|
|
31
|
+
"multi-dropdown": MultiDropdownField,
|
|
32
|
+
"checkbox-group": CheckboxGroupField,
|
|
33
|
+
object: ObjectField,
|
|
34
|
+
step: StepField
|
|
35
|
+
};
|
|
36
|
+
var FieldRegistryContext = createContext({});
|
|
37
|
+
/** Returns null for field types no registry knows. Per-form `fields` win over
|
|
38
|
+
* the provider's `slots.formFields`, which win over the core registry. */
|
|
39
|
+
function Registry(props) {
|
|
40
|
+
const injected = useContext(FieldRegistryContext);
|
|
41
|
+
const { formFields } = useSlots();
|
|
42
|
+
const Component = injected[props.field.type] ?? formFields?.[props.field.type] ?? CORE_FIELD_COMPONENTS[props.field.type];
|
|
43
|
+
if (!Component) return null;
|
|
44
|
+
return /* @__PURE__ */ jsx(Suspense, {
|
|
45
|
+
fallback: null,
|
|
46
|
+
children: /* @__PURE__ */ jsx(Component, { ...props })
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
//#endregion
|
|
50
|
+
export { FieldRegistryContext, Registry };
|