@flanksource/clicky-ui 0.3.59 → 0.3.60
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/NOTICE.md +58 -0
- package/dist/data/Clicky.cjs +2 -1
- package/dist/data/Clicky.cjs.map +1 -1
- package/dist/data/Clicky.d.ts +2 -0
- package/dist/data/Clicky.d.ts.map +1 -1
- package/dist/data/Clicky.js +2 -1
- package/dist/data/Clicky.js.map +1 -1
- package/dist/data/PromptBanner.model.cjs +10 -0
- package/dist/data/PromptBanner.model.cjs.map +1 -1
- package/dist/data/PromptBanner.model.d.ts +2 -0
- package/dist/data/PromptBanner.model.d.ts.map +1 -1
- package/dist/data/PromptBanner.model.js +10 -1
- package/dist/data/PromptBanner.model.js.map +1 -1
- package/dist/data/PromptDialog.cjs +16 -49
- package/dist/data/PromptDialog.cjs.map +1 -1
- package/dist/data/PromptDialog.d.ts +7 -1
- package/dist/data/PromptDialog.d.ts.map +1 -1
- package/dist/data/PromptDialog.js +17 -50
- package/dist/data/PromptDialog.js.map +1 -1
- package/dist/data/PromptForm.cjs +79 -0
- package/dist/data/PromptForm.cjs.map +1 -0
- package/dist/data/PromptForm.d.ts +26 -0
- package/dist/data/PromptForm.d.ts.map +1 -0
- package/dist/data/PromptForm.js +79 -0
- package/dist/data/PromptForm.js.map +1 -0
- package/dist/data/PromptIndicator.cjs +82 -0
- package/dist/data/PromptIndicator.cjs.map +1 -0
- package/dist/data/PromptIndicator.d.ts +19 -0
- package/dist/data/PromptIndicator.d.ts.map +1 -0
- package/dist/data/PromptIndicator.js +82 -0
- package/dist/data/PromptIndicator.js.map +1 -0
- package/dist/data/PromptList.cjs +67 -0
- package/dist/data/PromptList.cjs.map +1 -0
- package/dist/data/PromptList.d.ts +13 -0
- package/dist/data/PromptList.d.ts.map +1 -0
- package/dist/data/PromptList.js +67 -0
- package/dist/data/PromptList.js.map +1 -0
- package/dist/data/git/GitChangeList.cjs +11 -4
- package/dist/data/git/GitChangeList.cjs.map +1 -1
- package/dist/data/git/GitChangeList.d.ts +2 -35
- package/dist/data/git/GitChangeList.d.ts.map +1 -1
- package/dist/data/git/GitChangeList.js +11 -4
- package/dist/data/git/GitChangeList.js.map +1 -1
- package/dist/data/git/GitLink.cjs +13 -0
- package/dist/data/git/GitLink.cjs.map +1 -0
- package/dist/data/git/GitLink.d.ts +8 -0
- package/dist/data/git/GitLink.d.ts.map +1 -0
- package/dist/data/git/GitLink.js +13 -0
- package/dist/data/git/GitLink.js.map +1 -0
- package/dist/data/git/git-links.cjs +54 -0
- package/dist/data/git/git-links.cjs.map +1 -0
- package/dist/data/git/git-links.d.ts +4 -0
- package/dist/data/git/git-links.d.ts.map +1 -0
- package/dist/data/git/git-links.js +53 -0
- package/dist/data/git/git-links.js.map +1 -0
- package/dist/data/git/index.d.ts +3 -0
- package/dist/data/git/index.d.ts.map +1 -1
- package/dist/data/git/types.d.ts +54 -0
- package/dist/data/git/types.d.ts.map +1 -0
- package/dist/data/test-runner/MatrixMarks.cjs +4 -3
- package/dist/data/test-runner/MatrixMarks.cjs.map +1 -1
- package/dist/data/test-runner/MatrixMarks.d.ts +7 -4
- package/dist/data/test-runner/MatrixMarks.d.ts.map +1 -1
- package/dist/data/test-runner/MatrixMarks.js +4 -3
- package/dist/data/test-runner/MatrixMarks.js.map +1 -1
- package/dist/data/test-runner/TestRunSummary.cjs +1 -1
- package/dist/data/test-runner/TestRunSummary.cjs.map +1 -1
- package/dist/data/test-runner/TestRunSummary.js +1 -1
- package/dist/data/test-runner/TestRunSummary.js.map +1 -1
- package/dist/data/test-runner/TestTree.cjs +1 -1
- package/dist/data/test-runner/TestTree.cjs.map +1 -1
- package/dist/data/test-runner/TestTree.js +1 -1
- package/dist/data/test-runner/TestTree.js.map +1 -1
- package/dist/data/test-runner/TestTreeNode.cjs +2 -2
- package/dist/data/test-runner/TestTreeNode.cjs.map +1 -1
- package/dist/data/test-runner/TestTreeNode.js +2 -2
- package/dist/data/test-runner/TestTreeNode.js.map +1 -1
- package/dist/data/test-runner/adapter.cjs +7 -0
- package/dist/data/test-runner/adapter.cjs.map +1 -1
- package/dist/data/test-runner/adapter.d.ts +7 -0
- package/dist/data/test-runner/adapter.d.ts.map +1 -1
- package/dist/data/test-runner/adapter.js +7 -0
- package/dist/data/test-runner/adapter.js.map +1 -1
- package/dist/data/test-runner/index.d.ts +1 -1
- package/dist/data/test-runner/index.d.ts.map +1 -1
- package/dist/data/test-runner/marks.cjs +3 -3
- package/dist/data/test-runner/marks.cjs.map +1 -1
- package/dist/data/test-runner/marks.js +3 -3
- package/dist/data/test-runner/marks.js.map +1 -1
- package/dist/data/test-runner/matrix-marks.cjs +12 -3
- package/dist/data/test-runner/matrix-marks.cjs.map +1 -1
- package/dist/data/test-runner/matrix-marks.d.ts +13 -0
- package/dist/data/test-runner/matrix-marks.d.ts.map +1 -1
- package/dist/data/test-runner/matrix-marks.js +12 -3
- package/dist/data/test-runner/matrix-marks.js.map +1 -1
- package/dist/data/test-runner/status.cjs +1 -1
- package/dist/data/test-runner/status.cjs.map +1 -1
- package/dist/data/test-runner/status.js +1 -1
- package/dist/data/test-runner/status.js.map +1 -1
- package/dist/data/test-runner/types.d.ts +2 -0
- package/dist/data/test-runner/types.d.ts.map +1 -1
- package/dist/data/verification/adapterViews.cjs +3 -1
- package/dist/data/verification/adapterViews.cjs.map +1 -1
- package/dist/data/verification/adapterViews.d.ts +5 -2
- package/dist/data/verification/adapterViews.d.ts.map +1 -1
- package/dist/data/verification/adapterViews.js +4 -2
- package/dist/data/verification/adapterViews.js.map +1 -1
- package/dist/data/verification/adapters.cjs +28 -7
- package/dist/data/verification/adapters.cjs.map +1 -1
- package/dist/data/verification/adapters.d.ts +7 -1
- package/dist/data/verification/adapters.d.ts.map +1 -1
- package/dist/data/verification/adapters.js +28 -7
- package/dist/data/verification/adapters.js.map +1 -1
- package/dist/data/verification/stepKind.cjs +1 -0
- package/dist/data/verification/stepKind.cjs.map +1 -1
- package/dist/data/verification/stepKind.d.ts.map +1 -1
- package/dist/data/verification/stepKind.js +1 -0
- package/dist/data/verification/stepKind.js.map +1 -1
- package/dist/data/verification/stepKindViews.cjs +17 -0
- package/dist/data/verification/stepKindViews.cjs.map +1 -1
- package/dist/data/verification/stepKindViews.d.ts +4 -0
- package/dist/data/verification/stepKindViews.d.ts.map +1 -1
- package/dist/data/verification/stepKindViews.js +17 -1
- package/dist/data/verification/stepKindViews.js.map +1 -1
- package/dist/data/version-info.cjs +3 -3
- package/dist/data/version-info.js +3 -3
- package/dist/data.cjs +114 -0
- package/dist/data.d.ts +3 -0
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +51 -1
- package/dist/git.cjs +6 -0
- package/dist/git.d.ts +4 -0
- package/dist/git.d.ts.map +1 -0
- package/dist/git.js +3 -0
- package/dist/hooks/use-prompts.cjs +18 -11
- package/dist/hooks/use-prompts.cjs.map +1 -1
- package/dist/hooks/use-prompts.d.ts.map +1 -1
- package/dist/hooks/use-prompts.js +18 -11
- package/dist/hooks/use-prompts.js.map +1 -1
- package/dist/icons/components/UiApi.cjs +37 -0
- package/dist/icons/components/UiApi.cjs.map +1 -0
- package/dist/icons/components/UiApi.d.ts +9 -0
- package/dist/icons/components/UiApi.d.ts.map +1 -0
- package/dist/icons/components/UiApi.js +35 -0
- package/dist/icons/components/UiApi.js.map +1 -0
- package/dist/icons/components/UiApiBridge.cjs +38 -0
- package/dist/icons/components/UiApiBridge.cjs.map +1 -0
- package/dist/icons/components/UiApiBridge.d.ts +9 -0
- package/dist/icons/components/UiApiBridge.d.ts.map +1 -0
- package/dist/icons/components/UiApiBridge.js +36 -0
- package/dist/icons/components/UiApiBridge.js.map +1 -0
- package/dist/icons/components/UiApiGateway.cjs +33 -0
- package/dist/icons/components/UiApiGateway.cjs.map +1 -0
- package/dist/icons/components/UiApiGateway.d.ts +9 -0
- package/dist/icons/components/UiApiGateway.d.ts.map +1 -0
- package/dist/icons/components/UiApiGateway.js +31 -0
- package/dist/icons/components/UiApiGateway.js.map +1 -0
- package/dist/icons/components/UiApiRequest.cjs +37 -0
- package/dist/icons/components/UiApiRequest.cjs.map +1 -0
- package/dist/icons/components/UiApiRequest.d.ts +9 -0
- package/dist/icons/components/UiApiRequest.d.ts.map +1 -0
- package/dist/icons/components/UiApiRequest.js +35 -0
- package/dist/icons/components/UiApiRequest.js.map +1 -0
- package/dist/icons/components/UiArrowDecision.cjs +51 -0
- package/dist/icons/components/UiArrowDecision.cjs.map +1 -0
- package/dist/icons/components/UiArrowDecision.d.ts +15 -0
- package/dist/icons/components/UiArrowDecision.d.ts.map +1 -0
- package/dist/icons/components/UiArrowDecision.js +48 -0
- package/dist/icons/components/UiArrowDecision.js.map +1 -0
- package/dist/icons/components/UiArrowSquareIn.cjs +51 -0
- package/dist/icons/components/UiArrowSquareIn.cjs.map +1 -0
- package/dist/icons/components/UiArrowSquareIn.d.ts +15 -0
- package/dist/icons/components/UiArrowSquareIn.d.ts.map +1 -0
- package/dist/icons/components/UiArrowSquareIn.js +48 -0
- package/dist/icons/components/UiArrowSquareIn.js.map +1 -0
- package/dist/icons/components/UiBatchCheck.cjs +55 -0
- package/dist/icons/components/UiBatchCheck.cjs.map +1 -0
- package/dist/icons/components/UiBatchCheck.d.ts +15 -0
- package/dist/icons/components/UiBatchCheck.d.ts.map +1 -0
- package/dist/icons/components/UiBatchCheck.js +52 -0
- package/dist/icons/components/UiBatchCheck.js.map +1 -0
- package/dist/icons/components/UiBatchJob.cjs +39 -0
- package/dist/icons/components/UiBatchJob.cjs.map +1 -0
- package/dist/icons/components/UiBatchJob.d.ts +9 -0
- package/dist/icons/components/UiBatchJob.d.ts.map +1 -0
- package/dist/icons/components/UiBatchJob.js +37 -0
- package/dist/icons/components/UiBatchJob.js.map +1 -0
- package/dist/icons/components/UiBatchRequest.cjs +39 -0
- package/dist/icons/components/UiBatchRequest.cjs.map +1 -0
- package/dist/icons/components/UiBatchRequest.d.ts +9 -0
- package/dist/icons/components/UiBatchRequest.d.ts.map +1 -0
- package/dist/icons/components/UiBatchRequest.js +37 -0
- package/dist/icons/components/UiBatchRequest.js.map +1 -0
- package/dist/icons/components/UiBpmnConditional.cjs +29 -0
- package/dist/icons/components/UiBpmnConditional.cjs.map +1 -0
- package/dist/icons/components/UiBpmnConditional.d.ts +9 -0
- package/dist/icons/components/UiBpmnConditional.d.ts.map +1 -0
- package/dist/icons/components/UiBpmnConditional.js +27 -0
- package/dist/icons/components/UiBpmnConditional.js.map +1 -0
- package/dist/icons/components/UiBranchFlow.cjs +33 -0
- package/dist/icons/components/UiBranchFlow.cjs.map +1 -0
- package/dist/icons/components/UiBranchFlow.d.ts +9 -0
- package/dist/icons/components/UiBranchFlow.d.ts.map +1 -0
- package/dist/icons/components/UiBranchFlow.js +31 -0
- package/dist/icons/components/UiBranchFlow.js.map +1 -0
- package/dist/icons/components/UiClassicBatch.cjs +29 -0
- package/dist/icons/components/UiClassicBatch.cjs.map +1 -0
- package/dist/icons/components/UiClassicBatch.d.ts +9 -0
- package/dist/icons/components/UiClassicBatch.d.ts.map +1 -0
- package/dist/icons/components/UiClassicBatch.js +27 -0
- package/dist/icons/components/UiClassicBatch.js.map +1 -0
- package/dist/icons/components/UiCodeFile.cjs +29 -0
- package/dist/icons/components/UiCodeFile.cjs.map +1 -0
- package/dist/icons/components/UiCodeFile.d.ts +9 -0
- package/dist/icons/components/UiCodeFile.d.ts.map +1 -0
- package/dist/icons/components/UiCodeFile.js +27 -0
- package/dist/icons/components/UiCodeFile.js.map +1 -0
- package/dist/icons/components/UiColumnsLayout.cjs +29 -0
- package/dist/icons/components/UiColumnsLayout.cjs.map +1 -0
- package/dist/icons/components/UiColumnsLayout.d.ts +9 -0
- package/dist/icons/components/UiColumnsLayout.d.ts.map +1 -0
- package/dist/icons/components/UiColumnsLayout.js +27 -0
- package/dist/icons/components/UiColumnsLayout.js.map +1 -0
- package/dist/icons/components/UiCondition.cjs +37 -0
- package/dist/icons/components/UiCondition.cjs.map +1 -0
- package/dist/icons/components/UiCondition.d.ts +9 -0
- package/dist/icons/components/UiCondition.d.ts.map +1 -0
- package/dist/icons/components/UiCondition.js +35 -0
- package/dist/icons/components/UiCondition.js.map +1 -0
- package/dist/icons/components/UiConditions.cjs +29 -0
- package/dist/icons/components/UiConditions.cjs.map +1 -0
- package/dist/icons/components/UiConditions.d.ts +9 -0
- package/dist/icons/components/UiConditions.d.ts.map +1 -0
- package/dist/icons/components/UiConditions.js +27 -0
- package/dist/icons/components/UiConditions.js.map +1 -0
- package/dist/icons/components/UiDelayQueue.cjs +40 -0
- package/dist/icons/components/UiDelayQueue.cjs.map +1 -0
- package/dist/icons/components/UiDelayQueue.d.ts +9 -0
- package/dist/icons/components/UiDelayQueue.d.ts.map +1 -0
- package/dist/icons/components/UiDelayQueue.js +38 -0
- package/dist/icons/components/UiDelayQueue.js.map +1 -0
- package/dist/icons/components/UiDynamicForm.cjs +51 -0
- package/dist/icons/components/UiDynamicForm.cjs.map +1 -0
- package/dist/icons/components/UiDynamicForm.d.ts +15 -0
- package/dist/icons/components/UiDynamicForm.d.ts.map +1 -0
- package/dist/icons/components/UiDynamicForm.js +48 -0
- package/dist/icons/components/UiDynamicForm.js.map +1 -0
- package/dist/icons/components/UiFlowArrow.cjs +51 -0
- package/dist/icons/components/UiFlowArrow.cjs.map +1 -0
- package/dist/icons/components/UiFlowArrow.d.ts +15 -0
- package/dist/icons/components/UiFlowArrow.d.ts.map +1 -0
- package/dist/icons/components/UiFlowArrow.js +48 -0
- package/dist/icons/components/UiFlowArrow.js.map +1 -0
- package/dist/icons/components/UiFormFields.cjs +33 -0
- package/dist/icons/components/UiFormFields.cjs.map +1 -0
- package/dist/icons/components/UiFormFields.d.ts +9 -0
- package/dist/icons/components/UiFormFields.d.ts.map +1 -0
- package/dist/icons/components/UiFormFields.js +31 -0
- package/dist/icons/components/UiFormFields.js.map +1 -0
- package/dist/icons/components/UiFormStep.cjs +38 -0
- package/dist/icons/components/UiFormStep.cjs.map +1 -0
- package/dist/icons/components/UiFormStep.d.ts +9 -0
- package/dist/icons/components/UiFormStep.d.ts.map +1 -0
- package/dist/icons/components/UiFormStep.js +36 -0
- package/dist/icons/components/UiFormStep.js.map +1 -0
- package/dist/icons/components/UiGatewayApi.cjs +32 -0
- package/dist/icons/components/UiGatewayApi.cjs.map +1 -0
- package/dist/icons/components/UiGatewayApi.d.ts +9 -0
- package/dist/icons/components/UiGatewayApi.d.ts.map +1 -0
- package/dist/icons/components/UiGatewayApi.js +30 -0
- package/dist/icons/components/UiGatewayApi.js.map +1 -0
- package/dist/icons/components/UiImportArrow.cjs +29 -0
- package/dist/icons/components/UiImportArrow.cjs.map +1 -0
- package/dist/icons/components/UiImportArrow.d.ts +9 -0
- package/dist/icons/components/UiImportArrow.d.ts.map +1 -0
- package/dist/icons/components/UiImportArrow.js +27 -0
- package/dist/icons/components/UiImportArrow.js.map +1 -0
- package/dist/icons/components/UiInputField.cjs +33 -0
- package/dist/icons/components/UiInputField.cjs.map +1 -0
- package/dist/icons/components/UiInputField.d.ts +9 -0
- package/dist/icons/components/UiInputField.d.ts.map +1 -0
- package/dist/icons/components/UiInputField.js +31 -0
- package/dist/icons/components/UiInputField.js.map +1 -0
- package/dist/icons/components/UiInsertTable.cjs +29 -0
- package/dist/icons/components/UiInsertTable.cjs.map +1 -0
- package/dist/icons/components/UiInsertTable.d.ts +9 -0
- package/dist/icons/components/UiInsertTable.d.ts.map +1 -0
- package/dist/icons/components/UiInsertTable.js +27 -0
- package/dist/icons/components/UiInsertTable.js.map +1 -0
- package/dist/icons/components/UiLayoutTemplate.cjs +32 -0
- package/dist/icons/components/UiLayoutTemplate.cjs.map +1 -0
- package/dist/icons/components/UiLayoutTemplate.d.ts +9 -0
- package/dist/icons/components/UiLayoutTemplate.d.ts.map +1 -0
- package/dist/icons/components/UiLayoutTemplate.js +30 -0
- package/dist/icons/components/UiLayoutTemplate.js.map +1 -0
- package/dist/icons/components/UiLayoutWindow.cjs +56 -0
- package/dist/icons/components/UiLayoutWindow.cjs.map +1 -0
- package/dist/icons/components/UiLayoutWindow.d.ts +15 -0
- package/dist/icons/components/UiLayoutWindow.d.ts.map +1 -0
- package/dist/icons/components/UiLayoutWindow.js +53 -0
- package/dist/icons/components/UiLayoutWindow.js.map +1 -0
- package/dist/icons/components/UiListEnd.cjs +33 -0
- package/dist/icons/components/UiListEnd.cjs.map +1 -0
- package/dist/icons/components/UiListEnd.d.ts +9 -0
- package/dist/icons/components/UiListEnd.d.ts.map +1 -0
- package/dist/icons/components/UiListEnd.js +31 -0
- package/dist/icons/components/UiListEnd.js.map +1 -0
- package/dist/icons/components/UiListEndLine.cjs +51 -0
- package/dist/icons/components/UiListEndLine.cjs.map +1 -0
- package/dist/icons/components/UiListEndLine.d.ts +15 -0
- package/dist/icons/components/UiListEndLine.d.ts.map +1 -0
- package/dist/icons/components/UiListEndLine.js +48 -0
- package/dist/icons/components/UiListEndLine.js.map +1 -0
- package/dist/icons/components/UiListNumbers.cjs +51 -0
- package/dist/icons/components/UiListNumbers.cjs.map +1 -0
- package/dist/icons/components/UiListNumbers.d.ts +15 -0
- package/dist/icons/components/UiListNumbers.d.ts.map +1 -0
- package/dist/icons/components/UiListNumbers.js +48 -0
- package/dist/icons/components/UiListNumbers.js.map +1 -0
- package/dist/icons/components/UiLowPriority.cjs +29 -0
- package/dist/icons/components/UiLowPriority.cjs.map +1 -0
- package/dist/icons/components/UiLowPriority.d.ts +9 -0
- package/dist/icons/components/UiLowPriority.d.ts.map +1 -0
- package/dist/icons/components/UiLowPriority.js +27 -0
- package/dist/icons/components/UiLowPriority.js.map +1 -0
- package/dist/icons/components/UiMergeQueue.cjs +38 -0
- package/dist/icons/components/UiMergeQueue.cjs.map +1 -0
- package/dist/icons/components/UiMergeQueue.d.ts +9 -0
- package/dist/icons/components/UiMergeQueue.d.ts.map +1 -0
- package/dist/icons/components/UiMergeQueue.js +36 -0
- package/dist/icons/components/UiMergeQueue.js.map +1 -0
- package/dist/icons/components/UiPipelineStage.cjs +33 -0
- package/dist/icons/components/UiPipelineStage.cjs.map +1 -0
- package/dist/icons/components/UiPipelineStage.d.ts +9 -0
- package/dist/icons/components/UiPipelineStage.d.ts.map +1 -0
- package/dist/icons/components/UiPipelineStage.js +31 -0
- package/dist/icons/components/UiPipelineStage.js.map +1 -0
- package/dist/icons/components/UiPlaylistRemove.cjs +29 -0
- package/dist/icons/components/UiPlaylistRemove.cjs.map +1 -0
- package/dist/icons/components/UiPlaylistRemove.d.ts +9 -0
- package/dist/icons/components/UiPlaylistRemove.d.ts.map +1 -0
- package/dist/icons/components/UiPlaylistRemove.js +27 -0
- package/dist/icons/components/UiPlaylistRemove.js.map +1 -0
- package/dist/icons/components/UiReportForms.cjs +51 -0
- package/dist/icons/components/UiReportForms.cjs.map +1 -0
- package/dist/icons/components/UiReportForms.d.ts +15 -0
- package/dist/icons/components/UiReportForms.d.ts.map +1 -0
- package/dist/icons/components/UiReportForms.js +48 -0
- package/dist/icons/components/UiReportForms.js.map +1 -0
- package/dist/icons/components/UiScreenTemplate.cjs +29 -0
- package/dist/icons/components/UiScreenTemplate.cjs.map +1 -0
- package/dist/icons/components/UiScreenTemplate.d.ts +9 -0
- package/dist/icons/components/UiScreenTemplate.d.ts.map +1 -0
- package/dist/icons/components/UiScreenTemplate.js +27 -0
- package/dist/icons/components/UiScreenTemplate.js.map +1 -0
- package/dist/icons/components/UiServices.cjs +29 -0
- package/dist/icons/components/UiServices.cjs.map +1 -0
- package/dist/icons/components/UiServices.d.ts +9 -0
- package/dist/icons/components/UiServices.d.ts.map +1 -0
- package/dist/icons/components/UiServices.js +27 -0
- package/dist/icons/components/UiServices.js.map +1 -0
- package/dist/icons/components/UiSkipCircle.cjs +51 -0
- package/dist/icons/components/UiSkipCircle.cjs.map +1 -0
- package/dist/icons/components/UiSkipCircle.d.ts +15 -0
- package/dist/icons/components/UiSkipCircle.d.ts.map +1 -0
- package/dist/icons/components/UiSkipCircle.js +48 -0
- package/dist/icons/components/UiSkipCircle.js.map +1 -0
- package/dist/icons/components/UiTaskBatch.cjs +33 -0
- package/dist/icons/components/UiTaskBatch.cjs.map +1 -0
- package/dist/icons/components/UiTaskBatch.d.ts +9 -0
- package/dist/icons/components/UiTaskBatch.d.ts.map +1 -0
- package/dist/icons/components/UiTaskBatch.js +31 -0
- package/dist/icons/components/UiTaskBatch.js.map +1 -0
- package/dist/icons/components/UiTodoList.cjs +29 -0
- package/dist/icons/components/UiTodoList.cjs.map +1 -0
- package/dist/icons/components/UiTodoList.d.ts +9 -0
- package/dist/icons/components/UiTodoList.d.ts.map +1 -0
- package/dist/icons/components/UiTodoList.js +27 -0
- package/dist/icons/components/UiTodoList.js.map +1 -0
- package/dist/icons/components/UiTrayArrowDown.cjs +51 -0
- package/dist/icons/components/UiTrayArrowDown.cjs.map +1 -0
- package/dist/icons/components/UiTrayArrowDown.d.ts +15 -0
- package/dist/icons/components/UiTrayArrowDown.d.ts.map +1 -0
- package/dist/icons/components/UiTrayArrowDown.js +48 -0
- package/dist/icons/components/UiTrayArrowDown.js.map +1 -0
- package/dist/icons/components/UiVault.cjs +51 -0
- package/dist/icons/components/UiVault.cjs.map +1 -0
- package/dist/icons/components/UiVault.d.ts +15 -0
- package/dist/icons/components/UiVault.d.ts.map +1 -0
- package/dist/icons/components/UiVault.js +48 -0
- package/dist/icons/components/UiVault.js.map +1 -0
- package/dist/icons/components/UiWebServiceDefinition.cjs +39 -0
- package/dist/icons/components/UiWebServiceDefinition.cjs.map +1 -0
- package/dist/icons/components/UiWebServiceDefinition.d.ts +9 -0
- package/dist/icons/components/UiWebServiceDefinition.d.ts.map +1 -0
- package/dist/icons/components/UiWebServiceDefinition.js +37 -0
- package/dist/icons/components/UiWebServiceDefinition.js.map +1 -0
- package/dist/icons/components/UiWebhook.cjs +29 -0
- package/dist/icons/components/UiWebhook.cjs.map +1 -0
- package/dist/icons/components/UiWebhook.d.ts +9 -0
- package/dist/icons/components/UiWebhook.d.ts.map +1 -0
- package/dist/icons/components/UiWebhook.js +27 -0
- package/dist/icons/components/UiWebhook.js.map +1 -0
- package/dist/icons/components/UiWebhookLine.cjs +51 -0
- package/dist/icons/components/UiWebhookLine.cjs.map +1 -0
- package/dist/icons/components/UiWebhookLine.d.ts +15 -0
- package/dist/icons/components/UiWebhookLine.d.ts.map +1 -0
- package/dist/icons/components/UiWebhookLine.js +48 -0
- package/dist/icons/components/UiWebhookLine.js.map +1 -0
- package/dist/icons/index.d.ts +58 -0
- package/dist/icons/index.d.ts.map +1 -1
- package/dist/icons/registry.cjs +90 -0
- package/dist/icons/registry.cjs.map +1 -1
- package/dist/icons/registry.d.ts.map +1 -1
- package/dist/icons/registry.js +90 -0
- package/dist/icons/registry.js.map +1 -1
- package/dist/icons.cjs +103 -0
- package/dist/icons.js +46 -1
- package/dist/index.cjs +114 -0
- package/dist/index.js +51 -1
- package/dist/overlay/DropdownMenu.cjs +17 -14
- package/dist/overlay/DropdownMenu.cjs.map +1 -1
- package/dist/overlay/DropdownMenu.d.ts +1 -0
- package/dist/overlay/DropdownMenu.d.ts.map +1 -1
- package/dist/overlay/DropdownMenu.js +18 -15
- package/dist/overlay/DropdownMenu.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +6 -1
|
@@ -18,22 +18,22 @@ let _floating_ui_react = require("@floating-ui/react");
|
|
|
18
18
|
function DropdownMenu(props) {
|
|
19
19
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_floating_ui_react.FloatingTree, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(DropdownMenuRoot, { ...props }) });
|
|
20
20
|
}
|
|
21
|
-
function DropdownMenuRoot({ label, icon, hideChevron = false, variant = "outline", size = "sm", trigger, items, children, header, footer, align = "right", onOpenChange, title, menuLabel, className, menuClassName }) {
|
|
21
|
+
function DropdownMenuRoot({ role: popupRole = "menu", label, icon, hideChevron = false, variant = "outline", size = "sm", trigger, items, children, header, footer, align = "right", onOpenChange, title, menuLabel, className, menuClassName }) {
|
|
22
22
|
const [open, setOpen] = (0, react.useState)(false);
|
|
23
23
|
const [activeIndex, setActiveIndex] = (0, react.useState)(null);
|
|
24
24
|
const floatingZ = require_modalStack.useFloatingZIndex();
|
|
25
25
|
const tree = (0, _floating_ui_react.useFloatingTree)();
|
|
26
26
|
const nodeId = (0, _floating_ui_react.useFloatingNodeId)();
|
|
27
27
|
const elementsRef = (0, react.useRef)([]);
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
}
|
|
28
|
+
const changeOpen = (next) => {
|
|
29
|
+
if (next === open) return;
|
|
30
|
+
setOpen(next);
|
|
31
|
+
onOpenChange?.(next);
|
|
32
|
+
};
|
|
33
33
|
const { refs, floatingStyles, context } = (0, _floating_ui_react.useFloating)({
|
|
34
34
|
...nodeId ? { nodeId } : {},
|
|
35
35
|
open,
|
|
36
|
-
onOpenChange:
|
|
36
|
+
onOpenChange: changeOpen,
|
|
37
37
|
placement: align === "right" ? "bottom-end" : "bottom-start",
|
|
38
38
|
whileElementsMounted: _floating_ui_react.autoUpdate,
|
|
39
39
|
middleware: [
|
|
@@ -45,7 +45,7 @@ function DropdownMenuRoot({ label, icon, hideChevron = false, variant = "outline
|
|
|
45
45
|
});
|
|
46
46
|
const click = (0, _floating_ui_react.useClick)(context);
|
|
47
47
|
const dismiss = (0, _floating_ui_react.useDismiss)(context, { escapeKey: false });
|
|
48
|
-
const role = (0, _floating_ui_react.useRole)(context, { role:
|
|
48
|
+
const role = (0, _floating_ui_react.useRole)(context, { role: popupRole });
|
|
49
49
|
const listNav = (0, _floating_ui_react.useListNavigation)(context, {
|
|
50
50
|
listRef: elementsRef,
|
|
51
51
|
activeIndex,
|
|
@@ -56,15 +56,17 @@ function DropdownMenuRoot({ label, icon, hideChevron = false, variant = "outline
|
|
|
56
56
|
click,
|
|
57
57
|
dismiss,
|
|
58
58
|
role,
|
|
59
|
-
listNav
|
|
59
|
+
...popupRole === "menu" ? [listNav] : []
|
|
60
60
|
]);
|
|
61
61
|
const closeMenu = () => {
|
|
62
|
-
|
|
62
|
+
changeOpen(false);
|
|
63
63
|
if (refs.domReference.current instanceof HTMLElement) refs.domReference.current.focus();
|
|
64
64
|
};
|
|
65
65
|
require_modalStack.useEscapeLayer(open, closeMenu);
|
|
66
66
|
const closeMenuRef = (0, react.useRef)(closeMenu);
|
|
67
|
-
|
|
67
|
+
(0, react.useLayoutEffect)(() => {
|
|
68
|
+
closeMenuRef.current = closeMenu;
|
|
69
|
+
});
|
|
68
70
|
(0, react.useEffect)(() => {
|
|
69
71
|
if (!tree) return;
|
|
70
72
|
const onTreeClick = () => closeMenuRef.current();
|
|
@@ -78,7 +80,7 @@ function DropdownMenuRoot({ label, icon, hideChevron = false, variant = "outline
|
|
|
78
80
|
children: [trigger ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_radix_ui_react_slot.Slot, {
|
|
79
81
|
ref: refs.setReference,
|
|
80
82
|
className: "inline-flex",
|
|
81
|
-
"aria-haspopup":
|
|
83
|
+
"aria-haspopup": popupRole,
|
|
82
84
|
"aria-expanded": open,
|
|
83
85
|
...getReferenceProps(),
|
|
84
86
|
children: trigger
|
|
@@ -88,7 +90,7 @@ function DropdownMenuRoot({ label, icon, hideChevron = false, variant = "outline
|
|
|
88
90
|
variant,
|
|
89
91
|
size,
|
|
90
92
|
title,
|
|
91
|
-
"aria-haspopup":
|
|
93
|
+
"aria-haspopup": popupRole,
|
|
92
94
|
"aria-expanded": open,
|
|
93
95
|
...getReferenceProps(),
|
|
94
96
|
children: [
|
|
@@ -103,7 +105,8 @@ function DropdownMenuRoot({ label, icon, hideChevron = false, variant = "outline
|
|
|
103
105
|
children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
104
106
|
ref: refs.setFloating,
|
|
105
107
|
...getFloatingProps(),
|
|
106
|
-
role:
|
|
108
|
+
role: popupRole,
|
|
109
|
+
"aria-modal": popupRole === "dialog" ? false : void 0,
|
|
107
110
|
"aria-label": menuLabel,
|
|
108
111
|
...menuLabel ? { "aria-labelledby": void 0 } : {},
|
|
109
112
|
style: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DropdownMenu.cjs","names":["FloatingTree","useState","useFloatingZIndex","useFloatingTree","useFloatingNodeId","useRef","useFloating","autoUpdate","offset","flip","shift","menuViewportSize","useClick","useDismiss","useRole","useListNavigation","useInteractions","FloatingNode","cn","Slot","Button","Icon","UiChevronDown","FloatingPortal","FloatingFocusManager","MenuContext","FloatingList","MenuItemList"],"sources":["../../src/overlay/DropdownMenu.tsx"],"sourcesContent":["import { useEffect, useRef, useState, type ReactNode } from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport {\n autoUpdate,\n flip,\n FloatingFocusManager,\n FloatingList,\n FloatingNode,\n FloatingPortal,\n FloatingTree,\n offset,\n shift,\n useClick,\n useDismiss,\n useFloating,\n useFloatingNodeId,\n useFloatingTree,\n useInteractions,\n useListNavigation,\n useRole,\n} from \"@floating-ui/react\";\nimport { cn } from \"../lib/utils\";\nimport { Button, type ButtonProps } from \"../components/button\";\nimport { Icon, type StaticIconComponent } from \"../data/Icon\";\nimport { UiChevronDown } from \"../icons\";\nimport {\n MENU_POPOVER_CLASS,\n MenuContext,\n menuViewportSize,\n} from \"./dropdownMenuContext\";\nimport { MenuItemList } from \"./DropdownMenuSubmenu\";\nimport { useEscapeLayer, useFloatingZIndex } from \"./modalStack\";\n\nexport type DropdownMenuItem = {\n /** Visible label. */\n label: ReactNode;\n /** Called when the item is chosen. Ignored when the item has `children`. */\n onSelect: () => void;\n /** Iconify name or imported icon component rendered before the label. */\n icon?: string | StaticIconComponent;\n /** CSS colour applied to this item's icon (the glyph fills `currentColor`). */\n iconColor?: string;\n /** Theme-aware classes applied to this item's icon. */\n iconClassName?: string | undefined;\n /**\n * Section header. A non-interactive header renders above the first item of\n * each contiguous group — provide items pre-sorted by `group`. Items without\n * a `group` render no header.\n */\n group?: string;\n /** Browser tooltip for the item. */\n title?: string;\n /** Disable selection. */\n disabled?: boolean;\n /**\n * Nested submenu items. When present the item becomes a submenu trigger: it\n * opens a flyout of `children` (recursively) on hover / click / ArrowRight\n * instead of firing `onSelect`.\n */\n children?: DropdownMenuItem[];\n /** Editor or explanatory content above a submenu's choices. */\n header?: ReactNode;\n};\n\nexport type DropdownMenuProps = {\n /** Trigger label. Ignored when `trigger` is provided. */\n label?: ReactNode;\n /** Icon shown before the trigger label. Ignored when `trigger` is provided. */\n icon?: string | StaticIconComponent;\n /** Hide the trailing chevron on the default trigger. */\n hideChevron?: boolean;\n /** Variant forwarded to the default Button trigger. */\n variant?: ButtonProps[\"variant\"];\n /** Size forwarded to the default Button trigger. */\n size?: ButtonProps[\"size\"];\n /** Custom trigger element. Its root receives menu state and interaction props. */\n trigger?: ReactNode;\n /** Declarative menu items. Provide this or `children`, not both. */\n items?: DropdownMenuItem[];\n /** Custom menu content. Use `closeMenu` to dismiss after a selection. */\n children?: (closeMenu: () => void) => ReactNode;\n /** Rendered at the top of the menu, above the items/children. */\n header?: ReactNode;\n /** Rendered at the bottom of the menu, below the items/children (e.g. a \"Show more…\" link). */\n footer?: ReactNode;\n /** Horizontal alignment of the menu relative to the trigger. */\n align?: \"left\" | \"right\";\n /** Notified whenever the menu opens or closes. */\n onOpenChange?: (open: boolean) => void;\n /** Browser tooltip / accessible label for the default trigger. */\n title?: string;\n /** Accessible label (`aria-label`) for the floating menu element itself. */\n menuLabel?: string;\n /** Classes applied to the wrapper. */\n className?: string;\n /** Classes applied to the floating menu. */\n menuClassName?: string;\n};\n\n/**\n * A trigger + floating menu. Flat `items` render as a single list; an item with\n * `children` opens a flyout submenu. The FloatingTree lets every level cooperate\n * on focus and dismissal, so selecting any leaf closes the whole menu.\n */\nexport function DropdownMenu(props: DropdownMenuProps) {\n return (\n <FloatingTree>\n <DropdownMenuRoot {...props} />\n </FloatingTree>\n );\n}\n\nfunction DropdownMenuRoot({\n label,\n icon,\n hideChevron = false,\n variant = \"outline\",\n size = \"sm\",\n trigger,\n items,\n children,\n header,\n footer,\n align = \"right\",\n onOpenChange,\n title,\n menuLabel,\n className,\n menuClassName,\n}: DropdownMenuProps) {\n const [open, setOpen] = useState(false);\n const [activeIndex, setActiveIndex] = useState<number | null>(null);\n const floatingZ = useFloatingZIndex();\n const tree = useFloatingTree();\n const nodeId = useFloatingNodeId();\n const elementsRef = useRef<Array<HTMLElement | null>>([]);\n\n const onOpenChangeRef = useRef(onOpenChange);\n onOpenChangeRef.current = onOpenChange;\n useEffect(() => {\n onOpenChangeRef.current?.(open);\n }, [open]);\n\n const { refs, floatingStyles, context } = useFloating<HTMLDivElement>({\n // nodeId is always defined inside the FloatingTree; guard for the type only.\n ...(nodeId ? { nodeId } : {}),\n open,\n onOpenChange: setOpen,\n // bottom-end / bottom-start reproduce the previous right/left alignment.\n placement: align === \"right\" ? \"bottom-end\" : \"bottom-start\",\n whileElementsMounted: autoUpdate,\n // offset(4) ≈ the previous mt-1; flip opens upward at the bottom edge and\n // shift slides the menu back on-screen at the horizontal edges.\n middleware: [\n offset(4),\n flip({ padding: 8 }),\n shift({ padding: 8 }),\n menuViewportSize,\n ],\n });\n\n const click = useClick(context);\n // useDismiss is React-tree aware: a press inside anything rendered through the\n // menu's `children` render-prop — including a Modal that portals to\n // document.body — propagates via React's synthetic events to the floating\n // element and counts as \"inside\", so it won't dismiss the menu (which would\n // unmount that child Modal). A Modal owned by a sibling/parent instead of this\n // menu correctly does dismiss the menu, which is harmless since closing the\n // menu does not unmount a Modal it doesn't own.\n const dismiss = useDismiss(context, { escapeKey: false });\n const role = useRole(context, { role: \"menu\" });\n const listNav = useListNavigation(context, {\n listRef: elementsRef,\n activeIndex,\n onNavigate: setActiveIndex,\n loop: true,\n });\n\n const { getReferenceProps, getFloatingProps, getItemProps } = useInteractions(\n [click, dismiss, role, listNav],\n );\n\n const closeMenu = () => {\n setOpen(false);\n if (refs.domReference.current instanceof HTMLElement)\n refs.domReference.current.focus();\n };\n useEscapeLayer(open, closeMenu);\n\n // Selecting any leaf (at any depth) emits a tree-wide \"click\"; the root closes\n // and restores focus to the trigger.\n const closeMenuRef = useRef(closeMenu);\n closeMenuRef.current = closeMenu;\n useEffect(() => {\n if (!tree) return;\n const onTreeClick = () => closeMenuRef.current();\n tree.events.on(\"click\", onTreeClick);\n return () => tree.events.off(\"click\", onTreeClick);\n }, [tree]);\n\n return (\n <FloatingNode id={nodeId}>\n <div className={cn(\"relative inline-flex\", className)}>\n {trigger ? (\n <Slot\n ref={refs.setReference}\n className=\"inline-flex\"\n aria-haspopup=\"menu\"\n aria-expanded={open}\n {...getReferenceProps()}\n >\n {trigger}\n </Slot>\n ) : (\n <Button\n ref={refs.setReference as React.Ref<HTMLButtonElement>}\n // Opening a menu never submits the form the trigger sits in.\n type=\"button\"\n variant={variant}\n size={size}\n title={title}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n {...getReferenceProps()}\n >\n {icon && (\n <Icon\n {...(typeof icon === \"string\" ? { name: icon } : { icon })}\n />\n )}\n {label}\n {!hideChevron && <Icon icon={UiChevronDown} />}\n </Button>\n )}\n {open && (\n <FloatingPortal>\n <FloatingFocusManager\n context={context}\n modal={false}\n closeOnFocusOut={false}\n >\n <div\n ref={refs.setFloating}\n {...getFloatingProps()}\n role=\"menu\"\n aria-label={menuLabel}\n {...(menuLabel ? { \"aria-labelledby\": undefined } : {})}\n style={{ ...floatingStyles, zIndex: floatingZ }}\n className={cn(MENU_POPOVER_CLASS, menuClassName)}\n >\n {header != null && (\n <div className=\"border-b border-border px-3 py-1.5\">\n {header}\n </div>\n )}\n {children ? (\n children(closeMenu)\n ) : (\n <MenuContext.Provider\n value={{\n getItemProps,\n activeIndex,\n setActiveIndex,\n setHasFocusInside: () => {},\n isOpen: open,\n }}\n >\n <FloatingList elementsRef={elementsRef}>\n <MenuItemList items={items ?? []} />\n </FloatingList>\n </MenuContext.Provider>\n )}\n {footer != null && (\n <div className=\"border-t border-border px-3 py-1.5\">\n {footer}\n </div>\n )}\n </div>\n </FloatingFocusManager>\n </FloatingPortal>\n )}\n </div>\n </FloatingNode>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DropdownMenu.cjs","names":["FloatingTree","useState","useFloatingZIndex","useFloatingTree","useFloatingNodeId","useRef","useFloating","autoUpdate","offset","flip","shift","menuViewportSize","useClick","useDismiss","useRole","useListNavigation","useInteractions","FloatingNode","cn","Slot","Button","Icon","UiChevronDown","FloatingPortal","FloatingFocusManager","MenuContext","FloatingList","MenuItemList"],"sources":["../../src/overlay/DropdownMenu.tsx"],"sourcesContent":["import { useEffect, useLayoutEffect, useRef, useState, type ReactNode } from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport {\n autoUpdate,\n flip,\n FloatingFocusManager,\n FloatingList,\n FloatingNode,\n FloatingPortal,\n FloatingTree,\n offset,\n shift,\n useClick,\n useDismiss,\n useFloating,\n useFloatingNodeId,\n useFloatingTree,\n useInteractions,\n useListNavigation,\n useRole,\n} from \"@floating-ui/react\";\nimport { cn } from \"../lib/utils\";\nimport { Button, type ButtonProps } from \"../components/button\";\nimport { Icon, type StaticIconComponent } from \"../data/Icon\";\nimport { UiChevronDown } from \"../icons\";\nimport {\n MENU_POPOVER_CLASS,\n MenuContext,\n menuViewportSize,\n} from \"./dropdownMenuContext\";\nimport { MenuItemList } from \"./DropdownMenuSubmenu\";\nimport { useEscapeLayer, useFloatingZIndex } from \"./modalStack\";\n\nexport type DropdownMenuItem = {\n /** Visible label. */\n label: ReactNode;\n /** Called when the item is chosen. Ignored when the item has `children`. */\n onSelect: () => void;\n /** Iconify name or imported icon component rendered before the label. */\n icon?: string | StaticIconComponent;\n /** CSS colour applied to this item's icon (the glyph fills `currentColor`). */\n iconColor?: string;\n /** Theme-aware classes applied to this item's icon. */\n iconClassName?: string | undefined;\n /**\n * Section header. A non-interactive header renders above the first item of\n * each contiguous group — provide items pre-sorted by `group`. Items without\n * a `group` render no header.\n */\n group?: string;\n /** Browser tooltip for the item. */\n title?: string;\n /** Disable selection. */\n disabled?: boolean;\n /**\n * Nested submenu items. When present the item becomes a submenu trigger: it\n * opens a flyout of `children` (recursively) on hover / click / ArrowRight\n * instead of firing `onSelect`.\n */\n children?: DropdownMenuItem[];\n /** Editor or explanatory content above a submenu's choices. */\n header?: ReactNode;\n};\n\nexport type DropdownMenuProps = {\n role?: \"menu\" | \"dialog\";\n /** Trigger label. Ignored when `trigger` is provided. */\n label?: ReactNode;\n /** Icon shown before the trigger label. Ignored when `trigger` is provided. */\n icon?: string | StaticIconComponent;\n /** Hide the trailing chevron on the default trigger. */\n hideChevron?: boolean;\n /** Variant forwarded to the default Button trigger. */\n variant?: ButtonProps[\"variant\"];\n /** Size forwarded to the default Button trigger. */\n size?: ButtonProps[\"size\"];\n /** Custom trigger element. Its root receives menu state and interaction props. */\n trigger?: ReactNode;\n /** Declarative menu items. Provide this or `children`, not both. */\n items?: DropdownMenuItem[];\n /** Custom menu content. Use `closeMenu` to dismiss after a selection. */\n children?: (closeMenu: () => void) => ReactNode;\n /** Rendered at the top of the menu, above the items/children. */\n header?: ReactNode;\n /** Rendered at the bottom of the menu, below the items/children (e.g. a \"Show more…\" link). */\n footer?: ReactNode;\n /** Horizontal alignment of the menu relative to the trigger. */\n align?: \"left\" | \"right\";\n /** Notified whenever the menu opens or closes. */\n onOpenChange?: (open: boolean) => void;\n /** Browser tooltip / accessible label for the default trigger. */\n title?: string;\n /** Accessible label (`aria-label`) for the floating menu element itself. */\n menuLabel?: string;\n /** Classes applied to the wrapper. */\n className?: string;\n /** Classes applied to the floating menu. */\n menuClassName?: string;\n};\n\n/**\n * A trigger + floating menu. Flat `items` render as a single list; an item with\n * `children` opens a flyout submenu. The FloatingTree lets every level cooperate\n * on focus and dismissal, so selecting any leaf closes the whole menu.\n */\nexport function DropdownMenu(props: DropdownMenuProps) {\n return (\n <FloatingTree>\n <DropdownMenuRoot {...props} />\n </FloatingTree>\n );\n}\n\nfunction DropdownMenuRoot({\n role: popupRole = \"menu\",\n label,\n icon,\n hideChevron = false,\n variant = \"outline\",\n size = \"sm\",\n trigger,\n items,\n children,\n header,\n footer,\n align = \"right\",\n onOpenChange,\n title,\n menuLabel,\n className,\n menuClassName,\n}: DropdownMenuProps) {\n const [open, setOpen] = useState(false);\n const [activeIndex, setActiveIndex] = useState<number | null>(null);\n const floatingZ = useFloatingZIndex();\n const tree = useFloatingTree();\n const nodeId = useFloatingNodeId();\n const elementsRef = useRef<Array<HTMLElement | null>>([]);\n\n // Every open/close goes through here, so the host hears each change from the\n // event that caused it rather than from an effect after the render.\n const changeOpen = (next: boolean) => {\n if (next === open) return;\n setOpen(next);\n onOpenChange?.(next);\n };\n\n const { refs, floatingStyles, context } = useFloating<HTMLDivElement>({\n // nodeId is always defined inside the FloatingTree; guard for the type only.\n ...(nodeId ? { nodeId } : {}),\n open,\n onOpenChange: changeOpen,\n // bottom-end / bottom-start reproduce the previous right/left alignment.\n placement: align === \"right\" ? \"bottom-end\" : \"bottom-start\",\n whileElementsMounted: autoUpdate,\n // offset(4) ≈ the previous mt-1; flip opens upward at the bottom edge and\n // shift slides the menu back on-screen at the horizontal edges.\n middleware: [\n offset(4),\n flip({ padding: 8 }),\n shift({ padding: 8 }),\n menuViewportSize,\n ],\n });\n\n const click = useClick(context);\n // useDismiss is React-tree aware: a press inside anything rendered through the\n // menu's `children` render-prop — including a Modal that portals to\n // document.body — propagates via React's synthetic events to the floating\n // element and counts as \"inside\", so it won't dismiss the menu (which would\n // unmount that child Modal). A Modal owned by a sibling/parent instead of this\n // menu correctly does dismiss the menu, which is harmless since closing the\n // menu does not unmount a Modal it doesn't own.\n const dismiss = useDismiss(context, { escapeKey: false });\n const role = useRole(context, { role: popupRole });\n const listNav = useListNavigation(context, {\n listRef: elementsRef,\n activeIndex,\n onNavigate: setActiveIndex,\n loop: true,\n });\n\n const { getReferenceProps, getFloatingProps, getItemProps } = useInteractions(\n [click, dismiss, role, ...(popupRole === \"menu\" ? [listNav] : [])],\n );\n\n const closeMenu = () => {\n changeOpen(false);\n if (refs.domReference.current instanceof HTMLElement)\n refs.domReference.current.focus();\n };\n useEscapeLayer(open, closeMenu);\n\n // Selecting any leaf (at any depth) emits a tree-wide \"click\"; the root closes\n // and restores focus to the trigger.\n // The listener subscribes once per tree; it reads the latest closeMenu,\n // which is published after each commit rather than during render.\n const closeMenuRef = useRef(closeMenu);\n useLayoutEffect(() => {\n closeMenuRef.current = closeMenu;\n });\n useEffect(() => {\n if (!tree) return;\n const onTreeClick = () => closeMenuRef.current();\n tree.events.on(\"click\", onTreeClick);\n return () => tree.events.off(\"click\", onTreeClick);\n }, [tree]);\n\n return (\n <FloatingNode id={nodeId}>\n <div className={cn(\"relative inline-flex\", className)}>\n {trigger ? (\n <Slot\n ref={refs.setReference}\n className=\"inline-flex\"\n aria-haspopup={popupRole}\n aria-expanded={open}\n {...getReferenceProps()}\n >\n {trigger}\n </Slot>\n ) : (\n <Button\n ref={refs.setReference as React.Ref<HTMLButtonElement>}\n // Opening a menu never submits the form the trigger sits in.\n type=\"button\"\n variant={variant}\n size={size}\n title={title}\n aria-haspopup={popupRole}\n aria-expanded={open}\n {...getReferenceProps()}\n >\n {icon && (\n <Icon\n {...(typeof icon === \"string\" ? { name: icon } : { icon })}\n />\n )}\n {label}\n {!hideChevron && <Icon icon={UiChevronDown} />}\n </Button>\n )}\n {open && (\n <FloatingPortal>\n <FloatingFocusManager\n context={context}\n modal={false}\n closeOnFocusOut={false}\n >\n <div\n ref={refs.setFloating}\n {...getFloatingProps()}\n role={popupRole}\n aria-modal={popupRole === \"dialog\" ? false : undefined}\n aria-label={menuLabel}\n {...(menuLabel ? { \"aria-labelledby\": undefined } : {})}\n style={{ ...floatingStyles, zIndex: floatingZ }}\n className={cn(MENU_POPOVER_CLASS, menuClassName)}\n >\n {header != null && (\n <div className=\"border-b border-border px-3 py-1.5\">\n {header}\n </div>\n )}\n {children ? (\n children(closeMenu)\n ) : (\n <MenuContext.Provider\n value={{\n getItemProps,\n activeIndex,\n setActiveIndex,\n setHasFocusInside: () => {},\n isOpen: open,\n }}\n >\n <FloatingList elementsRef={elementsRef}>\n <MenuItemList items={items ?? []} />\n </FloatingList>\n </MenuContext.Provider>\n )}\n {footer != null && (\n <div className=\"border-t border-border px-3 py-1.5\">\n {footer}\n </div>\n )}\n </div>\n </FloatingFocusManager>\n </FloatingPortal>\n )}\n </div>\n </FloatingNode>\n );\n}\n"],"mappings":"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"}
|
|
@@ -32,6 +32,7 @@ export type DropdownMenuItem = {
|
|
|
32
32
|
header?: ReactNode;
|
|
33
33
|
};
|
|
34
34
|
export type DropdownMenuProps = {
|
|
35
|
+
role?: "menu" | "dialog";
|
|
35
36
|
/** Trigger label. Ignored when `trigger` is provided. */
|
|
36
37
|
label?: ReactNode;
|
|
37
38
|
/** Icon shown before the trigger label. Ignored when `trigger` is provided. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DropdownMenu.d.ts","sourceRoot":"","sources":["../../src/overlay/DropdownMenu.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"DropdownMenu.d.ts","sourceRoot":"","sources":["../../src/overlay/DropdownMenu.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAgD,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAsBrF,OAAO,EAAU,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAQ,KAAK,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAU9D,MAAM,MAAM,gBAAgB,GAAG;IAC7B,qBAAqB;IACrB,KAAK,EAAE,SAAS,CAAC;IACjB,4EAA4E;IAC5E,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,yEAAyE;IACzE,IAAI,CAAC,EAAE,MAAM,GAAG,mBAAmB,CAAC;IACpC,+EAA+E;IAC/E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uDAAuD;IACvD,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oCAAoC;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yBAAyB;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC9B,+DAA+D;IAC/D,MAAM,CAAC,EAAE,SAAS,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;IACzB,yDAAyD;IACzD,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,+EAA+E;IAC/E,IAAI,CAAC,EAAE,MAAM,GAAG,mBAAmB,CAAC;IACpC,wDAAwD;IACxD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,uDAAuD;IACvD,OAAO,CAAC,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC;IACjC,oDAAoD;IACpD,IAAI,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC3B,kFAAkF;IAClF,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,oEAAoE;IACpE,KAAK,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC3B,yEAAyE;IACzE,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,IAAI,KAAK,SAAS,CAAC;IAChD,iEAAiE;IACjE,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,+FAA+F;IAC/F,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,gEAAgE;IAChE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACzB,kDAAkD;IAClD,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,kEAAkE;IAClE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4EAA4E;IAC5E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sCAAsC;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4CAA4C;IAC5C,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,+BAMpD"}
|
|
@@ -5,7 +5,7 @@ import { Button } from "../components/button.js";
|
|
|
5
5
|
import { MenuContext, menuViewportSize } from "./dropdownMenuContext.js";
|
|
6
6
|
import { useEscapeLayer, useFloatingZIndex } from "./modalStack.js";
|
|
7
7
|
import { MenuItemList } from "./DropdownMenuSubmenu.js";
|
|
8
|
-
import { useEffect, useRef, useState } from "react";
|
|
8
|
+
import { useEffect, useLayoutEffect, useRef, useState } from "react";
|
|
9
9
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
10
10
|
import { Slot } from "@radix-ui/react-slot";
|
|
11
11
|
import { FloatingFocusManager, FloatingList, FloatingNode, FloatingPortal, FloatingTree, autoUpdate, flip, offset, shift, useClick, useDismiss, useFloating, useFloatingNodeId, useFloatingTree, useInteractions, useListNavigation, useRole } from "@floating-ui/react";
|
|
@@ -18,22 +18,22 @@ import { FloatingFocusManager, FloatingList, FloatingNode, FloatingPortal, Float
|
|
|
18
18
|
function DropdownMenu(props) {
|
|
19
19
|
return /* @__PURE__ */ jsx(FloatingTree, { children: /* @__PURE__ */ jsx(DropdownMenuRoot, { ...props }) });
|
|
20
20
|
}
|
|
21
|
-
function DropdownMenuRoot({ label, icon, hideChevron = false, variant = "outline", size = "sm", trigger, items, children, header, footer, align = "right", onOpenChange, title, menuLabel, className, menuClassName }) {
|
|
21
|
+
function DropdownMenuRoot({ role: popupRole = "menu", label, icon, hideChevron = false, variant = "outline", size = "sm", trigger, items, children, header, footer, align = "right", onOpenChange, title, menuLabel, className, menuClassName }) {
|
|
22
22
|
const [open, setOpen] = useState(false);
|
|
23
23
|
const [activeIndex, setActiveIndex] = useState(null);
|
|
24
24
|
const floatingZ = useFloatingZIndex();
|
|
25
25
|
const tree = useFloatingTree();
|
|
26
26
|
const nodeId = useFloatingNodeId();
|
|
27
27
|
const elementsRef = useRef([]);
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
}
|
|
28
|
+
const changeOpen = (next) => {
|
|
29
|
+
if (next === open) return;
|
|
30
|
+
setOpen(next);
|
|
31
|
+
onOpenChange?.(next);
|
|
32
|
+
};
|
|
33
33
|
const { refs, floatingStyles, context } = useFloating({
|
|
34
34
|
...nodeId ? { nodeId } : {},
|
|
35
35
|
open,
|
|
36
|
-
onOpenChange:
|
|
36
|
+
onOpenChange: changeOpen,
|
|
37
37
|
placement: align === "right" ? "bottom-end" : "bottom-start",
|
|
38
38
|
whileElementsMounted: autoUpdate,
|
|
39
39
|
middleware: [
|
|
@@ -45,7 +45,7 @@ function DropdownMenuRoot({ label, icon, hideChevron = false, variant = "outline
|
|
|
45
45
|
});
|
|
46
46
|
const click = useClick(context);
|
|
47
47
|
const dismiss = useDismiss(context, { escapeKey: false });
|
|
48
|
-
const role = useRole(context, { role:
|
|
48
|
+
const role = useRole(context, { role: popupRole });
|
|
49
49
|
const listNav = useListNavigation(context, {
|
|
50
50
|
listRef: elementsRef,
|
|
51
51
|
activeIndex,
|
|
@@ -56,15 +56,17 @@ function DropdownMenuRoot({ label, icon, hideChevron = false, variant = "outline
|
|
|
56
56
|
click,
|
|
57
57
|
dismiss,
|
|
58
58
|
role,
|
|
59
|
-
listNav
|
|
59
|
+
...popupRole === "menu" ? [listNav] : []
|
|
60
60
|
]);
|
|
61
61
|
const closeMenu = () => {
|
|
62
|
-
|
|
62
|
+
changeOpen(false);
|
|
63
63
|
if (refs.domReference.current instanceof HTMLElement) refs.domReference.current.focus();
|
|
64
64
|
};
|
|
65
65
|
useEscapeLayer(open, closeMenu);
|
|
66
66
|
const closeMenuRef = useRef(closeMenu);
|
|
67
|
-
|
|
67
|
+
useLayoutEffect(() => {
|
|
68
|
+
closeMenuRef.current = closeMenu;
|
|
69
|
+
});
|
|
68
70
|
useEffect(() => {
|
|
69
71
|
if (!tree) return;
|
|
70
72
|
const onTreeClick = () => closeMenuRef.current();
|
|
@@ -78,7 +80,7 @@ function DropdownMenuRoot({ label, icon, hideChevron = false, variant = "outline
|
|
|
78
80
|
children: [trigger ? /* @__PURE__ */ jsx(Slot, {
|
|
79
81
|
ref: refs.setReference,
|
|
80
82
|
className: "inline-flex",
|
|
81
|
-
"aria-haspopup":
|
|
83
|
+
"aria-haspopup": popupRole,
|
|
82
84
|
"aria-expanded": open,
|
|
83
85
|
...getReferenceProps(),
|
|
84
86
|
children: trigger
|
|
@@ -88,7 +90,7 @@ function DropdownMenuRoot({ label, icon, hideChevron = false, variant = "outline
|
|
|
88
90
|
variant,
|
|
89
91
|
size,
|
|
90
92
|
title,
|
|
91
|
-
"aria-haspopup":
|
|
93
|
+
"aria-haspopup": popupRole,
|
|
92
94
|
"aria-expanded": open,
|
|
93
95
|
...getReferenceProps(),
|
|
94
96
|
children: [
|
|
@@ -103,7 +105,8 @@ function DropdownMenuRoot({ label, icon, hideChevron = false, variant = "outline
|
|
|
103
105
|
children: /* @__PURE__ */ jsxs("div", {
|
|
104
106
|
ref: refs.setFloating,
|
|
105
107
|
...getFloatingProps(),
|
|
106
|
-
role:
|
|
108
|
+
role: popupRole,
|
|
109
|
+
"aria-modal": popupRole === "dialog" ? false : void 0,
|
|
107
110
|
"aria-label": menuLabel,
|
|
108
111
|
...menuLabel ? { "aria-labelledby": void 0 } : {},
|
|
109
112
|
style: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DropdownMenu.js","names":[],"sources":["../../src/overlay/DropdownMenu.tsx"],"sourcesContent":["import { useEffect, useRef, useState, type ReactNode } from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport {\n autoUpdate,\n flip,\n FloatingFocusManager,\n FloatingList,\n FloatingNode,\n FloatingPortal,\n FloatingTree,\n offset,\n shift,\n useClick,\n useDismiss,\n useFloating,\n useFloatingNodeId,\n useFloatingTree,\n useInteractions,\n useListNavigation,\n useRole,\n} from \"@floating-ui/react\";\nimport { cn } from \"../lib/utils\";\nimport { Button, type ButtonProps } from \"../components/button\";\nimport { Icon, type StaticIconComponent } from \"../data/Icon\";\nimport { UiChevronDown } from \"../icons\";\nimport {\n MENU_POPOVER_CLASS,\n MenuContext,\n menuViewportSize,\n} from \"./dropdownMenuContext\";\nimport { MenuItemList } from \"./DropdownMenuSubmenu\";\nimport { useEscapeLayer, useFloatingZIndex } from \"./modalStack\";\n\nexport type DropdownMenuItem = {\n /** Visible label. */\n label: ReactNode;\n /** Called when the item is chosen. Ignored when the item has `children`. */\n onSelect: () => void;\n /** Iconify name or imported icon component rendered before the label. */\n icon?: string | StaticIconComponent;\n /** CSS colour applied to this item's icon (the glyph fills `currentColor`). */\n iconColor?: string;\n /** Theme-aware classes applied to this item's icon. */\n iconClassName?: string | undefined;\n /**\n * Section header. A non-interactive header renders above the first item of\n * each contiguous group — provide items pre-sorted by `group`. Items without\n * a `group` render no header.\n */\n group?: string;\n /** Browser tooltip for the item. */\n title?: string;\n /** Disable selection. */\n disabled?: boolean;\n /**\n * Nested submenu items. When present the item becomes a submenu trigger: it\n * opens a flyout of `children` (recursively) on hover / click / ArrowRight\n * instead of firing `onSelect`.\n */\n children?: DropdownMenuItem[];\n /** Editor or explanatory content above a submenu's choices. */\n header?: ReactNode;\n};\n\nexport type DropdownMenuProps = {\n /** Trigger label. Ignored when `trigger` is provided. */\n label?: ReactNode;\n /** Icon shown before the trigger label. Ignored when `trigger` is provided. */\n icon?: string | StaticIconComponent;\n /** Hide the trailing chevron on the default trigger. */\n hideChevron?: boolean;\n /** Variant forwarded to the default Button trigger. */\n variant?: ButtonProps[\"variant\"];\n /** Size forwarded to the default Button trigger. */\n size?: ButtonProps[\"size\"];\n /** Custom trigger element. Its root receives menu state and interaction props. */\n trigger?: ReactNode;\n /** Declarative menu items. Provide this or `children`, not both. */\n items?: DropdownMenuItem[];\n /** Custom menu content. Use `closeMenu` to dismiss after a selection. */\n children?: (closeMenu: () => void) => ReactNode;\n /** Rendered at the top of the menu, above the items/children. */\n header?: ReactNode;\n /** Rendered at the bottom of the menu, below the items/children (e.g. a \"Show more…\" link). */\n footer?: ReactNode;\n /** Horizontal alignment of the menu relative to the trigger. */\n align?: \"left\" | \"right\";\n /** Notified whenever the menu opens or closes. */\n onOpenChange?: (open: boolean) => void;\n /** Browser tooltip / accessible label for the default trigger. */\n title?: string;\n /** Accessible label (`aria-label`) for the floating menu element itself. */\n menuLabel?: string;\n /** Classes applied to the wrapper. */\n className?: string;\n /** Classes applied to the floating menu. */\n menuClassName?: string;\n};\n\n/**\n * A trigger + floating menu. Flat `items` render as a single list; an item with\n * `children` opens a flyout submenu. The FloatingTree lets every level cooperate\n * on focus and dismissal, so selecting any leaf closes the whole menu.\n */\nexport function DropdownMenu(props: DropdownMenuProps) {\n return (\n <FloatingTree>\n <DropdownMenuRoot {...props} />\n </FloatingTree>\n );\n}\n\nfunction DropdownMenuRoot({\n label,\n icon,\n hideChevron = false,\n variant = \"outline\",\n size = \"sm\",\n trigger,\n items,\n children,\n header,\n footer,\n align = \"right\",\n onOpenChange,\n title,\n menuLabel,\n className,\n menuClassName,\n}: DropdownMenuProps) {\n const [open, setOpen] = useState(false);\n const [activeIndex, setActiveIndex] = useState<number | null>(null);\n const floatingZ = useFloatingZIndex();\n const tree = useFloatingTree();\n const nodeId = useFloatingNodeId();\n const elementsRef = useRef<Array<HTMLElement | null>>([]);\n\n const onOpenChangeRef = useRef(onOpenChange);\n onOpenChangeRef.current = onOpenChange;\n useEffect(() => {\n onOpenChangeRef.current?.(open);\n }, [open]);\n\n const { refs, floatingStyles, context } = useFloating<HTMLDivElement>({\n // nodeId is always defined inside the FloatingTree; guard for the type only.\n ...(nodeId ? { nodeId } : {}),\n open,\n onOpenChange: setOpen,\n // bottom-end / bottom-start reproduce the previous right/left alignment.\n placement: align === \"right\" ? \"bottom-end\" : \"bottom-start\",\n whileElementsMounted: autoUpdate,\n // offset(4) ≈ the previous mt-1; flip opens upward at the bottom edge and\n // shift slides the menu back on-screen at the horizontal edges.\n middleware: [\n offset(4),\n flip({ padding: 8 }),\n shift({ padding: 8 }),\n menuViewportSize,\n ],\n });\n\n const click = useClick(context);\n // useDismiss is React-tree aware: a press inside anything rendered through the\n // menu's `children` render-prop — including a Modal that portals to\n // document.body — propagates via React's synthetic events to the floating\n // element and counts as \"inside\", so it won't dismiss the menu (which would\n // unmount that child Modal). A Modal owned by a sibling/parent instead of this\n // menu correctly does dismiss the menu, which is harmless since closing the\n // menu does not unmount a Modal it doesn't own.\n const dismiss = useDismiss(context, { escapeKey: false });\n const role = useRole(context, { role: \"menu\" });\n const listNav = useListNavigation(context, {\n listRef: elementsRef,\n activeIndex,\n onNavigate: setActiveIndex,\n loop: true,\n });\n\n const { getReferenceProps, getFloatingProps, getItemProps } = useInteractions(\n [click, dismiss, role, listNav],\n );\n\n const closeMenu = () => {\n setOpen(false);\n if (refs.domReference.current instanceof HTMLElement)\n refs.domReference.current.focus();\n };\n useEscapeLayer(open, closeMenu);\n\n // Selecting any leaf (at any depth) emits a tree-wide \"click\"; the root closes\n // and restores focus to the trigger.\n const closeMenuRef = useRef(closeMenu);\n closeMenuRef.current = closeMenu;\n useEffect(() => {\n if (!tree) return;\n const onTreeClick = () => closeMenuRef.current();\n tree.events.on(\"click\", onTreeClick);\n return () => tree.events.off(\"click\", onTreeClick);\n }, [tree]);\n\n return (\n <FloatingNode id={nodeId}>\n <div className={cn(\"relative inline-flex\", className)}>\n {trigger ? (\n <Slot\n ref={refs.setReference}\n className=\"inline-flex\"\n aria-haspopup=\"menu\"\n aria-expanded={open}\n {...getReferenceProps()}\n >\n {trigger}\n </Slot>\n ) : (\n <Button\n ref={refs.setReference as React.Ref<HTMLButtonElement>}\n // Opening a menu never submits the form the trigger sits in.\n type=\"button\"\n variant={variant}\n size={size}\n title={title}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n {...getReferenceProps()}\n >\n {icon && (\n <Icon\n {...(typeof icon === \"string\" ? { name: icon } : { icon })}\n />\n )}\n {label}\n {!hideChevron && <Icon icon={UiChevronDown} />}\n </Button>\n )}\n {open && (\n <FloatingPortal>\n <FloatingFocusManager\n context={context}\n modal={false}\n closeOnFocusOut={false}\n >\n <div\n ref={refs.setFloating}\n {...getFloatingProps()}\n role=\"menu\"\n aria-label={menuLabel}\n {...(menuLabel ? { \"aria-labelledby\": undefined } : {})}\n style={{ ...floatingStyles, zIndex: floatingZ }}\n className={cn(MENU_POPOVER_CLASS, menuClassName)}\n >\n {header != null && (\n <div className=\"border-b border-border px-3 py-1.5\">\n {header}\n </div>\n )}\n {children ? (\n children(closeMenu)\n ) : (\n <MenuContext.Provider\n value={{\n getItemProps,\n activeIndex,\n setActiveIndex,\n setHasFocusInside: () => {},\n isOpen: open,\n }}\n >\n <FloatingList elementsRef={elementsRef}>\n <MenuItemList items={items ?? []} />\n </FloatingList>\n </MenuContext.Provider>\n )}\n {footer != null && (\n <div className=\"border-t border-border px-3 py-1.5\">\n {footer}\n </div>\n )}\n </div>\n </FloatingFocusManager>\n </FloatingPortal>\n )}\n </div>\n </FloatingNode>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DropdownMenu.js","names":[],"sources":["../../src/overlay/DropdownMenu.tsx"],"sourcesContent":["import { useEffect, useLayoutEffect, useRef, useState, type ReactNode } from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport {\n autoUpdate,\n flip,\n FloatingFocusManager,\n FloatingList,\n FloatingNode,\n FloatingPortal,\n FloatingTree,\n offset,\n shift,\n useClick,\n useDismiss,\n useFloating,\n useFloatingNodeId,\n useFloatingTree,\n useInteractions,\n useListNavigation,\n useRole,\n} from \"@floating-ui/react\";\nimport { cn } from \"../lib/utils\";\nimport { Button, type ButtonProps } from \"../components/button\";\nimport { Icon, type StaticIconComponent } from \"../data/Icon\";\nimport { UiChevronDown } from \"../icons\";\nimport {\n MENU_POPOVER_CLASS,\n MenuContext,\n menuViewportSize,\n} from \"./dropdownMenuContext\";\nimport { MenuItemList } from \"./DropdownMenuSubmenu\";\nimport { useEscapeLayer, useFloatingZIndex } from \"./modalStack\";\n\nexport type DropdownMenuItem = {\n /** Visible label. */\n label: ReactNode;\n /** Called when the item is chosen. Ignored when the item has `children`. */\n onSelect: () => void;\n /** Iconify name or imported icon component rendered before the label. */\n icon?: string | StaticIconComponent;\n /** CSS colour applied to this item's icon (the glyph fills `currentColor`). */\n iconColor?: string;\n /** Theme-aware classes applied to this item's icon. */\n iconClassName?: string | undefined;\n /**\n * Section header. A non-interactive header renders above the first item of\n * each contiguous group — provide items pre-sorted by `group`. Items without\n * a `group` render no header.\n */\n group?: string;\n /** Browser tooltip for the item. */\n title?: string;\n /** Disable selection. */\n disabled?: boolean;\n /**\n * Nested submenu items. When present the item becomes a submenu trigger: it\n * opens a flyout of `children` (recursively) on hover / click / ArrowRight\n * instead of firing `onSelect`.\n */\n children?: DropdownMenuItem[];\n /** Editor or explanatory content above a submenu's choices. */\n header?: ReactNode;\n};\n\nexport type DropdownMenuProps = {\n role?: \"menu\" | \"dialog\";\n /** Trigger label. Ignored when `trigger` is provided. */\n label?: ReactNode;\n /** Icon shown before the trigger label. Ignored when `trigger` is provided. */\n icon?: string | StaticIconComponent;\n /** Hide the trailing chevron on the default trigger. */\n hideChevron?: boolean;\n /** Variant forwarded to the default Button trigger. */\n variant?: ButtonProps[\"variant\"];\n /** Size forwarded to the default Button trigger. */\n size?: ButtonProps[\"size\"];\n /** Custom trigger element. Its root receives menu state and interaction props. */\n trigger?: ReactNode;\n /** Declarative menu items. Provide this or `children`, not both. */\n items?: DropdownMenuItem[];\n /** Custom menu content. Use `closeMenu` to dismiss after a selection. */\n children?: (closeMenu: () => void) => ReactNode;\n /** Rendered at the top of the menu, above the items/children. */\n header?: ReactNode;\n /** Rendered at the bottom of the menu, below the items/children (e.g. a \"Show more…\" link). */\n footer?: ReactNode;\n /** Horizontal alignment of the menu relative to the trigger. */\n align?: \"left\" | \"right\";\n /** Notified whenever the menu opens or closes. */\n onOpenChange?: (open: boolean) => void;\n /** Browser tooltip / accessible label for the default trigger. */\n title?: string;\n /** Accessible label (`aria-label`) for the floating menu element itself. */\n menuLabel?: string;\n /** Classes applied to the wrapper. */\n className?: string;\n /** Classes applied to the floating menu. */\n menuClassName?: string;\n};\n\n/**\n * A trigger + floating menu. Flat `items` render as a single list; an item with\n * `children` opens a flyout submenu. The FloatingTree lets every level cooperate\n * on focus and dismissal, so selecting any leaf closes the whole menu.\n */\nexport function DropdownMenu(props: DropdownMenuProps) {\n return (\n <FloatingTree>\n <DropdownMenuRoot {...props} />\n </FloatingTree>\n );\n}\n\nfunction DropdownMenuRoot({\n role: popupRole = \"menu\",\n label,\n icon,\n hideChevron = false,\n variant = \"outline\",\n size = \"sm\",\n trigger,\n items,\n children,\n header,\n footer,\n align = \"right\",\n onOpenChange,\n title,\n menuLabel,\n className,\n menuClassName,\n}: DropdownMenuProps) {\n const [open, setOpen] = useState(false);\n const [activeIndex, setActiveIndex] = useState<number | null>(null);\n const floatingZ = useFloatingZIndex();\n const tree = useFloatingTree();\n const nodeId = useFloatingNodeId();\n const elementsRef = useRef<Array<HTMLElement | null>>([]);\n\n // Every open/close goes through here, so the host hears each change from the\n // event that caused it rather than from an effect after the render.\n const changeOpen = (next: boolean) => {\n if (next === open) return;\n setOpen(next);\n onOpenChange?.(next);\n };\n\n const { refs, floatingStyles, context } = useFloating<HTMLDivElement>({\n // nodeId is always defined inside the FloatingTree; guard for the type only.\n ...(nodeId ? { nodeId } : {}),\n open,\n onOpenChange: changeOpen,\n // bottom-end / bottom-start reproduce the previous right/left alignment.\n placement: align === \"right\" ? \"bottom-end\" : \"bottom-start\",\n whileElementsMounted: autoUpdate,\n // offset(4) ≈ the previous mt-1; flip opens upward at the bottom edge and\n // shift slides the menu back on-screen at the horizontal edges.\n middleware: [\n offset(4),\n flip({ padding: 8 }),\n shift({ padding: 8 }),\n menuViewportSize,\n ],\n });\n\n const click = useClick(context);\n // useDismiss is React-tree aware: a press inside anything rendered through the\n // menu's `children` render-prop — including a Modal that portals to\n // document.body — propagates via React's synthetic events to the floating\n // element and counts as \"inside\", so it won't dismiss the menu (which would\n // unmount that child Modal). A Modal owned by a sibling/parent instead of this\n // menu correctly does dismiss the menu, which is harmless since closing the\n // menu does not unmount a Modal it doesn't own.\n const dismiss = useDismiss(context, { escapeKey: false });\n const role = useRole(context, { role: popupRole });\n const listNav = useListNavigation(context, {\n listRef: elementsRef,\n activeIndex,\n onNavigate: setActiveIndex,\n loop: true,\n });\n\n const { getReferenceProps, getFloatingProps, getItemProps } = useInteractions(\n [click, dismiss, role, ...(popupRole === \"menu\" ? [listNav] : [])],\n );\n\n const closeMenu = () => {\n changeOpen(false);\n if (refs.domReference.current instanceof HTMLElement)\n refs.domReference.current.focus();\n };\n useEscapeLayer(open, closeMenu);\n\n // Selecting any leaf (at any depth) emits a tree-wide \"click\"; the root closes\n // and restores focus to the trigger.\n // The listener subscribes once per tree; it reads the latest closeMenu,\n // which is published after each commit rather than during render.\n const closeMenuRef = useRef(closeMenu);\n useLayoutEffect(() => {\n closeMenuRef.current = closeMenu;\n });\n useEffect(() => {\n if (!tree) return;\n const onTreeClick = () => closeMenuRef.current();\n tree.events.on(\"click\", onTreeClick);\n return () => tree.events.off(\"click\", onTreeClick);\n }, [tree]);\n\n return (\n <FloatingNode id={nodeId}>\n <div className={cn(\"relative inline-flex\", className)}>\n {trigger ? (\n <Slot\n ref={refs.setReference}\n className=\"inline-flex\"\n aria-haspopup={popupRole}\n aria-expanded={open}\n {...getReferenceProps()}\n >\n {trigger}\n </Slot>\n ) : (\n <Button\n ref={refs.setReference as React.Ref<HTMLButtonElement>}\n // Opening a menu never submits the form the trigger sits in.\n type=\"button\"\n variant={variant}\n size={size}\n title={title}\n aria-haspopup={popupRole}\n aria-expanded={open}\n {...getReferenceProps()}\n >\n {icon && (\n <Icon\n {...(typeof icon === \"string\" ? { name: icon } : { icon })}\n />\n )}\n {label}\n {!hideChevron && <Icon icon={UiChevronDown} />}\n </Button>\n )}\n {open && (\n <FloatingPortal>\n <FloatingFocusManager\n context={context}\n modal={false}\n closeOnFocusOut={false}\n >\n <div\n ref={refs.setFloating}\n {...getFloatingProps()}\n role={popupRole}\n aria-modal={popupRole === \"dialog\" ? false : undefined}\n aria-label={menuLabel}\n {...(menuLabel ? { \"aria-labelledby\": undefined } : {})}\n style={{ ...floatingStyles, zIndex: floatingZ }}\n className={cn(MENU_POPOVER_CLASS, menuClassName)}\n >\n {header != null && (\n <div className=\"border-b border-border px-3 py-1.5\">\n {header}\n </div>\n )}\n {children ? (\n children(closeMenu)\n ) : (\n <MenuContext.Provider\n value={{\n getItemProps,\n activeIndex,\n setActiveIndex,\n setHasFocusInside: () => {},\n isOpen: open,\n }}\n >\n <FloatingList elementsRef={elementsRef}>\n <MenuItemList items={items ?? []} />\n </FloatingList>\n </MenuContext.Provider>\n )}\n {footer != null && (\n <div className=\"border-t border-border px-3 py-1.5\">\n {footer}\n </div>\n )}\n </div>\n </FloatingFocusManager>\n </FloatingPortal>\n )}\n </div>\n </FloatingNode>\n );\n}\n"],"mappings":"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"}
|