@mastra/playground-ui 43.0.0-alpha.1 → 43.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/CHANGELOG.md +8 -0
- package/dist/{Button-B5RnKrGb.cjs → Button-Bm94fEF2.cjs} +2 -2
- package/dist/{Button-B5RnKrGb.cjs.map → Button-Bm94fEF2.cjs.map} +1 -1
- package/dist/{Button-Dh5CZ6Ir.js → Button-Bx2lFdqb.js} +2 -2
- package/dist/{Button-Dh5CZ6Ir.js.map → Button-Bx2lFdqb.js.map} +1 -1
- package/dist/{EmptyState-C0TShKF9.js → EmptyState-BLd-LJOA.js} +3 -3
- package/dist/{EmptyState-C0TShKF9.js.map → EmptyState-BLd-LJOA.js.map} +1 -1
- package/dist/{EmptyState-CDPLdgbs.cjs → EmptyState-sff7IGrD.cjs} +3 -3
- package/dist/{EmptyState-CDPLdgbs.cjs.map → EmptyState-sff7IGrD.cjs.map} +1 -1
- package/dist/{ErrorState-4TTbwyNs.cjs → ErrorState-DvsG3RMz.cjs} +3 -3
- package/dist/{ErrorState-4TTbwyNs.cjs.map → ErrorState-DvsG3RMz.cjs.map} +1 -1
- package/dist/{ErrorState-D1uTstEy.js → ErrorState-t59EAa55.js} +3 -3
- package/dist/{ErrorState-D1uTstEy.js.map → ErrorState-t59EAa55.js.map} +1 -1
- package/dist/{Notice-WhHdy89l.cjs → Notice-D7mbkdZW.cjs} +2 -2
- package/dist/{Notice-WhHdy89l.cjs.map → Notice-D7mbkdZW.cjs.map} +1 -1
- package/dist/{Notice-jmHNt3gS.js → Notice-zWRcxcM3.js} +2 -2
- package/dist/{Notice-jmHNt3gS.js.map → Notice-zWRcxcM3.js.map} +1 -1
- package/dist/{PermissionDenied-C7lur6xI.js → PermissionDenied-8otNeK_X.js} +2 -2
- package/dist/{PermissionDenied-C7lur6xI.js.map → PermissionDenied-8otNeK_X.js.map} +1 -1
- package/dist/{PermissionDenied-Cao8jHEU.cjs → PermissionDenied-Dtre6Wn1.cjs} +2 -2
- package/dist/{PermissionDenied-Cao8jHEU.cjs.map → PermissionDenied-Dtre6Wn1.cjs.map} +1 -1
- package/dist/{SessionExpired-DEJgiQcL.cjs → SessionExpired-C5ADs4NL.cjs} +3 -3
- package/dist/{SessionExpired-DEJgiQcL.cjs.map → SessionExpired-C5ADs4NL.cjs.map} +1 -1
- package/dist/{SessionExpired-C0PdcdCr.js → SessionExpired-CHF__hq9.js} +3 -3
- package/dist/{SessionExpired-C0PdcdCr.js.map → SessionExpired-CHF__hq9.js.map} +1 -1
- package/dist/{code-diff-BpD8McFU.js → code-diff-BB4sqHpq.js} +3 -3
- package/dist/{code-diff-BpD8McFU.js.map → code-diff-BB4sqHpq.js.map} +1 -1
- package/dist/{code-diff-B1JxR3PF.cjs → code-diff-C-EHXZyK.cjs} +3 -3
- package/dist/{code-diff-B1JxR3PF.cjs.map → code-diff-C-EHXZyK.cjs.map} +1 -1
- package/dist/{combobox-54Hywnf9.cjs → combobox-DXwbHjvQ.cjs} +2 -2
- package/dist/{combobox-54Hywnf9.cjs.map → combobox-DXwbHjvQ.cjs.map} +1 -1
- package/dist/{combobox-CBvs2ZPx.js → combobox-sa_Pxyl4.js} +2 -2
- package/dist/{combobox-CBvs2ZPx.js.map → combobox-sa_Pxyl4.js.map} +1 -1
- package/dist/components/AlertDialog.cjs.js +1 -1
- package/dist/components/AlertDialog.es.js +1 -1
- package/dist/components/Button.cjs.js +1 -1
- package/dist/components/Button.es.js +1 -1
- package/dist/components/ClampedText.cjs.js +1 -1
- package/dist/components/ClampedText.es.js +1 -1
- package/dist/components/CodeBlock.cjs.js +8 -8
- package/dist/components/CodeBlock.cjs.js.map +1 -1
- package/dist/components/CodeBlock.es.js +8 -8
- package/dist/components/CodeBlock.es.js.map +1 -1
- package/dist/components/CodeDiff.cjs.js +1 -1
- package/dist/components/CodeDiff.es.js +1 -1
- package/dist/components/CodeEditor.cjs.js +1 -1
- package/dist/components/CodeEditor.es.js +1 -1
- package/dist/components/Columns.cjs.js +1 -1
- package/dist/components/Columns.es.js +1 -1
- package/dist/components/Combobox.cjs.js +1 -1
- package/dist/components/Combobox.es.js +1 -1
- package/dist/components/Command.cjs.js +4 -4
- package/dist/components/Command.cjs.js.map +1 -1
- package/dist/components/Command.es.js +4 -4
- package/dist/components/Command.es.js.map +1 -1
- package/dist/components/Composer.cjs.js +5 -5
- package/dist/components/Composer.cjs.js.map +1 -1
- package/dist/components/Composer.es.js +5 -5
- package/dist/components/Composer.es.js.map +1 -1
- package/dist/components/ContentBlocks.cjs.js.map +1 -1
- package/dist/components/ContentBlocks.es.js.map +1 -1
- package/dist/components/ContextMenu.cjs.js +1 -1
- package/dist/components/ContextMenu.cjs.js.map +1 -1
- package/dist/components/ContextMenu.es.js +1 -1
- package/dist/components/ContextMenu.es.js.map +1 -1
- package/dist/components/CopyButton.cjs.js +1 -1
- package/dist/components/CopyButton.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 +5 -5
- package/dist/components/DataDetailsPanel.cjs.js.map +1 -1
- package/dist/components/DataDetailsPanel.es.js +5 -5
- package/dist/components/DataDetailsPanel.es.js.map +1 -1
- package/dist/components/DataFilter.cjs.js +2 -2
- package/dist/components/DataFilter.es.js +2 -2
- package/dist/components/DataKeysAndValues.cjs.js +1 -1
- package/dist/components/DataKeysAndValues.es.js +1 -1
- package/dist/components/DataList.cjs.js +7 -7
- package/dist/components/DataList.cjs.js.map +1 -1
- package/dist/components/DataList.es.js +7 -7
- package/dist/components/DataList.es.js.map +1 -1
- package/dist/components/DataPanel.cjs.js +1 -1
- package/dist/components/DataPanel.es.js +1 -1
- package/dist/components/DateRangeTimeline.cjs.js +11 -11
- package/dist/components/DateRangeTimeline.cjs.js.map +1 -1
- package/dist/components/DateRangeTimeline.es.js +11 -11
- package/dist/components/DateRangeTimeline.es.js.map +1 -1
- package/dist/components/DateTimePicker.cjs.js +4 -4
- package/dist/components/DateTimePicker.cjs.js.map +1 -1
- package/dist/components/DateTimePicker.es.js +4 -4
- package/dist/components/DateTimePicker.es.js.map +1 -1
- package/dist/components/DateTimeRangePicker.cjs.js +1 -1
- package/dist/components/DateTimeRangePicker.es.js +1 -1
- package/dist/components/Dialog.cjs.js +1 -1
- package/dist/components/Dialog.es.js +1 -1
- package/dist/components/Drawer.cjs.js +1 -1
- package/dist/components/Drawer.es.js +1 -1
- package/dist/components/DropdownMenu.cjs.js +1 -1
- package/dist/components/DropdownMenu.es.js +1 -1
- package/dist/components/EmptyState.cjs.js +1 -1
- package/dist/components/EmptyState.es.js +1 -1
- package/dist/components/EntityHeader.cjs.js +1 -1
- package/dist/components/EntityHeader.cjs.js.map +1 -1
- package/dist/components/EntityHeader.es.js +1 -1
- package/dist/components/EntityHeader.es.js.map +1 -1
- package/dist/components/EnvironmentVariablesEditor.cjs.js +9 -9
- package/dist/components/EnvironmentVariablesEditor.cjs.js.map +1 -1
- package/dist/components/EnvironmentVariablesEditor.es.js +9 -9
- package/dist/components/EnvironmentVariablesEditor.es.js.map +1 -1
- package/dist/components/ErrorBoundary.cjs.js +3 -3
- package/dist/components/ErrorBoundary.cjs.js.map +1 -1
- package/dist/components/ErrorBoundary.es.js +3 -3
- package/dist/components/ErrorBoundary.es.js.map +1 -1
- package/dist/components/ErrorState.cjs.js +1 -1
- package/dist/components/ErrorState.es.js +1 -1
- package/dist/components/FormFieldBlocks.cjs.js +4 -4
- package/dist/components/FormFieldBlocks.es.js +4 -4
- package/dist/components/Header.cjs.js +1 -1
- package/dist/components/Header.cjs.js.map +1 -1
- package/dist/components/Header.es.js +1 -1
- package/dist/components/Header.es.js.map +1 -1
- package/dist/components/HorizontalBars.cjs.js +1 -1
- package/dist/components/HorizontalBars.es.js +1 -1
- package/dist/components/InputGroup.cjs.js +1 -1
- package/dist/components/InputGroup.es.js +1 -1
- package/dist/components/ItemList.cjs.js +5 -5
- package/dist/components/ItemList.cjs.js.map +1 -1
- package/dist/components/ItemList.es.js +5 -5
- package/dist/components/ItemList.es.js.map +1 -1
- package/dist/components/JSONSchemaForm.cjs.js +3 -3
- package/dist/components/JSONSchemaForm.es.js +3 -3
- package/dist/components/ListSearch.cjs.js +2 -2
- package/dist/components/ListSearch.cjs.js.map +1 -1
- package/dist/components/ListSearch.es.js +2 -2
- package/dist/components/ListSearch.es.js.map +1 -1
- package/dist/components/LogsDataList.cjs.js +2 -2
- package/dist/components/LogsDataList.es.js +2 -2
- package/dist/components/MainSidebar.cjs.js +4 -4
- package/dist/components/MainSidebar.cjs.js.map +1 -1
- package/dist/components/MainSidebar.es.js +4 -4
- package/dist/components/MainSidebar.es.js.map +1 -1
- package/dist/components/MarkdownRenderer.cjs.js +1 -1
- package/dist/components/MarkdownRenderer.es.js +1 -1
- package/dist/components/MetricsCard.cjs.js +1 -1
- package/dist/components/MetricsCard.es.js +1 -1
- package/dist/components/MetricsKpiCard.cjs.js +1 -1
- package/dist/components/MetricsKpiCard.es.js +1 -1
- package/dist/components/MetricsLineChart.cjs.js +1 -1
- package/dist/components/MetricsLineChart.es.js +1 -1
- package/dist/components/Notice.cjs.js +1 -1
- package/dist/components/Notice.es.js +1 -1
- package/dist/components/PendingIndicator.cjs.js +1 -1
- package/dist/components/PendingIndicator.cjs.js.map +1 -1
- package/dist/components/PendingIndicator.es.js +1 -1
- package/dist/components/PendingIndicator.es.js.map +1 -1
- package/dist/components/PermissionDenied.cjs.js +1 -1
- package/dist/components/PermissionDenied.es.js +1 -1
- package/dist/components/PrevNextNav.cjs.js +1 -1
- package/dist/components/PrevNextNav.es.js +1 -1
- package/dist/components/PropertyFilter.cjs.js +9 -9
- package/dist/components/PropertyFilter.cjs.js.map +1 -1
- package/dist/components/PropertyFilter.es.js +10 -10
- package/dist/components/PropertyFilter.es.js.map +1 -1
- package/dist/components/RuleBuilder.cjs.js +13 -13
- package/dist/components/RuleBuilder.cjs.js.map +1 -1
- package/dist/components/RuleBuilder.es.js +13 -13
- package/dist/components/RuleBuilder.es.js.map +1 -1
- package/dist/components/SankeyChart.cjs.js +4 -4
- package/dist/components/SankeyChart.cjs.js.map +1 -1
- package/dist/components/SankeyChart.es.js +4 -4
- package/dist/components/SankeyChart.es.js.map +1 -1
- package/dist/components/ScatterPlotChart.cjs.js +1 -1
- package/dist/components/ScatterPlotChart.cjs.js.map +1 -1
- package/dist/components/ScatterPlotChart.es.js +1 -1
- package/dist/components/ScatterPlotChart.es.js.map +1 -1
- package/dist/components/ScrollArea.cjs.js +1 -1
- package/dist/components/ScrollArea.es.js +1 -1
- package/dist/components/Select.cjs.js +1 -1
- package/dist/components/Select.es.js +1 -1
- package/dist/components/SessionExpired.cjs.js +1 -1
- package/dist/components/SessionExpired.es.js +1 -1
- package/dist/components/SettingsRow.cjs.js +1 -1
- package/dist/components/SettingsRow.cjs.js.map +1 -1
- package/dist/components/SettingsRow.es.js +1 -1
- package/dist/components/SettingsRow.es.js.map +1 -1
- package/dist/components/SideDialog.cjs.js +5 -5
- package/dist/components/SideDialog.cjs.js.map +1 -1
- package/dist/components/SideDialog.es.js +5 -5
- package/dist/components/SideDialog.es.js.map +1 -1
- package/dist/components/Steps.cjs.js +1 -1
- package/dist/components/Steps.cjs.js.map +1 -1
- package/dist/components/Steps.es.js +1 -1
- package/dist/components/Steps.es.js.map +1 -1
- package/dist/components/Table.cjs.js +2 -2
- package/dist/components/Table.cjs.js.map +1 -1
- package/dist/components/Table.es.js +2 -2
- package/dist/components/Table.es.js.map +1 -1
- package/dist/components/Tabs.cjs.js +1 -1
- package/dist/components/Tabs.es.js +1 -1
- package/dist/components/ThreadList.cjs.js +3 -3
- package/dist/components/ThreadList.cjs.js.map +1 -1
- package/dist/components/ThreadList.es.js +3 -3
- package/dist/components/ThreadList.es.js.map +1 -1
- package/dist/components/ThreadRail.cjs.js +6 -6
- package/dist/components/ThreadRail.cjs.js.map +1 -1
- package/dist/components/ThreadRail.es.js +6 -6
- package/dist/components/ThreadRail.es.js.map +1 -1
- package/dist/components/Tooltip.cjs.js +1 -1
- package/dist/components/Tooltip.es.js +1 -1
- package/dist/components/Tree.cjs.js +2 -2
- package/dist/components/Tree.cjs.js.map +1 -1
- package/dist/components/Tree.es.js +2 -2
- package/dist/components/Tree.es.js.map +1 -1
- package/dist/components/Truncate.cjs.js +2 -2
- package/dist/components/Truncate.es.js +2 -2
- package/dist/components/ai/ask-user.cjs.js +3 -3
- package/dist/components/ai/ask-user.cjs.js.map +1 -1
- package/dist/components/ai/ask-user.es.js +3 -3
- package/dist/components/ai/ask-user.es.js.map +1 -1
- package/dist/components/ai/plan.cjs.js +4 -4
- package/dist/components/ai/plan.cjs.js.map +1 -1
- package/dist/components/ai/plan.es.js +4 -4
- package/dist/components/ai/plan.es.js.map +1 -1
- package/dist/components/ai/task-list.cjs.js +6 -6
- package/dist/components/ai/task-list.cjs.js.map +1 -1
- package/dist/components/ai/task-list.es.js +6 -6
- package/dist/components/ai/task-list.es.js.map +1 -1
- package/dist/{copy-button-DNR760m7.cjs → copy-button-BKFcsNE1.cjs} +3 -3
- package/dist/{copy-button-DNR760m7.cjs.map → copy-button-BKFcsNE1.cjs.map} +1 -1
- package/dist/{copy-button-BuIpvUI7.js → copy-button-H2iaKMng.js} +3 -3
- package/dist/{copy-button-BuIpvUI7.js.map → copy-button-H2iaKMng.js.map} +1 -1
- package/dist/{data-code-section-D0BwpqvV.cjs → data-code-section-D2zjah_b.cjs} +8 -8
- package/dist/{data-code-section-D0BwpqvV.cjs.map → data-code-section-D2zjah_b.cjs.map} +1 -1
- package/dist/{data-code-section-BjqDCzy3.js → data-code-section-MHMkC6q9.js} +8 -8
- package/dist/{data-code-section-BjqDCzy3.js.map → data-code-section-MHMkC6q9.js.map} +1 -1
- package/dist/{data-keys-and-values-BMnGKbXm.js → data-keys-and-values-BJynhd6V.js} +3 -3
- package/dist/{data-keys-and-values-BMnGKbXm.js.map → data-keys-and-values-BJynhd6V.js.map} +1 -1
- package/dist/{data-keys-and-values--e2u0YXB.cjs → data-keys-and-values-sjag88jf.cjs} +3 -3
- package/dist/{data-keys-and-values--e2u0YXB.cjs.map → data-keys-and-values-sjag88jf.cjs.map} +1 -1
- package/dist/{data-list-CQWBPREX.cjs → data-list-CEGVpKNo.cjs} +5 -5
- package/dist/{data-list-CQWBPREX.cjs.map → data-list-CEGVpKNo.cjs.map} +1 -1
- package/dist/{data-list-Ca8j8X2e.js → data-list-SGIqDkMi.js} +5 -5
- package/dist/{data-list-Ca8j8X2e.js.map → data-list-SGIqDkMi.js.map} +1 -1
- package/dist/{data-list-row-wrapper-D-ieH7I9.cjs → data-list-row-wrapper-C-77LgWH.cjs} +2 -2
- package/dist/{data-list-row-wrapper-D-ieH7I9.cjs.map → data-list-row-wrapper-C-77LgWH.cjs.map} +1 -1
- package/dist/{data-list-row-wrapper-dMY1gERX.js → data-list-row-wrapper-DbGQIaO1.js} +2 -2
- package/dist/{data-list-row-wrapper-dMY1gERX.js.map → data-list-row-wrapper-DbGQIaO1.js.map} +1 -1
- package/dist/{data-list-skeleton-CIxMXF73.js → data-list-skeleton-CQvX7jIh.js} +4 -4
- package/dist/{data-list-skeleton-CIxMXF73.js.map → data-list-skeleton-CQvX7jIh.js.map} +1 -1
- package/dist/{data-list-skeleton-C-DkvqbS.cjs → data-list-skeleton-CmCTE-HQ.cjs} +4 -4
- package/dist/{data-list-skeleton-C-DkvqbS.cjs.map → data-list-skeleton-CmCTE-HQ.cjs.map} +1 -1
- package/dist/{data-list-top-cell-QZpCLDIZ.js → data-list-top-cell-D9EsRa0k.js} +5 -5
- package/dist/{data-list-top-cell-QZpCLDIZ.js.map → data-list-top-cell-D9EsRa0k.js.map} +1 -1
- package/dist/{data-list-top-cell-CL-FVkPX.cjs → data-list-top-cell-DoeqMbd1.cjs} +5 -5
- package/dist/{data-list-top-cell-CL-FVkPX.cjs.map → data-list-top-cell-DoeqMbd1.cjs.map} +1 -1
- package/dist/{data-panel-BGpCzY5K.js → data-panel-BEvHk4wg.js} +5 -5
- package/dist/{data-panel-BGpCzY5K.js.map → data-panel-BEvHk4wg.js.map} +1 -1
- package/dist/{data-panel-CsonAnlK.cjs → data-panel-BumsjXVz.cjs} +5 -5
- package/dist/{data-panel-CsonAnlK.cjs.map → data-panel-BumsjXVz.cjs.map} +1 -1
- package/dist/{date-time-range-picker-CF4a39P7.cjs → date-time-range-picker-ue0m5G27.cjs} +4 -4
- package/dist/{date-time-range-picker-CF4a39P7.cjs.map → date-time-range-picker-ue0m5G27.cjs.map} +1 -1
- package/dist/{date-time-range-picker-DDNeOyj9.js → date-time-range-picker-yJBIm34J.js} +4 -4
- package/dist/{date-time-range-picker-DDNeOyj9.js.map → date-time-range-picker-yJBIm34J.js.map} +1 -1
- package/dist/{dialog-XVpF4nQ5.cjs → dialog-ClItuCFY.cjs} +2 -2
- package/dist/{dialog-XVpF4nQ5.cjs.map → dialog-ClItuCFY.cjs.map} +1 -1
- package/dist/{dialog-DhjOHEDT.js → dialog-bnt6epW2.js} +2 -2
- package/dist/{dialog-DhjOHEDT.js.map → dialog-bnt6epW2.js.map} +1 -1
- package/dist/domains/logs/components/log-details-view.cjs.js +5 -5
- package/dist/domains/logs/components/log-details-view.cjs.js.map +1 -1
- package/dist/domains/logs/components/log-details-view.es.js +5 -5
- package/dist/domains/logs/components/log-details-view.es.js.map +1 -1
- package/dist/domains/logs/components/logs-error-content.cjs.js +4 -4
- package/dist/domains/logs/components/logs-error-content.es.js +4 -4
- package/dist/domains/logs/components/logs-list-view.cjs.js +2 -2
- package/dist/domains/logs/components/logs-list-view.es.js +2 -2
- 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/logs/components/no-logs-info.cjs.js +2 -2
- package/dist/domains/logs/components/no-logs-info.es.js +2 -2
- package/dist/domains/memory/components/flame-graph.cjs.js +18 -18
- package/dist/domains/memory/components/flame-graph.cjs.js.map +1 -1
- package/dist/domains/memory/components/flame-graph.es.js +18 -18
- package/dist/domains/memory/components/flame-graph.es.js.map +1 -1
- package/dist/domains/memory/components/memory-studio-panel.cjs.js +4 -4
- package/dist/domains/memory/components/memory-studio-panel.cjs.js.map +1 -1
- package/dist/domains/memory/components/memory-studio-panel.es.js +4 -4
- package/dist/domains/memory/components/memory-studio-panel.es.js.map +1 -1
- package/dist/domains/memory/components/observation-detail-view.cjs.js +9 -9
- package/dist/domains/memory/components/observation-detail-view.cjs.js.map +1 -1
- package/dist/domains/memory/components/observation-detail-view.es.js +9 -9
- package/dist/domains/memory/components/observation-detail-view.es.js.map +1 -1
- package/dist/domains/memory/components/thread-context-progress.cjs.js +2 -2
- package/dist/domains/memory/components/thread-context-progress.cjs.js.map +1 -1
- package/dist/domains/memory/components/thread-context-progress.es.js +2 -2
- package/dist/domains/memory/components/thread-context-progress.es.js.map +1 -1
- package/dist/domains/metrics/components/bar-list.cjs.js +1 -1
- package/dist/domains/metrics/components/bar-list.es.js +1 -1
- package/dist/domains/metrics/components/card-action-buttons.cjs.js +1 -1
- package/dist/domains/metrics/components/card-action-buttons.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/kpi-card-view.cjs.js +1 -1
- package/dist/domains/metrics/components/kpi-card-view.es.js +1 -1
- package/dist/domains/metrics/components/latency-card-view.cjs.js +3 -3
- package/dist/domains/metrics/components/latency-card-view.es.js +3 -3
- package/dist/domains/metrics/components/memory-card-view.cjs.js +3 -3
- package/dist/domains/metrics/components/memory-card-view.es.js +3 -3
- package/dist/domains/metrics/components/model-usage-cost-card-view.cjs.js +2 -2
- package/dist/domains/metrics/components/model-usage-cost-card-view.es.js +2 -2
- package/dist/domains/metrics/components/scores-card-view.cjs.js +4 -4
- package/dist/domains/metrics/components/scores-card-view.es.js +4 -4
- package/dist/domains/metrics/components/token-usage-by-agent-card-view.cjs.js +3 -3
- package/dist/domains/metrics/components/token-usage-by-agent-card-view.es.js +3 -3
- package/dist/domains/metrics/components/token-usage-timeline-card-view.cjs.js +3 -3
- package/dist/domains/metrics/components/token-usage-timeline-card-view.es.js +3 -3
- package/dist/domains/metrics/components/traces-volume-card-view.cjs.js +3 -3
- package/dist/domains/metrics/components/traces-volume-card-view.es.js +3 -3
- package/dist/domains/traces/components/no-traces-info.cjs.js +2 -2
- package/dist/domains/traces/components/no-traces-info.es.js +2 -2
- package/dist/domains/traces/components/span-data-panel-view.cjs.js +5 -5
- package/dist/domains/traces/components/span-data-panel-view.cjs.js.map +1 -1
- package/dist/domains/traces/components/span-data-panel-view.es.js +5 -5
- package/dist/domains/traces/components/span-data-panel-view.es.js.map +1 -1
- package/dist/domains/traces/components/span-token-usage.cjs.js +7 -7
- package/dist/domains/traces/components/span-token-usage.cjs.js.map +1 -1
- package/dist/domains/traces/components/span-token-usage.es.js +7 -7
- package/dist/domains/traces/components/span-token-usage.es.js.map +1 -1
- package/dist/domains/traces/components/timeline-expand-col.cjs.js +1 -1
- package/dist/domains/traces/components/timeline-expand-col.es.js +1 -1
- package/dist/domains/traces/components/timeline-timing-col.cjs.js +1 -1
- package/dist/domains/traces/components/timeline-timing-col.es.js +1 -1
- package/dist/domains/traces/components/trace-data-panel-view.cjs.js +3 -3
- package/dist/domains/traces/components/trace-data-panel-view.es.js +3 -3
- package/dist/domains/traces/components/trace-keys-and-values.cjs.js +1 -1
- package/dist/domains/traces/components/trace-keys-and-values.es.js +1 -1
- package/dist/domains/traces/components/trace-timeline.cjs.js +1 -1
- package/dist/domains/traces/components/trace-timeline.cjs.js.map +1 -1
- package/dist/domains/traces/components/trace-timeline.es.js +1 -1
- package/dist/domains/traces/components/trace-timeline.es.js.map +1 -1
- package/dist/domains/traces/components/traces-error-content.cjs.js +3 -3
- package/dist/domains/traces/components/traces-error-content.es.js +3 -3
- package/dist/domains/traces/components/traces-list-mode-toggle.cjs.js +2 -2
- package/dist/domains/traces/components/traces-list-mode-toggle.es.js +2 -2
- package/dist/domains/traces/components/traces-list-view.cjs.js +2 -2
- package/dist/domains/traces/components/traces-list-view.es.js +2 -2
- package/dist/domains/traces/components/traces-toolbar.cjs.js +1 -1
- package/dist/domains/traces/components/traces-toolbar.es.js +1 -1
- package/dist/{drawer-DvuUmhic.cjs → drawer-CdsTitFp.cjs} +3 -3
- package/dist/{drawer-DvuUmhic.cjs.map → drawer-CdsTitFp.cjs.map} +1 -1
- package/dist/{drawer-Dyx25o_o.js → drawer-DZ9amYo_.js} +3 -3
- package/dist/{drawer-Dyx25o_o.js.map → drawer-DZ9amYo_.js.map} +1 -1
- package/dist/{dropdown-menu-UWIbg6mM.js → dropdown-menu-DEFygDZI.js} +2 -2
- package/dist/{dropdown-menu-UWIbg6mM.js.map → dropdown-menu-DEFygDZI.js.map} +1 -1
- package/dist/{dropdown-menu-BE2WHHln.cjs → dropdown-menu-ppWztidX.cjs} +2 -2
- package/dist/{dropdown-menu-BE2WHHln.cjs.map → dropdown-menu-ppWztidX.cjs.map} +1 -1
- package/dist/ee/signals/components/signals-empty-state.cjs.js +32 -32
- package/dist/ee/signals/components/signals-empty-state.cjs.js.map +1 -1
- package/dist/ee/signals/components/signals-empty-state.es.js +32 -32
- package/dist/ee/signals/components/signals-empty-state.es.js.map +1 -1
- package/dist/ee/topics/components/topic-trace-summary-list.cjs.js +3 -3
- package/dist/ee/topics/components/topic-trace-summary-list.es.js +3 -3
- package/dist/ee/topics/components/topics-layout.cjs.js +2 -2
- package/dist/ee/topics/components/topics-layout.cjs.js.map +1 -1
- package/dist/ee/topics/components/topics-layout.es.js +2 -2
- package/dist/ee/topics/components/topics-layout.es.js.map +1 -1
- package/dist/{field-block-CBdMcT-i.js → field-block-B63CpA4d.js} +2 -2
- package/dist/{field-block-CBdMcT-i.js.map → field-block-B63CpA4d.js.map} +1 -1
- package/dist/{field-block-CEbnWKc0.cjs → field-block-BcTR08I7.cjs} +2 -2
- package/dist/{field-block-CEbnWKc0.cjs.map → field-block-BcTR08I7.cjs.map} +1 -1
- package/dist/{horizontal-bars-CHoNhl-X.js → horizontal-bars-DHeyxqDT.js} +8 -8
- package/dist/{horizontal-bars-CHoNhl-X.js.map → horizontal-bars-DHeyxqDT.js.map} +1 -1
- package/dist/{horizontal-bars-aRhVh7mi.cjs → horizontal-bars-qf60G0xH.cjs} +8 -8
- package/dist/{horizontal-bars-aRhVh7mi.cjs.map → horizontal-bars-qf60G0xH.cjs.map} +1 -1
- package/dist/{input-group-QaBen5tC.cjs → input-group-CH72YUVL.cjs} +2 -2
- package/dist/{input-group-QaBen5tC.cjs.map → input-group-CH72YUVL.cjs.map} +1 -1
- package/dist/{input-group-DZnJcY3U.js → input-group-Dzs-ai0n.js} +2 -2
- package/dist/{input-group-DZnJcY3U.js.map → input-group-Dzs-ai0n.js.map} +1 -1
- package/dist/{logs-data-list-4R9mXlZ5.cjs → logs-data-list-B6XQnRed.cjs} +5 -5
- package/dist/{logs-data-list-4R9mXlZ5.cjs.map → logs-data-list-B6XQnRed.cjs.map} +1 -1
- package/dist/{logs-data-list-BXLk5vqv.js → logs-data-list-BkmYnYuf.js} +5 -5
- package/dist/{logs-data-list-BXLk5vqv.js.map → logs-data-list-BkmYnYuf.js.map} +1 -1
- package/dist/{markdown-renderer-ZzJcwfS3.js → markdown-renderer-BzKf1Gel.js} +7 -7
- package/dist/{markdown-renderer-ZzJcwfS3.js.map → markdown-renderer-BzKf1Gel.js.map} +1 -1
- package/dist/{markdown-renderer-DRnUrMmF.cjs → markdown-renderer-CD2YXUdF.cjs} +7 -7
- package/dist/{markdown-renderer-DRnUrMmF.cjs.map → markdown-renderer-CD2YXUdF.cjs.map} +1 -1
- package/dist/{metrics-card-C3gkudSv.js → metrics-card-C0lGcxb9.js} +4 -4
- package/dist/{metrics-card-C3gkudSv.js.map → metrics-card-C0lGcxb9.js.map} +1 -1
- package/dist/{metrics-card-BSXWk6GD.cjs → metrics-card-DmbKNY3U.cjs} +4 -4
- package/dist/{metrics-card-BSXWk6GD.cjs.map → metrics-card-DmbKNY3U.cjs.map} +1 -1
- package/dist/{metrics-kpi-card-C4R43XbL.js → metrics-kpi-card-AhIw9eyu.js} +2 -2
- package/dist/{metrics-kpi-card-C4R43XbL.js.map → metrics-kpi-card-AhIw9eyu.js.map} +1 -1
- package/dist/{metrics-kpi-card-_xThjpJl.cjs → metrics-kpi-card-tAReOFYk.cjs} +2 -2
- package/dist/{metrics-kpi-card-_xThjpJl.cjs.map → metrics-kpi-card-tAReOFYk.cjs.map} +1 -1
- package/dist/{metrics-line-chart-kZ1Ed_ga.cjs → metrics-line-chart-B_0w522y.cjs} +4 -4
- package/dist/metrics-line-chart-B_0w522y.cjs.map +1 -0
- package/dist/{metrics-line-chart-COIxay_u.js → metrics-line-chart-DudirJsu.js} +4 -4
- package/dist/metrics-line-chart-DudirJsu.js.map +1 -0
- package/dist/primitives/portal-container.cjs.js.map +1 -1
- package/dist/primitives/portal-container.es.js.map +1 -1
- package/dist/{property-filter-applied-DgmkZVbl.cjs → property-filter-applied-BhxbHAN8.cjs} +10 -10
- package/dist/{property-filter-applied-DgmkZVbl.cjs.map → property-filter-applied-BhxbHAN8.cjs.map} +1 -1
- package/dist/{property-filter-applied-Bs1Ck691.js → property-filter-applied-DI4w1ACS.js} +10 -10
- package/dist/{property-filter-applied-Bs1Ck691.js.map → property-filter-applied-DI4w1ACS.js.map} +1 -1
- package/dist/resize/panel-drawer.cjs.js +1 -1
- package/dist/resize/panel-drawer.es.js +1 -1
- package/dist/{scroll-area-h3DvBR0U.js → scroll-area-DZrEuKjC.js} +2 -2
- package/dist/{scroll-area-h3DvBR0U.js.map → scroll-area-DZrEuKjC.js.map} +1 -1
- package/dist/{scroll-area-BIaiA4t3.cjs → scroll-area-Dv6QagXt.cjs} +2 -2
- package/dist/{scroll-area-BIaiA4t3.cjs.map → scroll-area-Dv6QagXt.cjs.map} +1 -1
- package/dist/{search-field-block-DmqZsrrI.cjs → search-field-block-D6TdrHZX.cjs} +4 -4
- package/dist/{search-field-block-DmqZsrrI.cjs.map → search-field-block-D6TdrHZX.cjs.map} +1 -1
- package/dist/{search-field-block-CMoQ9fjl.js → search-field-block-DCnFZzRK.js} +4 -4
- package/dist/{search-field-block-CMoQ9fjl.js.map → search-field-block-DCnFZzRK.js.map} +1 -1
- package/dist/{select-CUMnhTBS.cjs → select-B6ce20XX.cjs} +3 -3
- package/dist/{select-CUMnhTBS.cjs.map → select-B6ce20XX.cjs.map} +1 -1
- package/dist/{select-LyQqK1ph.js → select-Beo8qQ0e.js} +3 -3
- package/dist/{select-LyQqK1ph.js.map → select-Beo8qQ0e.js.map} +1 -1
- package/dist/{select-field-block-BSlngEHK.js → select-field-block-DXw3tD0y.js} +3 -3
- package/dist/{select-field-block-BSlngEHK.js.map → select-field-block-DXw3tD0y.js.map} +1 -1
- package/dist/{select-field-block-BI_NZs2R.cjs → select-field-block-svlHplxW.cjs} +3 -3
- package/dist/{select-field-block-BI_NZs2R.cjs.map → select-field-block-svlHplxW.cjs.map} +1 -1
- package/dist/{tabs-tab-Ch7-lVxf.cjs → tabs-tab-BkUCE-4E.cjs} +2 -2
- package/dist/{tabs-tab-Ch7-lVxf.cjs.map → tabs-tab-BkUCE-4E.cjs.map} +1 -1
- package/dist/{tabs-tab-CQhe76fQ.js → tabs-tab-DDGltcUc.js} +2 -2
- package/dist/{tabs-tab-CQhe76fQ.js.map → tabs-tab-DDGltcUc.js.map} +1 -1
- package/dist/{text-field-block-BUvxjW9m.cjs → text-field-block-BGlwSFYC.cjs} +2 -2
- package/dist/{text-field-block-BUvxjW9m.cjs.map → text-field-block-BGlwSFYC.cjs.map} +1 -1
- package/dist/{text-field-block-DxtR1Ft4.js → text-field-block-DOiM0dpY.js} +2 -2
- package/dist/{text-field-block-DxtR1Ft4.js.map → text-field-block-DOiM0dpY.js.map} +1 -1
- package/dist/{time-picker-Box0pdQU.cjs → time-picker-BOQtPoyD.cjs} +2 -2
- package/dist/{time-picker-Box0pdQU.cjs.map → time-picker-BOQtPoyD.cjs.map} +1 -1
- package/dist/{time-picker-ew9aXG86.js → time-picker-mLzcoQMO.js} +2 -2
- package/dist/{time-picker-ew9aXG86.js.map → time-picker-mLzcoQMO.js.map} +1 -1
- package/dist/{tooltip-Ch06EF_U.js → tooltip-BFbYhBj1.js} +2 -2
- package/dist/{tooltip-Ch06EF_U.js.map → tooltip-BFbYhBj1.js.map} +1 -1
- package/dist/{tooltip-VGyJcEoE.cjs → tooltip-CLz5PtEE.cjs} +2 -2
- package/dist/{tooltip-VGyJcEoE.cjs.map → tooltip-CLz5PtEE.cjs.map} +1 -1
- package/dist/{traces-data-list-DLmFHLQ6.js → traces-data-list-Bmx7jLZc.js} +5 -5
- package/dist/{traces-data-list-DLmFHLQ6.js.map → traces-data-list-Bmx7jLZc.js.map} +1 -1
- package/dist/{traces-data-list-G69pEglx.cjs → traces-data-list-Dx9tpivx.cjs} +5 -5
- package/dist/{traces-data-list-G69pEglx.cjs.map → traces-data-list-Dx9tpivx.cjs.map} +1 -1
- package/package.json +5 -5
- package/dist/metrics-line-chart-COIxay_u.js.map +0 -1
- package/dist/metrics-line-chart-kZ1Ed_ga.cjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ThreadRail.es.js","sources":["../../src/ds/components/ThreadRail/thread-rail.tsx","../../src/ds/components/ThreadRail/thread-rail-turns.ts"],"sourcesContent":["import { FileText } from 'lucide-react';\nimport * as React from 'react';\n\nimport type { ThreadRailTurn } from './thread-rail-turns';\n\nimport { useOptionalMessageScroller, useOptionalMessageScrollerVisibility } from '@/ds/components/MessageScroller';\nimport { ScrollArea } from '@/ds/components/ScrollArea';\nimport { useMeasuredAutoHeight } from '@/hooks/use-measured-auto-height';\nimport { cn } from '@/lib/utils';\n\ntype ThreadRailPreviewPhase = 'hidden' | 'entering' | 'visible' | 'exiting';\n\ntype ThreadRailPreviewState = {\n currentTurn: ThreadRailTurn | undefined;\n previousTurn: ThreadRailTurn | undefined;\n index: number | null;\n phase: ThreadRailPreviewPhase;\n top: number;\n transitionKey: number;\n};\n\nconst PREVIEW_TRANSITION_DURATION_MS = 360;\nconst PREVIEW_CLEANUP_DELAY_MS = PREVIEW_TRANSITION_DURATION_MS + 80;\n\nconst DEFAULT_PREVIEW_STATE: ThreadRailPreviewState = {\n currentTurn: undefined,\n previousTurn: undefined,\n index: null,\n phase: 'hidden',\n top: 0,\n transitionKey: 0,\n};\n\nexport interface ThreadRailProps {\n turns: ThreadRailTurn[];\n currentAnchorId?: string;\n visibleMessageIds?: string[];\n label?: string;\n className?: string;\n maxHeight?: string;\n scrollAreaClassName?: string;\n onSelect?: (turn: ThreadRailTurn) => void;\n}\n\nexport function ThreadRail({\n turns,\n currentAnchorId,\n visibleMessageIds,\n label = 'Conversation timeline',\n className,\n maxHeight = 'calc(100dvh - 12rem)',\n scrollAreaClassName,\n onSelect,\n}: ThreadRailProps) {\n const railRef = React.useRef<HTMLElement>(null);\n const previewId = React.useId();\n const [previewState, setPreviewState] = React.useState<ThreadRailPreviewState>(DEFAULT_PREVIEW_STATE);\n const messageScroller = useOptionalMessageScroller();\n const scrollerVisibility = useOptionalMessageScrollerVisibility();\n\n const fallbackMessageId = turns.at(-1)?.messageId;\n const activeMessageId = currentAnchorId ?? scrollerVisibility?.currentAnchorId ?? fallbackMessageId;\n const resolvedVisibleMessageIds =\n visibleMessageIds ?? scrollerVisibility?.visibleMessageIds ?? (activeMessageId ? [activeMessageId] : []);\n const visibleMessageIdSet = new Set(resolvedVisibleMessageIds);\n const previewHoverActive = previewState.phase === 'entering' || previewState.phase === 'visible';\n const hoveredIndex = previewHoverActive ? previewState.index : null;\n const selectTurn = React.useCallback(\n (turn: ThreadRailTurn) => {\n if (onSelect) {\n onSelect(turn);\n return;\n }\n\n messageScroller?.scrollToMessage(turn.messageId, { behavior: 'smooth', align: 'start' });\n },\n [messageScroller, onSelect],\n );\n\n const showPreview = (index: number, element: HTMLElement) => {\n const railTop = railRef.current?.getBoundingClientRect().top ?? 0;\n const itemRect = element.getBoundingClientRect();\n const nextTurn = turns[index];\n if (!nextTurn) return;\n\n setPreviewState(current => {\n const nextTop = itemRect.top + itemRect.height / 2 - railTop;\n if (current.index === index && current.phase !== 'hidden' && current.phase !== 'exiting') {\n return { ...current, top: nextTop };\n }\n\n const previousTurn =\n current.currentTurn && current.currentTurn.key !== nextTurn.key && current.phase !== 'hidden'\n ? current.currentTurn\n : undefined;\n\n return {\n currentTurn: nextTurn,\n previousTurn,\n index,\n phase: 'entering',\n top: nextTop,\n transitionKey: current.transitionKey + 1,\n };\n });\n };\n\n const hidePreview = () => {\n setPreviewState(current => {\n if (!current.currentTurn || current.phase === 'hidden' || current.phase === 'exiting') {\n return { ...current, index: null };\n }\n\n return {\n ...current,\n index: null,\n previousTurn: undefined,\n phase: 'exiting',\n transitionKey: current.transitionKey + 1,\n };\n });\n };\n\n React.useEffect(() => {\n if (previewState.phase !== 'entering') return;\n\n const requestFrame = window.requestAnimationFrame ?? window.setTimeout;\n const cancelFrame = window.cancelAnimationFrame ?? window.clearTimeout;\n let settleFrame: number | undefined;\n const startFrame = requestFrame(() => {\n settleFrame = requestFrame(() => {\n setPreviewState(current =>\n current.transitionKey === previewState.transitionKey && current.phase === 'entering'\n ? { ...current, phase: 'visible' }\n : current,\n );\n });\n });\n\n return () => {\n cancelFrame(startFrame);\n if (settleFrame !== undefined) cancelFrame(settleFrame);\n };\n }, [previewState.phase, previewState.transitionKey]);\n\n React.useEffect(() => {\n if (previewState.phase !== 'visible' || !previewState.previousTurn) return;\n\n const timeout = window.setTimeout(() => {\n setPreviewState(current =>\n current.transitionKey === previewState.transitionKey ? { ...current, previousTurn: undefined } : current,\n );\n }, PREVIEW_CLEANUP_DELAY_MS);\n\n return () => window.clearTimeout(timeout);\n }, [previewState.phase, previewState.previousTurn, previewState.transitionKey]);\n\n React.useEffect(() => {\n if (previewState.phase !== 'exiting') return;\n\n const timeout = window.setTimeout(() => {\n setPreviewState(current =>\n current.transitionKey === previewState.transitionKey ? DEFAULT_PREVIEW_STATE : current,\n );\n }, PREVIEW_CLEANUP_DELAY_MS);\n\n return () => window.clearTimeout(timeout);\n }, [previewState.phase, previewState.transitionKey]);\n\n if (turns.length === 0) return null;\n\n return (\n <nav\n ref={railRef}\n aria-label={label}\n data-testid=\"thread-rail\"\n className={cn('relative w-8 py-2', className)}\n onMouseLeave={hidePreview}\n onBlur={event => {\n const nextFocus = event.relatedTarget;\n if (!(nextFocus instanceof Node) || !event.currentTarget.contains(nextFocus)) hidePreview();\n }}\n >\n <ScrollArea\n data-testid=\"thread-rail-scroll-area\"\n maxHeight={maxHeight}\n className={cn('w-8', scrollAreaClassName)}\n viewPortClassName=\"pr-3\"\n >\n <div className=\"flex w-4 flex-col items-start gap-2 py-2\">\n {turns.map((turn, index) => {\n const distance = hoveredIndex === null ? null : Math.abs(index - hoveredIndex);\n const active = turn.messageId === activeMessageId;\n const inView = visibleMessageIdSet.has(turn.messageId);\n const previewActive = hoveredIndex === index;\n\n return (\n <ThreadRailItem\n key={turn.key}\n turn={turn}\n index={index}\n distance={distance}\n active={active}\n inView={inView}\n previewId={previewActive ? previewId : undefined}\n onHoverChange={showPreview}\n onSelect={selectTurn}\n />\n );\n })}\n </div>\n </ScrollArea>\n\n {previewState.currentTurn && (\n <ThreadRailPreview\n id={previewId}\n currentTurn={previewState.currentTurn}\n previousTurn={previewState.previousTurn}\n phase={previewState.phase}\n top={previewState.top}\n />\n )}\n </nav>\n );\n}\n\ninterface ThreadRailItemProps {\n turn: ThreadRailTurn;\n index: number;\n distance: number | null;\n active: boolean;\n inView: boolean;\n previewId?: string;\n onHoverChange: (index: number, element: HTMLElement) => void;\n onSelect: (turn: ThreadRailTurn) => void;\n}\n\n/** Width of a rail tick: widest at the hovered item, tapering to neighbours. */\nconst getRailItemWidth = (distance: number | null): string => {\n if (distance === 0) return 'w-4';\n if (distance === 1) return 'w-3';\n return 'w-2';\n};\n\n/** Background tone of a rail tick, prioritising hovered/active, then in-view, then proximity. */\nconst getRailItemTone = ({\n distance,\n active,\n inView,\n}: Pick<ThreadRailItemProps, 'distance' | 'active' | 'inView'>): string => {\n if (distance === 0 || active) return 'bg-neutral6';\n if (inView) return 'bg-neutral5';\n if (distance === 1) return 'bg-neutral4';\n return 'bg-neutral3/60';\n};\n\nfunction ThreadRailItem({\n turn,\n index,\n distance,\n active,\n inView,\n previewId,\n onHoverChange,\n onSelect,\n}: ThreadRailItemProps) {\n const size = getRailItemWidth(distance);\n const tone = getRailItemTone({ distance, active, inView });\n\n return (\n <div\n data-in-view={inView ? 'true' : undefined}\n data-active={active ? 'true' : undefined}\n className=\"group/thread-rail-item relative flex items-center\"\n >\n <button\n type=\"button\"\n aria-label={`Jump to ${turn.prompt}`}\n aria-current={active ? 'location' : undefined}\n aria-describedby={previewId}\n data-in-view={inView ? 'true' : undefined}\n data-active={active ? 'true' : undefined}\n onClick={() => onSelect(turn)}\n onMouseEnter={event => onHoverChange(index, event.currentTarget)}\n onFocus={event => onHoverChange(index, event.currentTarget)}\n className={cn(\n 'duration-normal relative block h-px cursor-pointer rounded-full transition-[width,background-color] ease-out',\n \"before:absolute before:inset-x-0 before:-inset-y-1 before:content-['']\",\n 'focus-visible:ring-2 focus-visible:ring-accent1/40 focus-visible:outline-hidden',\n size,\n tone,\n )}\n />\n </div>\n );\n}\n\nfunction ThreadRailPreview({\n id,\n currentTurn,\n previousTurn,\n phase,\n top,\n}: {\n id: string;\n currentTurn: ThreadRailTurn;\n previousTurn: ThreadRailTurn | undefined;\n phase: ThreadRailPreviewPhase;\n top: number;\n}) {\n const {\n ref: previewSizerRef,\n heightStyle: previewHeightStyle,\n measure: measurePreviewHeight,\n } = useMeasuredAutoHeight<HTMLDivElement>();\n const containerVisible = phase === 'visible' || (phase === 'entering' && Boolean(previousTurn));\n // Entering and exiting share the same off-screen resting style.\n const hiddenLayerClassName = 'scale-95 opacity-0 blur-xs';\n const visibleLayerClassName = 'scale-100 opacity-100 blur-none';\n const layerClassName =\n 'absolute inset-x-0 top-0 h-full origin-left transition-[opacity,filter,scale] duration-150 ease-in-out will-change-[opacity,filter,scale] motion-reduce:scale-100 motion-reduce:blur-none motion-reduce:transition-none';\n\n React.useLayoutEffect(() => {\n measurePreviewHeight();\n }, [currentTurn.key, phase, measurePreviewHeight]);\n\n return (\n <div\n id={id}\n data-testid=\"thread-rail-preview\"\n data-visible={containerVisible ? 'true' : undefined}\n className={cn(\n 'pointer-events-none absolute top-0 left-full z-30 ml-3 w-72 overflow-hidden rounded-xl border border-border1 bg-surface3 text-left shadow-dialog transition-[height,translate,opacity] duration-360 ease-out-custom will-change-[height,translate,opacity] motion-reduce:transition-none',\n containerVisible ? 'opacity-100' : 'opacity-0',\n )}\n style={{ ...previewHeightStyle, translate: `0 calc(${top}px - 50%)` }}\n >\n <div ref={previewSizerRef} data-testid=\"thread-rail-preview-sizer\" aria-hidden className=\"invisible grid\">\n <ThreadRailPreviewContent turn={currentTurn} className=\"col-start-1 row-start-1 p-3.5\" />\n </div>\n <div data-testid=\"thread-rail-preview-viewport\" className=\"absolute inset-0\">\n <div className=\"relative h-full\">\n {previousTurn && (\n <div\n key={previousTurn.key}\n data-testid=\"thread-rail-preview-previous\"\n aria-hidden\n className={cn(layerClassName, phase === 'entering' ? visibleLayerClassName : hiddenLayerClassName)}\n >\n <ThreadRailPreviewContent turn={previousTurn} className=\"p-3.5\" />\n </div>\n )}\n <div\n key={currentTurn.key}\n data-testid=\"thread-rail-preview-current\"\n className={cn(layerClassName, phase === 'visible' ? visibleLayerClassName : hiddenLayerClassName)}\n >\n <ThreadRailPreviewContent turn={currentTurn} className=\"p-3.5\" />\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nfunction ThreadRailPreviewContent({\n turn,\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement> & { turn: ThreadRailTurn }) {\n return (\n <div className={className} {...props}>\n <div className=\"truncate text-ui-md leading-ui-md font-medium text-neutral6\">{turn.prompt}</div>\n {turn.reply && <p className=\"mt-1.5 line-clamp-3 text-ui-sm leading-ui-sm text-neutral4\">{turn.reply}</p>}\n {(turn.files.length > 0 || turn.hiddenFileCount > 0) && (\n <div className=\"mt-3 flex flex-wrap items-center gap-2 border-t border-border1/60 pt-2.5\">\n {turn.files.map(file => (\n <span key={file} className=\"inline-flex max-w-44 items-center gap-1.5 truncate text-ui-sm text-neutral4\">\n <FileText className=\"size-3.5 shrink-0 opacity-70\" aria-hidden />\n {file}\n </span>\n ))}\n {turn.hiddenFileCount > 0 && (\n <span className=\"text-ui-sm font-medium text-neutral4\">+{turn.hiddenFileCount}</span>\n )}\n </div>\n )}\n </div>\n );\n}\n","import type { MastraDBMessage } from '@mastra/core/agent/message-list';\nimport { CLIENT_MESSAGE_ID_KEY } from '@mastra/react';\n\nconst SUMMARY_MAX_LENGTH = 120;\nconst FILE_PREVIEW_LIMIT = 2;\n\nexport interface ThreadRailTurn {\n key: string;\n messageId: string;\n prompt: string;\n reply?: string;\n files: string[];\n hiddenFileCount: number;\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\nexport const getClientMessageKey = (message: MastraDBMessage): string => {\n const metadata = message.content.metadata;\n const clientMessageId = isRecord(metadata) ? metadata[CLIENT_MESSAGE_ID_KEY] : undefined;\n return typeof clientMessageId === 'string' && clientMessageId.length > 0 ? clientMessageId : message.id;\n};\n\nconst normalizeSummary = (value: string, fallback: string): string => {\n const normalized = value.replace(/\\s+/g, ' ').trim();\n if (normalized.length === 0) return fallback;\n if (normalized.length <= SUMMARY_MAX_LENGTH) return normalized;\n return `${normalized.slice(0, SUMMARY_MAX_LENGTH - 3).trimEnd()}...`;\n};\n\nconst getTextFromParts = (message: MastraDBMessage): string =>\n message.content.parts\n .flatMap(part => {\n if (!isRecord(part) || part.type !== 'text' || typeof part.text !== 'string') return [];\n return [part.text];\n })\n .join('\\n');\n\nconst getStringField = (part: Record<string, unknown>, keys: string[]): string | undefined => {\n for (const key of keys) {\n const value = part[key];\n if (typeof value === 'string' && value.trim().length > 0) return value;\n }\n return undefined;\n};\n\nconst getPathLabel = (value: string): string | undefined => {\n if (value.startsWith('data:')) return undefined;\n\n try {\n const url = new URL(value);\n const candidate = url.pathname.split('/').filter(Boolean).pop();\n return candidate || url.hostname || undefined;\n } catch {\n const candidate = value.split(/[?#]/)[0]?.split('/').filter(Boolean).pop();\n return candidate && !candidate.startsWith('data:') ? candidate : undefined;\n }\n};\n\nconst getFallbackFileLabel = (part: Record<string, unknown>): string => {\n const mediaType = getStringField(part, ['mimeType', 'mediaType']) ?? '';\n if (part.type === 'image' || mediaType.startsWith('image/')) return 'Image';\n if (mediaType === 'application/pdf') return 'PDF';\n if (mediaType.startsWith('video/')) return 'Video';\n if (mediaType.startsWith('audio/')) return 'Audio';\n return 'File';\n};\n\nconst getFileLabelFromPart = (part: MastraDBMessage['content']['parts'][number]): string | undefined => {\n if (!isRecord(part)) return undefined;\n\n const type = getStringField(part, ['type']);\n if (type !== 'file' && type !== 'image') return undefined;\n\n const explicitLabel = getStringField(part, ['filename', 'name']);\n if (explicitLabel) return explicitLabel;\n\n const source = getStringField(part, ['url', 'image', 'data']);\n const pathLabel = source ? getPathLabel(source) : undefined;\n return pathLabel ?? getFallbackFileLabel(part);\n};\n\nconst getFileLabels = (message: MastraDBMessage): string[] =>\n message.content.parts.map(getFileLabelFromPart).filter((label): label is string => Boolean(label));\n\nconst getSignalType = (message: MastraDBMessage): string | undefined => {\n const signal = message.content.metadata?.signal;\n const metadataType = isRecord(signal) ? signal.type : undefined;\n return typeof metadataType === 'string' ? metadataType : message.type;\n};\n\nconst isDisplayableUserMessage = (message: MastraDBMessage): boolean => {\n if (message.role === 'user') return true;\n if (message.role !== 'signal') return false;\n\n const signalType = getSignalType(message);\n return signalType === 'user' || signalType === 'user-message';\n};\n\nconst getNextAssistantReply = (messages: MastraDBMessage[], startIndex: number): string | undefined => {\n for (let index = startIndex + 1; index < messages.length; index += 1) {\n const message = messages[index];\n if (!message) continue;\n if (isDisplayableUserMessage(message)) return undefined;\n if (message.role !== 'assistant') continue;\n\n const reply = normalizeSummary(getTextFromParts(message), '');\n if (reply) return reply;\n }\n\n return undefined;\n};\n\nexport const buildThreadRailTurns = (messages: MastraDBMessage[]): ThreadRailTurn[] =>\n messages.flatMap((message, index) => {\n if (!isDisplayableUserMessage(message)) return [];\n\n const files = getFileLabels(message);\n const visibleFiles = files.slice(0, FILE_PREVIEW_LIMIT);\n\n return [\n {\n key: getClientMessageKey(message),\n messageId: message.id,\n prompt: normalizeSummary(getTextFromParts(message), files.length > 0 ? 'Attached file' : 'User message'),\n reply: getNextAssistantReply(messages, index),\n files: visibleFiles,\n hiddenFileCount: files.length - visibleFiles.length,\n },\n ];\n });\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ThreadRail.es.js","sources":["../../src/ds/components/ThreadRail/thread-rail.tsx","../../src/ds/components/ThreadRail/thread-rail-turns.ts"],"sourcesContent":["import { FileText } from 'lucide-react';\nimport * as React from 'react';\n\nimport type { ThreadRailTurn } from './thread-rail-turns';\n\nimport { useOptionalMessageScroller, useOptionalMessageScrollerVisibility } from '@/ds/components/MessageScroller';\nimport { ScrollArea } from '@/ds/components/ScrollArea';\nimport { useMeasuredAutoHeight } from '@/hooks/use-measured-auto-height';\nimport { cn } from '@/lib/utils';\n\ntype ThreadRailPreviewPhase = 'hidden' | 'entering' | 'visible' | 'exiting';\n\ntype ThreadRailPreviewState = {\n currentTurn: ThreadRailTurn | undefined;\n previousTurn: ThreadRailTurn | undefined;\n index: number | null;\n phase: ThreadRailPreviewPhase;\n top: number;\n transitionKey: number;\n};\n\nconst PREVIEW_TRANSITION_DURATION_MS = 360;\nconst PREVIEW_CLEANUP_DELAY_MS = PREVIEW_TRANSITION_DURATION_MS + 80;\n\nconst DEFAULT_PREVIEW_STATE: ThreadRailPreviewState = {\n currentTurn: undefined,\n previousTurn: undefined,\n index: null,\n phase: 'hidden',\n top: 0,\n transitionKey: 0,\n};\n\nexport interface ThreadRailProps {\n turns: ThreadRailTurn[];\n currentAnchorId?: string;\n visibleMessageIds?: string[];\n label?: string;\n className?: string;\n maxHeight?: string;\n scrollAreaClassName?: string;\n onSelect?: (turn: ThreadRailTurn) => void;\n}\n\nexport function ThreadRail({\n turns,\n currentAnchorId,\n visibleMessageIds,\n label = 'Conversation timeline',\n className,\n maxHeight = 'calc(100dvh - 12rem)',\n scrollAreaClassName,\n onSelect,\n}: ThreadRailProps) {\n const railRef = React.useRef<HTMLElement>(null);\n const previewId = React.useId();\n const [previewState, setPreviewState] = React.useState<ThreadRailPreviewState>(DEFAULT_PREVIEW_STATE);\n const messageScroller = useOptionalMessageScroller();\n const scrollerVisibility = useOptionalMessageScrollerVisibility();\n\n const fallbackMessageId = turns.at(-1)?.messageId;\n const activeMessageId = currentAnchorId ?? scrollerVisibility?.currentAnchorId ?? fallbackMessageId;\n const resolvedVisibleMessageIds =\n visibleMessageIds ?? scrollerVisibility?.visibleMessageIds ?? (activeMessageId ? [activeMessageId] : []);\n const visibleMessageIdSet = new Set(resolvedVisibleMessageIds);\n const previewHoverActive = previewState.phase === 'entering' || previewState.phase === 'visible';\n const hoveredIndex = previewHoverActive ? previewState.index : null;\n const selectTurn = React.useCallback(\n (turn: ThreadRailTurn) => {\n if (onSelect) {\n onSelect(turn);\n return;\n }\n\n messageScroller?.scrollToMessage(turn.messageId, { behavior: 'smooth', align: 'start' });\n },\n [messageScroller, onSelect],\n );\n\n const showPreview = (index: number, element: HTMLElement) => {\n const railTop = railRef.current?.getBoundingClientRect().top ?? 0;\n const itemRect = element.getBoundingClientRect();\n const nextTurn = turns[index];\n if (!nextTurn) return;\n\n setPreviewState(current => {\n const nextTop = itemRect.top + itemRect.height / 2 - railTop;\n if (current.index === index && current.phase !== 'hidden' && current.phase !== 'exiting') {\n return { ...current, top: nextTop };\n }\n\n const previousTurn =\n current.currentTurn && current.currentTurn.key !== nextTurn.key && current.phase !== 'hidden'\n ? current.currentTurn\n : undefined;\n\n return {\n currentTurn: nextTurn,\n previousTurn,\n index,\n phase: 'entering',\n top: nextTop,\n transitionKey: current.transitionKey + 1,\n };\n });\n };\n\n const hidePreview = () => {\n setPreviewState(current => {\n if (!current.currentTurn || current.phase === 'hidden' || current.phase === 'exiting') {\n return { ...current, index: null };\n }\n\n return {\n ...current,\n index: null,\n previousTurn: undefined,\n phase: 'exiting',\n transitionKey: current.transitionKey + 1,\n };\n });\n };\n\n React.useEffect(() => {\n if (previewState.phase !== 'entering') return;\n\n const requestFrame = window.requestAnimationFrame ?? window.setTimeout;\n const cancelFrame = window.cancelAnimationFrame ?? window.clearTimeout;\n let settleFrame: number | undefined;\n const startFrame = requestFrame(() => {\n settleFrame = requestFrame(() => {\n setPreviewState(current =>\n current.transitionKey === previewState.transitionKey && current.phase === 'entering'\n ? { ...current, phase: 'visible' }\n : current,\n );\n });\n });\n\n return () => {\n cancelFrame(startFrame);\n if (settleFrame !== undefined) cancelFrame(settleFrame);\n };\n }, [previewState.phase, previewState.transitionKey]);\n\n React.useEffect(() => {\n if (previewState.phase !== 'visible' || !previewState.previousTurn) return;\n\n const timeout = window.setTimeout(() => {\n setPreviewState(current =>\n current.transitionKey === previewState.transitionKey ? { ...current, previousTurn: undefined } : current,\n );\n }, PREVIEW_CLEANUP_DELAY_MS);\n\n return () => window.clearTimeout(timeout);\n }, [previewState.phase, previewState.previousTurn, previewState.transitionKey]);\n\n React.useEffect(() => {\n if (previewState.phase !== 'exiting') return;\n\n const timeout = window.setTimeout(() => {\n setPreviewState(current =>\n current.transitionKey === previewState.transitionKey ? DEFAULT_PREVIEW_STATE : current,\n );\n }, PREVIEW_CLEANUP_DELAY_MS);\n\n return () => window.clearTimeout(timeout);\n }, [previewState.phase, previewState.transitionKey]);\n\n if (turns.length === 0) return null;\n\n return (\n <nav\n ref={railRef}\n aria-label={label}\n data-testid=\"thread-rail\"\n className={cn('relative w-8 py-2', className)}\n onMouseLeave={hidePreview}\n onBlur={event => {\n const nextFocus = event.relatedTarget;\n if (!(nextFocus instanceof Node) || !event.currentTarget.contains(nextFocus)) hidePreview();\n }}\n >\n <ScrollArea\n data-testid=\"thread-rail-scroll-area\"\n maxHeight={maxHeight}\n className={cn('w-8', scrollAreaClassName)}\n viewPortClassName=\"pr-3\"\n >\n <div className=\"flex w-4 flex-col items-start gap-2 py-2\">\n {turns.map((turn, index) => {\n const distance = hoveredIndex === null ? null : Math.abs(index - hoveredIndex);\n const active = turn.messageId === activeMessageId;\n const inView = visibleMessageIdSet.has(turn.messageId);\n const previewActive = hoveredIndex === index;\n\n return (\n <ThreadRailItem\n key={turn.key}\n turn={turn}\n index={index}\n distance={distance}\n active={active}\n inView={inView}\n previewId={previewActive ? previewId : undefined}\n onHoverChange={showPreview}\n onSelect={selectTurn}\n />\n );\n })}\n </div>\n </ScrollArea>\n\n {previewState.currentTurn && (\n <ThreadRailPreview\n id={previewId}\n currentTurn={previewState.currentTurn}\n previousTurn={previewState.previousTurn}\n phase={previewState.phase}\n top={previewState.top}\n />\n )}\n </nav>\n );\n}\n\ninterface ThreadRailItemProps {\n turn: ThreadRailTurn;\n index: number;\n distance: number | null;\n active: boolean;\n inView: boolean;\n previewId?: string;\n onHoverChange: (index: number, element: HTMLElement) => void;\n onSelect: (turn: ThreadRailTurn) => void;\n}\n\n/** Width of a rail tick: widest at the hovered item, tapering to neighbours. */\nconst getRailItemWidth = (distance: number | null): string => {\n if (distance === 0) return 'w-4';\n if (distance === 1) return 'w-3';\n return 'w-2';\n};\n\n/** Background tone of a rail tick, prioritising hovered/active, then in-view, then proximity. */\nconst getRailItemTone = ({\n distance,\n active,\n inView,\n}: Pick<ThreadRailItemProps, 'distance' | 'active' | 'inView'>): string => {\n if (distance === 0 || active) return 'bg-neutral6';\n if (inView) return 'bg-neutral5';\n if (distance === 1) return 'bg-neutral4';\n return 'bg-neutral3/60';\n};\n\nfunction ThreadRailItem({\n turn,\n index,\n distance,\n active,\n inView,\n previewId,\n onHoverChange,\n onSelect,\n}: ThreadRailItemProps) {\n const size = getRailItemWidth(distance);\n const tone = getRailItemTone({ distance, active, inView });\n\n return (\n <div\n data-in-view={inView ? 'true' : undefined}\n data-active={active ? 'true' : undefined}\n className=\"group/thread-rail-item relative flex items-center\"\n >\n <button\n type=\"button\"\n aria-label={`Jump to ${turn.prompt}`}\n aria-current={active ? 'location' : undefined}\n aria-describedby={previewId}\n data-in-view={inView ? 'true' : undefined}\n data-active={active ? 'true' : undefined}\n onClick={() => onSelect(turn)}\n onMouseEnter={event => onHoverChange(index, event.currentTarget)}\n onFocus={event => onHoverChange(index, event.currentTarget)}\n className={cn(\n 'duration-normal relative block h-px cursor-pointer rounded-full transition-[width,background-color] ease-out',\n \"before:absolute before:inset-x-0 before:-inset-y-1 before:content-['']\",\n 'focus-visible:ring-2 focus-visible:ring-accent1/40 focus-visible:outline-hidden',\n size,\n tone,\n )}\n />\n </div>\n );\n}\n\nfunction ThreadRailPreview({\n id,\n currentTurn,\n previousTurn,\n phase,\n top,\n}: {\n id: string;\n currentTurn: ThreadRailTurn;\n previousTurn: ThreadRailTurn | undefined;\n phase: ThreadRailPreviewPhase;\n top: number;\n}) {\n const {\n ref: previewSizerRef,\n heightStyle: previewHeightStyle,\n measure: measurePreviewHeight,\n } = useMeasuredAutoHeight<HTMLDivElement>();\n const containerVisible = phase === 'visible' || (phase === 'entering' && Boolean(previousTurn));\n // Entering and exiting share the same off-screen resting style.\n const hiddenLayerClassName = 'scale-95 opacity-0 blur-xs';\n const visibleLayerClassName = 'scale-100 opacity-100 blur-none';\n const layerClassName =\n 'absolute inset-x-0 top-0 h-full origin-left transition-[opacity,filter,scale] duration-150 ease-in-out will-change-[opacity,filter,scale] motion-reduce:scale-100 motion-reduce:blur-none motion-reduce:transition-none';\n\n React.useLayoutEffect(() => {\n measurePreviewHeight();\n }, [currentTurn.key, phase, measurePreviewHeight]);\n\n return (\n <div\n id={id}\n data-testid=\"thread-rail-preview\"\n data-visible={containerVisible ? 'true' : undefined}\n className={cn(\n 'pointer-events-none absolute top-0 left-full z-30 ml-3 w-72 overflow-hidden rounded-xl border border-border1 bg-surface3 text-left shadow-dialog transition-[height,translate,opacity] duration-360 ease-out-custom will-change-[height,translate,opacity] motion-reduce:transition-none',\n containerVisible ? 'opacity-100' : 'opacity-0',\n )}\n style={{ ...previewHeightStyle, translate: `0 calc(${top}px - 50%)` }}\n >\n <div ref={previewSizerRef} data-testid=\"thread-rail-preview-sizer\" aria-hidden className=\"invisible grid\">\n <ThreadRailPreviewContent turn={currentTurn} className=\"col-start-1 row-start-1 p-3.5\" />\n </div>\n <div data-testid=\"thread-rail-preview-viewport\" className=\"absolute inset-0\">\n <div className=\"relative h-full\">\n {previousTurn && (\n <div\n key={previousTurn.key}\n data-testid=\"thread-rail-preview-previous\"\n aria-hidden\n className={cn(layerClassName, phase === 'entering' ? visibleLayerClassName : hiddenLayerClassName)}\n >\n <ThreadRailPreviewContent turn={previousTurn} className=\"p-3.5\" />\n </div>\n )}\n <div\n key={currentTurn.key}\n data-testid=\"thread-rail-preview-current\"\n className={cn(layerClassName, phase === 'visible' ? visibleLayerClassName : hiddenLayerClassName)}\n >\n <ThreadRailPreviewContent turn={currentTurn} className=\"p-3.5\" />\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nfunction ThreadRailPreviewContent({\n turn,\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement> & { turn: ThreadRailTurn }) {\n return (\n <div className={className} {...props}>\n <div className=\"text-ui-md leading-ui-md text-neutral6 truncate font-medium\">{turn.prompt}</div>\n {turn.reply && <p className=\"text-ui-sm leading-ui-sm text-neutral4 mt-1.5 line-clamp-3\">{turn.reply}</p>}\n {(turn.files.length > 0 || turn.hiddenFileCount > 0) && (\n <div className=\"border-border1/60 mt-3 flex flex-wrap items-center gap-2 border-t pt-2.5\">\n {turn.files.map(file => (\n <span key={file} className=\"text-ui-sm text-neutral4 inline-flex max-w-44 items-center gap-1.5 truncate\">\n <FileText className=\"size-3.5 shrink-0 opacity-70\" aria-hidden />\n {file}\n </span>\n ))}\n {turn.hiddenFileCount > 0 && (\n <span className=\"text-ui-sm text-neutral4 font-medium\">+{turn.hiddenFileCount}</span>\n )}\n </div>\n )}\n </div>\n );\n}\n","import type { MastraDBMessage } from '@mastra/core/agent/message-list';\nimport { CLIENT_MESSAGE_ID_KEY } from '@mastra/react';\n\nconst SUMMARY_MAX_LENGTH = 120;\nconst FILE_PREVIEW_LIMIT = 2;\n\nexport interface ThreadRailTurn {\n key: string;\n messageId: string;\n prompt: string;\n reply?: string;\n files: string[];\n hiddenFileCount: number;\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\nexport const getClientMessageKey = (message: MastraDBMessage): string => {\n const metadata = message.content.metadata;\n const clientMessageId = isRecord(metadata) ? metadata[CLIENT_MESSAGE_ID_KEY] : undefined;\n return typeof clientMessageId === 'string' && clientMessageId.length > 0 ? clientMessageId : message.id;\n};\n\nconst normalizeSummary = (value: string, fallback: string): string => {\n const normalized = value.replace(/\\s+/g, ' ').trim();\n if (normalized.length === 0) return fallback;\n if (normalized.length <= SUMMARY_MAX_LENGTH) return normalized;\n return `${normalized.slice(0, SUMMARY_MAX_LENGTH - 3).trimEnd()}...`;\n};\n\nconst getTextFromParts = (message: MastraDBMessage): string =>\n message.content.parts\n .flatMap(part => {\n if (!isRecord(part) || part.type !== 'text' || typeof part.text !== 'string') return [];\n return [part.text];\n })\n .join('\\n');\n\nconst getStringField = (part: Record<string, unknown>, keys: string[]): string | undefined => {\n for (const key of keys) {\n const value = part[key];\n if (typeof value === 'string' && value.trim().length > 0) return value;\n }\n return undefined;\n};\n\nconst getPathLabel = (value: string): string | undefined => {\n if (value.startsWith('data:')) return undefined;\n\n try {\n const url = new URL(value);\n const candidate = url.pathname.split('/').filter(Boolean).pop();\n return candidate || url.hostname || undefined;\n } catch {\n const candidate = value.split(/[?#]/)[0]?.split('/').filter(Boolean).pop();\n return candidate && !candidate.startsWith('data:') ? candidate : undefined;\n }\n};\n\nconst getFallbackFileLabel = (part: Record<string, unknown>): string => {\n const mediaType = getStringField(part, ['mimeType', 'mediaType']) ?? '';\n if (part.type === 'image' || mediaType.startsWith('image/')) return 'Image';\n if (mediaType === 'application/pdf') return 'PDF';\n if (mediaType.startsWith('video/')) return 'Video';\n if (mediaType.startsWith('audio/')) return 'Audio';\n return 'File';\n};\n\nconst getFileLabelFromPart = (part: MastraDBMessage['content']['parts'][number]): string | undefined => {\n if (!isRecord(part)) return undefined;\n\n const type = getStringField(part, ['type']);\n if (type !== 'file' && type !== 'image') return undefined;\n\n const explicitLabel = getStringField(part, ['filename', 'name']);\n if (explicitLabel) return explicitLabel;\n\n const source = getStringField(part, ['url', 'image', 'data']);\n const pathLabel = source ? getPathLabel(source) : undefined;\n return pathLabel ?? getFallbackFileLabel(part);\n};\n\nconst getFileLabels = (message: MastraDBMessage): string[] =>\n message.content.parts.map(getFileLabelFromPart).filter((label): label is string => Boolean(label));\n\nconst getSignalType = (message: MastraDBMessage): string | undefined => {\n const signal = message.content.metadata?.signal;\n const metadataType = isRecord(signal) ? signal.type : undefined;\n return typeof metadataType === 'string' ? metadataType : message.type;\n};\n\nconst isDisplayableUserMessage = (message: MastraDBMessage): boolean => {\n if (message.role === 'user') return true;\n if (message.role !== 'signal') return false;\n\n const signalType = getSignalType(message);\n return signalType === 'user' || signalType === 'user-message';\n};\n\nconst getNextAssistantReply = (messages: MastraDBMessage[], startIndex: number): string | undefined => {\n for (let index = startIndex + 1; index < messages.length; index += 1) {\n const message = messages[index];\n if (!message) continue;\n if (isDisplayableUserMessage(message)) return undefined;\n if (message.role !== 'assistant') continue;\n\n const reply = normalizeSummary(getTextFromParts(message), '');\n if (reply) return reply;\n }\n\n return undefined;\n};\n\nexport const buildThreadRailTurns = (messages: MastraDBMessage[]): ThreadRailTurn[] =>\n messages.flatMap((message, index) => {\n if (!isDisplayableUserMessage(message)) return [];\n\n const files = getFileLabels(message);\n const visibleFiles = files.slice(0, FILE_PREVIEW_LIMIT);\n\n return [\n {\n key: getClientMessageKey(message),\n messageId: message.id,\n prompt: normalizeSummary(getTextFromParts(message), files.length > 0 ? 'Attached file' : 'User message'),\n reply: getNextAssistantReply(messages, index),\n files: visibleFiles,\n hiddenFileCount: files.length - visibleFiles.length,\n },\n ];\n });\n"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { T as Tooltip, a as TooltipContent, b as TooltipProvider, c as TooltipTrigger } from '../tooltip-
|
|
1
|
+
export { T as Tooltip, a as TooltipContent, b as TooltipProvider, c as TooltipTrigger } from '../tooltip-BFbYhBj1.js';
|
|
2
2
|
//# sourceMappingURL=Tooltip.es.js.map
|
|
@@ -195,7 +195,7 @@ const TreeFolderTrigger = React__namespace.forwardRef(
|
|
|
195
195
|
focusFolderItem(e.currentTarget, { focus: false });
|
|
196
196
|
},
|
|
197
197
|
children: [
|
|
198
|
-
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRight, { "aria-hidden": "true", className: "size-3 shrink-0
|
|
198
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRight, { "aria-hidden": "true", className: "text-neutral3 size-3 shrink-0" }),
|
|
199
199
|
children
|
|
200
200
|
]
|
|
201
201
|
}
|
|
@@ -278,7 +278,7 @@ const TreeInput = React__namespace.forwardRef(
|
|
|
278
278
|
onKeyDown: handleKeyDown,
|
|
279
279
|
onBlur: handleBlur,
|
|
280
280
|
onFocus: handleFocus,
|
|
281
|
-
className: "min-w-0 flex-1 border-none bg-transparent text-xs
|
|
281
|
+
className: "text-neutral5 placeholder:text-neutral3 min-w-0 flex-1 border-none bg-transparent text-xs outline-hidden"
|
|
282
282
|
}
|
|
283
283
|
)
|
|
284
284
|
]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tree.cjs.js","sources":["../../src/ds/components/Tree/tree-context.tsx","../../src/ds/components/Tree/tree-file.tsx","../../src/ds/components/Tree/tree-folder.tsx","../../src/ds/components/Tree/tree-folder-content.tsx","../../src/ds/components/Tree/tree-folder-trigger.tsx","../../src/ds/components/Tree/tree-icon.tsx","../../src/ds/components/Tree/tree-input.tsx","../../src/ds/components/Tree/tree-label.tsx","../../src/ds/components/Tree/tree-root.tsx","../../src/ds/components/Tree/tree.tsx"],"sourcesContent":["import * as React from 'react';\n\nexport interface TreeContextValue {\n selectedId?: string;\n onSelect?: (id: string) => void;\n focusItem?: (item: HTMLElement, options?: { focus?: boolean }) => void;\n}\n\nconst TreeContext = React.createContext<TreeContextValue | null>(null);\n\nexport function TreeProvider({ children, value }: { children: React.ReactNode; value: TreeContextValue }) {\n return <TreeContext.Provider value={value}>{children}</TreeContext.Provider>;\n}\n\nexport function useTreeContext(): TreeContextValue | null {\n return React.useContext(TreeContext);\n}\n\nexport interface TreeFolderContextValue {\n isFocused: boolean;\n}\n\nconst TreeFolderContext = React.createContext<TreeFolderContextValue | null>(null);\n\nexport function TreeFolderProvider({ children, value }: { children: React.ReactNode; value: TreeFolderContextValue }) {\n return <TreeFolderContext.Provider value={value}>{children}</TreeFolderContext.Provider>;\n}\n\nexport function useTreeFolderContext(): TreeFolderContextValue | null {\n return React.useContext(TreeFolderContext);\n}\n\nconst TreeDepthContext = React.createContext<number>(0);\n\nexport function TreeDepthProvider({ children, depth }: { children: React.ReactNode; depth: number }) {\n return <TreeDepthContext.Provider value={depth}>{children}</TreeDepthContext.Provider>;\n}\n\nexport function useTreeDepth(): number {\n return React.useContext(TreeDepthContext);\n}\n","import * as React from 'react';\nimport { useTreeContext, useTreeDepth } from './tree-context';\nimport { transitions } from '@/ds/primitives/transitions';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeFileProps {\n id?: string;\n className?: string;\n children: React.ReactNode;\n}\n\nexport const TreeFile = React.forwardRef<HTMLLIElement, TreeFileProps>(({ id, className, children }, ref) => {\n const treeCtx = useTreeContext();\n const depth = useTreeDepth();\n const isSelected = id != null && treeCtx?.selectedId === id;\n\n const handleClick = (e: React.MouseEvent<HTMLLIElement>) => {\n treeCtx?.focusItem?.(e.currentTarget);\n if (id != null && treeCtx?.onSelect) {\n treeCtx.onSelect(id);\n }\n };\n\n const handleFocus = (e: React.FocusEvent<HTMLLIElement>) => {\n treeCtx?.focusItem?.(e.currentTarget, { focus: false });\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if ((e.key === 'Enter' || e.key === ' ') && id != null && treeCtx?.onSelect) {\n e.preventDefault();\n treeCtx.onSelect(id);\n }\n };\n\n return (\n <li\n ref={ref}\n role=\"treeitem\"\n aria-level={depth + 1}\n aria-selected={isSelected || undefined}\n data-tree-item-kind=\"file\"\n data-tree-item-id={id}\n tabIndex={-1}\n className={cn(\n 'group flex h-7 min-w-0 cursor-pointer items-center gap-1.5 rounded-sm px-1',\n transitions.colors,\n 'outline-hidden hover:bg-surface4 focus-visible:bg-surface4 focus-visible:text-neutral6 focus-visible:outline-hidden',\n isSelected && 'bg-surface4 text-neutral6',\n className,\n )}\n // +18 offsets past the chevron (size-3 = 12px) + flex gap (gap-1.5 = 6px) that folders have\n style={{ paddingLeft: depth * 12 + 18 }}\n onClick={handleClick}\n onFocus={handleFocus}\n onKeyDown={handleKeyDown}\n >\n {children}\n </li>\n );\n});\nTreeFile.displayName = 'Tree.File';\n","import * as React from 'react';\nimport { TreeFolderProvider, useTreeContext, useTreeDepth } from './tree-context';\nimport { Collapsible } from '@/ds/components/Collapsible';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeFolderProps {\n id?: string;\n defaultOpen?: boolean;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n className?: string;\n children: React.ReactNode;\n}\n\nexport const TreeFolder = React.forwardRef<HTMLLIElement, TreeFolderProps>(\n ({ id, defaultOpen, open, onOpenChange, className, children }, ref) => {\n const treeCtx = useTreeContext();\n const depth = useTreeDepth();\n const [internalOpen, setInternalOpen] = React.useState(defaultOpen ?? false);\n const [isFocused, setIsFocused] = React.useState(false);\n const isOpen = open ?? internalOpen;\n\n const handleOpenChange = React.useCallback(\n (nextOpen: boolean) => {\n setInternalOpen(nextOpen);\n onOpenChange?.(nextOpen);\n },\n [onOpenChange],\n );\n\n const handleFocus = React.useCallback(\n (e: React.FocusEvent<HTMLLIElement>) => {\n if (e.target !== e.currentTarget) {\n setIsFocused(false);\n return;\n }\n\n setIsFocused(true);\n treeCtx?.focusItem?.(e.currentTarget, { focus: false });\n },\n [treeCtx],\n );\n\n const handleBlur = React.useCallback(() => {\n setIsFocused(false);\n }, []);\n\n const folderContextValue = React.useMemo(() => ({ isFocused }), [isFocused]);\n\n return (\n <li\n ref={ref}\n role=\"treeitem\"\n aria-expanded={isOpen}\n aria-level={depth + 1}\n data-tree-item-kind=\"folder\"\n data-tree-item-id={id}\n tabIndex={-1}\n className={cn('flex flex-col outline-hidden', className)}\n onFocus={handleFocus}\n onBlur={handleBlur}\n >\n <TreeFolderProvider value={folderContextValue}>\n <Collapsible open={isOpen} onOpenChange={handleOpenChange}>\n {children}\n </Collapsible>\n </TreeFolderProvider>\n </li>\n );\n },\n);\nTreeFolder.displayName = 'Tree.Folder';\n","import * as React from 'react';\nimport { useTreeDepth, TreeDepthProvider } from './tree-context';\nimport { CollapsibleContent } from '@/ds/components/Collapsible';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeFolderContentProps {\n className?: string;\n children: React.ReactNode;\n}\n\nexport const TreeFolderContent = React.forwardRef<HTMLDivElement, TreeFolderContentProps>(\n ({ className, children }, ref) => {\n const depth = useTreeDepth();\n\n return (\n <CollapsibleContent ref={ref} className={cn(className)}>\n <TreeDepthProvider depth={depth + 1}>\n <ul role=\"group\" className=\"flex flex-col\">\n {children}\n </ul>\n </TreeDepthProvider>\n </CollapsibleContent>\n );\n },\n);\nTreeFolderContent.displayName = 'Tree.FolderContent';\n","import { ChevronRight } from 'lucide-react';\nimport * as React from 'react';\nimport { useTreeContext, useTreeDepth, useTreeFolderContext } from './tree-context';\nimport { CollapsibleTrigger } from '@/ds/components/Collapsible';\nimport { transitions } from '@/ds/primitives/transitions';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeFolderTriggerProps {\n className?: string;\n children: React.ReactNode;\n actions?: React.ReactNode;\n}\n\nexport const TreeFolderTrigger = React.forwardRef<HTMLDivElement, TreeFolderTriggerProps>(\n ({ className, children, actions }, ref) => {\n const treeCtx = useTreeContext();\n const folderCtx = useTreeFolderContext();\n const depth = useTreeDepth();\n\n const focusFolderItem = React.useCallback(\n (target: HTMLElement, options?: { focus?: boolean }) => {\n const item = target.closest<HTMLElement>('[data-tree-item-kind=\"folder\"]');\n if (item) {\n treeCtx?.focusItem?.(item, options);\n }\n },\n [treeCtx],\n );\n\n return (\n <div\n ref={ref}\n data-tree-folder-row=\"true\"\n className={cn(\n 'group flex h-7 w-full min-w-0 items-center rounded-sm hover:bg-surface4',\n transitions.colors,\n folderCtx?.isFocused && 'bg-surface4 text-neutral6',\n className,\n )}\n >\n <CollapsibleTrigger\n data-tree-folder-trigger=\"true\"\n tabIndex={-1}\n className=\"flex h-7 min-w-0 flex-1 cursor-pointer items-center gap-1.5 rounded-sm px-1 outline-hidden focus-visible:ring-0 focus-visible:outline-hidden\"\n style={{ paddingLeft: depth * 12 }}\n onMouseDown={e => {\n e.preventDefault();\n focusFolderItem(e.currentTarget);\n }}\n onFocus={e => {\n focusFolderItem(e.currentTarget, { focus: false });\n }}\n >\n <ChevronRight aria-hidden=\"true\" className=\"size-3 shrink-0 text-neutral3\" />\n {children}\n </CollapsibleTrigger>\n {actions && (\n <span className=\"shrink-0 pr-1\" onClick={e => e.stopPropagation()}>\n {actions}\n </span>\n )}\n </div>\n );\n },\n);\nTreeFolderTrigger.displayName = 'Tree.FolderTrigger';\n","import * as React from 'react';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeIconProps {\n className?: string;\n children: React.ReactNode;\n}\n\nexport const TreeIcon = React.forwardRef<HTMLSpanElement, TreeIconProps>(({ className, children }, ref) => (\n <span ref={ref} className={cn('flex shrink-0 items-center [&>svg]:size-3.5', className)}>\n {children}\n </span>\n));\nTreeIcon.displayName = 'Tree.Icon';\n","import { File, Folder } from 'lucide-react';\nimport * as React from 'react';\nimport { useTreeDepth } from './tree-context';\nimport { transitions } from '@/ds/primitives/transitions';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeInputProps {\n type: 'file' | 'folder';\n onSubmit: (name: string) => void;\n onCancel?: () => void;\n defaultValue?: string;\n placeholder?: string;\n autoFocus?: boolean;\n className?: string;\n}\n\nexport const TreeInput = React.forwardRef<HTMLLIElement, TreeInputProps>(\n ({ type, onSubmit, onCancel, defaultValue = '', placeholder, autoFocus = true, className }, ref) => {\n const depth = useTreeDepth();\n const inputRef = React.useRef<HTMLInputElement>(null);\n const submittedRef = React.useRef(false);\n\n const handleSubmit = React.useCallback(\n (value: string) => {\n if (submittedRef.current) return;\n const trimmed = value.trim();\n if (trimmed) {\n submittedRef.current = true;\n onSubmit(trimmed);\n } else {\n onCancel?.();\n }\n },\n [onSubmit, onCancel],\n );\n\n const handleKeyDown = React.useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n handleSubmit(e.currentTarget.value);\n } else if (e.key === 'Escape') {\n e.preventDefault();\n onCancel?.();\n }\n },\n [handleSubmit, onCancel],\n );\n\n const handleBlur = React.useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n handleSubmit(e.currentTarget.value);\n },\n [handleSubmit],\n );\n\n const handleFocus = React.useCallback((e: React.FocusEvent<HTMLInputElement>) => {\n e.currentTarget.select();\n }, []);\n\n const Icon = type === 'folder' ? Folder : File;\n\n return (\n <li\n ref={ref}\n role=\"treeitem\"\n aria-level={depth + 1}\n data-tree-item-kind=\"input\"\n className={cn(\n 'group flex h-7 min-w-0 items-center gap-1.5 rounded-sm px-1',\n transitions.colors,\n 'focus-within:bg-surface4 focus-within:text-neutral6 focus-within:outline-hidden',\n className,\n )}\n style={{ paddingLeft: depth * 12 + 18 }}\n >\n <span className=\"flex shrink-0 items-center [&>svg]:size-3.5\">\n <Icon className=\"text-neutral3\" />\n </span>\n <input\n ref={inputRef}\n type=\"text\"\n defaultValue={defaultValue}\n placeholder={placeholder}\n autoFocus={autoFocus}\n onKeyDown={handleKeyDown}\n onBlur={handleBlur}\n onFocus={handleFocus}\n className=\"min-w-0 flex-1 border-none bg-transparent text-xs text-neutral5 outline-hidden placeholder:text-neutral3\"\n />\n </li>\n );\n },\n);\nTreeInput.displayName = 'Tree.Input';\n","import * as React from 'react';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeLabelProps {\n className?: string;\n children: React.ReactNode;\n}\n\nexport const TreeLabel = React.forwardRef<HTMLSpanElement, TreeLabelProps>(({ className, children }, ref) => (\n <span ref={ref} className={cn('truncate text-neutral5', className)}>\n {children}\n </span>\n));\nTreeLabel.displayName = 'Tree.Label';\n","import * as React from 'react';\nimport { TreeProvider, TreeDepthProvider } from './tree-context';\nimport { useIsomorphicLayoutEffect } from '@/hooks/use-isomorphic-layout-effect';\nimport { cn } from '@/lib/utils';\n\nconst TREE_FOCUSABLE_ITEM_SELECTOR = '[data-tree-item-kind=\"folder\"], [data-tree-item-kind=\"file\"]';\nconst TREE_FOLDER_TRIGGER_SELECTOR = '[data-tree-folder-trigger=\"true\"]';\n\nexport interface TreeRootProps {\n selectedId?: string;\n onSelect?: (id: string) => void;\n className?: string;\n children: React.ReactNode;\n}\n\nfunction assignRef<T>(ref: React.ForwardedRef<T>, value: T | null) {\n if (typeof ref === 'function') {\n ref(value);\n } else if (ref) {\n ref.current = value;\n }\n}\n\nfunction getTreeItems(root: HTMLElement): HTMLElement[] {\n return Array.from(root.querySelectorAll<HTMLElement>(TREE_FOCUSABLE_ITEM_SELECTOR)).filter(\n item => item.getAttribute('role') === 'treeitem',\n );\n}\n\nfunction setTabStops(items: HTMLElement[], focusableItem: HTMLElement) {\n for (const item of items) {\n item.tabIndex = item === focusableItem ? 0 : -1;\n }\n}\n\nfunction syncTreeItemSetMetadata(root: HTMLElement) {\n const groups = [root, ...Array.from(root.querySelectorAll<HTMLElement>('[role=\"group\"]'))];\n\n for (const group of groups) {\n const items = Array.from(group.children).filter(\n (child): child is HTMLElement =>\n child instanceof HTMLElement &&\n child.getAttribute('role') === 'treeitem' &&\n child.hasAttribute('data-tree-item-kind'),\n );\n\n items.forEach((item, index) => {\n item.setAttribute('aria-posinset', String(index + 1));\n item.setAttribute('aria-setsize', String(items.length));\n });\n }\n}\n\nfunction findSelectedItem(items: HTMLElement[], selectedId: string | undefined): HTMLElement | null {\n if (!selectedId) return null;\n return items.find(item => item.dataset.treeItemId === selectedId) ?? null;\n}\n\nfunction getActiveTreeItem(root: HTMLElement, items: HTMLElement[]): HTMLElement | null {\n const activeElement = root.ownerDocument.activeElement;\n if (!(activeElement instanceof HTMLElement) || !root.contains(activeElement)) return null;\n\n const activeItem = activeElement.closest<HTMLElement>(TREE_FOCUSABLE_ITEM_SELECTOR);\n return activeItem && items.includes(activeItem) ? activeItem : null;\n}\n\nfunction getClosestTreeItem(root: HTMLElement, target: EventTarget | null): HTMLElement | null {\n if (!(target instanceof HTMLElement) || !root.contains(target)) return null;\n const item = target.closest<HTMLElement>(TREE_FOCUSABLE_ITEM_SELECTOR);\n return item?.getAttribute('role') === 'treeitem' ? item : null;\n}\n\nfunction focusTreeItem(root: HTMLElement, item: HTMLElement, options: { focus?: boolean } = {}) {\n const items = getTreeItems(root);\n if (!items.includes(item)) return;\n\n setTabStops(items, item);\n if (options.focus !== false) {\n item.focus();\n }\n}\n\nfunction syncTreeTabStops(root: HTMLElement, selectedId: string | undefined) {\n const items = getTreeItems(root);\n syncTreeItemSetMetadata(root);\n\n const firstItem = items[0];\n if (!firstItem) return;\n\n const activeItem = getActiveTreeItem(root, items);\n const selectedItem = findSelectedItem(items, selectedId);\n setTabStops(items, activeItem ?? selectedItem ?? firstItem);\n}\n\nfunction isEditableTarget(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) return false;\n if (target.dataset.treeFolderTrigger === 'true') return false;\n if (target.isContentEditable) return true;\n\n return !!target.closest('input, textarea, select, button, [contenteditable=\"true\"]');\n}\n\nfunction getFolderTrigger(item: HTMLElement): HTMLButtonElement | null {\n return item.querySelector<HTMLButtonElement>(TREE_FOLDER_TRIGGER_SELECTOR);\n}\n\nfunction getParentTreeItem(item: HTMLElement): HTMLElement | null {\n const parentGroup = item.parentElement?.closest('[role=\"group\"]');\n return parentGroup?.closest<HTMLElement>(TREE_FOCUSABLE_ITEM_SELECTOR) ?? null;\n}\n\nfunction activateTreeItem(item: HTMLElement) {\n const trigger = getFolderTrigger(item);\n if (trigger) {\n trigger.click();\n } else {\n item.click();\n }\n}\n\nexport const TreeRoot = React.forwardRef<HTMLUListElement, TreeRootProps>(\n ({ selectedId, onSelect, className, children }, ref) => {\n const rootRef = React.useRef<HTMLUListElement | null>(null);\n\n const handleRootRef = React.useCallback(\n (node: HTMLUListElement | null) => {\n rootRef.current = node;\n assignRef(ref, node);\n },\n [ref],\n );\n\n const focusItem = React.useCallback((item: HTMLElement, options?: { focus?: boolean }) => {\n const root = rootRef.current;\n if (!root) return;\n focusTreeItem(root, item, options);\n }, []);\n\n const handleKeyDown = React.useCallback((event: React.KeyboardEvent<HTMLUListElement>) => {\n if (event.defaultPrevented || isEditableTarget(event.target)) return;\n\n const root = rootRef.current;\n if (!root) return;\n\n const items = getTreeItems(root);\n const currentItem =\n getClosestTreeItem(root, event.target) ??\n getActiveTreeItem(root, items) ??\n items.find(item => item.tabIndex === 0);\n if (!currentItem) return;\n\n const currentIndex = items.indexOf(currentItem);\n if (currentIndex < 0) return;\n\n let nextItem: HTMLElement | null = null;\n let handled = true;\n\n switch (event.key) {\n case 'ArrowDown':\n nextItem = items[Math.min(currentIndex + 1, items.length - 1)] ?? null;\n break;\n case 'ArrowUp':\n nextItem = items[Math.max(currentIndex - 1, 0)] ?? null;\n break;\n case 'Home':\n nextItem = items[0] ?? null;\n break;\n case 'End':\n nextItem = items[items.length - 1] ?? null;\n break;\n case 'ArrowRight': {\n const trigger = getFolderTrigger(currentItem);\n if (trigger && currentItem.getAttribute('aria-expanded') !== 'true') {\n trigger.click();\n nextItem = currentItem;\n } else {\n nextItem = items[Math.min(currentIndex + 1, items.length - 1)] ?? null;\n }\n break;\n }\n case 'ArrowLeft': {\n const trigger = getFolderTrigger(currentItem);\n if (trigger && currentItem.getAttribute('aria-expanded') === 'true') {\n trigger.click();\n nextItem = currentItem;\n } else {\n nextItem = getParentTreeItem(currentItem);\n }\n break;\n }\n case 'Enter':\n case ' ':\n case 'Spacebar':\n activateTreeItem(currentItem);\n nextItem = currentItem;\n break;\n default:\n handled = false;\n }\n\n if (!handled) return;\n\n event.preventDefault();\n event.stopPropagation();\n\n if (nextItem) {\n focusTreeItem(root, nextItem);\n }\n }, []);\n\n useIsomorphicLayoutEffect(() => {\n const root = rootRef.current;\n if (!root) return;\n syncTreeTabStops(root, selectedId);\n }, [children, selectedId]);\n\n React.useEffect(() => {\n const root = rootRef.current;\n if (!root || typeof MutationObserver === 'undefined') return;\n\n const observer = new MutationObserver(() => {\n syncTreeTabStops(root, selectedId);\n });\n observer.observe(root, { childList: true, subtree: true });\n\n return () => {\n observer.disconnect();\n };\n }, [selectedId]);\n\n const contextValue = React.useMemo(() => ({ selectedId, onSelect, focusItem }), [selectedId, onSelect, focusItem]);\n\n return (\n <TreeProvider value={contextValue}>\n <TreeDepthProvider depth={0}>\n <ul\n ref={handleRootRef}\n role=\"tree\"\n className={cn('flex flex-col text-xs', className)}\n onKeyDown={handleKeyDown}\n >\n {children}\n </ul>\n </TreeDepthProvider>\n </TreeProvider>\n );\n },\n);\nTreeRoot.displayName = 'Tree';\n","import { TreeFile } from './tree-file';\nimport { TreeFolder } from './tree-folder';\nimport { TreeFolderContent } from './tree-folder-content';\nimport { TreeFolderTrigger } from './tree-folder-trigger';\nimport { TreeIcon } from './tree-icon';\nimport { TreeInput } from './tree-input';\nimport { TreeLabel } from './tree-label';\nimport { TreeRoot } from './tree-root';\n\nexport const Tree = Object.assign(TreeRoot, {\n Folder: TreeFolder,\n FolderTrigger: TreeFolderTrigger,\n FolderContent: TreeFolderContent,\n File: TreeFile,\n Icon: TreeIcon,\n Label: TreeLabel,\n Input: TreeInput,\n});\n"],"names":["React","jsx","cn","transitions","Collapsible","CollapsibleContent","jsxs","CollapsibleTrigger","ChevronRight","Folder","File","useIsomorphicLayoutEffect"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Tree.cjs.js","sources":["../../src/ds/components/Tree/tree-context.tsx","../../src/ds/components/Tree/tree-file.tsx","../../src/ds/components/Tree/tree-folder.tsx","../../src/ds/components/Tree/tree-folder-content.tsx","../../src/ds/components/Tree/tree-folder-trigger.tsx","../../src/ds/components/Tree/tree-icon.tsx","../../src/ds/components/Tree/tree-input.tsx","../../src/ds/components/Tree/tree-label.tsx","../../src/ds/components/Tree/tree-root.tsx","../../src/ds/components/Tree/tree.tsx"],"sourcesContent":["import * as React from 'react';\n\nexport interface TreeContextValue {\n selectedId?: string;\n onSelect?: (id: string) => void;\n focusItem?: (item: HTMLElement, options?: { focus?: boolean }) => void;\n}\n\nconst TreeContext = React.createContext<TreeContextValue | null>(null);\n\nexport function TreeProvider({ children, value }: { children: React.ReactNode; value: TreeContextValue }) {\n return <TreeContext.Provider value={value}>{children}</TreeContext.Provider>;\n}\n\nexport function useTreeContext(): TreeContextValue | null {\n return React.useContext(TreeContext);\n}\n\nexport interface TreeFolderContextValue {\n isFocused: boolean;\n}\n\nconst TreeFolderContext = React.createContext<TreeFolderContextValue | null>(null);\n\nexport function TreeFolderProvider({ children, value }: { children: React.ReactNode; value: TreeFolderContextValue }) {\n return <TreeFolderContext.Provider value={value}>{children}</TreeFolderContext.Provider>;\n}\n\nexport function useTreeFolderContext(): TreeFolderContextValue | null {\n return React.useContext(TreeFolderContext);\n}\n\nconst TreeDepthContext = React.createContext<number>(0);\n\nexport function TreeDepthProvider({ children, depth }: { children: React.ReactNode; depth: number }) {\n return <TreeDepthContext.Provider value={depth}>{children}</TreeDepthContext.Provider>;\n}\n\nexport function useTreeDepth(): number {\n return React.useContext(TreeDepthContext);\n}\n","import * as React from 'react';\nimport { useTreeContext, useTreeDepth } from './tree-context';\nimport { transitions } from '@/ds/primitives/transitions';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeFileProps {\n id?: string;\n className?: string;\n children: React.ReactNode;\n}\n\nexport const TreeFile = React.forwardRef<HTMLLIElement, TreeFileProps>(({ id, className, children }, ref) => {\n const treeCtx = useTreeContext();\n const depth = useTreeDepth();\n const isSelected = id != null && treeCtx?.selectedId === id;\n\n const handleClick = (e: React.MouseEvent<HTMLLIElement>) => {\n treeCtx?.focusItem?.(e.currentTarget);\n if (id != null && treeCtx?.onSelect) {\n treeCtx.onSelect(id);\n }\n };\n\n const handleFocus = (e: React.FocusEvent<HTMLLIElement>) => {\n treeCtx?.focusItem?.(e.currentTarget, { focus: false });\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if ((e.key === 'Enter' || e.key === ' ') && id != null && treeCtx?.onSelect) {\n e.preventDefault();\n treeCtx.onSelect(id);\n }\n };\n\n return (\n <li\n ref={ref}\n role=\"treeitem\"\n aria-level={depth + 1}\n aria-selected={isSelected || undefined}\n data-tree-item-kind=\"file\"\n data-tree-item-id={id}\n tabIndex={-1}\n className={cn(\n 'group flex h-7 min-w-0 cursor-pointer items-center gap-1.5 rounded-sm px-1',\n transitions.colors,\n 'outline-hidden hover:bg-surface4 focus-visible:bg-surface4 focus-visible:text-neutral6 focus-visible:outline-hidden',\n isSelected && 'bg-surface4 text-neutral6',\n className,\n )}\n // +18 offsets past the chevron (size-3 = 12px) + flex gap (gap-1.5 = 6px) that folders have\n style={{ paddingLeft: depth * 12 + 18 }}\n onClick={handleClick}\n onFocus={handleFocus}\n onKeyDown={handleKeyDown}\n >\n {children}\n </li>\n );\n});\nTreeFile.displayName = 'Tree.File';\n","import * as React from 'react';\nimport { TreeFolderProvider, useTreeContext, useTreeDepth } from './tree-context';\nimport { Collapsible } from '@/ds/components/Collapsible';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeFolderProps {\n id?: string;\n defaultOpen?: boolean;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n className?: string;\n children: React.ReactNode;\n}\n\nexport const TreeFolder = React.forwardRef<HTMLLIElement, TreeFolderProps>(\n ({ id, defaultOpen, open, onOpenChange, className, children }, ref) => {\n const treeCtx = useTreeContext();\n const depth = useTreeDepth();\n const [internalOpen, setInternalOpen] = React.useState(defaultOpen ?? false);\n const [isFocused, setIsFocused] = React.useState(false);\n const isOpen = open ?? internalOpen;\n\n const handleOpenChange = React.useCallback(\n (nextOpen: boolean) => {\n setInternalOpen(nextOpen);\n onOpenChange?.(nextOpen);\n },\n [onOpenChange],\n );\n\n const handleFocus = React.useCallback(\n (e: React.FocusEvent<HTMLLIElement>) => {\n if (e.target !== e.currentTarget) {\n setIsFocused(false);\n return;\n }\n\n setIsFocused(true);\n treeCtx?.focusItem?.(e.currentTarget, { focus: false });\n },\n [treeCtx],\n );\n\n const handleBlur = React.useCallback(() => {\n setIsFocused(false);\n }, []);\n\n const folderContextValue = React.useMemo(() => ({ isFocused }), [isFocused]);\n\n return (\n <li\n ref={ref}\n role=\"treeitem\"\n aria-expanded={isOpen}\n aria-level={depth + 1}\n data-tree-item-kind=\"folder\"\n data-tree-item-id={id}\n tabIndex={-1}\n className={cn('flex flex-col outline-hidden', className)}\n onFocus={handleFocus}\n onBlur={handleBlur}\n >\n <TreeFolderProvider value={folderContextValue}>\n <Collapsible open={isOpen} onOpenChange={handleOpenChange}>\n {children}\n </Collapsible>\n </TreeFolderProvider>\n </li>\n );\n },\n);\nTreeFolder.displayName = 'Tree.Folder';\n","import * as React from 'react';\nimport { useTreeDepth, TreeDepthProvider } from './tree-context';\nimport { CollapsibleContent } from '@/ds/components/Collapsible';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeFolderContentProps {\n className?: string;\n children: React.ReactNode;\n}\n\nexport const TreeFolderContent = React.forwardRef<HTMLDivElement, TreeFolderContentProps>(\n ({ className, children }, ref) => {\n const depth = useTreeDepth();\n\n return (\n <CollapsibleContent ref={ref} className={cn(className)}>\n <TreeDepthProvider depth={depth + 1}>\n <ul role=\"group\" className=\"flex flex-col\">\n {children}\n </ul>\n </TreeDepthProvider>\n </CollapsibleContent>\n );\n },\n);\nTreeFolderContent.displayName = 'Tree.FolderContent';\n","import { ChevronRight } from 'lucide-react';\nimport * as React from 'react';\nimport { useTreeContext, useTreeDepth, useTreeFolderContext } from './tree-context';\nimport { CollapsibleTrigger } from '@/ds/components/Collapsible';\nimport { transitions } from '@/ds/primitives/transitions';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeFolderTriggerProps {\n className?: string;\n children: React.ReactNode;\n actions?: React.ReactNode;\n}\n\nexport const TreeFolderTrigger = React.forwardRef<HTMLDivElement, TreeFolderTriggerProps>(\n ({ className, children, actions }, ref) => {\n const treeCtx = useTreeContext();\n const folderCtx = useTreeFolderContext();\n const depth = useTreeDepth();\n\n const focusFolderItem = React.useCallback(\n (target: HTMLElement, options?: { focus?: boolean }) => {\n const item = target.closest<HTMLElement>('[data-tree-item-kind=\"folder\"]');\n if (item) {\n treeCtx?.focusItem?.(item, options);\n }\n },\n [treeCtx],\n );\n\n return (\n <div\n ref={ref}\n data-tree-folder-row=\"true\"\n className={cn(\n 'group flex h-7 w-full min-w-0 items-center rounded-sm hover:bg-surface4',\n transitions.colors,\n folderCtx?.isFocused && 'bg-surface4 text-neutral6',\n className,\n )}\n >\n <CollapsibleTrigger\n data-tree-folder-trigger=\"true\"\n tabIndex={-1}\n className=\"flex h-7 min-w-0 flex-1 cursor-pointer items-center gap-1.5 rounded-sm px-1 outline-hidden focus-visible:ring-0 focus-visible:outline-hidden\"\n style={{ paddingLeft: depth * 12 }}\n onMouseDown={e => {\n e.preventDefault();\n focusFolderItem(e.currentTarget);\n }}\n onFocus={e => {\n focusFolderItem(e.currentTarget, { focus: false });\n }}\n >\n <ChevronRight aria-hidden=\"true\" className=\"text-neutral3 size-3 shrink-0\" />\n {children}\n </CollapsibleTrigger>\n {actions && (\n <span className=\"shrink-0 pr-1\" onClick={e => e.stopPropagation()}>\n {actions}\n </span>\n )}\n </div>\n );\n },\n);\nTreeFolderTrigger.displayName = 'Tree.FolderTrigger';\n","import * as React from 'react';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeIconProps {\n className?: string;\n children: React.ReactNode;\n}\n\nexport const TreeIcon = React.forwardRef<HTMLSpanElement, TreeIconProps>(({ className, children }, ref) => (\n <span ref={ref} className={cn('flex shrink-0 items-center [&>svg]:size-3.5', className)}>\n {children}\n </span>\n));\nTreeIcon.displayName = 'Tree.Icon';\n","import { File, Folder } from 'lucide-react';\nimport * as React from 'react';\nimport { useTreeDepth } from './tree-context';\nimport { transitions } from '@/ds/primitives/transitions';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeInputProps {\n type: 'file' | 'folder';\n onSubmit: (name: string) => void;\n onCancel?: () => void;\n defaultValue?: string;\n placeholder?: string;\n autoFocus?: boolean;\n className?: string;\n}\n\nexport const TreeInput = React.forwardRef<HTMLLIElement, TreeInputProps>(\n ({ type, onSubmit, onCancel, defaultValue = '', placeholder, autoFocus = true, className }, ref) => {\n const depth = useTreeDepth();\n const inputRef = React.useRef<HTMLInputElement>(null);\n const submittedRef = React.useRef(false);\n\n const handleSubmit = React.useCallback(\n (value: string) => {\n if (submittedRef.current) return;\n const trimmed = value.trim();\n if (trimmed) {\n submittedRef.current = true;\n onSubmit(trimmed);\n } else {\n onCancel?.();\n }\n },\n [onSubmit, onCancel],\n );\n\n const handleKeyDown = React.useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n handleSubmit(e.currentTarget.value);\n } else if (e.key === 'Escape') {\n e.preventDefault();\n onCancel?.();\n }\n },\n [handleSubmit, onCancel],\n );\n\n const handleBlur = React.useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n handleSubmit(e.currentTarget.value);\n },\n [handleSubmit],\n );\n\n const handleFocus = React.useCallback((e: React.FocusEvent<HTMLInputElement>) => {\n e.currentTarget.select();\n }, []);\n\n const Icon = type === 'folder' ? Folder : File;\n\n return (\n <li\n ref={ref}\n role=\"treeitem\"\n aria-level={depth + 1}\n data-tree-item-kind=\"input\"\n className={cn(\n 'group flex h-7 min-w-0 items-center gap-1.5 rounded-sm px-1',\n transitions.colors,\n 'focus-within:bg-surface4 focus-within:text-neutral6 focus-within:outline-hidden',\n className,\n )}\n style={{ paddingLeft: depth * 12 + 18 }}\n >\n <span className=\"flex shrink-0 items-center [&>svg]:size-3.5\">\n <Icon className=\"text-neutral3\" />\n </span>\n <input\n ref={inputRef}\n type=\"text\"\n defaultValue={defaultValue}\n placeholder={placeholder}\n autoFocus={autoFocus}\n onKeyDown={handleKeyDown}\n onBlur={handleBlur}\n onFocus={handleFocus}\n className=\"text-neutral5 placeholder:text-neutral3 min-w-0 flex-1 border-none bg-transparent text-xs outline-hidden\"\n />\n </li>\n );\n },\n);\nTreeInput.displayName = 'Tree.Input';\n","import * as React from 'react';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeLabelProps {\n className?: string;\n children: React.ReactNode;\n}\n\nexport const TreeLabel = React.forwardRef<HTMLSpanElement, TreeLabelProps>(({ className, children }, ref) => (\n <span ref={ref} className={cn('truncate text-neutral5', className)}>\n {children}\n </span>\n));\nTreeLabel.displayName = 'Tree.Label';\n","import * as React from 'react';\nimport { TreeProvider, TreeDepthProvider } from './tree-context';\nimport { useIsomorphicLayoutEffect } from '@/hooks/use-isomorphic-layout-effect';\nimport { cn } from '@/lib/utils';\n\nconst TREE_FOCUSABLE_ITEM_SELECTOR = '[data-tree-item-kind=\"folder\"], [data-tree-item-kind=\"file\"]';\nconst TREE_FOLDER_TRIGGER_SELECTOR = '[data-tree-folder-trigger=\"true\"]';\n\nexport interface TreeRootProps {\n selectedId?: string;\n onSelect?: (id: string) => void;\n className?: string;\n children: React.ReactNode;\n}\n\nfunction assignRef<T>(ref: React.ForwardedRef<T>, value: T | null) {\n if (typeof ref === 'function') {\n ref(value);\n } else if (ref) {\n ref.current = value;\n }\n}\n\nfunction getTreeItems(root: HTMLElement): HTMLElement[] {\n return Array.from(root.querySelectorAll<HTMLElement>(TREE_FOCUSABLE_ITEM_SELECTOR)).filter(\n item => item.getAttribute('role') === 'treeitem',\n );\n}\n\nfunction setTabStops(items: HTMLElement[], focusableItem: HTMLElement) {\n for (const item of items) {\n item.tabIndex = item === focusableItem ? 0 : -1;\n }\n}\n\nfunction syncTreeItemSetMetadata(root: HTMLElement) {\n const groups = [root, ...Array.from(root.querySelectorAll<HTMLElement>('[role=\"group\"]'))];\n\n for (const group of groups) {\n const items = Array.from(group.children).filter(\n (child): child is HTMLElement =>\n child instanceof HTMLElement &&\n child.getAttribute('role') === 'treeitem' &&\n child.hasAttribute('data-tree-item-kind'),\n );\n\n items.forEach((item, index) => {\n item.setAttribute('aria-posinset', String(index + 1));\n item.setAttribute('aria-setsize', String(items.length));\n });\n }\n}\n\nfunction findSelectedItem(items: HTMLElement[], selectedId: string | undefined): HTMLElement | null {\n if (!selectedId) return null;\n return items.find(item => item.dataset.treeItemId === selectedId) ?? null;\n}\n\nfunction getActiveTreeItem(root: HTMLElement, items: HTMLElement[]): HTMLElement | null {\n const activeElement = root.ownerDocument.activeElement;\n if (!(activeElement instanceof HTMLElement) || !root.contains(activeElement)) return null;\n\n const activeItem = activeElement.closest<HTMLElement>(TREE_FOCUSABLE_ITEM_SELECTOR);\n return activeItem && items.includes(activeItem) ? activeItem : null;\n}\n\nfunction getClosestTreeItem(root: HTMLElement, target: EventTarget | null): HTMLElement | null {\n if (!(target instanceof HTMLElement) || !root.contains(target)) return null;\n const item = target.closest<HTMLElement>(TREE_FOCUSABLE_ITEM_SELECTOR);\n return item?.getAttribute('role') === 'treeitem' ? item : null;\n}\n\nfunction focusTreeItem(root: HTMLElement, item: HTMLElement, options: { focus?: boolean } = {}) {\n const items = getTreeItems(root);\n if (!items.includes(item)) return;\n\n setTabStops(items, item);\n if (options.focus !== false) {\n item.focus();\n }\n}\n\nfunction syncTreeTabStops(root: HTMLElement, selectedId: string | undefined) {\n const items = getTreeItems(root);\n syncTreeItemSetMetadata(root);\n\n const firstItem = items[0];\n if (!firstItem) return;\n\n const activeItem = getActiveTreeItem(root, items);\n const selectedItem = findSelectedItem(items, selectedId);\n setTabStops(items, activeItem ?? selectedItem ?? firstItem);\n}\n\nfunction isEditableTarget(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) return false;\n if (target.dataset.treeFolderTrigger === 'true') return false;\n if (target.isContentEditable) return true;\n\n return !!target.closest('input, textarea, select, button, [contenteditable=\"true\"]');\n}\n\nfunction getFolderTrigger(item: HTMLElement): HTMLButtonElement | null {\n return item.querySelector<HTMLButtonElement>(TREE_FOLDER_TRIGGER_SELECTOR);\n}\n\nfunction getParentTreeItem(item: HTMLElement): HTMLElement | null {\n const parentGroup = item.parentElement?.closest('[role=\"group\"]');\n return parentGroup?.closest<HTMLElement>(TREE_FOCUSABLE_ITEM_SELECTOR) ?? null;\n}\n\nfunction activateTreeItem(item: HTMLElement) {\n const trigger = getFolderTrigger(item);\n if (trigger) {\n trigger.click();\n } else {\n item.click();\n }\n}\n\nexport const TreeRoot = React.forwardRef<HTMLUListElement, TreeRootProps>(\n ({ selectedId, onSelect, className, children }, ref) => {\n const rootRef = React.useRef<HTMLUListElement | null>(null);\n\n const handleRootRef = React.useCallback(\n (node: HTMLUListElement | null) => {\n rootRef.current = node;\n assignRef(ref, node);\n },\n [ref],\n );\n\n const focusItem = React.useCallback((item: HTMLElement, options?: { focus?: boolean }) => {\n const root = rootRef.current;\n if (!root) return;\n focusTreeItem(root, item, options);\n }, []);\n\n const handleKeyDown = React.useCallback((event: React.KeyboardEvent<HTMLUListElement>) => {\n if (event.defaultPrevented || isEditableTarget(event.target)) return;\n\n const root = rootRef.current;\n if (!root) return;\n\n const items = getTreeItems(root);\n const currentItem =\n getClosestTreeItem(root, event.target) ??\n getActiveTreeItem(root, items) ??\n items.find(item => item.tabIndex === 0);\n if (!currentItem) return;\n\n const currentIndex = items.indexOf(currentItem);\n if (currentIndex < 0) return;\n\n let nextItem: HTMLElement | null = null;\n let handled = true;\n\n switch (event.key) {\n case 'ArrowDown':\n nextItem = items[Math.min(currentIndex + 1, items.length - 1)] ?? null;\n break;\n case 'ArrowUp':\n nextItem = items[Math.max(currentIndex - 1, 0)] ?? null;\n break;\n case 'Home':\n nextItem = items[0] ?? null;\n break;\n case 'End':\n nextItem = items[items.length - 1] ?? null;\n break;\n case 'ArrowRight': {\n const trigger = getFolderTrigger(currentItem);\n if (trigger && currentItem.getAttribute('aria-expanded') !== 'true') {\n trigger.click();\n nextItem = currentItem;\n } else {\n nextItem = items[Math.min(currentIndex + 1, items.length - 1)] ?? null;\n }\n break;\n }\n case 'ArrowLeft': {\n const trigger = getFolderTrigger(currentItem);\n if (trigger && currentItem.getAttribute('aria-expanded') === 'true') {\n trigger.click();\n nextItem = currentItem;\n } else {\n nextItem = getParentTreeItem(currentItem);\n }\n break;\n }\n case 'Enter':\n case ' ':\n case 'Spacebar':\n activateTreeItem(currentItem);\n nextItem = currentItem;\n break;\n default:\n handled = false;\n }\n\n if (!handled) return;\n\n event.preventDefault();\n event.stopPropagation();\n\n if (nextItem) {\n focusTreeItem(root, nextItem);\n }\n }, []);\n\n useIsomorphicLayoutEffect(() => {\n const root = rootRef.current;\n if (!root) return;\n syncTreeTabStops(root, selectedId);\n }, [children, selectedId]);\n\n React.useEffect(() => {\n const root = rootRef.current;\n if (!root || typeof MutationObserver === 'undefined') return;\n\n const observer = new MutationObserver(() => {\n syncTreeTabStops(root, selectedId);\n });\n observer.observe(root, { childList: true, subtree: true });\n\n return () => {\n observer.disconnect();\n };\n }, [selectedId]);\n\n const contextValue = React.useMemo(() => ({ selectedId, onSelect, focusItem }), [selectedId, onSelect, focusItem]);\n\n return (\n <TreeProvider value={contextValue}>\n <TreeDepthProvider depth={0}>\n <ul\n ref={handleRootRef}\n role=\"tree\"\n className={cn('flex flex-col text-xs', className)}\n onKeyDown={handleKeyDown}\n >\n {children}\n </ul>\n </TreeDepthProvider>\n </TreeProvider>\n );\n },\n);\nTreeRoot.displayName = 'Tree';\n","import { TreeFile } from './tree-file';\nimport { TreeFolder } from './tree-folder';\nimport { TreeFolderContent } from './tree-folder-content';\nimport { TreeFolderTrigger } from './tree-folder-trigger';\nimport { TreeIcon } from './tree-icon';\nimport { TreeInput } from './tree-input';\nimport { TreeLabel } from './tree-label';\nimport { TreeRoot } from './tree-root';\n\nexport const Tree = Object.assign(TreeRoot, {\n Folder: TreeFolder,\n FolderTrigger: TreeFolderTrigger,\n FolderContent: TreeFolderContent,\n File: TreeFile,\n Icon: TreeIcon,\n Label: TreeLabel,\n Input: TreeInput,\n});\n"],"names":["React","jsx","cn","transitions","Collapsible","CollapsibleContent","jsxs","CollapsibleTrigger","ChevronRight","Folder","File","useIsomorphicLayoutEffect"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,MAAM,WAAA,GAAcA,gBAAA,CAAM,aAAA,CAAuC,IAAI,CAAA;AAE9D,SAAS,YAAA,CAAa,EAAE,QAAA,EAAU,KAAA,EAAM,EAA2D;AACxG,EAAA,uBAAOC,cAAA,CAAC,WAAA,CAAY,QAAA,EAAZ,EAAqB,OAAe,QAAA,EAAS,CAAA;AACvD;AAEO,SAAS,cAAA,GAA0C;AACxD,EAAA,OAAOD,gBAAA,CAAM,WAAW,WAAW,CAAA;AACrC;AAMA,MAAM,iBAAA,GAAoBA,gBAAA,CAAM,aAAA,CAA6C,IAAI,CAAA;AAE1E,SAAS,kBAAA,CAAmB,EAAE,QAAA,EAAU,KAAA,EAAM,EAAiE;AACpH,EAAA,uBAAOC,cAAA,CAAC,iBAAA,CAAkB,QAAA,EAAlB,EAA2B,OAAe,QAAA,EAAS,CAAA;AAC7D;AAEO,SAAS,oBAAA,GAAsD;AACpE,EAAA,OAAOD,gBAAA,CAAM,WAAW,iBAAiB,CAAA;AAC3C;AAEA,MAAM,gBAAA,GAAmBA,gBAAA,CAAM,aAAA,CAAsB,CAAC,CAAA;AAE/C,SAAS,iBAAA,CAAkB,EAAE,QAAA,EAAU,KAAA,EAAM,EAAiD;AACnG,EAAA,sCAAQ,gBAAA,CAAiB,QAAA,EAAjB,EAA0B,KAAA,EAAO,OAAQ,QAAA,EAAS,CAAA;AAC5D;AAEO,SAAS,YAAA,GAAuB;AACrC,EAAA,OAAOA,gBAAA,CAAM,WAAW,gBAAgB,CAAA;AAC1C;;AC7BO,MAAM,QAAA,GAAWA,iBAAM,UAAA,CAAyC,CAAC,EAAE,EAAA,EAAI,SAAA,EAAW,QAAA,EAAS,EAAG,GAAA,KAAQ;AAC3G,EAAA,MAAM,UAAU,cAAA,EAAe;AAC/B,EAAA,MAAM,QAAQ,YAAA,EAAa;AAC3B,EAAA,MAAM,UAAA,GAAa,EAAA,IAAM,IAAA,IAAQ,OAAA,EAAS,UAAA,KAAe,EAAA;AAEzD,EAAA,MAAM,WAAA,GAAc,CAAC,CAAA,KAAuC;AAC1D,IAAA,OAAA,EAAS,SAAA,GAAY,EAAE,aAAa,CAAA;AACpC,IAAA,IAAI,EAAA,IAAM,IAAA,IAAQ,OAAA,EAAS,QAAA,EAAU;AACnC,MAAA,OAAA,CAAQ,SAAS,EAAE,CAAA;AAAA,IACrB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,WAAA,GAAc,CAAC,CAAA,KAAuC;AAC1D,IAAA,OAAA,EAAS,YAAY,CAAA,CAAE,aAAA,EAAe,EAAE,KAAA,EAAO,OAAO,CAAA;AAAA,EACxD,CAAA;AAEA,EAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAA2B;AAChD,IAAA,IAAA,CAAK,CAAA,CAAE,QAAQ,OAAA,IAAW,CAAA,CAAE,QAAQ,GAAA,KAAQ,EAAA,IAAM,IAAA,IAAQ,OAAA,EAAS,QAAA,EAAU;AAC3E,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,OAAA,CAAQ,SAAS,EAAE,CAAA;AAAA,IACrB;AAAA,EACF,CAAA;AAEA,EAAA,uBACEC,cAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,IAAA,EAAK,UAAA;AAAA,MACL,cAAY,KAAA,GAAQ,CAAA;AAAA,MACpB,iBAAe,UAAA,IAAc,MAAA;AAAA,MAC7B,qBAAA,EAAoB,MAAA;AAAA,MACpB,mBAAA,EAAmB,EAAA;AAAA,MACnB,QAAA,EAAU,EAAA;AAAA,MACV,SAAA,EAAWC,WAAA;AAAA,QACT,4EAAA;AAAA,QACAC,kCAAA,CAAY,MAAA;AAAA,QACZ,qHAAA;AAAA,QACA,UAAA,IAAc,2BAAA;AAAA,QACd;AAAA,OACF;AAAA,MAEA,KAAA,EAAO,EAAE,WAAA,EAAa,KAAA,GAAQ,KAAK,EAAA,EAAG;AAAA,MACtC,OAAA,EAAS,WAAA;AAAA,MACT,OAAA,EAAS,WAAA;AAAA,MACT,SAAA,EAAW,aAAA;AAAA,MAEV;AAAA;AAAA,GACH;AAEJ,CAAC,CAAA;AACD,QAAA,CAAS,WAAA,GAAc,WAAA;;AC9ChB,MAAM,aAAaH,gBAAA,CAAM,UAAA;AAAA,EAC9B,CAAC,EAAE,EAAA,EAAI,WAAA,EAAa,MAAM,YAAA,EAAc,SAAA,EAAW,QAAA,EAAS,EAAG,GAAA,KAAQ;AACrE,IAAA,MAAM,UAAU,cAAA,EAAe;AAC/B,IAAA,MAAM,QAAQ,YAAA,EAAa;AAC3B,IAAA,MAAM,CAAC,YAAA,EAAc,eAAe,IAAIA,gBAAA,CAAM,QAAA,CAAS,eAAe,KAAK,CAAA;AAC3E,IAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,gBAAA,CAAM,SAAS,KAAK,CAAA;AACtD,IAAA,MAAM,SAAS,IAAA,IAAQ,YAAA;AAEvB,IAAA,MAAM,mBAAmBA,gBAAA,CAAM,WAAA;AAAA,MAC7B,CAAC,QAAA,KAAsB;AACrB,QAAA,eAAA,CAAgB,QAAQ,CAAA;AACxB,QAAA,YAAA,GAAe,QAAQ,CAAA;AAAA,MACzB,CAAA;AAAA,MACA,CAAC,YAAY;AAAA,KACf;AAEA,IAAA,MAAM,cAAcA,gBAAA,CAAM,WAAA;AAAA,MACxB,CAAC,CAAA,KAAuC;AACtC,QAAA,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,CAAE,aAAA,EAAe;AAChC,UAAA,YAAA,CAAa,KAAK,CAAA;AAClB,UAAA;AAAA,QACF;AAEA,QAAA,YAAA,CAAa,IAAI,CAAA;AACjB,QAAA,OAAA,EAAS,YAAY,CAAA,CAAE,aAAA,EAAe,EAAE,KAAA,EAAO,OAAO,CAAA;AAAA,MACxD,CAAA;AAAA,MACA,CAAC,OAAO;AAAA,KACV;AAEA,IAAA,MAAM,UAAA,GAAaA,gBAAA,CAAM,WAAA,CAAY,MAAM;AACzC,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB,CAAA,EAAG,EAAE,CAAA;AAEL,IAAA,MAAM,kBAAA,GAAqBA,iBAAM,OAAA,CAAQ,OAAO,EAAE,SAAA,EAAU,CAAA,EAAI,CAAC,SAAS,CAAC,CAAA;AAE3E,IAAA,uBACEC,cAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,IAAA,EAAK,UAAA;AAAA,QACL,eAAA,EAAe,MAAA;AAAA,QACf,cAAY,KAAA,GAAQ,CAAA;AAAA,QACpB,qBAAA,EAAoB,QAAA;AAAA,QACpB,mBAAA,EAAmB,EAAA;AAAA,QACnB,QAAA,EAAU,EAAA;AAAA,QACV,SAAA,EAAWC,WAAA,CAAG,8BAAA,EAAgC,SAAS,CAAA;AAAA,QACvD,OAAA,EAAS,WAAA;AAAA,QACT,MAAA,EAAQ,UAAA;AAAA,QAER,QAAA,kBAAAD,cAAA,CAAC,kBAAA,EAAA,EAAmB,KAAA,EAAO,kBAAA,EACzB,QAAA,kBAAAA,cAAA,CAACG,uBAAA,EAAA,EAAY,IAAA,EAAM,MAAA,EAAQ,YAAA,EAAc,gBAAA,EACtC,QAAA,EACH,CAAA,EACF;AAAA;AAAA,KACF;AAAA,EAEJ;AACF,CAAA;AACA,UAAA,CAAW,WAAA,GAAc,aAAA;;AC7DlB,MAAM,oBAAoBJ,gBAAA,CAAM,UAAA;AAAA,EACrC,CAAC,EAAE,SAAA,EAAW,QAAA,IAAY,GAAA,KAAQ;AAChC,IAAA,MAAM,QAAQ,YAAA,EAAa;AAE3B,IAAA,uBACEC,cAAA,CAACI,kCAAmB,GAAA,EAAU,SAAA,EAAWH,YAAG,SAAS,CAAA,EACnD,yCAAC,iBAAA,EAAA,EAAkB,KAAA,EAAO,QAAQ,CAAA,EAChC,QAAA,kBAAAD,cAAA,CAAC,QAAG,IAAA,EAAK,OAAA,EAAQ,WAAU,eAAA,EACxB,QAAA,EACH,GACF,CAAA,EACF,CAAA;AAAA,EAEJ;AACF,CAAA;AACA,iBAAA,CAAkB,WAAA,GAAc,oBAAA;;ACZzB,MAAM,oBAAoBD,gBAAA,CAAM,UAAA;AAAA,EACrC,CAAC,EAAE,SAAA,EAAW,QAAA,EAAU,OAAA,IAAW,GAAA,KAAQ;AACzC,IAAA,MAAM,UAAU,cAAA,EAAe;AAC/B,IAAA,MAAM,YAAY,oBAAA,EAAqB;AACvC,IAAA,MAAM,QAAQ,YAAA,EAAa;AAE3B,IAAA,MAAM,kBAAkBA,gBAAA,CAAM,WAAA;AAAA,MAC5B,CAAC,QAAqB,OAAA,KAAkC;AACtD,QAAA,MAAM,IAAA,GAAO,MAAA,CAAO,OAAA,CAAqB,gCAAgC,CAAA;AACzE,QAAA,IAAI,IAAA,EAAM;AACR,UAAA,OAAA,EAAS,SAAA,GAAY,MAAM,OAAO,CAAA;AAAA,QACpC;AAAA,MACF,CAAA;AAAA,MACA,CAAC,OAAO;AAAA,KACV;AAEA,IAAA,uBACEM,eAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,sBAAA,EAAqB,MAAA;AAAA,QACrB,SAAA,EAAWJ,WAAA;AAAA,UACT,yEAAA;AAAA,UACAC,kCAAA,CAAY,MAAA;AAAA,UACZ,WAAW,SAAA,IAAa,2BAAA;AAAA,UACxB;AAAA,SACF;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAAG,eAAA;AAAA,YAACC,8BAAA;AAAA,YAAA;AAAA,cACC,0BAAA,EAAyB,MAAA;AAAA,cACzB,QAAA,EAAU,EAAA;AAAA,cACV,SAAA,EAAU,8IAAA;AAAA,cACV,KAAA,EAAO,EAAE,WAAA,EAAa,KAAA,GAAQ,EAAA,EAAG;AAAA,cACjC,aAAa,CAAA,CAAA,KAAK;AAChB,gBAAA,CAAA,CAAE,cAAA,EAAe;AACjB,gBAAA,eAAA,CAAgB,EAAE,aAAa,CAAA;AAAA,cACjC,CAAA;AAAA,cACA,SAAS,CAAA,CAAA,KAAK;AACZ,gBAAA,eAAA,CAAgB,CAAA,CAAE,aAAA,EAAe,EAAE,KAAA,EAAO,OAAO,CAAA;AAAA,cACnD,CAAA;AAAA,cAEA,QAAA,EAAA;AAAA,gCAAAN,cAAA,CAACO,wBAAA,EAAA,EAAa,aAAA,EAAY,MAAA,EAAO,SAAA,EAAU,+BAAA,EAAgC,CAAA;AAAA,gBAC1E;AAAA;AAAA;AAAA,WACH;AAAA,UACC,OAAA,oBACCP,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,eAAA,EAAgB,SAAS,CAAA,CAAA,KAAK,CAAA,CAAE,eAAA,EAAgB,EAC7D,QAAA,EAAA,OAAA,EACH;AAAA;AAAA;AAAA,KAEJ;AAAA,EAEJ;AACF,CAAA;AACA,iBAAA,CAAkB,WAAA,GAAc,oBAAA;;ACzDzB,MAAM,WAAWD,gBAAA,CAAM,UAAA,CAA2C,CAAC,EAAE,SAAA,EAAW,UAAS,EAAG,GAAA,qBACjGC,cAAA,CAAC,MAAA,EAAA,EAAK,KAAU,SAAA,EAAWC,WAAA,CAAG,+CAA+C,SAAS,CAAA,EACnF,UACH,CACD,CAAA;AACD,QAAA,CAAS,WAAA,GAAc,WAAA;;ACGhB,MAAM,YAAYF,gBAAA,CAAM,UAAA;AAAA,EAC7B,CAAC,EAAE,IAAA,EAAM,QAAA,EAAU,QAAA,EAAU,YAAA,GAAe,EAAA,EAAI,WAAA,EAAa,SAAA,GAAY,IAAA,EAAM,SAAA,EAAU,EAAG,GAAA,KAAQ;AAClG,IAAA,MAAM,QAAQ,YAAA,EAAa;AAC3B,IAAA,MAAM,QAAA,GAAWA,gBAAA,CAAM,MAAA,CAAyB,IAAI,CAAA;AACpD,IAAA,MAAM,YAAA,GAAeA,gBAAA,CAAM,MAAA,CAAO,KAAK,CAAA;AAEvC,IAAA,MAAM,eAAeA,gBAAA,CAAM,WAAA;AAAA,MACzB,CAAC,KAAA,KAAkB;AACjB,QAAA,IAAI,aAAa,OAAA,EAAS;AAC1B,QAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAC3B,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,YAAA,CAAa,OAAA,GAAU,IAAA;AACvB,UAAA,QAAA,CAAS,OAAO,CAAA;AAAA,QAClB,CAAA,MAAO;AACL,UAAA,QAAA,IAAW;AAAA,QACb;AAAA,MACF,CAAA;AAAA,MACA,CAAC,UAAU,QAAQ;AAAA,KACrB;AAEA,IAAA,MAAM,gBAAgBA,gBAAA,CAAM,WAAA;AAAA,MAC1B,CAAC,CAAA,KAA6C;AAC5C,QAAA,IAAI,CAAA,CAAE,QAAQ,OAAA,EAAS;AACrB,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,YAAA,CAAa,CAAA,CAAE,cAAc,KAAK,CAAA;AAAA,QACpC,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,QAAA,EAAU;AAC7B,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,QAAA,IAAW;AAAA,QACb;AAAA,MACF,CAAA;AAAA,MACA,CAAC,cAAc,QAAQ;AAAA,KACzB;AAEA,IAAA,MAAM,aAAaA,gBAAA,CAAM,WAAA;AAAA,MACvB,CAAC,CAAA,KAA0C;AACzC,QAAA,YAAA,CAAa,CAAA,CAAE,cAAc,KAAK,CAAA;AAAA,MACpC,CAAA;AAAA,MACA,CAAC,YAAY;AAAA,KACf;AAEA,IAAA,MAAM,WAAA,GAAcA,gBAAA,CAAM,WAAA,CAAY,CAAC,CAAA,KAA0C;AAC/E,MAAA,CAAA,CAAE,cAAc,MAAA,EAAO;AAAA,IACzB,CAAA,EAAG,EAAE,CAAA;AAEL,IAAA,MAAM,IAAA,GAAO,IAAA,KAAS,QAAA,GAAWS,kBAAA,GAASC,gBAAA;AAE1C,IAAA,uBACEJ,eAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,IAAA,EAAK,UAAA;AAAA,QACL,cAAY,KAAA,GAAQ,CAAA;AAAA,QACpB,qBAAA,EAAoB,OAAA;AAAA,QACpB,SAAA,EAAWJ,WAAA;AAAA,UACT,6DAAA;AAAA,UACAC,kCAAA,CAAY,MAAA;AAAA,UACZ,iFAAA;AAAA,UACA;AAAA,SACF;AAAA,QACA,KAAA,EAAO,EAAE,WAAA,EAAa,KAAA,GAAQ,KAAK,EAAA,EAAG;AAAA,QAEtC,QAAA,EAAA;AAAA,0BAAAF,cAAA,CAAC,UAAK,SAAA,EAAU,6CAAA,EACd,yCAAC,IAAA,EAAA,EAAK,SAAA,EAAU,iBAAgB,CAAA,EAClC,CAAA;AAAA,0BACAA,cAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,GAAA,EAAK,QAAA;AAAA,cACL,IAAA,EAAK,MAAA;AAAA,cACL,YAAA;AAAA,cACA,WAAA;AAAA,cACA,SAAA;AAAA,cACA,SAAA,EAAW,aAAA;AAAA,cACX,MAAA,EAAQ,UAAA;AAAA,cACR,OAAA,EAAS,WAAA;AAAA,cACT,SAAA,EAAU;AAAA;AAAA;AACZ;AAAA;AAAA,KACF;AAAA,EAEJ;AACF,CAAA;AACA,SAAA,CAAU,WAAA,GAAc,YAAA;;ACtFjB,MAAM,YAAYD,gBAAA,CAAM,UAAA,CAA4C,CAAC,EAAE,SAAA,EAAW,UAAS,EAAG,GAAA,qBACnGC,cAAA,CAAC,MAAA,EAAA,EAAK,KAAU,SAAA,EAAWC,WAAA,CAAG,0BAA0B,SAAS,CAAA,EAC9D,UACH,CACD,CAAA;AACD,SAAA,CAAU,WAAA,GAAc,YAAA;;ACRxB,MAAM,4BAAA,GAA+B,8DAAA;AACrC,MAAM,4BAAA,GAA+B,mCAAA;AASrC,SAAS,SAAA,CAAa,KAA4B,KAAA,EAAiB;AACjE,EAAA,IAAI,OAAO,QAAQ,UAAA,EAAY;AAC7B,IAAA,GAAA,CAAI,KAAK,CAAA;AAAA,EACX,WAAW,GAAA,EAAK;AACd,IAAA,GAAA,CAAI,OAAA,GAAU,KAAA;AAAA,EAChB;AACF;AAEA,SAAS,aAAa,IAAA,EAAkC;AACtD,EAAA,OAAO,MAAM,IAAA,CAAK,IAAA,CAAK,gBAAA,CAA8B,4BAA4B,CAAC,CAAA,CAAE,MAAA;AAAA,IAClF,CAAA,IAAA,KAAQ,IAAA,CAAK,YAAA,CAAa,MAAM,CAAA,KAAM;AAAA,GACxC;AACF;AAEA,SAAS,WAAA,CAAY,OAAsB,aAAA,EAA4B;AACrE,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA,KAAS,aAAA,GAAgB,CAAA,GAAI,EAAA;AAAA,EAC/C;AACF;AAEA,SAAS,wBAAwB,IAAA,EAAmB;AAClD,EAAA,MAAM,MAAA,GAAS,CAAC,IAAA,EAAM,GAAG,KAAA,CAAM,KAAK,IAAA,CAAK,gBAAA,CAA8B,gBAAgB,CAAC,CAAC,CAAA;AAEzF,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA,CAAE,MAAA;AAAA,MACvC,CAAC,KAAA,KACC,KAAA,YAAiB,WAAA,IACjB,KAAA,CAAM,YAAA,CAAa,MAAM,CAAA,KAAM,UAAA,IAC/B,KAAA,CAAM,YAAA,CAAa,qBAAqB;AAAA,KAC5C;AAEA,IAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,EAAM,KAAA,KAAU;AAC7B,MAAA,IAAA,CAAK,YAAA,CAAa,eAAA,EAAiB,MAAA,CAAO,KAAA,GAAQ,CAAC,CAAC,CAAA;AACpD,MAAA,IAAA,CAAK,YAAA,CAAa,cAAA,EAAgB,MAAA,CAAO,KAAA,CAAM,MAAM,CAAC,CAAA;AAAA,IACxD,CAAC,CAAA;AAAA,EACH;AACF;AAEA,SAAS,gBAAA,CAAiB,OAAsB,UAAA,EAAoD;AAClG,EAAA,IAAI,CAAC,YAAY,OAAO,IAAA;AACxB,EAAA,OAAO,MAAM,IAAA,CAAK,CAAA,IAAA,KAAQ,KAAK,OAAA,CAAQ,UAAA,KAAe,UAAU,CAAA,IAAK,IAAA;AACvE;AAEA,SAAS,iBAAA,CAAkB,MAAmB,KAAA,EAA0C;AACtF,EAAA,MAAM,aAAA,GAAgB,KAAK,aAAA,CAAc,aAAA;AACzC,EAAA,IAAI,EAAE,yBAAyB,WAAA,CAAA,IAAgB,CAAC,KAAK,QAAA,CAAS,aAAa,GAAG,OAAO,IAAA;AAErF,EAAA,MAAM,UAAA,GAAa,aAAA,CAAc,OAAA,CAAqB,4BAA4B,CAAA;AAClF,EAAA,OAAO,UAAA,IAAc,KAAA,CAAM,QAAA,CAAS,UAAU,IAAI,UAAA,GAAa,IAAA;AACjE;AAEA,SAAS,kBAAA,CAAmB,MAAmB,MAAA,EAAgD;AAC7F,EAAA,IAAI,EAAE,kBAAkB,WAAA,CAAA,IAAgB,CAAC,KAAK,QAAA,CAAS,MAAM,GAAG,OAAO,IAAA;AACvE,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,OAAA,CAAqB,4BAA4B,CAAA;AACrE,EAAA,OAAO,IAAA,EAAM,YAAA,CAAa,MAAM,CAAA,KAAM,aAAa,IAAA,GAAO,IAAA;AAC5D;AAEA,SAAS,aAAA,CAAc,IAAA,EAAmB,IAAA,EAAmB,OAAA,GAA+B,EAAC,EAAG;AAC9F,EAAA,MAAM,KAAA,GAAQ,aAAa,IAAI,CAAA;AAC/B,EAAA,IAAI,CAAC,KAAA,CAAM,QAAA,CAAS,IAAI,CAAA,EAAG;AAE3B,EAAA,WAAA,CAAY,OAAO,IAAI,CAAA;AACvB,EAAA,IAAI,OAAA,CAAQ,UAAU,KAAA,EAAO;AAC3B,IAAA,IAAA,CAAK,KAAA,EAAM;AAAA,EACb;AACF;AAEA,SAAS,gBAAA,CAAiB,MAAmB,UAAA,EAAgC;AAC3E,EAAA,MAAM,KAAA,GAAQ,aAAa,IAAI,CAAA;AAC/B,EAAA,uBAAA,CAAwB,IAAI,CAAA;AAE5B,EAAA,MAAM,SAAA,GAAY,MAAM,CAAC,CAAA;AACzB,EAAA,IAAI,CAAC,SAAA,EAAW;AAEhB,EAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,IAAA,EAAM,KAAK,CAAA;AAChD,EAAA,MAAM,YAAA,GAAe,gBAAA,CAAiB,KAAA,EAAO,UAAU,CAAA;AACvD,EAAA,WAAA,CAAY,KAAA,EAAO,UAAA,IAAc,YAAA,IAAgB,SAAS,CAAA;AAC5D;AAEA,SAAS,iBAAiB,MAAA,EAAqC;AAC7D,EAAA,IAAI,EAAE,MAAA,YAAkB,WAAA,CAAA,EAAc,OAAO,KAAA;AAC7C,EAAA,IAAI,MAAA,CAAO,OAAA,CAAQ,iBAAA,KAAsB,MAAA,EAAQ,OAAO,KAAA;AACxD,EAAA,IAAI,MAAA,CAAO,mBAAmB,OAAO,IAAA;AAErC,EAAA,OAAO,CAAC,CAAC,MAAA,CAAO,OAAA,CAAQ,2DAA2D,CAAA;AACrF;AAEA,SAAS,iBAAiB,IAAA,EAA6C;AACrE,EAAA,OAAO,IAAA,CAAK,cAAiC,4BAA4B,CAAA;AAC3E;AAEA,SAAS,kBAAkB,IAAA,EAAuC;AAChE,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,aAAA,EAAe,OAAA,CAAQ,gBAAgB,CAAA;AAChE,EAAA,OAAO,WAAA,EAAa,OAAA,CAAqB,4BAA4B,CAAA,IAAK,IAAA;AAC5E;AAEA,SAAS,iBAAiB,IAAA,EAAmB;AAC3C,EAAA,MAAM,OAAA,GAAU,iBAAiB,IAAI,CAAA;AACrC,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAA,CAAQ,KAAA,EAAM;AAAA,EAChB,CAAA,MAAO;AACL,IAAA,IAAA,CAAK,KAAA,EAAM;AAAA,EACb;AACF;AAEO,MAAM,WAAWF,gBAAA,CAAM,UAAA;AAAA,EAC5B,CAAC,EAAE,UAAA,EAAY,UAAU,SAAA,EAAW,QAAA,IAAY,GAAA,KAAQ;AACtD,IAAA,MAAM,OAAA,GAAUA,gBAAA,CAAM,MAAA,CAAgC,IAAI,CAAA;AAE1D,IAAA,MAAM,gBAAgBA,gBAAA,CAAM,WAAA;AAAA,MAC1B,CAAC,IAAA,KAAkC;AACjC,QAAA,OAAA,CAAQ,OAAA,GAAU,IAAA;AAClB,QAAA,SAAA,CAAU,KAAK,IAAI,CAAA;AAAA,MACrB,CAAA;AAAA,MACA,CAAC,GAAG;AAAA,KACN;AAEA,IAAA,MAAM,SAAA,GAAYA,gBAAA,CAAM,WAAA,CAAY,CAAC,MAAmB,OAAA,KAAkC;AACxF,MAAA,MAAM,OAAO,OAAA,CAAQ,OAAA;AACrB,MAAA,IAAI,CAAC,IAAA,EAAM;AACX,MAAA,aAAA,CAAc,IAAA,EAAM,MAAM,OAAO,CAAA;AAAA,IACnC,CAAA,EAAG,EAAE,CAAA;AAEL,IAAA,MAAM,aAAA,GAAgBA,gBAAA,CAAM,WAAA,CAAY,CAAC,KAAA,KAAiD;AACxF,MAAA,IAAI,KAAA,CAAM,gBAAA,IAAoB,gBAAA,CAAiB,KAAA,CAAM,MAAM,CAAA,EAAG;AAE9D,MAAA,MAAM,OAAO,OAAA,CAAQ,OAAA;AACrB,MAAA,IAAI,CAAC,IAAA,EAAM;AAEX,MAAA,MAAM,KAAA,GAAQ,aAAa,IAAI,CAAA;AAC/B,MAAA,MAAM,WAAA,GACJ,kBAAA,CAAmB,IAAA,EAAM,KAAA,CAAM,MAAM,CAAA,IACrC,iBAAA,CAAkB,IAAA,EAAM,KAAK,KAC7B,KAAA,CAAM,IAAA,CAAK,CAAA,IAAA,KAAQ,IAAA,CAAK,aAAa,CAAC,CAAA;AACxC,MAAA,IAAI,CAAC,WAAA,EAAa;AAElB,MAAA,MAAM,YAAA,GAAe,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA;AAC9C,MAAA,IAAI,eAAe,CAAA,EAAG;AAEtB,MAAA,IAAI,QAAA,GAA+B,IAAA;AACnC,MAAA,IAAI,OAAA,GAAU,IAAA;AAEd,MAAA,QAAQ,MAAM,GAAA;AAAK,QACjB,KAAK,WAAA;AACH,UAAA,QAAA,GAAW,KAAA,CAAM,KAAK,GAAA,CAAI,YAAA,GAAe,GAAG,KAAA,CAAM,MAAA,GAAS,CAAC,CAAC,CAAA,IAAK,IAAA;AAClE,UAAA;AAAA,QACF,KAAK,SAAA;AACH,UAAA,QAAA,GAAW,MAAM,IAAA,CAAK,GAAA,CAAI,eAAe,CAAA,EAAG,CAAC,CAAC,CAAA,IAAK,IAAA;AACnD,UAAA;AAAA,QACF,KAAK,MAAA;AACH,UAAA,QAAA,GAAW,KAAA,CAAM,CAAC,CAAA,IAAK,IAAA;AACvB,UAAA;AAAA,QACF,KAAK,KAAA;AACH,UAAA,QAAA,GAAW,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,IAAK,IAAA;AACtC,UAAA;AAAA,QACF,KAAK,YAAA,EAAc;AACjB,UAAA,MAAM,OAAA,GAAU,iBAAiB,WAAW,CAAA;AAC5C,UAAA,IAAI,OAAA,IAAW,WAAA,CAAY,YAAA,CAAa,eAAe,MAAM,MAAA,EAAQ;AACnE,YAAA,OAAA,CAAQ,KAAA,EAAM;AACd,YAAA,QAAA,GAAW,WAAA;AAAA,UACb,CAAA,MAAO;AACL,YAAA,QAAA,GAAW,KAAA,CAAM,KAAK,GAAA,CAAI,YAAA,GAAe,GAAG,KAAA,CAAM,MAAA,GAAS,CAAC,CAAC,CAAA,IAAK,IAAA;AAAA,UACpE;AACA,UAAA;AAAA,QACF;AAAA,QACA,KAAK,WAAA,EAAa;AAChB,UAAA,MAAM,OAAA,GAAU,iBAAiB,WAAW,CAAA;AAC5C,UAAA,IAAI,OAAA,IAAW,WAAA,CAAY,YAAA,CAAa,eAAe,MAAM,MAAA,EAAQ;AACnE,YAAA,OAAA,CAAQ,KAAA,EAAM;AACd,YAAA,QAAA,GAAW,WAAA;AAAA,UACb,CAAA,MAAO;AACL,YAAA,QAAA,GAAW,kBAAkB,WAAW,CAAA;AAAA,UAC1C;AACA,UAAA;AAAA,QACF;AAAA,QACA,KAAK,OAAA;AAAA,QACL,KAAK,GAAA;AAAA,QACL,KAAK,UAAA;AACH,UAAA,gBAAA,CAAiB,WAAW,CAAA;AAC5B,UAAA,QAAA,GAAW,WAAA;AACX,UAAA;AAAA,QACF;AACE,UAAA,OAAA,GAAU,KAAA;AAAA;AAGd,MAAA,IAAI,CAAC,OAAA,EAAS;AAEd,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,KAAA,CAAM,eAAA,EAAgB;AAEtB,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,aAAA,CAAc,MAAM,QAAQ,CAAA;AAAA,MAC9B;AAAA,IACF,CAAA,EAAG,EAAE,CAAA;AAEL,IAAAW,yDAAA,CAA0B,MAAM;AAC9B,MAAA,MAAM,OAAO,OAAA,CAAQ,OAAA;AACrB,MAAA,IAAI,CAAC,IAAA,EAAM;AACX,MAAA,gBAAA,CAAiB,MAAM,UAAU,CAAA;AAAA,IACnC,CAAA,EAAG,CAAC,QAAA,EAAU,UAAU,CAAC,CAAA;AAEzB,IAAAX,gBAAA,CAAM,UAAU,MAAM;AACpB,MAAA,MAAM,OAAO,OAAA,CAAQ,OAAA;AACrB,MAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,gBAAA,KAAqB,WAAA,EAAa;AAEtD,MAAA,MAAM,QAAA,GAAW,IAAI,gBAAA,CAAiB,MAAM;AAC1C,QAAA,gBAAA,CAAiB,MAAM,UAAU,CAAA;AAAA,MACnC,CAAC,CAAA;AACD,MAAA,QAAA,CAAS,QAAQ,IAAA,EAAM,EAAE,WAAW,IAAA,EAAM,OAAA,EAAS,MAAM,CAAA;AAEzD,MAAA,OAAO,MAAM;AACX,QAAA,QAAA,CAAS,UAAA,EAAW;AAAA,MACtB,CAAA;AAAA,IACF,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAEf,IAAA,MAAM,YAAA,GAAeA,gBAAA,CAAM,OAAA,CAAQ,OAAO,EAAE,UAAA,EAAY,QAAA,EAAU,SAAA,EAAU,CAAA,EAAI,CAAC,UAAA,EAAY,QAAA,EAAU,SAAS,CAAC,CAAA;AAEjH,IAAA,sCACG,YAAA,EAAA,EAAa,KAAA,EAAO,cACnB,QAAA,kBAAAC,cAAA,CAAC,iBAAA,EAAA,EAAkB,OAAO,CAAA,EACxB,QAAA,kBAAAA,cAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,aAAA;AAAA,QACL,IAAA,EAAK,MAAA;AAAA,QACL,SAAA,EAAWC,WAAA,CAAG,uBAAA,EAAyB,SAAS,CAAA;AAAA,QAChD,SAAA,EAAW,aAAA;AAAA,QAEV;AAAA;AAAA,OAEL,CAAA,EACF,CAAA;AAAA,EAEJ;AACF,CAAA;AACA,QAAA,CAAS,WAAA,GAAc,MAAA;;AC/OhB,MAAM,IAAA,GAAO,MAAA,CAAO,MAAA,CAAO,QAAA,EAAU;AAAA,EAC1C,MAAA,EAAQ,UAAA;AAAA,EACR,aAAA,EAAe,iBAAA;AAAA,EACf,aAAA,EAAe,iBAAA;AAAA,EACf,IAAA,EAAM,QAAA;AAAA,EACN,IAAA,EAAM,QAAA;AAAA,EACN,KAAA,EAAO,SAAA;AAAA,EACP,KAAA,EAAO;AACT,CAAC;;;;"}
|
|
@@ -172,7 +172,7 @@ const TreeFolderTrigger = React.forwardRef(
|
|
|
172
172
|
focusFolderItem(e.currentTarget, { focus: false });
|
|
173
173
|
},
|
|
174
174
|
children: [
|
|
175
|
-
/* @__PURE__ */ jsx(ChevronRight, { "aria-hidden": "true", className: "size-3 shrink-0
|
|
175
|
+
/* @__PURE__ */ jsx(ChevronRight, { "aria-hidden": "true", className: "text-neutral3 size-3 shrink-0" }),
|
|
176
176
|
children
|
|
177
177
|
]
|
|
178
178
|
}
|
|
@@ -255,7 +255,7 @@ const TreeInput = React.forwardRef(
|
|
|
255
255
|
onKeyDown: handleKeyDown,
|
|
256
256
|
onBlur: handleBlur,
|
|
257
257
|
onFocus: handleFocus,
|
|
258
|
-
className: "min-w-0 flex-1 border-none bg-transparent text-xs
|
|
258
|
+
className: "text-neutral5 placeholder:text-neutral3 min-w-0 flex-1 border-none bg-transparent text-xs outline-hidden"
|
|
259
259
|
}
|
|
260
260
|
)
|
|
261
261
|
]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tree.es.js","sources":["../../src/ds/components/Tree/tree-context.tsx","../../src/ds/components/Tree/tree-file.tsx","../../src/ds/components/Tree/tree-folder.tsx","../../src/ds/components/Tree/tree-folder-content.tsx","../../src/ds/components/Tree/tree-folder-trigger.tsx","../../src/ds/components/Tree/tree-icon.tsx","../../src/ds/components/Tree/tree-input.tsx","../../src/ds/components/Tree/tree-label.tsx","../../src/ds/components/Tree/tree-root.tsx","../../src/ds/components/Tree/tree.tsx"],"sourcesContent":["import * as React from 'react';\n\nexport interface TreeContextValue {\n selectedId?: string;\n onSelect?: (id: string) => void;\n focusItem?: (item: HTMLElement, options?: { focus?: boolean }) => void;\n}\n\nconst TreeContext = React.createContext<TreeContextValue | null>(null);\n\nexport function TreeProvider({ children, value }: { children: React.ReactNode; value: TreeContextValue }) {\n return <TreeContext.Provider value={value}>{children}</TreeContext.Provider>;\n}\n\nexport function useTreeContext(): TreeContextValue | null {\n return React.useContext(TreeContext);\n}\n\nexport interface TreeFolderContextValue {\n isFocused: boolean;\n}\n\nconst TreeFolderContext = React.createContext<TreeFolderContextValue | null>(null);\n\nexport function TreeFolderProvider({ children, value }: { children: React.ReactNode; value: TreeFolderContextValue }) {\n return <TreeFolderContext.Provider value={value}>{children}</TreeFolderContext.Provider>;\n}\n\nexport function useTreeFolderContext(): TreeFolderContextValue | null {\n return React.useContext(TreeFolderContext);\n}\n\nconst TreeDepthContext = React.createContext<number>(0);\n\nexport function TreeDepthProvider({ children, depth }: { children: React.ReactNode; depth: number }) {\n return <TreeDepthContext.Provider value={depth}>{children}</TreeDepthContext.Provider>;\n}\n\nexport function useTreeDepth(): number {\n return React.useContext(TreeDepthContext);\n}\n","import * as React from 'react';\nimport { useTreeContext, useTreeDepth } from './tree-context';\nimport { transitions } from '@/ds/primitives/transitions';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeFileProps {\n id?: string;\n className?: string;\n children: React.ReactNode;\n}\n\nexport const TreeFile = React.forwardRef<HTMLLIElement, TreeFileProps>(({ id, className, children }, ref) => {\n const treeCtx = useTreeContext();\n const depth = useTreeDepth();\n const isSelected = id != null && treeCtx?.selectedId === id;\n\n const handleClick = (e: React.MouseEvent<HTMLLIElement>) => {\n treeCtx?.focusItem?.(e.currentTarget);\n if (id != null && treeCtx?.onSelect) {\n treeCtx.onSelect(id);\n }\n };\n\n const handleFocus = (e: React.FocusEvent<HTMLLIElement>) => {\n treeCtx?.focusItem?.(e.currentTarget, { focus: false });\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if ((e.key === 'Enter' || e.key === ' ') && id != null && treeCtx?.onSelect) {\n e.preventDefault();\n treeCtx.onSelect(id);\n }\n };\n\n return (\n <li\n ref={ref}\n role=\"treeitem\"\n aria-level={depth + 1}\n aria-selected={isSelected || undefined}\n data-tree-item-kind=\"file\"\n data-tree-item-id={id}\n tabIndex={-1}\n className={cn(\n 'group flex h-7 min-w-0 cursor-pointer items-center gap-1.5 rounded-sm px-1',\n transitions.colors,\n 'outline-hidden hover:bg-surface4 focus-visible:bg-surface4 focus-visible:text-neutral6 focus-visible:outline-hidden',\n isSelected && 'bg-surface4 text-neutral6',\n className,\n )}\n // +18 offsets past the chevron (size-3 = 12px) + flex gap (gap-1.5 = 6px) that folders have\n style={{ paddingLeft: depth * 12 + 18 }}\n onClick={handleClick}\n onFocus={handleFocus}\n onKeyDown={handleKeyDown}\n >\n {children}\n </li>\n );\n});\nTreeFile.displayName = 'Tree.File';\n","import * as React from 'react';\nimport { TreeFolderProvider, useTreeContext, useTreeDepth } from './tree-context';\nimport { Collapsible } from '@/ds/components/Collapsible';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeFolderProps {\n id?: string;\n defaultOpen?: boolean;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n className?: string;\n children: React.ReactNode;\n}\n\nexport const TreeFolder = React.forwardRef<HTMLLIElement, TreeFolderProps>(\n ({ id, defaultOpen, open, onOpenChange, className, children }, ref) => {\n const treeCtx = useTreeContext();\n const depth = useTreeDepth();\n const [internalOpen, setInternalOpen] = React.useState(defaultOpen ?? false);\n const [isFocused, setIsFocused] = React.useState(false);\n const isOpen = open ?? internalOpen;\n\n const handleOpenChange = React.useCallback(\n (nextOpen: boolean) => {\n setInternalOpen(nextOpen);\n onOpenChange?.(nextOpen);\n },\n [onOpenChange],\n );\n\n const handleFocus = React.useCallback(\n (e: React.FocusEvent<HTMLLIElement>) => {\n if (e.target !== e.currentTarget) {\n setIsFocused(false);\n return;\n }\n\n setIsFocused(true);\n treeCtx?.focusItem?.(e.currentTarget, { focus: false });\n },\n [treeCtx],\n );\n\n const handleBlur = React.useCallback(() => {\n setIsFocused(false);\n }, []);\n\n const folderContextValue = React.useMemo(() => ({ isFocused }), [isFocused]);\n\n return (\n <li\n ref={ref}\n role=\"treeitem\"\n aria-expanded={isOpen}\n aria-level={depth + 1}\n data-tree-item-kind=\"folder\"\n data-tree-item-id={id}\n tabIndex={-1}\n className={cn('flex flex-col outline-hidden', className)}\n onFocus={handleFocus}\n onBlur={handleBlur}\n >\n <TreeFolderProvider value={folderContextValue}>\n <Collapsible open={isOpen} onOpenChange={handleOpenChange}>\n {children}\n </Collapsible>\n </TreeFolderProvider>\n </li>\n );\n },\n);\nTreeFolder.displayName = 'Tree.Folder';\n","import * as React from 'react';\nimport { useTreeDepth, TreeDepthProvider } from './tree-context';\nimport { CollapsibleContent } from '@/ds/components/Collapsible';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeFolderContentProps {\n className?: string;\n children: React.ReactNode;\n}\n\nexport const TreeFolderContent = React.forwardRef<HTMLDivElement, TreeFolderContentProps>(\n ({ className, children }, ref) => {\n const depth = useTreeDepth();\n\n return (\n <CollapsibleContent ref={ref} className={cn(className)}>\n <TreeDepthProvider depth={depth + 1}>\n <ul role=\"group\" className=\"flex flex-col\">\n {children}\n </ul>\n </TreeDepthProvider>\n </CollapsibleContent>\n );\n },\n);\nTreeFolderContent.displayName = 'Tree.FolderContent';\n","import { ChevronRight } from 'lucide-react';\nimport * as React from 'react';\nimport { useTreeContext, useTreeDepth, useTreeFolderContext } from './tree-context';\nimport { CollapsibleTrigger } from '@/ds/components/Collapsible';\nimport { transitions } from '@/ds/primitives/transitions';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeFolderTriggerProps {\n className?: string;\n children: React.ReactNode;\n actions?: React.ReactNode;\n}\n\nexport const TreeFolderTrigger = React.forwardRef<HTMLDivElement, TreeFolderTriggerProps>(\n ({ className, children, actions }, ref) => {\n const treeCtx = useTreeContext();\n const folderCtx = useTreeFolderContext();\n const depth = useTreeDepth();\n\n const focusFolderItem = React.useCallback(\n (target: HTMLElement, options?: { focus?: boolean }) => {\n const item = target.closest<HTMLElement>('[data-tree-item-kind=\"folder\"]');\n if (item) {\n treeCtx?.focusItem?.(item, options);\n }\n },\n [treeCtx],\n );\n\n return (\n <div\n ref={ref}\n data-tree-folder-row=\"true\"\n className={cn(\n 'group flex h-7 w-full min-w-0 items-center rounded-sm hover:bg-surface4',\n transitions.colors,\n folderCtx?.isFocused && 'bg-surface4 text-neutral6',\n className,\n )}\n >\n <CollapsibleTrigger\n data-tree-folder-trigger=\"true\"\n tabIndex={-1}\n className=\"flex h-7 min-w-0 flex-1 cursor-pointer items-center gap-1.5 rounded-sm px-1 outline-hidden focus-visible:ring-0 focus-visible:outline-hidden\"\n style={{ paddingLeft: depth * 12 }}\n onMouseDown={e => {\n e.preventDefault();\n focusFolderItem(e.currentTarget);\n }}\n onFocus={e => {\n focusFolderItem(e.currentTarget, { focus: false });\n }}\n >\n <ChevronRight aria-hidden=\"true\" className=\"size-3 shrink-0 text-neutral3\" />\n {children}\n </CollapsibleTrigger>\n {actions && (\n <span className=\"shrink-0 pr-1\" onClick={e => e.stopPropagation()}>\n {actions}\n </span>\n )}\n </div>\n );\n },\n);\nTreeFolderTrigger.displayName = 'Tree.FolderTrigger';\n","import * as React from 'react';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeIconProps {\n className?: string;\n children: React.ReactNode;\n}\n\nexport const TreeIcon = React.forwardRef<HTMLSpanElement, TreeIconProps>(({ className, children }, ref) => (\n <span ref={ref} className={cn('flex shrink-0 items-center [&>svg]:size-3.5', className)}>\n {children}\n </span>\n));\nTreeIcon.displayName = 'Tree.Icon';\n","import { File, Folder } from 'lucide-react';\nimport * as React from 'react';\nimport { useTreeDepth } from './tree-context';\nimport { transitions } from '@/ds/primitives/transitions';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeInputProps {\n type: 'file' | 'folder';\n onSubmit: (name: string) => void;\n onCancel?: () => void;\n defaultValue?: string;\n placeholder?: string;\n autoFocus?: boolean;\n className?: string;\n}\n\nexport const TreeInput = React.forwardRef<HTMLLIElement, TreeInputProps>(\n ({ type, onSubmit, onCancel, defaultValue = '', placeholder, autoFocus = true, className }, ref) => {\n const depth = useTreeDepth();\n const inputRef = React.useRef<HTMLInputElement>(null);\n const submittedRef = React.useRef(false);\n\n const handleSubmit = React.useCallback(\n (value: string) => {\n if (submittedRef.current) return;\n const trimmed = value.trim();\n if (trimmed) {\n submittedRef.current = true;\n onSubmit(trimmed);\n } else {\n onCancel?.();\n }\n },\n [onSubmit, onCancel],\n );\n\n const handleKeyDown = React.useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n handleSubmit(e.currentTarget.value);\n } else if (e.key === 'Escape') {\n e.preventDefault();\n onCancel?.();\n }\n },\n [handleSubmit, onCancel],\n );\n\n const handleBlur = React.useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n handleSubmit(e.currentTarget.value);\n },\n [handleSubmit],\n );\n\n const handleFocus = React.useCallback((e: React.FocusEvent<HTMLInputElement>) => {\n e.currentTarget.select();\n }, []);\n\n const Icon = type === 'folder' ? Folder : File;\n\n return (\n <li\n ref={ref}\n role=\"treeitem\"\n aria-level={depth + 1}\n data-tree-item-kind=\"input\"\n className={cn(\n 'group flex h-7 min-w-0 items-center gap-1.5 rounded-sm px-1',\n transitions.colors,\n 'focus-within:bg-surface4 focus-within:text-neutral6 focus-within:outline-hidden',\n className,\n )}\n style={{ paddingLeft: depth * 12 + 18 }}\n >\n <span className=\"flex shrink-0 items-center [&>svg]:size-3.5\">\n <Icon className=\"text-neutral3\" />\n </span>\n <input\n ref={inputRef}\n type=\"text\"\n defaultValue={defaultValue}\n placeholder={placeholder}\n autoFocus={autoFocus}\n onKeyDown={handleKeyDown}\n onBlur={handleBlur}\n onFocus={handleFocus}\n className=\"min-w-0 flex-1 border-none bg-transparent text-xs text-neutral5 outline-hidden placeholder:text-neutral3\"\n />\n </li>\n );\n },\n);\nTreeInput.displayName = 'Tree.Input';\n","import * as React from 'react';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeLabelProps {\n className?: string;\n children: React.ReactNode;\n}\n\nexport const TreeLabel = React.forwardRef<HTMLSpanElement, TreeLabelProps>(({ className, children }, ref) => (\n <span ref={ref} className={cn('truncate text-neutral5', className)}>\n {children}\n </span>\n));\nTreeLabel.displayName = 'Tree.Label';\n","import * as React from 'react';\nimport { TreeProvider, TreeDepthProvider } from './tree-context';\nimport { useIsomorphicLayoutEffect } from '@/hooks/use-isomorphic-layout-effect';\nimport { cn } from '@/lib/utils';\n\nconst TREE_FOCUSABLE_ITEM_SELECTOR = '[data-tree-item-kind=\"folder\"], [data-tree-item-kind=\"file\"]';\nconst TREE_FOLDER_TRIGGER_SELECTOR = '[data-tree-folder-trigger=\"true\"]';\n\nexport interface TreeRootProps {\n selectedId?: string;\n onSelect?: (id: string) => void;\n className?: string;\n children: React.ReactNode;\n}\n\nfunction assignRef<T>(ref: React.ForwardedRef<T>, value: T | null) {\n if (typeof ref === 'function') {\n ref(value);\n } else if (ref) {\n ref.current = value;\n }\n}\n\nfunction getTreeItems(root: HTMLElement): HTMLElement[] {\n return Array.from(root.querySelectorAll<HTMLElement>(TREE_FOCUSABLE_ITEM_SELECTOR)).filter(\n item => item.getAttribute('role') === 'treeitem',\n );\n}\n\nfunction setTabStops(items: HTMLElement[], focusableItem: HTMLElement) {\n for (const item of items) {\n item.tabIndex = item === focusableItem ? 0 : -1;\n }\n}\n\nfunction syncTreeItemSetMetadata(root: HTMLElement) {\n const groups = [root, ...Array.from(root.querySelectorAll<HTMLElement>('[role=\"group\"]'))];\n\n for (const group of groups) {\n const items = Array.from(group.children).filter(\n (child): child is HTMLElement =>\n child instanceof HTMLElement &&\n child.getAttribute('role') === 'treeitem' &&\n child.hasAttribute('data-tree-item-kind'),\n );\n\n items.forEach((item, index) => {\n item.setAttribute('aria-posinset', String(index + 1));\n item.setAttribute('aria-setsize', String(items.length));\n });\n }\n}\n\nfunction findSelectedItem(items: HTMLElement[], selectedId: string | undefined): HTMLElement | null {\n if (!selectedId) return null;\n return items.find(item => item.dataset.treeItemId === selectedId) ?? null;\n}\n\nfunction getActiveTreeItem(root: HTMLElement, items: HTMLElement[]): HTMLElement | null {\n const activeElement = root.ownerDocument.activeElement;\n if (!(activeElement instanceof HTMLElement) || !root.contains(activeElement)) return null;\n\n const activeItem = activeElement.closest<HTMLElement>(TREE_FOCUSABLE_ITEM_SELECTOR);\n return activeItem && items.includes(activeItem) ? activeItem : null;\n}\n\nfunction getClosestTreeItem(root: HTMLElement, target: EventTarget | null): HTMLElement | null {\n if (!(target instanceof HTMLElement) || !root.contains(target)) return null;\n const item = target.closest<HTMLElement>(TREE_FOCUSABLE_ITEM_SELECTOR);\n return item?.getAttribute('role') === 'treeitem' ? item : null;\n}\n\nfunction focusTreeItem(root: HTMLElement, item: HTMLElement, options: { focus?: boolean } = {}) {\n const items = getTreeItems(root);\n if (!items.includes(item)) return;\n\n setTabStops(items, item);\n if (options.focus !== false) {\n item.focus();\n }\n}\n\nfunction syncTreeTabStops(root: HTMLElement, selectedId: string | undefined) {\n const items = getTreeItems(root);\n syncTreeItemSetMetadata(root);\n\n const firstItem = items[0];\n if (!firstItem) return;\n\n const activeItem = getActiveTreeItem(root, items);\n const selectedItem = findSelectedItem(items, selectedId);\n setTabStops(items, activeItem ?? selectedItem ?? firstItem);\n}\n\nfunction isEditableTarget(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) return false;\n if (target.dataset.treeFolderTrigger === 'true') return false;\n if (target.isContentEditable) return true;\n\n return !!target.closest('input, textarea, select, button, [contenteditable=\"true\"]');\n}\n\nfunction getFolderTrigger(item: HTMLElement): HTMLButtonElement | null {\n return item.querySelector<HTMLButtonElement>(TREE_FOLDER_TRIGGER_SELECTOR);\n}\n\nfunction getParentTreeItem(item: HTMLElement): HTMLElement | null {\n const parentGroup = item.parentElement?.closest('[role=\"group\"]');\n return parentGroup?.closest<HTMLElement>(TREE_FOCUSABLE_ITEM_SELECTOR) ?? null;\n}\n\nfunction activateTreeItem(item: HTMLElement) {\n const trigger = getFolderTrigger(item);\n if (trigger) {\n trigger.click();\n } else {\n item.click();\n }\n}\n\nexport const TreeRoot = React.forwardRef<HTMLUListElement, TreeRootProps>(\n ({ selectedId, onSelect, className, children }, ref) => {\n const rootRef = React.useRef<HTMLUListElement | null>(null);\n\n const handleRootRef = React.useCallback(\n (node: HTMLUListElement | null) => {\n rootRef.current = node;\n assignRef(ref, node);\n },\n [ref],\n );\n\n const focusItem = React.useCallback((item: HTMLElement, options?: { focus?: boolean }) => {\n const root = rootRef.current;\n if (!root) return;\n focusTreeItem(root, item, options);\n }, []);\n\n const handleKeyDown = React.useCallback((event: React.KeyboardEvent<HTMLUListElement>) => {\n if (event.defaultPrevented || isEditableTarget(event.target)) return;\n\n const root = rootRef.current;\n if (!root) return;\n\n const items = getTreeItems(root);\n const currentItem =\n getClosestTreeItem(root, event.target) ??\n getActiveTreeItem(root, items) ??\n items.find(item => item.tabIndex === 0);\n if (!currentItem) return;\n\n const currentIndex = items.indexOf(currentItem);\n if (currentIndex < 0) return;\n\n let nextItem: HTMLElement | null = null;\n let handled = true;\n\n switch (event.key) {\n case 'ArrowDown':\n nextItem = items[Math.min(currentIndex + 1, items.length - 1)] ?? null;\n break;\n case 'ArrowUp':\n nextItem = items[Math.max(currentIndex - 1, 0)] ?? null;\n break;\n case 'Home':\n nextItem = items[0] ?? null;\n break;\n case 'End':\n nextItem = items[items.length - 1] ?? null;\n break;\n case 'ArrowRight': {\n const trigger = getFolderTrigger(currentItem);\n if (trigger && currentItem.getAttribute('aria-expanded') !== 'true') {\n trigger.click();\n nextItem = currentItem;\n } else {\n nextItem = items[Math.min(currentIndex + 1, items.length - 1)] ?? null;\n }\n break;\n }\n case 'ArrowLeft': {\n const trigger = getFolderTrigger(currentItem);\n if (trigger && currentItem.getAttribute('aria-expanded') === 'true') {\n trigger.click();\n nextItem = currentItem;\n } else {\n nextItem = getParentTreeItem(currentItem);\n }\n break;\n }\n case 'Enter':\n case ' ':\n case 'Spacebar':\n activateTreeItem(currentItem);\n nextItem = currentItem;\n break;\n default:\n handled = false;\n }\n\n if (!handled) return;\n\n event.preventDefault();\n event.stopPropagation();\n\n if (nextItem) {\n focusTreeItem(root, nextItem);\n }\n }, []);\n\n useIsomorphicLayoutEffect(() => {\n const root = rootRef.current;\n if (!root) return;\n syncTreeTabStops(root, selectedId);\n }, [children, selectedId]);\n\n React.useEffect(() => {\n const root = rootRef.current;\n if (!root || typeof MutationObserver === 'undefined') return;\n\n const observer = new MutationObserver(() => {\n syncTreeTabStops(root, selectedId);\n });\n observer.observe(root, { childList: true, subtree: true });\n\n return () => {\n observer.disconnect();\n };\n }, [selectedId]);\n\n const contextValue = React.useMemo(() => ({ selectedId, onSelect, focusItem }), [selectedId, onSelect, focusItem]);\n\n return (\n <TreeProvider value={contextValue}>\n <TreeDepthProvider depth={0}>\n <ul\n ref={handleRootRef}\n role=\"tree\"\n className={cn('flex flex-col text-xs', className)}\n onKeyDown={handleKeyDown}\n >\n {children}\n </ul>\n </TreeDepthProvider>\n </TreeProvider>\n );\n },\n);\nTreeRoot.displayName = 'Tree';\n","import { TreeFile } from './tree-file';\nimport { TreeFolder } from './tree-folder';\nimport { TreeFolderContent } from './tree-folder-content';\nimport { TreeFolderTrigger } from './tree-folder-trigger';\nimport { TreeIcon } from './tree-icon';\nimport { TreeInput } from './tree-input';\nimport { TreeLabel } from './tree-label';\nimport { TreeRoot } from './tree-root';\n\nexport const Tree = Object.assign(TreeRoot, {\n Folder: TreeFolder,\n FolderTrigger: TreeFolderTrigger,\n FolderContent: TreeFolderContent,\n File: TreeFile,\n Icon: TreeIcon,\n Label: TreeLabel,\n Input: TreeInput,\n});\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Tree.es.js","sources":["../../src/ds/components/Tree/tree-context.tsx","../../src/ds/components/Tree/tree-file.tsx","../../src/ds/components/Tree/tree-folder.tsx","../../src/ds/components/Tree/tree-folder-content.tsx","../../src/ds/components/Tree/tree-folder-trigger.tsx","../../src/ds/components/Tree/tree-icon.tsx","../../src/ds/components/Tree/tree-input.tsx","../../src/ds/components/Tree/tree-label.tsx","../../src/ds/components/Tree/tree-root.tsx","../../src/ds/components/Tree/tree.tsx"],"sourcesContent":["import * as React from 'react';\n\nexport interface TreeContextValue {\n selectedId?: string;\n onSelect?: (id: string) => void;\n focusItem?: (item: HTMLElement, options?: { focus?: boolean }) => void;\n}\n\nconst TreeContext = React.createContext<TreeContextValue | null>(null);\n\nexport function TreeProvider({ children, value }: { children: React.ReactNode; value: TreeContextValue }) {\n return <TreeContext.Provider value={value}>{children}</TreeContext.Provider>;\n}\n\nexport function useTreeContext(): TreeContextValue | null {\n return React.useContext(TreeContext);\n}\n\nexport interface TreeFolderContextValue {\n isFocused: boolean;\n}\n\nconst TreeFolderContext = React.createContext<TreeFolderContextValue | null>(null);\n\nexport function TreeFolderProvider({ children, value }: { children: React.ReactNode; value: TreeFolderContextValue }) {\n return <TreeFolderContext.Provider value={value}>{children}</TreeFolderContext.Provider>;\n}\n\nexport function useTreeFolderContext(): TreeFolderContextValue | null {\n return React.useContext(TreeFolderContext);\n}\n\nconst TreeDepthContext = React.createContext<number>(0);\n\nexport function TreeDepthProvider({ children, depth }: { children: React.ReactNode; depth: number }) {\n return <TreeDepthContext.Provider value={depth}>{children}</TreeDepthContext.Provider>;\n}\n\nexport function useTreeDepth(): number {\n return React.useContext(TreeDepthContext);\n}\n","import * as React from 'react';\nimport { useTreeContext, useTreeDepth } from './tree-context';\nimport { transitions } from '@/ds/primitives/transitions';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeFileProps {\n id?: string;\n className?: string;\n children: React.ReactNode;\n}\n\nexport const TreeFile = React.forwardRef<HTMLLIElement, TreeFileProps>(({ id, className, children }, ref) => {\n const treeCtx = useTreeContext();\n const depth = useTreeDepth();\n const isSelected = id != null && treeCtx?.selectedId === id;\n\n const handleClick = (e: React.MouseEvent<HTMLLIElement>) => {\n treeCtx?.focusItem?.(e.currentTarget);\n if (id != null && treeCtx?.onSelect) {\n treeCtx.onSelect(id);\n }\n };\n\n const handleFocus = (e: React.FocusEvent<HTMLLIElement>) => {\n treeCtx?.focusItem?.(e.currentTarget, { focus: false });\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if ((e.key === 'Enter' || e.key === ' ') && id != null && treeCtx?.onSelect) {\n e.preventDefault();\n treeCtx.onSelect(id);\n }\n };\n\n return (\n <li\n ref={ref}\n role=\"treeitem\"\n aria-level={depth + 1}\n aria-selected={isSelected || undefined}\n data-tree-item-kind=\"file\"\n data-tree-item-id={id}\n tabIndex={-1}\n className={cn(\n 'group flex h-7 min-w-0 cursor-pointer items-center gap-1.5 rounded-sm px-1',\n transitions.colors,\n 'outline-hidden hover:bg-surface4 focus-visible:bg-surface4 focus-visible:text-neutral6 focus-visible:outline-hidden',\n isSelected && 'bg-surface4 text-neutral6',\n className,\n )}\n // +18 offsets past the chevron (size-3 = 12px) + flex gap (gap-1.5 = 6px) that folders have\n style={{ paddingLeft: depth * 12 + 18 }}\n onClick={handleClick}\n onFocus={handleFocus}\n onKeyDown={handleKeyDown}\n >\n {children}\n </li>\n );\n});\nTreeFile.displayName = 'Tree.File';\n","import * as React from 'react';\nimport { TreeFolderProvider, useTreeContext, useTreeDepth } from './tree-context';\nimport { Collapsible } from '@/ds/components/Collapsible';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeFolderProps {\n id?: string;\n defaultOpen?: boolean;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n className?: string;\n children: React.ReactNode;\n}\n\nexport const TreeFolder = React.forwardRef<HTMLLIElement, TreeFolderProps>(\n ({ id, defaultOpen, open, onOpenChange, className, children }, ref) => {\n const treeCtx = useTreeContext();\n const depth = useTreeDepth();\n const [internalOpen, setInternalOpen] = React.useState(defaultOpen ?? false);\n const [isFocused, setIsFocused] = React.useState(false);\n const isOpen = open ?? internalOpen;\n\n const handleOpenChange = React.useCallback(\n (nextOpen: boolean) => {\n setInternalOpen(nextOpen);\n onOpenChange?.(nextOpen);\n },\n [onOpenChange],\n );\n\n const handleFocus = React.useCallback(\n (e: React.FocusEvent<HTMLLIElement>) => {\n if (e.target !== e.currentTarget) {\n setIsFocused(false);\n return;\n }\n\n setIsFocused(true);\n treeCtx?.focusItem?.(e.currentTarget, { focus: false });\n },\n [treeCtx],\n );\n\n const handleBlur = React.useCallback(() => {\n setIsFocused(false);\n }, []);\n\n const folderContextValue = React.useMemo(() => ({ isFocused }), [isFocused]);\n\n return (\n <li\n ref={ref}\n role=\"treeitem\"\n aria-expanded={isOpen}\n aria-level={depth + 1}\n data-tree-item-kind=\"folder\"\n data-tree-item-id={id}\n tabIndex={-1}\n className={cn('flex flex-col outline-hidden', className)}\n onFocus={handleFocus}\n onBlur={handleBlur}\n >\n <TreeFolderProvider value={folderContextValue}>\n <Collapsible open={isOpen} onOpenChange={handleOpenChange}>\n {children}\n </Collapsible>\n </TreeFolderProvider>\n </li>\n );\n },\n);\nTreeFolder.displayName = 'Tree.Folder';\n","import * as React from 'react';\nimport { useTreeDepth, TreeDepthProvider } from './tree-context';\nimport { CollapsibleContent } from '@/ds/components/Collapsible';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeFolderContentProps {\n className?: string;\n children: React.ReactNode;\n}\n\nexport const TreeFolderContent = React.forwardRef<HTMLDivElement, TreeFolderContentProps>(\n ({ className, children }, ref) => {\n const depth = useTreeDepth();\n\n return (\n <CollapsibleContent ref={ref} className={cn(className)}>\n <TreeDepthProvider depth={depth + 1}>\n <ul role=\"group\" className=\"flex flex-col\">\n {children}\n </ul>\n </TreeDepthProvider>\n </CollapsibleContent>\n );\n },\n);\nTreeFolderContent.displayName = 'Tree.FolderContent';\n","import { ChevronRight } from 'lucide-react';\nimport * as React from 'react';\nimport { useTreeContext, useTreeDepth, useTreeFolderContext } from './tree-context';\nimport { CollapsibleTrigger } from '@/ds/components/Collapsible';\nimport { transitions } from '@/ds/primitives/transitions';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeFolderTriggerProps {\n className?: string;\n children: React.ReactNode;\n actions?: React.ReactNode;\n}\n\nexport const TreeFolderTrigger = React.forwardRef<HTMLDivElement, TreeFolderTriggerProps>(\n ({ className, children, actions }, ref) => {\n const treeCtx = useTreeContext();\n const folderCtx = useTreeFolderContext();\n const depth = useTreeDepth();\n\n const focusFolderItem = React.useCallback(\n (target: HTMLElement, options?: { focus?: boolean }) => {\n const item = target.closest<HTMLElement>('[data-tree-item-kind=\"folder\"]');\n if (item) {\n treeCtx?.focusItem?.(item, options);\n }\n },\n [treeCtx],\n );\n\n return (\n <div\n ref={ref}\n data-tree-folder-row=\"true\"\n className={cn(\n 'group flex h-7 w-full min-w-0 items-center rounded-sm hover:bg-surface4',\n transitions.colors,\n folderCtx?.isFocused && 'bg-surface4 text-neutral6',\n className,\n )}\n >\n <CollapsibleTrigger\n data-tree-folder-trigger=\"true\"\n tabIndex={-1}\n className=\"flex h-7 min-w-0 flex-1 cursor-pointer items-center gap-1.5 rounded-sm px-1 outline-hidden focus-visible:ring-0 focus-visible:outline-hidden\"\n style={{ paddingLeft: depth * 12 }}\n onMouseDown={e => {\n e.preventDefault();\n focusFolderItem(e.currentTarget);\n }}\n onFocus={e => {\n focusFolderItem(e.currentTarget, { focus: false });\n }}\n >\n <ChevronRight aria-hidden=\"true\" className=\"text-neutral3 size-3 shrink-0\" />\n {children}\n </CollapsibleTrigger>\n {actions && (\n <span className=\"shrink-0 pr-1\" onClick={e => e.stopPropagation()}>\n {actions}\n </span>\n )}\n </div>\n );\n },\n);\nTreeFolderTrigger.displayName = 'Tree.FolderTrigger';\n","import * as React from 'react';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeIconProps {\n className?: string;\n children: React.ReactNode;\n}\n\nexport const TreeIcon = React.forwardRef<HTMLSpanElement, TreeIconProps>(({ className, children }, ref) => (\n <span ref={ref} className={cn('flex shrink-0 items-center [&>svg]:size-3.5', className)}>\n {children}\n </span>\n));\nTreeIcon.displayName = 'Tree.Icon';\n","import { File, Folder } from 'lucide-react';\nimport * as React from 'react';\nimport { useTreeDepth } from './tree-context';\nimport { transitions } from '@/ds/primitives/transitions';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeInputProps {\n type: 'file' | 'folder';\n onSubmit: (name: string) => void;\n onCancel?: () => void;\n defaultValue?: string;\n placeholder?: string;\n autoFocus?: boolean;\n className?: string;\n}\n\nexport const TreeInput = React.forwardRef<HTMLLIElement, TreeInputProps>(\n ({ type, onSubmit, onCancel, defaultValue = '', placeholder, autoFocus = true, className }, ref) => {\n const depth = useTreeDepth();\n const inputRef = React.useRef<HTMLInputElement>(null);\n const submittedRef = React.useRef(false);\n\n const handleSubmit = React.useCallback(\n (value: string) => {\n if (submittedRef.current) return;\n const trimmed = value.trim();\n if (trimmed) {\n submittedRef.current = true;\n onSubmit(trimmed);\n } else {\n onCancel?.();\n }\n },\n [onSubmit, onCancel],\n );\n\n const handleKeyDown = React.useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n handleSubmit(e.currentTarget.value);\n } else if (e.key === 'Escape') {\n e.preventDefault();\n onCancel?.();\n }\n },\n [handleSubmit, onCancel],\n );\n\n const handleBlur = React.useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n handleSubmit(e.currentTarget.value);\n },\n [handleSubmit],\n );\n\n const handleFocus = React.useCallback((e: React.FocusEvent<HTMLInputElement>) => {\n e.currentTarget.select();\n }, []);\n\n const Icon = type === 'folder' ? Folder : File;\n\n return (\n <li\n ref={ref}\n role=\"treeitem\"\n aria-level={depth + 1}\n data-tree-item-kind=\"input\"\n className={cn(\n 'group flex h-7 min-w-0 items-center gap-1.5 rounded-sm px-1',\n transitions.colors,\n 'focus-within:bg-surface4 focus-within:text-neutral6 focus-within:outline-hidden',\n className,\n )}\n style={{ paddingLeft: depth * 12 + 18 }}\n >\n <span className=\"flex shrink-0 items-center [&>svg]:size-3.5\">\n <Icon className=\"text-neutral3\" />\n </span>\n <input\n ref={inputRef}\n type=\"text\"\n defaultValue={defaultValue}\n placeholder={placeholder}\n autoFocus={autoFocus}\n onKeyDown={handleKeyDown}\n onBlur={handleBlur}\n onFocus={handleFocus}\n className=\"text-neutral5 placeholder:text-neutral3 min-w-0 flex-1 border-none bg-transparent text-xs outline-hidden\"\n />\n </li>\n );\n },\n);\nTreeInput.displayName = 'Tree.Input';\n","import * as React from 'react';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeLabelProps {\n className?: string;\n children: React.ReactNode;\n}\n\nexport const TreeLabel = React.forwardRef<HTMLSpanElement, TreeLabelProps>(({ className, children }, ref) => (\n <span ref={ref} className={cn('truncate text-neutral5', className)}>\n {children}\n </span>\n));\nTreeLabel.displayName = 'Tree.Label';\n","import * as React from 'react';\nimport { TreeProvider, TreeDepthProvider } from './tree-context';\nimport { useIsomorphicLayoutEffect } from '@/hooks/use-isomorphic-layout-effect';\nimport { cn } from '@/lib/utils';\n\nconst TREE_FOCUSABLE_ITEM_SELECTOR = '[data-tree-item-kind=\"folder\"], [data-tree-item-kind=\"file\"]';\nconst TREE_FOLDER_TRIGGER_SELECTOR = '[data-tree-folder-trigger=\"true\"]';\n\nexport interface TreeRootProps {\n selectedId?: string;\n onSelect?: (id: string) => void;\n className?: string;\n children: React.ReactNode;\n}\n\nfunction assignRef<T>(ref: React.ForwardedRef<T>, value: T | null) {\n if (typeof ref === 'function') {\n ref(value);\n } else if (ref) {\n ref.current = value;\n }\n}\n\nfunction getTreeItems(root: HTMLElement): HTMLElement[] {\n return Array.from(root.querySelectorAll<HTMLElement>(TREE_FOCUSABLE_ITEM_SELECTOR)).filter(\n item => item.getAttribute('role') === 'treeitem',\n );\n}\n\nfunction setTabStops(items: HTMLElement[], focusableItem: HTMLElement) {\n for (const item of items) {\n item.tabIndex = item === focusableItem ? 0 : -1;\n }\n}\n\nfunction syncTreeItemSetMetadata(root: HTMLElement) {\n const groups = [root, ...Array.from(root.querySelectorAll<HTMLElement>('[role=\"group\"]'))];\n\n for (const group of groups) {\n const items = Array.from(group.children).filter(\n (child): child is HTMLElement =>\n child instanceof HTMLElement &&\n child.getAttribute('role') === 'treeitem' &&\n child.hasAttribute('data-tree-item-kind'),\n );\n\n items.forEach((item, index) => {\n item.setAttribute('aria-posinset', String(index + 1));\n item.setAttribute('aria-setsize', String(items.length));\n });\n }\n}\n\nfunction findSelectedItem(items: HTMLElement[], selectedId: string | undefined): HTMLElement | null {\n if (!selectedId) return null;\n return items.find(item => item.dataset.treeItemId === selectedId) ?? null;\n}\n\nfunction getActiveTreeItem(root: HTMLElement, items: HTMLElement[]): HTMLElement | null {\n const activeElement = root.ownerDocument.activeElement;\n if (!(activeElement instanceof HTMLElement) || !root.contains(activeElement)) return null;\n\n const activeItem = activeElement.closest<HTMLElement>(TREE_FOCUSABLE_ITEM_SELECTOR);\n return activeItem && items.includes(activeItem) ? activeItem : null;\n}\n\nfunction getClosestTreeItem(root: HTMLElement, target: EventTarget | null): HTMLElement | null {\n if (!(target instanceof HTMLElement) || !root.contains(target)) return null;\n const item = target.closest<HTMLElement>(TREE_FOCUSABLE_ITEM_SELECTOR);\n return item?.getAttribute('role') === 'treeitem' ? item : null;\n}\n\nfunction focusTreeItem(root: HTMLElement, item: HTMLElement, options: { focus?: boolean } = {}) {\n const items = getTreeItems(root);\n if (!items.includes(item)) return;\n\n setTabStops(items, item);\n if (options.focus !== false) {\n item.focus();\n }\n}\n\nfunction syncTreeTabStops(root: HTMLElement, selectedId: string | undefined) {\n const items = getTreeItems(root);\n syncTreeItemSetMetadata(root);\n\n const firstItem = items[0];\n if (!firstItem) return;\n\n const activeItem = getActiveTreeItem(root, items);\n const selectedItem = findSelectedItem(items, selectedId);\n setTabStops(items, activeItem ?? selectedItem ?? firstItem);\n}\n\nfunction isEditableTarget(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) return false;\n if (target.dataset.treeFolderTrigger === 'true') return false;\n if (target.isContentEditable) return true;\n\n return !!target.closest('input, textarea, select, button, [contenteditable=\"true\"]');\n}\n\nfunction getFolderTrigger(item: HTMLElement): HTMLButtonElement | null {\n return item.querySelector<HTMLButtonElement>(TREE_FOLDER_TRIGGER_SELECTOR);\n}\n\nfunction getParentTreeItem(item: HTMLElement): HTMLElement | null {\n const parentGroup = item.parentElement?.closest('[role=\"group\"]');\n return parentGroup?.closest<HTMLElement>(TREE_FOCUSABLE_ITEM_SELECTOR) ?? null;\n}\n\nfunction activateTreeItem(item: HTMLElement) {\n const trigger = getFolderTrigger(item);\n if (trigger) {\n trigger.click();\n } else {\n item.click();\n }\n}\n\nexport const TreeRoot = React.forwardRef<HTMLUListElement, TreeRootProps>(\n ({ selectedId, onSelect, className, children }, ref) => {\n const rootRef = React.useRef<HTMLUListElement | null>(null);\n\n const handleRootRef = React.useCallback(\n (node: HTMLUListElement | null) => {\n rootRef.current = node;\n assignRef(ref, node);\n },\n [ref],\n );\n\n const focusItem = React.useCallback((item: HTMLElement, options?: { focus?: boolean }) => {\n const root = rootRef.current;\n if (!root) return;\n focusTreeItem(root, item, options);\n }, []);\n\n const handleKeyDown = React.useCallback((event: React.KeyboardEvent<HTMLUListElement>) => {\n if (event.defaultPrevented || isEditableTarget(event.target)) return;\n\n const root = rootRef.current;\n if (!root) return;\n\n const items = getTreeItems(root);\n const currentItem =\n getClosestTreeItem(root, event.target) ??\n getActiveTreeItem(root, items) ??\n items.find(item => item.tabIndex === 0);\n if (!currentItem) return;\n\n const currentIndex = items.indexOf(currentItem);\n if (currentIndex < 0) return;\n\n let nextItem: HTMLElement | null = null;\n let handled = true;\n\n switch (event.key) {\n case 'ArrowDown':\n nextItem = items[Math.min(currentIndex + 1, items.length - 1)] ?? null;\n break;\n case 'ArrowUp':\n nextItem = items[Math.max(currentIndex - 1, 0)] ?? null;\n break;\n case 'Home':\n nextItem = items[0] ?? null;\n break;\n case 'End':\n nextItem = items[items.length - 1] ?? null;\n break;\n case 'ArrowRight': {\n const trigger = getFolderTrigger(currentItem);\n if (trigger && currentItem.getAttribute('aria-expanded') !== 'true') {\n trigger.click();\n nextItem = currentItem;\n } else {\n nextItem = items[Math.min(currentIndex + 1, items.length - 1)] ?? null;\n }\n break;\n }\n case 'ArrowLeft': {\n const trigger = getFolderTrigger(currentItem);\n if (trigger && currentItem.getAttribute('aria-expanded') === 'true') {\n trigger.click();\n nextItem = currentItem;\n } else {\n nextItem = getParentTreeItem(currentItem);\n }\n break;\n }\n case 'Enter':\n case ' ':\n case 'Spacebar':\n activateTreeItem(currentItem);\n nextItem = currentItem;\n break;\n default:\n handled = false;\n }\n\n if (!handled) return;\n\n event.preventDefault();\n event.stopPropagation();\n\n if (nextItem) {\n focusTreeItem(root, nextItem);\n }\n }, []);\n\n useIsomorphicLayoutEffect(() => {\n const root = rootRef.current;\n if (!root) return;\n syncTreeTabStops(root, selectedId);\n }, [children, selectedId]);\n\n React.useEffect(() => {\n const root = rootRef.current;\n if (!root || typeof MutationObserver === 'undefined') return;\n\n const observer = new MutationObserver(() => {\n syncTreeTabStops(root, selectedId);\n });\n observer.observe(root, { childList: true, subtree: true });\n\n return () => {\n observer.disconnect();\n };\n }, [selectedId]);\n\n const contextValue = React.useMemo(() => ({ selectedId, onSelect, focusItem }), [selectedId, onSelect, focusItem]);\n\n return (\n <TreeProvider value={contextValue}>\n <TreeDepthProvider depth={0}>\n <ul\n ref={handleRootRef}\n role=\"tree\"\n className={cn('flex flex-col text-xs', className)}\n onKeyDown={handleKeyDown}\n >\n {children}\n </ul>\n </TreeDepthProvider>\n </TreeProvider>\n );\n },\n);\nTreeRoot.displayName = 'Tree';\n","import { TreeFile } from './tree-file';\nimport { TreeFolder } from './tree-folder';\nimport { TreeFolderContent } from './tree-folder-content';\nimport { TreeFolderTrigger } from './tree-folder-trigger';\nimport { TreeIcon } from './tree-icon';\nimport { TreeInput } from './tree-input';\nimport { TreeLabel } from './tree-label';\nimport { TreeRoot } from './tree-root';\n\nexport const Tree = Object.assign(TreeRoot, {\n Folder: TreeFolder,\n FolderTrigger: TreeFolderTrigger,\n FolderContent: TreeFolderContent,\n File: TreeFile,\n Icon: TreeIcon,\n Label: TreeLabel,\n Input: TreeInput,\n});\n"],"names":[],"mappings":"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"}
|