@flanksource/clicky-ui 0.3.41 → 0.3.42
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/ai.cjs +4 -0
- package/dist/ai.cjs.map +1 -1
- package/dist/ai.js +4 -0
- package/dist/ai.js.map +1 -1
- package/dist/comments/CommentCard.cjs +3 -1
- package/dist/comments/CommentCard.cjs.map +1 -1
- package/dist/comments/CommentCard.d.ts.map +1 -1
- package/dist/comments/CommentCard.js +4 -2
- package/dist/comments/CommentCard.js.map +1 -1
- package/dist/comments/CommentCardParts.cjs +16 -0
- package/dist/comments/CommentCardParts.cjs.map +1 -1
- package/dist/comments/CommentCardParts.d.ts +4 -1
- package/dist/comments/CommentCardParts.d.ts.map +1 -1
- package/dist/comments/CommentCardParts.js +16 -0
- package/dist/comments/CommentCardParts.js.map +1 -1
- package/dist/comments/comment-types.cjs.map +1 -1
- package/dist/comments/comment-types.d.ts +4 -0
- package/dist/comments/comment-types.d.ts.map +1 -1
- package/dist/comments/comment-types.js.map +1 -1
- package/dist/components/Combobox.cjs +54 -8
- package/dist/components/Combobox.cjs.map +1 -1
- package/dist/components/Combobox.d.ts.map +1 -1
- package/dist/components/Combobox.js +56 -10
- package/dist/components/Combobox.js.map +1 -1
- package/dist/components/ComboboxMenu.cjs +139 -113
- package/dist/components/ComboboxMenu.cjs.map +1 -1
- package/dist/components/ComboboxMenu.d.ts +3 -1
- package/dist/components/ComboboxMenu.d.ts.map +1 -1
- package/dist/components/ComboboxMenu.js +139 -113
- package/dist/components/ComboboxMenu.js.map +1 -1
- package/dist/components/ComboboxMenuTrigger.cjs +87 -0
- package/dist/components/ComboboxMenuTrigger.cjs.map +1 -0
- package/dist/components/ComboboxMenuTrigger.d.ts +23 -0
- package/dist/components/ComboboxMenuTrigger.d.ts.map +1 -0
- package/dist/components/ComboboxMenuTrigger.js +87 -0
- package/dist/components/ComboboxMenuTrigger.js.map +1 -0
- package/dist/components/JsonSchemaForm.cjs +30 -7
- package/dist/components/JsonSchemaForm.cjs.map +1 -1
- package/dist/components/JsonSchemaForm.d.ts.map +1 -1
- package/dist/components/JsonSchemaForm.js +30 -7
- package/dist/components/JsonSchemaForm.js.map +1 -1
- package/dist/components/SegmentedControl.cjs +20 -3
- package/dist/components/SegmentedControl.cjs.map +1 -1
- package/dist/components/SegmentedControl.d.ts +11 -0
- package/dist/components/SegmentedControl.d.ts.map +1 -1
- package/dist/components/SegmentedControl.js +21 -4
- package/dist/components/SegmentedControl.js.map +1 -1
- package/dist/components/combobox-types.d.ts +8 -0
- package/dist/components/combobox-types.d.ts.map +1 -1
- package/dist/components/json-schema-form-debug-badge.cjs +108 -0
- package/dist/components/json-schema-form-debug-badge.cjs.map +1 -0
- package/dist/components/json-schema-form-debug-badge.d.ts +10 -0
- package/dist/components/json-schema-form-debug-badge.d.ts.map +1 -0
- package/dist/components/json-schema-form-debug-badge.js +108 -0
- package/dist/components/json-schema-form-debug-badge.js.map +1 -0
- package/dist/components/json-schema-form-debug-glyph-map.cjs +129 -0
- package/dist/components/json-schema-form-debug-glyph-map.cjs.map +1 -0
- package/dist/components/json-schema-form-debug-glyph-map.d.ts +20 -0
- package/dist/components/json-schema-form-debug-glyph-map.d.ts.map +1 -0
- package/dist/components/json-schema-form-debug-glyph-map.js +129 -0
- package/dist/components/json-schema-form-debug-glyph-map.js.map +1 -0
- package/dist/components/json-schema-form-debug-glyph.cjs +13 -0
- package/dist/components/json-schema-form-debug-glyph.cjs.map +1 -0
- package/dist/components/json-schema-form-debug-glyph.d.ts +6 -0
- package/dist/components/json-schema-form-debug-glyph.d.ts.map +1 -0
- package/dist/components/json-schema-form-debug-glyph.js +13 -0
- package/dist/components/json-schema-form-debug-glyph.js.map +1 -0
- package/dist/components/json-schema-form-debug-groups.cjs +56 -0
- package/dist/components/json-schema-form-debug-groups.cjs.map +1 -0
- package/dist/components/json-schema-form-debug-groups.d.ts +8 -0
- package/dist/components/json-schema-form-debug-groups.d.ts.map +1 -0
- package/dist/components/json-schema-form-debug-groups.js +56 -0
- package/dist/components/json-schema-form-debug-groups.js.map +1 -0
- package/dist/components/json-schema-form-debug-keywords.cjs +159 -0
- package/dist/components/json-schema-form-debug-keywords.cjs.map +1 -0
- package/dist/components/json-schema-form-debug-keywords.d.ts +6 -0
- package/dist/components/json-schema-form-debug-keywords.d.ts.map +1 -0
- package/dist/components/json-schema-form-debug-keywords.js +159 -0
- package/dist/components/json-schema-form-debug-keywords.js.map +1 -0
- package/dist/components/json-schema-form-debug-listeners.cjs +102 -0
- package/dist/components/json-schema-form-debug-listeners.cjs.map +1 -0
- package/dist/components/json-schema-form-debug-listeners.d.ts +6 -0
- package/dist/components/json-schema-form-debug-listeners.d.ts.map +1 -0
- package/dist/components/json-schema-form-debug-listeners.js +102 -0
- package/dist/components/json-schema-form-debug-listeners.js.map +1 -0
- package/dist/components/json-schema-form-debug.cjs +31 -0
- package/dist/components/json-schema-form-debug.cjs.map +1 -0
- package/dist/components/json-schema-form-debug.d.ts +11 -0
- package/dist/components/json-schema-form-debug.d.ts.map +1 -0
- package/dist/components/json-schema-form-debug.js +31 -0
- package/dist/components/json-schema-form-debug.js.map +1 -0
- package/dist/components/json-schema-form-enum-choice.cjs +114 -0
- package/dist/components/json-schema-form-enum-choice.cjs.map +1 -0
- package/dist/components/json-schema-form-enum-choice.d.ts +14 -0
- package/dist/components/json-schema-form-enum-choice.d.ts.map +1 -0
- package/dist/components/json-schema-form-enum-choice.js +114 -0
- package/dist/components/json-schema-form-enum-choice.js.map +1 -0
- package/dist/components/json-schema-form-fields.cjs +3 -93
- package/dist/components/json-schema-form-fields.cjs.map +1 -1
- package/dist/components/json-schema-form-fields.d.ts.map +1 -1
- package/dist/components/json-schema-form-fields.js +1 -91
- package/dist/components/json-schema-form-fields.js.map +1 -1
- package/dist/components/json-schema-form-listeners.cjs +7 -1
- package/dist/components/json-schema-form-listeners.cjs.map +1 -1
- package/dist/components/json-schema-form-listeners.d.ts.map +1 -1
- package/dist/components/json-schema-form-listeners.js +7 -1
- package/dist/components/json-schema-form-listeners.js.map +1 -1
- package/dist/components/json-schema-form-preferences.cjs +1 -0
- package/dist/components/json-schema-form-preferences.cjs.map +1 -1
- package/dist/components/json-schema-form-preferences.d.ts +1 -0
- package/dist/components/json-schema-form-preferences.d.ts.map +1 -1
- package/dist/components/json-schema-form-preferences.js +1 -0
- package/dist/components/json-schema-form-preferences.js.map +1 -1
- package/dist/components/json-schema-form-render.cjs +21 -5
- package/dist/components/json-schema-form-render.cjs.map +1 -1
- package/dist/components/json-schema-form-render.d.ts.map +1 -1
- package/dist/components/json-schema-form-render.js +21 -5
- package/dist/components/json-schema-form-render.js.map +1 -1
- package/dist/components/json-schema-form-runtime-types.d.ts +1 -0
- package/dist/components/json-schema-form-runtime-types.d.ts.map +1 -1
- package/dist/components/json-schema-form-tone.cjs +12 -0
- package/dist/components/json-schema-form-tone.cjs.map +1 -1
- package/dist/components/json-schema-form-tone.js +12 -0
- package/dist/components/json-schema-form-tone.js.map +1 -1
- package/dist/components/json-schema-form-types.d.ts +1 -0
- package/dist/components/json-schema-form-types.d.ts.map +1 -1
- package/dist/data/GraphDiagram.cjs +125 -138
- package/dist/data/GraphDiagram.cjs.map +1 -1
- package/dist/data/GraphDiagram.d.ts +30 -23
- package/dist/data/GraphDiagram.d.ts.map +1 -1
- package/dist/data/GraphDiagram.js +128 -141
- package/dist/data/GraphDiagram.js.map +1 -1
- package/dist/data/GraphDiagramEdges.cjs +208 -0
- package/dist/data/GraphDiagramEdges.cjs.map +1 -0
- package/dist/data/GraphDiagramEdges.d.ts +40 -0
- package/dist/data/GraphDiagramEdges.d.ts.map +1 -0
- package/dist/data/GraphDiagramEdges.js +208 -0
- package/dist/data/GraphDiagramEdges.js.map +1 -0
- package/dist/data/GraphDiagramNodes.cjs +142 -0
- package/dist/data/GraphDiagramNodes.cjs.map +1 -0
- package/dist/data/GraphDiagramNodes.d.ts +22 -0
- package/dist/data/GraphDiagramNodes.d.ts.map +1 -0
- package/dist/data/GraphDiagramNodes.js +142 -0
- package/dist/data/GraphDiagramNodes.js.map +1 -0
- package/dist/data/ai/PromptRunEditor/RuntimeRows.cjs +8 -3
- package/dist/data/ai/PromptRunEditor/RuntimeRows.cjs.map +1 -1
- package/dist/data/ai/PromptRunEditor/RuntimeRows.d.ts.map +1 -1
- package/dist/data/ai/PromptRunEditor/RuntimeRows.js +8 -3
- package/dist/data/ai/PromptRunEditor/RuntimeRows.js.map +1 -1
- package/dist/data/ai/PromptRunEditor/index.cjs +37 -43
- package/dist/data/ai/PromptRunEditor/index.cjs.map +1 -1
- package/dist/data/ai/PromptRunEditor/index.d.ts +3 -1
- package/dist/data/ai/PromptRunEditor/index.d.ts.map +1 -1
- package/dist/data/ai/PromptRunEditor/index.js +38 -44
- package/dist/data/ai/PromptRunEditor/index.js.map +1 -1
- package/dist/data/ai/PromptRunEditor/runtimeActions.cjs +16 -5
- package/dist/data/ai/PromptRunEditor/runtimeActions.cjs.map +1 -1
- package/dist/data/ai/PromptRunEditor/runtimeActions.d.ts +4 -1
- package/dist/data/ai/PromptRunEditor/runtimeActions.d.ts.map +1 -1
- package/dist/data/ai/PromptRunEditor/runtimeActions.js +17 -6
- package/dist/data/ai/PromptRunEditor/runtimeActions.js.map +1 -1
- package/dist/data/ai/SessionInspector.approvals-model.cjs +12 -0
- package/dist/data/ai/SessionInspector.approvals-model.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.approvals-model.d.ts +11 -2
- package/dist/data/ai/SessionInspector.approvals-model.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.approvals-model.js +12 -0
- package/dist/data/ai/SessionInspector.approvals-model.js.map +1 -1
- package/dist/data/ai/SessionInspector.approvals.cjs +25 -1
- package/dist/data/ai/SessionInspector.approvals.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.approvals.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.approvals.js +26 -2
- package/dist/data/ai/SessionInspector.approvals.js.map +1 -1
- package/dist/data/ai/SessionInspector.summary.cjs +9 -3
- package/dist/data/ai/SessionInspector.summary.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.summary.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.summary.js +9 -3
- package/dist/data/ai/SessionInspector.summary.js.map +1 -1
- package/dist/data/ai/SessionInspector.transcript.cjs +4 -0
- package/dist/data/ai/SessionInspector.transcript.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.transcript.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.transcript.js +4 -0
- package/dist/data/ai/SessionInspector.transcript.js.map +1 -1
- package/dist/data/ai/SessionViewer.approval-body.cjs +146 -0
- package/dist/data/ai/SessionViewer.approval-body.cjs.map +1 -0
- package/dist/data/ai/SessionViewer.approval-body.d.ts +11 -0
- package/dist/data/ai/SessionViewer.approval-body.d.ts.map +1 -0
- package/dist/data/ai/SessionViewer.approval-body.js +146 -0
- package/dist/data/ai/SessionViewer.approval-body.js.map +1 -0
- package/dist/data/ai/SessionViewer.approval-forms.cjs +150 -0
- package/dist/data/ai/SessionViewer.approval-forms.cjs.map +1 -0
- package/dist/data/ai/SessionViewer.approval-forms.d.ts +23 -0
- package/dist/data/ai/SessionViewer.approval-forms.d.ts.map +1 -0
- package/dist/data/ai/SessionViewer.approval-forms.js +150 -0
- package/dist/data/ai/SessionViewer.approval-forms.js.map +1 -0
- package/dist/data/ai/SessionViewer.cjs +57 -20
- package/dist/data/ai/SessionViewer.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.d.ts +13 -3
- package/dist/data/ai/SessionViewer.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.decision-controls.cjs +313 -0
- package/dist/data/ai/SessionViewer.decision-controls.cjs.map +1 -0
- package/dist/data/ai/SessionViewer.decision-controls.d.ts +43 -0
- package/dist/data/ai/SessionViewer.decision-controls.d.ts.map +1 -0
- package/dist/data/ai/SessionViewer.decision-controls.js +313 -0
- package/dist/data/ai/SessionViewer.decision-controls.js.map +1 -0
- package/dist/data/ai/SessionViewer.decision.cjs +21 -0
- package/dist/data/ai/SessionViewer.decision.cjs.map +1 -0
- package/dist/data/ai/SessionViewer.decision.d.ts +12 -0
- package/dist/data/ai/SessionViewer.decision.d.ts.map +1 -0
- package/dist/data/ai/SessionViewer.decision.js +21 -0
- package/dist/data/ai/SessionViewer.decision.js.map +1 -0
- package/dist/data/ai/SessionViewer.input.cjs +14 -0
- package/dist/data/ai/SessionViewer.input.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.input.d.ts +5 -0
- package/dist/data/ai/SessionViewer.input.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.input.js +14 -0
- package/dist/data/ai/SessionViewer.input.js.map +1 -1
- package/dist/data/ai/SessionViewer.js +58 -21
- package/dist/data/ai/SessionViewer.js.map +1 -1
- package/dist/data/ai/SessionViewer.model.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.model.d.ts +4 -0
- package/dist/data/ai/SessionViewer.model.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.model.js.map +1 -1
- package/dist/data/ai/SessionViewer.rows.cjs +6 -3
- package/dist/data/ai/SessionViewer.rows.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.rows.d.ts +2 -1
- package/dist/data/ai/SessionViewer.rows.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.rows.js +6 -3
- package/dist/data/ai/SessionViewer.rows.js.map +1 -1
- package/dist/data/ai/SessionViewer.tool-row.cjs +29 -237
- package/dist/data/ai/SessionViewer.tool-row.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.tool-row.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.tool-row.js +27 -235
- package/dist/data/ai/SessionViewer.tool-row.js.map +1 -1
- package/dist/data/ai/SessionViewer.unified.d.ts +4 -0
- package/dist/data/ai/SessionViewer.unified.d.ts.map +1 -1
- package/dist/data/ai/SessionViewerMenu.cjs +8 -2
- package/dist/data/ai/SessionViewerMenu.cjs.map +1 -1
- package/dist/data/ai/SessionViewerMenu.d.ts +4 -1
- package/dist/data/ai/SessionViewerMenu.d.ts.map +1 -1
- package/dist/data/ai/SessionViewerMenu.js +8 -2
- package/dist/data/ai/SessionViewerMenu.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/CommitSection.cjs +28 -17
- package/dist/data/ai/SpecRuntimeEditor/CommitSection.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/CommitSection.d.ts +10 -2
- package/dist/data/ai/SpecRuntimeEditor/CommitSection.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/CommitSection.js +29 -18
- package/dist/data/ai/SpecRuntimeEditor/CommitSection.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/index.cjs +9 -1
- package/dist/data/ai/SpecRuntimeEditor/index.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/index.d.ts +9 -2
- package/dist/data/ai/SpecRuntimeEditor/index.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/index.js +9 -1
- package/dist/data/ai/SpecRuntimeEditor/index.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/permission-mode-visuals.cjs +1 -1
- package/dist/data/ai/SpecRuntimeEditor/permission-mode-visuals.js +1 -1
- package/dist/data/ai/SpecRuntimeEditor/summaries.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/summaries.d.ts +8 -2
- package/dist/data/ai/SpecRuntimeEditor/summaries.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/summaries.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/update.cjs +14 -6
- package/dist/data/ai/SpecRuntimeEditor/update.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/update.d.ts +1 -0
- package/dist/data/ai/SpecRuntimeEditor/update.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/update.js +14 -6
- package/dist/data/ai/SpecRuntimeEditor/update.js.map +1 -1
- package/dist/data/ai/approval-request.cjs +75 -0
- package/dist/data/ai/approval-request.cjs.map +1 -0
- package/dist/data/ai/approval-request.d.ts +155 -0
- package/dist/data/ai/approval-request.d.ts.map +1 -0
- package/dist/data/ai/approval-request.js +75 -0
- package/dist/data/ai/approval-request.js.map +1 -0
- package/dist/data/ai/index.d.ts +3 -0
- package/dist/data/ai/index.d.ts.map +1 -1
- package/dist/data/ai/runtime-preset-menu/SavePresetDialog.cjs +125 -0
- package/dist/data/ai/runtime-preset-menu/SavePresetDialog.cjs.map +1 -0
- package/dist/data/ai/runtime-preset-menu/SavePresetDialog.d.ts +11 -0
- package/dist/data/ai/runtime-preset-menu/SavePresetDialog.d.ts.map +1 -0
- package/dist/data/ai/runtime-preset-menu/SavePresetDialog.js +125 -0
- package/dist/data/ai/runtime-preset-menu/SavePresetDialog.js.map +1 -0
- package/dist/data/ai/runtime-preset-menu/index.d.ts +3 -0
- package/dist/data/ai/runtime-preset-menu/index.d.ts.map +1 -0
- package/dist/data/ai/runtime-preset-menu/model.cjs +73 -0
- package/dist/data/ai/runtime-preset-menu/model.cjs.map +1 -0
- package/dist/data/ai/runtime-preset-menu/model.d.ts +13 -0
- package/dist/data/ai/runtime-preset-menu/model.d.ts.map +1 -0
- package/dist/data/ai/runtime-preset-menu/model.js +73 -0
- package/dist/data/ai/runtime-preset-menu/model.js.map +1 -0
- package/dist/data/ai/runtime-preset-menu/use-runtime-preset-menu.cjs +149 -0
- package/dist/data/ai/runtime-preset-menu/use-runtime-preset-menu.cjs.map +1 -0
- package/dist/data/ai/runtime-preset-menu/use-runtime-preset-menu.d.ts +15 -0
- package/dist/data/ai/runtime-preset-menu/use-runtime-preset-menu.d.ts.map +1 -0
- package/dist/data/ai/runtime-preset-menu/use-runtime-preset-menu.js +149 -0
- package/dist/data/ai/runtime-preset-menu/use-runtime-preset-menu.js.map +1 -0
- package/dist/data/ai/runtime-spec-fields.cjs +166 -0
- package/dist/data/ai/runtime-spec-fields.cjs.map +1 -0
- package/dist/data/ai/runtime-spec-fields.d.ts +13 -0
- package/dist/data/ai/runtime-spec-fields.d.ts.map +1 -0
- package/dist/data/ai/runtime-spec-fields.js +166 -0
- package/dist/data/ai/runtime-spec-fields.js.map +1 -0
- package/dist/data/ai/session-categories.cjs +4 -0
- package/dist/data/ai/session-categories.cjs.map +1 -1
- package/dist/data/ai/session-categories.d.ts +1 -0
- package/dist/data/ai/session-categories.d.ts.map +1 -1
- package/dist/data/ai/session-categories.js +4 -0
- package/dist/data/ai/session-categories.js.map +1 -1
- package/dist/data/ai/use-session-scroll.cjs +49 -21
- package/dist/data/ai/use-session-scroll.cjs.map +1 -1
- package/dist/data/ai/use-session-scroll.d.ts +2 -0
- package/dist/data/ai/use-session-scroll.d.ts.map +1 -1
- package/dist/data/ai/use-session-scroll.js +49 -21
- package/dist/data/ai/use-session-scroll.js.map +1 -1
- package/dist/data/chat/Chat.runtime.cjs +1 -1
- package/dist/data/chat/Chat.runtime.cjs.map +1 -1
- package/dist/data/chat/Chat.runtime.d.ts.map +1 -1
- package/dist/data/chat/Chat.runtime.js +1 -1
- package/dist/data/chat/Chat.runtime.js.map +1 -1
- package/dist/data/graph-columns-layout.cjs +216 -0
- package/dist/data/graph-columns-layout.cjs.map +1 -0
- package/dist/data/graph-columns-layout.d.ts +56 -0
- package/dist/data/graph-columns-layout.d.ts.map +1 -0
- package/dist/data/graph-columns-layout.js +216 -0
- package/dist/data/graph-columns-layout.js.map +1 -0
- package/dist/data/graph-diagram-model.cjs +73 -0
- package/dist/data/graph-diagram-model.cjs.map +1 -0
- package/dist/data/graph-diagram-model.d.ts +90 -0
- package/dist/data/graph-diagram-model.d.ts.map +1 -0
- package/dist/data/graph-diagram-model.js +73 -0
- package/dist/data/graph-diagram-model.js.map +1 -0
- package/dist/data/graph-edge-routing.cjs +235 -0
- package/dist/data/graph-edge-routing.cjs.map +1 -0
- package/dist/data/graph-edge-routing.d.ts +73 -0
- package/dist/data/graph-edge-routing.d.ts.map +1 -0
- package/dist/data/graph-edge-routing.js +235 -0
- package/dist/data/graph-edge-routing.js.map +1 -0
- package/dist/data/graph-layout.cjs +0 -82
- package/dist/data/graph-layout.cjs.map +1 -1
- package/dist/data/graph-layout.d.ts +1 -28
- package/dist/data/graph-layout.d.ts.map +1 -1
- package/dist/data/graph-layout.js +1 -83
- package/dist/data/graph-layout.js.map +1 -1
- package/dist/data/har/HarPanel.cjs +129 -33
- package/dist/data/har/HarPanel.cjs.map +1 -1
- package/dist/data/har/HarPanel.d.ts +13 -1
- package/dist/data/har/HarPanel.d.ts.map +1 -1
- package/dist/data/har/HarPanel.js +130 -34
- package/dist/data/har/HarPanel.js.map +1 -1
- package/dist/data/har/fixtures.d.ts +12 -0
- package/dist/data/har/fixtures.d.ts.map +1 -1
- package/dist/data/har/types.d.ts +12 -0
- package/dist/data/har/types.d.ts.map +1 -1
- package/dist/data/runtime/RuntimeBar.cjs +67 -84
- package/dist/data/runtime/RuntimeBar.cjs.map +1 -1
- package/dist/data/runtime/RuntimeBar.d.ts +4 -5
- package/dist/data/runtime/RuntimeBar.d.ts.map +1 -1
- package/dist/data/runtime/RuntimeBar.fields.cjs +170 -0
- package/dist/data/runtime/RuntimeBar.fields.cjs.map +1 -0
- package/dist/data/runtime/RuntimeBar.fields.d.ts +16 -0
- package/dist/data/runtime/RuntimeBar.fields.d.ts.map +1 -0
- package/dist/data/runtime/RuntimeBar.fields.js +170 -0
- package/dist/data/runtime/RuntimeBar.fields.js.map +1 -0
- package/dist/data/runtime/RuntimeBar.js +70 -87
- package/dist/data/runtime/RuntimeBar.js.map +1 -1
- package/dist/data/runtime/RuntimeBar.selection.cjs +56 -0
- package/dist/data/runtime/RuntimeBar.selection.cjs.map +1 -0
- package/dist/data/runtime/RuntimeBar.selection.d.ts +20 -0
- package/dist/data/runtime/RuntimeBar.selection.d.ts.map +1 -0
- package/dist/data/runtime/RuntimeBar.selection.js +56 -0
- package/dist/data/runtime/RuntimeBar.selection.js.map +1 -0
- package/dist/data/runtime/RuntimeBarActions.cjs +10 -6
- package/dist/data/runtime/RuntimeBarActions.cjs.map +1 -1
- package/dist/data/runtime/RuntimeBarActions.d.ts +8 -1
- package/dist/data/runtime/RuntimeBarActions.d.ts.map +1 -1
- package/dist/data/runtime/RuntimeBarActions.js +10 -6
- package/dist/data/runtime/RuntimeBarActions.js.map +1 -1
- package/dist/data/runtime/RuntimeBarIdentity.cjs +166 -0
- package/dist/data/runtime/RuntimeBarIdentity.cjs.map +1 -0
- package/dist/data/runtime/RuntimeBarIdentity.d.ts +25 -0
- package/dist/data/runtime/RuntimeBarIdentity.d.ts.map +1 -0
- package/dist/data/runtime/RuntimeBarIdentity.js +166 -0
- package/dist/data/runtime/RuntimeBarIdentity.js.map +1 -0
- package/dist/data/runtime/RuntimeBarLayout.cjs +95 -0
- package/dist/data/runtime/RuntimeBarLayout.cjs.map +1 -0
- package/dist/data/runtime/RuntimeBarLayout.d.ts +9 -0
- package/dist/data/runtime/RuntimeBarLayout.d.ts.map +1 -0
- package/dist/data/runtime/RuntimeBarLayout.js +95 -0
- package/dist/data/runtime/RuntimeBarLayout.js.map +1 -0
- package/dist/data/runtime/RuntimeBarSegment.cjs +25 -14
- package/dist/data/runtime/RuntimeBarSegment.cjs.map +1 -1
- package/dist/data/runtime/RuntimeBarSegment.d.ts +4 -0
- package/dist/data/runtime/RuntimeBarSegment.d.ts.map +1 -1
- package/dist/data/runtime/RuntimeBarSegment.js +25 -14
- package/dist/data/runtime/RuntimeBarSegment.js.map +1 -1
- package/dist/data/runtime/RuntimeLimitInput.cjs +41 -0
- package/dist/data/runtime/RuntimeLimitInput.cjs.map +1 -0
- package/dist/data/runtime/RuntimeLimitInput.d.ts +9 -0
- package/dist/data/runtime/RuntimeLimitInput.d.ts.map +1 -0
- package/dist/data/runtime/RuntimeLimitInput.js +41 -0
- package/dist/data/runtime/RuntimeLimitInput.js.map +1 -0
- package/dist/data/runtime/use-runtime-bar-overflow.cjs +70 -0
- package/dist/data/runtime/use-runtime-bar-overflow.cjs.map +1 -0
- package/dist/data/runtime/use-runtime-bar-overflow.d.ts +13 -0
- package/dist/data/runtime/use-runtime-bar-overflow.d.ts.map +1 -0
- package/dist/data/runtime/use-runtime-bar-overflow.js +70 -0
- package/dist/data/runtime/use-runtime-bar-overflow.js.map +1 -0
- package/dist/data/use-edge-focus.cjs +20 -0
- package/dist/data/use-edge-focus.cjs.map +1 -0
- package/dist/data/use-edge-focus.d.ts +23 -0
- package/dist/data/use-edge-focus.d.ts.map +1 -0
- package/dist/data/use-edge-focus.js +20 -0
- package/dist/data/use-edge-focus.js.map +1 -0
- package/dist/data/use-pan-zoom.cjs +159 -0
- package/dist/data/use-pan-zoom.cjs.map +1 -0
- package/dist/data/use-pan-zoom.d.ts +79 -0
- package/dist/data/use-pan-zoom.d.ts.map +1 -0
- package/dist/data/use-pan-zoom.js +159 -0
- package/dist/data/use-pan-zoom.js.map +1 -0
- package/dist/data/version-info.cjs +3 -3
- package/dist/data/version-info.js +3 -3
- package/dist/data.cjs +5 -1
- package/dist/data.cjs.map +1 -1
- package/dist/data.d.ts +4 -3
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +6 -2
- package/dist/data.js.map +1 -1
- package/dist/index.cjs +5 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +6 -2
- package/dist/index.js.map +1 -1
- package/dist/overlay/DropdownMenu.cjs +1 -0
- package/dist/overlay/DropdownMenu.cjs.map +1 -1
- package/dist/overlay/DropdownMenu.d.ts +4 -0
- package/dist/overlay/DropdownMenu.d.ts.map +1 -1
- package/dist/overlay/DropdownMenu.js +1 -0
- package/dist/overlay/DropdownMenu.js.map +1 -1
- package/dist/overlay/DropdownMenuSubmenu.cjs +31 -15
- package/dist/overlay/DropdownMenuSubmenu.cjs.map +1 -1
- package/dist/overlay/DropdownMenuSubmenu.d.ts.map +1 -1
- package/dist/overlay/DropdownMenuSubmenu.js +31 -15
- package/dist/overlay/DropdownMenuSubmenu.js.map +1 -1
- package/dist/rpc/OperationCatalog.cjs +3 -1
- package/dist/rpc/OperationCatalog.cjs.map +1 -1
- package/dist/rpc/OperationCatalog.d.ts +3 -1
- package/dist/rpc/OperationCatalog.d.ts.map +1 -1
- package/dist/rpc/OperationCatalog.js +3 -1
- package/dist/rpc/OperationCatalog.js.map +1 -1
- package/dist/rpc/useOperationPages.cjs +6 -1
- package/dist/rpc/useOperationPages.cjs.map +1 -1
- package/dist/rpc/useOperationPages.d.ts +3 -1
- package/dist/rpc/useOperationPages.d.ts.map +1 -1
- package/dist/rpc/useOperationPages.js +6 -1
- package/dist/rpc/useOperationPages.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +1 -1
- package/schemas/json-schema-form.schema.json +5 -0
- package/dist/data/runtime/RuntimeBarCombo.cjs +0 -423
- package/dist/data/runtime/RuntimeBarCombo.cjs.map +0 -1
- package/dist/data/runtime/RuntimeBarCombo.d.ts +0 -33
- package/dist/data/runtime/RuntimeBarCombo.d.ts.map +0 -1
- package/dist/data/runtime/RuntimeBarCombo.js +0 -423
- package/dist/data/runtime/RuntimeBarCombo.js.map +0 -1
- package/dist/data/runtime/RuntimeBarLimits.cjs +0 -262
- package/dist/data/runtime/RuntimeBarLimits.cjs.map +0 -1
- package/dist/data/runtime/RuntimeBarLimits.d.ts +0 -17
- package/dist/data/runtime/RuntimeBarLimits.d.ts.map +0 -1
- package/dist/data/runtime/RuntimeBarLimits.js +0 -262
- package/dist/data/runtime/RuntimeBarLimits.js.map +0 -1
- package/dist/data/runtime/RuntimeBarSegments.cjs +0 -346
- package/dist/data/runtime/RuntimeBarSegments.cjs.map +0 -1
- package/dist/data/runtime/RuntimeBarSegments.d.ts +0 -37
- package/dist/data/runtime/RuntimeBarSegments.d.ts.map +0 -1
- package/dist/data/runtime/RuntimeBarSegments.js +0 -346
- package/dist/data/runtime/RuntimeBarSegments.js.map +0 -1
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const jsxRuntime = require("react/jsx-runtime");
|
|
4
|
+
const utils = require("../lib/utils.cjs");
|
|
5
|
+
const SegmentedControl = require("./SegmentedControl.cjs");
|
|
6
|
+
const jsonSchemaFormSize = require("./json-schema-form-size.cjs");
|
|
7
|
+
const DEFAULT_MARKER = "default";
|
|
8
|
+
function schemaDefaultChoice(schema, options) {
|
|
9
|
+
const fallback = schema.default;
|
|
10
|
+
if (typeof fallback !== "string" && typeof fallback !== "number" && typeof fallback !== "boolean") {
|
|
11
|
+
return void 0;
|
|
12
|
+
}
|
|
13
|
+
const choice = String(fallback);
|
|
14
|
+
return options.some((opt) => opt.value === choice) ? choice : void 0;
|
|
15
|
+
}
|
|
16
|
+
function optionTitle(opt, isDefault) {
|
|
17
|
+
const parts = [opt.description, isDefault ? `(${DEFAULT_MARKER})` : void 0].filter(Boolean);
|
|
18
|
+
return parts.length > 0 ? parts.join(" ") : void 0;
|
|
19
|
+
}
|
|
20
|
+
const SEGMENTED_SIZE = {
|
|
21
|
+
xs: "sm",
|
|
22
|
+
sm: "sm",
|
|
23
|
+
md: "md",
|
|
24
|
+
lg: "lg",
|
|
25
|
+
xl: "lg"
|
|
26
|
+
};
|
|
27
|
+
function SegmentedEnumControl({ field, fieldId, readOnly, options, value, size }) {
|
|
28
|
+
const hasDescription = options.some((opt) => opt.description);
|
|
29
|
+
const segSize = hasDescription ? "lg" : SEGMENTED_SIZE[size];
|
|
30
|
+
const defaultChoice = schemaDefaultChoice(field.schema, options);
|
|
31
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { id: fieldId, "data-jsf-input": true, className: utils.cn(field.inputClassName), children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
32
|
+
SegmentedControl.SegmentedControl,
|
|
33
|
+
{
|
|
34
|
+
"aria-label": field.label,
|
|
35
|
+
value,
|
|
36
|
+
onChange: (next) => field.onChange(next),
|
|
37
|
+
size: segSize,
|
|
38
|
+
wrap: true,
|
|
39
|
+
options: options.map((opt) => {
|
|
40
|
+
const isDefault = opt.value === defaultChoice;
|
|
41
|
+
const title = optionTitle(opt, isDefault);
|
|
42
|
+
return {
|
|
43
|
+
id: opt.value,
|
|
44
|
+
label: opt.label,
|
|
45
|
+
// x-enum-icons resolves to a runtime name string; SegmentedControl
|
|
46
|
+
// renders that via <Icon name>. Non-string (pre-extension) icons are
|
|
47
|
+
// dropped here since the segmented option type only takes name/component.
|
|
48
|
+
...typeof opt.icon === "string" ? { icon: opt.icon } : {},
|
|
49
|
+
...opt.description ? { description: opt.description } : {},
|
|
50
|
+
...title ? { title } : {},
|
|
51
|
+
...isDefault ? { marker: DEFAULT_MARKER, implied: true } : {},
|
|
52
|
+
...readOnly ? { disabled: true } : {}
|
|
53
|
+
};
|
|
54
|
+
})
|
|
55
|
+
}
|
|
56
|
+
) });
|
|
57
|
+
}
|
|
58
|
+
function RadioGroupControl({ field, fieldId, readOnly, options, value, size }) {
|
|
59
|
+
const defaultChoice = schemaDefaultChoice(field.schema, options);
|
|
60
|
+
const impliedChoice = value === "" ? defaultChoice : void 0;
|
|
61
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
62
|
+
"div",
|
|
63
|
+
{
|
|
64
|
+
role: "radiogroup",
|
|
65
|
+
"aria-label": field.label,
|
|
66
|
+
id: fieldId,
|
|
67
|
+
"data-jsf-input": true,
|
|
68
|
+
className: utils.cn(
|
|
69
|
+
"inline-flex flex-wrap items-center gap-1 rounded-md border border-input bg-background p-0.5",
|
|
70
|
+
field.inputClassName
|
|
71
|
+
),
|
|
72
|
+
children: options.map((opt) => {
|
|
73
|
+
const checked = opt.value === value;
|
|
74
|
+
const implied = opt.value === impliedChoice;
|
|
75
|
+
const isDefault = opt.value === defaultChoice;
|
|
76
|
+
const markerId = isDefault ? `${fieldId}-default` : void 0;
|
|
77
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
78
|
+
"label",
|
|
79
|
+
{
|
|
80
|
+
title: optionTitle(opt, isDefault),
|
|
81
|
+
"data-implied": implied ? "true" : void 0,
|
|
82
|
+
className: utils.cn(
|
|
83
|
+
"inline-flex cursor-pointer select-none items-center rounded px-2.5 py-1",
|
|
84
|
+
jsonSchemaFormSize.labelSizeClass[size],
|
|
85
|
+
checked ? "bg-primary text-primary-foreground" : implied ? "text-foreground outline-dashed outline-1 -outline-offset-1 outline-primary/60 hover:bg-accent" : "text-muted-foreground hover:bg-accent hover:text-foreground",
|
|
86
|
+
readOnly && "cursor-not-allowed opacity-60"
|
|
87
|
+
),
|
|
88
|
+
children: [
|
|
89
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
90
|
+
"input",
|
|
91
|
+
{
|
|
92
|
+
type: "radio",
|
|
93
|
+
name: fieldId,
|
|
94
|
+
className: "sr-only",
|
|
95
|
+
value: opt.value,
|
|
96
|
+
checked,
|
|
97
|
+
disabled: readOnly,
|
|
98
|
+
"aria-describedby": markerId,
|
|
99
|
+
onChange: () => field.onChange(opt.value)
|
|
100
|
+
}
|
|
101
|
+
),
|
|
102
|
+
opt.label,
|
|
103
|
+
isDefault && /* @__PURE__ */ jsxRuntime.jsx("span", { id: markerId, "aria-hidden": "true", className: "ml-1.5 text-[11px] font-normal opacity-70", children: DEFAULT_MARKER })
|
|
104
|
+
]
|
|
105
|
+
},
|
|
106
|
+
opt.value
|
|
107
|
+
);
|
|
108
|
+
})
|
|
109
|
+
}
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
exports.RadioGroupControl = RadioGroupControl;
|
|
113
|
+
exports.SegmentedEnumControl = SegmentedEnumControl;
|
|
114
|
+
//# sourceMappingURL=json-schema-form-enum-choice.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-schema-form-enum-choice.cjs","sources":["../../src/components/json-schema-form-enum-choice.tsx"],"sourcesContent":["import { cn } from \"../lib/utils\";\nimport { SegmentedControl, type SegmentedSize } from \"./SegmentedControl\";\nimport type { FieldControl, FieldOption, JsonSchemaProperty } from \"./json-schema-form-types\";\nimport { labelSizeClass, type FormSize } from \"./json-schema-form-size\";\n\nconst DEFAULT_MARKER = \"default\";\n\n// schemaDefaultChoice returns the option value named by the schema's scalar\n// `default`, or undefined when there is none or it matches no option.\nfunction schemaDefaultChoice(schema: JsonSchemaProperty, options: FieldOption[]): string | undefined {\n const fallback = schema.default;\n if (typeof fallback !== \"string\" && typeof fallback !== \"number\" && typeof fallback !== \"boolean\") {\n return undefined;\n }\n const choice = String(fallback);\n return options.some((opt) => opt.value === choice) ? choice : undefined;\n}\n\n// optionTitle is the native tooltip for one choice: its x-enum-descriptions\n// entry, suffixed with \"(default)\" when it is the schema default.\nfunction optionTitle(opt: FieldOption, isDefault: boolean): string | undefined {\n const parts = [opt.description, isDefault ? `(${DEFAULT_MARKER})` : undefined].filter(Boolean);\n return parts.length > 0 ? parts.join(\" \") : undefined;\n}\n\ntype EnumChoiceProps = {\n field: FieldControl;\n fieldId: string;\n readOnly: boolean;\n options: FieldOption[];\n value: string;\n size: FormSize;\n};\n\n// The FormSize scale is wider than SegmentedControl's; map the extremes down.\nconst SEGMENTED_SIZE: Record<FormSize, SegmentedSize> = {\n xs: \"sm\",\n sm: \"sm\",\n md: \"md\",\n lg: \"lg\",\n xl: \"lg\",\n};\n\n// SegmentedEnumControl renders an enum (x-enum-display: \"segmented\") with the\n// shared SegmentedControl. Icons come from x-enum-icons, descriptions from\n// x-enum-descriptions (which promote it to the large card layout, and double as\n// the segment tooltip). The schema default carries a \"default\" marker and, while\n// the value is unset, the implied style. The wrapper carries the field id +\n// data-jsf-input so the JSF field contract holds.\nexport function SegmentedEnumControl({ field, fieldId, readOnly, options, value, size }: EnumChoiceProps) {\n const hasDescription = options.some((opt) => opt.description);\n const segSize: SegmentedSize = hasDescription ? \"lg\" : SEGMENTED_SIZE[size];\n const defaultChoice = schemaDefaultChoice(field.schema, options);\n return (\n <div id={fieldId} data-jsf-input className={cn(field.inputClassName)}>\n <SegmentedControl\n aria-label={field.label}\n value={value}\n onChange={(next) => field.onChange(next)}\n size={segSize}\n wrap\n options={options.map((opt) => {\n const isDefault = opt.value === defaultChoice;\n const title = optionTitle(opt, isDefault);\n return {\n id: opt.value,\n label: opt.label,\n // x-enum-icons resolves to a runtime name string; SegmentedControl\n // renders that via <Icon name>. Non-string (pre-extension) icons are\n // dropped here since the segmented option type only takes name/component.\n ...(typeof opt.icon === \"string\" ? { icon: opt.icon } : {}),\n ...(opt.description ? { description: opt.description } : {}),\n ...(title ? { title } : {}),\n ...(isDefault ? { marker: DEFAULT_MARKER, implied: true } : {}),\n ...(readOnly ? { disabled: true } : {}),\n };\n })}\n />\n </div>\n );\n}\n\n// RadioGroupControl renders a small fixed enum as a segmented radio-button group\n// instead of a dropdown. It shares EnumControl's option list (any out-of-enum\n// value is already prepended, so a token still shows). One `radiogroup` role +\n// native radios keep it keyboard-navigable; the visible chip is a styled label\n// whose title is the option's description. The schema default carries a muted\n// \"default\" marker (the radio's accessible description) and, while the value is\n// unset, a dashed primary outline — distinct from the filled selection, and\n// never `checked`, because nothing is selected.\nexport function RadioGroupControl({ field, fieldId, readOnly, options, value, size }: EnumChoiceProps) {\n const defaultChoice = schemaDefaultChoice(field.schema, options);\n const impliedChoice = value === \"\" ? defaultChoice : undefined;\n return (\n <div\n role=\"radiogroup\"\n aria-label={field.label}\n id={fieldId}\n data-jsf-input\n className={cn(\n \"inline-flex flex-wrap items-center gap-1 rounded-md border border-input bg-background p-0.5\",\n field.inputClassName,\n )}\n >\n {options.map((opt) => {\n const checked = opt.value === value;\n const implied = opt.value === impliedChoice;\n const isDefault = opt.value === defaultChoice;\n const markerId = isDefault ? `${fieldId}-default` : undefined;\n return (\n <label\n key={opt.value}\n title={optionTitle(opt, isDefault)}\n data-implied={implied ? \"true\" : undefined}\n className={cn(\n \"inline-flex cursor-pointer select-none items-center rounded px-2.5 py-1\",\n labelSizeClass[size],\n checked\n ? \"bg-primary text-primary-foreground\"\n : implied\n ? \"text-foreground outline-dashed outline-1 -outline-offset-1 outline-primary/60 hover:bg-accent\"\n : \"text-muted-foreground hover:bg-accent hover:text-foreground\",\n readOnly && \"cursor-not-allowed opacity-60\",\n )}\n >\n <input\n type=\"radio\"\n name={fieldId}\n className=\"sr-only\"\n value={opt.value}\n checked={checked}\n disabled={readOnly}\n aria-describedby={markerId}\n onChange={() => field.onChange(opt.value)}\n />\n {opt.label}\n {isDefault && (\n <span id={markerId} aria-hidden=\"true\" className=\"ml-1.5 text-[11px] font-normal opacity-70\">\n {DEFAULT_MARKER}\n </span>\n )}\n </label>\n );\n })}\n </div>\n );\n}\n"],"names":["jsx","cn","SegmentedControl","jsxs","labelSizeClass"],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { FieldControl, FieldOption } from './json-schema-form-types.js';
|
|
2
|
+
import { FormSize } from './json-schema-form-size.js';
|
|
3
|
+
type EnumChoiceProps = {
|
|
4
|
+
field: FieldControl;
|
|
5
|
+
fieldId: string;
|
|
6
|
+
readOnly: boolean;
|
|
7
|
+
options: FieldOption[];
|
|
8
|
+
value: string;
|
|
9
|
+
size: FormSize;
|
|
10
|
+
};
|
|
11
|
+
export declare function SegmentedEnumControl({ field, fieldId, readOnly, options, value, size }: EnumChoiceProps): import("react").JSX.Element;
|
|
12
|
+
export declare function RadioGroupControl({ field, fieldId, readOnly, options, value, size }: EnumChoiceProps): import("react").JSX.Element;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=json-schema-form-enum-choice.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-schema-form-enum-choice.d.ts","sourceRoot":"","sources":["../../src/components/json-schema-form-enum-choice.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAsB,MAAM,0BAA0B,CAAC;AAC9F,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAsBxE,KAAK,eAAe,GAAG;IACrB,KAAK,EAAE,YAAY,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,QAAQ,CAAC;CAChB,CAAC;AAiBF,wBAAgB,oBAAoB,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,eAAe,+BA+BvG;AAUD,wBAAgB,iBAAiB,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,eAAe,+BAwDpG"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { cn } from "../lib/utils.js";
|
|
3
|
+
import { SegmentedControl } from "./SegmentedControl.js";
|
|
4
|
+
import { labelSizeClass } from "./json-schema-form-size.js";
|
|
5
|
+
const DEFAULT_MARKER = "default";
|
|
6
|
+
function schemaDefaultChoice(schema, options) {
|
|
7
|
+
const fallback = schema.default;
|
|
8
|
+
if (typeof fallback !== "string" && typeof fallback !== "number" && typeof fallback !== "boolean") {
|
|
9
|
+
return void 0;
|
|
10
|
+
}
|
|
11
|
+
const choice = String(fallback);
|
|
12
|
+
return options.some((opt) => opt.value === choice) ? choice : void 0;
|
|
13
|
+
}
|
|
14
|
+
function optionTitle(opt, isDefault) {
|
|
15
|
+
const parts = [opt.description, isDefault ? `(${DEFAULT_MARKER})` : void 0].filter(Boolean);
|
|
16
|
+
return parts.length > 0 ? parts.join(" ") : void 0;
|
|
17
|
+
}
|
|
18
|
+
const SEGMENTED_SIZE = {
|
|
19
|
+
xs: "sm",
|
|
20
|
+
sm: "sm",
|
|
21
|
+
md: "md",
|
|
22
|
+
lg: "lg",
|
|
23
|
+
xl: "lg"
|
|
24
|
+
};
|
|
25
|
+
function SegmentedEnumControl({ field, fieldId, readOnly, options, value, size }) {
|
|
26
|
+
const hasDescription = options.some((opt) => opt.description);
|
|
27
|
+
const segSize = hasDescription ? "lg" : SEGMENTED_SIZE[size];
|
|
28
|
+
const defaultChoice = schemaDefaultChoice(field.schema, options);
|
|
29
|
+
return /* @__PURE__ */ jsx("div", { id: fieldId, "data-jsf-input": true, className: cn(field.inputClassName), children: /* @__PURE__ */ jsx(
|
|
30
|
+
SegmentedControl,
|
|
31
|
+
{
|
|
32
|
+
"aria-label": field.label,
|
|
33
|
+
value,
|
|
34
|
+
onChange: (next) => field.onChange(next),
|
|
35
|
+
size: segSize,
|
|
36
|
+
wrap: true,
|
|
37
|
+
options: options.map((opt) => {
|
|
38
|
+
const isDefault = opt.value === defaultChoice;
|
|
39
|
+
const title = optionTitle(opt, isDefault);
|
|
40
|
+
return {
|
|
41
|
+
id: opt.value,
|
|
42
|
+
label: opt.label,
|
|
43
|
+
// x-enum-icons resolves to a runtime name string; SegmentedControl
|
|
44
|
+
// renders that via <Icon name>. Non-string (pre-extension) icons are
|
|
45
|
+
// dropped here since the segmented option type only takes name/component.
|
|
46
|
+
...typeof opt.icon === "string" ? { icon: opt.icon } : {},
|
|
47
|
+
...opt.description ? { description: opt.description } : {},
|
|
48
|
+
...title ? { title } : {},
|
|
49
|
+
...isDefault ? { marker: DEFAULT_MARKER, implied: true } : {},
|
|
50
|
+
...readOnly ? { disabled: true } : {}
|
|
51
|
+
};
|
|
52
|
+
})
|
|
53
|
+
}
|
|
54
|
+
) });
|
|
55
|
+
}
|
|
56
|
+
function RadioGroupControl({ field, fieldId, readOnly, options, value, size }) {
|
|
57
|
+
const defaultChoice = schemaDefaultChoice(field.schema, options);
|
|
58
|
+
const impliedChoice = value === "" ? defaultChoice : void 0;
|
|
59
|
+
return /* @__PURE__ */ jsx(
|
|
60
|
+
"div",
|
|
61
|
+
{
|
|
62
|
+
role: "radiogroup",
|
|
63
|
+
"aria-label": field.label,
|
|
64
|
+
id: fieldId,
|
|
65
|
+
"data-jsf-input": true,
|
|
66
|
+
className: cn(
|
|
67
|
+
"inline-flex flex-wrap items-center gap-1 rounded-md border border-input bg-background p-0.5",
|
|
68
|
+
field.inputClassName
|
|
69
|
+
),
|
|
70
|
+
children: options.map((opt) => {
|
|
71
|
+
const checked = opt.value === value;
|
|
72
|
+
const implied = opt.value === impliedChoice;
|
|
73
|
+
const isDefault = opt.value === defaultChoice;
|
|
74
|
+
const markerId = isDefault ? `${fieldId}-default` : void 0;
|
|
75
|
+
return /* @__PURE__ */ jsxs(
|
|
76
|
+
"label",
|
|
77
|
+
{
|
|
78
|
+
title: optionTitle(opt, isDefault),
|
|
79
|
+
"data-implied": implied ? "true" : void 0,
|
|
80
|
+
className: cn(
|
|
81
|
+
"inline-flex cursor-pointer select-none items-center rounded px-2.5 py-1",
|
|
82
|
+
labelSizeClass[size],
|
|
83
|
+
checked ? "bg-primary text-primary-foreground" : implied ? "text-foreground outline-dashed outline-1 -outline-offset-1 outline-primary/60 hover:bg-accent" : "text-muted-foreground hover:bg-accent hover:text-foreground",
|
|
84
|
+
readOnly && "cursor-not-allowed opacity-60"
|
|
85
|
+
),
|
|
86
|
+
children: [
|
|
87
|
+
/* @__PURE__ */ jsx(
|
|
88
|
+
"input",
|
|
89
|
+
{
|
|
90
|
+
type: "radio",
|
|
91
|
+
name: fieldId,
|
|
92
|
+
className: "sr-only",
|
|
93
|
+
value: opt.value,
|
|
94
|
+
checked,
|
|
95
|
+
disabled: readOnly,
|
|
96
|
+
"aria-describedby": markerId,
|
|
97
|
+
onChange: () => field.onChange(opt.value)
|
|
98
|
+
}
|
|
99
|
+
),
|
|
100
|
+
opt.label,
|
|
101
|
+
isDefault && /* @__PURE__ */ jsx("span", { id: markerId, "aria-hidden": "true", className: "ml-1.5 text-[11px] font-normal opacity-70", children: DEFAULT_MARKER })
|
|
102
|
+
]
|
|
103
|
+
},
|
|
104
|
+
opt.value
|
|
105
|
+
);
|
|
106
|
+
})
|
|
107
|
+
}
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
export {
|
|
111
|
+
RadioGroupControl,
|
|
112
|
+
SegmentedEnumControl
|
|
113
|
+
};
|
|
114
|
+
//# sourceMappingURL=json-schema-form-enum-choice.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-schema-form-enum-choice.js","sources":["../../src/components/json-schema-form-enum-choice.tsx"],"sourcesContent":["import { cn } from \"../lib/utils\";\nimport { SegmentedControl, type SegmentedSize } from \"./SegmentedControl\";\nimport type { FieldControl, FieldOption, JsonSchemaProperty } from \"./json-schema-form-types\";\nimport { labelSizeClass, type FormSize } from \"./json-schema-form-size\";\n\nconst DEFAULT_MARKER = \"default\";\n\n// schemaDefaultChoice returns the option value named by the schema's scalar\n// `default`, or undefined when there is none or it matches no option.\nfunction schemaDefaultChoice(schema: JsonSchemaProperty, options: FieldOption[]): string | undefined {\n const fallback = schema.default;\n if (typeof fallback !== \"string\" && typeof fallback !== \"number\" && typeof fallback !== \"boolean\") {\n return undefined;\n }\n const choice = String(fallback);\n return options.some((opt) => opt.value === choice) ? choice : undefined;\n}\n\n// optionTitle is the native tooltip for one choice: its x-enum-descriptions\n// entry, suffixed with \"(default)\" when it is the schema default.\nfunction optionTitle(opt: FieldOption, isDefault: boolean): string | undefined {\n const parts = [opt.description, isDefault ? `(${DEFAULT_MARKER})` : undefined].filter(Boolean);\n return parts.length > 0 ? parts.join(\" \") : undefined;\n}\n\ntype EnumChoiceProps = {\n field: FieldControl;\n fieldId: string;\n readOnly: boolean;\n options: FieldOption[];\n value: string;\n size: FormSize;\n};\n\n// The FormSize scale is wider than SegmentedControl's; map the extremes down.\nconst SEGMENTED_SIZE: Record<FormSize, SegmentedSize> = {\n xs: \"sm\",\n sm: \"sm\",\n md: \"md\",\n lg: \"lg\",\n xl: \"lg\",\n};\n\n// SegmentedEnumControl renders an enum (x-enum-display: \"segmented\") with the\n// shared SegmentedControl. Icons come from x-enum-icons, descriptions from\n// x-enum-descriptions (which promote it to the large card layout, and double as\n// the segment tooltip). The schema default carries a \"default\" marker and, while\n// the value is unset, the implied style. The wrapper carries the field id +\n// data-jsf-input so the JSF field contract holds.\nexport function SegmentedEnumControl({ field, fieldId, readOnly, options, value, size }: EnumChoiceProps) {\n const hasDescription = options.some((opt) => opt.description);\n const segSize: SegmentedSize = hasDescription ? \"lg\" : SEGMENTED_SIZE[size];\n const defaultChoice = schemaDefaultChoice(field.schema, options);\n return (\n <div id={fieldId} data-jsf-input className={cn(field.inputClassName)}>\n <SegmentedControl\n aria-label={field.label}\n value={value}\n onChange={(next) => field.onChange(next)}\n size={segSize}\n wrap\n options={options.map((opt) => {\n const isDefault = opt.value === defaultChoice;\n const title = optionTitle(opt, isDefault);\n return {\n id: opt.value,\n label: opt.label,\n // x-enum-icons resolves to a runtime name string; SegmentedControl\n // renders that via <Icon name>. Non-string (pre-extension) icons are\n // dropped here since the segmented option type only takes name/component.\n ...(typeof opt.icon === \"string\" ? { icon: opt.icon } : {}),\n ...(opt.description ? { description: opt.description } : {}),\n ...(title ? { title } : {}),\n ...(isDefault ? { marker: DEFAULT_MARKER, implied: true } : {}),\n ...(readOnly ? { disabled: true } : {}),\n };\n })}\n />\n </div>\n );\n}\n\n// RadioGroupControl renders a small fixed enum as a segmented radio-button group\n// instead of a dropdown. It shares EnumControl's option list (any out-of-enum\n// value is already prepended, so a token still shows). One `radiogroup` role +\n// native radios keep it keyboard-navigable; the visible chip is a styled label\n// whose title is the option's description. The schema default carries a muted\n// \"default\" marker (the radio's accessible description) and, while the value is\n// unset, a dashed primary outline — distinct from the filled selection, and\n// never `checked`, because nothing is selected.\nexport function RadioGroupControl({ field, fieldId, readOnly, options, value, size }: EnumChoiceProps) {\n const defaultChoice = schemaDefaultChoice(field.schema, options);\n const impliedChoice = value === \"\" ? defaultChoice : undefined;\n return (\n <div\n role=\"radiogroup\"\n aria-label={field.label}\n id={fieldId}\n data-jsf-input\n className={cn(\n \"inline-flex flex-wrap items-center gap-1 rounded-md border border-input bg-background p-0.5\",\n field.inputClassName,\n )}\n >\n {options.map((opt) => {\n const checked = opt.value === value;\n const implied = opt.value === impliedChoice;\n const isDefault = opt.value === defaultChoice;\n const markerId = isDefault ? `${fieldId}-default` : undefined;\n return (\n <label\n key={opt.value}\n title={optionTitle(opt, isDefault)}\n data-implied={implied ? \"true\" : undefined}\n className={cn(\n \"inline-flex cursor-pointer select-none items-center rounded px-2.5 py-1\",\n labelSizeClass[size],\n checked\n ? \"bg-primary text-primary-foreground\"\n : implied\n ? \"text-foreground outline-dashed outline-1 -outline-offset-1 outline-primary/60 hover:bg-accent\"\n : \"text-muted-foreground hover:bg-accent hover:text-foreground\",\n readOnly && \"cursor-not-allowed opacity-60\",\n )}\n >\n <input\n type=\"radio\"\n name={fieldId}\n className=\"sr-only\"\n value={opt.value}\n checked={checked}\n disabled={readOnly}\n aria-describedby={markerId}\n onChange={() => field.onChange(opt.value)}\n />\n {opt.label}\n {isDefault && (\n <span id={markerId} aria-hidden=\"true\" className=\"ml-1.5 text-[11px] font-normal opacity-70\">\n {DEFAULT_MARKER}\n </span>\n )}\n </label>\n );\n })}\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -6,7 +6,7 @@ const utils = require("../lib/utils.cjs");
|
|
|
6
6
|
const timestampFormat = require("../data/cells/timestamp-format.cjs");
|
|
7
7
|
const Combobox = require("./Combobox.cjs");
|
|
8
8
|
const DateField = require("./DateField.cjs");
|
|
9
|
-
const
|
|
9
|
+
const jsonSchemaFormEnumChoice = require("./json-schema-form-enum-choice.cjs");
|
|
10
10
|
const jsonSchemaFormGrid = require("./json-schema-form-grid.cjs");
|
|
11
11
|
const jsonSchemaFormLookupTree = require("./json-schema-form-lookup-tree.cjs");
|
|
12
12
|
const jsonSchemaFormTagsCombobox = require("./json-schema-form-tags-combobox.cjs");
|
|
@@ -235,10 +235,10 @@ function EnumControl({
|
|
|
235
235
|
return /* @__PURE__ */ jsxRuntime.jsx(jsonSchemaFormGrid.GridControl, { field, fieldId, readOnly, size });
|
|
236
236
|
}
|
|
237
237
|
if (field.display === "radio") {
|
|
238
|
-
return /* @__PURE__ */ jsxRuntime.jsx(RadioGroupControl, { field, fieldId, readOnly, options, value, size });
|
|
238
|
+
return /* @__PURE__ */ jsxRuntime.jsx(jsonSchemaFormEnumChoice.RadioGroupControl, { field, fieldId, readOnly, options, value, size });
|
|
239
239
|
}
|
|
240
240
|
if (field.display === "segmented") {
|
|
241
|
-
return /* @__PURE__ */ jsxRuntime.jsx(SegmentedEnumControl, { field, fieldId, readOnly, options, value, size });
|
|
241
|
+
return /* @__PURE__ */ jsxRuntime.jsx(jsonSchemaFormEnumChoice.SegmentedEnumControl, { field, fieldId, readOnly, options, value, size });
|
|
242
242
|
}
|
|
243
243
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
244
244
|
Combobox.Combobox,
|
|
@@ -258,44 +258,6 @@ function EnumControl({
|
|
|
258
258
|
}
|
|
259
259
|
);
|
|
260
260
|
}
|
|
261
|
-
const SEGMENTED_SIZE = {
|
|
262
|
-
xs: "sm",
|
|
263
|
-
sm: "sm",
|
|
264
|
-
md: "md",
|
|
265
|
-
lg: "lg",
|
|
266
|
-
xl: "lg"
|
|
267
|
-
};
|
|
268
|
-
function SegmentedEnumControl({
|
|
269
|
-
field,
|
|
270
|
-
fieldId,
|
|
271
|
-
readOnly,
|
|
272
|
-
options,
|
|
273
|
-
value,
|
|
274
|
-
size
|
|
275
|
-
}) {
|
|
276
|
-
const hasDescription = options.some((opt) => opt.description);
|
|
277
|
-
const segSize = hasDescription ? "lg" : SEGMENTED_SIZE[size];
|
|
278
|
-
return /* @__PURE__ */ jsxRuntime.jsx("div", { id: fieldId, "data-jsf-input": true, className: utils.cn(field.inputClassName), children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
279
|
-
SegmentedControl.SegmentedControl,
|
|
280
|
-
{
|
|
281
|
-
"aria-label": field.label,
|
|
282
|
-
value,
|
|
283
|
-
onChange: (next) => field.onChange(next),
|
|
284
|
-
size: segSize,
|
|
285
|
-
wrap: true,
|
|
286
|
-
options: options.map((opt) => ({
|
|
287
|
-
id: opt.value,
|
|
288
|
-
label: opt.label,
|
|
289
|
-
// x-enum-icons resolves to a runtime name string; SegmentedControl
|
|
290
|
-
// renders that via <Icon name>. Non-string (pre-extension) icons are
|
|
291
|
-
// dropped here since the segmented option type only takes name/component.
|
|
292
|
-
...typeof opt.icon === "string" ? { icon: opt.icon } : {},
|
|
293
|
-
...opt.description ? { description: opt.description } : {},
|
|
294
|
-
...readOnly ? { disabled: true } : {}
|
|
295
|
-
}))
|
|
296
|
-
}
|
|
297
|
-
) });
|
|
298
|
-
}
|
|
299
261
|
function LookupControl({
|
|
300
262
|
field,
|
|
301
263
|
fieldId,
|
|
@@ -385,58 +347,6 @@ function LookupControl({
|
|
|
385
347
|
}
|
|
386
348
|
);
|
|
387
349
|
}
|
|
388
|
-
function RadioGroupControl({
|
|
389
|
-
field,
|
|
390
|
-
fieldId,
|
|
391
|
-
readOnly,
|
|
392
|
-
options,
|
|
393
|
-
value,
|
|
394
|
-
size
|
|
395
|
-
}) {
|
|
396
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
397
|
-
"div",
|
|
398
|
-
{
|
|
399
|
-
role: "radiogroup",
|
|
400
|
-
"aria-label": field.label,
|
|
401
|
-
id: fieldId,
|
|
402
|
-
"data-jsf-input": true,
|
|
403
|
-
className: utils.cn(
|
|
404
|
-
"inline-flex flex-wrap items-center gap-1 rounded-md border border-input bg-background p-0.5",
|
|
405
|
-
field.inputClassName
|
|
406
|
-
),
|
|
407
|
-
children: options.map((opt) => {
|
|
408
|
-
const checked = opt.value === value;
|
|
409
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
410
|
-
"label",
|
|
411
|
-
{
|
|
412
|
-
className: utils.cn(
|
|
413
|
-
"inline-flex cursor-pointer select-none items-center rounded px-2.5 py-1",
|
|
414
|
-
jsonSchemaFormSize.labelSizeClass[size],
|
|
415
|
-
checked ? "bg-primary text-primary-foreground" : "text-muted-foreground hover:bg-accent hover:text-foreground",
|
|
416
|
-
readOnly && "cursor-not-allowed opacity-60"
|
|
417
|
-
),
|
|
418
|
-
children: [
|
|
419
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
420
|
-
"input",
|
|
421
|
-
{
|
|
422
|
-
type: "radio",
|
|
423
|
-
name: fieldId,
|
|
424
|
-
className: "sr-only",
|
|
425
|
-
value: opt.value,
|
|
426
|
-
checked,
|
|
427
|
-
disabled: readOnly,
|
|
428
|
-
onChange: () => field.onChange(opt.value)
|
|
429
|
-
}
|
|
430
|
-
),
|
|
431
|
-
opt.label
|
|
432
|
-
]
|
|
433
|
-
},
|
|
434
|
-
opt.value
|
|
435
|
-
);
|
|
436
|
-
})
|
|
437
|
-
}
|
|
438
|
-
);
|
|
439
|
-
}
|
|
440
350
|
function TextareaControl({
|
|
441
351
|
field,
|
|
442
352
|
fieldId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json-schema-form-fields.cjs","sources":["../../src/components/json-schema-form-fields.tsx"],"sourcesContent":["import { lazy, Suspense, useCallback, useEffect, useRef, useState, type ReactNode } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { formatDateTimeRelative } from \"../data/cells/timestamp-format\";\nimport { Combobox } from \"./Combobox\";\nimport { DateField } from \"./DateField\";\nimport { SegmentedControl, type SegmentedSize } from \"./SegmentedControl\";\nimport { GridControl } from \"./json-schema-form-grid\";\nimport { LookupTreeControl } from \"./json-schema-form-lookup-tree\";\nimport { TagsComboboxControl } from \"./json-schema-form-tags-combobox\";\nimport { resolveLookupScope, useLookupFetcher } from \"./form-lookup-context\";\nimport type { FieldControl, FieldOption } from \"./json-schema-form-types\";\nimport {\n comboboxAriaProps,\n defaultPlaceholder,\n fieldAriaProps,\n inputClass,\n toText,\n withSyntheticValue,\n} from \"./json-schema-form-utils\";\nimport {\n controlHeightClass,\n labelSizeClass,\n type FormSize,\n} from \"./json-schema-form-size\";\n\nconst LazyMdxEditorField = lazy(async () => {\n const mod = await import(\"./MdxEditorField\");\n return { default: mod.MdxEditorField };\n});\n\n// ReadOnlyValue renders a `readOnly` field's current value as static text — no\n// input, no border, just the value (date/date-time formatted human-readably).\n// An empty value shows an em-dash. Carries the same id + data-jsf-input as the\n// editable controls so layout and queries stay uniform.\nexport function ReadOnlyValue({ field, fieldId, size }: { field: FieldControl; fieldId: string; size: FormSize }) {\n const text = toText(field.value);\n const secret = field.schema.format === \"password\";\n const display = secret && text ? \"••••••••\" : field.kind === \"date\" && text ? formatDateTimeRelative(text) : text;\n return (\n <span\n id={fieldId}\n data-jsf-input\n data-jsf-readonly\n className={cn(\"flex items-center text-foreground\", controlHeightClass[size], labelSizeClass[size])}\n title={secret ? undefined : text || undefined}\n >\n {display || <span className=\"text-muted-foreground\">—</span>}\n </span>\n );\n}\n\n// FieldAdornmentWrapper positions a field's leading/trailing in-field adornments\n// (FieldControl.prefix at the left edge, FieldControl.suffix at the right). The\n// container is tagged data-jsf-control so an adornment can locate its sibling\n// input[data-jsf-input] (e.g. for caret-aware insertion). With neither adornment\n// it renders the input bare, so unadorned fields are byte-for-byte unchanged.\nfunction FieldAdornmentWrapper({\n prefix,\n suffix,\n children,\n}: {\n prefix?: ReactNode;\n suffix?: ReactNode;\n children: ReactNode;\n}) {\n if (!prefix && !suffix) return <>{children}</>;\n return (\n <div data-jsf-control className=\"relative\">\n {prefix && <div className=\"absolute inset-y-0 left-1.5 flex items-center\">{prefix}</div>}\n {children}\n {suffix && <div className=\"absolute inset-y-0 right-1.5 flex items-center\">{suffix}</div>}\n </div>\n );\n}\n\nexport function StringControl({\n field,\n fieldId,\n readOnly,\n size,\n}: {\n field: FieldControl;\n fieldId: string;\n readOnly: boolean;\n size: FormSize;\n}) {\n return (\n <FieldAdornmentWrapper prefix={field.prefix} suffix={field.suffix}>\n <input\n id={fieldId}\n // format:\"password\" masks secret material (API keys, client secrets);\n // autoComplete new-password stops browsers from offering saved logins.\n type={field.schema.format === \"password\" ? \"password\" : \"text\"}\n autoComplete={field.schema.format === \"password\" ? \"new-password\" : undefined}\n data-jsf-input\n {...fieldAriaProps(field, fieldId)}\n className={cn(inputClass(size), field.prefix && \"pl-8\", field.suffix && \"pr-8\", field.inputClassName)}\n value={toText(field.value)}\n disabled={readOnly}\n placeholder={defaultPlaceholder(field.schema)}\n onChange={(e) => field.onChange(e.target.value)}\n />\n </FieldAdornmentWrapper>\n );\n}\n\nexport function NumberControl({\n field,\n fieldId,\n readOnly,\n size,\n}: {\n field: FieldControl;\n fieldId: string;\n readOnly: boolean;\n size: FormSize;\n}) {\n // A bounded number can opt into a single-thumb progress slider.\n if (field.schema[\"x-number-display\"] === \"slider\" && typeof field.schema.maximum === \"number\") {\n return <NumberSliderControl field={field} fieldId={fieldId} readOnly={readOnly} size={size} />;\n }\n // Default type=\"text\" (not number) so non-numeric values a consumer permits —\n // e.g. template tokens — are not silently dropped by the browser. A schema that\n // declares `multipleOf` opts into a real `<input type=\"number\">` (native step,\n // spin buttons, min/max), matching a hand-built numeric field.\n const coerce = field.coerceNumber !== false;\n const step = typeof field.schema.multipleOf === \"number\" ? field.schema.multipleOf : undefined;\n const native = step !== undefined && !(field.allowCustomValue && typeof field.value === \"string\" && field.value.includes(\"{{\"));\n // A static unit (e.g. \"%\") rides the right edge of the input as a display-only\n // suffix; a consumer-set `suffix` (e.g. an insert-snippet button) wins if both\n // are present (number insert triggers mount on the left as `prefix`).\n const suffix = field.suffix ?? (field.unit ? (\n <span className=\"pointer-events-none select-none text-muted-foreground\">{field.unit}</span>\n ) : undefined);\n return (\n <FieldAdornmentWrapper prefix={field.prefix} suffix={suffix}>\n <input\n id={fieldId}\n type={native ? \"number\" : \"text\"}\n inputMode=\"decimal\"\n {...(native\n ? {\n step,\n ...(typeof field.schema.minimum === \"number\" ? { min: field.schema.minimum } : {}),\n ...(typeof field.schema.maximum === \"number\" ? { max: field.schema.maximum } : {}),\n }\n : {})}\n data-jsf-input\n {...fieldAriaProps(field, fieldId)}\n className={cn(inputClass(size), field.prefix && \"pl-8\", suffix && \"pr-8\", field.inputClassName)}\n value={toText(field.value)}\n disabled={readOnly}\n placeholder={defaultPlaceholder(field.schema)}\n onChange={(e) => {\n const raw = e.target.value;\n // Coerce mid-typing ONLY when the parse round-trips to the same text\n // (e.g. \"100\", \"33.5\") — so an in-progress decimal like \"33.\" or a\n // trailing-zero \"33.30\" keeps its raw text instead of collapsing to a\n // number and stranding the caret. Non-numeric tokens fall through to\n // the raw string. Blur finalizes any still-uncoerced numeric text.\n if (coerce && raw.trim() !== \"\" && String(Number(raw)) === raw.trim()) {\n field.onChange(Number(raw));\n } else {\n field.onChange(raw);\n }\n }}\n onBlur={(e) => {\n const raw = e.target.value;\n if (coerce && raw.trim() !== \"\" && Number.isFinite(Number(raw))) {\n field.onChange(Number(raw));\n }\n }}\n />\n </FieldAdornmentWrapper>\n );\n}\n\n// A single-thumb range input styled with a progress-filled track. The input sits\n// above the track/fill divs; only its thumb is painted.\nconst SLIDER_INPUT_CLASS =\n \"absolute inset-0 h-6 w-full cursor-pointer appearance-none bg-transparent focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50 [&::-webkit-slider-runnable-track]:h-1 [&::-webkit-slider-runnable-track]:rounded-full [&::-webkit-slider-runnable-track]:bg-transparent [&::-webkit-slider-thumb]:size-3.5 [&::-webkit-slider-thumb]:-mt-[5px] [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:border [&::-webkit-slider-thumb]:border-background/80 [&::-webkit-slider-thumb]:bg-primary [&::-webkit-slider-thumb]:shadow-sm [&::-moz-range-track]:h-1 [&::-moz-range-track]:rounded-full [&::-moz-range-track]:bg-transparent [&::-moz-range-thumb]:size-3.5 [&::-moz-range-thumb]:appearance-none [&::-moz-range-thumb]:rounded-full [&::-moz-range-thumb]:border-0 [&::-moz-range-thumb]:bg-primary [&::-moz-range-thumb]:shadow-sm\";\n\n// NumberSliderControl renders a bounded number (`x-number-display: \"slider\"`) as\n// a single-thumb slider whose fill grows with the value, with the live value\n// shown to the right.\nexport function NumberSliderControl({\n field,\n fieldId,\n readOnly,\n size,\n}: {\n field: FieldControl;\n fieldId: string;\n readOnly: boolean;\n size: FormSize;\n}) {\n const min = typeof field.schema.minimum === \"number\" ? field.schema.minimum : 0;\n const max = typeof field.schema.maximum === \"number\" ? field.schema.maximum : 100;\n const step = typeof field.schema.multipleOf === \"number\" ? field.schema.multipleOf : 1;\n const raw = typeof field.value === \"number\" ? field.value : Number(toText(field.value));\n const hasValue = Number.isFinite(raw);\n const value = hasValue ? Math.min(max, Math.max(min, raw)) : min;\n const percent = max > min ? ((value - min) / (max - min)) * 100 : 0;\n return (\n <div className=\"flex items-center gap-3\">\n <div className=\"relative h-6 min-w-0 flex-1\">\n <div className=\"absolute inset-x-0 top-1/2 h-1 -translate-y-1/2 rounded-full bg-border\" />\n <div\n className=\"absolute left-0 top-1/2 h-1 -translate-y-1/2 rounded-full bg-primary/70\"\n style={{ width: `${percent}%` }}\n />\n <input\n id={fieldId}\n data-jsf-input\n type=\"range\"\n aria-label={field.label}\n {...fieldAriaProps(field, fieldId)}\n min={min}\n max={max}\n step={step}\n value={value}\n disabled={readOnly}\n className={cn(SLIDER_INPUT_CLASS, field.inputClassName)}\n onChange={(event) => field.onChange(Number(event.target.value))}\n />\n </div>\n <span className={cn(\"w-16 shrink-0 text-right tabular-nums\", labelSizeClass[size])}>\n {hasValue ? value.toLocaleString() : \"—\"}\n </span>\n </div>\n );\n}\n\n// DateControl edits a `format: date`/`date-time` string. Read-only, it shows the\n// human-readable absolute + relative form (e.g. \"Apr 15, 2026, 12:00 PM (2h\n// ago)\"); editable, a DateField in the schema's date or datetime mode. The raw\n// string is committed unchanged so a\n// consumer-permitted template token in the field is preserved.\nexport function DateControl({\n field,\n fieldId,\n readOnly,\n size,\n}: {\n field: FieldControl;\n fieldId: string;\n readOnly: boolean;\n size: FormSize;\n}) {\n const text = toText(field.value);\n if (!readOnly && field.allowCustomValue && text.includes(\"{{\")) {\n return <StringControl field={field} fieldId={fieldId} readOnly={readOnly} size={size} />;\n }\n if (readOnly) {\n return (\n <div\n id={fieldId}\n data-jsf-input\n className={cn(\"flex items-center text-foreground\", controlHeightClass[size], labelSizeClass[size])}\n title={text || undefined}\n >\n {text ? formatDateTimeRelative(text) : <span className=\"text-muted-foreground\">—</span>}\n </div>\n );\n }\n return (\n <DateField\n mode={field.dateFormat === \"date-time\" ? \"datetime\" : \"date\"}\n id={fieldId}\n aria-label={field.label}\n data-jsf-input\n {...fieldAriaProps(field, fieldId)}\n inputClassName={cn(inputClass(size), field.prefix && \"pl-8\", field.suffix ? \"pr-14\" : \"pr-8\")}\n value={text}\n onChange={(next) => field.onChange(next)}\n placeholder={defaultPlaceholder(field.schema)}\n prefix={field.prefix}\n suffix={field.suffix}\n />\n );\n}\n\nexport function BooleanControl({\n field,\n fieldId,\n readOnly,\n size,\n}: {\n field: FieldControl;\n fieldId: string;\n readOnly: boolean;\n size: FormSize;\n}) {\n // Only render a checkbox when the value is genuinely boolean (or unset).\n // A non-boolean value (e.g. a token a consumer left in place) renders as text\n // so it is preserved and editable.\n if (typeof field.value === \"boolean\" || field.value === undefined || field.value === null) {\n return (\n <div className={cn(\"flex items-center gap-1\", controlHeightClass[size])}>\n {field.prefix}\n <input\n id={fieldId}\n type=\"checkbox\"\n className=\"h-4 w-4 accent-primary\"\n {...fieldAriaProps(field, fieldId)}\n checked={field.value === true}\n disabled={readOnly}\n onChange={(e) => field.onChange(e.target.checked)}\n />\n </div>\n );\n }\n return <StringControl field={field} fieldId={fieldId} readOnly={readOnly} size={size} />;\n}\n\nexport function EnumControl({\n field,\n fieldId,\n readOnly,\n size,\n}: {\n field: FieldControl;\n fieldId: string;\n readOnly: boolean;\n size: FormSize;\n}) {\n const value = toText(field.value);\n const options = withSyntheticValue(field.options ?? [], value);\n if (field.display === \"grid\") {\n return <GridControl field={field} fieldId={fieldId} readOnly={readOnly} size={size} />;\n }\n if (field.display === \"radio\") {\n return (\n <RadioGroupControl field={field} fieldId={fieldId} readOnly={readOnly} options={options} value={value} size={size} />\n );\n }\n if (field.display === \"segmented\") {\n return (\n <SegmentedEnumControl field={field} fieldId={fieldId} readOnly={readOnly} options={options} value={value} size={size} />\n );\n }\n return (\n <Combobox\n id={fieldId}\n options={options}\n value={value}\n disabled={readOnly}\n size={size}\n allowCustomValue={field.allowCustomValue ?? false}\n onChange={(v) => field.onChange(v)}\n prefix={field.prefix}\n suffix={field.suffix}\n {...comboboxAriaProps(field, fieldId)}\n {...(field.inputClassName ? { className: field.inputClassName } : {})}\n {...(defaultPlaceholder(field.schema) ? { placeholder: defaultPlaceholder(field.schema) } : {})}\n />\n );\n}\n\n// The FormSize scale is wider than SegmentedControl's; map the extremes down.\nconst SEGMENTED_SIZE: Record<FormSize, SegmentedSize> = {\n xs: \"sm\",\n sm: \"sm\",\n md: \"md\",\n lg: \"lg\",\n xl: \"lg\",\n};\n\n// SegmentedEnumControl renders an enum (x-enum-display: \"segmented\") with the\n// shared SegmentedControl. Icons come from x-enum-icons, descriptions from\n// x-enum-descriptions (which promote it to the large card layout). The wrapper\n// carries the field id + data-jsf-input so the JSF field contract holds.\nfunction SegmentedEnumControl({\n field,\n fieldId,\n readOnly,\n options,\n value,\n size,\n}: {\n field: FieldControl;\n fieldId: string;\n readOnly: boolean;\n options: FieldOption[];\n value: string;\n size: FormSize;\n}) {\n const hasDescription = options.some((opt) => opt.description);\n const segSize: SegmentedSize = hasDescription ? \"lg\" : SEGMENTED_SIZE[size];\n return (\n <div id={fieldId} data-jsf-input className={cn(field.inputClassName)}>\n <SegmentedControl\n aria-label={field.label}\n value={value}\n onChange={(next) => field.onChange(next)}\n size={segSize}\n wrap\n options={options.map((opt) => ({\n id: opt.value,\n label: opt.label,\n // x-enum-icons resolves to a runtime name string; SegmentedControl\n // renders that via <Icon name>. Non-string (pre-extension) icons are\n // dropped here since the segmented option type only takes name/component.\n ...(typeof opt.icon === \"string\" ? { icon: opt.icon } : {}),\n ...(opt.description ? { description: opt.description } : {}),\n ...(readOnly ? { disabled: true } : {}),\n }))}\n />\n </div>\n );\n}\n\n// LookupControl is the async entity-reference picker for an `x-clicky-lookup`\n// field. It wraps Combobox and fetches options lazily through the form's\n// LookupFetcher (from context): the head set loads when the menu opens and the\n// (debounced) typed query drives server-side search. Single-select keeps\n// allowCustomValue on so a value outside the option set still commits (e.g. an\n// inline DSN). When no fetcher is wired it degrades to a free-text combobox.\nexport function LookupControl({\n field,\n fieldId,\n readOnly,\n size,\n rootValue,\n}: {\n field: FieldControl;\n fieldId: string;\n readOnly: boolean;\n size: FormSize;\n rootValue?: Record<string, unknown>;\n}) {\n const fetcher = useLookupFetcher();\n const descriptor = field.lookup;\n const value = toText(field.value);\n const [options, setOptions] = useState<FieldOption[]>([]);\n const [loading, setLoading] = useState(false);\n\n // rootValue is read through a ref so onSearch stays referentially stable: a new\n // onSearch each render would retrigger Combobox's search effect on every\n // setOptions, looping. The scopeKey effect below re-fetches when scope changes.\n const rootRef = useRef(rootValue);\n rootRef.current = rootValue;\n\n const onSearch = useCallback(\n (query: string) => {\n if (!descriptor || !fetcher) return;\n setLoading(true);\n const root = rootRef.current;\n fetcher({ descriptor, query, ...(root ? { rootValue: root } : {}) })\n .then((next) => setOptions(next))\n .catch(() => setOptions([]))\n .finally(() => setLoading(false));\n },\n [descriptor, fetcher],\n );\n\n // Re-fetch the head set when the scope (a sibling field, e.g. provider type)\n // changes so the out-of-scope set is replaced rather than shown stale.\n const scopeKey = descriptor ? JSON.stringify(resolveLookupScope(descriptor, rootValue)) : \"\";\n useEffect(() => {\n if (descriptor && fetcher) onSearch(\"\");\n else setOptions([]);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [scopeKey, onSearch]);\n\n // A descriptor that declares a hierarchy browses its options as a tree rather\n // than scrolling one flat list. It owns the multi-value case too, since the\n // committed value is then an array rather than a single string.\n if (descriptor?.hierarchy) {\n return (\n <LookupTreeControl\n field={field}\n fieldId={fieldId}\n readOnly={readOnly}\n size={size}\n options={options}\n loading={loading}\n hierarchy={descriptor.hierarchy}\n />\n );\n }\n\n // A multi lookup commits an ARRAY, so it takes the tags picker rather than the\n // single-value combobox below — which would render the array as an empty box\n // and then overwrite it with a bare string. Without a fetcher the same control\n // renders the already-committed values with an empty option set.\n if (descriptor?.multi) {\n return (\n <TagsComboboxControl\n field={field}\n fieldId={fieldId}\n readOnly={readOnly}\n size={size}\n options={options}\n loading={loading}\n {...(fetcher ? { onSearch } : {})}\n />\n );\n }\n\n if (!descriptor || !fetcher) {\n return (\n <Combobox\n id={fieldId}\n options={withSyntheticValue([], value)}\n value={value}\n disabled={readOnly}\n size={size}\n allowCustomValue\n onChange={(v) => field.onChange(v)}\n {...comboboxAriaProps(field, fieldId)}\n {...(defaultPlaceholder(field.schema) ? { placeholder: defaultPlaceholder(field.schema) } : {})}\n />\n );\n }\n\n return (\n <Combobox\n id={fieldId}\n options={withSyntheticValue(options, value)}\n value={value}\n disabled={readOnly}\n size={size}\n loading={loading}\n allowCustomValue={field.allowCustomValue ?? false}\n onSearch={onSearch}\n onChange={(v) => field.onChange(v)}\n {...comboboxAriaProps(field, fieldId)}\n {...(defaultPlaceholder(field.schema) ? { placeholder: defaultPlaceholder(field.schema) } : {})}\n />\n );\n}\n\n// RadioGroupControl renders a small fixed enum as a segmented radio-button group\n// instead of a dropdown. It shares EnumControl's option list (any out-of-enum\n// value is already prepended, so a token still shows). One `radiogroup` role +\n// native radios keep it keyboard-navigable; the visible chip is a styled label.\nfunction RadioGroupControl({\n field,\n fieldId,\n readOnly,\n options,\n value,\n size,\n}: {\n field: FieldControl;\n fieldId: string;\n readOnly: boolean;\n options: FieldOption[];\n value: string;\n size: FormSize;\n}) {\n return (\n <div\n role=\"radiogroup\"\n aria-label={field.label}\n id={fieldId}\n data-jsf-input\n className={cn(\n \"inline-flex flex-wrap items-center gap-1 rounded-md border border-input bg-background p-0.5\",\n field.inputClassName,\n )}\n >\n {options.map((opt) => {\n const checked = opt.value === value;\n return (\n <label\n key={opt.value}\n className={cn(\n \"inline-flex cursor-pointer select-none items-center rounded px-2.5 py-1\",\n labelSizeClass[size],\n checked\n ? \"bg-primary text-primary-foreground\"\n : \"text-muted-foreground hover:bg-accent hover:text-foreground\",\n readOnly && \"cursor-not-allowed opacity-60\",\n )}\n >\n <input\n type=\"radio\"\n name={fieldId}\n className=\"sr-only\"\n value={opt.value}\n checked={checked}\n disabled={readOnly}\n onChange={() => field.onChange(opt.value)}\n />\n {opt.label}\n </label>\n );\n })}\n </div>\n );\n}\n\n// TextareaControl edits a long-form string in a multi-line box. Read-only, it\n// shows the value with line breaks preserved; editable, a resizable <textarea>.\n// The raw string is committed unchanged so a consumer-permitted template token\n// survives.\nexport function TextareaControl({\n field,\n fieldId,\n readOnly,\n size,\n}: {\n field: FieldControl;\n fieldId: string;\n readOnly: boolean;\n size: FormSize;\n}) {\n const text = toText(field.value);\n if (readOnly) {\n return (\n <span\n id={fieldId}\n data-jsf-input\n data-jsf-readonly\n className={cn(\"block whitespace-pre-wrap break-words text-foreground\", labelSizeClass[size])}\n title={text || undefined}\n >\n {text || <span className=\"text-muted-foreground\">—</span>}\n </span>\n );\n }\n return (\n <FieldAdornmentWrapper prefix={field.prefix} suffix={field.suffix}>\n <textarea\n id={fieldId}\n data-jsf-input\n {...fieldAriaProps(field, fieldId)}\n rows={4}\n className={cn(\n inputClass(size),\n \"h-auto min-h-[5rem] resize-y\",\n field.prefix && \"pl-8\",\n field.suffix && \"pr-8\",\n field.inputClassName,\n )}\n value={text}\n disabled={readOnly}\n placeholder={defaultPlaceholder(field.schema)}\n onChange={(e) => field.onChange(e.target.value)}\n />\n </FieldAdornmentWrapper>\n );\n}\n\nexport function MarkdownControl({\n field,\n fieldId,\n readOnly,\n size,\n}: {\n field: FieldControl;\n fieldId: string;\n readOnly: boolean;\n size: FormSize;\n}) {\n const fallback = (\n <textarea\n id={fieldId}\n data-jsf-input\n {...fieldAriaProps(field, fieldId)}\n rows={6}\n className={cn(inputClass(size), \"h-auto resize-y font-mono\", field.prefix && \"pl-8\", field.suffix && \"pr-8\")}\n value={toText(field.value)}\n disabled={readOnly}\n placeholder={defaultPlaceholder(field.schema)}\n onChange={(e) => field.onChange(e.target.value)}\n />\n );\n\n return (\n <Suspense fallback={fallback}>\n <LazyMdxEditorField\n id={fieldId}\n value={toText(field.value)}\n readOnly={readOnly}\n size={size}\n placeholder={defaultPlaceholder(field.schema)}\n onChange={(next) => field.onChange(next)}\n {...field.markdownOptions}\n />\n </Suspense>\n );\n}\n\n// DisplayControl renders a static, non-editable presentation element:\n// Label/Title (heading), Message (info text), Line (divider), or Blank/Filler\n// (spacer). It never collects a value; the heading/text source is the field's\n// title (label) and, for \"text\", its description. Rendered identically in the\n// form and the read-only Viewer.\nexport function DisplayControl({ field, size }: { field: FieldControl; size: FormSize }) {\n const variant = field.displayVariant ?? \"text\";\n if (variant === \"divider\") {\n return <hr data-jsf-input className=\"my-1 w-full border-t border-border\" />;\n }\n if (variant === \"spacer\") {\n return <div data-jsf-input aria-hidden className=\"h-2\" />;\n }\n if (variant === \"heading\") {\n return (\n <div\n data-jsf-input\n className={cn(\"border-b border-border pb-1 font-semibold text-foreground\", labelSizeClass[size])}\n >\n {field.label}\n </div>\n );\n }\n const text = field.description ?? toText(field.value) ?? field.label;\n return (\n <p data-jsf-input className={cn(\"text-muted-foreground\", labelSizeClass[size])}>\n {text || field.label}\n </p>\n );\n}\n\n// LinkControl renders a read-only external hyperlink. The\n// href is field.href, falling back to the value when it is an absolute URL; with\n// neither it degrades to a plain read-only value.\nexport function LinkControl({ field, fieldId, size }: { field: FieldControl; fieldId: string; size: FormSize }) {\n const text = toText(field.value);\n const href = field.href ?? (/^https?:\\/\\//i.test(text) ? text : undefined);\n if (!href) {\n return <ReadOnlyValue field={field} fieldId={fieldId} size={size} />;\n }\n return (\n <a\n id={fieldId}\n data-jsf-input\n href={href}\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n className={cn(\"inline-flex items-center text-primary underline underline-offset-2\", controlHeightClass[size], labelSizeClass[size])}\n >\n {text || field.label || href}\n </a>\n );\n}\n\n// HMR probe\n// HMR probe 2\n"],"names":["lazy","toText","formatDateTimeRelative","jsx","cn","controlHeightClass","labelSizeClass","jsxs","fieldAriaProps","inputClass","defaultPlaceholder","DateField","withSyntheticValue","GridControl","Combobox","comboboxAriaProps","SegmentedControl","useLookupFetcher","useState","useRef","useCallback","resolveLookupScope","useEffect","LookupTreeControl","TagsComboboxControl","Suspense"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"json-schema-form-fields.cjs","sources":["../../src/components/json-schema-form-fields.tsx"],"sourcesContent":["import { lazy, Suspense, useCallback, useEffect, useRef, useState, type ReactNode } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { formatDateTimeRelative } from \"../data/cells/timestamp-format\";\nimport { Combobox } from \"./Combobox\";\nimport { DateField } from \"./DateField\";\nimport { RadioGroupControl, SegmentedEnumControl } from \"./json-schema-form-enum-choice\";\nimport { GridControl } from \"./json-schema-form-grid\";\nimport { LookupTreeControl } from \"./json-schema-form-lookup-tree\";\nimport { TagsComboboxControl } from \"./json-schema-form-tags-combobox\";\nimport { resolveLookupScope, useLookupFetcher } from \"./form-lookup-context\";\nimport type { FieldControl, FieldOption } from \"./json-schema-form-types\";\nimport {\n comboboxAriaProps,\n defaultPlaceholder,\n fieldAriaProps,\n inputClass,\n toText,\n withSyntheticValue,\n} from \"./json-schema-form-utils\";\nimport {\n controlHeightClass,\n labelSizeClass,\n type FormSize,\n} from \"./json-schema-form-size\";\n\nconst LazyMdxEditorField = lazy(async () => {\n const mod = await import(\"./MdxEditorField\");\n return { default: mod.MdxEditorField };\n});\n\n// ReadOnlyValue renders a `readOnly` field's current value as static text — no\n// input, no border, just the value (date/date-time formatted human-readably).\n// An empty value shows an em-dash. Carries the same id + data-jsf-input as the\n// editable controls so layout and queries stay uniform.\nexport function ReadOnlyValue({ field, fieldId, size }: { field: FieldControl; fieldId: string; size: FormSize }) {\n const text = toText(field.value);\n const secret = field.schema.format === \"password\";\n const display = secret && text ? \"••••••••\" : field.kind === \"date\" && text ? formatDateTimeRelative(text) : text;\n return (\n <span\n id={fieldId}\n data-jsf-input\n data-jsf-readonly\n className={cn(\"flex items-center text-foreground\", controlHeightClass[size], labelSizeClass[size])}\n title={secret ? undefined : text || undefined}\n >\n {display || <span className=\"text-muted-foreground\">—</span>}\n </span>\n );\n}\n\n// FieldAdornmentWrapper positions a field's leading/trailing in-field adornments\n// (FieldControl.prefix at the left edge, FieldControl.suffix at the right). The\n// container is tagged data-jsf-control so an adornment can locate its sibling\n// input[data-jsf-input] (e.g. for caret-aware insertion). With neither adornment\n// it renders the input bare, so unadorned fields are byte-for-byte unchanged.\nfunction FieldAdornmentWrapper({\n prefix,\n suffix,\n children,\n}: {\n prefix?: ReactNode;\n suffix?: ReactNode;\n children: ReactNode;\n}) {\n if (!prefix && !suffix) return <>{children}</>;\n return (\n <div data-jsf-control className=\"relative\">\n {prefix && <div className=\"absolute inset-y-0 left-1.5 flex items-center\">{prefix}</div>}\n {children}\n {suffix && <div className=\"absolute inset-y-0 right-1.5 flex items-center\">{suffix}</div>}\n </div>\n );\n}\n\nexport function StringControl({\n field,\n fieldId,\n readOnly,\n size,\n}: {\n field: FieldControl;\n fieldId: string;\n readOnly: boolean;\n size: FormSize;\n}) {\n return (\n <FieldAdornmentWrapper prefix={field.prefix} suffix={field.suffix}>\n <input\n id={fieldId}\n // format:\"password\" masks secret material (API keys, client secrets);\n // autoComplete new-password stops browsers from offering saved logins.\n type={field.schema.format === \"password\" ? \"password\" : \"text\"}\n autoComplete={field.schema.format === \"password\" ? \"new-password\" : undefined}\n data-jsf-input\n {...fieldAriaProps(field, fieldId)}\n className={cn(inputClass(size), field.prefix && \"pl-8\", field.suffix && \"pr-8\", field.inputClassName)}\n value={toText(field.value)}\n disabled={readOnly}\n placeholder={defaultPlaceholder(field.schema)}\n onChange={(e) => field.onChange(e.target.value)}\n />\n </FieldAdornmentWrapper>\n );\n}\n\nexport function NumberControl({\n field,\n fieldId,\n readOnly,\n size,\n}: {\n field: FieldControl;\n fieldId: string;\n readOnly: boolean;\n size: FormSize;\n}) {\n // A bounded number can opt into a single-thumb progress slider.\n if (field.schema[\"x-number-display\"] === \"slider\" && typeof field.schema.maximum === \"number\") {\n return <NumberSliderControl field={field} fieldId={fieldId} readOnly={readOnly} size={size} />;\n }\n // Default type=\"text\" (not number) so non-numeric values a consumer permits —\n // e.g. template tokens — are not silently dropped by the browser. A schema that\n // declares `multipleOf` opts into a real `<input type=\"number\">` (native step,\n // spin buttons, min/max), matching a hand-built numeric field.\n const coerce = field.coerceNumber !== false;\n const step = typeof field.schema.multipleOf === \"number\" ? field.schema.multipleOf : undefined;\n const native = step !== undefined && !(field.allowCustomValue && typeof field.value === \"string\" && field.value.includes(\"{{\"));\n // A static unit (e.g. \"%\") rides the right edge of the input as a display-only\n // suffix; a consumer-set `suffix` (e.g. an insert-snippet button) wins if both\n // are present (number insert triggers mount on the left as `prefix`).\n const suffix = field.suffix ?? (field.unit ? (\n <span className=\"pointer-events-none select-none text-muted-foreground\">{field.unit}</span>\n ) : undefined);\n return (\n <FieldAdornmentWrapper prefix={field.prefix} suffix={suffix}>\n <input\n id={fieldId}\n type={native ? \"number\" : \"text\"}\n inputMode=\"decimal\"\n {...(native\n ? {\n step,\n ...(typeof field.schema.minimum === \"number\" ? { min: field.schema.minimum } : {}),\n ...(typeof field.schema.maximum === \"number\" ? { max: field.schema.maximum } : {}),\n }\n : {})}\n data-jsf-input\n {...fieldAriaProps(field, fieldId)}\n className={cn(inputClass(size), field.prefix && \"pl-8\", suffix && \"pr-8\", field.inputClassName)}\n value={toText(field.value)}\n disabled={readOnly}\n placeholder={defaultPlaceholder(field.schema)}\n onChange={(e) => {\n const raw = e.target.value;\n // Coerce mid-typing ONLY when the parse round-trips to the same text\n // (e.g. \"100\", \"33.5\") — so an in-progress decimal like \"33.\" or a\n // trailing-zero \"33.30\" keeps its raw text instead of collapsing to a\n // number and stranding the caret. Non-numeric tokens fall through to\n // the raw string. Blur finalizes any still-uncoerced numeric text.\n if (coerce && raw.trim() !== \"\" && String(Number(raw)) === raw.trim()) {\n field.onChange(Number(raw));\n } else {\n field.onChange(raw);\n }\n }}\n onBlur={(e) => {\n const raw = e.target.value;\n if (coerce && raw.trim() !== \"\" && Number.isFinite(Number(raw))) {\n field.onChange(Number(raw));\n }\n }}\n />\n </FieldAdornmentWrapper>\n );\n}\n\n// A single-thumb range input styled with a progress-filled track. The input sits\n// above the track/fill divs; only its thumb is painted.\nconst SLIDER_INPUT_CLASS =\n \"absolute inset-0 h-6 w-full cursor-pointer appearance-none bg-transparent focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50 [&::-webkit-slider-runnable-track]:h-1 [&::-webkit-slider-runnable-track]:rounded-full [&::-webkit-slider-runnable-track]:bg-transparent [&::-webkit-slider-thumb]:size-3.5 [&::-webkit-slider-thumb]:-mt-[5px] [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:border [&::-webkit-slider-thumb]:border-background/80 [&::-webkit-slider-thumb]:bg-primary [&::-webkit-slider-thumb]:shadow-sm [&::-moz-range-track]:h-1 [&::-moz-range-track]:rounded-full [&::-moz-range-track]:bg-transparent [&::-moz-range-thumb]:size-3.5 [&::-moz-range-thumb]:appearance-none [&::-moz-range-thumb]:rounded-full [&::-moz-range-thumb]:border-0 [&::-moz-range-thumb]:bg-primary [&::-moz-range-thumb]:shadow-sm\";\n\n// NumberSliderControl renders a bounded number (`x-number-display: \"slider\"`) as\n// a single-thumb slider whose fill grows with the value, with the live value\n// shown to the right.\nexport function NumberSliderControl({\n field,\n fieldId,\n readOnly,\n size,\n}: {\n field: FieldControl;\n fieldId: string;\n readOnly: boolean;\n size: FormSize;\n}) {\n const min = typeof field.schema.minimum === \"number\" ? field.schema.minimum : 0;\n const max = typeof field.schema.maximum === \"number\" ? field.schema.maximum : 100;\n const step = typeof field.schema.multipleOf === \"number\" ? field.schema.multipleOf : 1;\n const raw = typeof field.value === \"number\" ? field.value : Number(toText(field.value));\n const hasValue = Number.isFinite(raw);\n const value = hasValue ? Math.min(max, Math.max(min, raw)) : min;\n const percent = max > min ? ((value - min) / (max - min)) * 100 : 0;\n return (\n <div className=\"flex items-center gap-3\">\n <div className=\"relative h-6 min-w-0 flex-1\">\n <div className=\"absolute inset-x-0 top-1/2 h-1 -translate-y-1/2 rounded-full bg-border\" />\n <div\n className=\"absolute left-0 top-1/2 h-1 -translate-y-1/2 rounded-full bg-primary/70\"\n style={{ width: `${percent}%` }}\n />\n <input\n id={fieldId}\n data-jsf-input\n type=\"range\"\n aria-label={field.label}\n {...fieldAriaProps(field, fieldId)}\n min={min}\n max={max}\n step={step}\n value={value}\n disabled={readOnly}\n className={cn(SLIDER_INPUT_CLASS, field.inputClassName)}\n onChange={(event) => field.onChange(Number(event.target.value))}\n />\n </div>\n <span className={cn(\"w-16 shrink-0 text-right tabular-nums\", labelSizeClass[size])}>\n {hasValue ? value.toLocaleString() : \"—\"}\n </span>\n </div>\n );\n}\n\n// DateControl edits a `format: date`/`date-time` string. Read-only, it shows the\n// human-readable absolute + relative form (e.g. \"Apr 15, 2026, 12:00 PM (2h\n// ago)\"); editable, a DateField in the schema's date or datetime mode. The raw\n// string is committed unchanged so a\n// consumer-permitted template token in the field is preserved.\nexport function DateControl({\n field,\n fieldId,\n readOnly,\n size,\n}: {\n field: FieldControl;\n fieldId: string;\n readOnly: boolean;\n size: FormSize;\n}) {\n const text = toText(field.value);\n if (!readOnly && field.allowCustomValue && text.includes(\"{{\")) {\n return <StringControl field={field} fieldId={fieldId} readOnly={readOnly} size={size} />;\n }\n if (readOnly) {\n return (\n <div\n id={fieldId}\n data-jsf-input\n className={cn(\"flex items-center text-foreground\", controlHeightClass[size], labelSizeClass[size])}\n title={text || undefined}\n >\n {text ? formatDateTimeRelative(text) : <span className=\"text-muted-foreground\">—</span>}\n </div>\n );\n }\n return (\n <DateField\n mode={field.dateFormat === \"date-time\" ? \"datetime\" : \"date\"}\n id={fieldId}\n aria-label={field.label}\n data-jsf-input\n {...fieldAriaProps(field, fieldId)}\n inputClassName={cn(inputClass(size), field.prefix && \"pl-8\", field.suffix ? \"pr-14\" : \"pr-8\")}\n value={text}\n onChange={(next) => field.onChange(next)}\n placeholder={defaultPlaceholder(field.schema)}\n prefix={field.prefix}\n suffix={field.suffix}\n />\n );\n}\n\nexport function BooleanControl({\n field,\n fieldId,\n readOnly,\n size,\n}: {\n field: FieldControl;\n fieldId: string;\n readOnly: boolean;\n size: FormSize;\n}) {\n // Only render a checkbox when the value is genuinely boolean (or unset).\n // A non-boolean value (e.g. a token a consumer left in place) renders as text\n // so it is preserved and editable.\n if (typeof field.value === \"boolean\" || field.value === undefined || field.value === null) {\n return (\n <div className={cn(\"flex items-center gap-1\", controlHeightClass[size])}>\n {field.prefix}\n <input\n id={fieldId}\n type=\"checkbox\"\n className=\"h-4 w-4 accent-primary\"\n {...fieldAriaProps(field, fieldId)}\n checked={field.value === true}\n disabled={readOnly}\n onChange={(e) => field.onChange(e.target.checked)}\n />\n </div>\n );\n }\n return <StringControl field={field} fieldId={fieldId} readOnly={readOnly} size={size} />;\n}\n\nexport function EnumControl({\n field,\n fieldId,\n readOnly,\n size,\n}: {\n field: FieldControl;\n fieldId: string;\n readOnly: boolean;\n size: FormSize;\n}) {\n const value = toText(field.value);\n const options = withSyntheticValue(field.options ?? [], value);\n if (field.display === \"grid\") {\n return <GridControl field={field} fieldId={fieldId} readOnly={readOnly} size={size} />;\n }\n if (field.display === \"radio\") {\n return (\n <RadioGroupControl field={field} fieldId={fieldId} readOnly={readOnly} options={options} value={value} size={size} />\n );\n }\n if (field.display === \"segmented\") {\n return (\n <SegmentedEnumControl field={field} fieldId={fieldId} readOnly={readOnly} options={options} value={value} size={size} />\n );\n }\n return (\n <Combobox\n id={fieldId}\n options={options}\n value={value}\n disabled={readOnly}\n size={size}\n allowCustomValue={field.allowCustomValue ?? false}\n onChange={(v) => field.onChange(v)}\n prefix={field.prefix}\n suffix={field.suffix}\n {...comboboxAriaProps(field, fieldId)}\n {...(field.inputClassName ? { className: field.inputClassName } : {})}\n {...(defaultPlaceholder(field.schema) ? { placeholder: defaultPlaceholder(field.schema) } : {})}\n />\n );\n}\n\n// LookupControl is the async entity-reference picker for an `x-clicky-lookup`\n// field. It wraps Combobox and fetches options lazily through the form's\n// LookupFetcher (from context): the head set loads when the menu opens and the\n// (debounced) typed query drives server-side search. Single-select keeps\n// allowCustomValue on so a value outside the option set still commits (e.g. an\n// inline DSN). When no fetcher is wired it degrades to a free-text combobox.\nexport function LookupControl({\n field,\n fieldId,\n readOnly,\n size,\n rootValue,\n}: {\n field: FieldControl;\n fieldId: string;\n readOnly: boolean;\n size: FormSize;\n rootValue?: Record<string, unknown>;\n}) {\n const fetcher = useLookupFetcher();\n const descriptor = field.lookup;\n const value = toText(field.value);\n const [options, setOptions] = useState<FieldOption[]>([]);\n const [loading, setLoading] = useState(false);\n\n // rootValue is read through a ref so onSearch stays referentially stable: a new\n // onSearch each render would retrigger Combobox's search effect on every\n // setOptions, looping. The scopeKey effect below re-fetches when scope changes.\n const rootRef = useRef(rootValue);\n rootRef.current = rootValue;\n\n const onSearch = useCallback(\n (query: string) => {\n if (!descriptor || !fetcher) return;\n setLoading(true);\n const root = rootRef.current;\n fetcher({ descriptor, query, ...(root ? { rootValue: root } : {}) })\n .then((next) => setOptions(next))\n .catch(() => setOptions([]))\n .finally(() => setLoading(false));\n },\n [descriptor, fetcher],\n );\n\n // Re-fetch the head set when the scope (a sibling field, e.g. provider type)\n // changes so the out-of-scope set is replaced rather than shown stale.\n const scopeKey = descriptor ? JSON.stringify(resolveLookupScope(descriptor, rootValue)) : \"\";\n useEffect(() => {\n if (descriptor && fetcher) onSearch(\"\");\n else setOptions([]);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [scopeKey, onSearch]);\n\n // A descriptor that declares a hierarchy browses its options as a tree rather\n // than scrolling one flat list. It owns the multi-value case too, since the\n // committed value is then an array rather than a single string.\n if (descriptor?.hierarchy) {\n return (\n <LookupTreeControl\n field={field}\n fieldId={fieldId}\n readOnly={readOnly}\n size={size}\n options={options}\n loading={loading}\n hierarchy={descriptor.hierarchy}\n />\n );\n }\n\n // A multi lookup commits an ARRAY, so it takes the tags picker rather than the\n // single-value combobox below — which would render the array as an empty box\n // and then overwrite it with a bare string. Without a fetcher the same control\n // renders the already-committed values with an empty option set.\n if (descriptor?.multi) {\n return (\n <TagsComboboxControl\n field={field}\n fieldId={fieldId}\n readOnly={readOnly}\n size={size}\n options={options}\n loading={loading}\n {...(fetcher ? { onSearch } : {})}\n />\n );\n }\n\n if (!descriptor || !fetcher) {\n return (\n <Combobox\n id={fieldId}\n options={withSyntheticValue([], value)}\n value={value}\n disabled={readOnly}\n size={size}\n allowCustomValue\n onChange={(v) => field.onChange(v)}\n {...comboboxAriaProps(field, fieldId)}\n {...(defaultPlaceholder(field.schema) ? { placeholder: defaultPlaceholder(field.schema) } : {})}\n />\n );\n }\n\n return (\n <Combobox\n id={fieldId}\n options={withSyntheticValue(options, value)}\n value={value}\n disabled={readOnly}\n size={size}\n loading={loading}\n allowCustomValue={field.allowCustomValue ?? false}\n onSearch={onSearch}\n onChange={(v) => field.onChange(v)}\n {...comboboxAriaProps(field, fieldId)}\n {...(defaultPlaceholder(field.schema) ? { placeholder: defaultPlaceholder(field.schema) } : {})}\n />\n );\n}\n\n// TextareaControl edits a long-form string in a multi-line box. Read-only, it\n// shows the value with line breaks preserved; editable, a resizable <textarea>.\n// The raw string is committed unchanged so a consumer-permitted template token\n// survives.\nexport function TextareaControl({\n field,\n fieldId,\n readOnly,\n size,\n}: {\n field: FieldControl;\n fieldId: string;\n readOnly: boolean;\n size: FormSize;\n}) {\n const text = toText(field.value);\n if (readOnly) {\n return (\n <span\n id={fieldId}\n data-jsf-input\n data-jsf-readonly\n className={cn(\"block whitespace-pre-wrap break-words text-foreground\", labelSizeClass[size])}\n title={text || undefined}\n >\n {text || <span className=\"text-muted-foreground\">—</span>}\n </span>\n );\n }\n return (\n <FieldAdornmentWrapper prefix={field.prefix} suffix={field.suffix}>\n <textarea\n id={fieldId}\n data-jsf-input\n {...fieldAriaProps(field, fieldId)}\n rows={4}\n className={cn(\n inputClass(size),\n \"h-auto min-h-[5rem] resize-y\",\n field.prefix && \"pl-8\",\n field.suffix && \"pr-8\",\n field.inputClassName,\n )}\n value={text}\n disabled={readOnly}\n placeholder={defaultPlaceholder(field.schema)}\n onChange={(e) => field.onChange(e.target.value)}\n />\n </FieldAdornmentWrapper>\n );\n}\n\nexport function MarkdownControl({\n field,\n fieldId,\n readOnly,\n size,\n}: {\n field: FieldControl;\n fieldId: string;\n readOnly: boolean;\n size: FormSize;\n}) {\n const fallback = (\n <textarea\n id={fieldId}\n data-jsf-input\n {...fieldAriaProps(field, fieldId)}\n rows={6}\n className={cn(inputClass(size), \"h-auto resize-y font-mono\", field.prefix && \"pl-8\", field.suffix && \"pr-8\")}\n value={toText(field.value)}\n disabled={readOnly}\n placeholder={defaultPlaceholder(field.schema)}\n onChange={(e) => field.onChange(e.target.value)}\n />\n );\n\n return (\n <Suspense fallback={fallback}>\n <LazyMdxEditorField\n id={fieldId}\n value={toText(field.value)}\n readOnly={readOnly}\n size={size}\n placeholder={defaultPlaceholder(field.schema)}\n onChange={(next) => field.onChange(next)}\n {...field.markdownOptions}\n />\n </Suspense>\n );\n}\n\n// DisplayControl renders a static, non-editable presentation element:\n// Label/Title (heading), Message (info text), Line (divider), or Blank/Filler\n// (spacer). It never collects a value; the heading/text source is the field's\n// title (label) and, for \"text\", its description. Rendered identically in the\n// form and the read-only Viewer.\nexport function DisplayControl({ field, size }: { field: FieldControl; size: FormSize }) {\n const variant = field.displayVariant ?? \"text\";\n if (variant === \"divider\") {\n return <hr data-jsf-input className=\"my-1 w-full border-t border-border\" />;\n }\n if (variant === \"spacer\") {\n return <div data-jsf-input aria-hidden className=\"h-2\" />;\n }\n if (variant === \"heading\") {\n return (\n <div\n data-jsf-input\n className={cn(\"border-b border-border pb-1 font-semibold text-foreground\", labelSizeClass[size])}\n >\n {field.label}\n </div>\n );\n }\n const text = field.description ?? toText(field.value) ?? field.label;\n return (\n <p data-jsf-input className={cn(\"text-muted-foreground\", labelSizeClass[size])}>\n {text || field.label}\n </p>\n );\n}\n\n// LinkControl renders a read-only external hyperlink. The\n// href is field.href, falling back to the value when it is an absolute URL; with\n// neither it degrades to a plain read-only value.\nexport function LinkControl({ field, fieldId, size }: { field: FieldControl; fieldId: string; size: FormSize }) {\n const text = toText(field.value);\n const href = field.href ?? (/^https?:\\/\\//i.test(text) ? text : undefined);\n if (!href) {\n return <ReadOnlyValue field={field} fieldId={fieldId} size={size} />;\n }\n return (\n <a\n id={fieldId}\n data-jsf-input\n href={href}\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n className={cn(\"inline-flex items-center text-primary underline underline-offset-2\", controlHeightClass[size], labelSizeClass[size])}\n >\n {text || field.label || href}\n </a>\n );\n}\n\n// HMR probe\n// HMR probe 2\n"],"names":["lazy","toText","formatDateTimeRelative","jsx","cn","controlHeightClass","labelSizeClass","jsxs","fieldAriaProps","inputClass","defaultPlaceholder","DateField","withSyntheticValue","GridControl","RadioGroupControl","SegmentedEnumControl","Combobox","comboboxAriaProps","useLookupFetcher","useState","useRef","useCallback","resolveLookupScope","useEffect","LookupTreeControl","TagsComboboxControl","Suspense"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json-schema-form-fields.d.ts","sourceRoot":"","sources":["../../src/components/json-schema-form-fields.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,YAAY,EAAe,MAAM,0BAA0B,CAAC;AAS1E,OAAO,EAGL,KAAK,QAAQ,EACd,MAAM,yBAAyB,CAAC;AAWjC,wBAAgB,aAAa,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;IAAE,KAAK,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,+BAe/G;AA0BD,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EACL,OAAO,EACP,QAAQ,EACR,IAAI,GACL,EAAE;IACD,KAAK,EAAE,YAAY,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,QAAQ,CAAC;CAChB,+BAmBA;AAED,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EACL,OAAO,EACP,QAAQ,EACR,IAAI,GACL,EAAE;IACD,KAAK,EAAE,YAAY,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,QAAQ,CAAC;CAChB,+BA2DA;AAUD,wBAAgB,mBAAmB,CAAC,EAClC,KAAK,EACL,OAAO,EACP,QAAQ,EACR,IAAI,GACL,EAAE;IACD,KAAK,EAAE,YAAY,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,QAAQ,CAAC;CAChB,+BAoCA;AAOD,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,OAAO,EACP,QAAQ,EACR,IAAI,GACL,EAAE;IACD,KAAK,EAAE,YAAY,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,QAAQ,CAAC;CAChB,+BAgCA;AAED,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,OAAO,EACP,QAAQ,EACR,IAAI,GACL,EAAE;IACD,KAAK,EAAE,YAAY,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,QAAQ,CAAC;CAChB,+BAqBA;AAED,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,OAAO,EACP,QAAQ,EACR,IAAI,GACL,EAAE;IACD,KAAK,EAAE,YAAY,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,QAAQ,CAAC;CAChB,+BAgCA;
|
|
1
|
+
{"version":3,"file":"json-schema-form-fields.d.ts","sourceRoot":"","sources":["../../src/components/json-schema-form-fields.tsx"],"names":[],"mappings":"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"}
|