@mastra/playground-ui 69.0.0-alpha.1 → 69.0.0-alpha.2
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/components.css +6 -0
- package/dist/{CodeEditor-ZoBu3Gjw.js → CodeEditor-BqAM9L7t.js} +5 -2
- package/dist/{CodeEditor-ZoBu3Gjw.js.map → CodeEditor-BqAM9L7t.js.map} +1 -1
- package/dist/{CodeEditor-DHIDfP5g.cjs → CodeEditor-zMSUzPdX.cjs} +5 -2
- package/dist/{CodeEditor-DHIDfP5g.cjs.map → CodeEditor-zMSUzPdX.cjs.map} +1 -1
- package/dist/{Comment-rQxuMDQv.cjs → Comment-A07IvOt2.cjs} +3 -3
- package/dist/{Comment-rQxuMDQv.cjs.map → Comment-A07IvOt2.cjs.map} +1 -1
- package/dist/{Comment-2q9SomE2.js → Comment-D_gSx7oM.js} +3 -3
- package/dist/{Comment-2q9SomE2.js.map → Comment-D_gSx7oM.js.map} +1 -1
- package/dist/{Composer-u1K6edoZ.cjs → Composer-D2BqRyb5.cjs} +2 -2
- package/dist/Composer-D2BqRyb5.cjs.map +1 -0
- package/dist/{Composer-bVE8qK52.js → Composer-kjwmlIgL.js} +2 -2
- package/dist/Composer-kjwmlIgL.js.map +1 -0
- package/dist/{DataCodeSection-CTodi9wg.js → DataCodeSection-CcX8Z68Y.js} +2 -2
- package/dist/{DataCodeSection-CTodi9wg.js.map → DataCodeSection-CcX8Z68Y.js.map} +1 -1
- package/dist/{DataCodeSection-7SvRJj6f.cjs → DataCodeSection-JPGTWLcL.cjs} +2 -2
- package/dist/{DataCodeSection-7SvRJj6f.cjs.map → DataCodeSection-JPGTWLcL.cjs.map} +1 -1
- package/dist/{DataDetailsPanel-BDoD6pxx.cjs → DataDetailsPanel-DCMlaG7j.cjs} +2 -2
- package/dist/{DataDetailsPanel-BDoD6pxx.cjs.map → DataDetailsPanel-DCMlaG7j.cjs.map} +1 -1
- package/dist/{DataDetailsPanel-BU05psHL.js → DataDetailsPanel-mTfbbQho.js} +2 -2
- package/dist/{DataDetailsPanel-BU05psHL.js.map → DataDetailsPanel-mTfbbQho.js.map} +1 -1
- package/dist/{DataPanel-BRRAvWYQ.cjs → DataPanel-LfExjFpP.cjs} +2 -2
- package/dist/{DataPanel-BRRAvWYQ.cjs.map → DataPanel-LfExjFpP.cjs.map} +1 -1
- package/dist/{DataPanel-pVr5LVaK.js → DataPanel-Rv5Mb_pf.js} +2 -2
- package/dist/{DataPanel-pVr5LVaK.js.map → DataPanel-Rv5Mb_pf.js.map} +1 -1
- package/dist/{FilterBar-CFacnMNl.js → FilterBar-DgHNtsDI.js} +5 -5
- package/dist/FilterBar-DgHNtsDI.js.map +1 -0
- package/dist/{FilterBar-CR8nbvoe.cjs → FilterBar-O8SYau_Q.cjs} +5 -5
- package/dist/FilterBar-O8SYau_Q.cjs.map +1 -0
- package/dist/{Tree-kgLG4IbP.cjs → Tree-6pubDJLQ.cjs} +2 -2
- package/dist/Tree-6pubDJLQ.cjs.map +1 -0
- package/dist/{Tree-D1_VJClB.js → Tree-DpRLmis3.js} +2 -2
- package/dist/Tree-DpRLmis3.js.map +1 -0
- package/dist/{Workflow-CXRv3YXx.js → Workflow-BVVYys0W.js} +2 -2
- package/dist/{Workflow-CXRv3YXx.js.map → Workflow-BVVYys0W.js.map} +1 -1
- package/dist/{Workflow-DIfTVqZs.cjs → Workflow-CwIjxwC6.cjs} +2 -2
- package/dist/{Workflow-DIfTVqZs.cjs.map → Workflow-CwIjxwC6.cjs.map} +1 -1
- package/dist/{ask-user-D4ezQ6pt.js → ask-user-CqzPUD9E.js} +2 -2
- package/dist/{ask-user-D4ezQ6pt.js.map → ask-user-CqzPUD9E.js.map} +1 -1
- package/dist/{ask-user-DcnUNMM5.cjs → ask-user-DIYcPkoX.cjs} +2 -2
- package/dist/{ask-user-DcnUNMM5.cjs.map → ask-user-DIYcPkoX.cjs.map} +1 -1
- package/dist/{combobox-lbSxWRMl.js → combobox-DLdInLYm.js} +2 -2
- package/dist/{combobox-lbSxWRMl.js.map → combobox-DLdInLYm.js.map} +1 -1
- package/dist/{combobox-i723LxeC.cjs → combobox-DU2jsrGa.cjs} +2 -2
- package/dist/{combobox-i723LxeC.cjs.map → combobox-DU2jsrGa.cjs.map} +1 -1
- package/dist/{combobox-parts-BeNqgCbj.cjs → combobox-parts-C236ZHtn.cjs} +2 -2
- package/dist/combobox-parts-C236ZHtn.cjs.map +1 -0
- package/dist/{combobox-parts-C9o4UfH_.js → combobox-parts-_m3Qgmci.js} +2 -2
- package/dist/combobox-parts-_m3Qgmci.js.map +1 -0
- package/dist/components/CodeEditor.cjs.js +1 -1
- package/dist/components/CodeEditor.es.js +1 -1
- package/dist/components/Combobox.cjs.js +2 -2
- package/dist/components/Combobox.es.js +2 -2
- package/dist/components/Command.cjs.js +1 -1
- package/dist/components/Command.cjs.js.map +1 -1
- package/dist/components/Command.es.js +1 -1
- package/dist/components/Command.es.js.map +1 -1
- package/dist/components/Comment.cjs.js +1 -1
- package/dist/components/Comment.es.js +1 -1
- package/dist/components/Composer.cjs.js +1 -1
- package/dist/components/Composer.es.js +1 -1
- package/dist/components/DataCodeSection.cjs.js +1 -1
- package/dist/components/DataCodeSection.es.js +1 -1
- package/dist/components/DataDetailsPanel.cjs.js +1 -1
- package/dist/components/DataDetailsPanel.es.js +1 -1
- package/dist/components/DataList.cjs.js +1 -1
- package/dist/components/DataList.es.js +1 -1
- package/dist/components/DataPanel.cjs.js +1 -1
- package/dist/components/DataPanel.es.js +1 -1
- package/dist/components/DateTimePicker.cjs.js +1 -1
- package/dist/components/DateTimePicker.es.js +1 -1
- package/dist/components/DateTimeRangePicker.cjs.js +1 -1
- package/dist/components/DateTimeRangePicker.es.js +1 -1
- package/dist/components/EnvironmentVariablesEditor.cjs.js +1 -1
- package/dist/components/EnvironmentVariablesEditor.es.js +1 -1
- package/dist/components/FilterBar.cjs.js +3 -3
- package/dist/components/FilterBar.es.js +3 -3
- package/dist/components/FormFieldBlocks.cjs.js +1 -1
- package/dist/components/FormFieldBlocks.es.js +1 -1
- package/dist/components/Input.cjs.js +1 -1
- package/dist/components/Input.es.js +1 -1
- package/dist/components/InputGroup.cjs.js +1 -1
- package/dist/components/InputGroup.es.js +1 -1
- package/dist/components/InputNumber.cjs.js +1 -1
- package/dist/components/InputNumber.es.js +1 -1
- package/dist/components/JSONSchemaForm.cjs.js +1 -1
- package/dist/components/JSONSchemaForm.es.js +1 -1
- package/dist/components/PropertyFilter.cjs.js +2 -2
- package/dist/components/PropertyFilter.es.js +2 -2
- package/dist/components/RuleBuilder.cjs.js +1 -1
- package/dist/components/RuleBuilder.es.js +1 -1
- package/dist/components/SavedViews.cjs.js +2 -2
- package/dist/components/SavedViews.cjs.js.map +1 -1
- package/dist/components/SavedViews.es.js +2 -2
- package/dist/components/SavedViews.es.js.map +1 -1
- package/dist/components/SearchInput.cjs.js +1 -1
- package/dist/components/SearchInput.es.js +1 -1
- package/dist/components/SideDialog.cjs.js +1 -1
- package/dist/components/SideDialog.es.js +1 -1
- package/dist/components/Textarea.cjs.js +1 -1
- package/dist/components/Textarea.cjs.js.map +1 -1
- package/dist/components/Textarea.es.js +1 -1
- package/dist/components/Textarea.es.js.map +1 -1
- package/dist/components/Tree.cjs.js +1 -1
- package/dist/components/Tree.es.js +1 -1
- package/dist/components/Workflow.cjs.js +1 -1
- package/dist/components/Workflow.es.js +1 -1
- package/dist/components/ai/ask-user.cjs.js +1 -1
- package/dist/components/ai/ask-user.es.js +1 -1
- package/dist/{date-time-range-picker-BUjjjvo8.js → date-time-range-picker-CJyhcug7.js} +2 -2
- package/dist/{date-time-range-picker-BUjjjvo8.js.map → date-time-range-picker-CJyhcug7.js.map} +1 -1
- package/dist/{date-time-range-picker-2a-wUBTk.cjs → date-time-range-picker-Dhnuwa-U.cjs} +2 -2
- package/dist/{date-time-range-picker-2a-wUBTk.cjs.map → date-time-range-picker-Dhnuwa-U.cjs.map} +1 -1
- package/dist/domains/chat/attachments/composer-attachment-list.cjs.js +1 -1
- package/dist/domains/chat/attachments/composer-attachment-list.es.js +1 -1
- package/dist/domains/chat/components/network-choice-metadata-dialog.cjs.js +1 -1
- package/dist/domains/chat/components/network-choice-metadata-dialog.es.js +1 -1
- package/dist/domains/chat/messages/dataset-save-action.cjs.js +1 -1
- package/dist/domains/chat/messages/dataset-save-action.es.js +1 -1
- package/dist/domains/chat/messages/message-row.cjs.js +1 -1
- package/dist/domains/chat/messages/message-row.es.js +1 -1
- package/dist/domains/chat/tools/badges/agent-badge-wrapper.cjs.js +1 -1
- package/dist/domains/chat/tools/badges/agent-badge-wrapper.es.js +1 -1
- package/dist/domains/chat/tools/badges/agent-badge.cjs.js +1 -1
- package/dist/domains/chat/tools/badges/agent-badge.es.js +1 -1
- package/dist/domains/chat/tools/badges/ask-user-badge.cjs.js +1 -1
- package/dist/domains/chat/tools/badges/ask-user-badge.es.js +1 -1
- package/dist/domains/chat/tools/badges/background-task-metadata-dialog.cjs.js +1 -1
- package/dist/domains/chat/tools/badges/background-task-metadata-dialog.es.js +1 -1
- package/dist/domains/chat/tools/badges/code-mode-badge.cjs.js +1 -1
- package/dist/domains/chat/tools/badges/code-mode-badge.es.js +1 -1
- package/dist/domains/chat/tools/badges/tool-badge.cjs.js +1 -1
- package/dist/domains/chat/tools/badges/tool-badge.es.js +1 -1
- package/dist/domains/chat/tools/badges/workflow-badge.cjs.js +1 -1
- package/dist/domains/chat/tools/badges/workflow-badge.es.js +1 -1
- package/dist/domains/chat/tools/mcp-input-request-tool.cjs.js +2 -2
- package/dist/domains/chat/tools/mcp-input-request-tool.es.js +2 -2
- package/dist/domains/chat/tools/tool-card.cjs.js +1 -1
- package/dist/domains/chat/tools/tool-card.es.js +1 -1
- package/dist/domains/datasets/components/add-dataset-item-dialog/add-dataset-item-dialog.cjs.js +1 -1
- package/dist/domains/datasets/components/add-dataset-item-dialog/add-dataset-item-dialog.es.js +1 -1
- package/dist/domains/datasets/components/add-dataset-item-dialog/trajectory-editor.cjs.js +2 -2
- package/dist/domains/datasets/components/add-dataset-item-dialog/trajectory-editor.es.js +2 -2
- package/dist/domains/datasets/components/save-as-dataset-item-dialog.cjs.js +2 -2
- package/dist/domains/datasets/components/save-as-dataset-item-dialog.es.js +2 -2
- package/dist/domains/knowledge/components/KnowledgePageExplorer.cjs.js +2 -2
- package/dist/domains/knowledge/components/KnowledgePageExplorer.es.js +2 -2
- package/dist/domains/logs/components/log-data-panel.cjs.js +1 -1
- package/dist/domains/logs/components/log-data-panel.es.js +1 -1
- package/dist/domains/logs/components/logs-saved-views.cjs.js +1 -1
- package/dist/domains/logs/components/logs-saved-views.es.js +1 -1
- package/dist/domains/logs/components/logs-toolbar.cjs.js +1 -1
- package/dist/domains/logs/components/logs-toolbar.es.js +1 -1
- package/dist/domains/metrics/components/date-range-selector.cjs.js +1 -1
- package/dist/domains/metrics/components/date-range-selector.es.js +1 -1
- package/dist/domains/metrics/components/metrics-time-range-chip.cjs.js +1 -1
- package/dist/domains/metrics/components/metrics-time-range-chip.es.js +1 -1
- package/dist/domains/observability/saved-views/observability-saved-views.cjs.js +1 -1
- package/dist/domains/observability/saved-views/observability-saved-views.es.js +1 -1
- package/dist/domains/observability/saved-views.cjs.js +1 -1
- package/dist/domains/observability/saved-views.es.js +1 -1
- package/dist/domains/observability.cjs.js +1 -1
- package/dist/domains/observability.es.js +1 -1
- package/dist/domains/scores/components/score-data-panel.cjs.js +1 -1
- package/dist/domains/scores/components/score-data-panel.es.js +1 -1
- package/dist/domains/scores/components/span-scoring.cjs.js +1 -1
- package/dist/domains/scores/components/span-scoring.es.js +1 -1
- package/dist/domains/skills/skill-simple-form.cjs.js +2 -2
- package/dist/domains/skills/skill-simple-form.es.js +2 -2
- package/dist/domains/spans/components/spans-explorer-body.cjs.js +1 -1
- package/dist/domains/spans/components/spans-explorer-body.es.js +1 -1
- package/dist/domains/spans/components/spans-filter-bar.cjs.js +2 -2
- package/dist/domains/spans/components/spans-filter-bar.es.js +2 -2
- package/dist/domains/spans/hooks/use-spans-filter-bar.cjs.js +1 -1
- package/dist/domains/spans/hooks/use-spans-filter-bar.es.js +1 -1
- package/dist/domains/threads/components/threads-explorer-body.cjs.js +1 -1
- package/dist/domains/threads/components/threads-explorer-body.es.js +1 -1
- package/dist/domains/threads/components/threads-filter-bar.cjs.js +2 -2
- package/dist/domains/threads/components/threads-filter-bar.es.js +2 -2
- package/dist/domains/threads/hooks/use-threads-filter-bar.cjs.js +1 -1
- package/dist/domains/threads/hooks/use-threads-filter-bar.es.js +1 -1
- package/dist/domains/traces/components/feedback-thread.cjs.js +2 -2
- package/dist/domains/traces/components/feedback-thread.es.js +2 -2
- package/dist/domains/traces/components/span-data-panel-view.cjs.js +1 -1
- package/dist/domains/traces/components/span-data-panel-view.es.js +1 -1
- package/dist/domains/traces/components/span-details-view.cjs.js +1 -1
- package/dist/domains/traces/components/span-details-view.es.js +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-json.cjs.js +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-json.es.js +1 -1
- package/dist/domains/traces/components/span-summary-description.cjs.js +1 -1
- package/dist/domains/traces/components/span-summary-description.es.js +1 -1
- package/dist/domains/traces/components/thread-trace/thread-trace-details.cjs.js +1 -1
- package/dist/domains/traces/components/thread-trace/thread-trace-details.es.js +1 -1
- package/dist/domains/traces/components/trace-columns-menu.cjs.js +1 -1
- package/dist/domains/traces/components/trace-columns-menu.es.js +1 -1
- package/dist/domains/traces/components/trace-data-panel-view.cjs.js +1 -1
- package/dist/domains/traces/components/trace-data-panel-view.es.js +1 -1
- package/dist/domains/traces/components/trace-details-view.cjs.js +1 -1
- package/dist/domains/traces/components/trace-details-view.es.js +1 -1
- package/dist/domains/traces/components/trace-id-button.cjs.js +1 -1
- package/dist/domains/traces/components/trace-id-button.es.js +1 -1
- package/dist/domains/traces/components/trace-summary-description.cjs.js +1 -1
- package/dist/domains/traces/components/trace-summary-description.es.js +1 -1
- package/dist/domains/traces/components/trace-thread-panel.cjs.js +1 -1
- package/dist/domains/traces/components/trace-thread-panel.es.js +1 -1
- package/dist/domains/traces/components/traces-explorer/traces-explorer-filter-bar.cjs.js +2 -2
- package/dist/domains/traces/components/traces-explorer/traces-explorer-filter-bar.es.js +2 -2
- package/dist/domains/traces/components/traces-explorer/traces-explorer-saved-views.cjs.js +1 -1
- package/dist/domains/traces/components/traces-explorer/traces-explorer-saved-views.es.js +1 -1
- package/dist/domains/traces/components/traces-explorer/use-traces-filter-bar.cjs.js +1 -1
- package/dist/domains/traces/components/traces-explorer/use-traces-filter-bar.es.js +1 -1
- package/dist/domains/workflows/components/workflow-combobox.cjs.js +1 -1
- package/dist/domains/workflows/components/workflow-combobox.es.js +1 -1
- package/dist/domains/workflows/components/workflow-layout.cjs.js +1 -1
- package/dist/domains/workflows/components/workflow-layout.es.js +1 -1
- package/dist/domains/workflows/components/workflow-step-detail.cjs.js +2 -2
- package/dist/domains/workflows/components/workflow-step-detail.es.js +2 -2
- package/dist/domains/workflows/workflow/data/workflow-data-button.cjs.js +1 -1
- package/dist/domains/workflows/workflow/data/workflow-data-button.es.js +1 -1
- package/dist/domains/workflows/workflow/data/workflow-data-inspector.cjs.js +1 -1
- package/dist/domains/workflows/workflow/data/workflow-data-inspector.es.js +1 -1
- package/dist/domains/workflows/workflow/input/workflow-json-input.cjs.js +1 -1
- package/dist/domains/workflows/workflow/input/workflow-json-input.es.js +1 -1
- package/dist/domains/workflows/workflow/use-workflow-graph-runtime.cjs.js +1 -1
- package/dist/domains/workflows/workflow/use-workflow-graph-runtime.es.js +1 -1
- package/dist/domains/workflows/workflow/utils.cjs.js +1 -1
- package/dist/domains/workflows/workflow/utils.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-body-graph.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-body-graph.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-data-edge.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-data-edge.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-debug-step-controls.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-debug-step-controls.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-graph-inner.cjs.js +2 -2
- package/dist/domains/workflows/workflow/workflow-graph-inner.es.js +2 -2
- package/dist/domains/workflows/workflow/workflow-graph-layout.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-graph-layout.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-graph-node.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-graph-node.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-graph.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-graph.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-map-config-dialog.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-map-config-dialog.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-nested-graph.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-nested-graph.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-run-data.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-run-data.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-status.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-status.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-step-action-bar.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-step-action-bar.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-step-node-utils.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-step-node-utils.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-suspended-steps.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-suspended-steps.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-time-travel-form.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-time-travel-form.es.js +1 -1
- package/dist/domains/workspace/components/workspace-create-directory.cjs.js +1 -1
- package/dist/domains/workspace/components/workspace-create-directory.es.js +1 -1
- package/dist/domains/workspace/components/workspace-search.cjs.js +1 -1
- package/dist/domains/workspace/components/workspace-search.es.js +1 -1
- package/dist/domains/workspace/components/workspace-tree.cjs.js +1 -1
- package/dist/domains/workspace/components/workspace-tree.es.js +1 -1
- package/dist/ee/signals/settings/signal-definition-form-dialog.cjs.js +1 -1
- package/dist/ee/signals/settings/signal-definition-form-dialog.es.js +1 -1
- package/dist/ee/signals/settings/trace-signal-settings.cjs.js +1 -1
- package/dist/ee/signals/settings/trace-signal-settings.es.js +1 -1
- package/dist/{filter-bar-chip-NBtfDca9.js → filter-bar-chip-Cz5GYBWP.js} +2 -2
- package/dist/{filter-bar-chip-NBtfDca9.js.map → filter-bar-chip-Cz5GYBWP.js.map} +1 -1
- package/dist/{filter-bar-chip-DFsbUZ-V.cjs → filter-bar-chip-q2Zr-cnY.cjs} +2 -2
- package/dist/{filter-bar-chip-DFsbUZ-V.cjs.map → filter-bar-chip-q2Zr-cnY.cjs.map} +1 -1
- package/dist/{filter-bar-time-range-CEgdThCy.cjs → filter-bar-time-range-D4C3kU0J.cjs} +3 -3
- package/dist/{filter-bar-time-range-CEgdThCy.cjs.map → filter-bar-time-range-D4C3kU0J.cjs.map} +1 -1
- package/dist/{filter-bar-time-range-CHSMbpPd.js → filter-bar-time-range-ao2YiYEJ.js} +3 -3
- package/dist/{filter-bar-time-range-CHSMbpPd.js.map → filter-bar-time-range-ao2YiYEJ.js.map} +1 -1
- package/dist/{input-Cyit5ZSc.js → input-BNykbvOz.js} +2 -2
- package/dist/input-BNykbvOz.js.map +1 -0
- package/dist/{input-BpnUsQSt.cjs → input-D_V0m95F.cjs} +2 -2
- package/dist/input-D_V0m95F.cjs.map +1 -0
- package/dist/{input-group-NV4ZzKOk.js → input-group-CCSyY4J5.js} +3 -3
- package/dist/{input-group-NV4ZzKOk.js.map → input-group-CCSyY4J5.js.map} +1 -1
- package/dist/{input-group-DBCilXjT.cjs → input-group-Da8HBo30.cjs} +3 -3
- package/dist/{input-group-DBCilXjT.cjs.map → input-group-Da8HBo30.cjs.map} +1 -1
- package/dist/layout/tabbed-container.cjs.js +1 -1
- package/dist/layout/tabbed-container.es.js +1 -1
- package/dist/lib/form/components/number-field.cjs.js +1 -1
- package/dist/lib/form/components/number-field.es.js +1 -1
- package/dist/lib/form/components/record-field.cjs.js +1 -1
- package/dist/lib/form/components/record-field.es.js +1 -1
- package/dist/{observability-saved-views-UM8HBJ6J.cjs → observability-saved-views-CzRPN_9m.cjs} +3 -3
- package/dist/{observability-saved-views-UM8HBJ6J.cjs.map → observability-saved-views-CzRPN_9m.cjs.map} +1 -1
- package/dist/{observability-saved-views-lLWk1w0g.js → observability-saved-views-hu_hkXVY.js} +3 -3
- package/dist/{observability-saved-views-lLWk1w0g.js.map → observability-saved-views-hu_hkXVY.js.map} +1 -1
- package/dist/primitives/menu-item.cjs.js +1 -1
- package/dist/primitives/menu-item.cjs.js.map +1 -1
- package/dist/primitives/menu-item.es.js +1 -1
- package/dist/primitives/menu-item.es.js.map +1 -1
- package/dist/{property-filter-applied-iYDdM1hb.cjs → property-filter-applied-ML84st6J.cjs} +2 -2
- package/dist/{property-filter-applied-iYDdM1hb.cjs.map → property-filter-applied-ML84st6J.cjs.map} +1 -1
- package/dist/{property-filter-applied-BBVmWRsC.js → property-filter-applied-PaJ7sLsM.js} +2 -2
- package/dist/{property-filter-applied-BBVmWRsC.js.map → property-filter-applied-PaJ7sLsM.js.map} +1 -1
- package/dist/style.css +6 -0
- package/dist/{tabbed-container-Bmk5dgJ4.cjs → tabbed-container-BMLD6mvc.cjs} +2 -2
- package/dist/{tabbed-container-Bmk5dgJ4.cjs.map → tabbed-container-BMLD6mvc.cjs.map} +1 -1
- package/dist/{tabbed-container-9yvqEQON.js → tabbed-container-CaS8cZCS.js} +2 -2
- package/dist/{tabbed-container-9yvqEQON.js.map → tabbed-container-CaS8cZCS.js.map} +1 -1
- package/dist/{tool-card-BjOV2sXi.js → tool-card-CM0aHG3p.js} +2 -2
- package/dist/{tool-card-BjOV2sXi.js.map → tool-card-CM0aHG3p.js.map} +1 -1
- package/dist/{tool-card-CO_3C_Bn.cjs → tool-card-xDlCD0m6.cjs} +2 -2
- package/dist/{tool-card-CO_3C_Bn.cjs.map → tool-card-xDlCD0m6.cjs.map} +1 -1
- package/dist/{use-workflow-graph-runtime-D_PpEIQ5.cjs → use-workflow-graph-runtime-DEJA9rk4.cjs} +2 -2
- package/dist/{use-workflow-graph-runtime-D_PpEIQ5.cjs.map → use-workflow-graph-runtime-DEJA9rk4.cjs.map} +1 -1
- package/dist/{use-workflow-graph-runtime-B_dKpjUe.js → use-workflow-graph-runtime-DHOsA1DM.js} +2 -2
- package/dist/{use-workflow-graph-runtime-B_dKpjUe.js.map → use-workflow-graph-runtime-DHOsA1DM.js.map} +1 -1
- package/package.json +3 -3
- package/dist/Composer-bVE8qK52.js.map +0 -1
- package/dist/Composer-u1K6edoZ.cjs.map +0 -1
- package/dist/FilterBar-CFacnMNl.js.map +0 -1
- package/dist/FilterBar-CR8nbvoe.cjs.map +0 -1
- package/dist/Tree-D1_VJClB.js.map +0 -1
- package/dist/Tree-kgLG4IbP.cjs.map +0 -1
- package/dist/combobox-parts-BeNqgCbj.cjs.map +0 -1
- package/dist/combobox-parts-C9o4UfH_.js.map +0 -1
- package/dist/input-BpnUsQSt.cjs.map +0 -1
- package/dist/input-Cyit5ZSc.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ask-user-D4ezQ6pt.js","names":["_Fragment"],"sources":["../src/ds/components/ai/ask-user/ask-user-context.ts","../src/ds/components/ai/ask-user/ask-user-layout.tsx","../src/ds/components/ai/ask-user/ask-user-controls.tsx","../src/ds/components/ai/ask-user/ask-user-root.tsx","../src/ds/components/ai/ask-user/ask-user-card.tsx"],"sourcesContent":["import { createContext, useContext } from 'react';\nimport type { AskUserSelectionMode } from './ask-user-types';\n\ninterface AskUserContextValue {\n questionId: string;\n selectionMode: AskUserSelectionMode;\n disabled: boolean;\n answerText: string;\n selectedOptionLabels: string[];\n isCustomAnswerSelected: boolean;\n canSubmitAnswer: boolean;\n selectOption: (optionLabel: string) => void;\n setCustomAnswerSelected: (selected: boolean) => void;\n changeAnswerText: (text: string) => void;\n unselectEmptyCustomAnswer: () => void;\n submitAnswer: () => void;\n}\n\nexport const AskUserContext = createContext<AskUserContextValue | undefined>(undefined);\n\nexport function useOptionalAskUserContext() {\n return useContext(AskUserContext);\n}\n\nexport function useAskUserContext() {\n const context = useOptionalAskUserContext();\n if (!context) throw new Error('AskUser controls must be rendered inside AskUser.Root.');\n return context;\n}\n","import { Check, MessageCircleQuestion } from 'lucide-react';\nimport type { ComponentProps, ReactNode } from 'react';\nimport { useOptionalAskUserContext } from './ask-user-context';\nimport type { AskUserResult } from './ask-user-types';\nimport { Badge } from '@/ds/components/Badge';\nimport { Button } from '@/ds/components/Button';\nimport { FieldItem, FieldLabel } from '@/ds/components/Field';\nimport type { FieldLabelProps } from '@/ds/components/Field';\nimport { Txt } from '@/ds/components/Txt';\nimport { Icon } from '@/ds/icons/Icon';\nimport { raisedSurfaceStyle } from '@/ds/primitives/raised-surface';\nimport { cn } from '@/lib/utils';\n\nexport const AskUserContainer = ({ className, ...props }: ComponentProps<'div'>) => (\n <div\n data-slot=\"ask-user\"\n className={cn(raisedSurfaceStyle, 'w-full overflow-hidden rounded-xl', className)}\n {...props}\n />\n);\n\nexport const AskUserLabel = ({ children = 'Question', className, ...props }: ComponentProps<'div'>) => (\n <div data-slot=\"ask-user-label\" className={cn('flex min-h-10 items-center gap-2 px-4 pt-3', className)} {...props}>\n <Icon size=\"xs\" className=\"text-muted-foreground\">\n <MessageCircleQuestion />\n </Icon>\n <Txt as=\"span\" variant=\"caption\" tone=\"muted\">\n {children}\n </Txt>\n </div>\n);\n\nexport const AskUserBody = ({ className, ...props }: ComponentProps<'div'>) => (\n <div data-slot=\"ask-user-body\" className={cn('p-4', className)} {...props} />\n);\n\nconst AskUserQuestionTitle = ({ children }: { children: ReactNode }) => (\n <span className=\"flex items-start gap-2\">\n <Icon size=\"xs\" className={cn('mt-1 shrink-0', 'text-muted-foreground')} aria-hidden>\n <MessageCircleQuestion />\n </Icon>\n <span className=\"min-w-0\">{children}</span>\n </span>\n);\n\nexport const AskUserQuestion = ({ children, className, ...props }: ComponentProps<typeof Txt>) => {\n const context = useOptionalAskUserContext();\n return (\n <Txt\n as=\"p\"\n variant=\"subheading\"\n tone=\"ink\"\n {...props}\n id={context?.questionId ?? props.id}\n className={cn('mb-3', className)}\n >\n <AskUserQuestionTitle>{children}</AskUserQuestionTitle>\n </Txt>\n );\n};\n\nexport interface AskUserOptionRowProps extends Omit<FieldLabelProps, 'children'> {\n control: ReactNode;\n label: ReactNode;\n description?: string;\n disabled?: boolean;\n}\n\nexport const AskUserOptionRow = ({\n control,\n label,\n description,\n disabled = false,\n className,\n ...props\n}: AskUserOptionRowProps) => (\n <FieldItem disabled={disabled} className=\"contents\">\n <FieldLabel\n // state-layer's wash only stops at :disabled/aria-disabled, and a <label> is neither\n aria-disabled={disabled || undefined}\n className={cn('state-layer flex items-start gap-2.5 rounded-lg px-3 py-2 data-disabled:opacity-50', className)}\n {...props}\n >\n {control}\n <span className=\"grid gap-0.5\">\n <Txt as=\"span\" variant=\"body\" tone=\"ink\">\n {label}\n </Txt>\n {description ? (\n <Txt as=\"span\" variant=\"caption\" tone=\"muted\">\n {description}\n </Txt>\n ) : null}\n </span>\n </FieldLabel>\n </FieldItem>\n);\n\nexport type AskUserSubmitButtonProps = Omit<ComponentProps<typeof Button>, 'children'> & { children?: ReactNode };\n\nexport const AskUserSubmitButton = ({ children = 'Submit answer', ...props }: AskUserSubmitButtonProps) => (\n <Button icon={<Check />} type=\"button\" size=\"sm\" variant=\"primary\" {...props}>\n {children}\n </Button>\n);\n\nexport const AskUserPending = ({ children = 'Submitting…', ...props }: ComponentProps<typeof Txt>) => (\n <Txt as=\"span\" role=\"status\" variant=\"caption\" tone=\"muted\" {...props}>\n {children}\n </Txt>\n);\n\nexport interface AskUserOutputProps extends ComponentProps<'div'> {\n result: AskUserResult;\n}\n\nexport const AskUserOutput = ({ result, className, ...props }: AskUserOutputProps) => (\n <div\n data-slot=\"ask-user-output\"\n role={result.isError ? 'alert' : 'status'}\n className={cn('grid gap-2 rounded-lg bg-fill p-3', className)}\n {...props}\n >\n <Badge size=\"xs\" variant={result.isError ? 'destructive' : 'success'} className=\"justify-self-start\">\n {result.isError ? 'Error' : 'Answered'}\n </Badge>\n <Txt as=\"p\" variant=\"body\" tone=\"ink\" className={cn(result.isError && 'text-destructive-foreground')}>\n {result.content}\n </Txt>\n </div>\n);\n","import type { ChangeEvent, ComponentProps, KeyboardEvent, MouseEvent, ReactNode } from 'react';\nimport { useAskUserContext, useOptionalAskUserContext } from './ask-user-context';\nimport { AskUserOptionRow, AskUserSubmitButton } from './ask-user-layout';\nimport { Checkbox } from '@/ds/components/Checkbox';\nimport { FieldItem, FieldLabel, Fieldset } from '@/ds/components/Field';\nimport { Input } from '@/ds/components/Input';\nimport { RadioGroup, RadioGroupItem } from '@/ds/components/RadioGroup';\nimport { Txt } from '@/ds/components/Txt';\nimport { cn } from '@/lib/utils';\n\n// Keep the UI-only custom choice separate from suggested answer values.\nconst customAnswerValue = 'custom';\nconst optionValuePrefix = 'option:';\n\nfunction getOptionRadioValue(optionLabel: string): string {\n return `${optionValuePrefix}${optionLabel}`;\n}\n\nexport function AskUserOptions({ children, className, ...props }: ComponentProps<typeof Fieldset>) {\n const context = useAskUserContext();\n\n const handleSingleSelectChange = (radioValue: unknown) => {\n if (radioValue === customAnswerValue) {\n context.setCustomAnswerSelected(true);\n return;\n }\n if (typeof radioValue !== 'string' || !radioValue.startsWith(optionValuePrefix)) return;\n context.selectOption(radioValue.slice(optionValuePrefix.length));\n };\n\n if (context.selectionMode === 'multi_select') {\n return (\n <Fieldset aria-label=\"Answer options\" {...props} className={cn('gap-2', className)}>\n {children}\n </Fieldset>\n );\n }\n\n const selectedOptionLabel = context.selectedOptionLabels[0];\n const selectedOptionValue = selectedOptionLabel === undefined ? '' : getOptionRadioValue(selectedOptionLabel);\n const selectedRadioValue = context.isCustomAnswerSelected ? customAnswerValue : selectedOptionValue;\n\n return (\n <Fieldset\n {...props}\n className={cn('gap-2', className)}\n render={\n <RadioGroup\n aria-labelledby={context.questionId}\n disabled={context.disabled}\n value={selectedRadioValue}\n onValueChange={handleSingleSelectChange}\n />\n }\n >\n {children}\n </Fieldset>\n );\n}\n\nexport interface AskUserOptionItemProps {\n value: string;\n children: ReactNode;\n description?: string;\n disabled?: boolean;\n className?: string;\n}\n\nexport function AskUserOptionItem({\n value,\n children,\n description,\n disabled = false,\n className,\n}: AskUserOptionItemProps) {\n const context = useAskUserContext();\n const isDisabled = context.disabled || disabled;\n\n const handleOptionToggle = () => {\n if (!isDisabled) context.selectOption(value);\n };\n\n return (\n <AskUserOptionRow\n label={children}\n description={description}\n disabled={isDisabled}\n className={className}\n control={\n context.selectionMode === 'multi_select' ? (\n <Checkbox\n className=\"mt-0.5\"\n disabled={isDisabled}\n checked={context.selectedOptionLabels.includes(value)}\n onCheckedChange={handleOptionToggle}\n />\n ) : (\n <RadioGroupItem className=\"mt-0.5\" disabled={isDisabled} value={getOptionRadioValue(value)} />\n )\n }\n />\n );\n}\n\nexport type AskUserTextAnswerProps = Omit<\n ComponentProps<typeof Input>,\n 'value' | 'defaultValue' | 'onChange' | 'onKeyDown'\n>;\n\nexport function AskUserTextAnswer({ disabled = false, ...props }: AskUserTextAnswerProps) {\n const context = useAskUserContext();\n\n const handleAnswerTextChange = (event: ChangeEvent<HTMLInputElement>) => {\n context.changeAnswerText(event.target.value);\n };\n\n const handleAnswerTextKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter' && !event.nativeEvent.isComposing) {\n event.preventDefault();\n context.submitAnswer();\n }\n };\n\n return (\n <Input\n type=\"text\"\n aria-labelledby={props['aria-label'] ? undefined : context.questionId}\n placeholder=\"Type your answer\"\n size=\"sm\"\n {...props}\n disabled={context.disabled || disabled}\n value={context.answerText}\n onChange={handleAnswerTextChange}\n onKeyDown={handleAnswerTextKeyDown}\n />\n );\n}\n\nexport interface AskUserCustomAnswerProps {\n className?: string;\n label?: string;\n inputLabel?: string;\n}\n\nexport function AskUserCustomAnswer({\n className,\n label = 'Other…',\n inputLabel = 'Your answer',\n}: AskUserCustomAnswerProps) {\n const context = useAskUserContext();\n\n const handleRowClick = (event: MouseEvent<HTMLDivElement>) => {\n if (context.disabled || event.target !== event.currentTarget) return;\n if (context.isCustomAnswerSelected) {\n event.currentTarget.querySelector<HTMLInputElement>('input[type=\"text\"]')?.focus();\n return;\n }\n event.currentTarget.querySelector<HTMLElement>('[role=\"radio\"], [role=\"checkbox\"]')?.click();\n };\n\n const handleControlMouseDown = (event: MouseEvent<HTMLSpanElement>) => {\n // Let the checkbox click unselect it before blur resets its controlled value.\n if (context.isCustomAnswerSelected && !context.answerText.trim()) event.preventDefault();\n };\n\n return (\n <FieldItem\n role=\"group\"\n aria-label=\"Custom answer\"\n aria-disabled={context.disabled || undefined}\n disabled={context.disabled}\n onClick={handleRowClick}\n className={cn(\n 'items-start gap-2.5 rounded-lg px-3 py-2 data-disabled:opacity-50',\n !context.isCustomAnswerSelected && 'state-layer',\n className,\n )}\n >\n {context.selectionMode === 'multi_select' ? (\n <Checkbox\n className=\"mt-0.5\"\n aria-label={label}\n disabled={context.disabled}\n checked={context.isCustomAnswerSelected}\n onMouseDown={handleControlMouseDown}\n onCheckedChange={context.setCustomAnswerSelected}\n />\n ) : (\n <RadioGroupItem aria-label={label} className=\"mt-0.5\" value={customAnswerValue} />\n )}\n {context.isCustomAnswerSelected ? (\n <AskUserTextAnswer\n aria-label={inputLabel}\n onBlur={context.unselectEmptyCustomAnswer}\n placeholder={label}\n variant=\"unstyled\"\n className={cn('h-auto min-w-0 flex-1 px-0', 'text-body')}\n autoFocus\n />\n ) : (\n <FieldLabel className=\"flex-1\">\n <Txt as=\"span\" variant=\"body\" tone=\"ink\">\n {label}\n </Txt>\n </FieldLabel>\n )}\n </FieldItem>\n );\n}\n\nexport type AskUserSubmitProps = ComponentProps<typeof AskUserSubmitButton> & {\n when?: 'always' | 'custom-answer';\n};\n\nexport function AskUserSubmit({ when = 'always', disabled = false, onClick, ...props }: AskUserSubmitProps) {\n const context = useOptionalAskUserContext();\n\n const handleSubmitClick = (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (!event.defaultPrevented && !disabled) context?.submitAnswer();\n };\n\n if (when === 'custom-answer' && !context?.isCustomAnswerSelected) return null;\n\n return (\n <AskUserSubmitButton\n {...props}\n disabled={disabled || (context !== undefined && !context.canSubmitAnswer)}\n onClick={handleSubmitClick}\n />\n );\n}\n","import { useId, useState } from 'react';\nimport type { ComponentProps } from 'react';\nimport { AskUserContext } from './ask-user-context';\nimport { AskUserContainer } from './ask-user-layout';\nimport type { AskUserAnswer, AskUserSelectionMode } from './ask-user-types';\n\nexport interface AskUserRootProps extends Omit<ComponentProps<typeof AskUserContainer>, 'onSubmit'> {\n selectionMode?: AskUserSelectionMode;\n disabled?: boolean;\n onSubmit: (answer: AskUserAnswer) => void;\n}\n\ninterface AskUserAnswerDraft {\n answerText: string;\n selectedOptionLabels: string[];\n selectionMode: AskUserSelectionMode;\n isCustomAnswerSelected: boolean;\n}\n\nfunction getAnswerToSubmit({\n answerText,\n selectedOptionLabels,\n selectionMode,\n isCustomAnswerSelected,\n}: AskUserAnswerDraft): AskUserAnswer | undefined {\n const trimmedAnswerText = answerText.trim();\n if (isCustomAnswerSelected && !trimmedAnswerText) return undefined;\n if (selectionMode === 'single_select') {\n // Suggested single-select answers already submit when selected.\n if (!isCustomAnswerSelected && selectedOptionLabels.length > 0) return undefined;\n return trimmedAnswerText || undefined;\n }\n\n const answerLabels = isCustomAnswerSelected ? [...selectedOptionLabels, trimmedAnswerText] : selectedOptionLabels;\n return answerLabels.length > 0 ? answerLabels : undefined;\n}\n\nfunction toggleSelectedOptionLabel(selectedOptionLabels: string[], optionLabel: string): string[] {\n if (selectedOptionLabels.includes(optionLabel)) {\n return selectedOptionLabels.filter(selectedLabel => selectedLabel !== optionLabel);\n }\n return [...selectedOptionLabels, optionLabel];\n}\n\nexport function AskUserRoot({\n selectionMode = 'single_select',\n disabled = false,\n onSubmit,\n children,\n ...props\n}: AskUserRootProps) {\n const questionId = useId();\n const [answerText, setAnswerText] = useState('');\n const [selectedOptionLabels, setSelectedOptionLabels] = useState<string[]>([]);\n const [isCustomAnswerSelected, setIsCustomAnswerSelected] = useState(false);\n const answerToSubmit = getAnswerToSubmit({\n answerText,\n selectedOptionLabels,\n selectionMode,\n isCustomAnswerSelected,\n });\n const canSubmitAnswer = !disabled && answerToSubmit !== undefined;\n\n const selectOption = (optionLabel: string) => {\n if (disabled) return;\n if (selectionMode === 'multi_select') {\n setSelectedOptionLabels(currentLabels => toggleSelectedOptionLabel(currentLabels, optionLabel));\n return;\n }\n setIsCustomAnswerSelected(false);\n setSelectedOptionLabels([optionLabel]);\n onSubmit(optionLabel);\n };\n\n const setCustomAnswerSelected = (selected: boolean) => {\n if (disabled) return;\n setIsCustomAnswerSelected(selected);\n if (selected && selectionMode === 'single_select') setSelectedOptionLabels([]);\n };\n\n const changeAnswerText = (text: string) => {\n if (!disabled) setAnswerText(text);\n };\n\n const unselectEmptyCustomAnswer = () => {\n if (!disabled && !answerText.trim()) setIsCustomAnswerSelected(false);\n };\n\n const submitAnswer = () => {\n if (disabled || answerToSubmit === undefined) return;\n onSubmit(answerToSubmit);\n };\n\n return (\n <AskUserContext.Provider\n value={{\n questionId,\n selectionMode,\n disabled,\n answerText,\n selectedOptionLabels,\n isCustomAnswerSelected,\n canSubmitAnswer,\n selectOption,\n setCustomAnswerSelected,\n changeAnswerText,\n unselectEmptyCustomAnswer,\n submitAnswer,\n }}\n >\n <AskUserContainer role=\"group\" aria-labelledby={questionId} {...props}>\n {children}\n </AskUserContainer>\n </AskUserContext.Provider>\n );\n}\n","import type { ComponentProps, ReactNode } from 'react';\nimport { useAskUserContext } from './ask-user-context';\nimport {\n AskUserCustomAnswer,\n AskUserOptionItem,\n AskUserOptions,\n AskUserSubmit,\n AskUserTextAnswer,\n} from './ask-user-controls';\nimport type { AskUserContainer } from './ask-user-layout';\nimport { AskUserBody, AskUserOutput, AskUserPending, AskUserQuestion } from './ask-user-layout';\nimport { AskUserRoot } from './ask-user-root';\nimport type { AskUserAnswer, AskUserOption, AskUserPayload, AskUserResult } from './ask-user-types';\nimport { Badge } from '@/ds/components/Badge';\n\nexport interface AskUserProps extends Omit<ComponentProps<typeof AskUserContainer>, 'children' | 'onSubmit'> {\n payload: AskUserPayload;\n result?: AskUserResult;\n isAnswered?: boolean;\n isSubmitting?: boolean;\n onSubmit: (answer: AskUserAnswer) => void;\n footer?: ReactNode;\n}\n\nfunction getValidOptions(options: AskUserPayload['options']): AskUserOption[] {\n return (\n options?.filter((option): option is AskUserOption =>\n Boolean(option && typeof option.label === 'string' && option.label),\n ) ?? []\n );\n}\n\nfunction AskUserAnswerControls({ options }: { options: AskUserOption[] }) {\n const { selectionMode } = useAskUserContext();\n const isMultiSelect = selectionMode === 'multi_select';\n if (options.length === 0) {\n return (\n <div className=\"flex items-center gap-2\">\n <AskUserTextAnswer />\n <AskUserSubmit className=\"shrink-0 whitespace-nowrap\" />\n </div>\n );\n }\n\n return (\n <>\n <AskUserOptions>\n {options.map(option => (\n <AskUserOptionItem key={option.label} value={option.label} description={option.description}>\n {option.label}\n </AskUserOptionItem>\n ))}\n <AskUserCustomAnswer />\n {isMultiSelect ? <AskUserSubmit className=\"mt-1 justify-self-start\" /> : null}\n </AskUserOptions>\n {!isMultiSelect ? <AskUserSubmit when=\"custom-answer\" className=\"mt-2\" /> : null}\n </>\n );\n}\n\ninterface AskUserCardContentProps extends Pick<AskUserProps, 'result' | 'isAnswered' | 'isSubmitting' | 'footer'> {\n options: AskUserOption[];\n}\n\nfunction AskUserCardContent({ result, isAnswered, isSubmitting, options, footer }: AskUserCardContentProps) {\n if (result) return <AskUserOutput result={result} />;\n if (isAnswered) return <Badge variant=\"success\">Answered</Badge>;\n\n return (\n <>\n <AskUserAnswerControls options={options} />\n {isSubmitting ? <AskUserPending className=\"mt-3 block\" /> : null}\n {footer}\n </>\n );\n}\n\nexport function AskUser({\n payload,\n result,\n isAnswered = false,\n isSubmitting = false,\n onSubmit,\n footer,\n ...props\n}: AskUserProps) {\n const options = getValidOptions(payload.options);\n const isMultiSelect = options.length > 0 && payload.selectionMode === 'multi_select';\n const payloadKey = JSON.stringify([payload.question, options.map(option => option.label), payload.selectionMode]);\n const hasAnswer = result !== undefined || isAnswered;\n\n return (\n <AskUserRoot\n key={payloadKey}\n data-testid=\"ask-user\"\n selectionMode={isMultiSelect ? 'multi_select' : 'single_select'}\n disabled={isSubmitting || hasAnswer}\n onSubmit={onSubmit}\n {...props}\n >\n <AskUserBody>\n <AskUserQuestion>{payload.question}</AskUserQuestion>\n <AskUserCardContent\n result={result}\n isAnswered={isAnswered}\n isSubmitting={isSubmitting}\n options={options}\n footer={footer}\n />\n </AskUserBody>\n </AskUserRoot>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ask-user-CqzPUD9E.js","names":["_Fragment"],"sources":["../src/ds/components/ai/ask-user/ask-user-context.ts","../src/ds/components/ai/ask-user/ask-user-layout.tsx","../src/ds/components/ai/ask-user/ask-user-controls.tsx","../src/ds/components/ai/ask-user/ask-user-root.tsx","../src/ds/components/ai/ask-user/ask-user-card.tsx"],"sourcesContent":["import { createContext, useContext } from 'react';\nimport type { AskUserSelectionMode } from './ask-user-types';\n\ninterface AskUserContextValue {\n questionId: string;\n selectionMode: AskUserSelectionMode;\n disabled: boolean;\n answerText: string;\n selectedOptionLabels: string[];\n isCustomAnswerSelected: boolean;\n canSubmitAnswer: boolean;\n selectOption: (optionLabel: string) => void;\n setCustomAnswerSelected: (selected: boolean) => void;\n changeAnswerText: (text: string) => void;\n unselectEmptyCustomAnswer: () => void;\n submitAnswer: () => void;\n}\n\nexport const AskUserContext = createContext<AskUserContextValue | undefined>(undefined);\n\nexport function useOptionalAskUserContext() {\n return useContext(AskUserContext);\n}\n\nexport function useAskUserContext() {\n const context = useOptionalAskUserContext();\n if (!context) throw new Error('AskUser controls must be rendered inside AskUser.Root.');\n return context;\n}\n","import { Check, MessageCircleQuestion } from 'lucide-react';\nimport type { ComponentProps, ReactNode } from 'react';\nimport { useOptionalAskUserContext } from './ask-user-context';\nimport type { AskUserResult } from './ask-user-types';\nimport { Badge } from '@/ds/components/Badge';\nimport { Button } from '@/ds/components/Button';\nimport { FieldItem, FieldLabel } from '@/ds/components/Field';\nimport type { FieldLabelProps } from '@/ds/components/Field';\nimport { Txt } from '@/ds/components/Txt';\nimport { Icon } from '@/ds/icons/Icon';\nimport { raisedSurfaceStyle } from '@/ds/primitives/raised-surface';\nimport { cn } from '@/lib/utils';\n\nexport const AskUserContainer = ({ className, ...props }: ComponentProps<'div'>) => (\n <div\n data-slot=\"ask-user\"\n className={cn(raisedSurfaceStyle, 'w-full overflow-hidden rounded-xl', className)}\n {...props}\n />\n);\n\nexport const AskUserLabel = ({ children = 'Question', className, ...props }: ComponentProps<'div'>) => (\n <div data-slot=\"ask-user-label\" className={cn('flex min-h-10 items-center gap-2 px-4 pt-3', className)} {...props}>\n <Icon size=\"xs\" className=\"text-muted-foreground\">\n <MessageCircleQuestion />\n </Icon>\n <Txt as=\"span\" variant=\"caption\" tone=\"muted\">\n {children}\n </Txt>\n </div>\n);\n\nexport const AskUserBody = ({ className, ...props }: ComponentProps<'div'>) => (\n <div data-slot=\"ask-user-body\" className={cn('p-4', className)} {...props} />\n);\n\nconst AskUserQuestionTitle = ({ children }: { children: ReactNode }) => (\n <span className=\"flex items-start gap-2\">\n <Icon size=\"xs\" className={cn('mt-1 shrink-0', 'text-muted-foreground')} aria-hidden>\n <MessageCircleQuestion />\n </Icon>\n <span className=\"min-w-0\">{children}</span>\n </span>\n);\n\nexport const AskUserQuestion = ({ children, className, ...props }: ComponentProps<typeof Txt>) => {\n const context = useOptionalAskUserContext();\n return (\n <Txt\n as=\"p\"\n variant=\"subheading\"\n tone=\"ink\"\n {...props}\n id={context?.questionId ?? props.id}\n className={cn('mb-3', className)}\n >\n <AskUserQuestionTitle>{children}</AskUserQuestionTitle>\n </Txt>\n );\n};\n\nexport interface AskUserOptionRowProps extends Omit<FieldLabelProps, 'children'> {\n control: ReactNode;\n label: ReactNode;\n description?: string;\n disabled?: boolean;\n}\n\nexport const AskUserOptionRow = ({\n control,\n label,\n description,\n disabled = false,\n className,\n ...props\n}: AskUserOptionRowProps) => (\n <FieldItem disabled={disabled} className=\"contents\">\n <FieldLabel\n // state-layer's wash only stops at :disabled/aria-disabled, and a <label> is neither\n aria-disabled={disabled || undefined}\n className={cn('state-layer flex items-start gap-2.5 rounded-lg px-3 py-2 data-disabled:opacity-50', className)}\n {...props}\n >\n {control}\n <span className=\"grid gap-0.5\">\n <Txt as=\"span\" variant=\"body\" tone=\"ink\">\n {label}\n </Txt>\n {description ? (\n <Txt as=\"span\" variant=\"caption\" tone=\"muted\">\n {description}\n </Txt>\n ) : null}\n </span>\n </FieldLabel>\n </FieldItem>\n);\n\nexport type AskUserSubmitButtonProps = Omit<ComponentProps<typeof Button>, 'children'> & { children?: ReactNode };\n\nexport const AskUserSubmitButton = ({ children = 'Submit answer', ...props }: AskUserSubmitButtonProps) => (\n <Button icon={<Check />} type=\"button\" size=\"sm\" variant=\"primary\" {...props}>\n {children}\n </Button>\n);\n\nexport const AskUserPending = ({ children = 'Submitting…', ...props }: ComponentProps<typeof Txt>) => (\n <Txt as=\"span\" role=\"status\" variant=\"caption\" tone=\"muted\" {...props}>\n {children}\n </Txt>\n);\n\nexport interface AskUserOutputProps extends ComponentProps<'div'> {\n result: AskUserResult;\n}\n\nexport const AskUserOutput = ({ result, className, ...props }: AskUserOutputProps) => (\n <div\n data-slot=\"ask-user-output\"\n role={result.isError ? 'alert' : 'status'}\n className={cn('grid gap-2 rounded-lg bg-fill p-3', className)}\n {...props}\n >\n <Badge size=\"xs\" variant={result.isError ? 'destructive' : 'success'} className=\"justify-self-start\">\n {result.isError ? 'Error' : 'Answered'}\n </Badge>\n <Txt as=\"p\" variant=\"body\" tone=\"ink\" className={cn(result.isError && 'text-destructive-foreground')}>\n {result.content}\n </Txt>\n </div>\n);\n","import type { ChangeEvent, ComponentProps, KeyboardEvent, MouseEvent, ReactNode } from 'react';\nimport { useAskUserContext, useOptionalAskUserContext } from './ask-user-context';\nimport { AskUserOptionRow, AskUserSubmitButton } from './ask-user-layout';\nimport { Checkbox } from '@/ds/components/Checkbox';\nimport { FieldItem, FieldLabel, Fieldset } from '@/ds/components/Field';\nimport { Input } from '@/ds/components/Input';\nimport { RadioGroup, RadioGroupItem } from '@/ds/components/RadioGroup';\nimport { Txt } from '@/ds/components/Txt';\nimport { cn } from '@/lib/utils';\n\n// Keep the UI-only custom choice separate from suggested answer values.\nconst customAnswerValue = 'custom';\nconst optionValuePrefix = 'option:';\n\nfunction getOptionRadioValue(optionLabel: string): string {\n return `${optionValuePrefix}${optionLabel}`;\n}\n\nexport function AskUserOptions({ children, className, ...props }: ComponentProps<typeof Fieldset>) {\n const context = useAskUserContext();\n\n const handleSingleSelectChange = (radioValue: unknown) => {\n if (radioValue === customAnswerValue) {\n context.setCustomAnswerSelected(true);\n return;\n }\n if (typeof radioValue !== 'string' || !radioValue.startsWith(optionValuePrefix)) return;\n context.selectOption(radioValue.slice(optionValuePrefix.length));\n };\n\n if (context.selectionMode === 'multi_select') {\n return (\n <Fieldset aria-label=\"Answer options\" {...props} className={cn('gap-2', className)}>\n {children}\n </Fieldset>\n );\n }\n\n const selectedOptionLabel = context.selectedOptionLabels[0];\n const selectedOptionValue = selectedOptionLabel === undefined ? '' : getOptionRadioValue(selectedOptionLabel);\n const selectedRadioValue = context.isCustomAnswerSelected ? customAnswerValue : selectedOptionValue;\n\n return (\n <Fieldset\n {...props}\n className={cn('gap-2', className)}\n render={\n <RadioGroup\n aria-labelledby={context.questionId}\n disabled={context.disabled}\n value={selectedRadioValue}\n onValueChange={handleSingleSelectChange}\n />\n }\n >\n {children}\n </Fieldset>\n );\n}\n\nexport interface AskUserOptionItemProps {\n value: string;\n children: ReactNode;\n description?: string;\n disabled?: boolean;\n className?: string;\n}\n\nexport function AskUserOptionItem({\n value,\n children,\n description,\n disabled = false,\n className,\n}: AskUserOptionItemProps) {\n const context = useAskUserContext();\n const isDisabled = context.disabled || disabled;\n\n const handleOptionToggle = () => {\n if (!isDisabled) context.selectOption(value);\n };\n\n return (\n <AskUserOptionRow\n label={children}\n description={description}\n disabled={isDisabled}\n className={className}\n control={\n context.selectionMode === 'multi_select' ? (\n <Checkbox\n className=\"mt-0.5\"\n disabled={isDisabled}\n checked={context.selectedOptionLabels.includes(value)}\n onCheckedChange={handleOptionToggle}\n />\n ) : (\n <RadioGroupItem className=\"mt-0.5\" disabled={isDisabled} value={getOptionRadioValue(value)} />\n )\n }\n />\n );\n}\n\nexport type AskUserTextAnswerProps = Omit<\n ComponentProps<typeof Input>,\n 'value' | 'defaultValue' | 'onChange' | 'onKeyDown'\n>;\n\nexport function AskUserTextAnswer({ disabled = false, ...props }: AskUserTextAnswerProps) {\n const context = useAskUserContext();\n\n const handleAnswerTextChange = (event: ChangeEvent<HTMLInputElement>) => {\n context.changeAnswerText(event.target.value);\n };\n\n const handleAnswerTextKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter' && !event.nativeEvent.isComposing) {\n event.preventDefault();\n context.submitAnswer();\n }\n };\n\n return (\n <Input\n type=\"text\"\n aria-labelledby={props['aria-label'] ? undefined : context.questionId}\n placeholder=\"Type your answer\"\n size=\"sm\"\n {...props}\n disabled={context.disabled || disabled}\n value={context.answerText}\n onChange={handleAnswerTextChange}\n onKeyDown={handleAnswerTextKeyDown}\n />\n );\n}\n\nexport interface AskUserCustomAnswerProps {\n className?: string;\n label?: string;\n inputLabel?: string;\n}\n\nexport function AskUserCustomAnswer({\n className,\n label = 'Other…',\n inputLabel = 'Your answer',\n}: AskUserCustomAnswerProps) {\n const context = useAskUserContext();\n\n const handleRowClick = (event: MouseEvent<HTMLDivElement>) => {\n if (context.disabled || event.target !== event.currentTarget) return;\n if (context.isCustomAnswerSelected) {\n event.currentTarget.querySelector<HTMLInputElement>('input[type=\"text\"]')?.focus();\n return;\n }\n event.currentTarget.querySelector<HTMLElement>('[role=\"radio\"], [role=\"checkbox\"]')?.click();\n };\n\n const handleControlMouseDown = (event: MouseEvent<HTMLSpanElement>) => {\n // Let the checkbox click unselect it before blur resets its controlled value.\n if (context.isCustomAnswerSelected && !context.answerText.trim()) event.preventDefault();\n };\n\n return (\n <FieldItem\n role=\"group\"\n aria-label=\"Custom answer\"\n aria-disabled={context.disabled || undefined}\n disabled={context.disabled}\n onClick={handleRowClick}\n className={cn(\n 'items-start gap-2.5 rounded-lg px-3 py-2 data-disabled:opacity-50',\n !context.isCustomAnswerSelected && 'state-layer',\n className,\n )}\n >\n {context.selectionMode === 'multi_select' ? (\n <Checkbox\n className=\"mt-0.5\"\n aria-label={label}\n disabled={context.disabled}\n checked={context.isCustomAnswerSelected}\n onMouseDown={handleControlMouseDown}\n onCheckedChange={context.setCustomAnswerSelected}\n />\n ) : (\n <RadioGroupItem aria-label={label} className=\"mt-0.5\" value={customAnswerValue} />\n )}\n {context.isCustomAnswerSelected ? (\n <AskUserTextAnswer\n aria-label={inputLabel}\n onBlur={context.unselectEmptyCustomAnswer}\n placeholder={label}\n variant=\"unstyled\"\n className={cn('h-auto min-w-0 flex-1 px-0', 'text-body')}\n autoFocus\n />\n ) : (\n <FieldLabel className=\"flex-1\">\n <Txt as=\"span\" variant=\"body\" tone=\"ink\">\n {label}\n </Txt>\n </FieldLabel>\n )}\n </FieldItem>\n );\n}\n\nexport type AskUserSubmitProps = ComponentProps<typeof AskUserSubmitButton> & {\n when?: 'always' | 'custom-answer';\n};\n\nexport function AskUserSubmit({ when = 'always', disabled = false, onClick, ...props }: AskUserSubmitProps) {\n const context = useOptionalAskUserContext();\n\n const handleSubmitClick = (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (!event.defaultPrevented && !disabled) context?.submitAnswer();\n };\n\n if (when === 'custom-answer' && !context?.isCustomAnswerSelected) return null;\n\n return (\n <AskUserSubmitButton\n {...props}\n disabled={disabled || (context !== undefined && !context.canSubmitAnswer)}\n onClick={handleSubmitClick}\n />\n );\n}\n","import { useId, useState } from 'react';\nimport type { ComponentProps } from 'react';\nimport { AskUserContext } from './ask-user-context';\nimport { AskUserContainer } from './ask-user-layout';\nimport type { AskUserAnswer, AskUserSelectionMode } from './ask-user-types';\n\nexport interface AskUserRootProps extends Omit<ComponentProps<typeof AskUserContainer>, 'onSubmit'> {\n selectionMode?: AskUserSelectionMode;\n disabled?: boolean;\n onSubmit: (answer: AskUserAnswer) => void;\n}\n\ninterface AskUserAnswerDraft {\n answerText: string;\n selectedOptionLabels: string[];\n selectionMode: AskUserSelectionMode;\n isCustomAnswerSelected: boolean;\n}\n\nfunction getAnswerToSubmit({\n answerText,\n selectedOptionLabels,\n selectionMode,\n isCustomAnswerSelected,\n}: AskUserAnswerDraft): AskUserAnswer | undefined {\n const trimmedAnswerText = answerText.trim();\n if (isCustomAnswerSelected && !trimmedAnswerText) return undefined;\n if (selectionMode === 'single_select') {\n // Suggested single-select answers already submit when selected.\n if (!isCustomAnswerSelected && selectedOptionLabels.length > 0) return undefined;\n return trimmedAnswerText || undefined;\n }\n\n const answerLabels = isCustomAnswerSelected ? [...selectedOptionLabels, trimmedAnswerText] : selectedOptionLabels;\n return answerLabels.length > 0 ? answerLabels : undefined;\n}\n\nfunction toggleSelectedOptionLabel(selectedOptionLabels: string[], optionLabel: string): string[] {\n if (selectedOptionLabels.includes(optionLabel)) {\n return selectedOptionLabels.filter(selectedLabel => selectedLabel !== optionLabel);\n }\n return [...selectedOptionLabels, optionLabel];\n}\n\nexport function AskUserRoot({\n selectionMode = 'single_select',\n disabled = false,\n onSubmit,\n children,\n ...props\n}: AskUserRootProps) {\n const questionId = useId();\n const [answerText, setAnswerText] = useState('');\n const [selectedOptionLabels, setSelectedOptionLabels] = useState<string[]>([]);\n const [isCustomAnswerSelected, setIsCustomAnswerSelected] = useState(false);\n const answerToSubmit = getAnswerToSubmit({\n answerText,\n selectedOptionLabels,\n selectionMode,\n isCustomAnswerSelected,\n });\n const canSubmitAnswer = !disabled && answerToSubmit !== undefined;\n\n const selectOption = (optionLabel: string) => {\n if (disabled) return;\n if (selectionMode === 'multi_select') {\n setSelectedOptionLabels(currentLabels => toggleSelectedOptionLabel(currentLabels, optionLabel));\n return;\n }\n setIsCustomAnswerSelected(false);\n setSelectedOptionLabels([optionLabel]);\n onSubmit(optionLabel);\n };\n\n const setCustomAnswerSelected = (selected: boolean) => {\n if (disabled) return;\n setIsCustomAnswerSelected(selected);\n if (selected && selectionMode === 'single_select') setSelectedOptionLabels([]);\n };\n\n const changeAnswerText = (text: string) => {\n if (!disabled) setAnswerText(text);\n };\n\n const unselectEmptyCustomAnswer = () => {\n if (!disabled && !answerText.trim()) setIsCustomAnswerSelected(false);\n };\n\n const submitAnswer = () => {\n if (disabled || answerToSubmit === undefined) return;\n onSubmit(answerToSubmit);\n };\n\n return (\n <AskUserContext.Provider\n value={{\n questionId,\n selectionMode,\n disabled,\n answerText,\n selectedOptionLabels,\n isCustomAnswerSelected,\n canSubmitAnswer,\n selectOption,\n setCustomAnswerSelected,\n changeAnswerText,\n unselectEmptyCustomAnswer,\n submitAnswer,\n }}\n >\n <AskUserContainer role=\"group\" aria-labelledby={questionId} {...props}>\n {children}\n </AskUserContainer>\n </AskUserContext.Provider>\n );\n}\n","import type { ComponentProps, ReactNode } from 'react';\nimport { useAskUserContext } from './ask-user-context';\nimport {\n AskUserCustomAnswer,\n AskUserOptionItem,\n AskUserOptions,\n AskUserSubmit,\n AskUserTextAnswer,\n} from './ask-user-controls';\nimport type { AskUserContainer } from './ask-user-layout';\nimport { AskUserBody, AskUserOutput, AskUserPending, AskUserQuestion } from './ask-user-layout';\nimport { AskUserRoot } from './ask-user-root';\nimport type { AskUserAnswer, AskUserOption, AskUserPayload, AskUserResult } from './ask-user-types';\nimport { Badge } from '@/ds/components/Badge';\n\nexport interface AskUserProps extends Omit<ComponentProps<typeof AskUserContainer>, 'children' | 'onSubmit'> {\n payload: AskUserPayload;\n result?: AskUserResult;\n isAnswered?: boolean;\n isSubmitting?: boolean;\n onSubmit: (answer: AskUserAnswer) => void;\n footer?: ReactNode;\n}\n\nfunction getValidOptions(options: AskUserPayload['options']): AskUserOption[] {\n return (\n options?.filter((option): option is AskUserOption =>\n Boolean(option && typeof option.label === 'string' && option.label),\n ) ?? []\n );\n}\n\nfunction AskUserAnswerControls({ options }: { options: AskUserOption[] }) {\n const { selectionMode } = useAskUserContext();\n const isMultiSelect = selectionMode === 'multi_select';\n if (options.length === 0) {\n return (\n <div className=\"flex items-center gap-2\">\n <AskUserTextAnswer />\n <AskUserSubmit className=\"shrink-0 whitespace-nowrap\" />\n </div>\n );\n }\n\n return (\n <>\n <AskUserOptions>\n {options.map(option => (\n <AskUserOptionItem key={option.label} value={option.label} description={option.description}>\n {option.label}\n </AskUserOptionItem>\n ))}\n <AskUserCustomAnswer />\n {isMultiSelect ? <AskUserSubmit className=\"mt-1 justify-self-start\" /> : null}\n </AskUserOptions>\n {!isMultiSelect ? <AskUserSubmit when=\"custom-answer\" className=\"mt-2\" /> : null}\n </>\n );\n}\n\ninterface AskUserCardContentProps extends Pick<AskUserProps, 'result' | 'isAnswered' | 'isSubmitting' | 'footer'> {\n options: AskUserOption[];\n}\n\nfunction AskUserCardContent({ result, isAnswered, isSubmitting, options, footer }: AskUserCardContentProps) {\n if (result) return <AskUserOutput result={result} />;\n if (isAnswered) return <Badge variant=\"success\">Answered</Badge>;\n\n return (\n <>\n <AskUserAnswerControls options={options} />\n {isSubmitting ? <AskUserPending className=\"mt-3 block\" /> : null}\n {footer}\n </>\n );\n}\n\nexport function AskUser({\n payload,\n result,\n isAnswered = false,\n isSubmitting = false,\n onSubmit,\n footer,\n ...props\n}: AskUserProps) {\n const options = getValidOptions(payload.options);\n const isMultiSelect = options.length > 0 && payload.selectionMode === 'multi_select';\n const payloadKey = JSON.stringify([payload.question, options.map(option => option.label), payload.selectionMode]);\n const hasAnswer = result !== undefined || isAnswered;\n\n return (\n <AskUserRoot\n key={payloadKey}\n data-testid=\"ask-user\"\n selectionMode={isMultiSelect ? 'multi_select' : 'single_select'}\n disabled={isSubmitting || hasAnswer}\n onSubmit={onSubmit}\n {...props}\n >\n <AskUserBody>\n <AskUserQuestion>{payload.question}</AskUserQuestion>\n <AskUserCardContent\n result={result}\n isAnswered={isAnswered}\n isSubmitting={isSubmitting}\n options={options}\n footer={footer}\n />\n </AskUserBody>\n </AskUserRoot>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;AAkBA,IAAa,iBAAiB,cAA+C,KAAA,CAAS;AAEtF,SAAgB,4BAA4B;CAC1C,OAAO,WAAW,cAAc;AAClC;AAEA,SAAgB,oBAAoB;CAClC,MAAM,UAAU,0BAA0B;CAC1C,IAAI,CAAC,SAAS,MAAM,IAAI,MAAM,wDAAwD;CACtF,OAAO;AACT;;ACfA,IAAa,oBAAoB,EAAE,WAAW,GAAG,YAC/C,oBAAC,OAAD;CACE,aAAU;CACV,WAAW,GAAG,oBAAoB,qCAAqC,SAAS;CAChF,GAAI;AACL,CAAA;AAGH,IAAa,gBAAgB,EAAE,WAAW,YAAY,WAAW,GAAG,YAClE,qBAAC,OAAD;CAAK,aAAU;CAAiB,WAAW,GAAG,8CAA8C,SAAS;CAAG,GAAI;CAA5G,UAAA,CACE,oBAAC,MAAD;EAAM,MAAK;EAAK,WAAU;EACxB,UAAA,oBAAC,uBAAD,CAAwB,CAAA;CACpB,CAAA,GACN,oBAAC,KAAD;EAAK,IAAG;EAAO,SAAQ;EAAU,MAAK;EACnC;CACE,CAAA,CACF;;AAGP,IAAa,eAAe,EAAE,WAAW,GAAG,YAC1C,oBAAC,OAAD;CAAK,aAAU;CAAgB,WAAW,GAAG,OAAO,SAAS;CAAG,GAAI;AAAQ,CAAA;AAG9E,IAAM,wBAAwB,EAAE,eAC9B,qBAAC,QAAD;CAAM,WAAU;CAAhB,UAAA,CACE,oBAAC,MAAD;EAAM,MAAK;EAAK,WAAW,GAAG,iBAAiB,uBAAuB;EAAG,eAAA;EACvE,UAAA,oBAAC,uBAAD,CAAwB,CAAA;CACpB,CAAA,GACN,oBAAC,QAAD;EAAM,WAAU;EAAW;CAAe,CAAA,CACtC;;AAGR,IAAa,mBAAmB,EAAE,UAAU,WAAW,GAAG,YAAwC;CAChG,MAAM,UAAU,0BAA0B;CAC1C,OACE,oBAAC,KAAD;EACE,IAAG;EACH,SAAQ;EACR,MAAK;EACL,GAAI;EACJ,IAAI,SAAS,cAAc,MAAM;EACjC,WAAW,GAAG,QAAQ,SAAS;EAE/B,UAAA,oBAAC,sBAAD,EAAuB,SAA+B,CAAA;CACnD,CAAA;AAET;AASA,IAAa,oBAAoB,EAC/B,SACA,OACA,aACA,WAAW,OACX,WACA,GAAG,YAEH,oBAAC,WAAD;CAAqB;CAAU,WAAU;CACvC,UAAA,qBAAC,YAAD;EAEE,iBAAe,YAAY,KAAA;EAC3B,WAAW,GAAG,sFAAsF,SAAS;EAC7G,GAAI;EAJN,UAAA,CAMG,SACD,qBAAC,QAAD;GAAM,WAAU;GAAhB,UAAA,CACE,oBAAC,KAAD;IAAK,IAAG;IAAO,SAAQ;IAAO,MAAK;IAChC,UAAA;GACE,CAAA,GACJ,cACC,oBAAC,KAAD;IAAK,IAAG;IAAO,SAAQ;IAAU,MAAK;IACnC,UAAA;GACE,CAAA,IACH,IACA;EACI,CAAA,CAAA;;AACH,CAAA;AAKb,IAAa,uBAAuB,EAAE,WAAW,iBAAiB,GAAG,YACnE,oBAAC,QAAD;CAAQ,MAAM,oBAAC,OAAD,CAAQ,CAAA;CAAG,MAAK;CAAS,MAAK;CAAK,SAAQ;CAAU,GAAI;CACpE;AACK,CAAA;AAGV,IAAa,kBAAkB,EAAE,WAAW,eAAe,GAAG,YAC5D,oBAAC,KAAD;CAAK,IAAG;CAAO,MAAK;CAAS,SAAQ;CAAU,MAAK;CAAQ,GAAI;CAC7D;AACE,CAAA;AAOP,IAAa,iBAAiB,EAAE,QAAQ,WAAW,GAAG,YACpD,qBAAC,OAAD;CACE,aAAU;CACV,MAAM,OAAO,UAAU,UAAU;CACjC,WAAW,GAAG,qCAAqC,SAAS;CAC5D,GAAI;CAJN,UAAA,CAME,oBAAC,OAAD;EAAO,MAAK;EAAK,SAAS,OAAO,UAAU,gBAAgB;EAAW,WAAU;EAC7E,UAAA,OAAO,UAAU,UAAU;CACvB,CAAA,GACP,oBAAC,KAAD;EAAK,IAAG;EAAI,SAAQ;EAAO,MAAK;EAAM,WAAW,GAAG,OAAO,WAAW,6BAA6B;EAChG,UAAA,OAAO;CACL,CAAA,CACF;;;ACtHP,IAAM,oBAAoB;AAC1B,IAAM,oBAAoB;AAE1B,SAAS,oBAAoB,aAA6B;CACxD,OAAO,GAAG,oBAAoB;AAChC;AAEA,SAAgB,eAAe,EAAE,UAAU,WAAW,GAAG,SAA0C;CACjG,MAAM,UAAU,kBAAkB;CAElC,MAAM,4BAA4B,eAAwB;EACxD,IAAI,eAAe,mBAAmB;GACpC,QAAQ,wBAAwB,IAAI;GACpC;EACF;EACA,IAAI,OAAO,eAAe,YAAY,CAAC,WAAW,WAAW,iBAAiB,GAAG;EACjF,QAAQ,aAAa,WAAW,MAAM,CAAwB,CAAC;CACjE;CAEA,IAAI,QAAQ,kBAAkB,gBAC5B,OACE,oBAAC,UAAD;EAAU,cAAW;EAAiB,GAAI;EAAO,WAAW,GAAG,SAAS,SAAS;EAC9E;CACO,CAAA;CAId,MAAM,sBAAsB,QAAQ,qBAAqB;CACzD,MAAM,sBAAsB,wBAAwB,KAAA,IAAY,KAAK,oBAAoB,mBAAmB;CAC5G,MAAM,qBAAqB,QAAQ,yBAAyB,oBAAoB;CAEhF,OACE,oBAAC,UAAD;EACE,GAAI;EACJ,WAAW,GAAG,SAAS,SAAS;EAChC,QACE,oBAAC,YAAD;GACE,mBAAiB,QAAQ;GACzB,UAAU,QAAQ;GAClB,OAAO;GACP,eAAe;EAChB,CAAA;EAGF;CACO,CAAA;AAEd;AAUA,SAAgB,kBAAkB,EAChC,OACA,UACA,aACA,WAAW,OACX,aACyB;CACzB,MAAM,UAAU,kBAAkB;CAClC,MAAM,aAAa,QAAQ,YAAY;CAEvC,MAAM,2BAA2B;EAC/B,IAAI,CAAC,YAAY,QAAQ,aAAa,KAAK;CAC7C;CAEA,OACE,oBAAC,kBAAD;EACE,OAAO;EACM;EACb,UAAU;EACC;EACX,SACE,QAAQ,kBAAkB,iBACxB,oBAAC,UAAD;GACE,WAAU;GACV,UAAU;GACV,SAAS,QAAQ,qBAAqB,SAAS,KAAK;GACpD,iBAAiB;EAClB,CAAA,IAED,oBAAC,gBAAD;GAAgB,WAAU;GAAS,UAAU;GAAY,OAAO,oBAAoB,KAAK;EAAI,CAAA;CAGlG,CAAA;AAEL;AAOA,SAAgB,kBAAkB,EAAE,WAAW,OAAO,GAAG,SAAiC;CACxF,MAAM,UAAU,kBAAkB;CAElC,MAAM,0BAA0B,UAAyC;EACvE,QAAQ,iBAAiB,MAAM,OAAO,KAAK;CAC7C;CAEA,MAAM,2BAA2B,UAA2C;EAC1E,IAAI,MAAM,QAAQ,WAAW,CAAC,MAAM,YAAY,aAAa;GAC3D,MAAM,eAAe;GACrB,QAAQ,aAAa;EACvB;CACF;CAEA,OACE,oBAAC,OAAD;EACE,MAAK;EACL,mBAAiB,MAAM,gBAAgB,KAAA,IAAY,QAAQ;EAC3D,aAAY;EACZ,MAAK;EACL,GAAI;EACJ,UAAU,QAAQ,YAAY;EAC9B,OAAO,QAAQ;EACf,UAAU;EACV,WAAW;CACZ,CAAA;AAEL;AAQA,SAAgB,oBAAoB,EAClC,WACA,QAAQ,UACR,aAAa,iBACc;CAC3B,MAAM,UAAU,kBAAkB;CAElC,MAAM,kBAAkB,UAAsC;EAC5D,IAAI,QAAQ,YAAY,MAAM,WAAW,MAAM,eAAe;EAC9D,IAAI,QAAQ,wBAAwB;GAClC,MAAM,cAAc,cAAgC,sBAAoB,CAAC,EAAE,MAAM;GACjF;EACF;EACA,MAAM,cAAc,cAA2B,uCAAmC,CAAC,EAAE,MAAM;CAC7F;CAEA,MAAM,0BAA0B,UAAuC;EAErE,IAAI,QAAQ,0BAA0B,CAAC,QAAQ,WAAW,KAAK,GAAG,MAAM,eAAe;CACzF;CAEA,OACE,qBAAC,WAAD;EACE,MAAK;EACL,cAAW;EACX,iBAAe,QAAQ,YAAY,KAAA;EACnC,UAAU,QAAQ;EAClB,SAAS;EACT,WAAW,GACT,qEACA,CAAC,QAAQ,0BAA0B,eACnC,SACF;EAVF,UAAA,CAYG,QAAQ,kBAAkB,iBACzB,oBAAC,UAAD;GACE,WAAU;GACV,cAAY;GACZ,UAAU,QAAQ;GAClB,SAAS,QAAQ;GACjB,aAAa;GACb,iBAAiB,QAAQ;EAC1B,CAAA,IAED,oBAAC,gBAAD;GAAgB,cAAY;GAAO,WAAU;GAAS,OAAO;EAAoB,CAAA,GAElF,QAAQ,yBACP,oBAAC,mBAAD;GACE,cAAY;GACZ,QAAQ,QAAQ;GAChB,aAAa;GACb,SAAQ;GACR,WAAW,GAAG,8BAA8B,WAAW;GACvD,WAAA;EACD,CAAA,IAED,oBAAC,YAAD;GAAY,WAAU;GACpB,UAAA,oBAAC,KAAD;IAAK,IAAG;IAAO,SAAQ;IAAO,MAAK;IAChC,UAAA;GACE,CAAA;EACK,CAAA,CAEL;;AAEf;AAMA,SAAgB,cAAc,EAAE,OAAO,UAAU,WAAW,OAAO,SAAS,GAAG,SAA6B;CAC1G,MAAM,UAAU,0BAA0B;CAE1C,MAAM,qBAAqB,UAAyC;EAClE,UAAU,KAAK;EACf,IAAI,CAAC,MAAM,oBAAoB,CAAC,UAAU,SAAS,aAAa;CAClE;CAEA,IAAI,SAAS,mBAAmB,CAAC,SAAS,wBAAwB,OAAO;CAEzE,OACE,oBAAC,qBAAD;EACE,GAAI;EACJ,UAAU,YAAa,YAAY,KAAA,KAAa,CAAC,QAAQ;EACzD,SAAS;CACV,CAAA;AAEL;;ACpNA,SAAS,kBAAkB,EACzB,YACA,sBACA,eACA,0BACgD;CAChD,MAAM,oBAAoB,WAAW,KAAK;CAC1C,IAAI,0BAA0B,CAAC,mBAAmB,OAAO,KAAA;CACzD,IAAI,kBAAkB,iBAAiB;EAErC,IAAI,CAAC,0BAA0B,qBAAqB,SAAS,GAAG,OAAO,KAAA;EACvE,OAAO,qBAAqB,KAAA;CAC9B;CAEA,MAAM,eAAe,yBAAyB,CAAC,GAAG,sBAAsB,iBAAiB,IAAI;CAC7F,OAAO,aAAa,SAAS,IAAI,eAAe,KAAA;AAClD;AAEA,SAAS,0BAA0B,sBAAgC,aAA+B;CAChG,IAAI,qBAAqB,SAAS,WAAW,GAC3C,OAAO,qBAAqB,QAAO,kBAAiB,kBAAkB,WAAW;CAEnF,OAAO,CAAC,GAAG,sBAAsB,WAAW;AAC9C;AAEA,SAAgB,YAAY,EAC1B,gBAAgB,iBAChB,WAAW,OACX,UACA,UACA,GAAG,SACgB;CACnB,MAAM,aAAa,MAAM;CACzB,MAAM,CAAC,YAAY,iBAAiB,SAAS,EAAE;CAC/C,MAAM,CAAC,sBAAsB,2BAA2B,SAAmB,CAAC,CAAC;CAC7E,MAAM,CAAC,wBAAwB,6BAA6B,SAAS,KAAK;CAC1E,MAAM,iBAAiB,kBAAkB;EACvC;EACA;EACA;EACA;CACF,CAAC;CACD,MAAM,kBAAkB,CAAC,YAAY,mBAAmB,KAAA;CAExD,MAAM,gBAAgB,gBAAwB;EAC5C,IAAI,UAAU;EACd,IAAI,kBAAkB,gBAAgB;GACpC,yBAAwB,kBAAiB,0BAA0B,eAAe,WAAW,CAAC;GAC9F;EACF;EACA,0BAA0B,KAAK;EAC/B,wBAAwB,CAAC,WAAW,CAAC;EACrC,SAAS,WAAW;CACtB;CAEA,MAAM,2BAA2B,aAAsB;EACrD,IAAI,UAAU;EACd,0BAA0B,QAAQ;EAClC,IAAI,YAAY,kBAAkB,iBAAiB,wBAAwB,CAAC,CAAC;CAC/E;CAEA,MAAM,oBAAoB,SAAiB;EACzC,IAAI,CAAC,UAAU,cAAc,IAAI;CACnC;CAEA,MAAM,kCAAkC;EACtC,IAAI,CAAC,YAAY,CAAC,WAAW,KAAK,GAAG,0BAA0B,KAAK;CACtE;CAEA,MAAM,qBAAqB;EACzB,IAAI,YAAY,mBAAmB,KAAA,GAAW;EAC9C,SAAS,cAAc;CACzB;CAEA,OACE,oBAAC,eAAe,UAAhB;EACE,OAAO;GACL;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;EACF;EAEA,UAAA,oBAAC,kBAAD;GAAkB,MAAK;GAAQ,mBAAiB;GAAY,GAAI;GAC7D;EACe,CAAA;CACK,CAAA;AAE7B;;AC3FA,SAAS,gBAAgB,SAAqD;CAC5E,OACE,SAAS,QAAQ,WACf,QAAQ,UAAU,OAAO,OAAO,UAAU,YAAY,OAAO,KAAK,CACpE,KAAK,CAAC;AAEV;AAEA,SAAS,sBAAsB,EAAE,WAAyC;CACxE,MAAM,EAAE,kBAAkB,kBAAkB;CAC5C,MAAM,gBAAgB,kBAAkB;CACxC,IAAI,QAAQ,WAAW,GACrB,OACE,qBAAC,OAAD;EAAK,WAAU;EAAf,UAAA,CACE,oBAAC,mBAAD,CAAoB,CAAA,GACpB,oBAAC,eAAD,EAAe,WAAU,6BAA8B,CAAA,CACpD;;CAIT,OACE,qBAAAA,YAAA,EAAA,UAAA,CACE,qBAAC,gBAAD,EAAA,UAAA;EACG,QAAQ,KAAI,WACX,oBAAC,mBAAD;GAAsC,OAAO,OAAO;GAAO,aAAa,OAAO;GAC5E,UAAA,OAAO;EACS,GAFK,OAAO,KAEZ,CACpB;EACD,oBAAC,qBAAD,CAAsB,CAAA;EACrB,gBAAgB,oBAAC,eAAD,EAAe,WAAU,0BAA2B,CAAA,IAAI;CAC3D,EAAA,CAAA,GACf,CAAC,gBAAgB,oBAAC,eAAD;EAAe,MAAK;EAAgB,WAAU;CAAQ,CAAA,IAAI,IAC5E,EAAA,CAAA;AAEN;AAMA,SAAS,mBAAmB,EAAE,QAAQ,YAAY,cAAc,SAAS,UAAmC;CAC1G,IAAI,QAAQ,OAAO,oBAAC,eAAD,EAAuB,OAAS,CAAA;CACnD,IAAI,YAAY,OAAO,oBAAC,OAAD;EAAO,SAAQ;EAAU,UAAA;CAAe,CAAA;CAE/D,OACE,qBAAAA,YAAA,EAAA,UAAA;EACE,oBAAC,uBAAD,EAAgC,QAAU,CAAA;EACzC,eAAe,oBAAC,gBAAD,EAAgB,WAAU,aAAc,CAAA,IAAI;EAC3D;CACD,EAAA,CAAA;AAEN;AAEA,SAAgB,QAAQ,EACtB,SACA,QACA,aAAa,OACb,eAAe,OACf,UACA,QACA,GAAG,SACY;CACf,MAAM,UAAU,gBAAgB,QAAQ,OAAO;CAC/C,MAAM,gBAAgB,QAAQ,SAAS,KAAK,QAAQ,kBAAkB;CACtE,MAAM,aAAa,KAAK,UAAU;EAAC,QAAQ;EAAU,QAAQ,KAAI,WAAU,OAAO,KAAK;EAAG,QAAQ;CAAa,CAAC;CAGhH,OACE,oBAAC,aAAD;EAEE,eAAY;EACZ,eAAe,gBAAgB,iBAAiB;EAChD,UAAU,gBAPI,WAAW,KAAA,KAAa;EAQ5B;EACV,GAAI;EAEJ,UAAA,qBAAC,aAAD,EAAA,UAAA,CACE,oBAAC,iBAAD,EAAA,UAAkB,QAAQ,SAA0B,CAAA,GACpD,oBAAC,oBAAD;GACU;GACI;GACE;GACL;GACD;EACT,CAAA,CACU,EAAA,CAAA;CACF,GAjBN,UAiBM;AAEjB"}
|
|
@@ -3,7 +3,7 @@ const require_primitives_raised_surface = require("./primitives/raised-surface.c
|
|
|
3
3
|
const require_icons_Icon = require("./icons/Icon.cjs.js");
|
|
4
4
|
const require_Button = require("./Button-BfICfyxD.cjs");
|
|
5
5
|
const require_Txt = require("./Txt-_00wWxTd.cjs");
|
|
6
|
-
const require_input = require("./input-
|
|
6
|
+
const require_input = require("./input-D_V0m95F.cjs");
|
|
7
7
|
const require_Badge = require("./Badge-DqaMg7Gy.cjs");
|
|
8
8
|
const require_components_Field = require("./components/Field.cjs.js");
|
|
9
9
|
const require_components_Checkbox = require("./components/Checkbox.cjs.js");
|
|
@@ -492,4 +492,4 @@ Object.defineProperty(exports, "AskUserTextAnswer", {
|
|
|
492
492
|
}
|
|
493
493
|
});
|
|
494
494
|
|
|
495
|
-
//# sourceMappingURL=ask-user-
|
|
495
|
+
//# sourceMappingURL=ask-user-DIYcPkoX.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ask-user-DcnUNMM5.cjs","names":["createContext","useContext","cn","raisedSurfaceStyle","Icon","MessageCircleQuestion","Txt","FieldItem","FieldLabel","Button","Check","Badge","Fieldset","cn","RadioGroup","Checkbox","RadioGroupItem","Input","FieldItem","FieldLabel","Txt","useId","useState","_Fragment","Badge"],"sources":["../src/ds/components/ai/ask-user/ask-user-context.ts","../src/ds/components/ai/ask-user/ask-user-layout.tsx","../src/ds/components/ai/ask-user/ask-user-controls.tsx","../src/ds/components/ai/ask-user/ask-user-root.tsx","../src/ds/components/ai/ask-user/ask-user-card.tsx"],"sourcesContent":["import { createContext, useContext } from 'react';\nimport type { AskUserSelectionMode } from './ask-user-types';\n\ninterface AskUserContextValue {\n questionId: string;\n selectionMode: AskUserSelectionMode;\n disabled: boolean;\n answerText: string;\n selectedOptionLabels: string[];\n isCustomAnswerSelected: boolean;\n canSubmitAnswer: boolean;\n selectOption: (optionLabel: string) => void;\n setCustomAnswerSelected: (selected: boolean) => void;\n changeAnswerText: (text: string) => void;\n unselectEmptyCustomAnswer: () => void;\n submitAnswer: () => void;\n}\n\nexport const AskUserContext = createContext<AskUserContextValue | undefined>(undefined);\n\nexport function useOptionalAskUserContext() {\n return useContext(AskUserContext);\n}\n\nexport function useAskUserContext() {\n const context = useOptionalAskUserContext();\n if (!context) throw new Error('AskUser controls must be rendered inside AskUser.Root.');\n return context;\n}\n","import { Check, MessageCircleQuestion } from 'lucide-react';\nimport type { ComponentProps, ReactNode } from 'react';\nimport { useOptionalAskUserContext } from './ask-user-context';\nimport type { AskUserResult } from './ask-user-types';\nimport { Badge } from '@/ds/components/Badge';\nimport { Button } from '@/ds/components/Button';\nimport { FieldItem, FieldLabel } from '@/ds/components/Field';\nimport type { FieldLabelProps } from '@/ds/components/Field';\nimport { Txt } from '@/ds/components/Txt';\nimport { Icon } from '@/ds/icons/Icon';\nimport { raisedSurfaceStyle } from '@/ds/primitives/raised-surface';\nimport { cn } from '@/lib/utils';\n\nexport const AskUserContainer = ({ className, ...props }: ComponentProps<'div'>) => (\n <div\n data-slot=\"ask-user\"\n className={cn(raisedSurfaceStyle, 'w-full overflow-hidden rounded-xl', className)}\n {...props}\n />\n);\n\nexport const AskUserLabel = ({ children = 'Question', className, ...props }: ComponentProps<'div'>) => (\n <div data-slot=\"ask-user-label\" className={cn('flex min-h-10 items-center gap-2 px-4 pt-3', className)} {...props}>\n <Icon size=\"xs\" className=\"text-muted-foreground\">\n <MessageCircleQuestion />\n </Icon>\n <Txt as=\"span\" variant=\"caption\" tone=\"muted\">\n {children}\n </Txt>\n </div>\n);\n\nexport const AskUserBody = ({ className, ...props }: ComponentProps<'div'>) => (\n <div data-slot=\"ask-user-body\" className={cn('p-4', className)} {...props} />\n);\n\nconst AskUserQuestionTitle = ({ children }: { children: ReactNode }) => (\n <span className=\"flex items-start gap-2\">\n <Icon size=\"xs\" className={cn('mt-1 shrink-0', 'text-muted-foreground')} aria-hidden>\n <MessageCircleQuestion />\n </Icon>\n <span className=\"min-w-0\">{children}</span>\n </span>\n);\n\nexport const AskUserQuestion = ({ children, className, ...props }: ComponentProps<typeof Txt>) => {\n const context = useOptionalAskUserContext();\n return (\n <Txt\n as=\"p\"\n variant=\"subheading\"\n tone=\"ink\"\n {...props}\n id={context?.questionId ?? props.id}\n className={cn('mb-3', className)}\n >\n <AskUserQuestionTitle>{children}</AskUserQuestionTitle>\n </Txt>\n );\n};\n\nexport interface AskUserOptionRowProps extends Omit<FieldLabelProps, 'children'> {\n control: ReactNode;\n label: ReactNode;\n description?: string;\n disabled?: boolean;\n}\n\nexport const AskUserOptionRow = ({\n control,\n label,\n description,\n disabled = false,\n className,\n ...props\n}: AskUserOptionRowProps) => (\n <FieldItem disabled={disabled} className=\"contents\">\n <FieldLabel\n // state-layer's wash only stops at :disabled/aria-disabled, and a <label> is neither\n aria-disabled={disabled || undefined}\n className={cn('state-layer flex items-start gap-2.5 rounded-lg px-3 py-2 data-disabled:opacity-50', className)}\n {...props}\n >\n {control}\n <span className=\"grid gap-0.5\">\n <Txt as=\"span\" variant=\"body\" tone=\"ink\">\n {label}\n </Txt>\n {description ? (\n <Txt as=\"span\" variant=\"caption\" tone=\"muted\">\n {description}\n </Txt>\n ) : null}\n </span>\n </FieldLabel>\n </FieldItem>\n);\n\nexport type AskUserSubmitButtonProps = Omit<ComponentProps<typeof Button>, 'children'> & { children?: ReactNode };\n\nexport const AskUserSubmitButton = ({ children = 'Submit answer', ...props }: AskUserSubmitButtonProps) => (\n <Button icon={<Check />} type=\"button\" size=\"sm\" variant=\"primary\" {...props}>\n {children}\n </Button>\n);\n\nexport const AskUserPending = ({ children = 'Submitting…', ...props }: ComponentProps<typeof Txt>) => (\n <Txt as=\"span\" role=\"status\" variant=\"caption\" tone=\"muted\" {...props}>\n {children}\n </Txt>\n);\n\nexport interface AskUserOutputProps extends ComponentProps<'div'> {\n result: AskUserResult;\n}\n\nexport const AskUserOutput = ({ result, className, ...props }: AskUserOutputProps) => (\n <div\n data-slot=\"ask-user-output\"\n role={result.isError ? 'alert' : 'status'}\n className={cn('grid gap-2 rounded-lg bg-fill p-3', className)}\n {...props}\n >\n <Badge size=\"xs\" variant={result.isError ? 'destructive' : 'success'} className=\"justify-self-start\">\n {result.isError ? 'Error' : 'Answered'}\n </Badge>\n <Txt as=\"p\" variant=\"body\" tone=\"ink\" className={cn(result.isError && 'text-destructive-foreground')}>\n {result.content}\n </Txt>\n </div>\n);\n","import type { ChangeEvent, ComponentProps, KeyboardEvent, MouseEvent, ReactNode } from 'react';\nimport { useAskUserContext, useOptionalAskUserContext } from './ask-user-context';\nimport { AskUserOptionRow, AskUserSubmitButton } from './ask-user-layout';\nimport { Checkbox } from '@/ds/components/Checkbox';\nimport { FieldItem, FieldLabel, Fieldset } from '@/ds/components/Field';\nimport { Input } from '@/ds/components/Input';\nimport { RadioGroup, RadioGroupItem } from '@/ds/components/RadioGroup';\nimport { Txt } from '@/ds/components/Txt';\nimport { cn } from '@/lib/utils';\n\n// Keep the UI-only custom choice separate from suggested answer values.\nconst customAnswerValue = 'custom';\nconst optionValuePrefix = 'option:';\n\nfunction getOptionRadioValue(optionLabel: string): string {\n return `${optionValuePrefix}${optionLabel}`;\n}\n\nexport function AskUserOptions({ children, className, ...props }: ComponentProps<typeof Fieldset>) {\n const context = useAskUserContext();\n\n const handleSingleSelectChange = (radioValue: unknown) => {\n if (radioValue === customAnswerValue) {\n context.setCustomAnswerSelected(true);\n return;\n }\n if (typeof radioValue !== 'string' || !radioValue.startsWith(optionValuePrefix)) return;\n context.selectOption(radioValue.slice(optionValuePrefix.length));\n };\n\n if (context.selectionMode === 'multi_select') {\n return (\n <Fieldset aria-label=\"Answer options\" {...props} className={cn('gap-2', className)}>\n {children}\n </Fieldset>\n );\n }\n\n const selectedOptionLabel = context.selectedOptionLabels[0];\n const selectedOptionValue = selectedOptionLabel === undefined ? '' : getOptionRadioValue(selectedOptionLabel);\n const selectedRadioValue = context.isCustomAnswerSelected ? customAnswerValue : selectedOptionValue;\n\n return (\n <Fieldset\n {...props}\n className={cn('gap-2', className)}\n render={\n <RadioGroup\n aria-labelledby={context.questionId}\n disabled={context.disabled}\n value={selectedRadioValue}\n onValueChange={handleSingleSelectChange}\n />\n }\n >\n {children}\n </Fieldset>\n );\n}\n\nexport interface AskUserOptionItemProps {\n value: string;\n children: ReactNode;\n description?: string;\n disabled?: boolean;\n className?: string;\n}\n\nexport function AskUserOptionItem({\n value,\n children,\n description,\n disabled = false,\n className,\n}: AskUserOptionItemProps) {\n const context = useAskUserContext();\n const isDisabled = context.disabled || disabled;\n\n const handleOptionToggle = () => {\n if (!isDisabled) context.selectOption(value);\n };\n\n return (\n <AskUserOptionRow\n label={children}\n description={description}\n disabled={isDisabled}\n className={className}\n control={\n context.selectionMode === 'multi_select' ? (\n <Checkbox\n className=\"mt-0.5\"\n disabled={isDisabled}\n checked={context.selectedOptionLabels.includes(value)}\n onCheckedChange={handleOptionToggle}\n />\n ) : (\n <RadioGroupItem className=\"mt-0.5\" disabled={isDisabled} value={getOptionRadioValue(value)} />\n )\n }\n />\n );\n}\n\nexport type AskUserTextAnswerProps = Omit<\n ComponentProps<typeof Input>,\n 'value' | 'defaultValue' | 'onChange' | 'onKeyDown'\n>;\n\nexport function AskUserTextAnswer({ disabled = false, ...props }: AskUserTextAnswerProps) {\n const context = useAskUserContext();\n\n const handleAnswerTextChange = (event: ChangeEvent<HTMLInputElement>) => {\n context.changeAnswerText(event.target.value);\n };\n\n const handleAnswerTextKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter' && !event.nativeEvent.isComposing) {\n event.preventDefault();\n context.submitAnswer();\n }\n };\n\n return (\n <Input\n type=\"text\"\n aria-labelledby={props['aria-label'] ? undefined : context.questionId}\n placeholder=\"Type your answer\"\n size=\"sm\"\n {...props}\n disabled={context.disabled || disabled}\n value={context.answerText}\n onChange={handleAnswerTextChange}\n onKeyDown={handleAnswerTextKeyDown}\n />\n );\n}\n\nexport interface AskUserCustomAnswerProps {\n className?: string;\n label?: string;\n inputLabel?: string;\n}\n\nexport function AskUserCustomAnswer({\n className,\n label = 'Other…',\n inputLabel = 'Your answer',\n}: AskUserCustomAnswerProps) {\n const context = useAskUserContext();\n\n const handleRowClick = (event: MouseEvent<HTMLDivElement>) => {\n if (context.disabled || event.target !== event.currentTarget) return;\n if (context.isCustomAnswerSelected) {\n event.currentTarget.querySelector<HTMLInputElement>('input[type=\"text\"]')?.focus();\n return;\n }\n event.currentTarget.querySelector<HTMLElement>('[role=\"radio\"], [role=\"checkbox\"]')?.click();\n };\n\n const handleControlMouseDown = (event: MouseEvent<HTMLSpanElement>) => {\n // Let the checkbox click unselect it before blur resets its controlled value.\n if (context.isCustomAnswerSelected && !context.answerText.trim()) event.preventDefault();\n };\n\n return (\n <FieldItem\n role=\"group\"\n aria-label=\"Custom answer\"\n aria-disabled={context.disabled || undefined}\n disabled={context.disabled}\n onClick={handleRowClick}\n className={cn(\n 'items-start gap-2.5 rounded-lg px-3 py-2 data-disabled:opacity-50',\n !context.isCustomAnswerSelected && 'state-layer',\n className,\n )}\n >\n {context.selectionMode === 'multi_select' ? (\n <Checkbox\n className=\"mt-0.5\"\n aria-label={label}\n disabled={context.disabled}\n checked={context.isCustomAnswerSelected}\n onMouseDown={handleControlMouseDown}\n onCheckedChange={context.setCustomAnswerSelected}\n />\n ) : (\n <RadioGroupItem aria-label={label} className=\"mt-0.5\" value={customAnswerValue} />\n )}\n {context.isCustomAnswerSelected ? (\n <AskUserTextAnswer\n aria-label={inputLabel}\n onBlur={context.unselectEmptyCustomAnswer}\n placeholder={label}\n variant=\"unstyled\"\n className={cn('h-auto min-w-0 flex-1 px-0', 'text-body')}\n autoFocus\n />\n ) : (\n <FieldLabel className=\"flex-1\">\n <Txt as=\"span\" variant=\"body\" tone=\"ink\">\n {label}\n </Txt>\n </FieldLabel>\n )}\n </FieldItem>\n );\n}\n\nexport type AskUserSubmitProps = ComponentProps<typeof AskUserSubmitButton> & {\n when?: 'always' | 'custom-answer';\n};\n\nexport function AskUserSubmit({ when = 'always', disabled = false, onClick, ...props }: AskUserSubmitProps) {\n const context = useOptionalAskUserContext();\n\n const handleSubmitClick = (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (!event.defaultPrevented && !disabled) context?.submitAnswer();\n };\n\n if (when === 'custom-answer' && !context?.isCustomAnswerSelected) return null;\n\n return (\n <AskUserSubmitButton\n {...props}\n disabled={disabled || (context !== undefined && !context.canSubmitAnswer)}\n onClick={handleSubmitClick}\n />\n );\n}\n","import { useId, useState } from 'react';\nimport type { ComponentProps } from 'react';\nimport { AskUserContext } from './ask-user-context';\nimport { AskUserContainer } from './ask-user-layout';\nimport type { AskUserAnswer, AskUserSelectionMode } from './ask-user-types';\n\nexport interface AskUserRootProps extends Omit<ComponentProps<typeof AskUserContainer>, 'onSubmit'> {\n selectionMode?: AskUserSelectionMode;\n disabled?: boolean;\n onSubmit: (answer: AskUserAnswer) => void;\n}\n\ninterface AskUserAnswerDraft {\n answerText: string;\n selectedOptionLabels: string[];\n selectionMode: AskUserSelectionMode;\n isCustomAnswerSelected: boolean;\n}\n\nfunction getAnswerToSubmit({\n answerText,\n selectedOptionLabels,\n selectionMode,\n isCustomAnswerSelected,\n}: AskUserAnswerDraft): AskUserAnswer | undefined {\n const trimmedAnswerText = answerText.trim();\n if (isCustomAnswerSelected && !trimmedAnswerText) return undefined;\n if (selectionMode === 'single_select') {\n // Suggested single-select answers already submit when selected.\n if (!isCustomAnswerSelected && selectedOptionLabels.length > 0) return undefined;\n return trimmedAnswerText || undefined;\n }\n\n const answerLabels = isCustomAnswerSelected ? [...selectedOptionLabels, trimmedAnswerText] : selectedOptionLabels;\n return answerLabels.length > 0 ? answerLabels : undefined;\n}\n\nfunction toggleSelectedOptionLabel(selectedOptionLabels: string[], optionLabel: string): string[] {\n if (selectedOptionLabels.includes(optionLabel)) {\n return selectedOptionLabels.filter(selectedLabel => selectedLabel !== optionLabel);\n }\n return [...selectedOptionLabels, optionLabel];\n}\n\nexport function AskUserRoot({\n selectionMode = 'single_select',\n disabled = false,\n onSubmit,\n children,\n ...props\n}: AskUserRootProps) {\n const questionId = useId();\n const [answerText, setAnswerText] = useState('');\n const [selectedOptionLabels, setSelectedOptionLabels] = useState<string[]>([]);\n const [isCustomAnswerSelected, setIsCustomAnswerSelected] = useState(false);\n const answerToSubmit = getAnswerToSubmit({\n answerText,\n selectedOptionLabels,\n selectionMode,\n isCustomAnswerSelected,\n });\n const canSubmitAnswer = !disabled && answerToSubmit !== undefined;\n\n const selectOption = (optionLabel: string) => {\n if (disabled) return;\n if (selectionMode === 'multi_select') {\n setSelectedOptionLabels(currentLabels => toggleSelectedOptionLabel(currentLabels, optionLabel));\n return;\n }\n setIsCustomAnswerSelected(false);\n setSelectedOptionLabels([optionLabel]);\n onSubmit(optionLabel);\n };\n\n const setCustomAnswerSelected = (selected: boolean) => {\n if (disabled) return;\n setIsCustomAnswerSelected(selected);\n if (selected && selectionMode === 'single_select') setSelectedOptionLabels([]);\n };\n\n const changeAnswerText = (text: string) => {\n if (!disabled) setAnswerText(text);\n };\n\n const unselectEmptyCustomAnswer = () => {\n if (!disabled && !answerText.trim()) setIsCustomAnswerSelected(false);\n };\n\n const submitAnswer = () => {\n if (disabled || answerToSubmit === undefined) return;\n onSubmit(answerToSubmit);\n };\n\n return (\n <AskUserContext.Provider\n value={{\n questionId,\n selectionMode,\n disabled,\n answerText,\n selectedOptionLabels,\n isCustomAnswerSelected,\n canSubmitAnswer,\n selectOption,\n setCustomAnswerSelected,\n changeAnswerText,\n unselectEmptyCustomAnswer,\n submitAnswer,\n }}\n >\n <AskUserContainer role=\"group\" aria-labelledby={questionId} {...props}>\n {children}\n </AskUserContainer>\n </AskUserContext.Provider>\n );\n}\n","import type { ComponentProps, ReactNode } from 'react';\nimport { useAskUserContext } from './ask-user-context';\nimport {\n AskUserCustomAnswer,\n AskUserOptionItem,\n AskUserOptions,\n AskUserSubmit,\n AskUserTextAnswer,\n} from './ask-user-controls';\nimport type { AskUserContainer } from './ask-user-layout';\nimport { AskUserBody, AskUserOutput, AskUserPending, AskUserQuestion } from './ask-user-layout';\nimport { AskUserRoot } from './ask-user-root';\nimport type { AskUserAnswer, AskUserOption, AskUserPayload, AskUserResult } from './ask-user-types';\nimport { Badge } from '@/ds/components/Badge';\n\nexport interface AskUserProps extends Omit<ComponentProps<typeof AskUserContainer>, 'children' | 'onSubmit'> {\n payload: AskUserPayload;\n result?: AskUserResult;\n isAnswered?: boolean;\n isSubmitting?: boolean;\n onSubmit: (answer: AskUserAnswer) => void;\n footer?: ReactNode;\n}\n\nfunction getValidOptions(options: AskUserPayload['options']): AskUserOption[] {\n return (\n options?.filter((option): option is AskUserOption =>\n Boolean(option && typeof option.label === 'string' && option.label),\n ) ?? []\n );\n}\n\nfunction AskUserAnswerControls({ options }: { options: AskUserOption[] }) {\n const { selectionMode } = useAskUserContext();\n const isMultiSelect = selectionMode === 'multi_select';\n if (options.length === 0) {\n return (\n <div className=\"flex items-center gap-2\">\n <AskUserTextAnswer />\n <AskUserSubmit className=\"shrink-0 whitespace-nowrap\" />\n </div>\n );\n }\n\n return (\n <>\n <AskUserOptions>\n {options.map(option => (\n <AskUserOptionItem key={option.label} value={option.label} description={option.description}>\n {option.label}\n </AskUserOptionItem>\n ))}\n <AskUserCustomAnswer />\n {isMultiSelect ? <AskUserSubmit className=\"mt-1 justify-self-start\" /> : null}\n </AskUserOptions>\n {!isMultiSelect ? <AskUserSubmit when=\"custom-answer\" className=\"mt-2\" /> : null}\n </>\n );\n}\n\ninterface AskUserCardContentProps extends Pick<AskUserProps, 'result' | 'isAnswered' | 'isSubmitting' | 'footer'> {\n options: AskUserOption[];\n}\n\nfunction AskUserCardContent({ result, isAnswered, isSubmitting, options, footer }: AskUserCardContentProps) {\n if (result) return <AskUserOutput result={result} />;\n if (isAnswered) return <Badge variant=\"success\">Answered</Badge>;\n\n return (\n <>\n <AskUserAnswerControls options={options} />\n {isSubmitting ? <AskUserPending className=\"mt-3 block\" /> : null}\n {footer}\n </>\n );\n}\n\nexport function AskUser({\n payload,\n result,\n isAnswered = false,\n isSubmitting = false,\n onSubmit,\n footer,\n ...props\n}: AskUserProps) {\n const options = getValidOptions(payload.options);\n const isMultiSelect = options.length > 0 && payload.selectionMode === 'multi_select';\n const payloadKey = JSON.stringify([payload.question, options.map(option => option.label), payload.selectionMode]);\n const hasAnswer = result !== undefined || isAnswered;\n\n return (\n <AskUserRoot\n key={payloadKey}\n data-testid=\"ask-user\"\n selectionMode={isMultiSelect ? 'multi_select' : 'single_select'}\n disabled={isSubmitting || hasAnswer}\n onSubmit={onSubmit}\n {...props}\n >\n <AskUserBody>\n <AskUserQuestion>{payload.question}</AskUserQuestion>\n <AskUserCardContent\n result={result}\n isAnswered={isAnswered}\n isSubmitting={isSubmitting}\n options={options}\n footer={footer}\n />\n </AskUserBody>\n </AskUserRoot>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ask-user-DIYcPkoX.cjs","names":["createContext","useContext","cn","raisedSurfaceStyle","Icon","MessageCircleQuestion","Txt","FieldItem","FieldLabel","Button","Check","Badge","Fieldset","cn","RadioGroup","Checkbox","RadioGroupItem","Input","FieldItem","FieldLabel","Txt","useId","useState","_Fragment","Badge"],"sources":["../src/ds/components/ai/ask-user/ask-user-context.ts","../src/ds/components/ai/ask-user/ask-user-layout.tsx","../src/ds/components/ai/ask-user/ask-user-controls.tsx","../src/ds/components/ai/ask-user/ask-user-root.tsx","../src/ds/components/ai/ask-user/ask-user-card.tsx"],"sourcesContent":["import { createContext, useContext } from 'react';\nimport type { AskUserSelectionMode } from './ask-user-types';\n\ninterface AskUserContextValue {\n questionId: string;\n selectionMode: AskUserSelectionMode;\n disabled: boolean;\n answerText: string;\n selectedOptionLabels: string[];\n isCustomAnswerSelected: boolean;\n canSubmitAnswer: boolean;\n selectOption: (optionLabel: string) => void;\n setCustomAnswerSelected: (selected: boolean) => void;\n changeAnswerText: (text: string) => void;\n unselectEmptyCustomAnswer: () => void;\n submitAnswer: () => void;\n}\n\nexport const AskUserContext = createContext<AskUserContextValue | undefined>(undefined);\n\nexport function useOptionalAskUserContext() {\n return useContext(AskUserContext);\n}\n\nexport function useAskUserContext() {\n const context = useOptionalAskUserContext();\n if (!context) throw new Error('AskUser controls must be rendered inside AskUser.Root.');\n return context;\n}\n","import { Check, MessageCircleQuestion } from 'lucide-react';\nimport type { ComponentProps, ReactNode } from 'react';\nimport { useOptionalAskUserContext } from './ask-user-context';\nimport type { AskUserResult } from './ask-user-types';\nimport { Badge } from '@/ds/components/Badge';\nimport { Button } from '@/ds/components/Button';\nimport { FieldItem, FieldLabel } from '@/ds/components/Field';\nimport type { FieldLabelProps } from '@/ds/components/Field';\nimport { Txt } from '@/ds/components/Txt';\nimport { Icon } from '@/ds/icons/Icon';\nimport { raisedSurfaceStyle } from '@/ds/primitives/raised-surface';\nimport { cn } from '@/lib/utils';\n\nexport const AskUserContainer = ({ className, ...props }: ComponentProps<'div'>) => (\n <div\n data-slot=\"ask-user\"\n className={cn(raisedSurfaceStyle, 'w-full overflow-hidden rounded-xl', className)}\n {...props}\n />\n);\n\nexport const AskUserLabel = ({ children = 'Question', className, ...props }: ComponentProps<'div'>) => (\n <div data-slot=\"ask-user-label\" className={cn('flex min-h-10 items-center gap-2 px-4 pt-3', className)} {...props}>\n <Icon size=\"xs\" className=\"text-muted-foreground\">\n <MessageCircleQuestion />\n </Icon>\n <Txt as=\"span\" variant=\"caption\" tone=\"muted\">\n {children}\n </Txt>\n </div>\n);\n\nexport const AskUserBody = ({ className, ...props }: ComponentProps<'div'>) => (\n <div data-slot=\"ask-user-body\" className={cn('p-4', className)} {...props} />\n);\n\nconst AskUserQuestionTitle = ({ children }: { children: ReactNode }) => (\n <span className=\"flex items-start gap-2\">\n <Icon size=\"xs\" className={cn('mt-1 shrink-0', 'text-muted-foreground')} aria-hidden>\n <MessageCircleQuestion />\n </Icon>\n <span className=\"min-w-0\">{children}</span>\n </span>\n);\n\nexport const AskUserQuestion = ({ children, className, ...props }: ComponentProps<typeof Txt>) => {\n const context = useOptionalAskUserContext();\n return (\n <Txt\n as=\"p\"\n variant=\"subheading\"\n tone=\"ink\"\n {...props}\n id={context?.questionId ?? props.id}\n className={cn('mb-3', className)}\n >\n <AskUserQuestionTitle>{children}</AskUserQuestionTitle>\n </Txt>\n );\n};\n\nexport interface AskUserOptionRowProps extends Omit<FieldLabelProps, 'children'> {\n control: ReactNode;\n label: ReactNode;\n description?: string;\n disabled?: boolean;\n}\n\nexport const AskUserOptionRow = ({\n control,\n label,\n description,\n disabled = false,\n className,\n ...props\n}: AskUserOptionRowProps) => (\n <FieldItem disabled={disabled} className=\"contents\">\n <FieldLabel\n // state-layer's wash only stops at :disabled/aria-disabled, and a <label> is neither\n aria-disabled={disabled || undefined}\n className={cn('state-layer flex items-start gap-2.5 rounded-lg px-3 py-2 data-disabled:opacity-50', className)}\n {...props}\n >\n {control}\n <span className=\"grid gap-0.5\">\n <Txt as=\"span\" variant=\"body\" tone=\"ink\">\n {label}\n </Txt>\n {description ? (\n <Txt as=\"span\" variant=\"caption\" tone=\"muted\">\n {description}\n </Txt>\n ) : null}\n </span>\n </FieldLabel>\n </FieldItem>\n);\n\nexport type AskUserSubmitButtonProps = Omit<ComponentProps<typeof Button>, 'children'> & { children?: ReactNode };\n\nexport const AskUserSubmitButton = ({ children = 'Submit answer', ...props }: AskUserSubmitButtonProps) => (\n <Button icon={<Check />} type=\"button\" size=\"sm\" variant=\"primary\" {...props}>\n {children}\n </Button>\n);\n\nexport const AskUserPending = ({ children = 'Submitting…', ...props }: ComponentProps<typeof Txt>) => (\n <Txt as=\"span\" role=\"status\" variant=\"caption\" tone=\"muted\" {...props}>\n {children}\n </Txt>\n);\n\nexport interface AskUserOutputProps extends ComponentProps<'div'> {\n result: AskUserResult;\n}\n\nexport const AskUserOutput = ({ result, className, ...props }: AskUserOutputProps) => (\n <div\n data-slot=\"ask-user-output\"\n role={result.isError ? 'alert' : 'status'}\n className={cn('grid gap-2 rounded-lg bg-fill p-3', className)}\n {...props}\n >\n <Badge size=\"xs\" variant={result.isError ? 'destructive' : 'success'} className=\"justify-self-start\">\n {result.isError ? 'Error' : 'Answered'}\n </Badge>\n <Txt as=\"p\" variant=\"body\" tone=\"ink\" className={cn(result.isError && 'text-destructive-foreground')}>\n {result.content}\n </Txt>\n </div>\n);\n","import type { ChangeEvent, ComponentProps, KeyboardEvent, MouseEvent, ReactNode } from 'react';\nimport { useAskUserContext, useOptionalAskUserContext } from './ask-user-context';\nimport { AskUserOptionRow, AskUserSubmitButton } from './ask-user-layout';\nimport { Checkbox } from '@/ds/components/Checkbox';\nimport { FieldItem, FieldLabel, Fieldset } from '@/ds/components/Field';\nimport { Input } from '@/ds/components/Input';\nimport { RadioGroup, RadioGroupItem } from '@/ds/components/RadioGroup';\nimport { Txt } from '@/ds/components/Txt';\nimport { cn } from '@/lib/utils';\n\n// Keep the UI-only custom choice separate from suggested answer values.\nconst customAnswerValue = 'custom';\nconst optionValuePrefix = 'option:';\n\nfunction getOptionRadioValue(optionLabel: string): string {\n return `${optionValuePrefix}${optionLabel}`;\n}\n\nexport function AskUserOptions({ children, className, ...props }: ComponentProps<typeof Fieldset>) {\n const context = useAskUserContext();\n\n const handleSingleSelectChange = (radioValue: unknown) => {\n if (radioValue === customAnswerValue) {\n context.setCustomAnswerSelected(true);\n return;\n }\n if (typeof radioValue !== 'string' || !radioValue.startsWith(optionValuePrefix)) return;\n context.selectOption(radioValue.slice(optionValuePrefix.length));\n };\n\n if (context.selectionMode === 'multi_select') {\n return (\n <Fieldset aria-label=\"Answer options\" {...props} className={cn('gap-2', className)}>\n {children}\n </Fieldset>\n );\n }\n\n const selectedOptionLabel = context.selectedOptionLabels[0];\n const selectedOptionValue = selectedOptionLabel === undefined ? '' : getOptionRadioValue(selectedOptionLabel);\n const selectedRadioValue = context.isCustomAnswerSelected ? customAnswerValue : selectedOptionValue;\n\n return (\n <Fieldset\n {...props}\n className={cn('gap-2', className)}\n render={\n <RadioGroup\n aria-labelledby={context.questionId}\n disabled={context.disabled}\n value={selectedRadioValue}\n onValueChange={handleSingleSelectChange}\n />\n }\n >\n {children}\n </Fieldset>\n );\n}\n\nexport interface AskUserOptionItemProps {\n value: string;\n children: ReactNode;\n description?: string;\n disabled?: boolean;\n className?: string;\n}\n\nexport function AskUserOptionItem({\n value,\n children,\n description,\n disabled = false,\n className,\n}: AskUserOptionItemProps) {\n const context = useAskUserContext();\n const isDisabled = context.disabled || disabled;\n\n const handleOptionToggle = () => {\n if (!isDisabled) context.selectOption(value);\n };\n\n return (\n <AskUserOptionRow\n label={children}\n description={description}\n disabled={isDisabled}\n className={className}\n control={\n context.selectionMode === 'multi_select' ? (\n <Checkbox\n className=\"mt-0.5\"\n disabled={isDisabled}\n checked={context.selectedOptionLabels.includes(value)}\n onCheckedChange={handleOptionToggle}\n />\n ) : (\n <RadioGroupItem className=\"mt-0.5\" disabled={isDisabled} value={getOptionRadioValue(value)} />\n )\n }\n />\n );\n}\n\nexport type AskUserTextAnswerProps = Omit<\n ComponentProps<typeof Input>,\n 'value' | 'defaultValue' | 'onChange' | 'onKeyDown'\n>;\n\nexport function AskUserTextAnswer({ disabled = false, ...props }: AskUserTextAnswerProps) {\n const context = useAskUserContext();\n\n const handleAnswerTextChange = (event: ChangeEvent<HTMLInputElement>) => {\n context.changeAnswerText(event.target.value);\n };\n\n const handleAnswerTextKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter' && !event.nativeEvent.isComposing) {\n event.preventDefault();\n context.submitAnswer();\n }\n };\n\n return (\n <Input\n type=\"text\"\n aria-labelledby={props['aria-label'] ? undefined : context.questionId}\n placeholder=\"Type your answer\"\n size=\"sm\"\n {...props}\n disabled={context.disabled || disabled}\n value={context.answerText}\n onChange={handleAnswerTextChange}\n onKeyDown={handleAnswerTextKeyDown}\n />\n );\n}\n\nexport interface AskUserCustomAnswerProps {\n className?: string;\n label?: string;\n inputLabel?: string;\n}\n\nexport function AskUserCustomAnswer({\n className,\n label = 'Other…',\n inputLabel = 'Your answer',\n}: AskUserCustomAnswerProps) {\n const context = useAskUserContext();\n\n const handleRowClick = (event: MouseEvent<HTMLDivElement>) => {\n if (context.disabled || event.target !== event.currentTarget) return;\n if (context.isCustomAnswerSelected) {\n event.currentTarget.querySelector<HTMLInputElement>('input[type=\"text\"]')?.focus();\n return;\n }\n event.currentTarget.querySelector<HTMLElement>('[role=\"radio\"], [role=\"checkbox\"]')?.click();\n };\n\n const handleControlMouseDown = (event: MouseEvent<HTMLSpanElement>) => {\n // Let the checkbox click unselect it before blur resets its controlled value.\n if (context.isCustomAnswerSelected && !context.answerText.trim()) event.preventDefault();\n };\n\n return (\n <FieldItem\n role=\"group\"\n aria-label=\"Custom answer\"\n aria-disabled={context.disabled || undefined}\n disabled={context.disabled}\n onClick={handleRowClick}\n className={cn(\n 'items-start gap-2.5 rounded-lg px-3 py-2 data-disabled:opacity-50',\n !context.isCustomAnswerSelected && 'state-layer',\n className,\n )}\n >\n {context.selectionMode === 'multi_select' ? (\n <Checkbox\n className=\"mt-0.5\"\n aria-label={label}\n disabled={context.disabled}\n checked={context.isCustomAnswerSelected}\n onMouseDown={handleControlMouseDown}\n onCheckedChange={context.setCustomAnswerSelected}\n />\n ) : (\n <RadioGroupItem aria-label={label} className=\"mt-0.5\" value={customAnswerValue} />\n )}\n {context.isCustomAnswerSelected ? (\n <AskUserTextAnswer\n aria-label={inputLabel}\n onBlur={context.unselectEmptyCustomAnswer}\n placeholder={label}\n variant=\"unstyled\"\n className={cn('h-auto min-w-0 flex-1 px-0', 'text-body')}\n autoFocus\n />\n ) : (\n <FieldLabel className=\"flex-1\">\n <Txt as=\"span\" variant=\"body\" tone=\"ink\">\n {label}\n </Txt>\n </FieldLabel>\n )}\n </FieldItem>\n );\n}\n\nexport type AskUserSubmitProps = ComponentProps<typeof AskUserSubmitButton> & {\n when?: 'always' | 'custom-answer';\n};\n\nexport function AskUserSubmit({ when = 'always', disabled = false, onClick, ...props }: AskUserSubmitProps) {\n const context = useOptionalAskUserContext();\n\n const handleSubmitClick = (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (!event.defaultPrevented && !disabled) context?.submitAnswer();\n };\n\n if (when === 'custom-answer' && !context?.isCustomAnswerSelected) return null;\n\n return (\n <AskUserSubmitButton\n {...props}\n disabled={disabled || (context !== undefined && !context.canSubmitAnswer)}\n onClick={handleSubmitClick}\n />\n );\n}\n","import { useId, useState } from 'react';\nimport type { ComponentProps } from 'react';\nimport { AskUserContext } from './ask-user-context';\nimport { AskUserContainer } from './ask-user-layout';\nimport type { AskUserAnswer, AskUserSelectionMode } from './ask-user-types';\n\nexport interface AskUserRootProps extends Omit<ComponentProps<typeof AskUserContainer>, 'onSubmit'> {\n selectionMode?: AskUserSelectionMode;\n disabled?: boolean;\n onSubmit: (answer: AskUserAnswer) => void;\n}\n\ninterface AskUserAnswerDraft {\n answerText: string;\n selectedOptionLabels: string[];\n selectionMode: AskUserSelectionMode;\n isCustomAnswerSelected: boolean;\n}\n\nfunction getAnswerToSubmit({\n answerText,\n selectedOptionLabels,\n selectionMode,\n isCustomAnswerSelected,\n}: AskUserAnswerDraft): AskUserAnswer | undefined {\n const trimmedAnswerText = answerText.trim();\n if (isCustomAnswerSelected && !trimmedAnswerText) return undefined;\n if (selectionMode === 'single_select') {\n // Suggested single-select answers already submit when selected.\n if (!isCustomAnswerSelected && selectedOptionLabels.length > 0) return undefined;\n return trimmedAnswerText || undefined;\n }\n\n const answerLabels = isCustomAnswerSelected ? [...selectedOptionLabels, trimmedAnswerText] : selectedOptionLabels;\n return answerLabels.length > 0 ? answerLabels : undefined;\n}\n\nfunction toggleSelectedOptionLabel(selectedOptionLabels: string[], optionLabel: string): string[] {\n if (selectedOptionLabels.includes(optionLabel)) {\n return selectedOptionLabels.filter(selectedLabel => selectedLabel !== optionLabel);\n }\n return [...selectedOptionLabels, optionLabel];\n}\n\nexport function AskUserRoot({\n selectionMode = 'single_select',\n disabled = false,\n onSubmit,\n children,\n ...props\n}: AskUserRootProps) {\n const questionId = useId();\n const [answerText, setAnswerText] = useState('');\n const [selectedOptionLabels, setSelectedOptionLabels] = useState<string[]>([]);\n const [isCustomAnswerSelected, setIsCustomAnswerSelected] = useState(false);\n const answerToSubmit = getAnswerToSubmit({\n answerText,\n selectedOptionLabels,\n selectionMode,\n isCustomAnswerSelected,\n });\n const canSubmitAnswer = !disabled && answerToSubmit !== undefined;\n\n const selectOption = (optionLabel: string) => {\n if (disabled) return;\n if (selectionMode === 'multi_select') {\n setSelectedOptionLabels(currentLabels => toggleSelectedOptionLabel(currentLabels, optionLabel));\n return;\n }\n setIsCustomAnswerSelected(false);\n setSelectedOptionLabels([optionLabel]);\n onSubmit(optionLabel);\n };\n\n const setCustomAnswerSelected = (selected: boolean) => {\n if (disabled) return;\n setIsCustomAnswerSelected(selected);\n if (selected && selectionMode === 'single_select') setSelectedOptionLabels([]);\n };\n\n const changeAnswerText = (text: string) => {\n if (!disabled) setAnswerText(text);\n };\n\n const unselectEmptyCustomAnswer = () => {\n if (!disabled && !answerText.trim()) setIsCustomAnswerSelected(false);\n };\n\n const submitAnswer = () => {\n if (disabled || answerToSubmit === undefined) return;\n onSubmit(answerToSubmit);\n };\n\n return (\n <AskUserContext.Provider\n value={{\n questionId,\n selectionMode,\n disabled,\n answerText,\n selectedOptionLabels,\n isCustomAnswerSelected,\n canSubmitAnswer,\n selectOption,\n setCustomAnswerSelected,\n changeAnswerText,\n unselectEmptyCustomAnswer,\n submitAnswer,\n }}\n >\n <AskUserContainer role=\"group\" aria-labelledby={questionId} {...props}>\n {children}\n </AskUserContainer>\n </AskUserContext.Provider>\n );\n}\n","import type { ComponentProps, ReactNode } from 'react';\nimport { useAskUserContext } from './ask-user-context';\nimport {\n AskUserCustomAnswer,\n AskUserOptionItem,\n AskUserOptions,\n AskUserSubmit,\n AskUserTextAnswer,\n} from './ask-user-controls';\nimport type { AskUserContainer } from './ask-user-layout';\nimport { AskUserBody, AskUserOutput, AskUserPending, AskUserQuestion } from './ask-user-layout';\nimport { AskUserRoot } from './ask-user-root';\nimport type { AskUserAnswer, AskUserOption, AskUserPayload, AskUserResult } from './ask-user-types';\nimport { Badge } from '@/ds/components/Badge';\n\nexport interface AskUserProps extends Omit<ComponentProps<typeof AskUserContainer>, 'children' | 'onSubmit'> {\n payload: AskUserPayload;\n result?: AskUserResult;\n isAnswered?: boolean;\n isSubmitting?: boolean;\n onSubmit: (answer: AskUserAnswer) => void;\n footer?: ReactNode;\n}\n\nfunction getValidOptions(options: AskUserPayload['options']): AskUserOption[] {\n return (\n options?.filter((option): option is AskUserOption =>\n Boolean(option && typeof option.label === 'string' && option.label),\n ) ?? []\n );\n}\n\nfunction AskUserAnswerControls({ options }: { options: AskUserOption[] }) {\n const { selectionMode } = useAskUserContext();\n const isMultiSelect = selectionMode === 'multi_select';\n if (options.length === 0) {\n return (\n <div className=\"flex items-center gap-2\">\n <AskUserTextAnswer />\n <AskUserSubmit className=\"shrink-0 whitespace-nowrap\" />\n </div>\n );\n }\n\n return (\n <>\n <AskUserOptions>\n {options.map(option => (\n <AskUserOptionItem key={option.label} value={option.label} description={option.description}>\n {option.label}\n </AskUserOptionItem>\n ))}\n <AskUserCustomAnswer />\n {isMultiSelect ? <AskUserSubmit className=\"mt-1 justify-self-start\" /> : null}\n </AskUserOptions>\n {!isMultiSelect ? <AskUserSubmit when=\"custom-answer\" className=\"mt-2\" /> : null}\n </>\n );\n}\n\ninterface AskUserCardContentProps extends Pick<AskUserProps, 'result' | 'isAnswered' | 'isSubmitting' | 'footer'> {\n options: AskUserOption[];\n}\n\nfunction AskUserCardContent({ result, isAnswered, isSubmitting, options, footer }: AskUserCardContentProps) {\n if (result) return <AskUserOutput result={result} />;\n if (isAnswered) return <Badge variant=\"success\">Answered</Badge>;\n\n return (\n <>\n <AskUserAnswerControls options={options} />\n {isSubmitting ? <AskUserPending className=\"mt-3 block\" /> : null}\n {footer}\n </>\n );\n}\n\nexport function AskUser({\n payload,\n result,\n isAnswered = false,\n isSubmitting = false,\n onSubmit,\n footer,\n ...props\n}: AskUserProps) {\n const options = getValidOptions(payload.options);\n const isMultiSelect = options.length > 0 && payload.selectionMode === 'multi_select';\n const payloadKey = JSON.stringify([payload.question, options.map(option => option.label), payload.selectionMode]);\n const hasAnswer = result !== undefined || isAnswered;\n\n return (\n <AskUserRoot\n key={payloadKey}\n data-testid=\"ask-user\"\n selectionMode={isMultiSelect ? 'multi_select' : 'single_select'}\n disabled={isSubmitting || hasAnswer}\n onSubmit={onSubmit}\n {...props}\n >\n <AskUserBody>\n <AskUserQuestion>{payload.question}</AskUserQuestion>\n <AskUserCardContent\n result={result}\n isAnswered={isAnswered}\n isSubmitting={isSubmitting}\n options={options}\n footer={footer}\n />\n </AskUserBody>\n </AskUserRoot>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { C as comboboxStyles, S as comboboxPopupWidthClass, _ as ComboboxRoot, b as ComboboxTrigger, g as ComboboxList, l as ComboboxInput, n as ComboboxChips, o as ComboboxContent, r as ComboboxChipsInput, s as ComboboxEmpty, t as ComboboxChip, u as ComboboxItem, v as ComboboxSearch, x as ComboboxValue } from "./combobox-parts-
|
|
1
|
+
import { C as comboboxStyles, S as comboboxPopupWidthClass, _ as ComboboxRoot, b as ComboboxTrigger, g as ComboboxList, l as ComboboxInput, n as ComboboxChips, o as ComboboxContent, r as ComboboxChipsInput, s as ComboboxEmpty, t as ComboboxChip, u as ComboboxItem, v as ComboboxSearch, x as ComboboxValue } from "./combobox-parts-_m3Qgmci.js";
|
|
2
2
|
import { s as isIconButtonSize, t as Button } from "./Button-Bi7aXd_G.js";
|
|
3
3
|
import { n as keepOwnAccessibleName, r as useFieldAriaIds } from "./field-control-aria-BaRSUUMR.js";
|
|
4
4
|
import { n as FieldBlock, t as fieldErrorId } from "./field-error-id-6ZynvsRO.js";
|
|
@@ -303,4 +303,4 @@ function Combobox$1(props) {
|
|
|
303
303
|
}
|
|
304
304
|
export { Combobox$1 as t };
|
|
305
305
|
|
|
306
|
-
//# sourceMappingURL=combobox-
|
|
306
|
+
//# sourceMappingURL=combobox-DLdInLYm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"combobox-lbSxWRMl.js","names":["BaseCombobox","_Fragment","React","Combobox"],"sources":["../src/ds/components/Combobox/combobox.tsx"],"sourcesContent":["import { Combobox as BaseCombobox } from '@base-ui/react/combobox';\nimport { X } from 'lucide-react';\nimport * as React from 'react';\nimport {\n ComboboxChip,\n ComboboxChips,\n ComboboxChipsInput,\n ComboboxContent,\n ComboboxEmpty,\n ComboboxInput,\n ComboboxItem,\n ComboboxList,\n ComboboxRoot,\n ComboboxSearch,\n ComboboxTrigger,\n ComboboxValue,\n} from './combobox-parts';\nimport { comboboxPopupWidthClass, comboboxStyles } from './combobox-styles';\nimport type { ComboboxPopupWidth, ComboboxVariant } from './combobox-styles';\nimport { Button, isIconButtonSize } from '@/ds/components/Button/Button';\nimport type { ButtonSize } from '@/ds/components/Button/Button';\nimport { keepOwnAccessibleName, useFieldAriaIds } from '@/ds/components/Field/field-control-aria';\nimport { FieldBlock } from '@/ds/components/FormFieldBlocks/block/field-block';\nimport { fieldErrorId } from '@/ds/components/FormFieldBlocks/block/field-error-id';\nimport { deprecatedErrorAria } from '@/ds/primitives/form-element';\nimport type { PortalContainer } from '@/ds/primitives/portal-container';\nimport { cn } from '@/lib/utils';\n\nexport type { ComboboxPopupWidth, ComboboxVariant } from './combobox-styles';\n\nexport type ComboboxOption = {\n label: string;\n value: string;\n description?: string;\n displayLabel?: React.ReactNode;\n start?: React.ReactNode;\n end?: React.ReactNode;\n /** Extra terms the search matches besides `label` (aliases, ids, a provider name). Never displayed. */\n keywords?: readonly string[];\n};\n\ntype ComboboxSharedProps = {\n options: ComboboxOption[];\n placeholder?: React.ReactNode;\n /** The search row's placeholder for compact triggers. A field (inside a `Field`) searches in itself and shows `placeholder`. */\n searchPlaceholder?: string;\n emptyText?: string;\n className?: string;\n disabled?: boolean;\n /**\n * `default` inside a `Field` is a form field you type in to search. `ghost` (and the legacy `outline`/`link`),\n * or any variant outside a `Field`, is a compact trigger with the search inside the popup.\n */\n variant?: ComboboxVariant;\n /** Icon sizes (`icon-*`) render a chevron-only trigger with the search in the popup; pass `aria-label` to name it. */\n size?: ButtonSize;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n container?: PortalContainer;\n id?: string;\n 'aria-label'?: string;\n 'aria-describedby'?: string;\n /** Which edge of the trigger the popup lines up with. `end` opens it leftwards (e.g. an icon trigger at the end of a row). */\n align?: 'start' | 'center' | 'end';\n /** A fixed popup width for long options (e.g. model ids). Without it the popup takes the trigger's width, at least 11rem. */\n popupWidth?: ComboboxPopupWidth;\n showChevron?: boolean;\n iconOnlyValue?: boolean;\n allowCustomValue?: boolean;\n /** Called with the search text as it changes (and with `''` after a compact trigger's selection resets it). */\n onInputValueChange?: (value: string) => void;\n /** @deprecated Wrap the combobox in `<Field invalid>` with a `FieldError`. */\n error?: string;\n /** @deprecated Only keyed the `error` message id; a `Field` links its error without one. */\n name?: string;\n};\n\nexport type ComboboxSingleProps = ComboboxSharedProps & {\n multiple?: false;\n value?: string;\n onValueChange?: (value: string) => void;\n};\n\nexport type ComboboxMultipleProps = ComboboxSharedProps & {\n multiple: true;\n value?: readonly string[];\n onValueChange?: (value: string[]) => void;\n clearLabel?: string;\n};\n\nexport type ComboboxProps = ComboboxSingleProps | ComboboxMultipleProps;\n\nconst EMPTY_VALUES: readonly string[] = [];\n\nfunction isMultipleCombobox(props: ComboboxProps): props is ComboboxMultipleProps {\n return props.multiple === true;\n}\n\n/** The text a field shows for its value: a plain-text `displayLabel` wins over `label`. */\nfunction optionText(option: ComboboxOption) {\n return typeof option.displayLabel === 'string' ? option.displayLabel : option.label;\n}\n\n/** Inputs take a text placeholder only; a ReactNode placeholder keeps the compact trigger. */\nfunction textPlaceholder(placeholder: React.ReactNode) {\n return typeof placeholder === 'string' ? placeholder : undefined;\n}\n\n/**\n * How the combobox renders:\n * - `field`: a single select inside a `Field` searches in the field, like a text input.\n * - `chips`: a multiple select inside a `Field` shows its picks as chips and searches in the field.\n * - `trigger`: everything else (toolbars, breadcrumbs, inline pickers that callers lay out as a button)\n * keeps a compact trigger with the search inside the popup.\n */\ntype ComboboxShape = 'field' | 'chips' | 'trigger';\n\nfunction getComboboxShape({\n inFieldContext,\n multiple,\n variant,\n size,\n iconOnlyValue,\n showChevron,\n placeholder,\n}: {\n inFieldContext: boolean;\n multiple: boolean;\n variant: ComboboxVariant;\n size: ButtonSize;\n iconOnlyValue: boolean;\n showChevron: boolean;\n placeholder: React.ReactNode;\n}): ComboboxShape {\n if (!inFieldContext) return 'trigger';\n if (variant !== 'default') return 'trigger';\n if (isIconButtonSize(size)) return 'trigger';\n if (iconOnlyValue || !showChevron) return 'trigger';\n if (placeholder !== undefined && textPlaceholder(placeholder) === undefined) return 'trigger';\n if (!multiple) return 'field';\n // The chips field is tuned to the medium control height.\n if (size !== 'md') return 'trigger';\n return 'chips';\n}\n\n/** A \"Use “text”\" option for typed text that isn't one of the options yet. */\nfunction getCustomOption(options: ComboboxOption[], inputValue: string): ComboboxOption | undefined {\n const value = inputValue.trim();\n if (!value) return undefined;\n // A field shows the selected option's text while it's closed; that isn't a new value.\n if (options.some(option => option.value === value || optionText(option) === value)) return undefined;\n return { label: `Use “${value}”`, value };\n}\n\n/** Matches the label like Base UI's default filter, the text a field shows, and any keywords. */\nfunction useOptionFilter() {\n const { contains } = BaseCombobox.useFilter();\n return (option: ComboboxOption, query: string) =>\n [option.label, optionText(option), ...(option.keywords ?? [])].some(text => contains(text, query));\n}\n\n/** Names the control when nothing else does: an `id` or a `Field` links a label to it instead. */\nfunction getFallbackAriaLabel({ hasLabel, multiple }: { hasLabel: boolean; multiple: boolean }) {\n if (hasLabel) return undefined;\n return multiple ? 'Select options' : 'Select option';\n}\n\nfunction getControlProps({\n id,\n ariaLabel,\n ariaDescribedBy,\n hasLabel,\n multiple,\n error,\n errorName,\n}: {\n id?: string;\n ariaLabel?: string;\n ariaDescribedBy?: string;\n hasLabel: boolean;\n multiple: boolean;\n error?: string;\n errorName: string;\n}) {\n const describedBy = [ariaDescribedBy, error ? fieldErrorId(errorName) : undefined].filter(Boolean).join(' ');\n return {\n id,\n 'aria-label': ariaLabel ?? getFallbackAriaLabel({ hasLabel, multiple }),\n ...keepOwnAccessibleName({ 'aria-label': ariaLabel }),\n ...deprecatedErrorAria(Boolean(error)),\n 'aria-describedby': describedBy || undefined,\n };\n}\n\ntype ControlProps = ReturnType<typeof getControlProps>;\n\nfunction triggerClassName({ iconOnlyValue, className }: { iconOnlyValue: boolean; className?: string }) {\n return cn(iconOnlyValue && 'w-auto px-2.5', className);\n}\n\n/** An option row's content: start slot, label over description, end slot. */\nfunction ComboboxOptionContent({ option }: { option: ComboboxOption }) {\n return (\n <>\n {option.start}\n <span className={comboboxStyles.optionText}>\n <span className={comboboxStyles.optionLabel}>{option.label}</span>\n {option.description && <span className={comboboxStyles.optionDescription}>{option.description}</span>}\n </span>\n {option.end ? <span className={comboboxStyles.optionEnd}>{option.end}</span> : null}\n </>\n );\n}\n\nfunction ComboboxClearFooter({ label, onClear }: { label: string; onClear: () => void }) {\n return (\n <div className=\"border-t border-border p-1\">\n <Button\n type=\"button\"\n variant=\"destructive-ghost\"\n size=\"sm\"\n className=\"w-full justify-start\"\n onClick={onClear}\n icon={<X />}\n >\n {label}\n </Button>\n </div>\n );\n}\n\n/** The popup: the search row for a compact trigger (a field searches in itself), then the options. */\nfunction ComboboxOptionsContent({\n popupWidth,\n showSearch,\n searchPlaceholder,\n emptyText,\n align,\n container,\n footer,\n}: {\n popupWidth?: ComboboxPopupWidth;\n showSearch: boolean;\n searchPlaceholder: string;\n emptyText: string;\n align: 'start' | 'center' | 'end';\n container?: PortalContainer;\n footer?: React.ReactNode;\n}) {\n return (\n <ComboboxContent align={align} container={container} className={popupWidth && comboboxPopupWidthClass[popupWidth]}>\n {showSearch ? <ComboboxSearch placeholder={searchPlaceholder} /> : null}\n <ComboboxEmpty>{emptyText}</ComboboxEmpty>\n <ComboboxList>\n {(option: ComboboxOption) => (\n <ComboboxItem key={option.value} value={option}>\n <ComboboxOptionContent option={option} />\n </ComboboxItem>\n )}\n </ComboboxList>\n {footer}\n </ComboboxContent>\n );\n}\n\ntype TriggerLookProps = {\n variant: ComboboxVariant;\n size: ButtonSize;\n showChevron: boolean;\n iconOnlyValue: boolean;\n className?: string;\n};\n\nfunction SingleComboboxControl({\n shape,\n controlProps,\n placeholder,\n selectedOption,\n look,\n}: {\n shape: ComboboxShape;\n controlProps: ControlProps;\n placeholder: React.ReactNode;\n selectedOption?: ComboboxOption;\n look: TriggerLookProps;\n}) {\n if (shape === 'field') {\n return (\n <ComboboxInput\n {...controlProps}\n size={isIconButtonSize(look.size) ? undefined : look.size}\n placeholder={textPlaceholder(placeholder)}\n start={selectedOption?.start}\n className={look.className}\n />\n );\n }\n\n return (\n <ComboboxTrigger\n {...controlProps}\n variant={look.variant}\n size={look.size}\n showChevron={look.showChevron}\n icon={isIconButtonSize(look.size) ? undefined : selectedOption?.start}\n className={triggerClassName(look)}\n >\n {selectedOption?.displayLabel ?? <ComboboxValue placeholder={placeholder} />}\n </ComboboxTrigger>\n );\n}\n\nfunction MultipleComboboxControl({\n shape,\n controlProps,\n placeholder,\n selectedCount,\n look,\n}: {\n shape: ComboboxShape;\n controlProps: ControlProps;\n placeholder: React.ReactNode;\n selectedCount: number;\n look: TriggerLookProps;\n}) {\n if (shape === 'chips') {\n return (\n <ComboboxChips className={look.className}>\n <ComboboxValue>\n {(items: ComboboxOption[]) => (\n <>\n {items.map(item => (\n <ComboboxChip key={item.value}>{item.label}</ComboboxChip>\n ))}\n <ComboboxChipsInput\n {...controlProps}\n placeholder={items.length === 0 ? textPlaceholder(placeholder) : undefined}\n />\n </>\n )}\n </ComboboxValue>\n </ComboboxChips>\n );\n }\n\n const text = selectedCount === 0 ? placeholder : `${selectedCount} selected`;\n return (\n <ComboboxTrigger\n {...controlProps}\n variant={look.variant}\n size={look.size}\n showChevron={look.showChevron}\n className={triggerClassName(look)}\n >\n <span className={cn(selectedCount === 0 && comboboxStyles.placeholder)}>{text}</span>\n </ComboboxTrigger>\n );\n}\n\ntype ShapeProps = { shape: ComboboxShape; controlProps: ControlProps };\n\nfunction SingleCombobox({\n shape,\n controlProps,\n options,\n value,\n onValueChange,\n placeholder = 'Select option',\n searchPlaceholder = 'Search',\n emptyText = 'No option found.',\n className,\n disabled = false,\n variant = 'default',\n size = 'md',\n open,\n onOpenChange,\n container,\n align = 'start',\n popupWidth,\n showChevron = true,\n iconOnlyValue = false,\n allowCustomValue = false,\n onInputValueChange,\n}: ComboboxSingleProps & ShapeProps) {\n // The search text: a field's own text, or the compact trigger's popup search.\n const [inputValue, setInputValue] = React.useState('');\n const filter = useOptionFilter();\n const inField = shape === 'field';\n const selectedOption = options.find(option => option.value === value);\n const customOption = allowCustomValue ? getCustomOption(options, inputValue) : undefined;\n const items = customOption ? [customOption, ...options] : options;\n\n function handleInputValueChange(next: string) {\n setInputValue(next);\n onInputValueChange?.(next);\n }\n\n function handleValueChange(item: ComboboxOption | null) {\n if (!item) return;\n onValueChange?.(item.value);\n // A field shows the picked option; a compact trigger's popup search starts empty next time.\n if (!inField) handleInputValueChange('');\n }\n\n return (\n <ComboboxRoot\n autoHighlight\n items={items}\n filter={filter}\n itemToStringLabel={optionText}\n // Base UI's \"nothing selected\" is null.\n value={selectedOption ?? null}\n // A field owns its text (the selected option's, or the search); a compact trigger's search is reset here.\n inputValue={inField ? undefined : inputValue}\n onInputValueChange={handleInputValueChange}\n onValueChange={handleValueChange}\n disabled={disabled}\n open={open}\n onOpenChange={onOpenChange}\n >\n <SingleComboboxControl\n shape={shape}\n controlProps={controlProps}\n placeholder={placeholder}\n selectedOption={selectedOption}\n look={{ variant, size, showChevron, iconOnlyValue, className }}\n />\n <ComboboxOptionsContent\n popupWidth={popupWidth}\n showSearch={!inField}\n searchPlaceholder={searchPlaceholder}\n emptyText={emptyText}\n align={align}\n container={container}\n />\n </ComboboxRoot>\n );\n}\n\nfunction MultipleCombobox({\n shape,\n controlProps,\n options,\n value = EMPTY_VALUES,\n onValueChange,\n clearLabel,\n placeholder = 'Select options',\n searchPlaceholder = 'Search',\n emptyText = 'No option found.',\n className,\n disabled = false,\n variant = 'default',\n size = 'md',\n open,\n onOpenChange,\n container,\n align = 'start',\n popupWidth,\n showChevron = true,\n iconOnlyValue = false,\n}: ComboboxMultipleProps & ShapeProps) {\n const filter = useOptionFilter();\n const selectedValues = new Set(value);\n const selectedOptions = options.filter(option => selectedValues.has(option.value));\n const footer =\n clearLabel && selectedOptions.length > 0 ? (\n <ComboboxClearFooter label={clearLabel} onClear={() => onValueChange?.([])} />\n ) : undefined;\n\n return (\n <ComboboxRoot\n multiple\n autoHighlight\n items={options}\n filter={filter}\n value={selectedOptions}\n onValueChange={items => onValueChange?.(items.map(item => item.value))}\n disabled={disabled}\n open={open}\n onOpenChange={onOpenChange}\n >\n <MultipleComboboxControl\n shape={shape}\n controlProps={controlProps}\n placeholder={placeholder}\n selectedCount={selectedOptions.length}\n look={{ variant, size, showChevron, iconOnlyValue, className }}\n />\n <ComboboxOptionsContent\n popupWidth={popupWidth}\n showSearch={shape !== 'chips'}\n searchPlaceholder={searchPlaceholder}\n emptyText={emptyText}\n align={align}\n container={container}\n footer={footer}\n />\n </ComboboxRoot>\n );\n}\n\n/**\n * A searchable select driven by `options`, built on the Combobox parts.\n *\n * Inside a `Field`, a `default` combobox searches right in the field: a text field for a single value,\n * removable chips for `multiple`. Everywhere else (outside a `Field`, `ghost` and icon-size triggers,\n * custom non-text placeholders) it keeps a compact trigger with the search inside the popup. For anything\n * these props don't cover (groups, rich items), compose the parts directly (`ComboboxRoot`, ...).\n */\nexport function Combobox(props: ComboboxProps) {\n const field = useFieldAriaIds();\n const generatedName = React.useId();\n const multiple = isMultipleCombobox(props);\n const shape = getComboboxShape({\n inFieldContext: Boolean(field),\n multiple,\n variant: props.variant ?? 'default',\n size: props.size ?? 'md',\n iconOnlyValue: props.iconOnlyValue ?? false,\n showChevron: props.showChevron ?? true,\n placeholder: props.placeholder,\n });\n const errorName = props.name ?? generatedName;\n const controlProps = getControlProps({\n id: props.id,\n ariaLabel: props['aria-label'],\n ariaDescribedBy: props['aria-describedby'],\n hasLabel: Boolean(props.id || field),\n multiple,\n error: props.error,\n errorName,\n });\n\n const root = isMultipleCombobox(props) ? (\n <MultipleCombobox {...props} shape={shape} controlProps={controlProps} />\n ) : (\n <SingleCombobox {...props} shape={shape} controlProps={controlProps} />\n );\n\n if (!props.error) return root;\n\n return (\n <div className={comboboxStyles.root}>\n {root}\n <FieldBlock.ErrorMsg name={errorName}>{props.error}</FieldBlock.ErrorMsg>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;AA4FA,IAAM,eAAkC,CAAC;AAEzC,SAAS,mBAAmB,OAAsD;CAChF,OAAO,MAAM,aAAa;AAC5B;;AAGA,SAAS,WAAW,QAAwB;CAC1C,OAAO,OAAO,OAAO,iBAAiB,WAAW,OAAO,eAAe,OAAO;AAChF;;AAGA,SAAS,gBAAgB,aAA8B;CACrD,OAAO,OAAO,gBAAgB,WAAW,cAAc,KAAA;AACzD;AAWA,SAAS,iBAAiB,EACxB,gBACA,UACA,SACA,MACA,eACA,aACA,eASgB;CAChB,IAAI,CAAC,gBAAgB,OAAO;CAC5B,IAAI,YAAY,WAAW,OAAO;CAClC,IAAI,iBAAiB,IAAI,GAAG,OAAO;CACnC,IAAI,iBAAiB,CAAC,aAAa,OAAO;CAC1C,IAAI,gBAAgB,KAAA,KAAa,gBAAgB,WAAW,MAAM,KAAA,GAAW,OAAO;CACpF,IAAI,CAAC,UAAU,OAAO;CAEtB,IAAI,SAAS,MAAM,OAAO;CAC1B,OAAO;AACT;;AAGA,SAAS,gBAAgB,SAA2B,YAAgD;CAClG,MAAM,QAAQ,WAAW,KAAK;CAC9B,IAAI,CAAC,OAAO,OAAO,KAAA;CAEnB,IAAI,QAAQ,MAAK,WAAU,OAAO,UAAU,SAAS,WAAW,MAAM,MAAM,KAAK,GAAG,OAAO,KAAA;CAC3F,OAAO;EAAE,OAAO,QAAQ,MAAM;EAAI;CAAM;AAC1C;;AAGA,SAAS,kBAAkB;CACzB,MAAM,EAAE,aAAaA,SAAa,UAAU;CAC5C,QAAQ,QAAwB,UAC9B;EAAC,OAAO;EAAO,WAAW,MAAM;EAAG,GAAI,OAAO,YAAY,CAAC;CAAE,CAAC,CAAC,MAAK,SAAQ,SAAS,MAAM,KAAK,CAAC;AACrG;;AAGA,SAAS,qBAAqB,EAAE,UAAU,YAAsD;CAC9F,IAAI,UAAU,OAAO,KAAA;CACrB,OAAO,WAAW,mBAAmB;AACvC;AAEA,SAAS,gBAAgB,EACvB,IACA,WACA,iBACA,UACA,UACA,OACA,aASC;CACD,MAAM,cAAc,CAAC,iBAAiB,QAAQ,aAAa,SAAS,IAAI,KAAA,CAAS,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;CAC3G,OAAO;EACL;EACA,cAAc,aAAa,qBAAqB;GAAE;GAAU;EAAS,CAAC;EACtE,GAAG,sBAAsB,EAAE,cAAc,UAAU,CAAC;EACpD,GAAG,oBAAoB,QAAQ,KAAK,CAAC;EACrC,oBAAoB,eAAe,KAAA;CACrC;AACF;AAIA,SAAS,iBAAiB,EAAE,eAAe,aAA6D;CACtG,OAAO,GAAG,iBAAiB,iBAAiB,SAAS;AACvD;;AAGA,SAAS,sBAAsB,EAAE,UAAsC;CACrE,OACE,qBAAAC,YAAA,EAAA,UAAA;EACG,OAAO;EACR,qBAAC,QAAD;GAAM,WAAW,eAAe;GAAhC,UAAA,CACE,oBAAC,QAAD;IAAM,WAAW,eAAe;IAAc,UAAA,OAAO;GAAY,CAAA,GAChE,OAAO,eAAe,oBAAC,QAAD;IAAM,WAAW,eAAe;IAAoB,UAAA,OAAO;GAAkB,CAAA,CAChG;;EACL,OAAO,MAAM,oBAAC,QAAD;GAAM,WAAW,eAAe;GAAY,UAAA,OAAO;EAAU,CAAA,IAAI;CAC/E,EAAA,CAAA;AAEN;AAEA,SAAS,oBAAoB,EAAE,OAAO,WAAmD;CACvF,OACE,oBAAC,OAAD;EAAK,WAAU;EACb,UAAA,oBAAC,QAAD;GACE,MAAK;GACL,SAAQ;GACR,MAAK;GACL,WAAU;GACV,SAAS;GACT,MAAM,oBAAC,GAAD,CAAI,CAAA;GAET,UAAA;EACK,CAAA;CACL,CAAA;AAET;;AAGA,SAAS,uBAAuB,EAC9B,YACA,YACA,mBACA,WACA,OACA,WACA,UASC;CACD,OACE,qBAAC,iBAAD;EAAwB;EAAkB;EAAW,WAAW,cAAc,wBAAwB;EAAtG,UAAA;GACG,aAAa,oBAAC,gBAAD,EAAgB,aAAa,kBAAoB,CAAA,IAAI;GACnE,oBAAC,eAAD,EAAA,UAAgB,UAAyB,CAAA;GACzC,oBAAC,cAAD,EAAA,WACI,WACA,oBAAC,cAAD;IAAiC,OAAO;IACtC,UAAA,oBAAC,uBAAD,EAA+B,OAAS,CAAA;GAC5B,GAFK,OAAO,KAEZ,EAEJ,CAAA;GACb;EACc;;AAErB;AAUA,SAAS,sBAAsB,EAC7B,OACA,cACA,aACA,gBACA,QAOC;CACD,IAAI,UAAU,SACZ,OACE,oBAAC,eAAD;EACE,GAAI;EACJ,MAAM,iBAAiB,KAAK,IAAI,IAAI,KAAA,IAAY,KAAK;EACrD,aAAa,gBAAgB,WAAW;EACxC,OAAO,gBAAgB;EACvB,WAAW,KAAK;CACjB,CAAA;CAIL,OACE,oBAAC,iBAAD;EACE,GAAI;EACJ,SAAS,KAAK;EACd,MAAM,KAAK;EACX,aAAa,KAAK;EAClB,MAAM,iBAAiB,KAAK,IAAI,IAAI,KAAA,IAAY,gBAAgB;EAChE,WAAW,iBAAiB,IAAI;EAE/B,UAAA,gBAAgB,gBAAgB,oBAAC,eAAD,EAA4B,YAAc,CAAA;CAC5D,CAAA;AAErB;AAEA,SAAS,wBAAwB,EAC/B,OACA,cACA,aACA,eACA,QAOC;CACD,IAAI,UAAU,SACZ,OACE,oBAAC,eAAD;EAAe,WAAW,KAAK;EAC7B,UAAA,oBAAC,eAAD,EAAA,WACI,UACA,qBAAAA,YAAA,EAAA,UAAA,CACG,MAAM,KAAI,SACT,oBAAC,cAAD,EAAA,UAAgC,KAAK,MAAoB,GAAtC,KAAK,KAAiC,CAC1D,GACD,oBAAC,oBAAD;GACE,GAAI;GACJ,aAAa,MAAM,WAAW,IAAI,gBAAgB,WAAW,IAAI,KAAA;EAClE,CAAA,CACD,EAAA,CAAA,EAES,CAAA;CACF,CAAA;CAInB,MAAM,OAAO,kBAAkB,IAAI,cAAc,GAAG,cAAc;CAClE,OACE,oBAAC,iBAAD;EACE,GAAI;EACJ,SAAS,KAAK;EACd,MAAM,KAAK;EACX,aAAa,KAAK;EAClB,WAAW,iBAAiB,IAAI;EAEhC,UAAA,oBAAC,QAAD;GAAM,WAAW,GAAG,kBAAkB,KAAK,eAAe,WAAW;GAAI,UAAA;EAAW,CAAA;CACrE,CAAA;AAErB;AAIA,SAAS,eAAe,EACtB,OACA,cACA,SACA,OACA,eACA,cAAc,iBACd,oBAAoB,UACpB,YAAY,oBACZ,WACA,WAAW,OACX,UAAU,WACV,OAAO,MACP,MACA,cACA,WACA,QAAQ,SACR,YACA,cAAc,MACd,gBAAgB,OAChB,mBAAmB,OACnB,sBACmC;CAEnC,MAAM,CAAC,YAAY,iBAAiBC,QAAM,SAAS,EAAE;CACrD,MAAM,SAAS,gBAAgB;CAC/B,MAAM,UAAU,UAAU;CAC1B,MAAM,iBAAiB,QAAQ,MAAK,WAAU,OAAO,UAAU,KAAK;CACpE,MAAM,eAAe,mBAAmB,gBAAgB,SAAS,UAAU,IAAI,KAAA;CAC/E,MAAM,QAAQ,eAAe,CAAC,cAAc,GAAG,OAAO,IAAI;CAE1D,SAAS,uBAAuB,MAAc;EAC5C,cAAc,IAAI;EAClB,qBAAqB,IAAI;CAC3B;CAEA,SAAS,kBAAkB,MAA6B;EACtD,IAAI,CAAC,MAAM;EACX,gBAAgB,KAAK,KAAK;EAE1B,IAAI,CAAC,SAAS,uBAAuB,EAAE;CACzC;CAEA,OACE,qBAAC,cAAD;EACE,eAAA;EACO;EACC;EACR,mBAAmB;EAEnB,OAAO,kBAAkB;EAEzB,YAAY,UAAU,KAAA,IAAY;EAClC,oBAAoB;EACpB,eAAe;EACL;EACJ;EACQ;EAbhB,UAAA,CAeE,oBAAC,uBAAD;GACS;GACO;GACD;GACG;GAChB,MAAM;IAAE;IAAS;IAAM;IAAa;IAAe;GAAU;EAC9D,CAAA,GACD,oBAAC,wBAAD;GACc;GACZ,YAAY,CAAC;GACM;GACR;GACJ;GACI;EACZ,CAAA,CACW;;AAElB;AAEA,SAAS,iBAAiB,EACxB,OACA,cACA,SACA,QAAQ,cACR,eACA,YACA,cAAc,kBACd,oBAAoB,UACpB,YAAY,oBACZ,WACA,WAAW,OACX,UAAU,WACV,OAAO,MACP,MACA,cACA,WACA,QAAQ,SACR,YACA,cAAc,MACd,gBAAgB,SACqB;CACrC,MAAM,SAAS,gBAAgB;CAC/B,MAAM,iBAAiB,IAAI,IAAI,KAAK;CACpC,MAAM,kBAAkB,QAAQ,QAAO,WAAU,eAAe,IAAI,OAAO,KAAK,CAAC;CACjF,MAAM,SACJ,cAAc,gBAAgB,SAAS,IACrC,oBAAC,qBAAD;EAAqB,OAAO;EAAY,eAAe,gBAAgB,CAAC,CAAC;CAAI,CAAA,IAC3E,KAAA;CAEN,OACE,qBAAC,cAAD;EACE,UAAA;EACA,eAAA;EACA,OAAO;EACC;EACR,OAAO;EACP,gBAAe,UAAS,gBAAgB,MAAM,KAAI,SAAQ,KAAK,KAAK,CAAC;EAC3D;EACJ;EACQ;EAThB,UAAA,CAWE,oBAAC,yBAAD;GACS;GACO;GACD;GACb,eAAe,gBAAgB;GAC/B,MAAM;IAAE;IAAS;IAAM;IAAa;IAAe;GAAU;EAC9D,CAAA,GACD,oBAAC,wBAAD;GACc;GACZ,YAAY,UAAU;GACH;GACR;GACJ;GACI;GACH;EACT,CAAA,CACW;;AAElB;;;;;;;;;AAUA,SAAgBC,WAAS,OAAsB;CAC7C,MAAM,QAAQ,gBAAgB;CAC9B,MAAM,gBAAgBD,QAAM,MAAM;CAClC,MAAM,WAAW,mBAAmB,KAAK;CACzC,MAAM,QAAQ,iBAAiB;EAC7B,gBAAgB,QAAQ,KAAK;EAC7B;EACA,SAAS,MAAM,WAAW;EAC1B,MAAM,MAAM,QAAQ;EACpB,eAAe,MAAM,iBAAiB;EACtC,aAAa,MAAM,eAAe;EAClC,aAAa,MAAM;CACrB,CAAC;CACD,MAAM,YAAY,MAAM,QAAQ;CAChC,MAAM,eAAe,gBAAgB;EACnC,IAAI,MAAM;EACV,WAAW,MAAM;EACjB,iBAAiB,MAAM;EACvB,UAAU,QAAQ,MAAM,MAAM,KAAK;EACnC;EACA,OAAO,MAAM;EACb;CACF,CAAC;CAED,MAAM,OAAO,mBAAmB,KAAK,IACnC,oBAAC,kBAAD;EAAkB,GAAI;EAAc;EAAqB;CAAe,CAAA,IAExE,oBAAC,gBAAD;EAAgB,GAAI;EAAc;EAAqB;CAAe,CAAA;CAGxE,IAAI,CAAC,MAAM,OAAO,OAAO;CAEzB,OACE,qBAAC,OAAD;EAAK,WAAW,eAAe;EAA/B,UAAA,CACG,MACD,oBAAC,WAAW,UAAZ;GAAqB,MAAM;GAAY,UAAA,MAAM;EAA2B,CAAA,CACrE;;AAET"}
|
|
1
|
+
{"version":3,"file":"combobox-DLdInLYm.js","names":["BaseCombobox","_Fragment","React","Combobox"],"sources":["../src/ds/components/Combobox/combobox.tsx"],"sourcesContent":["import { Combobox as BaseCombobox } from '@base-ui/react/combobox';\nimport { X } from 'lucide-react';\nimport * as React from 'react';\nimport {\n ComboboxChip,\n ComboboxChips,\n ComboboxChipsInput,\n ComboboxContent,\n ComboboxEmpty,\n ComboboxInput,\n ComboboxItem,\n ComboboxList,\n ComboboxRoot,\n ComboboxSearch,\n ComboboxTrigger,\n ComboboxValue,\n} from './combobox-parts';\nimport { comboboxPopupWidthClass, comboboxStyles } from './combobox-styles';\nimport type { ComboboxPopupWidth, ComboboxVariant } from './combobox-styles';\nimport { Button, isIconButtonSize } from '@/ds/components/Button/Button';\nimport type { ButtonSize } from '@/ds/components/Button/Button';\nimport { keepOwnAccessibleName, useFieldAriaIds } from '@/ds/components/Field/field-control-aria';\nimport { FieldBlock } from '@/ds/components/FormFieldBlocks/block/field-block';\nimport { fieldErrorId } from '@/ds/components/FormFieldBlocks/block/field-error-id';\nimport { deprecatedErrorAria } from '@/ds/primitives/form-element';\nimport type { PortalContainer } from '@/ds/primitives/portal-container';\nimport { cn } from '@/lib/utils';\n\nexport type { ComboboxPopupWidth, ComboboxVariant } from './combobox-styles';\n\nexport type ComboboxOption = {\n label: string;\n value: string;\n description?: string;\n displayLabel?: React.ReactNode;\n start?: React.ReactNode;\n end?: React.ReactNode;\n /** Extra terms the search matches besides `label` (aliases, ids, a provider name). Never displayed. */\n keywords?: readonly string[];\n};\n\ntype ComboboxSharedProps = {\n options: ComboboxOption[];\n placeholder?: React.ReactNode;\n /** The search row's placeholder for compact triggers. A field (inside a `Field`) searches in itself and shows `placeholder`. */\n searchPlaceholder?: string;\n emptyText?: string;\n className?: string;\n disabled?: boolean;\n /**\n * `default` inside a `Field` is a form field you type in to search. `ghost` (and the legacy `outline`/`link`),\n * or any variant outside a `Field`, is a compact trigger with the search inside the popup.\n */\n variant?: ComboboxVariant;\n /** Icon sizes (`icon-*`) render a chevron-only trigger with the search in the popup; pass `aria-label` to name it. */\n size?: ButtonSize;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n container?: PortalContainer;\n id?: string;\n 'aria-label'?: string;\n 'aria-describedby'?: string;\n /** Which edge of the trigger the popup lines up with. `end` opens it leftwards (e.g. an icon trigger at the end of a row). */\n align?: 'start' | 'center' | 'end';\n /** A fixed popup width for long options (e.g. model ids). Without it the popup takes the trigger's width, at least 11rem. */\n popupWidth?: ComboboxPopupWidth;\n showChevron?: boolean;\n iconOnlyValue?: boolean;\n allowCustomValue?: boolean;\n /** Called with the search text as it changes (and with `''` after a compact trigger's selection resets it). */\n onInputValueChange?: (value: string) => void;\n /** @deprecated Wrap the combobox in `<Field invalid>` with a `FieldError`. */\n error?: string;\n /** @deprecated Only keyed the `error` message id; a `Field` links its error without one. */\n name?: string;\n};\n\nexport type ComboboxSingleProps = ComboboxSharedProps & {\n multiple?: false;\n value?: string;\n onValueChange?: (value: string) => void;\n};\n\nexport type ComboboxMultipleProps = ComboboxSharedProps & {\n multiple: true;\n value?: readonly string[];\n onValueChange?: (value: string[]) => void;\n clearLabel?: string;\n};\n\nexport type ComboboxProps = ComboboxSingleProps | ComboboxMultipleProps;\n\nconst EMPTY_VALUES: readonly string[] = [];\n\nfunction isMultipleCombobox(props: ComboboxProps): props is ComboboxMultipleProps {\n return props.multiple === true;\n}\n\n/** The text a field shows for its value: a plain-text `displayLabel` wins over `label`. */\nfunction optionText(option: ComboboxOption) {\n return typeof option.displayLabel === 'string' ? option.displayLabel : option.label;\n}\n\n/** Inputs take a text placeholder only; a ReactNode placeholder keeps the compact trigger. */\nfunction textPlaceholder(placeholder: React.ReactNode) {\n return typeof placeholder === 'string' ? placeholder : undefined;\n}\n\n/**\n * How the combobox renders:\n * - `field`: a single select inside a `Field` searches in the field, like a text input.\n * - `chips`: a multiple select inside a `Field` shows its picks as chips and searches in the field.\n * - `trigger`: everything else (toolbars, breadcrumbs, inline pickers that callers lay out as a button)\n * keeps a compact trigger with the search inside the popup.\n */\ntype ComboboxShape = 'field' | 'chips' | 'trigger';\n\nfunction getComboboxShape({\n inFieldContext,\n multiple,\n variant,\n size,\n iconOnlyValue,\n showChevron,\n placeholder,\n}: {\n inFieldContext: boolean;\n multiple: boolean;\n variant: ComboboxVariant;\n size: ButtonSize;\n iconOnlyValue: boolean;\n showChevron: boolean;\n placeholder: React.ReactNode;\n}): ComboboxShape {\n if (!inFieldContext) return 'trigger';\n if (variant !== 'default') return 'trigger';\n if (isIconButtonSize(size)) return 'trigger';\n if (iconOnlyValue || !showChevron) return 'trigger';\n if (placeholder !== undefined && textPlaceholder(placeholder) === undefined) return 'trigger';\n if (!multiple) return 'field';\n // The chips field is tuned to the medium control height.\n if (size !== 'md') return 'trigger';\n return 'chips';\n}\n\n/** A \"Use “text”\" option for typed text that isn't one of the options yet. */\nfunction getCustomOption(options: ComboboxOption[], inputValue: string): ComboboxOption | undefined {\n const value = inputValue.trim();\n if (!value) return undefined;\n // A field shows the selected option's text while it's closed; that isn't a new value.\n if (options.some(option => option.value === value || optionText(option) === value)) return undefined;\n return { label: `Use “${value}”`, value };\n}\n\n/** Matches the label like Base UI's default filter, the text a field shows, and any keywords. */\nfunction useOptionFilter() {\n const { contains } = BaseCombobox.useFilter();\n return (option: ComboboxOption, query: string) =>\n [option.label, optionText(option), ...(option.keywords ?? [])].some(text => contains(text, query));\n}\n\n/** Names the control when nothing else does: an `id` or a `Field` links a label to it instead. */\nfunction getFallbackAriaLabel({ hasLabel, multiple }: { hasLabel: boolean; multiple: boolean }) {\n if (hasLabel) return undefined;\n return multiple ? 'Select options' : 'Select option';\n}\n\nfunction getControlProps({\n id,\n ariaLabel,\n ariaDescribedBy,\n hasLabel,\n multiple,\n error,\n errorName,\n}: {\n id?: string;\n ariaLabel?: string;\n ariaDescribedBy?: string;\n hasLabel: boolean;\n multiple: boolean;\n error?: string;\n errorName: string;\n}) {\n const describedBy = [ariaDescribedBy, error ? fieldErrorId(errorName) : undefined].filter(Boolean).join(' ');\n return {\n id,\n 'aria-label': ariaLabel ?? getFallbackAriaLabel({ hasLabel, multiple }),\n ...keepOwnAccessibleName({ 'aria-label': ariaLabel }),\n ...deprecatedErrorAria(Boolean(error)),\n 'aria-describedby': describedBy || undefined,\n };\n}\n\ntype ControlProps = ReturnType<typeof getControlProps>;\n\nfunction triggerClassName({ iconOnlyValue, className }: { iconOnlyValue: boolean; className?: string }) {\n return cn(iconOnlyValue && 'w-auto px-2.5', className);\n}\n\n/** An option row's content: start slot, label over description, end slot. */\nfunction ComboboxOptionContent({ option }: { option: ComboboxOption }) {\n return (\n <>\n {option.start}\n <span className={comboboxStyles.optionText}>\n <span className={comboboxStyles.optionLabel}>{option.label}</span>\n {option.description && <span className={comboboxStyles.optionDescription}>{option.description}</span>}\n </span>\n {option.end ? <span className={comboboxStyles.optionEnd}>{option.end}</span> : null}\n </>\n );\n}\n\nfunction ComboboxClearFooter({ label, onClear }: { label: string; onClear: () => void }) {\n return (\n <div className=\"border-t border-border p-1\">\n <Button\n type=\"button\"\n variant=\"destructive-ghost\"\n size=\"sm\"\n className=\"w-full justify-start\"\n onClick={onClear}\n icon={<X />}\n >\n {label}\n </Button>\n </div>\n );\n}\n\n/** The popup: the search row for a compact trigger (a field searches in itself), then the options. */\nfunction ComboboxOptionsContent({\n popupWidth,\n showSearch,\n searchPlaceholder,\n emptyText,\n align,\n container,\n footer,\n}: {\n popupWidth?: ComboboxPopupWidth;\n showSearch: boolean;\n searchPlaceholder: string;\n emptyText: string;\n align: 'start' | 'center' | 'end';\n container?: PortalContainer;\n footer?: React.ReactNode;\n}) {\n return (\n <ComboboxContent align={align} container={container} className={popupWidth && comboboxPopupWidthClass[popupWidth]}>\n {showSearch ? <ComboboxSearch placeholder={searchPlaceholder} /> : null}\n <ComboboxEmpty>{emptyText}</ComboboxEmpty>\n <ComboboxList>\n {(option: ComboboxOption) => (\n <ComboboxItem key={option.value} value={option}>\n <ComboboxOptionContent option={option} />\n </ComboboxItem>\n )}\n </ComboboxList>\n {footer}\n </ComboboxContent>\n );\n}\n\ntype TriggerLookProps = {\n variant: ComboboxVariant;\n size: ButtonSize;\n showChevron: boolean;\n iconOnlyValue: boolean;\n className?: string;\n};\n\nfunction SingleComboboxControl({\n shape,\n controlProps,\n placeholder,\n selectedOption,\n look,\n}: {\n shape: ComboboxShape;\n controlProps: ControlProps;\n placeholder: React.ReactNode;\n selectedOption?: ComboboxOption;\n look: TriggerLookProps;\n}) {\n if (shape === 'field') {\n return (\n <ComboboxInput\n {...controlProps}\n size={isIconButtonSize(look.size) ? undefined : look.size}\n placeholder={textPlaceholder(placeholder)}\n start={selectedOption?.start}\n className={look.className}\n />\n );\n }\n\n return (\n <ComboboxTrigger\n {...controlProps}\n variant={look.variant}\n size={look.size}\n showChevron={look.showChevron}\n icon={isIconButtonSize(look.size) ? undefined : selectedOption?.start}\n className={triggerClassName(look)}\n >\n {selectedOption?.displayLabel ?? <ComboboxValue placeholder={placeholder} />}\n </ComboboxTrigger>\n );\n}\n\nfunction MultipleComboboxControl({\n shape,\n controlProps,\n placeholder,\n selectedCount,\n look,\n}: {\n shape: ComboboxShape;\n controlProps: ControlProps;\n placeholder: React.ReactNode;\n selectedCount: number;\n look: TriggerLookProps;\n}) {\n if (shape === 'chips') {\n return (\n <ComboboxChips className={look.className}>\n <ComboboxValue>\n {(items: ComboboxOption[]) => (\n <>\n {items.map(item => (\n <ComboboxChip key={item.value}>{item.label}</ComboboxChip>\n ))}\n <ComboboxChipsInput\n {...controlProps}\n placeholder={items.length === 0 ? textPlaceholder(placeholder) : undefined}\n />\n </>\n )}\n </ComboboxValue>\n </ComboboxChips>\n );\n }\n\n const text = selectedCount === 0 ? placeholder : `${selectedCount} selected`;\n return (\n <ComboboxTrigger\n {...controlProps}\n variant={look.variant}\n size={look.size}\n showChevron={look.showChevron}\n className={triggerClassName(look)}\n >\n <span className={cn(selectedCount === 0 && comboboxStyles.placeholder)}>{text}</span>\n </ComboboxTrigger>\n );\n}\n\ntype ShapeProps = { shape: ComboboxShape; controlProps: ControlProps };\n\nfunction SingleCombobox({\n shape,\n controlProps,\n options,\n value,\n onValueChange,\n placeholder = 'Select option',\n searchPlaceholder = 'Search',\n emptyText = 'No option found.',\n className,\n disabled = false,\n variant = 'default',\n size = 'md',\n open,\n onOpenChange,\n container,\n align = 'start',\n popupWidth,\n showChevron = true,\n iconOnlyValue = false,\n allowCustomValue = false,\n onInputValueChange,\n}: ComboboxSingleProps & ShapeProps) {\n // The search text: a field's own text, or the compact trigger's popup search.\n const [inputValue, setInputValue] = React.useState('');\n const filter = useOptionFilter();\n const inField = shape === 'field';\n const selectedOption = options.find(option => option.value === value);\n const customOption = allowCustomValue ? getCustomOption(options, inputValue) : undefined;\n const items = customOption ? [customOption, ...options] : options;\n\n function handleInputValueChange(next: string) {\n setInputValue(next);\n onInputValueChange?.(next);\n }\n\n function handleValueChange(item: ComboboxOption | null) {\n if (!item) return;\n onValueChange?.(item.value);\n // A field shows the picked option; a compact trigger's popup search starts empty next time.\n if (!inField) handleInputValueChange('');\n }\n\n return (\n <ComboboxRoot\n autoHighlight\n items={items}\n filter={filter}\n itemToStringLabel={optionText}\n // Base UI's \"nothing selected\" is null.\n value={selectedOption ?? null}\n // A field owns its text (the selected option's, or the search); a compact trigger's search is reset here.\n inputValue={inField ? undefined : inputValue}\n onInputValueChange={handleInputValueChange}\n onValueChange={handleValueChange}\n disabled={disabled}\n open={open}\n onOpenChange={onOpenChange}\n >\n <SingleComboboxControl\n shape={shape}\n controlProps={controlProps}\n placeholder={placeholder}\n selectedOption={selectedOption}\n look={{ variant, size, showChevron, iconOnlyValue, className }}\n />\n <ComboboxOptionsContent\n popupWidth={popupWidth}\n showSearch={!inField}\n searchPlaceholder={searchPlaceholder}\n emptyText={emptyText}\n align={align}\n container={container}\n />\n </ComboboxRoot>\n );\n}\n\nfunction MultipleCombobox({\n shape,\n controlProps,\n options,\n value = EMPTY_VALUES,\n onValueChange,\n clearLabel,\n placeholder = 'Select options',\n searchPlaceholder = 'Search',\n emptyText = 'No option found.',\n className,\n disabled = false,\n variant = 'default',\n size = 'md',\n open,\n onOpenChange,\n container,\n align = 'start',\n popupWidth,\n showChevron = true,\n iconOnlyValue = false,\n}: ComboboxMultipleProps & ShapeProps) {\n const filter = useOptionFilter();\n const selectedValues = new Set(value);\n const selectedOptions = options.filter(option => selectedValues.has(option.value));\n const footer =\n clearLabel && selectedOptions.length > 0 ? (\n <ComboboxClearFooter label={clearLabel} onClear={() => onValueChange?.([])} />\n ) : undefined;\n\n return (\n <ComboboxRoot\n multiple\n autoHighlight\n items={options}\n filter={filter}\n value={selectedOptions}\n onValueChange={items => onValueChange?.(items.map(item => item.value))}\n disabled={disabled}\n open={open}\n onOpenChange={onOpenChange}\n >\n <MultipleComboboxControl\n shape={shape}\n controlProps={controlProps}\n placeholder={placeholder}\n selectedCount={selectedOptions.length}\n look={{ variant, size, showChevron, iconOnlyValue, className }}\n />\n <ComboboxOptionsContent\n popupWidth={popupWidth}\n showSearch={shape !== 'chips'}\n searchPlaceholder={searchPlaceholder}\n emptyText={emptyText}\n align={align}\n container={container}\n footer={footer}\n />\n </ComboboxRoot>\n );\n}\n\n/**\n * A searchable select driven by `options`, built on the Combobox parts.\n *\n * Inside a `Field`, a `default` combobox searches right in the field: a text field for a single value,\n * removable chips for `multiple`. Everywhere else (outside a `Field`, `ghost` and icon-size triggers,\n * custom non-text placeholders) it keeps a compact trigger with the search inside the popup. For anything\n * these props don't cover (groups, rich items), compose the parts directly (`ComboboxRoot`, ...).\n */\nexport function Combobox(props: ComboboxProps) {\n const field = useFieldAriaIds();\n const generatedName = React.useId();\n const multiple = isMultipleCombobox(props);\n const shape = getComboboxShape({\n inFieldContext: Boolean(field),\n multiple,\n variant: props.variant ?? 'default',\n size: props.size ?? 'md',\n iconOnlyValue: props.iconOnlyValue ?? false,\n showChevron: props.showChevron ?? true,\n placeholder: props.placeholder,\n });\n const errorName = props.name ?? generatedName;\n const controlProps = getControlProps({\n id: props.id,\n ariaLabel: props['aria-label'],\n ariaDescribedBy: props['aria-describedby'],\n hasLabel: Boolean(props.id || field),\n multiple,\n error: props.error,\n errorName,\n });\n\n const root = isMultipleCombobox(props) ? (\n <MultipleCombobox {...props} shape={shape} controlProps={controlProps} />\n ) : (\n <SingleCombobox {...props} shape={shape} controlProps={controlProps} />\n );\n\n if (!props.error) return root;\n\n return (\n <div className={comboboxStyles.root}>\n {root}\n <FieldBlock.ErrorMsg name={errorName}>{props.error}</FieldBlock.ErrorMsg>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
const require_rolldown_runtime = require("./rolldown-runtime-CmQyd0Gu.cjs");
|
|
2
|
-
const require_combobox_parts = require("./combobox-parts-
|
|
2
|
+
const require_combobox_parts = require("./combobox-parts-C236ZHtn.cjs");
|
|
3
3
|
const require_Button = require("./Button-BfICfyxD.cjs");
|
|
4
4
|
const require_field_control_aria = require("./field-control-aria-Dw0_ObOU.cjs");
|
|
5
5
|
const require_field_error_id = require("./field-error-id-VimPQI_b.cjs");
|
|
@@ -310,4 +310,4 @@ Object.defineProperty(exports, "Combobox", {
|
|
|
310
310
|
}
|
|
311
311
|
});
|
|
312
312
|
|
|
313
|
-
//# sourceMappingURL=combobox-
|
|
313
|
+
//# sourceMappingURL=combobox-DU2jsrGa.cjs.map
|