@mastra/playground-ui 65.0.0-alpha.2 → 65.0.0-alpha.4
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/README.md +10 -0
- package/components.css +7 -0
- package/dist/{Avatar-98bsFrSV.js → Avatar-BjaG9NU_.js} +10 -8
- package/dist/Avatar-BjaG9NU_.js.map +1 -0
- package/dist/{Avatar-BCj8SvOb.cjs → Avatar-DM90rmwx.cjs} +10 -8
- package/dist/Avatar-DM90rmwx.cjs.map +1 -0
- package/dist/{Button-DH1aTzbs.cjs → Button-C4I05uT4.cjs} +17 -10
- package/dist/Button-C4I05uT4.cjs.map +1 -0
- package/dist/{Button-EGoajBQY.js → Button-D8a5EWJ5.js} +18 -11
- package/dist/Button-D8a5EWJ5.js.map +1 -0
- package/dist/{ErrorBoundary-DQPzT6am.js → ErrorBoundary-C6JifxpQ.js} +2 -2
- package/dist/{ErrorBoundary-DQPzT6am.js.map → ErrorBoundary-C6JifxpQ.js.map} +1 -1
- package/dist/{ErrorBoundary-CpUob9SO.cjs → ErrorBoundary-DP1JqmTo.cjs} +2 -2
- package/dist/{ErrorBoundary-CpUob9SO.cjs.map → ErrorBoundary-DP1JqmTo.cjs.map} +1 -1
- package/dist/Notice-BioYTS4b.js.map +1 -1
- package/dist/Notice-DYgIy4FO.cjs.map +1 -1
- package/dist/{activity-CsTUr5_l.js → activity-B7c_nQMn.js} +2 -2
- package/dist/activity-B7c_nQMn.js.map +1 -0
- package/dist/{activity-2tovEdIP.cjs → activity-D3iI9pYN.cjs} +2 -2
- package/dist/activity-D3iI9pYN.cjs.map +1 -0
- package/dist/{alert-dialog-B7JTnkF4.js → alert-dialog-B13NSeKN.js} +3 -3
- package/dist/{alert-dialog-B7JTnkF4.js.map → alert-dialog-B13NSeKN.js.map} +1 -1
- package/dist/{alert-dialog-B1gWLQm2.cjs → alert-dialog-DY2JJAnk.cjs} +3 -3
- package/dist/{alert-dialog-B1gWLQm2.cjs.map → alert-dialog-DY2JJAnk.cjs.map} +1 -1
- package/dist/arrival-C1hkyLHm.js.map +1 -1
- package/dist/arrival-Cvxloi0B.cjs.map +1 -1
- package/dist/{ask-user-card-DroerVbm.cjs → ask-user-card-DiFQcUzM.cjs} +2 -2
- package/dist/ask-user-card-DiFQcUzM.cjs.map +1 -0
- package/dist/{ask-user-card-BCjsjimu.js → ask-user-card-DnvW7jXS.js} +2 -2
- package/dist/{ask-user-card-BCjsjimu.js.map → ask-user-card-DnvW7jXS.js.map} +1 -1
- package/dist/{avatar-size-CNR0U-LW.js → avatar-size-BXzy28Bx.js} +4 -1
- package/dist/avatar-size-BXzy28Bx.js.map +1 -0
- package/dist/{avatar-size-DxStOo5A.cjs → avatar-size-DIFE4I8A.cjs} +4 -1
- package/dist/avatar-size-DIFE4I8A.cjs.map +1 -0
- package/dist/buttons-group.css +0 -4
- package/dist/code-DJReJPSX.cjs.map +1 -1
- package/dist/code-DLuATvYu.js.map +1 -1
- package/dist/{code-block-vpcX2sDQ.cjs → code-block-C79fiykv.cjs} +4 -4
- package/dist/{code-block-vpcX2sDQ.cjs.map → code-block-C79fiykv.cjs.map} +1 -1
- package/dist/{code-block-DIDa6lg6.js → code-block-D6A1DMv-.js} +4 -4
- package/dist/{code-block-DIDa6lg6.js.map → code-block-D6A1DMv-.js.map} +1 -1
- package/dist/{code-editor-BDxYMkGm.js → code-editor-8Fpinga4.js} +2 -2
- package/dist/{code-editor-BDxYMkGm.js.map → code-editor-8Fpinga4.js.map} +1 -1
- package/dist/{code-editor-DQuJ1XXd.cjs → code-editor-Bd-Cldem.cjs} +2 -2
- package/dist/{code-editor-DQuJ1XXd.cjs.map → code-editor-Bd-Cldem.cjs.map} +1 -1
- package/dist/{collapsible-box-B9ATVQzW.cjs → collapsible-box-CzU0OwJx.cjs} +2 -2
- package/dist/{collapsible-box-B9ATVQzW.cjs.map → collapsible-box-CzU0OwJx.cjs.map} +1 -1
- package/dist/{collapsible-box-CMBYunuM.js → collapsible-box-DotFa3hr.js} +2 -2
- package/dist/{collapsible-box-CMBYunuM.js.map → collapsible-box-DotFa3hr.js.map} +1 -1
- package/dist/{combobox-Bw13EcK0.js → combobox-BCoCVZHs.js} +7 -5
- package/dist/combobox-BCoCVZHs.js.map +1 -0
- package/dist/{combobox-BNlVCFgY.cjs → combobox-DbZAWh8q.cjs} +7 -5
- package/dist/combobox-DbZAWh8q.cjs.map +1 -0
- package/dist/{combobox-styles-Dr66ofEp.js → combobox-styles-Cens2tsx.js} +2 -2
- package/dist/{combobox-styles-Dr66ofEp.js.map → combobox-styles-Cens2tsx.js.map} +1 -1
- package/dist/{combobox-styles-BK2nGTNl.cjs → combobox-styles-Cy4rpw03.cjs} +2 -2
- package/dist/{combobox-styles-BK2nGTNl.cjs.map → combobox-styles-Cy4rpw03.cjs.map} +1 -1
- package/dist/{command-UEPxVJlE.cjs → command-Duh5C_Pm.cjs} +2 -2
- package/dist/command-Duh5C_Pm.cjs.map +1 -0
- package/dist/{command-V9rsKc7P.js → command-xIH7ZTdl.js} +2 -2
- package/dist/command-xIH7ZTdl.js.map +1 -0
- package/dist/components/AlertDialog.cjs.js +1 -1
- package/dist/components/AlertDialog.es.js +1 -1
- package/dist/components/Avatar.cjs.js +1 -1
- package/dist/components/Avatar.es.js +1 -1
- package/dist/components/Breadcrumb.cjs.js +7 -4
- package/dist/components/Breadcrumb.cjs.js.map +1 -1
- package/dist/components/Breadcrumb.es.js +7 -4
- package/dist/components/Breadcrumb.es.js.map +1 -1
- package/dist/components/Button.cjs.js +1 -1
- package/dist/components/Button.es.js +2 -2
- package/dist/components/ClampedText.cjs.js +2 -2
- package/dist/components/ClampedText.cjs.js.map +1 -1
- package/dist/components/ClampedText.es.js +2 -2
- package/dist/components/ClampedText.es.js.map +1 -1
- package/dist/components/CodeBlock.cjs.js +1 -1
- package/dist/components/CodeBlock.es.js +1 -1
- package/dist/components/CodeEditor.cjs.js +1 -1
- package/dist/components/CodeEditor.es.js +1 -1
- package/dist/components/CollapsibleBox.cjs.js +1 -1
- package/dist/components/CollapsibleBox.es.js +1 -1
- package/dist/components/Combobox.cjs.js +2 -2
- package/dist/components/Combobox.es.js +2 -2
- package/dist/components/Command.cjs.js +1 -1
- package/dist/components/Command.es.js +1 -1
- package/dist/components/CommandPalette.cjs.js +1 -1
- package/dist/components/CommandPalette.es.js +1 -1
- package/dist/components/Comment.cjs.js +2 -2
- package/dist/components/Comment.es.js +2 -2
- 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 +2 -2
- package/dist/components/DataDetailsPanel.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 +15 -17
- package/dist/components/DataList.cjs.js.map +1 -1
- package/dist/components/DataList.es.js +4 -5
- 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 +1 -1
- package/dist/components/DateRangeTimeline.es.js +1 -1
- package/dist/components/DateTimePicker.cjs.js +2 -2
- package/dist/components/DateTimePicker.es.js +2 -2
- package/dist/components/DateTimeRangePicker.cjs.js +1 -1
- package/dist/components/DateTimeRangePicker.es.js +1 -1
- package/dist/components/Dialog.cjs.js +2 -2
- package/dist/components/Dialog.es.js +2 -2
- package/dist/components/DisabledFeatureButton.cjs.js +1 -1
- package/dist/components/DisabledFeatureButton.es.js +1 -1
- package/dist/components/Drawer.cjs.js +1 -1
- package/dist/components/Drawer.es.js +1 -1
- package/dist/components/EnvironmentVariablesEditor.cjs.js +3 -3
- package/dist/components/EnvironmentVariablesEditor.cjs.js.map +1 -1
- package/dist/components/EnvironmentVariablesEditor.es.js +3 -3
- package/dist/components/EnvironmentVariablesEditor.es.js.map +1 -1
- package/dist/components/ErrorBoundary.cjs.js +1 -1
- package/dist/components/ErrorBoundary.es.js +1 -1
- package/dist/components/FilterBar.cjs.js +8 -31
- package/dist/components/FilterBar.cjs.js.map +1 -1
- package/dist/components/FilterBar.es.js +10 -33
- package/dist/components/FilterBar.es.js.map +1 -1
- package/dist/components/FormFieldBlocks.cjs.js +3 -3
- package/dist/components/FormFieldBlocks.cjs.js.map +1 -1
- package/dist/components/FormFieldBlocks.es.js +3 -3
- package/dist/components/FormFieldBlocks.es.js.map +1 -1
- package/dist/components/InputGroup.cjs.js +1 -1
- package/dist/components/InputGroup.es.js +1 -1
- package/dist/components/InputNumber.cjs.js +2 -2
- package/dist/components/InputNumber.es.js +2 -2
- package/dist/components/JSONSchemaForm.cjs.js +2 -2
- package/dist/components/JSONSchemaForm.es.js +2 -2
- package/dist/components/ListSearch.cjs.js +1 -1
- package/dist/components/ListSearch.es.js +1 -1
- package/dist/components/LogsDataList.cjs.js +5 -2
- package/dist/components/LogsDataList.cjs.js.map +1 -1
- package/dist/components/LogsDataList.es.js +5 -2
- package/dist/components/LogsDataList.es.js.map +1 -1
- package/dist/components/MarkdownRenderer.cjs.js +1 -1
- package/dist/components/MarkdownRenderer.es.js +1 -1
- package/dist/components/Message.cjs.js +1 -1
- package/dist/components/Message.es.js +1 -1
- package/dist/components/MetricsCard.cjs.js +1 -1
- package/dist/components/MetricsCard.es.js +1 -1
- package/dist/components/PrevNextNav.cjs.js +1 -1
- package/dist/components/PrevNextNav.es.js +1 -1
- package/dist/components/ProductAvatar.cjs.js +2 -1
- package/dist/components/ProductAvatar.cjs.js.map +1 -1
- package/dist/components/ProductAvatar.es.js +2 -1
- package/dist/components/ProductAvatar.es.js.map +1 -1
- package/dist/components/PropertyFilter.cjs.js +4 -4
- package/dist/components/PropertyFilter.cjs.js.map +1 -1
- package/dist/components/PropertyFilter.es.js +5 -5
- package/dist/components/PropertyFilter.es.js.map +1 -1
- package/dist/components/RuleBuilder.cjs.js +3 -2
- package/dist/components/RuleBuilder.cjs.js.map +1 -1
- package/dist/components/RuleBuilder.es.js +3 -2
- package/dist/components/RuleBuilder.es.js.map +1 -1
- package/dist/components/SavedViews.cjs.js +4 -8
- package/dist/components/SavedViews.cjs.js.map +1 -1
- package/dist/components/SavedViews.es.js +5 -9
- package/dist/components/SavedViews.es.js.map +1 -1
- package/dist/components/SearchInput.cjs.js +1 -1
- package/dist/components/SearchInput.es.js +1 -1
- package/dist/components/Select.cjs.js +1 -1
- package/dist/components/Select.es.js +1 -1
- package/dist/components/SideDialog.cjs.js +1 -1
- package/dist/components/SideDialog.es.js +1 -1
- package/dist/components/Sidebar.cjs.js +3 -3
- package/dist/components/Sidebar.cjs.js.map +1 -1
- package/dist/components/Sidebar.es.js +3 -3
- package/dist/components/Sidebar.es.js.map +1 -1
- package/dist/components/StatusIndicators.cjs.js.map +1 -1
- package/dist/components/StatusIndicators.es.js.map +1 -1
- package/dist/components/Table.cjs.js.map +1 -1
- 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 +1 -1
- package/dist/components/ThreadList.es.js +1 -1
- package/dist/components/ThreadRail.cjs.js.map +1 -1
- package/dist/components/ThreadRail.es.js.map +1 -1
- package/dist/components/Truncate.cjs.js +1 -1
- package/dist/components/Truncate.es.js +1 -1
- package/dist/components/Workflow.cjs.js +6 -6
- package/dist/components/Workflow.es.js +6 -6
- package/dist/components/ai/activity.cjs.js +4 -4
- package/dist/components/ai/activity.es.js +4 -4
- package/dist/components/ai/ask-user.cjs.js +1 -1
- package/dist/components/ai/ask-user.es.js +1 -1
- package/dist/components/ai/plan.cjs.js +1 -1
- package/dist/components/ai/plan.es.js +1 -1
- package/dist/components/ai/tool-approval.cjs.js +1 -1
- package/dist/components/ai/tool-approval.es.js +1 -1
- package/dist/components/ai/tool-call.cjs.js +4 -4
- package/dist/components/ai/tool-call.es.js +4 -4
- package/dist/composer-Bs4iyUfe.js.map +1 -1
- package/dist/composer-CDQnP3og.cjs.map +1 -1
- package/dist/context-menu-C67xhcfa.js.map +1 -1
- package/dist/context-menu-jNuzE86D.cjs.map +1 -1
- package/dist/{copy-button-Cd0keCti.cjs → copy-button-BC02oZJo.cjs} +2 -2
- package/dist/{copy-button-Cd0keCti.cjs.map → copy-button-BC02oZJo.cjs.map} +1 -1
- package/dist/{copy-button-C_M3Tu_-.js → copy-button-B_i9lwFJ.js} +2 -2
- package/dist/{copy-button-C_M3Tu_-.js.map → copy-button-B_i9lwFJ.js.map} +1 -1
- package/dist/{data-code-section-lj3PaHjc.cjs → data-code-section-BJa6NDgN.cjs} +5 -5
- package/dist/{data-code-section-lj3PaHjc.cjs.map → data-code-section-BJa6NDgN.cjs.map} +1 -1
- package/dist/{data-code-section-mpRgtM8j.js → data-code-section-Cjs-piiY.js} +5 -5
- package/dist/{data-code-section-mpRgtM8j.js.map → data-code-section-Cjs-piiY.js.map} +1 -1
- package/dist/{data-keys-and-values-1lYi60YK.cjs → data-keys-and-values-DBXIqeXt.cjs} +2 -2
- package/dist/data-keys-and-values-DBXIqeXt.cjs.map +1 -0
- package/dist/{data-keys-and-values-CHpxKsfq.js → data-keys-and-values-DHp6cHJo.js} +2 -2
- package/dist/data-keys-and-values-DHp6cHJo.js.map +1 -0
- package/dist/{data-list-top-DJh08vFA.cjs → data-list-DlXU1PLQ.cjs} +339 -13
- package/dist/data-list-DlXU1PLQ.cjs.map +1 -0
- package/dist/{data-list-top-T-mtdIUp.js → data-list-Tor18oy5.js} +332 -5
- package/dist/data-list-Tor18oy5.js.map +1 -0
- package/dist/{data-list-skeleton-bNfITSHs.js → data-list-skeleton-CXUB-u3p.js} +2 -2
- package/dist/{data-list-skeleton-bNfITSHs.js.map → data-list-skeleton-CXUB-u3p.js.map} +1 -1
- package/dist/{data-list-skeleton-sdcaabdX.cjs → data-list-skeleton-DY0F40WQ.cjs} +6 -6
- package/dist/{data-list-skeleton-sdcaabdX.cjs.map → data-list-skeleton-DY0F40WQ.cjs.map} +1 -1
- package/dist/{data-panel-BkfjzriB.cjs → data-panel-DGNV14pm.cjs} +20 -9
- package/dist/data-panel-DGNV14pm.cjs.map +1 -0
- package/dist/{data-panel-CMkR6Avv.js → data-panel-DjtnX70w.js} +20 -9
- package/dist/data-panel-DjtnX70w.js.map +1 -0
- package/dist/{date-time-range-picker-BjQVCVUM.cjs → date-time-range-picker-CXGab8Nj.cjs} +3 -3
- package/dist/{date-time-range-picker-BjQVCVUM.cjs.map → date-time-range-picker-CXGab8Nj.cjs.map} +1 -1
- package/dist/{date-time-range-picker-D-EECKzz.js → date-time-range-picker-CcnDMZJu.js} +3 -3
- package/dist/{date-time-range-picker-D-EECKzz.js.map → date-time-range-picker-CcnDMZJu.js.map} +1 -1
- package/dist/{dialog-j2e95YNV.js → dialog-AzCRnEo3.js} +3 -3
- package/dist/{dialog-j2e95YNV.js.map → dialog-AzCRnEo3.js.map} +1 -1
- package/dist/{dialog-BMUfQ9XU.cjs → dialog-SSeOqRnH.cjs} +3 -3
- package/dist/{dialog-BMUfQ9XU.cjs.map → dialog-SSeOqRnH.cjs.map} +1 -1
- package/dist/{dialog-action-CmFDNyZX.cjs → dialog-action-Caa-pb85.cjs} +3 -3
- package/dist/{dialog-action-CmFDNyZX.cjs.map → dialog-action-Caa-pb85.cjs.map} +1 -1
- package/dist/{dialog-action-zKqvuroE.js → dialog-action-DykMOK2W.js} +3 -3
- package/dist/{dialog-action-zKqvuroE.js.map → dialog-action-DykMOK2W.js.map} +1 -1
- package/dist/domains/auth/components/session-expired.cjs.js +1 -1
- package/dist/domains/auth/components/session-expired.es.js +1 -1
- package/dist/domains/chat/attachments/attachment-preview-dialog.cjs.js +2 -2
- package/dist/domains/chat/attachments/attachment-preview-dialog.es.js +2 -2
- package/dist/domains/chat/attachments/composer-attachment.cjs.js +1 -1
- package/dist/domains/chat/attachments/composer-attachment.es.js +1 -1
- package/dist/domains/chat/components/badge-wrapper.cjs.js +1 -1
- package/dist/domains/chat/components/badge-wrapper.es.js +1 -1
- package/dist/domains/chat/components/network-choice-metadata-dialog.cjs.js +3 -3
- package/dist/domains/chat/components/network-choice-metadata-dialog.es.js +3 -3
- package/dist/domains/chat/messages/assistant-message-actions.cjs.js +2 -2
- package/dist/domains/chat/messages/assistant-message-actions.es.js +2 -2
- package/dist/domains/chat/messages/dataset-save-action.cjs.js +5 -5
- package/dist/domains/chat/messages/dataset-save-action.es.js +5 -5
- package/dist/domains/chat/messages/message-row.cjs.js +4 -4
- package/dist/domains/chat/messages/message-row.es.js +4 -4
- package/dist/domains/chat/messages/notification-signal-notice.cjs.js +1 -1
- package/dist/domains/chat/messages/notification-signal-notice.es.js +1 -1
- package/dist/domains/chat/messages/renderers/message-text.cjs.js +1 -1
- package/dist/domains/chat/messages/renderers/message-text.cjs.js.map +1 -1
- package/dist/domains/chat/messages/renderers/message-text.es.js +1 -1
- package/dist/domains/chat/messages/renderers/message-text.es.js.map +1 -1
- package/dist/domains/chat/messages/renderers/reasoning-part-renderer.cjs.js +1 -1
- package/dist/domains/chat/messages/renderers/reasoning-part-renderer.es.js +1 -1
- package/dist/domains/chat/messages/signal-badge.cjs.js +1 -1
- package/dist/domains/chat/messages/signal-badge.es.js +1 -1
- package/dist/domains/chat/messages/skill-message.cjs.js +3 -3
- package/dist/domains/chat/messages/skill-message.es.js +3 -3
- package/dist/domains/chat/messages/system-reminder-badge.cjs.js +1 -1
- package/dist/domains/chat/messages/system-reminder-badge.es.js +1 -1
- package/dist/domains/chat/om/om-parts-converter.cjs.js.map +1 -1
- package/dist/domains/chat/om/om-parts-converter.es.js.map +1 -1
- package/dist/domains/chat/tools/badges/agent-badge-wrapper.cjs.js +1 -1
- package/dist/domains/chat/tools/badges/agent-badge-wrapper.es.js +1 -1
- package/dist/domains/chat/tools/badges/agent-badge.cjs.js +4 -4
- package/dist/domains/chat/tools/badges/agent-badge.es.js +4 -4
- package/dist/domains/chat/tools/badges/ask-user-badge.cjs.js +1 -1
- package/dist/domains/chat/tools/badges/ask-user-badge.es.js +1 -1
- package/dist/domains/chat/tools/badges/background-task-metadata-dialog.cjs.js +3 -3
- package/dist/domains/chat/tools/badges/background-task-metadata-dialog.cjs.js.map +1 -1
- package/dist/domains/chat/tools/badges/background-task-metadata-dialog.es.js +3 -3
- package/dist/domains/chat/tools/badges/background-task-metadata-dialog.es.js.map +1 -1
- package/dist/domains/chat/tools/badges/code-mode-badge.cjs.js +2 -2
- package/dist/domains/chat/tools/badges/code-mode-badge.es.js +2 -2
- package/dist/domains/chat/tools/badges/file-tree-badge.cjs.js +2 -2
- package/dist/domains/chat/tools/badges/file-tree-badge.es.js +2 -2
- package/dist/domains/chat/tools/badges/observation-marker-badge.cjs.js +2 -2
- package/dist/domains/chat/tools/badges/observation-marker-badge.es.js +2 -2
- package/dist/domains/chat/tools/badges/observation-marker-details.cjs.js +2 -2
- package/dist/domains/chat/tools/badges/observation-marker-details.es.js +2 -2
- package/dist/domains/chat/tools/badges/observation-renderer.cjs.js +1 -1
- package/dist/domains/chat/tools/badges/observation-renderer.es.js +1 -1
- package/dist/domains/chat/tools/badges/sandbox-execution-badge.cjs.js +1 -1
- package/dist/domains/chat/tools/badges/sandbox-execution-badge.es.js +1 -1
- package/dist/domains/chat/tools/badges/tool-approval-badge.cjs.js +1 -1
- package/dist/domains/chat/tools/badges/tool-approval-badge.es.js +1 -1
- package/dist/domains/chat/tools/badges/tool-badge.cjs.js +3 -3
- package/dist/domains/chat/tools/badges/tool-badge.es.js +3 -3
- package/dist/domains/chat/tools/badges/workflow-badge.cjs.js +6 -3
- package/dist/domains/chat/tools/badges/workflow-badge.cjs.js.map +1 -1
- package/dist/domains/chat/tools/badges/workflow-badge.es.js +6 -3
- package/dist/domains/chat/tools/badges/workflow-badge.es.js.map +1 -1
- package/dist/domains/chat/tools/submit-plan-tool.cjs.js +2 -2
- package/dist/domains/chat/tools/submit-plan-tool.es.js +2 -2
- package/dist/domains/chat/tools/tool-card.cjs.js +1 -1
- package/dist/domains/chat/tools/tool-card.es.js +1 -1
- package/dist/domains/datasets/components/save-as-dataset-item-dialog.cjs.js +4 -4
- package/dist/domains/datasets/components/save-as-dataset-item-dialog.es.js +4 -4
- package/dist/domains/logs/components/log-data-panel.cjs.js +4 -4
- package/dist/domains/logs/components/log-data-panel.es.js +4 -4
- package/dist/domains/logs/components/logs-list-view.cjs.js +3 -2
- package/dist/domains/logs/components/logs-list-view.cjs.js.map +1 -1
- package/dist/domains/logs/components/logs-list-view.es.js +3 -2
- package/dist/domains/logs/components/logs-list-view.es.js.map +1 -1
- package/dist/domains/logs/components/logs-toolbar.cjs.js +1 -1
- package/dist/domains/logs/components/logs-toolbar.es.js +1 -1
- package/dist/domains/logs/components/no-logs-info.cjs.js +1 -1
- package/dist/domains/logs/components/no-logs-info.es.js +1 -1
- package/dist/domains/mcps/components/mcp-app-viewer.cjs.js.map +1 -1
- package/dist/domains/mcps/components/mcp-app-viewer.es.js.map +1 -1
- package/dist/domains/memory/components/flame-graph.cjs.js +1 -1
- package/dist/domains/memory/components/flame-graph.es.js +1 -1
- package/dist/domains/memory/components/memory-studio-panel.cjs.js +1 -1
- package/dist/domains/memory/components/memory-studio-panel.es.js +1 -1
- package/dist/domains/metrics/components/agent-runs-card.cjs.js +1 -1
- package/dist/domains/metrics/components/agent-runs-card.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/chart-area.cjs.js +1 -1
- package/dist/domains/metrics/components/chart-area.es.js +1 -1
- package/dist/domains/metrics/components/chart-card-error.cjs.js +1 -1
- package/dist/domains/metrics/components/chart-card-error.es.js +1 -1
- package/dist/domains/metrics/components/chart-card.cjs.js +1 -1
- package/dist/domains/metrics/components/chart-card.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/failure-rate-card.cjs.js +1 -1
- package/dist/domains/metrics/components/failure-rate-card.es.js +1 -1
- package/dist/domains/metrics/components/latency-card.cjs.js +1 -1
- package/dist/domains/metrics/components/latency-card.es.js +1 -1
- package/dist/domains/metrics/components/scores-card.cjs.js +1 -1
- package/dist/domains/metrics/components/scores-card.es.js +1 -1
- package/dist/domains/metrics/components/token-usage-card.cjs.js +1 -1
- package/dist/domains/metrics/components/token-usage-card.es.js +1 -1
- package/dist/domains/metrics/components/trace-volume-card.cjs.js +1 -1
- package/dist/domains/metrics/components/trace-volume-card.es.js +1 -1
- package/dist/domains/metrics/components/usage-card.cjs.js +1 -1
- package/dist/domains/metrics/components/usage-card.es.js +1 -1
- package/dist/domains/observability/components/add-trace-mocks-to-item-dialog.cjs.js +4 -4
- package/dist/domains/observability/components/add-trace-mocks-to-item-dialog.es.js +4 -4
- package/dist/domains/scores/components/score-data-panel.cjs.js +3 -3
- package/dist/domains/scores/components/score-data-panel.es.js +3 -3
- package/dist/domains/scores/components/span-scoring.cjs.js +3 -3
- package/dist/domains/scores/components/span-scoring.es.js +3 -3
- package/dist/domains/scores/components/trace-scores-tab.cjs.js +2 -1
- package/dist/domains/scores/components/trace-scores-tab.cjs.js.map +1 -1
- package/dist/domains/scores/components/trace-scores-tab.es.js +2 -1
- package/dist/domains/scores/components/trace-scores-tab.es.js.map +1 -1
- package/dist/domains/traces/components/feedback-thread.cjs.js +4 -4
- package/dist/domains/traces/components/feedback-thread.cjs.js.map +1 -1
- package/dist/domains/traces/components/feedback-thread.es.js +4 -4
- package/dist/domains/traces/components/feedback-thread.es.js.map +1 -1
- package/dist/domains/traces/components/shared.cjs.js +4 -3
- package/dist/domains/traces/components/shared.cjs.js.map +1 -1
- package/dist/domains/traces/components/shared.es.js +5 -4
- package/dist/domains/traces/components/shared.es.js.map +1 -1
- package/dist/domains/traces/components/span-data-panel-view.cjs.js +4 -4
- 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 +4 -4
- package/dist/domains/traces/components/span-data-panel-view.es.js.map +1 -1
- package/dist/domains/traces/components/span-details-view.cjs.js +1 -1
- package/dist/domains/traces/components/span-details-view.es.js +1 -1
- package/dist/domains/traces/components/span-payload/span-error-renderer.cjs.js +2 -2
- package/dist/domains/traces/components/span-payload/span-error-renderer.es.js +2 -2
- package/dist/domains/traces/components/span-payload/span-input-renderers.cjs.js +2 -2
- package/dist/domains/traces/components/span-payload/span-input-renderers.es.js +2 -2
- package/dist/domains/traces/components/span-payload/span-output-renderers.cjs.js +3 -3
- package/dist/domains/traces/components/span-payload/span-output-renderers.es.js +3 -3
- package/dist/domains/traces/components/span-payload/span-payload-messages.cjs.js +2 -2
- package/dist/domains/traces/components/span-payload/span-payload-messages.es.js +2 -2
- package/dist/domains/traces/components/span-payload/span-payload-primitives.cjs.js +2 -2
- package/dist/domains/traces/components/span-payload/span-payload-primitives.es.js +2 -2
- package/dist/domains/traces/components/span-payload/span-payload-processor.cjs.js +2 -2
- package/dist/domains/traces/components/span-payload/span-payload-processor.es.js +2 -2
- package/dist/domains/traces/components/span-payload/span-payload-registry.cjs.js.map +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-registry.es.js.map +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-section.cjs.js +3 -3
- package/dist/domains/traces/components/span-payload/span-payload-section.es.js +3 -3
- package/dist/domains/traces/components/span-payload/span-payload-tool.cjs.js +2 -2
- package/dist/domains/traces/components/span-payload/span-payload-tool.es.js +2 -2
- package/dist/domains/traces/components/span-payload/span-processor-attributes.cjs.js +2 -2
- package/dist/domains/traces/components/span-payload/span-processor-attributes.es.js +2 -2
- package/dist/domains/traces/components/span-rows.cjs.js +5 -0
- package/dist/domains/traces/components/span-rows.cjs.js.map +1 -1
- package/dist/domains/traces/components/span-rows.es.js +5 -0
- package/dist/domains/traces/components/span-rows.es.js.map +1 -1
- package/dist/domains/traces/components/span-summary-description.cjs.js +1 -1
- package/dist/domains/traces/components/span-summary-description.es.js +1 -1
- package/dist/domains/traces/components/span-timeline-row.cjs.js +34 -28
- package/dist/domains/traces/components/span-timeline-row.cjs.js.map +1 -1
- package/dist/domains/traces/components/span-timeline-row.es.js +34 -28
- package/dist/domains/traces/components/span-timeline-row.es.js.map +1 -1
- package/dist/domains/traces/components/span-timing-hover-card.cjs.js +1 -1
- package/dist/domains/traces/components/span-timing-hover-card.es.js +1 -1
- package/dist/domains/traces/components/span-token-usage.cjs.js +1 -1
- package/dist/domains/traces/components/span-token-usage.es.js +1 -1
- package/dist/domains/traces/components/span-tree-rail.cjs.js +50 -0
- package/dist/domains/traces/components/span-tree-rail.cjs.js.map +1 -0
- package/dist/domains/traces/components/span-tree-rail.d.ts +2 -0
- package/dist/domains/traces/components/span-tree-rail.es.js +42 -0
- package/dist/domains/traces/components/span-tree-rail.es.js.map +1 -0
- package/dist/domains/traces/components/span-tree-row.cjs.js +2 -2
- package/dist/domains/traces/components/span-tree-row.cjs.js.map +1 -1
- package/dist/domains/traces/components/span-tree-row.es.js +2 -2
- package/dist/domains/traces/components/span-tree-row.es.js.map +1 -1
- package/dist/domains/traces/components/span-type-badge.cjs.js +29 -0
- package/dist/domains/traces/components/span-type-badge.cjs.js.map +1 -0
- package/dist/domains/traces/components/span-type-badge.d.ts +2 -0
- package/dist/domains/traces/components/span-type-badge.es.js +25 -0
- package/dist/domains/traces/components/span-type-badge.es.js.map +1 -0
- package/dist/domains/traces/components/span-type-legend.cjs.js +2 -2
- package/dist/domains/traces/components/span-type-legend.cjs.js.map +1 -1
- package/dist/domains/traces/components/span-type-legend.es.js +2 -2
- package/dist/domains/traces/components/span-type-legend.es.js.map +1 -1
- package/dist/domains/traces/components/thread-trace/thread-trace-details.cjs.js +1 -1
- package/dist/domains/traces/components/thread-trace/thread-trace-details.es.js +1 -1
- package/dist/domains/traces/components/thread-trace/thread-trace-messages.cjs.js +1 -1
- package/dist/domains/traces/components/thread-trace/thread-trace-messages.es.js +1 -1
- package/dist/domains/traces/components/thread-trace/thread-trace-row.cjs.js.map +1 -1
- package/dist/domains/traces/components/thread-trace/thread-trace-row.es.js.map +1 -1
- package/dist/domains/traces/components/thread-trace/thread-trace-spans.cjs.js +2 -2
- package/dist/domains/traces/components/thread-trace/thread-trace-spans.es.js +2 -2
- package/dist/domains/traces/components/thread-view-by-trace.cjs.js +2 -1
- package/dist/domains/traces/components/thread-view-by-trace.cjs.js.map +1 -1
- package/dist/domains/traces/components/thread-view-by-trace.es.js +2 -1
- package/dist/domains/traces/components/thread-view-by-trace.es.js.map +1 -1
- package/dist/domains/traces/components/timeline-name-col.cjs.js +53 -27
- package/dist/domains/traces/components/timeline-name-col.cjs.js.map +1 -1
- package/dist/domains/traces/components/timeline-name-col.es.js +54 -28
- package/dist/domains/traces/components/timeline-name-col.es.js.map +1 -1
- package/dist/domains/traces/components/timeline-structure-sign.cjs.js +23 -14
- package/dist/domains/traces/components/timeline-structure-sign.cjs.js.map +1 -1
- package/dist/domains/traces/components/timeline-structure-sign.es.js +24 -15
- package/dist/domains/traces/components/timeline-structure-sign.es.js.map +1 -1
- package/dist/domains/traces/components/trace-columns-menu.cjs.js +4 -4
- package/dist/domains/traces/components/trace-columns-menu.cjs.js.map +1 -1
- package/dist/domains/traces/components/trace-columns-menu.es.js +4 -4
- package/dist/domains/traces/components/trace-columns-menu.es.js.map +1 -1
- package/dist/domains/traces/components/trace-data-panel-view.cjs.js +32 -5
- package/dist/domains/traces/components/trace-data-panel-view.cjs.js.map +1 -1
- package/dist/domains/traces/components/trace-data-panel-view.es.js +32 -5
- package/dist/domains/traces/components/trace-data-panel-view.es.js.map +1 -1
- package/dist/domains/traces/components/trace-data-panel.cjs.js +5 -2
- package/dist/domains/traces/components/trace-data-panel.cjs.js.map +1 -1
- package/dist/domains/traces/components/trace-data-panel.es.js +5 -2
- package/dist/domains/traces/components/trace-data-panel.es.js.map +1 -1
- package/dist/domains/traces/components/trace-error-cell.cjs.js +35 -0
- package/dist/domains/traces/components/trace-error-cell.cjs.js.map +1 -0
- package/dist/domains/traces/components/trace-error-cell.d.ts +2 -0
- package/dist/domains/traces/components/trace-error-cell.es.js +31 -0
- package/dist/domains/traces/components/trace-error-cell.es.js.map +1 -0
- package/dist/domains/traces/components/trace-error-details.cjs.js +22 -0
- package/dist/domains/traces/components/trace-error-details.cjs.js.map +1 -0
- package/dist/domains/traces/components/trace-error-details.d.ts +2 -0
- package/dist/domains/traces/components/trace-error-details.es.js +18 -0
- package/dist/domains/traces/components/trace-error-details.es.js.map +1 -0
- package/dist/domains/traces/components/trace-error-summary.cjs.js +31 -0
- package/dist/domains/traces/components/trace-error-summary.cjs.js.map +1 -0
- package/dist/domains/traces/components/trace-error-summary.d.ts +2 -0
- package/dist/domains/traces/components/trace-error-summary.es.js +27 -0
- package/dist/domains/traces/components/trace-error-summary.es.js.map +1 -0
- package/dist/domains/traces/components/trace-id-button.cjs.js +1 -1
- package/dist/domains/traces/components/trace-id-button.es.js +1 -1
- package/dist/domains/traces/components/trace-span-panel.cjs.js +1 -1
- package/dist/domains/traces/components/trace-span-panel.es.js +1 -1
- package/dist/domains/traces/components/trace-span-tree-skeleton.cjs.js +7 -7
- package/dist/domains/traces/components/trace-span-tree-skeleton.cjs.js.map +1 -1
- package/dist/domains/traces/components/trace-span-tree-skeleton.es.js +7 -7
- package/dist/domains/traces/components/trace-span-tree-skeleton.es.js.map +1 -1
- package/dist/domains/traces/components/trace-span-tree.cjs.js +1 -2
- package/dist/domains/traces/components/trace-span-tree.cjs.js.map +1 -1
- package/dist/domains/traces/components/trace-span-tree.es.js +2 -3
- package/dist/domains/traces/components/trace-span-tree.es.js.map +1 -1
- package/dist/domains/traces/components/trace-summary-description.cjs.js +1 -1
- package/dist/domains/traces/components/trace-summary-description.es.js +1 -1
- package/dist/domains/traces/components/trace-thread-item-view.cjs.js +1 -1
- package/dist/domains/traces/components/trace-thread-item-view.es.js +1 -1
- package/dist/domains/traces/components/trace-thread-panel.cjs.js +1 -1
- package/dist/domains/traces/components/trace-thread-panel.es.js +1 -1
- package/dist/domains/traces/components/trace-time-range-chip.cjs.js +2 -2
- package/dist/domains/traces/components/trace-time-range-chip.es.js +2 -2
- package/dist/domains/traces/components/traces-list-mode-toggle.cjs.js +1 -1
- package/dist/domains/traces/components/traces-list-mode-toggle.es.js +1 -1
- package/dist/domains/traces/components/traces-list-view.cjs.js +10 -7
- package/dist/domains/traces/components/traces-list-view.cjs.js.map +1 -1
- package/dist/domains/traces/components/traces-list-view.es.js +9 -6
- package/dist/domains/traces/components/traces-list-view.es.js.map +1 -1
- package/dist/domains/traces/components/traces-page-skeleton.cjs.js +4 -1
- package/dist/domains/traces/components/traces-page-skeleton.cjs.js.map +1 -1
- package/dist/domains/traces/components/traces-page-skeleton.es.js +4 -1
- package/dist/domains/traces/components/traces-page-skeleton.es.js.map +1 -1
- package/dist/domains/traces/hooks/use-trace-list-navigation.cjs.js.map +1 -1
- package/dist/domains/traces/hooks/use-trace-list-navigation.es.js.map +1 -1
- package/dist/domains/traces/utils/flatten-to-search-text.cjs.js.map +1 -1
- package/dist/domains/traces/utils/flatten-to-search-text.es.js.map +1 -1
- package/dist/domains/workflows/components/workflow-combobox.cjs.js +1 -1
- package/dist/domains/workflows/components/workflow-combobox.es.js +1 -1
- package/dist/domains/workflows/components/workflow-information.cjs.js +1 -1
- package/dist/domains/workflows/components/workflow-information.es.js +1 -1
- package/dist/domains/workflows/components/workflow-step-detail.cjs.js +3 -3
- package/dist/domains/workflows/components/workflow-step-detail.es.js +3 -3
- package/dist/domains/workflows/components/workflows-list/no-workflows-info.cjs.js +1 -1
- package/dist/domains/workflows/components/workflows-list/no-workflows-info.es.js +1 -1
- package/dist/domains/workflows/components/workflows-list/workflows-list.cjs.js +2 -2
- package/dist/domains/workflows/components/workflows-list/workflows-list.es.js +2 -2
- package/dist/domains/workflows/runs/workflow-run-list.cjs.js +2 -2
- package/dist/domains/workflows/runs/workflow-run-list.es.js +2 -2
- package/dist/domains/workflows/workflow/data/workflow-data-button.cjs.js +1 -1
- package/dist/domains/workflows/workflow/data/workflow-data-button.es.js +1 -1
- package/dist/domains/workflows/workflow/data/workflow-data-inspector.cjs.js +2 -2
- package/dist/domains/workflows/workflow/data/workflow-data-inspector.es.js +2 -2
- package/dist/domains/workflows/workflow/input/workflow-json-input.cjs.js +1 -1
- package/dist/domains/workflows/workflow/input/workflow-json-input.es.js +1 -1
- package/dist/domains/workflows/workflow/input/workflow-processor-input.cjs.js +1 -1
- package/dist/domains/workflows/workflow/input/workflow-processor-input.es.js +1 -1
- package/dist/domains/workflows/workflow/use-workflow-graph-runtime.cjs.js +2 -2
- package/dist/domains/workflows/workflow/use-workflow-graph-runtime.es.js +2 -2
- package/dist/domains/workflows/workflow/workflow-body-graph.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-body-graph.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-cancel-button.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-cancel-button.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-data-edge.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-data-edge.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-debug-step-controls.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-debug-step-controls.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-graph-boundary.cjs.js +3 -3
- package/dist/domains/workflows/workflow/workflow-graph-boundary.es.js +3 -3
- package/dist/domains/workflows/workflow/workflow-graph-inner.cjs.js +2 -2
- package/dist/domains/workflows/workflow/workflow-graph-inner.es.js +2 -2
- package/dist/domains/workflows/workflow/workflow-graph-node.cjs.js +2 -2
- package/dist/domains/workflows/workflow/workflow-graph-node.es.js +2 -2
- package/dist/domains/workflows/workflow/workflow-input-data.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-input-data.cjs.js.map +1 -1
- package/dist/domains/workflows/workflow/workflow-input-data.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-input-data.es.js.map +1 -1
- package/dist/domains/workflows/workflow/workflow-map-config-dialog.cjs.js +3 -3
- package/dist/domains/workflows/workflow/workflow-map-config-dialog.es.js +3 -3
- package/dist/domains/workflows/workflow/workflow-nested-graph.cjs.js +3 -3
- package/dist/domains/workflows/workflow/workflow-nested-graph.es.js +3 -3
- package/dist/domains/workflows/workflow/workflow-run-data.cjs.js +2 -2
- package/dist/domains/workflows/workflow/workflow-run-data.es.js +2 -2
- package/dist/domains/workflows/workflow/workflow-run-header.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-run-header.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-status.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-status.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-step-action-bar.cjs.js +3 -3
- package/dist/domains/workflows/workflow/workflow-step-action-bar.es.js +3 -3
- package/dist/domains/workflows/workflow/workflow-suspended-steps.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-suspended-steps.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-time-travel-form.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-time-travel-form.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-timeline-row.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-timeline-row.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-timeline.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-timeline.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-trigger-form.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-trigger-form.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-trigger-header.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-trigger-header.es.js +1 -1
- package/dist/domains/workspace/components/workspace-active-file.cjs.js +1 -1
- package/dist/domains/workspace/components/workspace-active-file.es.js +1 -1
- package/dist/domains/workspace/components/workspace-add-skill-dialog.cjs.js +5 -5
- package/dist/domains/workspace/components/workspace-add-skill-dialog.es.js +5 -5
- package/dist/domains/workspace/components/workspace-add-skill.cjs.js +1 -1
- package/dist/domains/workspace/components/workspace-add-skill.es.js +1 -1
- package/dist/domains/workspace/components/workspace-create-directory.cjs.js +2 -2
- package/dist/domains/workspace/components/workspace-create-directory.es.js +2 -2
- package/dist/domains/workspace/components/workspace-markdown-preview.cjs.js +2 -2
- package/dist/domains/workspace/components/workspace-markdown-preview.es.js +2 -2
- package/dist/domains/workspace/components/workspace-search.cjs.js +1 -1
- package/dist/domains/workspace/components/workspace-search.es.js +1 -1
- package/dist/domains/workspace/components/workspace-tree.cjs.js +2 -2
- package/dist/domains/workspace/components/workspace-tree.es.js +2 -2
- package/dist/{drawer-DROYPMUm.cjs → drawer-DdTU-nBR.cjs} +2 -2
- package/dist/{drawer-DROYPMUm.cjs.map → drawer-DdTU-nBR.cjs.map} +1 -1
- package/dist/{drawer-C-8E9yHN.js → drawer-mj-G7-Tu.js} +2 -2
- package/dist/{drawer-C-8E9yHN.js.map → drawer-mj-G7-Tu.js.map} +1 -1
- package/dist/dropdown-menu-CQ_48tVI.js.map +1 -1
- package/dist/dropdown-menu-CsynT1aD.cjs.map +1 -1
- package/dist/ee/signals/components/entity-index-list.cjs.js +3 -1
- package/dist/ee/signals/components/entity-index-list.cjs.js.map +1 -1
- package/dist/ee/signals/components/entity-index-list.es.js +3 -1
- package/dist/ee/signals/components/entity-index-list.es.js.map +1 -1
- package/dist/ee/signals/components/signals-empty-state.cjs.js +1 -1
- package/dist/ee/signals/components/signals-empty-state.es.js +1 -1
- package/dist/ee/signals/components/trace-intelligence-entity-detail.cjs.js.map +1 -1
- package/dist/ee/signals/components/trace-intelligence-entity-detail.es.js.map +1 -1
- package/dist/ee/signals/components/trace-intelligence-entity-index.cjs.js +6 -4
- package/dist/ee/signals/components/trace-intelligence-entity-index.cjs.js.map +1 -1
- package/dist/ee/signals/components/trace-intelligence-entity-index.es.js +6 -4
- package/dist/ee/signals/components/trace-intelligence-entity-index.es.js.map +1 -1
- package/dist/ee/signals/examples-pager.cjs.js +1 -1
- package/dist/ee/signals/examples-pager.es.js +1 -1
- package/dist/ee/signals/noise-detail-panel.cjs.js +1 -1
- package/dist/ee/signals/noise-detail-panel.es.js +1 -1
- package/dist/ee/signals/settings/signal-definition-form-dialog.cjs.js +2 -2
- package/dist/ee/signals/settings/signal-definition-form-dialog.es.js +2 -2
- package/dist/ee/signals/settings/trace-signal-settings.cjs.js +1 -1
- package/dist/ee/signals/settings/trace-signal-settings.es.js +1 -1
- package/dist/ee/signals/signals-error-state.cjs.js +1 -1
- package/dist/ee/signals/signals-error-state.es.js +1 -1
- package/dist/ee/signals/snapshot-timeline.cjs.js +1 -1
- package/dist/ee/signals/snapshot-timeline.es.js +1 -1
- package/dist/ee/signals/theme-detail-panel.cjs.js +1 -1
- package/dist/ee/signals/theme-detail-panel.es.js +1 -1
- package/dist/ee/signals/theme-filter-banner.cjs.js +1 -1
- package/dist/ee/signals/theme-filter-banner.es.js +1 -1
- package/dist/ee/signals/trace-insight-view.cjs.js +1 -1
- package/dist/ee/signals/trace-insight-view.es.js +1 -1
- package/dist/ee/signals/trace-intelligence-provider.cjs.js.map +1 -1
- package/dist/ee/signals/trace-intelligence-provider.es.js.map +1 -1
- package/dist/ee/signals/view-mode-tab.cjs.js +1 -1
- package/dist/ee/signals/view-mode-tab.es.js +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/{field-error-id-Dbe6IInA.cjs → field-error-id-0yYYU0ar.cjs} +2 -2
- package/dist/{field-error-id-Dbe6IInA.cjs.map → field-error-id-0yYYU0ar.cjs.map} +1 -1
- package/dist/{field-error-id-Sqhk00e4.js → field-error-id-CdzuQK5c.js} +2 -2
- package/dist/{field-error-id-Sqhk00e4.js.map → field-error-id-CdzuQK5c.js.map} +1 -1
- package/dist/{filter-bar-chip-BarAq1S2.js → filter-bar-chip-C9CXOudu.js} +3 -3
- package/dist/filter-bar-chip-C9CXOudu.js.map +1 -0
- package/dist/{filter-bar-chip-BJJ6ytJ4.cjs → filter-bar-chip-DgvuQv6c.cjs} +3 -3
- package/dist/filter-bar-chip-DgvuQv6c.cjs.map +1 -0
- package/dist/hooks/use-environment-variables-editor.cjs.js.map +1 -1
- package/dist/hooks/use-environment-variables-editor.es.js.map +1 -1
- package/dist/hooks/use-fluid-hover.cjs.js.map +1 -1
- package/dist/hooks/use-fluid-hover.es.js.map +1 -1
- package/dist/icons/Icon.cjs.js.map +1 -1
- package/dist/icons/Icon.es.js.map +1 -1
- package/dist/icons/SkillIcon.cjs.js.map +1 -1
- package/dist/icons/SkillIcon.es.js.map +1 -1
- package/dist/icons/icon-size-classes.cjs.js +4 -4
- package/dist/icons/icon-size-classes.cjs.js.map +1 -1
- package/dist/icons/icon-size-classes.es.js +4 -4
- package/dist/icons/icon-size-classes.es.js.map +1 -1
- package/dist/{input-group-CiBbTaPP.js → input-group-BAg6iSIe.js} +2 -2
- package/dist/{input-group-CiBbTaPP.js.map → input-group-BAg6iSIe.js.map} +1 -1
- package/dist/{input-group-DSW5WoSU.cjs → input-group-DRXUthxe.cjs} +2 -2
- package/dist/{input-group-DSW5WoSU.cjs.map → input-group-DRXUthxe.cjs.map} +1 -1
- package/dist/keyboard/keyboard-dispatcher.cjs.js +2 -4
- package/dist/keyboard/keyboard-dispatcher.cjs.js.map +1 -1
- package/dist/keyboard/keyboard-dispatcher.es.js +2 -4
- package/dist/keyboard/keyboard-dispatcher.es.js.map +1 -1
- package/dist/keyboard/keyboard-shortcuts-context.cjs.js.map +1 -1
- package/dist/keyboard/keyboard-shortcuts-context.es.js.map +1 -1
- package/dist/keyboard/use-keydown.cjs.js +2 -0
- package/dist/keyboard/use-keydown.cjs.js.map +1 -1
- package/dist/keyboard/use-keydown.es.js +2 -0
- package/dist/keyboard/use-keydown.es.js.map +1 -1
- package/dist/layout/tabbed-container.cjs.js +4 -4
- package/dist/layout/tabbed-container.es.js +4 -4
- package/dist/lib/form/components/array-element-wrapper.cjs.js +1 -1
- package/dist/lib/form/components/array-element-wrapper.es.js +1 -1
- package/dist/lib/form/components/array-wrapper.cjs.js +1 -1
- package/dist/lib/form/components/array-wrapper.es.js +1 -1
- package/dist/lib/form/components/date-field.cjs.js +1 -1
- package/dist/lib/form/components/date-field.es.js +1 -1
- package/dist/lib/form/components/form-submit-row.cjs.js +1 -1
- package/dist/lib/form/components/form-submit-row.es.js +1 -1
- package/dist/lib/form/components/record-field.cjs.js +1 -1
- package/dist/lib/form/components/record-field.es.js +1 -1
- package/dist/lib/form/components/select-field.cjs.js +1 -1
- package/dist/lib/form/components/select-field.es.js +1 -1
- package/dist/lib/form/components/submit-button.cjs.js +1 -1
- package/dist/lib/form/components/submit-button.es.js +1 -1
- package/dist/lib/form/zod-provider.cjs.js.map +1 -1
- package/dist/lib/form/zod-provider.es.js.map +1 -1
- package/dist/{list-search-D3I6xt0B.js → list-search-ByJdIxIh.js} +2 -2
- package/dist/{list-search-D3I6xt0B.js.map → list-search-ByJdIxIh.js.map} +1 -1
- package/dist/{list-search-DHiQ1-O6.cjs → list-search-DNJVeHmK.cjs} +2 -2
- package/dist/{list-search-DHiQ1-O6.cjs.map → list-search-DNJVeHmK.cjs.map} +1 -1
- package/dist/{logs-data-list-Cb85LPcT.js → logs-data-list-CGerYgSd.js} +2 -3
- package/dist/{logs-data-list-Cb85LPcT.js.map → logs-data-list-CGerYgSd.js.map} +1 -1
- package/dist/{logs-data-list-DlQxxrNw.cjs → logs-data-list-DEZuSjqt.cjs} +21 -22
- package/dist/{logs-data-list-DlQxxrNw.cjs.map → logs-data-list-DEZuSjqt.cjs.map} +1 -1
- package/dist/{markdown-renderer-HIfFphpI.cjs → markdown-renderer-BcpwvSl9.cjs} +3 -3
- package/dist/{markdown-renderer-HIfFphpI.cjs.map → markdown-renderer-BcpwvSl9.cjs.map} +1 -1
- package/dist/{markdown-renderer-BYxWiHRj.js → markdown-renderer-CHLpv5n5.js} +3 -3
- package/dist/{markdown-renderer-BYxWiHRj.js.map → markdown-renderer-CHLpv5n5.js.map} +1 -1
- package/dist/{message-copy-button-CnVgCy9y.cjs → message-copy-button-D3O4hWDV.cjs} +2 -2
- package/dist/{message-copy-button-CnVgCy9y.cjs.map → message-copy-button-D3O4hWDV.cjs.map} +1 -1
- package/dist/{message-copy-button-Ctew41Rr.js → message-copy-button-OI1mwAaS.js} +2 -2
- package/dist/{message-copy-button-Ctew41Rr.js.map → message-copy-button-OI1mwAaS.js.map} +1 -1
- package/dist/{metrics-card-DaFApxZY.cjs → metrics-card-CpjGYNBP.cjs} +2 -2
- package/dist/{metrics-card-DaFApxZY.cjs.map → metrics-card-CpjGYNBP.cjs.map} +1 -1
- package/dist/{metrics-card-Z_moDiV5.js → metrics-card-D6ty6a6Z.js} +2 -2
- package/dist/{metrics-card-Z_moDiV5.js.map → metrics-card-D6ty6a6Z.js.map} +1 -1
- package/dist/{notification-activity-MR63WqZm.cjs → notification-activity-BSNuqJDd.cjs} +2 -2
- package/dist/{notification-activity-MR63WqZm.cjs.map → notification-activity-BSNuqJDd.cjs.map} +1 -1
- package/dist/{notification-activity-FJcMFxIj.js → notification-activity-BWXHmlTn.js} +2 -2
- package/dist/{notification-activity-FJcMFxIj.js.map → notification-activity-BWXHmlTn.js.map} +1 -1
- package/dist/{plan-BoOK_LAB.cjs → plan-Cm3yHvs3.cjs} +4 -4
- package/dist/{plan-BoOK_LAB.cjs.map → plan-Cm3yHvs3.cjs.map} +1 -1
- package/dist/{plan-m0hj6Zgv.js → plan-TtrepVnQ.js} +4 -4
- package/dist/{plan-m0hj6Zgv.js.map → plan-TtrepVnQ.js.map} +1 -1
- package/dist/primitives/form-element.cjs.js.map +1 -1
- package/dist/primitives/form-element.es.js.map +1 -1
- package/dist/primitives/menu-item.cjs.js +4 -2
- package/dist/primitives/menu-item.cjs.js.map +1 -1
- package/dist/primitives/menu-item.es.js +4 -2
- package/dist/primitives/menu-item.es.js.map +1 -1
- package/dist/primitives/popup-anchor.cjs.js +34 -0
- package/dist/primitives/popup-anchor.cjs.js.map +1 -0
- package/dist/primitives/popup-anchor.d.ts +2 -0
- package/dist/primitives/popup-anchor.es.js +10 -0
- package/dist/primitives/popup-anchor.es.js.map +1 -0
- package/dist/primitives/trigger-button.cjs.js +1 -1
- package/dist/primitives/trigger-button.es.js +1 -1
- package/dist/{property-filter-applied-J9ob_Rss.js → property-filter-applied-BMmMf4DE.js} +2 -2
- package/dist/property-filter-applied-BMmMf4DE.js.map +1 -0
- package/dist/{property-filter-applied-CtSglSaH.cjs → property-filter-applied-Bj-bh9gv.cjs} +2 -2
- package/dist/property-filter-applied-Bj-bh9gv.cjs.map +1 -0
- package/dist/{reasoning-activity-5MFE3mzw.js → reasoning-activity-C-sJt2A9.js} +3 -3
- package/dist/{reasoning-activity-5MFE3mzw.js.map → reasoning-activity-C-sJt2A9.js.map} +1 -1
- package/dist/{reasoning-activity-DMvughvN.cjs → reasoning-activity-DpYFjxuL.cjs} +3 -3
- package/dist/{reasoning-activity-DMvughvN.cjs.map → reasoning-activity-DpYFjxuL.cjs.map} +1 -1
- package/dist/resize/panel-drawer.cjs.js +1 -1
- package/dist/resize/panel-drawer.es.js +1 -1
- package/dist/{search-input-BPqubJZC.js → search-input-C9qFBzn6.js} +2 -2
- package/dist/{search-input-BPqubJZC.js.map → search-input-C9qFBzn6.js.map} +1 -1
- package/dist/{search-input-BUMYRaUW.cjs → search-input-CMNy0JWd.cjs} +2 -2
- package/dist/{search-input-BUMYRaUW.cjs.map → search-input-CMNy0JWd.cjs.map} +1 -1
- package/dist/section-CctlZIXp.cjs.map +1 -1
- package/dist/section-D0hKTVXt.js.map +1 -1
- package/dist/{select-CQtsggxJ.js → select-7rYaECQf.js} +2 -2
- package/dist/select-7rYaECQf.js.map +1 -0
- package/dist/{select-CbNLtiAs.cjs → select-A3AFKLd9.cjs} +2 -2
- package/dist/select-A3AFKLd9.cjs.map +1 -0
- package/dist/shimmer-BCSr3Rqf.js.map +1 -1
- package/dist/shimmer-Co-XPvF9.cjs.map +1 -1
- package/dist/{side-dialog-bm8NPDXy.js → side-dialog-DSvj8H6x.js} +4 -4
- package/dist/{side-dialog-bm8NPDXy.js.map → side-dialog-DSvj8H6x.js.map} +1 -1
- package/dist/{side-dialog-BzULMBaH.cjs → side-dialog-SJCWBnbw.cjs} +4 -4
- package/dist/{side-dialog-BzULMBaH.cjs.map → side-dialog-SJCWBnbw.cjs.map} +1 -1
- package/dist/{signal-activity-D-_u7DFm.cjs → signal-activity-C_bihjcd.cjs} +2 -2
- package/dist/{signal-activity-D-_u7DFm.cjs.map → signal-activity-C_bihjcd.cjs.map} +1 -1
- package/dist/{signal-activity-BkFexFiJ.js → signal-activity-J9kpnwAF.js} +2 -2
- package/dist/{signal-activity-BkFexFiJ.js.map → signal-activity-J9kpnwAF.js.map} +1 -1
- package/dist/{span-payload-primitives-wujxDKfA.cjs → span-payload-primitives-C0KYtmtV.cjs} +3 -3
- package/dist/{span-payload-primitives-wujxDKfA.cjs.map → span-payload-primitives-C0KYtmtV.cjs.map} +1 -1
- package/dist/{span-payload-primitives-jQiJK0qI.js → span-payload-primitives-D_N9LeLk.js} +3 -3
- package/dist/{span-payload-primitives-jQiJK0qI.js.map → span-payload-primitives-D_N9LeLk.js.map} +1 -1
- package/dist/src/domains/traces/components/span-rows.d.ts +2 -0
- package/dist/src/domains/traces/components/span-tree-rail.d.ts +23 -0
- package/dist/src/domains/traces/components/span-type-badge.d.ts +9 -0
- package/dist/src/domains/traces/components/timeline-name-col.d.ts +2 -2
- package/dist/src/domains/traces/components/timeline-structure-sign.d.ts +14 -1
- package/dist/src/domains/traces/components/trace-error-cell.d.ts +8 -0
- package/dist/src/domains/traces/components/trace-error-details.d.ts +10 -0
- package/dist/src/domains/traces/components/trace-error-summary.d.ts +8 -0
- package/dist/src/domains/traces/components/trace-span-tree-skeleton.d.ts +1 -1
- package/dist/src/domains/traces/hooks/use-traces-list-source.d.ts +1 -0
- package/dist/src/ds/components/Avatar/avatar-size.d.ts +1 -1
- package/dist/src/ds/components/Breadcrumb/crumb-switcher.d.ts +0 -1
- package/dist/src/ds/components/Button/Button.d.ts +1 -1
- package/dist/src/ds/components/EnvironmentVariablesEditor/environment-variables-editor-context.d.ts +1 -2
- package/dist/src/ds/components/SavedViews/saved-view-editor.d.ts +1 -1
- package/dist/src/ds/components/Select/select.d.ts +1 -1
- package/dist/src/ds/primitives/popup-anchor.d.ts +4 -0
- package/dist/src/hooks/use-environment-variables-editor.d.ts +1 -1
- package/dist/src/lib/keyboard/keyboard-dispatcher.d.ts +2 -0
- package/dist/src/lib/keyboard/use-keydown.d.ts +8 -1
- package/dist/style.css +121 -143
- package/dist/{tabs-tab-DRaRUvQ3.cjs → tabs-tab-B0W25Dm2.cjs} +2 -2
- package/dist/{tabs-tab-DRaRUvQ3.cjs.map → tabs-tab-B0W25Dm2.cjs.map} +1 -1
- package/dist/{tabs-tab-CIVJEMoY.js → tabs-tab-CkLyKrL0.js} +2 -2
- package/dist/{tabs-tab-CIVJEMoY.js.map → tabs-tab-CkLyKrL0.js.map} +1 -1
- package/dist/{thread-list-BANpytn3.cjs → thread-list-BBPZYHh8.cjs} +2 -2
- package/dist/thread-list-BBPZYHh8.cjs.map +1 -0
- package/dist/{thread-list-lXnXsPul.js → thread-list-BGjKZfEH.js} +2 -2
- package/dist/thread-list-BGjKZfEH.js.map +1 -0
- package/dist/{time-picker-BpCfTfoe.js → time-picker-Bzdboi4W.js} +2 -2
- package/dist/{time-picker-BpCfTfoe.js.map → time-picker-Bzdboi4W.js.map} +1 -1
- package/dist/{time-picker-DhekkO5t.cjs → time-picker-CyvG-fwX.cjs} +2 -2
- package/dist/{time-picker-DhekkO5t.cjs.map → time-picker-CyvG-fwX.cjs.map} +1 -1
- package/dist/{tool-approval-BrqoN_mP.js → tool-approval-P8rUFAYp.js} +4 -4
- package/dist/{tool-approval-BrqoN_mP.js.map → tool-approval-P8rUFAYp.js.map} +1 -1
- package/dist/{tool-approval-zBfJ20iR.cjs → tool-approval-zhWdp8i6.cjs} +4 -4
- package/dist/{tool-approval-zBfJ20iR.cjs.map → tool-approval-zhWdp8i6.cjs.map} +1 -1
- package/dist/{tool-call-arguments-DwMeGQHD.cjs → tool-call-arguments-DzpFckIm.cjs} +3 -3
- package/dist/{tool-call-arguments-DwMeGQHD.cjs.map → tool-call-arguments-DzpFckIm.cjs.map} +1 -1
- package/dist/{tool-call-arguments-Dx4LW1Ni.js → tool-call-arguments-goEdIs4f.js} +3 -3
- package/dist/{tool-call-arguments-Dx4LW1Ni.js.map → tool-call-arguments-goEdIs4f.js.map} +1 -1
- package/dist/{tool-call-group-DJsiIb-B.cjs → tool-call-group-C56oARyx.cjs} +4 -4
- package/dist/tool-call-group-C56oARyx.cjs.map +1 -0
- package/dist/{tool-call-group-ZDNZog5K.js → tool-call-group-DU4T72Xn.js} +4 -4
- package/dist/tool-call-group-DU4T72Xn.js.map +1 -0
- package/dist/{tool-call-mono-Bs7y-1Cq.js → tool-call-mono-DPW6hN91.js} +2 -2
- package/dist/{tool-call-mono-Bs7y-1Cq.js.map → tool-call-mono-DPW6hN91.js.map} +1 -1
- package/dist/{tool-call-mono-I-vdqzCe.cjs → tool-call-mono-aheL8CkL.cjs} +2 -2
- package/dist/{tool-call-mono-I-vdqzCe.cjs.map → tool-call-mono-aheL8CkL.cjs.map} +1 -1
- package/dist/{tool-call-output-Dd8zlhLd.js → tool-call-output-BQYzMMMi.js} +2 -2
- package/dist/{tool-call-output-Dd8zlhLd.js.map → tool-call-output-BQYzMMMi.js.map} +1 -1
- package/dist/{tool-call-output-BrNg0Lkd.cjs → tool-call-output-CuwM5IHd.cjs} +2 -2
- package/dist/{tool-call-output-BrNg0Lkd.cjs.map → tool-call-output-CuwM5IHd.cjs.map} +1 -1
- package/dist/{tool-card-D4yrR2AE.js → tool-card-aclA3iVz.js} +4 -4
- package/dist/{tool-card-D4yrR2AE.js.map → tool-card-aclA3iVz.js.map} +1 -1
- package/dist/{tool-card-D6UdNzIX.cjs → tool-card-yii3vGHu.cjs} +4 -4
- package/dist/{tool-card-D6UdNzIX.cjs.map → tool-card-yii3vGHu.cjs.map} +1 -1
- package/dist/{traces-data-list-Bhhg9drs.cjs → traces-data-list-Co9k5J4f.cjs} +18 -20
- package/dist/{traces-data-list-Bhhg9drs.cjs.map → traces-data-list-Co9k5J4f.cjs.map} +1 -1
- package/dist/{traces-data-list-DMWPJFBc.js → traces-data-list-TCKjOldO.js} +2 -4
- package/dist/{traces-data-list-DMWPJFBc.js.map → traces-data-list-TCKjOldO.js.map} +1 -1
- package/dist/use-data-list-keyboard-DF3tLe10.cjs.map +1 -1
- package/dist/use-data-list-keyboard-DFQr4t38.js.map +1 -1
- package/dist/{use-workflow-graph-runtime-DF-56pIR.cjs → use-workflow-graph-runtime-DcQD5eA6.cjs} +3 -3
- package/dist/{use-workflow-graph-runtime-DF-56pIR.cjs.map → use-workflow-graph-runtime-DcQD5eA6.cjs.map} +1 -1
- package/dist/{use-workflow-graph-runtime-BrHXo49Q.js → use-workflow-graph-runtime-xq_aSXPh.js} +3 -3
- package/dist/{use-workflow-graph-runtime-BrHXo49Q.js.map → use-workflow-graph-runtime-xq_aSXPh.js.map} +1 -1
- package/dist/utils/workspace-compat.cjs.js.map +1 -1
- package/dist/utils/workspace-compat.es.js.map +1 -1
- package/dist/{workflow-code-dialog-content-CfVy6bGG.cjs → workflow-code-dialog-content-B_BQCuFW.cjs} +3 -3
- package/dist/{workflow-code-dialog-content-CfVy6bGG.cjs.map → workflow-code-dialog-content-B_BQCuFW.cjs.map} +1 -1
- package/dist/{workflow-code-dialog-content-DviJz1jB.js → workflow-code-dialog-content-CFEaeYUX.js} +3 -3
- package/dist/{workflow-code-dialog-content-DviJz1jB.js.map → workflow-code-dialog-content-CFEaeYUX.js.map} +1 -1
- package/dist/{workflow-condition-card-BRwhMmNO.cjs → workflow-condition-card-CMzoK307.cjs} +3 -3
- package/dist/{workflow-condition-card-BRwhMmNO.cjs.map → workflow-condition-card-CMzoK307.cjs.map} +1 -1
- package/dist/{workflow-condition-card-sFdOjlab.js → workflow-condition-card-CbQ4fCxY.js} +3 -3
- package/dist/{workflow-condition-card-sFdOjlab.js.map → workflow-condition-card-CbQ4fCxY.js.map} +1 -1
- package/dist/{workflow-data-edge-view-DpPhr9gZ.cjs → workflow-data-edge-view-0utEB4Yb.cjs} +2 -2
- package/dist/{workflow-data-edge-view-DpPhr9gZ.cjs.map → workflow-data-edge-view-0utEB4Yb.cjs.map} +1 -1
- package/dist/{workflow-data-edge-view-CuSzc6YI.js → workflow-data-edge-view-gwwJEvXz.js} +2 -2
- package/dist/{workflow-data-edge-view-CuSzc6YI.js.map → workflow-data-edge-view-gwwJEvXz.js.map} +1 -1
- package/dist/{workflow-debug-controls-CAn_6S8K.cjs → workflow-debug-controls-B5zqE_rm.cjs} +2 -2
- package/dist/{workflow-debug-controls-CAn_6S8K.cjs.map → workflow-debug-controls-B5zqE_rm.cjs.map} +1 -1
- package/dist/{workflow-debug-controls-CLzbxd5O.js → workflow-debug-controls-CPpdNzD9.js} +2 -2
- package/dist/{workflow-debug-controls-CLzbxd5O.js.map → workflow-debug-controls-CPpdNzD9.js.map} +1 -1
- package/dist/{workflow-edge-data-button-Dtt_OUz9.js → workflow-edge-data-button-YWjfx-W0.js} +4 -4
- package/dist/{workflow-edge-data-button-Dtt_OUz9.js.map → workflow-edge-data-button-YWjfx-W0.js.map} +1 -1
- package/dist/{workflow-edge-data-button-B8rQaAoK.cjs → workflow-edge-data-button-tDvziS5v.cjs} +4 -4
- package/dist/{workflow-edge-data-button-B8rQaAoK.cjs.map → workflow-edge-data-button-tDvziS5v.cjs.map} +1 -1
- package/dist/{workflow-step-action-DqFjktfs.js → workflow-step-action-D8MVfEIl.js} +2 -2
- package/dist/{workflow-step-action-DqFjktfs.js.map → workflow-step-action-D8MVfEIl.js.map} +1 -1
- package/dist/{workflow-step-action-Cu01omgz.cjs → workflow-step-action-DZgS0_fL.cjs} +2 -2
- package/dist/{workflow-step-action-Cu01omgz.cjs.map → workflow-step-action-DZgS0_fL.cjs.map} +1 -1
- package/package.json +11 -13
- package/theme/scale.css +7 -0
- package/dist/Avatar-98bsFrSV.js.map +0 -1
- package/dist/Avatar-BCj8SvOb.cjs.map +0 -1
- package/dist/Button-DH1aTzbs.cjs.map +0 -1
- package/dist/Button-EGoajBQY.js.map +0 -1
- package/dist/activity-2tovEdIP.cjs.map +0 -1
- package/dist/activity-CsTUr5_l.js.map +0 -1
- package/dist/ask-user-card-DroerVbm.cjs.map +0 -1
- package/dist/avatar-size-CNR0U-LW.js.map +0 -1
- package/dist/avatar-size-DxStOo5A.cjs.map +0 -1
- package/dist/combobox-BNlVCFgY.cjs.map +0 -1
- package/dist/combobox-Bw13EcK0.js.map +0 -1
- package/dist/command-UEPxVJlE.cjs.map +0 -1
- package/dist/command-V9rsKc7P.js.map +0 -1
- package/dist/data-keys-and-values-1lYi60YK.cjs.map +0 -1
- package/dist/data-keys-and-values-CHpxKsfq.js.map +0 -1
- package/dist/data-list-CmjTe8xE.cjs +0 -142
- package/dist/data-list-CmjTe8xE.cjs.map +0 -1
- package/dist/data-list-DT1LVR29.js +0 -138
- package/dist/data-list-DT1LVR29.js.map +0 -1
- package/dist/data-list-spacer-CdlT6bDd.cjs +0 -218
- package/dist/data-list-spacer-CdlT6bDd.cjs.map +0 -1
- package/dist/data-list-spacer-D--gDmOm.js +0 -209
- package/dist/data-list-spacer-D--gDmOm.js.map +0 -1
- package/dist/data-list-top-DJh08vFA.cjs.map +0 -1
- package/dist/data-list-top-T-mtdIUp.js.map +0 -1
- package/dist/data-panel-BkfjzriB.cjs.map +0 -1
- package/dist/data-panel-CMkR6Avv.js.map +0 -1
- package/dist/filter-bar-chip-BJJ6ytJ4.cjs.map +0 -1
- package/dist/filter-bar-chip-BarAq1S2.js.map +0 -1
- package/dist/property-filter-applied-CtSglSaH.cjs.map +0 -1
- package/dist/property-filter-applied-J9ob_Rss.js.map +0 -1
- package/dist/select-CQtsggxJ.js.map +0 -1
- package/dist/select-CbNLtiAs.cjs.map +0 -1
- package/dist/thread-list-BANpytn3.cjs.map +0 -1
- package/dist/thread-list-lXnXsPul.js.map +0 -1
- package/dist/tool-call-group-DJsiIb-B.cjs.map +0 -1
- package/dist/tool-call-group-ZDNZog5K.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-fluid-hover.cjs.js","sources":["../../src/hooks/use-fluid-hover.ts"],"sourcesContent":["'use client';\n\nimport { useRef, useState, useCallback, useEffect, type Dispatch, type RefObject, type SetStateAction } from 'react';\n\nexport interface ItemRect {\n top: number;\n height: number;\n left: number;\n width: number;\n radius: string;\n}\n\nexport interface UseFluidHoverOptions {\n /**\n * Which direction to resolve the nearest item along.\n * \"y\" — vertical lists (default): closest by top/height\n * \"x\" — horizontal strips: closest by left/width\n * \"xy\" — 2-D grids: closest card across both rows AND columns,\n * measured by Euclidean distance to each item's center\n */\n axis?: 'x' | 'y' | 'xy';\n /**\n * Makes an item invisible to hit-testing without unregistering it — for\n * rows that stay mounted while clipped away (a collapsed sub-tree).\n * Unregistering would invalidate every measurement; a skipped item keeps\n * the set stable. Consulted per mouse move, so keep it cheap.\n */\n isItemDisabled?: (element: HTMLElement) => boolean;\n /**\n * Whether a click that lands between items (a gap, the padding, past the\n * last row) is routed to the highlighted item, so what is lit is what a\n * click hits. On by default: in a menu or a list the highlight is a\n * promise about the click. Pass `false` where empty space should stay\n * inert (rows with destructive actions, generous whitespace), or\n * `{ maxDistance }` to route only clicks within that many pixels of the\n * highlighted item's edge.\n */\n gapClick?: boolean | { maxDistance?: number };\n}\n\nexport interface UseFluidHoverReturn {\n activeIndex: number | null;\n setActiveIndex: Dispatch<SetStateAction<number | null>>;\n itemRects: ItemRect[];\n /**\n * True once every registered item has been measured and no remeasure is\n * pending, i.e. `itemRects` describes the current item set. Gate absolutely\n * positioned overlays on it: an overlay that mounts against a rect a later\n * pass still corrects animates from the wrong place to the right one, which\n * reads as the highlight sliding in from another row.\n */\n isMeasured: boolean;\n /**\n * Events whose target sits outside the container in the DOM are ignored:\n * React bubbles events from a portaled child (a submenu) through its React\n * parents, and those must not steer or click this list.\n */\n handlers: {\n onMouseMove: (e: React.MouseEvent) => void;\n onMouseLeave: (e: React.MouseEvent) => void;\n /**\n * Routes a click that lands between items (a gap, the padding, past the\n * last row) to the highlighted item, so the highlight and the click agree:\n * what is lit is what a click hits. A click inside an item is left to the\n * item. Disabled items (`isItemDisabled`) are never activated.\n */\n onClick: (e: React.MouseEvent) => void;\n };\n registerItem: (index: number, element: HTMLElement | null) => void;\n /**\n * Invalidates the published rects and runs the hook's coalesced measurement\n * pass again, holding `isMeasured` false until it settles. Reach for it when\n * the rects may be wrong and showing an overlay against them would misplace\n * it: a popup that stays mounted between opens keeps its items registered,\n * so nothing else would notice that its rects were taken while it was\n * hidden. Registration, item resize, and container resize already trigger\n * a pass; do not call this on `children` changes.\n */\n remeasure: () => void;\n /**\n * Re-reads the rects synchronously, keeping `isMeasured` as it is. Only for\n * layout that moves the rows under a visible overlay frame by frame (the\n * accordion re-measures inside its height animation). Everything else\n * wants `remeasure`, or nothing.\n */\n measureItems: () => void;\n}\n\nexport interface PickNearestInput {\n axis: 'x' | 'y' | 'xy';\n /** The pointer, in viewport coordinates. */\n point: { x: number; y: number };\n /** Item rects in the container's layout space (sparse: unregistered slots\n * are undefined). */\n rects: readonly (ItemRect | undefined)[];\n /** The container's bounding rect and live scroll / border offsets, which\n * map layout rects into the pointer's viewport space. */\n containerRect: { left: number; top: number; width: number; height: number };\n scroll: { x: number; y: number };\n border: { x: number; y: number };\n /** Layout size of the container, so a cumulative ancestor `transform:\n * scale` (a popup mid scale-in) can be factored out per axis. */\n layoutSize: { width: number; height: number };\n /** Skips an item without unregistering it. */\n isDisabled?: (index: number) => boolean;\n /** Resolves nothing once the pointer leaves the span from the first item to the last. */\n onlyBetweenItems?: boolean;\n}\n\ninterface ViewportBox {\n left: number;\n top: number;\n right: number;\n bottom: number;\n}\n\nfunction boxContains(box: ViewportBox, point: { x: number; y: number }, axis: PickNearestInput['axis']) {\n const insideX = point.x >= box.left && point.x <= box.right;\n const insideY = point.y >= box.top && point.y <= box.bottom;\n if (axis === 'x') return insideX;\n if (axis === 'y') return insideY;\n return insideX && insideY;\n}\n\nfunction distanceToCenter(box: ViewportBox, point: { x: number; y: number }, axis: PickNearestInput['axis']) {\n const dx = point.x - (box.left + box.right) / 2;\n const dy = point.y - (box.top + box.bottom) / 2;\n if (axis === 'x') return Math.abs(dx);\n if (axis === 'y') return Math.abs(dy);\n return Math.hypot(dx, dy);\n}\n\nfunction isOverDisabledItem(\n items: Iterable<HTMLElement>,\n point: { clientX: number; clientY: number },\n isItemDisabled: ((element: HTMLElement) => boolean) | undefined,\n) {\n for (const element of items) {\n if (!isItemDisabled?.(element)) continue;\n const r = element.getBoundingClientRect();\n if (point.clientX >= r.left && point.clientX <= r.right && point.clientY >= r.top && point.clientY <= r.bottom) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * The rule, as one pure function: an item the pointer is inside wins;\n * otherwise the item whose center is nearest does, so a pointer in a gap, in\n * the padding, or past the last row still lands. `y` and `x` measure one\n * coordinate; `xy` measures the straight line to each center. Ties keep the\n * first item. The hook calls this once per animation frame; the docs page\n * times it.\n */\nexport function pickNearest({\n axis,\n point,\n rects,\n containerRect,\n scroll,\n border,\n layoutSize,\n isDisabled,\n onlyBetweenItems = false,\n}: PickNearestInput): number | null {\n const scaleX = layoutSize.width > 0 ? containerRect.width / layoutSize.width : 1;\n const scaleY = layoutSize.height > 0 ? containerRect.height / layoutSize.height : 1;\n let closestIndex: number | null = null;\n let closestDistance = Infinity;\n let containingIndex: number | null = null;\n const itemSpan: ViewportBox = { left: Infinity, top: Infinity, right: -Infinity, bottom: -Infinity };\n\n for (let index = 0; index < rects.length; index++) {\n const r = rects[index];\n if (!r) continue;\n if (isDisabled?.(index)) continue;\n\n const left = containerRect.left + (border.x + r.left - scroll.x) * scaleX;\n const top = containerRect.top + (border.y + r.top - scroll.y) * scaleY;\n const box: ViewportBox = { left, top, right: left + r.width * scaleX, bottom: top + r.height * scaleY };\n itemSpan.left = Math.min(itemSpan.left, box.left);\n itemSpan.top = Math.min(itemSpan.top, box.top);\n itemSpan.right = Math.max(itemSpan.right, box.right);\n itemSpan.bottom = Math.max(itemSpan.bottom, box.bottom);\n\n if (boxContains(box, point, axis)) containingIndex = index;\n const distance = distanceToCenter(box, point, axis);\n if (distance < closestDistance) {\n closestDistance = distance;\n closestIndex = index;\n }\n }\n\n if (onlyBetweenItems && !boxContains(itemSpan, point, axis)) return null;\n return containingIndex ?? closestIndex;\n}\n\n/** Set on the highlighted item (boolean attribute). */\nexport const ACTIVE_ATTR = 'data-fluid-hover-active';\n/** Set on the container: the highlighted index, or absent. */\nexport const ACTIVE_INDEX_ATTR = 'data-fluid-hover-active-index';\n/** Marks an element whose items form their own hover group: the highlight stays between that group's items. */\nexport const GROUP_ATTR = 'data-fluid-hover-group';\nconst GROUP_SELECTOR = `[${GROUP_ATTR}]`;\n\n/** False for an event bubbled through React from a portal outside the container, and for a detached target. */\nfunction isFromInside(e: React.SyntheticEvent) {\n return e.target instanceof Node && e.currentTarget.contains(e.target);\n}\n\nconst ACTIVATOR_SELECTOR =\n \"a[href], button, [role='menuitem'], [role='menuitemradio'], [role='menuitemcheckbox'], [role='option'], [role='radio'], [role='checkbox'], [role='tab'], [role='link'], [role='button']\";\n\n/**\n * The element a routed click should land on. A registered item is usually\n * the interactive row itself; when it is only a box around one (a sidebar\n * row around its button, a card around its link), the first control inside\n * is what a real click on the row would have reached.\n */\nfunction resolveActivator(element: HTMLElement): HTMLElement {\n if (element.matches(ACTIVATOR_SELECTOR) || element.hasAttribute('tabindex')) {\n return element;\n }\n return element.querySelector<HTMLElement>(ACTIVATOR_SELECTOR) ?? element;\n}\n\n/**\n * How many frames the coalesced remeasure retries while the registered items\n * still have no layout box. A popup can be in the DOM one frame before it is\n * laid out; retrying beats publishing zeroed rects, and the cap keeps a list\n * that stays hidden for good from spinning frames forever.\n */\nconst measurementAttempts = 3;\n\nconst CONTROL_BETWEEN_ROWS =\n \"input, textarea, select, button, a, label, summary, [contenteditable], [role='textbox'], [role='searchbox'], [role='button'], [role='link'], [role='radio'], [role='checkbox'], [role='switch'], [role='slider'], [role='spinbutton'], [role='tab'], [role='radiogroup'], [role='tablist'], [role='toolbar']\";\n\nexport function useFluidHover<T extends HTMLElement>(\n containerRef: RefObject<T | null>,\n options: UseFluidHoverOptions = {},\n): UseFluidHoverReturn {\n const { axis = 'y', isItemDisabled, gapClick = true } = options;\n const gapClickMaxDistance = typeof gapClick === 'object' ? (gapClick.maxDistance ?? Infinity) : Infinity;\n const itemsRef = useRef(new Map<number, HTMLElement>());\n const itemGroupsRef = useRef(new Map<number, Element | null>());\n const [activeIndex, setActiveIndex] = useState<number | null>(null);\n // Mirrored for handlers that read it outside a render (the gap click).\n const activeIndexRef = useRef<number | null>(null);\n activeIndexRef.current = activeIndex;\n\n // The state, in the DOM: `data-fluid-hover-active` on the highlighted item\n // and `data-fluid-hover-active-index` on the container. Devtools shows it\n // and a test asserts on it without waiting for a frame. React does not\n // manage these attributes, so it never clobbers them.\n useEffect(() => {\n const container = containerRef.current;\n if (activeIndex === null) container?.removeAttribute(ACTIVE_INDEX_ATTR);\n else container?.setAttribute(ACTIVE_INDEX_ATTR, String(activeIndex));\n const active = activeIndex === null ? undefined : itemsRef.current.get(activeIndex);\n active?.setAttribute(ACTIVE_ATTR, '');\n return () => {\n active?.removeAttribute(ACTIVE_ATTR);\n // A row that re-registered under this index while it was highlighted\n // (a remount under a new key) was marked by registerItem, not by this\n // effect: drop the mark from whatever element holds the index now.\n // eslint-disable-next-line react-hooks/exhaustive-deps -- itemsRef is a registry Map, reading it at cleanup is the point\n if (activeIndex !== null) itemsRef.current.get(activeIndex)?.removeAttribute(ACTIVE_ATTR);\n };\n }, [activeIndex, containerRef]);\n const [itemRects, setItemRects] = useState<ItemRect[]>([]);\n const [isMeasured, setIsMeasured] = useState(false);\n const itemRectsRef = useRef<ItemRect[]>([]);\n const rafIdRef = useRef<number | null>(null);\n const remeasureRafIdRef = useRef<number | null>(null);\n\n /**\n * Publishes a rect for every registered item that has a layout box. Returns\n * false when the measurement could not be completed (no container, or no\n * item with a layout box) — nothing is published in that case, so the last\n * complete measurement stands instead of being overwritten with zeroes.\n */\n const runMeasurement = useCallback(() => {\n const container = containerRef.current;\n if (!container) return false;\n const rects: ItemRect[] = [];\n let laidOutItemCount = 0;\n itemsRef.current.forEach((element, index) => {\n // An element inside a display:none / not-yet-laid-out popup has no\n // offsetParent and reports every offset as 0. When every item is like\n // that, publishing would pin overlays to the top of the list, so the\n // whole pass counts as incomplete. A boxless item among laid-out ones\n // (a row in a collapsed section) is just left out. `position: fixed`\n // items also have no offsetParent but do have a size.\n const hasLayoutBox = element.offsetParent !== null || element.offsetWidth > 0 || element.offsetHeight > 0;\n if (!hasLayoutBox) return;\n laidOutItemCount++;\n // Use offset* instead of getBoundingClientRect so measurements are\n // unaffected by CSS transforms (e.g. scaleY animation on the parent\n // motion.div). offsetTop/offsetLeft are layout values relative to the\n // offsetParent (the scroll container), matching the coordinate space\n // used by `position: absolute` children. Items nested inside positioned\n // descendants of the container (a sidebar sub-menu's rows live inside a\n // positioned row) accumulate those ancestors' offsets, so every rect\n // lands in the container's own coordinate space; for a flat list the\n // loop never runs and this is exactly the plain offsetTop/offsetLeft.\n let top = element.offsetTop;\n let left = element.offsetLeft;\n let ancestor = element.offsetParent;\n while (ancestor instanceof HTMLElement && ancestor !== container && container.contains(ancestor)) {\n top += ancestor.offsetTop + ancestor.clientTop;\n left += ancestor.offsetLeft + ancestor.clientLeft;\n ancestor = ancestor.offsetParent;\n }\n rects[index] = {\n top,\n height: element.offsetHeight,\n left,\n width: element.offsetWidth,\n radius: getComputedStyle(element).borderRadius,\n };\n });\n if (itemsRef.current.size > 0 && laidOutItemCount === 0) return false;\n // Skip the state update when nothing moved (a cheap per-field compare) so\n // redundant remeasures don't churn re-renders.\n const prev = itemRectsRef.current;\n let changed = prev.length !== rects.length;\n for (let i = 0; !changed && i < rects.length; i++) {\n const p = prev[i];\n const r = rects[i];\n if (p === r) continue; // both undefined (sparse slot)\n changed =\n !p ||\n !r ||\n p.top !== r.top ||\n p.left !== r.left ||\n p.width !== r.width ||\n p.height !== r.height ||\n p.radius !== r.radius;\n }\n if (changed) {\n itemRectsRef.current = rects;\n setItemRects(rects);\n }\n return true;\n }, [containerRef]);\n\n const measureItems = useCallback(() => {\n runMeasurement();\n }, [runMeasurement]);\n\n /**\n * The hook's single measurement pass: coalesces every trigger (item\n * registration, container resize) into one remeasure on the next frame and\n * is the only place readiness is reported, so `isMeasured` can never turn\n * true while another pass is still queued.\n */\n const scheduleMeasurement = useCallback(\n (attemptsLeft: number) => {\n if (remeasureRafIdRef.current !== null) {\n cancelAnimationFrame(remeasureRafIdRef.current);\n }\n remeasureRafIdRef.current = requestAnimationFrame(() => {\n remeasureRafIdRef.current = null;\n if (runMeasurement()) {\n setIsMeasured(true);\n } else if (attemptsLeft > 1) {\n scheduleMeasurement(attemptsLeft - 1);\n }\n });\n },\n [runMeasurement],\n );\n\n const remeasure = useCallback(() => {\n // Readiness drops first: until the pass below settles, the published rects\n // may not describe what is on screen, and an overlay positioned from them\n // would be corrected after mounting — which animates as a slide.\n setIsMeasured(false);\n scheduleMeasurement(measurementAttempts);\n }, [scheduleMeasurement]);\n\n // Observes the registered items themselves (not just the container): rows\n // that change size in place — e.g. the site-wide size step flipping while a\n // selection background is up — must invalidate the published rects even when\n // the container the effect below captured has since been remounted and the\n // ref points at a different element than the one being observed.\n const itemRoRef = useRef<ResizeObserver | null>(null);\n const getItemRo = useCallback(() => {\n if (itemRoRef.current === null && typeof ResizeObserver !== 'undefined') {\n itemRoRef.current = new ResizeObserver(() => scheduleMeasurement(measurementAttempts));\n }\n return itemRoRef.current;\n }, [scheduleMeasurement]);\n\n const registerItem = useCallback(\n (index: number, element: HTMLElement | null) => {\n if (element) {\n itemsRef.current.set(index, element);\n itemGroupsRef.current.set(index, element.closest(GROUP_SELECTOR));\n getItemRo()?.observe(element);\n if (index === activeIndexRef.current) element.setAttribute(ACTIVE_ATTR, '');\n } else {\n const previous = itemsRef.current.get(index);\n if (previous) itemRoRef.current?.unobserve(previous);\n // The mark leaves with the element: a row that only moved to another\n // index (a filtering list re-ordering) must not carry it there.\n previous?.removeAttribute(ACTIVE_ATTR);\n itemsRef.current.delete(index);\n itemGroupsRef.current.delete(index);\n // The highlighted row is gone: nothing should stay lit or receive a\n // routed click until the pointer picks again. Decided when the\n // update applies, after this commit's registrations, so a row that\n // only moved index hands the highlight to the row now under it.\n if (index === activeIndexRef.current) {\n setActiveIndex(current => (current === index && !itemsRef.current.has(index) ? null : current));\n }\n }\n // Coalesce rapid register/unregister calls (e.g. when an AnimatePresence\n // remounts a list of rows) into a single remeasure on the next frame,\n // so consumers don't have to manually call measureItems after the\n // container's children swap. A lit row keeps its element (unregistering\n // it clears the highlight), so its rect stays good while the pass runs:\n // dropping readiness then would blink the highlight every time a\n // virtualized list mounts a row while scrolling.\n if (activeIndexRef.current === null) remeasure();\n else scheduleMeasurement(measurementAttempts);\n },\n [remeasure, scheduleMeasurement, getItemRo],\n );\n\n const handleMouseMove = useCallback(\n (e: React.MouseEvent) => {\n if (!isFromInside(e) || !(e.target instanceof Element)) return;\n const pointerTarget = e.target;\n const mouseX = e.clientX;\n const mouseY = e.clientY;\n\n if (rafIdRef.current !== null) {\n cancelAnimationFrame(rafIdRef.current);\n }\n\n rafIdRef.current = requestAnimationFrame(() => {\n rafIdRef.current = null;\n const container = containerRef.current;\n if (!container) return;\n const enclosingGroup = container.closest(GROUP_SELECTOR);\n const groupInside = (group: Element | null | undefined) => (group === enclosingGroup ? null : group);\n const pointerGroup = groupInside(pointerTarget.closest(GROUP_SELECTOR));\n setActiveIndex(\n pickNearest({\n axis,\n point: { x: mouseX, y: mouseY },\n rects: itemRectsRef.current,\n containerRect: container.getBoundingClientRect(),\n scroll: { x: container.scrollLeft, y: container.scrollTop },\n border: { x: container.clientLeft, y: container.clientTop },\n layoutSize: { width: container.offsetWidth, height: container.offsetHeight },\n isDisabled: index => {\n if (groupInside(itemGroupsRef.current.get(index)) !== pointerGroup) return true;\n const element = itemsRef.current.get(index);\n return !!element && !!isItemDisabled?.(element);\n },\n onlyBetweenItems: pointerGroup !== null,\n }),\n );\n });\n },\n [axis, containerRef, isItemDisabled],\n );\n\n const handleMouseLeave = useCallback((e: React.MouseEvent) => {\n if (!isFromInside(e)) return;\n if (rafIdRef.current !== null) {\n cancelAnimationFrame(rafIdRef.current);\n rafIdRef.current = null;\n }\n setActiveIndex(null);\n }, []);\n\n const handleClick = useCallback(\n (e: React.MouseEvent) => {\n // Outside the container in the DOM: a portaled child's click, or a row\n // that unmounted while its own click was still bubbling (a pick whose\n // primitive re-renders the list synchronously). Neither is a gap.\n const { target } = e;\n if (!(target instanceof Element) || !isFromInside(e)) return;\n // Inside an item: the item owns the click.\n for (const element of itemsRef.current.values()) {\n if (element.contains(target)) return;\n }\n // A control that sits between the rows (a search field at the top of\n // a menu, a footer button, a theme toggle) keeps its own click too.\n if (target.closest(CONTROL_BETWEEN_ROWS)) return;\n if (gapClick === false) return;\n if (isOverDisabledItem(itemsRef.current.values(), e, isItemDisabled)) return;\n const index = activeIndexRef.current;\n if (index === null) return;\n const element = itemsRef.current.get(index);\n if (!element || isItemDisabled?.(element)) return;\n if (gapClickMaxDistance !== Infinity) {\n const r = element.getBoundingClientRect();\n const dx = Math.max(r.left - e.clientX, 0, e.clientX - r.right);\n const dy = Math.max(r.top - e.clientY, 0, e.clientY - r.bottom);\n if (Math.hypot(dx, dy) > gapClickMaxDistance) return;\n }\n // A real DOM click on the item, so its own handlers (and the primitive\n // wrapping it, if any) run exactly as if the pointer had been inside.\n resolveActivator(element).click();\n },\n [isItemDisabled, gapClick, gapClickMaxDistance],\n );\n\n // Remeasure when the container resizes — a reflow moves items even though\n // the registered set is unchanged, which would otherwise leave itemRects\n // stale. Coalesced through the same rAF as register/unregister. Readiness is\n // deliberately not dropped: the item set is unchanged, so the published rects\n // stay usable, and hiding overlays on every reflow would flicker them.\n useEffect(() => {\n const container = containerRef.current;\n if (!container || typeof ResizeObserver === 'undefined') return;\n const ro = new ResizeObserver(() => scheduleMeasurement(measurementAttempts));\n ro.observe(container);\n return () => ro.disconnect();\n }, [containerRef, scheduleMeasurement]);\n\n // Clean up rAF and the item observer on unmount\n useEffect(() => {\n return () => {\n if (rafIdRef.current !== null) {\n cancelAnimationFrame(rafIdRef.current);\n }\n if (remeasureRafIdRef.current !== null) {\n cancelAnimationFrame(remeasureRafIdRef.current);\n }\n itemRoRef.current?.disconnect();\n itemRoRef.current = null;\n };\n }, []);\n\n return {\n activeIndex,\n setActiveIndex,\n itemRects,\n isMeasured,\n handlers: {\n onMouseMove: handleMouseMove,\n onMouseLeave: handleMouseLeave,\n onClick: handleClick,\n },\n registerItem,\n remeasure,\n measureItems,\n };\n}\n\n/**\n * Registers an item's element with its list for as long as it is mounted.\n * The one way rows join a list: pass the hook's `registerItem` (or the copy\n * a context hands down), the row's index, and its ref. Either may be\n * missing for a row rendered outside a list (a standalone card, an accordion\n * item that is not grouped); then nothing is registered.\n */\nexport function useRegisterFluidHoverItem(\n registerItem: ((index: number, element: HTMLElement | null) => void) | undefined,\n index: number | undefined,\n ref: RefObject<HTMLElement | null>,\n) {\n useEffect(() => {\n if (!registerItem || index === undefined) return;\n registerItem(index, ref.current);\n return () => registerItem(index, null);\n }, [index, registerItem, ref]);\n}\n"],"names":["useRef","useState","useEffect","useCallback","element"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"use-fluid-hover.cjs.js","sources":["../../src/hooks/use-fluid-hover.ts"],"sourcesContent":["'use client';\n\nimport { useRef, useState, useCallback, useEffect } from 'react';\nimport type { Dispatch, RefObject, SetStateAction } from 'react';\n\nexport interface ItemRect {\n top: number;\n height: number;\n left: number;\n width: number;\n radius: string;\n}\n\nexport interface UseFluidHoverOptions {\n /**\n * Which direction to resolve the nearest item along.\n * \"y\" — vertical lists (default): closest by top/height\n * \"x\" — horizontal strips: closest by left/width\n * \"xy\" — 2-D grids: closest card across both rows AND columns,\n * measured by Euclidean distance to each item's center\n */\n axis?: 'x' | 'y' | 'xy';\n /**\n * Makes an item invisible to hit-testing without unregistering it — for\n * rows that stay mounted while clipped away (a collapsed sub-tree).\n * Unregistering would invalidate every measurement; a skipped item keeps\n * the set stable. Consulted per mouse move, so keep it cheap.\n */\n isItemDisabled?: (element: HTMLElement) => boolean;\n /**\n * Whether a click that lands between items (a gap, the padding, past the\n * last row) is routed to the highlighted item, so what is lit is what a\n * click hits. On by default: in a menu or a list the highlight is a\n * promise about the click. Pass `false` where empty space should stay\n * inert (rows with destructive actions, generous whitespace), or\n * `{ maxDistance }` to route only clicks within that many pixels of the\n * highlighted item's edge.\n */\n gapClick?: boolean | { maxDistance?: number };\n}\n\nexport interface UseFluidHoverReturn {\n activeIndex: number | null;\n setActiveIndex: Dispatch<SetStateAction<number | null>>;\n itemRects: ItemRect[];\n /**\n * True once every registered item has been measured and no remeasure is\n * pending, i.e. `itemRects` describes the current item set. Gate absolutely\n * positioned overlays on it: an overlay that mounts against a rect a later\n * pass still corrects animates from the wrong place to the right one, which\n * reads as the highlight sliding in from another row.\n */\n isMeasured: boolean;\n /**\n * Events whose target sits outside the container in the DOM are ignored:\n * React bubbles events from a portaled child (a submenu) through its React\n * parents, and those must not steer or click this list.\n */\n handlers: {\n onMouseMove: (e: React.MouseEvent) => void;\n onMouseLeave: (e: React.MouseEvent) => void;\n /**\n * Routes a click that lands between items (a gap, the padding, past the\n * last row) to the highlighted item, so the highlight and the click agree:\n * what is lit is what a click hits. A click inside an item is left to the\n * item. Disabled items (`isItemDisabled`) are never activated.\n */\n onClick: (e: React.MouseEvent) => void;\n };\n registerItem: (index: number, element: HTMLElement | null) => void;\n /**\n * Invalidates the published rects and runs the hook's coalesced measurement\n * pass again, holding `isMeasured` false until it settles. Reach for it when\n * the rects may be wrong and showing an overlay against them would misplace\n * it: a popup that stays mounted between opens keeps its items registered,\n * so nothing else would notice that its rects were taken while it was\n * hidden. Registration, item resize, and container resize already trigger\n * a pass; do not call this on `children` changes.\n */\n remeasure: () => void;\n /**\n * Re-reads the rects synchronously, keeping `isMeasured` as it is. Only for\n * layout that moves the rows under a visible overlay frame by frame (the\n * accordion re-measures inside its height animation). Everything else\n * wants `remeasure`, or nothing.\n */\n measureItems: () => void;\n}\n\nexport interface PickNearestInput {\n axis: 'x' | 'y' | 'xy';\n /** The pointer, in viewport coordinates. */\n point: { x: number; y: number };\n /** Item rects in the container's layout space (sparse: unregistered slots\n * are undefined). */\n rects: readonly (ItemRect | undefined)[];\n /** The container's bounding rect and live scroll / border offsets, which\n * map layout rects into the pointer's viewport space. */\n containerRect: { left: number; top: number; width: number; height: number };\n scroll: { x: number; y: number };\n border: { x: number; y: number };\n /** Layout size of the container, so a cumulative ancestor `transform:\n * scale` (a popup mid scale-in) can be factored out per axis. */\n layoutSize: { width: number; height: number };\n /** Skips an item without unregistering it. */\n isDisabled?: (index: number) => boolean;\n /** Resolves nothing once the pointer leaves the span from the first item to the last. */\n onlyBetweenItems?: boolean;\n}\n\ninterface ViewportBox {\n left: number;\n top: number;\n right: number;\n bottom: number;\n}\n\nfunction boxContains(box: ViewportBox, point: { x: number; y: number }, axis: PickNearestInput['axis']) {\n const insideX = point.x >= box.left && point.x <= box.right;\n const insideY = point.y >= box.top && point.y <= box.bottom;\n if (axis === 'x') return insideX;\n if (axis === 'y') return insideY;\n return insideX && insideY;\n}\n\nfunction distanceToCenter(box: ViewportBox, point: { x: number; y: number }, axis: PickNearestInput['axis']) {\n const dx = point.x - (box.left + box.right) / 2;\n const dy = point.y - (box.top + box.bottom) / 2;\n if (axis === 'x') return Math.abs(dx);\n if (axis === 'y') return Math.abs(dy);\n return Math.hypot(dx, dy);\n}\n\nfunction isOverDisabledItem(\n items: Iterable<HTMLElement>,\n point: { clientX: number; clientY: number },\n isItemDisabled: ((element: HTMLElement) => boolean) | undefined,\n) {\n for (const element of items) {\n if (!isItemDisabled?.(element)) continue;\n const r = element.getBoundingClientRect();\n if (point.clientX >= r.left && point.clientX <= r.right && point.clientY >= r.top && point.clientY <= r.bottom) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * The rule, as one pure function: an item the pointer is inside wins;\n * otherwise the item whose center is nearest does, so a pointer in a gap, in\n * the padding, or past the last row still lands. `y` and `x` measure one\n * coordinate; `xy` measures the straight line to each center. Ties keep the\n * first item. The hook calls this once per animation frame; the docs page\n * times it.\n */\nexport function pickNearest({\n axis,\n point,\n rects,\n containerRect,\n scroll,\n border,\n layoutSize,\n isDisabled,\n onlyBetweenItems = false,\n}: PickNearestInput): number | null {\n const scaleX = layoutSize.width > 0 ? containerRect.width / layoutSize.width : 1;\n const scaleY = layoutSize.height > 0 ? containerRect.height / layoutSize.height : 1;\n let closestIndex: number | null = null;\n let closestDistance = Infinity;\n let containingIndex: number | null = null;\n const itemSpan: ViewportBox = { left: Infinity, top: Infinity, right: -Infinity, bottom: -Infinity };\n\n for (let index = 0; index < rects.length; index++) {\n const r = rects[index];\n if (!r) continue;\n if (isDisabled?.(index)) continue;\n\n const left = containerRect.left + (border.x + r.left - scroll.x) * scaleX;\n const top = containerRect.top + (border.y + r.top - scroll.y) * scaleY;\n const box: ViewportBox = { left, top, right: left + r.width * scaleX, bottom: top + r.height * scaleY };\n itemSpan.left = Math.min(itemSpan.left, box.left);\n itemSpan.top = Math.min(itemSpan.top, box.top);\n itemSpan.right = Math.max(itemSpan.right, box.right);\n itemSpan.bottom = Math.max(itemSpan.bottom, box.bottom);\n\n if (boxContains(box, point, axis)) containingIndex = index;\n const distance = distanceToCenter(box, point, axis);\n if (distance < closestDistance) {\n closestDistance = distance;\n closestIndex = index;\n }\n }\n\n if (onlyBetweenItems && !boxContains(itemSpan, point, axis)) return null;\n return containingIndex ?? closestIndex;\n}\n\n/** Set on the highlighted item (boolean attribute). */\nexport const ACTIVE_ATTR = 'data-fluid-hover-active';\n/** Set on the container: the highlighted index, or absent. */\nexport const ACTIVE_INDEX_ATTR = 'data-fluid-hover-active-index';\n/** Marks an element whose items form their own hover group: the highlight stays between that group's items. */\nexport const GROUP_ATTR = 'data-fluid-hover-group';\nconst GROUP_SELECTOR = `[${GROUP_ATTR}]`;\n\n/** False for an event bubbled through React from a portal outside the container, and for a detached target. */\nfunction isFromInside(e: React.SyntheticEvent) {\n return e.target instanceof Node && e.currentTarget.contains(e.target);\n}\n\nconst ACTIVATOR_SELECTOR =\n \"a[href], button, [role='menuitem'], [role='menuitemradio'], [role='menuitemcheckbox'], [role='option'], [role='radio'], [role='checkbox'], [role='tab'], [role='link'], [role='button']\";\n\n/**\n * The element a routed click should land on. A registered item is usually\n * the interactive row itself; when it is only a box around one (a sidebar\n * row around its button, a card around its link), the first control inside\n * is what a real click on the row would have reached.\n */\nfunction resolveActivator(element: HTMLElement): HTMLElement {\n if (element.matches(ACTIVATOR_SELECTOR) || element.hasAttribute('tabindex')) {\n return element;\n }\n return element.querySelector<HTMLElement>(ACTIVATOR_SELECTOR) ?? element;\n}\n\n/**\n * How many frames the coalesced remeasure retries while the registered items\n * still have no layout box. A popup can be in the DOM one frame before it is\n * laid out; retrying beats publishing zeroed rects, and the cap keeps a list\n * that stays hidden for good from spinning frames forever.\n */\nconst measurementAttempts = 3;\n\nconst CONTROL_BETWEEN_ROWS =\n \"input, textarea, select, button, a, label, summary, [contenteditable], [role='textbox'], [role='searchbox'], [role='button'], [role='link'], [role='radio'], [role='checkbox'], [role='switch'], [role='slider'], [role='spinbutton'], [role='tab'], [role='radiogroup'], [role='tablist'], [role='toolbar']\";\n\nexport function useFluidHover<T extends HTMLElement>(\n containerRef: RefObject<T | null>,\n options: UseFluidHoverOptions = {},\n): UseFluidHoverReturn {\n const { axis = 'y', isItemDisabled, gapClick = true } = options;\n const gapClickMaxDistance = typeof gapClick === 'object' ? (gapClick.maxDistance ?? Infinity) : Infinity;\n const itemsRef = useRef(new Map<number, HTMLElement>());\n const itemGroupsRef = useRef(new Map<number, Element | null>());\n const [activeIndex, setActiveIndex] = useState<number | null>(null);\n // Mirrored for handlers that read it outside a render (the gap click).\n const activeIndexRef = useRef<number | null>(null);\n activeIndexRef.current = activeIndex;\n\n // The state, in the DOM: `data-fluid-hover-active` on the highlighted item\n // and `data-fluid-hover-active-index` on the container. Devtools shows it\n // and a test asserts on it without waiting for a frame. React does not\n // manage these attributes, so it never clobbers them.\n useEffect(() => {\n const container = containerRef.current;\n if (activeIndex === null) container?.removeAttribute(ACTIVE_INDEX_ATTR);\n else container?.setAttribute(ACTIVE_INDEX_ATTR, String(activeIndex));\n const active = activeIndex === null ? undefined : itemsRef.current.get(activeIndex);\n active?.setAttribute(ACTIVE_ATTR, '');\n return () => {\n active?.removeAttribute(ACTIVE_ATTR);\n // A row that re-registered under this index while it was highlighted\n // (a remount under a new key) was marked by registerItem, not by this\n // effect: drop the mark from whatever element holds the index now.\n // eslint-disable-next-line react-hooks/exhaustive-deps -- itemsRef is a registry Map, reading it at cleanup is the point\n if (activeIndex !== null) itemsRef.current.get(activeIndex)?.removeAttribute(ACTIVE_ATTR);\n };\n }, [activeIndex, containerRef]);\n const [itemRects, setItemRects] = useState<ItemRect[]>([]);\n const [isMeasured, setIsMeasured] = useState(false);\n const itemRectsRef = useRef<ItemRect[]>([]);\n const rafIdRef = useRef<number | null>(null);\n const remeasureRafIdRef = useRef<number | null>(null);\n\n /**\n * Publishes a rect for every registered item that has a layout box. Returns\n * false when the measurement could not be completed (no container, or no\n * item with a layout box) — nothing is published in that case, so the last\n * complete measurement stands instead of being overwritten with zeroes.\n */\n const runMeasurement = useCallback(() => {\n const container = containerRef.current;\n if (!container) return false;\n const rects: ItemRect[] = [];\n let laidOutItemCount = 0;\n itemsRef.current.forEach((element, index) => {\n // An element inside a display:none / not-yet-laid-out popup has no\n // offsetParent and reports every offset as 0. When every item is like\n // that, publishing would pin overlays to the top of the list, so the\n // whole pass counts as incomplete. A boxless item among laid-out ones\n // (a row in a collapsed section) is just left out. `position: fixed`\n // items also have no offsetParent but do have a size.\n const hasLayoutBox = element.offsetParent !== null || element.offsetWidth > 0 || element.offsetHeight > 0;\n if (!hasLayoutBox) return;\n laidOutItemCount++;\n // Use offset* instead of getBoundingClientRect so measurements are\n // unaffected by CSS transforms (e.g. scaleY animation on the parent\n // motion.div). offsetTop/offsetLeft are layout values relative to the\n // offsetParent (the scroll container), matching the coordinate space\n // used by `position: absolute` children. Items nested inside positioned\n // descendants of the container (a sidebar sub-menu's rows live inside a\n // positioned row) accumulate those ancestors' offsets, so every rect\n // lands in the container's own coordinate space; for a flat list the\n // loop never runs and this is exactly the plain offsetTop/offsetLeft.\n let top = element.offsetTop;\n let left = element.offsetLeft;\n let ancestor = element.offsetParent;\n while (ancestor instanceof HTMLElement && ancestor !== container && container.contains(ancestor)) {\n top += ancestor.offsetTop + ancestor.clientTop;\n left += ancestor.offsetLeft + ancestor.clientLeft;\n ancestor = ancestor.offsetParent;\n }\n rects[index] = {\n top,\n height: element.offsetHeight,\n left,\n width: element.offsetWidth,\n radius: getComputedStyle(element).borderRadius,\n };\n });\n if (itemsRef.current.size > 0 && laidOutItemCount === 0) return false;\n // Skip the state update when nothing moved (a cheap per-field compare) so\n // redundant remeasures don't churn re-renders.\n const prev = itemRectsRef.current;\n let changed = prev.length !== rects.length;\n for (let i = 0; !changed && i < rects.length; i++) {\n const p = prev[i];\n const r = rects[i];\n if (p === r) continue; // both undefined (sparse slot)\n changed =\n !p ||\n !r ||\n p.top !== r.top ||\n p.left !== r.left ||\n p.width !== r.width ||\n p.height !== r.height ||\n p.radius !== r.radius;\n }\n if (changed) {\n itemRectsRef.current = rects;\n setItemRects(rects);\n }\n return true;\n }, [containerRef]);\n\n const measureItems = useCallback(() => {\n runMeasurement();\n }, [runMeasurement]);\n\n /**\n * The hook's single measurement pass: coalesces every trigger (item\n * registration, container resize) into one remeasure on the next frame and\n * is the only place readiness is reported, so `isMeasured` can never turn\n * true while another pass is still queued.\n */\n const scheduleMeasurement = useCallback(\n (attemptsLeft: number) => {\n if (remeasureRafIdRef.current !== null) {\n cancelAnimationFrame(remeasureRafIdRef.current);\n }\n remeasureRafIdRef.current = requestAnimationFrame(() => {\n remeasureRafIdRef.current = null;\n if (runMeasurement()) {\n setIsMeasured(true);\n } else if (attemptsLeft > 1) {\n scheduleMeasurement(attemptsLeft - 1);\n }\n });\n },\n [runMeasurement],\n );\n\n const remeasure = useCallback(() => {\n // Readiness drops first: until the pass below settles, the published rects\n // may not describe what is on screen, and an overlay positioned from them\n // would be corrected after mounting — which animates as a slide.\n setIsMeasured(false);\n scheduleMeasurement(measurementAttempts);\n }, [scheduleMeasurement]);\n\n // Observes the registered items themselves (not just the container): rows\n // that change size in place — e.g. the site-wide size step flipping while a\n // selection background is up — must invalidate the published rects even when\n // the container the effect below captured has since been remounted and the\n // ref points at a different element than the one being observed.\n const itemRoRef = useRef<ResizeObserver | null>(null);\n const getItemRo = useCallback(() => {\n if (itemRoRef.current === null && typeof ResizeObserver !== 'undefined') {\n itemRoRef.current = new ResizeObserver(() => scheduleMeasurement(measurementAttempts));\n }\n return itemRoRef.current;\n }, [scheduleMeasurement]);\n\n const registerItem = useCallback(\n (index: number, element: HTMLElement | null) => {\n if (element) {\n itemsRef.current.set(index, element);\n itemGroupsRef.current.set(index, element.closest(GROUP_SELECTOR));\n getItemRo()?.observe(element);\n if (index === activeIndexRef.current) element.setAttribute(ACTIVE_ATTR, '');\n } else {\n const previous = itemsRef.current.get(index);\n if (previous) itemRoRef.current?.unobserve(previous);\n // The mark leaves with the element: a row that only moved to another\n // index (a filtering list re-ordering) must not carry it there.\n previous?.removeAttribute(ACTIVE_ATTR);\n itemsRef.current.delete(index);\n itemGroupsRef.current.delete(index);\n // The highlighted row is gone: nothing should stay lit or receive a\n // routed click until the pointer picks again. Decided when the\n // update applies, after this commit's registrations, so a row that\n // only moved index hands the highlight to the row now under it.\n if (index === activeIndexRef.current) {\n setActiveIndex(current => (current === index && !itemsRef.current.has(index) ? null : current));\n }\n }\n // Coalesce rapid register/unregister calls (e.g. when an AnimatePresence\n // remounts a list of rows) into a single remeasure on the next frame,\n // so consumers don't have to manually call measureItems after the\n // container's children swap. A lit row keeps its element (unregistering\n // it clears the highlight), so its rect stays good while the pass runs:\n // dropping readiness then would blink the highlight every time a\n // virtualized list mounts a row while scrolling.\n if (activeIndexRef.current === null) remeasure();\n else scheduleMeasurement(measurementAttempts);\n },\n [remeasure, scheduleMeasurement, getItemRo],\n );\n\n const handleMouseMove = useCallback(\n (e: React.MouseEvent) => {\n if (!isFromInside(e) || !(e.target instanceof Element)) return;\n const pointerTarget = e.target;\n const mouseX = e.clientX;\n const mouseY = e.clientY;\n\n if (rafIdRef.current !== null) {\n cancelAnimationFrame(rafIdRef.current);\n }\n\n rafIdRef.current = requestAnimationFrame(() => {\n rafIdRef.current = null;\n const container = containerRef.current;\n if (!container) return;\n const enclosingGroup = container.closest(GROUP_SELECTOR);\n const groupInside = (group: Element | null | undefined) => (group === enclosingGroup ? null : group);\n const pointerGroup = groupInside(pointerTarget.closest(GROUP_SELECTOR));\n setActiveIndex(\n pickNearest({\n axis,\n point: { x: mouseX, y: mouseY },\n rects: itemRectsRef.current,\n containerRect: container.getBoundingClientRect(),\n scroll: { x: container.scrollLeft, y: container.scrollTop },\n border: { x: container.clientLeft, y: container.clientTop },\n layoutSize: { width: container.offsetWidth, height: container.offsetHeight },\n isDisabled: index => {\n if (groupInside(itemGroupsRef.current.get(index)) !== pointerGroup) return true;\n const element = itemsRef.current.get(index);\n return !!element && !!isItemDisabled?.(element);\n },\n onlyBetweenItems: pointerGroup !== null,\n }),\n );\n });\n },\n [axis, containerRef, isItemDisabled],\n );\n\n const handleMouseLeave = useCallback((e: React.MouseEvent) => {\n if (!isFromInside(e)) return;\n if (rafIdRef.current !== null) {\n cancelAnimationFrame(rafIdRef.current);\n rafIdRef.current = null;\n }\n setActiveIndex(null);\n }, []);\n\n const handleClick = useCallback(\n (e: React.MouseEvent) => {\n // Outside the container in the DOM: a portaled child's click, or a row\n // that unmounted while its own click was still bubbling (a pick whose\n // primitive re-renders the list synchronously). Neither is a gap.\n const { target } = e;\n if (!(target instanceof Element) || !isFromInside(e)) return;\n // Inside an item: the item owns the click.\n for (const element of itemsRef.current.values()) {\n if (element.contains(target)) return;\n }\n // A control that sits between the rows (a search field at the top of\n // a menu, a footer button, a theme toggle) keeps its own click too.\n if (target.closest(CONTROL_BETWEEN_ROWS)) return;\n if (gapClick === false) return;\n if (isOverDisabledItem(itemsRef.current.values(), e, isItemDisabled)) return;\n const index = activeIndexRef.current;\n if (index === null) return;\n const element = itemsRef.current.get(index);\n if (!element || isItemDisabled?.(element)) return;\n if (gapClickMaxDistance !== Infinity) {\n const r = element.getBoundingClientRect();\n const dx = Math.max(r.left - e.clientX, 0, e.clientX - r.right);\n const dy = Math.max(r.top - e.clientY, 0, e.clientY - r.bottom);\n if (Math.hypot(dx, dy) > gapClickMaxDistance) return;\n }\n // A real DOM click on the item, so its own handlers (and the primitive\n // wrapping it, if any) run exactly as if the pointer had been inside.\n resolveActivator(element).click();\n },\n [isItemDisabled, gapClick, gapClickMaxDistance],\n );\n\n // Remeasure when the container resizes — a reflow moves items even though\n // the registered set is unchanged, which would otherwise leave itemRects\n // stale. Coalesced through the same rAF as register/unregister. Readiness is\n // deliberately not dropped: the item set is unchanged, so the published rects\n // stay usable, and hiding overlays on every reflow would flicker them.\n useEffect(() => {\n const container = containerRef.current;\n if (!container || typeof ResizeObserver === 'undefined') return;\n const ro = new ResizeObserver(() => scheduleMeasurement(measurementAttempts));\n ro.observe(container);\n return () => ro.disconnect();\n }, [containerRef, scheduleMeasurement]);\n\n // Clean up rAF and the item observer on unmount\n useEffect(() => {\n return () => {\n if (rafIdRef.current !== null) {\n cancelAnimationFrame(rafIdRef.current);\n }\n if (remeasureRafIdRef.current !== null) {\n cancelAnimationFrame(remeasureRafIdRef.current);\n }\n itemRoRef.current?.disconnect();\n itemRoRef.current = null;\n };\n }, []);\n\n return {\n activeIndex,\n setActiveIndex,\n itemRects,\n isMeasured,\n handlers: {\n onMouseMove: handleMouseMove,\n onMouseLeave: handleMouseLeave,\n onClick: handleClick,\n },\n registerItem,\n remeasure,\n measureItems,\n };\n}\n\n/**\n * Registers an item's element with its list for as long as it is mounted.\n * The one way rows join a list: pass the hook's `registerItem` (or the copy\n * a context hands down), the row's index, and its ref. Either may be\n * missing for a row rendered outside a list (a standalone card, an accordion\n * item that is not grouped); then nothing is registered.\n */\nexport function useRegisterFluidHoverItem(\n registerItem: ((index: number, element: HTMLElement | null) => void) | undefined,\n index: number | undefined,\n ref: RefObject<HTMLElement | null>,\n) {\n useEffect(() => {\n if (!registerItem || index === undefined) return;\n registerItem(index, ref.current);\n return () => registerItem(index, null);\n }, [index, registerItem, ref]);\n}\n"],"names":["useRef","useState","useEffect","useCallback","element"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-fluid-hover.es.js","sources":["../../src/hooks/use-fluid-hover.ts"],"sourcesContent":["'use client';\n\nimport { useRef, useState, useCallback, useEffect, type Dispatch, type RefObject, type SetStateAction } from 'react';\n\nexport interface ItemRect {\n top: number;\n height: number;\n left: number;\n width: number;\n radius: string;\n}\n\nexport interface UseFluidHoverOptions {\n /**\n * Which direction to resolve the nearest item along.\n * \"y\" — vertical lists (default): closest by top/height\n * \"x\" — horizontal strips: closest by left/width\n * \"xy\" — 2-D grids: closest card across both rows AND columns,\n * measured by Euclidean distance to each item's center\n */\n axis?: 'x' | 'y' | 'xy';\n /**\n * Makes an item invisible to hit-testing without unregistering it — for\n * rows that stay mounted while clipped away (a collapsed sub-tree).\n * Unregistering would invalidate every measurement; a skipped item keeps\n * the set stable. Consulted per mouse move, so keep it cheap.\n */\n isItemDisabled?: (element: HTMLElement) => boolean;\n /**\n * Whether a click that lands between items (a gap, the padding, past the\n * last row) is routed to the highlighted item, so what is lit is what a\n * click hits. On by default: in a menu or a list the highlight is a\n * promise about the click. Pass `false` where empty space should stay\n * inert (rows with destructive actions, generous whitespace), or\n * `{ maxDistance }` to route only clicks within that many pixels of the\n * highlighted item's edge.\n */\n gapClick?: boolean | { maxDistance?: number };\n}\n\nexport interface UseFluidHoverReturn {\n activeIndex: number | null;\n setActiveIndex: Dispatch<SetStateAction<number | null>>;\n itemRects: ItemRect[];\n /**\n * True once every registered item has been measured and no remeasure is\n * pending, i.e. `itemRects` describes the current item set. Gate absolutely\n * positioned overlays on it: an overlay that mounts against a rect a later\n * pass still corrects animates from the wrong place to the right one, which\n * reads as the highlight sliding in from another row.\n */\n isMeasured: boolean;\n /**\n * Events whose target sits outside the container in the DOM are ignored:\n * React bubbles events from a portaled child (a submenu) through its React\n * parents, and those must not steer or click this list.\n */\n handlers: {\n onMouseMove: (e: React.MouseEvent) => void;\n onMouseLeave: (e: React.MouseEvent) => void;\n /**\n * Routes a click that lands between items (a gap, the padding, past the\n * last row) to the highlighted item, so the highlight and the click agree:\n * what is lit is what a click hits. A click inside an item is left to the\n * item. Disabled items (`isItemDisabled`) are never activated.\n */\n onClick: (e: React.MouseEvent) => void;\n };\n registerItem: (index: number, element: HTMLElement | null) => void;\n /**\n * Invalidates the published rects and runs the hook's coalesced measurement\n * pass again, holding `isMeasured` false until it settles. Reach for it when\n * the rects may be wrong and showing an overlay against them would misplace\n * it: a popup that stays mounted between opens keeps its items registered,\n * so nothing else would notice that its rects were taken while it was\n * hidden. Registration, item resize, and container resize already trigger\n * a pass; do not call this on `children` changes.\n */\n remeasure: () => void;\n /**\n * Re-reads the rects synchronously, keeping `isMeasured` as it is. Only for\n * layout that moves the rows under a visible overlay frame by frame (the\n * accordion re-measures inside its height animation). Everything else\n * wants `remeasure`, or nothing.\n */\n measureItems: () => void;\n}\n\nexport interface PickNearestInput {\n axis: 'x' | 'y' | 'xy';\n /** The pointer, in viewport coordinates. */\n point: { x: number; y: number };\n /** Item rects in the container's layout space (sparse: unregistered slots\n * are undefined). */\n rects: readonly (ItemRect | undefined)[];\n /** The container's bounding rect and live scroll / border offsets, which\n * map layout rects into the pointer's viewport space. */\n containerRect: { left: number; top: number; width: number; height: number };\n scroll: { x: number; y: number };\n border: { x: number; y: number };\n /** Layout size of the container, so a cumulative ancestor `transform:\n * scale` (a popup mid scale-in) can be factored out per axis. */\n layoutSize: { width: number; height: number };\n /** Skips an item without unregistering it. */\n isDisabled?: (index: number) => boolean;\n /** Resolves nothing once the pointer leaves the span from the first item to the last. */\n onlyBetweenItems?: boolean;\n}\n\ninterface ViewportBox {\n left: number;\n top: number;\n right: number;\n bottom: number;\n}\n\nfunction boxContains(box: ViewportBox, point: { x: number; y: number }, axis: PickNearestInput['axis']) {\n const insideX = point.x >= box.left && point.x <= box.right;\n const insideY = point.y >= box.top && point.y <= box.bottom;\n if (axis === 'x') return insideX;\n if (axis === 'y') return insideY;\n return insideX && insideY;\n}\n\nfunction distanceToCenter(box: ViewportBox, point: { x: number; y: number }, axis: PickNearestInput['axis']) {\n const dx = point.x - (box.left + box.right) / 2;\n const dy = point.y - (box.top + box.bottom) / 2;\n if (axis === 'x') return Math.abs(dx);\n if (axis === 'y') return Math.abs(dy);\n return Math.hypot(dx, dy);\n}\n\nfunction isOverDisabledItem(\n items: Iterable<HTMLElement>,\n point: { clientX: number; clientY: number },\n isItemDisabled: ((element: HTMLElement) => boolean) | undefined,\n) {\n for (const element of items) {\n if (!isItemDisabled?.(element)) continue;\n const r = element.getBoundingClientRect();\n if (point.clientX >= r.left && point.clientX <= r.right && point.clientY >= r.top && point.clientY <= r.bottom) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * The rule, as one pure function: an item the pointer is inside wins;\n * otherwise the item whose center is nearest does, so a pointer in a gap, in\n * the padding, or past the last row still lands. `y` and `x` measure one\n * coordinate; `xy` measures the straight line to each center. Ties keep the\n * first item. The hook calls this once per animation frame; the docs page\n * times it.\n */\nexport function pickNearest({\n axis,\n point,\n rects,\n containerRect,\n scroll,\n border,\n layoutSize,\n isDisabled,\n onlyBetweenItems = false,\n}: PickNearestInput): number | null {\n const scaleX = layoutSize.width > 0 ? containerRect.width / layoutSize.width : 1;\n const scaleY = layoutSize.height > 0 ? containerRect.height / layoutSize.height : 1;\n let closestIndex: number | null = null;\n let closestDistance = Infinity;\n let containingIndex: number | null = null;\n const itemSpan: ViewportBox = { left: Infinity, top: Infinity, right: -Infinity, bottom: -Infinity };\n\n for (let index = 0; index < rects.length; index++) {\n const r = rects[index];\n if (!r) continue;\n if (isDisabled?.(index)) continue;\n\n const left = containerRect.left + (border.x + r.left - scroll.x) * scaleX;\n const top = containerRect.top + (border.y + r.top - scroll.y) * scaleY;\n const box: ViewportBox = { left, top, right: left + r.width * scaleX, bottom: top + r.height * scaleY };\n itemSpan.left = Math.min(itemSpan.left, box.left);\n itemSpan.top = Math.min(itemSpan.top, box.top);\n itemSpan.right = Math.max(itemSpan.right, box.right);\n itemSpan.bottom = Math.max(itemSpan.bottom, box.bottom);\n\n if (boxContains(box, point, axis)) containingIndex = index;\n const distance = distanceToCenter(box, point, axis);\n if (distance < closestDistance) {\n closestDistance = distance;\n closestIndex = index;\n }\n }\n\n if (onlyBetweenItems && !boxContains(itemSpan, point, axis)) return null;\n return containingIndex ?? closestIndex;\n}\n\n/** Set on the highlighted item (boolean attribute). */\nexport const ACTIVE_ATTR = 'data-fluid-hover-active';\n/** Set on the container: the highlighted index, or absent. */\nexport const ACTIVE_INDEX_ATTR = 'data-fluid-hover-active-index';\n/** Marks an element whose items form their own hover group: the highlight stays between that group's items. */\nexport const GROUP_ATTR = 'data-fluid-hover-group';\nconst GROUP_SELECTOR = `[${GROUP_ATTR}]`;\n\n/** False for an event bubbled through React from a portal outside the container, and for a detached target. */\nfunction isFromInside(e: React.SyntheticEvent) {\n return e.target instanceof Node && e.currentTarget.contains(e.target);\n}\n\nconst ACTIVATOR_SELECTOR =\n \"a[href], button, [role='menuitem'], [role='menuitemradio'], [role='menuitemcheckbox'], [role='option'], [role='radio'], [role='checkbox'], [role='tab'], [role='link'], [role='button']\";\n\n/**\n * The element a routed click should land on. A registered item is usually\n * the interactive row itself; when it is only a box around one (a sidebar\n * row around its button, a card around its link), the first control inside\n * is what a real click on the row would have reached.\n */\nfunction resolveActivator(element: HTMLElement): HTMLElement {\n if (element.matches(ACTIVATOR_SELECTOR) || element.hasAttribute('tabindex')) {\n return element;\n }\n return element.querySelector<HTMLElement>(ACTIVATOR_SELECTOR) ?? element;\n}\n\n/**\n * How many frames the coalesced remeasure retries while the registered items\n * still have no layout box. A popup can be in the DOM one frame before it is\n * laid out; retrying beats publishing zeroed rects, and the cap keeps a list\n * that stays hidden for good from spinning frames forever.\n */\nconst measurementAttempts = 3;\n\nconst CONTROL_BETWEEN_ROWS =\n \"input, textarea, select, button, a, label, summary, [contenteditable], [role='textbox'], [role='searchbox'], [role='button'], [role='link'], [role='radio'], [role='checkbox'], [role='switch'], [role='slider'], [role='spinbutton'], [role='tab'], [role='radiogroup'], [role='tablist'], [role='toolbar']\";\n\nexport function useFluidHover<T extends HTMLElement>(\n containerRef: RefObject<T | null>,\n options: UseFluidHoverOptions = {},\n): UseFluidHoverReturn {\n const { axis = 'y', isItemDisabled, gapClick = true } = options;\n const gapClickMaxDistance = typeof gapClick === 'object' ? (gapClick.maxDistance ?? Infinity) : Infinity;\n const itemsRef = useRef(new Map<number, HTMLElement>());\n const itemGroupsRef = useRef(new Map<number, Element | null>());\n const [activeIndex, setActiveIndex] = useState<number | null>(null);\n // Mirrored for handlers that read it outside a render (the gap click).\n const activeIndexRef = useRef<number | null>(null);\n activeIndexRef.current = activeIndex;\n\n // The state, in the DOM: `data-fluid-hover-active` on the highlighted item\n // and `data-fluid-hover-active-index` on the container. Devtools shows it\n // and a test asserts on it without waiting for a frame. React does not\n // manage these attributes, so it never clobbers them.\n useEffect(() => {\n const container = containerRef.current;\n if (activeIndex === null) container?.removeAttribute(ACTIVE_INDEX_ATTR);\n else container?.setAttribute(ACTIVE_INDEX_ATTR, String(activeIndex));\n const active = activeIndex === null ? undefined : itemsRef.current.get(activeIndex);\n active?.setAttribute(ACTIVE_ATTR, '');\n return () => {\n active?.removeAttribute(ACTIVE_ATTR);\n // A row that re-registered under this index while it was highlighted\n // (a remount under a new key) was marked by registerItem, not by this\n // effect: drop the mark from whatever element holds the index now.\n // eslint-disable-next-line react-hooks/exhaustive-deps -- itemsRef is a registry Map, reading it at cleanup is the point\n if (activeIndex !== null) itemsRef.current.get(activeIndex)?.removeAttribute(ACTIVE_ATTR);\n };\n }, [activeIndex, containerRef]);\n const [itemRects, setItemRects] = useState<ItemRect[]>([]);\n const [isMeasured, setIsMeasured] = useState(false);\n const itemRectsRef = useRef<ItemRect[]>([]);\n const rafIdRef = useRef<number | null>(null);\n const remeasureRafIdRef = useRef<number | null>(null);\n\n /**\n * Publishes a rect for every registered item that has a layout box. Returns\n * false when the measurement could not be completed (no container, or no\n * item with a layout box) — nothing is published in that case, so the last\n * complete measurement stands instead of being overwritten with zeroes.\n */\n const runMeasurement = useCallback(() => {\n const container = containerRef.current;\n if (!container) return false;\n const rects: ItemRect[] = [];\n let laidOutItemCount = 0;\n itemsRef.current.forEach((element, index) => {\n // An element inside a display:none / not-yet-laid-out popup has no\n // offsetParent and reports every offset as 0. When every item is like\n // that, publishing would pin overlays to the top of the list, so the\n // whole pass counts as incomplete. A boxless item among laid-out ones\n // (a row in a collapsed section) is just left out. `position: fixed`\n // items also have no offsetParent but do have a size.\n const hasLayoutBox = element.offsetParent !== null || element.offsetWidth > 0 || element.offsetHeight > 0;\n if (!hasLayoutBox) return;\n laidOutItemCount++;\n // Use offset* instead of getBoundingClientRect so measurements are\n // unaffected by CSS transforms (e.g. scaleY animation on the parent\n // motion.div). offsetTop/offsetLeft are layout values relative to the\n // offsetParent (the scroll container), matching the coordinate space\n // used by `position: absolute` children. Items nested inside positioned\n // descendants of the container (a sidebar sub-menu's rows live inside a\n // positioned row) accumulate those ancestors' offsets, so every rect\n // lands in the container's own coordinate space; for a flat list the\n // loop never runs and this is exactly the plain offsetTop/offsetLeft.\n let top = element.offsetTop;\n let left = element.offsetLeft;\n let ancestor = element.offsetParent;\n while (ancestor instanceof HTMLElement && ancestor !== container && container.contains(ancestor)) {\n top += ancestor.offsetTop + ancestor.clientTop;\n left += ancestor.offsetLeft + ancestor.clientLeft;\n ancestor = ancestor.offsetParent;\n }\n rects[index] = {\n top,\n height: element.offsetHeight,\n left,\n width: element.offsetWidth,\n radius: getComputedStyle(element).borderRadius,\n };\n });\n if (itemsRef.current.size > 0 && laidOutItemCount === 0) return false;\n // Skip the state update when nothing moved (a cheap per-field compare) so\n // redundant remeasures don't churn re-renders.\n const prev = itemRectsRef.current;\n let changed = prev.length !== rects.length;\n for (let i = 0; !changed && i < rects.length; i++) {\n const p = prev[i];\n const r = rects[i];\n if (p === r) continue; // both undefined (sparse slot)\n changed =\n !p ||\n !r ||\n p.top !== r.top ||\n p.left !== r.left ||\n p.width !== r.width ||\n p.height !== r.height ||\n p.radius !== r.radius;\n }\n if (changed) {\n itemRectsRef.current = rects;\n setItemRects(rects);\n }\n return true;\n }, [containerRef]);\n\n const measureItems = useCallback(() => {\n runMeasurement();\n }, [runMeasurement]);\n\n /**\n * The hook's single measurement pass: coalesces every trigger (item\n * registration, container resize) into one remeasure on the next frame and\n * is the only place readiness is reported, so `isMeasured` can never turn\n * true while another pass is still queued.\n */\n const scheduleMeasurement = useCallback(\n (attemptsLeft: number) => {\n if (remeasureRafIdRef.current !== null) {\n cancelAnimationFrame(remeasureRafIdRef.current);\n }\n remeasureRafIdRef.current = requestAnimationFrame(() => {\n remeasureRafIdRef.current = null;\n if (runMeasurement()) {\n setIsMeasured(true);\n } else if (attemptsLeft > 1) {\n scheduleMeasurement(attemptsLeft - 1);\n }\n });\n },\n [runMeasurement],\n );\n\n const remeasure = useCallback(() => {\n // Readiness drops first: until the pass below settles, the published rects\n // may not describe what is on screen, and an overlay positioned from them\n // would be corrected after mounting — which animates as a slide.\n setIsMeasured(false);\n scheduleMeasurement(measurementAttempts);\n }, [scheduleMeasurement]);\n\n // Observes the registered items themselves (not just the container): rows\n // that change size in place — e.g. the site-wide size step flipping while a\n // selection background is up — must invalidate the published rects even when\n // the container the effect below captured has since been remounted and the\n // ref points at a different element than the one being observed.\n const itemRoRef = useRef<ResizeObserver | null>(null);\n const getItemRo = useCallback(() => {\n if (itemRoRef.current === null && typeof ResizeObserver !== 'undefined') {\n itemRoRef.current = new ResizeObserver(() => scheduleMeasurement(measurementAttempts));\n }\n return itemRoRef.current;\n }, [scheduleMeasurement]);\n\n const registerItem = useCallback(\n (index: number, element: HTMLElement | null) => {\n if (element) {\n itemsRef.current.set(index, element);\n itemGroupsRef.current.set(index, element.closest(GROUP_SELECTOR));\n getItemRo()?.observe(element);\n if (index === activeIndexRef.current) element.setAttribute(ACTIVE_ATTR, '');\n } else {\n const previous = itemsRef.current.get(index);\n if (previous) itemRoRef.current?.unobserve(previous);\n // The mark leaves with the element: a row that only moved to another\n // index (a filtering list re-ordering) must not carry it there.\n previous?.removeAttribute(ACTIVE_ATTR);\n itemsRef.current.delete(index);\n itemGroupsRef.current.delete(index);\n // The highlighted row is gone: nothing should stay lit or receive a\n // routed click until the pointer picks again. Decided when the\n // update applies, after this commit's registrations, so a row that\n // only moved index hands the highlight to the row now under it.\n if (index === activeIndexRef.current) {\n setActiveIndex(current => (current === index && !itemsRef.current.has(index) ? null : current));\n }\n }\n // Coalesce rapid register/unregister calls (e.g. when an AnimatePresence\n // remounts a list of rows) into a single remeasure on the next frame,\n // so consumers don't have to manually call measureItems after the\n // container's children swap. A lit row keeps its element (unregistering\n // it clears the highlight), so its rect stays good while the pass runs:\n // dropping readiness then would blink the highlight every time a\n // virtualized list mounts a row while scrolling.\n if (activeIndexRef.current === null) remeasure();\n else scheduleMeasurement(measurementAttempts);\n },\n [remeasure, scheduleMeasurement, getItemRo],\n );\n\n const handleMouseMove = useCallback(\n (e: React.MouseEvent) => {\n if (!isFromInside(e) || !(e.target instanceof Element)) return;\n const pointerTarget = e.target;\n const mouseX = e.clientX;\n const mouseY = e.clientY;\n\n if (rafIdRef.current !== null) {\n cancelAnimationFrame(rafIdRef.current);\n }\n\n rafIdRef.current = requestAnimationFrame(() => {\n rafIdRef.current = null;\n const container = containerRef.current;\n if (!container) return;\n const enclosingGroup = container.closest(GROUP_SELECTOR);\n const groupInside = (group: Element | null | undefined) => (group === enclosingGroup ? null : group);\n const pointerGroup = groupInside(pointerTarget.closest(GROUP_SELECTOR));\n setActiveIndex(\n pickNearest({\n axis,\n point: { x: mouseX, y: mouseY },\n rects: itemRectsRef.current,\n containerRect: container.getBoundingClientRect(),\n scroll: { x: container.scrollLeft, y: container.scrollTop },\n border: { x: container.clientLeft, y: container.clientTop },\n layoutSize: { width: container.offsetWidth, height: container.offsetHeight },\n isDisabled: index => {\n if (groupInside(itemGroupsRef.current.get(index)) !== pointerGroup) return true;\n const element = itemsRef.current.get(index);\n return !!element && !!isItemDisabled?.(element);\n },\n onlyBetweenItems: pointerGroup !== null,\n }),\n );\n });\n },\n [axis, containerRef, isItemDisabled],\n );\n\n const handleMouseLeave = useCallback((e: React.MouseEvent) => {\n if (!isFromInside(e)) return;\n if (rafIdRef.current !== null) {\n cancelAnimationFrame(rafIdRef.current);\n rafIdRef.current = null;\n }\n setActiveIndex(null);\n }, []);\n\n const handleClick = useCallback(\n (e: React.MouseEvent) => {\n // Outside the container in the DOM: a portaled child's click, or a row\n // that unmounted while its own click was still bubbling (a pick whose\n // primitive re-renders the list synchronously). Neither is a gap.\n const { target } = e;\n if (!(target instanceof Element) || !isFromInside(e)) return;\n // Inside an item: the item owns the click.\n for (const element of itemsRef.current.values()) {\n if (element.contains(target)) return;\n }\n // A control that sits between the rows (a search field at the top of\n // a menu, a footer button, a theme toggle) keeps its own click too.\n if (target.closest(CONTROL_BETWEEN_ROWS)) return;\n if (gapClick === false) return;\n if (isOverDisabledItem(itemsRef.current.values(), e, isItemDisabled)) return;\n const index = activeIndexRef.current;\n if (index === null) return;\n const element = itemsRef.current.get(index);\n if (!element || isItemDisabled?.(element)) return;\n if (gapClickMaxDistance !== Infinity) {\n const r = element.getBoundingClientRect();\n const dx = Math.max(r.left - e.clientX, 0, e.clientX - r.right);\n const dy = Math.max(r.top - e.clientY, 0, e.clientY - r.bottom);\n if (Math.hypot(dx, dy) > gapClickMaxDistance) return;\n }\n // A real DOM click on the item, so its own handlers (and the primitive\n // wrapping it, if any) run exactly as if the pointer had been inside.\n resolveActivator(element).click();\n },\n [isItemDisabled, gapClick, gapClickMaxDistance],\n );\n\n // Remeasure when the container resizes — a reflow moves items even though\n // the registered set is unchanged, which would otherwise leave itemRects\n // stale. Coalesced through the same rAF as register/unregister. Readiness is\n // deliberately not dropped: the item set is unchanged, so the published rects\n // stay usable, and hiding overlays on every reflow would flicker them.\n useEffect(() => {\n const container = containerRef.current;\n if (!container || typeof ResizeObserver === 'undefined') return;\n const ro = new ResizeObserver(() => scheduleMeasurement(measurementAttempts));\n ro.observe(container);\n return () => ro.disconnect();\n }, [containerRef, scheduleMeasurement]);\n\n // Clean up rAF and the item observer on unmount\n useEffect(() => {\n return () => {\n if (rafIdRef.current !== null) {\n cancelAnimationFrame(rafIdRef.current);\n }\n if (remeasureRafIdRef.current !== null) {\n cancelAnimationFrame(remeasureRafIdRef.current);\n }\n itemRoRef.current?.disconnect();\n itemRoRef.current = null;\n };\n }, []);\n\n return {\n activeIndex,\n setActiveIndex,\n itemRects,\n isMeasured,\n handlers: {\n onMouseMove: handleMouseMove,\n onMouseLeave: handleMouseLeave,\n onClick: handleClick,\n },\n registerItem,\n remeasure,\n measureItems,\n };\n}\n\n/**\n * Registers an item's element with its list for as long as it is mounted.\n * The one way rows join a list: pass the hook's `registerItem` (or the copy\n * a context hands down), the row's index, and its ref. Either may be\n * missing for a row rendered outside a list (a standalone card, an accordion\n * item that is not grouped); then nothing is registered.\n */\nexport function useRegisterFluidHoverItem(\n registerItem: ((index: number, element: HTMLElement | null) => void) | undefined,\n index: number | undefined,\n ref: RefObject<HTMLElement | null>,\n) {\n useEffect(() => {\n if (!registerItem || index === undefined) return;\n registerItem(index, ref.current);\n return () => registerItem(index, null);\n }, [index, registerItem, ref]);\n}\n"],"names":["element"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"use-fluid-hover.es.js","sources":["../../src/hooks/use-fluid-hover.ts"],"sourcesContent":["'use client';\n\nimport { useRef, useState, useCallback, useEffect } from 'react';\nimport type { Dispatch, RefObject, SetStateAction } from 'react';\n\nexport interface ItemRect {\n top: number;\n height: number;\n left: number;\n width: number;\n radius: string;\n}\n\nexport interface UseFluidHoverOptions {\n /**\n * Which direction to resolve the nearest item along.\n * \"y\" — vertical lists (default): closest by top/height\n * \"x\" — horizontal strips: closest by left/width\n * \"xy\" — 2-D grids: closest card across both rows AND columns,\n * measured by Euclidean distance to each item's center\n */\n axis?: 'x' | 'y' | 'xy';\n /**\n * Makes an item invisible to hit-testing without unregistering it — for\n * rows that stay mounted while clipped away (a collapsed sub-tree).\n * Unregistering would invalidate every measurement; a skipped item keeps\n * the set stable. Consulted per mouse move, so keep it cheap.\n */\n isItemDisabled?: (element: HTMLElement) => boolean;\n /**\n * Whether a click that lands between items (a gap, the padding, past the\n * last row) is routed to the highlighted item, so what is lit is what a\n * click hits. On by default: in a menu or a list the highlight is a\n * promise about the click. Pass `false` where empty space should stay\n * inert (rows with destructive actions, generous whitespace), or\n * `{ maxDistance }` to route only clicks within that many pixels of the\n * highlighted item's edge.\n */\n gapClick?: boolean | { maxDistance?: number };\n}\n\nexport interface UseFluidHoverReturn {\n activeIndex: number | null;\n setActiveIndex: Dispatch<SetStateAction<number | null>>;\n itemRects: ItemRect[];\n /**\n * True once every registered item has been measured and no remeasure is\n * pending, i.e. `itemRects` describes the current item set. Gate absolutely\n * positioned overlays on it: an overlay that mounts against a rect a later\n * pass still corrects animates from the wrong place to the right one, which\n * reads as the highlight sliding in from another row.\n */\n isMeasured: boolean;\n /**\n * Events whose target sits outside the container in the DOM are ignored:\n * React bubbles events from a portaled child (a submenu) through its React\n * parents, and those must not steer or click this list.\n */\n handlers: {\n onMouseMove: (e: React.MouseEvent) => void;\n onMouseLeave: (e: React.MouseEvent) => void;\n /**\n * Routes a click that lands between items (a gap, the padding, past the\n * last row) to the highlighted item, so the highlight and the click agree:\n * what is lit is what a click hits. A click inside an item is left to the\n * item. Disabled items (`isItemDisabled`) are never activated.\n */\n onClick: (e: React.MouseEvent) => void;\n };\n registerItem: (index: number, element: HTMLElement | null) => void;\n /**\n * Invalidates the published rects and runs the hook's coalesced measurement\n * pass again, holding `isMeasured` false until it settles. Reach for it when\n * the rects may be wrong and showing an overlay against them would misplace\n * it: a popup that stays mounted between opens keeps its items registered,\n * so nothing else would notice that its rects were taken while it was\n * hidden. Registration, item resize, and container resize already trigger\n * a pass; do not call this on `children` changes.\n */\n remeasure: () => void;\n /**\n * Re-reads the rects synchronously, keeping `isMeasured` as it is. Only for\n * layout that moves the rows under a visible overlay frame by frame (the\n * accordion re-measures inside its height animation). Everything else\n * wants `remeasure`, or nothing.\n */\n measureItems: () => void;\n}\n\nexport interface PickNearestInput {\n axis: 'x' | 'y' | 'xy';\n /** The pointer, in viewport coordinates. */\n point: { x: number; y: number };\n /** Item rects in the container's layout space (sparse: unregistered slots\n * are undefined). */\n rects: readonly (ItemRect | undefined)[];\n /** The container's bounding rect and live scroll / border offsets, which\n * map layout rects into the pointer's viewport space. */\n containerRect: { left: number; top: number; width: number; height: number };\n scroll: { x: number; y: number };\n border: { x: number; y: number };\n /** Layout size of the container, so a cumulative ancestor `transform:\n * scale` (a popup mid scale-in) can be factored out per axis. */\n layoutSize: { width: number; height: number };\n /** Skips an item without unregistering it. */\n isDisabled?: (index: number) => boolean;\n /** Resolves nothing once the pointer leaves the span from the first item to the last. */\n onlyBetweenItems?: boolean;\n}\n\ninterface ViewportBox {\n left: number;\n top: number;\n right: number;\n bottom: number;\n}\n\nfunction boxContains(box: ViewportBox, point: { x: number; y: number }, axis: PickNearestInput['axis']) {\n const insideX = point.x >= box.left && point.x <= box.right;\n const insideY = point.y >= box.top && point.y <= box.bottom;\n if (axis === 'x') return insideX;\n if (axis === 'y') return insideY;\n return insideX && insideY;\n}\n\nfunction distanceToCenter(box: ViewportBox, point: { x: number; y: number }, axis: PickNearestInput['axis']) {\n const dx = point.x - (box.left + box.right) / 2;\n const dy = point.y - (box.top + box.bottom) / 2;\n if (axis === 'x') return Math.abs(dx);\n if (axis === 'y') return Math.abs(dy);\n return Math.hypot(dx, dy);\n}\n\nfunction isOverDisabledItem(\n items: Iterable<HTMLElement>,\n point: { clientX: number; clientY: number },\n isItemDisabled: ((element: HTMLElement) => boolean) | undefined,\n) {\n for (const element of items) {\n if (!isItemDisabled?.(element)) continue;\n const r = element.getBoundingClientRect();\n if (point.clientX >= r.left && point.clientX <= r.right && point.clientY >= r.top && point.clientY <= r.bottom) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * The rule, as one pure function: an item the pointer is inside wins;\n * otherwise the item whose center is nearest does, so a pointer in a gap, in\n * the padding, or past the last row still lands. `y` and `x` measure one\n * coordinate; `xy` measures the straight line to each center. Ties keep the\n * first item. The hook calls this once per animation frame; the docs page\n * times it.\n */\nexport function pickNearest({\n axis,\n point,\n rects,\n containerRect,\n scroll,\n border,\n layoutSize,\n isDisabled,\n onlyBetweenItems = false,\n}: PickNearestInput): number | null {\n const scaleX = layoutSize.width > 0 ? containerRect.width / layoutSize.width : 1;\n const scaleY = layoutSize.height > 0 ? containerRect.height / layoutSize.height : 1;\n let closestIndex: number | null = null;\n let closestDistance = Infinity;\n let containingIndex: number | null = null;\n const itemSpan: ViewportBox = { left: Infinity, top: Infinity, right: -Infinity, bottom: -Infinity };\n\n for (let index = 0; index < rects.length; index++) {\n const r = rects[index];\n if (!r) continue;\n if (isDisabled?.(index)) continue;\n\n const left = containerRect.left + (border.x + r.left - scroll.x) * scaleX;\n const top = containerRect.top + (border.y + r.top - scroll.y) * scaleY;\n const box: ViewportBox = { left, top, right: left + r.width * scaleX, bottom: top + r.height * scaleY };\n itemSpan.left = Math.min(itemSpan.left, box.left);\n itemSpan.top = Math.min(itemSpan.top, box.top);\n itemSpan.right = Math.max(itemSpan.right, box.right);\n itemSpan.bottom = Math.max(itemSpan.bottom, box.bottom);\n\n if (boxContains(box, point, axis)) containingIndex = index;\n const distance = distanceToCenter(box, point, axis);\n if (distance < closestDistance) {\n closestDistance = distance;\n closestIndex = index;\n }\n }\n\n if (onlyBetweenItems && !boxContains(itemSpan, point, axis)) return null;\n return containingIndex ?? closestIndex;\n}\n\n/** Set on the highlighted item (boolean attribute). */\nexport const ACTIVE_ATTR = 'data-fluid-hover-active';\n/** Set on the container: the highlighted index, or absent. */\nexport const ACTIVE_INDEX_ATTR = 'data-fluid-hover-active-index';\n/** Marks an element whose items form their own hover group: the highlight stays between that group's items. */\nexport const GROUP_ATTR = 'data-fluid-hover-group';\nconst GROUP_SELECTOR = `[${GROUP_ATTR}]`;\n\n/** False for an event bubbled through React from a portal outside the container, and for a detached target. */\nfunction isFromInside(e: React.SyntheticEvent) {\n return e.target instanceof Node && e.currentTarget.contains(e.target);\n}\n\nconst ACTIVATOR_SELECTOR =\n \"a[href], button, [role='menuitem'], [role='menuitemradio'], [role='menuitemcheckbox'], [role='option'], [role='radio'], [role='checkbox'], [role='tab'], [role='link'], [role='button']\";\n\n/**\n * The element a routed click should land on. A registered item is usually\n * the interactive row itself; when it is only a box around one (a sidebar\n * row around its button, a card around its link), the first control inside\n * is what a real click on the row would have reached.\n */\nfunction resolveActivator(element: HTMLElement): HTMLElement {\n if (element.matches(ACTIVATOR_SELECTOR) || element.hasAttribute('tabindex')) {\n return element;\n }\n return element.querySelector<HTMLElement>(ACTIVATOR_SELECTOR) ?? element;\n}\n\n/**\n * How many frames the coalesced remeasure retries while the registered items\n * still have no layout box. A popup can be in the DOM one frame before it is\n * laid out; retrying beats publishing zeroed rects, and the cap keeps a list\n * that stays hidden for good from spinning frames forever.\n */\nconst measurementAttempts = 3;\n\nconst CONTROL_BETWEEN_ROWS =\n \"input, textarea, select, button, a, label, summary, [contenteditable], [role='textbox'], [role='searchbox'], [role='button'], [role='link'], [role='radio'], [role='checkbox'], [role='switch'], [role='slider'], [role='spinbutton'], [role='tab'], [role='radiogroup'], [role='tablist'], [role='toolbar']\";\n\nexport function useFluidHover<T extends HTMLElement>(\n containerRef: RefObject<T | null>,\n options: UseFluidHoverOptions = {},\n): UseFluidHoverReturn {\n const { axis = 'y', isItemDisabled, gapClick = true } = options;\n const gapClickMaxDistance = typeof gapClick === 'object' ? (gapClick.maxDistance ?? Infinity) : Infinity;\n const itemsRef = useRef(new Map<number, HTMLElement>());\n const itemGroupsRef = useRef(new Map<number, Element | null>());\n const [activeIndex, setActiveIndex] = useState<number | null>(null);\n // Mirrored for handlers that read it outside a render (the gap click).\n const activeIndexRef = useRef<number | null>(null);\n activeIndexRef.current = activeIndex;\n\n // The state, in the DOM: `data-fluid-hover-active` on the highlighted item\n // and `data-fluid-hover-active-index` on the container. Devtools shows it\n // and a test asserts on it without waiting for a frame. React does not\n // manage these attributes, so it never clobbers them.\n useEffect(() => {\n const container = containerRef.current;\n if (activeIndex === null) container?.removeAttribute(ACTIVE_INDEX_ATTR);\n else container?.setAttribute(ACTIVE_INDEX_ATTR, String(activeIndex));\n const active = activeIndex === null ? undefined : itemsRef.current.get(activeIndex);\n active?.setAttribute(ACTIVE_ATTR, '');\n return () => {\n active?.removeAttribute(ACTIVE_ATTR);\n // A row that re-registered under this index while it was highlighted\n // (a remount under a new key) was marked by registerItem, not by this\n // effect: drop the mark from whatever element holds the index now.\n // eslint-disable-next-line react-hooks/exhaustive-deps -- itemsRef is a registry Map, reading it at cleanup is the point\n if (activeIndex !== null) itemsRef.current.get(activeIndex)?.removeAttribute(ACTIVE_ATTR);\n };\n }, [activeIndex, containerRef]);\n const [itemRects, setItemRects] = useState<ItemRect[]>([]);\n const [isMeasured, setIsMeasured] = useState(false);\n const itemRectsRef = useRef<ItemRect[]>([]);\n const rafIdRef = useRef<number | null>(null);\n const remeasureRafIdRef = useRef<number | null>(null);\n\n /**\n * Publishes a rect for every registered item that has a layout box. Returns\n * false when the measurement could not be completed (no container, or no\n * item with a layout box) — nothing is published in that case, so the last\n * complete measurement stands instead of being overwritten with zeroes.\n */\n const runMeasurement = useCallback(() => {\n const container = containerRef.current;\n if (!container) return false;\n const rects: ItemRect[] = [];\n let laidOutItemCount = 0;\n itemsRef.current.forEach((element, index) => {\n // An element inside a display:none / not-yet-laid-out popup has no\n // offsetParent and reports every offset as 0. When every item is like\n // that, publishing would pin overlays to the top of the list, so the\n // whole pass counts as incomplete. A boxless item among laid-out ones\n // (a row in a collapsed section) is just left out. `position: fixed`\n // items also have no offsetParent but do have a size.\n const hasLayoutBox = element.offsetParent !== null || element.offsetWidth > 0 || element.offsetHeight > 0;\n if (!hasLayoutBox) return;\n laidOutItemCount++;\n // Use offset* instead of getBoundingClientRect so measurements are\n // unaffected by CSS transforms (e.g. scaleY animation on the parent\n // motion.div). offsetTop/offsetLeft are layout values relative to the\n // offsetParent (the scroll container), matching the coordinate space\n // used by `position: absolute` children. Items nested inside positioned\n // descendants of the container (a sidebar sub-menu's rows live inside a\n // positioned row) accumulate those ancestors' offsets, so every rect\n // lands in the container's own coordinate space; for a flat list the\n // loop never runs and this is exactly the plain offsetTop/offsetLeft.\n let top = element.offsetTop;\n let left = element.offsetLeft;\n let ancestor = element.offsetParent;\n while (ancestor instanceof HTMLElement && ancestor !== container && container.contains(ancestor)) {\n top += ancestor.offsetTop + ancestor.clientTop;\n left += ancestor.offsetLeft + ancestor.clientLeft;\n ancestor = ancestor.offsetParent;\n }\n rects[index] = {\n top,\n height: element.offsetHeight,\n left,\n width: element.offsetWidth,\n radius: getComputedStyle(element).borderRadius,\n };\n });\n if (itemsRef.current.size > 0 && laidOutItemCount === 0) return false;\n // Skip the state update when nothing moved (a cheap per-field compare) so\n // redundant remeasures don't churn re-renders.\n const prev = itemRectsRef.current;\n let changed = prev.length !== rects.length;\n for (let i = 0; !changed && i < rects.length; i++) {\n const p = prev[i];\n const r = rects[i];\n if (p === r) continue; // both undefined (sparse slot)\n changed =\n !p ||\n !r ||\n p.top !== r.top ||\n p.left !== r.left ||\n p.width !== r.width ||\n p.height !== r.height ||\n p.radius !== r.radius;\n }\n if (changed) {\n itemRectsRef.current = rects;\n setItemRects(rects);\n }\n return true;\n }, [containerRef]);\n\n const measureItems = useCallback(() => {\n runMeasurement();\n }, [runMeasurement]);\n\n /**\n * The hook's single measurement pass: coalesces every trigger (item\n * registration, container resize) into one remeasure on the next frame and\n * is the only place readiness is reported, so `isMeasured` can never turn\n * true while another pass is still queued.\n */\n const scheduleMeasurement = useCallback(\n (attemptsLeft: number) => {\n if (remeasureRafIdRef.current !== null) {\n cancelAnimationFrame(remeasureRafIdRef.current);\n }\n remeasureRafIdRef.current = requestAnimationFrame(() => {\n remeasureRafIdRef.current = null;\n if (runMeasurement()) {\n setIsMeasured(true);\n } else if (attemptsLeft > 1) {\n scheduleMeasurement(attemptsLeft - 1);\n }\n });\n },\n [runMeasurement],\n );\n\n const remeasure = useCallback(() => {\n // Readiness drops first: until the pass below settles, the published rects\n // may not describe what is on screen, and an overlay positioned from them\n // would be corrected after mounting — which animates as a slide.\n setIsMeasured(false);\n scheduleMeasurement(measurementAttempts);\n }, [scheduleMeasurement]);\n\n // Observes the registered items themselves (not just the container): rows\n // that change size in place — e.g. the site-wide size step flipping while a\n // selection background is up — must invalidate the published rects even when\n // the container the effect below captured has since been remounted and the\n // ref points at a different element than the one being observed.\n const itemRoRef = useRef<ResizeObserver | null>(null);\n const getItemRo = useCallback(() => {\n if (itemRoRef.current === null && typeof ResizeObserver !== 'undefined') {\n itemRoRef.current = new ResizeObserver(() => scheduleMeasurement(measurementAttempts));\n }\n return itemRoRef.current;\n }, [scheduleMeasurement]);\n\n const registerItem = useCallback(\n (index: number, element: HTMLElement | null) => {\n if (element) {\n itemsRef.current.set(index, element);\n itemGroupsRef.current.set(index, element.closest(GROUP_SELECTOR));\n getItemRo()?.observe(element);\n if (index === activeIndexRef.current) element.setAttribute(ACTIVE_ATTR, '');\n } else {\n const previous = itemsRef.current.get(index);\n if (previous) itemRoRef.current?.unobserve(previous);\n // The mark leaves with the element: a row that only moved to another\n // index (a filtering list re-ordering) must not carry it there.\n previous?.removeAttribute(ACTIVE_ATTR);\n itemsRef.current.delete(index);\n itemGroupsRef.current.delete(index);\n // The highlighted row is gone: nothing should stay lit or receive a\n // routed click until the pointer picks again. Decided when the\n // update applies, after this commit's registrations, so a row that\n // only moved index hands the highlight to the row now under it.\n if (index === activeIndexRef.current) {\n setActiveIndex(current => (current === index && !itemsRef.current.has(index) ? null : current));\n }\n }\n // Coalesce rapid register/unregister calls (e.g. when an AnimatePresence\n // remounts a list of rows) into a single remeasure on the next frame,\n // so consumers don't have to manually call measureItems after the\n // container's children swap. A lit row keeps its element (unregistering\n // it clears the highlight), so its rect stays good while the pass runs:\n // dropping readiness then would blink the highlight every time a\n // virtualized list mounts a row while scrolling.\n if (activeIndexRef.current === null) remeasure();\n else scheduleMeasurement(measurementAttempts);\n },\n [remeasure, scheduleMeasurement, getItemRo],\n );\n\n const handleMouseMove = useCallback(\n (e: React.MouseEvent) => {\n if (!isFromInside(e) || !(e.target instanceof Element)) return;\n const pointerTarget = e.target;\n const mouseX = e.clientX;\n const mouseY = e.clientY;\n\n if (rafIdRef.current !== null) {\n cancelAnimationFrame(rafIdRef.current);\n }\n\n rafIdRef.current = requestAnimationFrame(() => {\n rafIdRef.current = null;\n const container = containerRef.current;\n if (!container) return;\n const enclosingGroup = container.closest(GROUP_SELECTOR);\n const groupInside = (group: Element | null | undefined) => (group === enclosingGroup ? null : group);\n const pointerGroup = groupInside(pointerTarget.closest(GROUP_SELECTOR));\n setActiveIndex(\n pickNearest({\n axis,\n point: { x: mouseX, y: mouseY },\n rects: itemRectsRef.current,\n containerRect: container.getBoundingClientRect(),\n scroll: { x: container.scrollLeft, y: container.scrollTop },\n border: { x: container.clientLeft, y: container.clientTop },\n layoutSize: { width: container.offsetWidth, height: container.offsetHeight },\n isDisabled: index => {\n if (groupInside(itemGroupsRef.current.get(index)) !== pointerGroup) return true;\n const element = itemsRef.current.get(index);\n return !!element && !!isItemDisabled?.(element);\n },\n onlyBetweenItems: pointerGroup !== null,\n }),\n );\n });\n },\n [axis, containerRef, isItemDisabled],\n );\n\n const handleMouseLeave = useCallback((e: React.MouseEvent) => {\n if (!isFromInside(e)) return;\n if (rafIdRef.current !== null) {\n cancelAnimationFrame(rafIdRef.current);\n rafIdRef.current = null;\n }\n setActiveIndex(null);\n }, []);\n\n const handleClick = useCallback(\n (e: React.MouseEvent) => {\n // Outside the container in the DOM: a portaled child's click, or a row\n // that unmounted while its own click was still bubbling (a pick whose\n // primitive re-renders the list synchronously). Neither is a gap.\n const { target } = e;\n if (!(target instanceof Element) || !isFromInside(e)) return;\n // Inside an item: the item owns the click.\n for (const element of itemsRef.current.values()) {\n if (element.contains(target)) return;\n }\n // A control that sits between the rows (a search field at the top of\n // a menu, a footer button, a theme toggle) keeps its own click too.\n if (target.closest(CONTROL_BETWEEN_ROWS)) return;\n if (gapClick === false) return;\n if (isOverDisabledItem(itemsRef.current.values(), e, isItemDisabled)) return;\n const index = activeIndexRef.current;\n if (index === null) return;\n const element = itemsRef.current.get(index);\n if (!element || isItemDisabled?.(element)) return;\n if (gapClickMaxDistance !== Infinity) {\n const r = element.getBoundingClientRect();\n const dx = Math.max(r.left - e.clientX, 0, e.clientX - r.right);\n const dy = Math.max(r.top - e.clientY, 0, e.clientY - r.bottom);\n if (Math.hypot(dx, dy) > gapClickMaxDistance) return;\n }\n // A real DOM click on the item, so its own handlers (and the primitive\n // wrapping it, if any) run exactly as if the pointer had been inside.\n resolveActivator(element).click();\n },\n [isItemDisabled, gapClick, gapClickMaxDistance],\n );\n\n // Remeasure when the container resizes — a reflow moves items even though\n // the registered set is unchanged, which would otherwise leave itemRects\n // stale. Coalesced through the same rAF as register/unregister. Readiness is\n // deliberately not dropped: the item set is unchanged, so the published rects\n // stay usable, and hiding overlays on every reflow would flicker them.\n useEffect(() => {\n const container = containerRef.current;\n if (!container || typeof ResizeObserver === 'undefined') return;\n const ro = new ResizeObserver(() => scheduleMeasurement(measurementAttempts));\n ro.observe(container);\n return () => ro.disconnect();\n }, [containerRef, scheduleMeasurement]);\n\n // Clean up rAF and the item observer on unmount\n useEffect(() => {\n return () => {\n if (rafIdRef.current !== null) {\n cancelAnimationFrame(rafIdRef.current);\n }\n if (remeasureRafIdRef.current !== null) {\n cancelAnimationFrame(remeasureRafIdRef.current);\n }\n itemRoRef.current?.disconnect();\n itemRoRef.current = null;\n };\n }, []);\n\n return {\n activeIndex,\n setActiveIndex,\n itemRects,\n isMeasured,\n handlers: {\n onMouseMove: handleMouseMove,\n onMouseLeave: handleMouseLeave,\n onClick: handleClick,\n },\n registerItem,\n remeasure,\n measureItems,\n };\n}\n\n/**\n * Registers an item's element with its list for as long as it is mounted.\n * The one way rows join a list: pass the hook's `registerItem` (or the copy\n * a context hands down), the row's index, and its ref. Either may be\n * missing for a row rendered outside a list (a standalone card, an accordion\n * item that is not grouped); then nothing is registered.\n */\nexport function useRegisterFluidHoverItem(\n registerItem: ((index: number, element: HTMLElement | null) => void) | undefined,\n index: number | undefined,\n ref: RefObject<HTMLElement | null>,\n) {\n useEffect(() => {\n if (!registerItem || index === undefined) return;\n registerItem(index, ref.current);\n return () => registerItem(index, null);\n }, [index, registerItem, ref]);\n}\n"],"names":["element"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Icon.cjs.js","sources":["../../src/ds/icons/Icon.tsx"],"sourcesContent":["import type { HTMLAttributes, ReactNode } from 'react';\nimport { iconSizeClasses
|
|
1
|
+
{"version":3,"file":"Icon.cjs.js","sources":["../../src/ds/icons/Icon.tsx"],"sourcesContent":["import type { HTMLAttributes, ReactNode } from 'react';\nimport { iconSizeClasses } from './icon-size-classes';\nimport type { IconSize } from './icon-size-classes';\nimport { cn } from '@/lib/utils';\n\nexport type { IconSize } from './icon-size-classes';\n\nexport interface IconProps extends HTMLAttributes<HTMLSpanElement> {\n children: ReactNode;\n className?: string;\n size?: IconSize;\n}\n\nexport const Icon = ({ children, className, size = 'md', ...props }: IconProps) => {\n return (\n <span data-slot=\"icon\" className={cn('block', iconSizeClasses[size], className)} {...props}>\n {children}\n </span>\n );\n};\n"],"names":["jsx","cn","iconSizeClasses"],"mappings":";;;;;;;;AAaO,MAAM,IAAA,GAAO,CAAC,EAAE,QAAA,EAAU,WAAW,IAAA,GAAO,IAAA,EAAM,GAAG,KAAA,EAAM,KAAiB;AACjF,EAAA,uBACEA,cAAA,CAAC,MAAA,EAAA,EAAK,WAAA,EAAU,MAAA,EAAO,WAAWC,WAAA,CAAG,OAAA,EAASC,qCAAA,CAAgB,IAAI,CAAA,EAAG,SAAS,CAAA,EAAI,GAAG,OAClF,QAAA,EACH,CAAA;AAEJ;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Icon.es.js","sources":["../../src/ds/icons/Icon.tsx"],"sourcesContent":["import type { HTMLAttributes, ReactNode } from 'react';\nimport { iconSizeClasses
|
|
1
|
+
{"version":3,"file":"Icon.es.js","sources":["../../src/ds/icons/Icon.tsx"],"sourcesContent":["import type { HTMLAttributes, ReactNode } from 'react';\nimport { iconSizeClasses } from './icon-size-classes';\nimport type { IconSize } from './icon-size-classes';\nimport { cn } from '@/lib/utils';\n\nexport type { IconSize } from './icon-size-classes';\n\nexport interface IconProps extends HTMLAttributes<HTMLSpanElement> {\n children: ReactNode;\n className?: string;\n size?: IconSize;\n}\n\nexport const Icon = ({ children, className, size = 'md', ...props }: IconProps) => {\n return (\n <span data-slot=\"icon\" className={cn('block', iconSizeClasses[size], className)} {...props}>\n {children}\n </span>\n );\n};\n"],"names":[],"mappings":";;;;AAaO,MAAM,IAAA,GAAO,CAAC,EAAE,QAAA,EAAU,WAAW,IAAA,GAAO,IAAA,EAAM,GAAG,KAAA,EAAM,KAAiB;AACjF,EAAA,uBACE,GAAA,CAAC,MAAA,EAAA,EAAK,WAAA,EAAU,MAAA,EAAO,WAAW,EAAA,CAAG,OAAA,EAAS,eAAA,CAAgB,IAAI,CAAA,EAAG,SAAS,CAAA,EAAI,GAAG,OAClF,QAAA,EACH,CAAA;AAEJ;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SkillIcon.cjs.js","sources":["../../src/ds/icons/SkillIcon.tsx"],"sourcesContent":["import { Wand2 } from 'lucide-react';\nimport React from 'react';\n\nexport const SkillIcon = (props: React.SVGProps<SVGSVGElement>) =>
|
|
1
|
+
{"version":3,"file":"SkillIcon.cjs.js","sources":["../../src/ds/icons/SkillIcon.tsx"],"sourcesContent":["import { Wand2 } from 'lucide-react';\nimport React from 'react';\n\nexport const SkillIcon = (props: React.SVGProps<SVGSVGElement>) => <Wand2 {...props} />;\n"],"names":["jsx","Wand2"],"mappings":";;;;;;;AAGO,MAAM,YAAY,CAAC,KAAA,qBAAyCA,cAAA,CAACC,iBAAA,EAAA,EAAO,GAAG,KAAA,EAAO;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SkillIcon.es.js","sources":["../../src/ds/icons/SkillIcon.tsx"],"sourcesContent":["import { Wand2 } from 'lucide-react';\nimport React from 'react';\n\nexport const SkillIcon = (props: React.SVGProps<SVGSVGElement>) =>
|
|
1
|
+
{"version":3,"file":"SkillIcon.es.js","sources":["../../src/ds/icons/SkillIcon.tsx"],"sourcesContent":["import { Wand2 } from 'lucide-react';\nimport React from 'react';\n\nexport const SkillIcon = (props: React.SVGProps<SVGSVGElement>) => <Wand2 {...props} />;\n"],"names":[],"mappings":";;;AAGO,MAAM,YAAY,CAAC,KAAA,qBAAyC,GAAA,CAAC,KAAA,EAAA,EAAO,GAAG,KAAA,EAAO;;;;"}
|
|
@@ -3,10 +3,10 @@
|
|
|
3
3
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
4
4
|
|
|
5
5
|
const iconSizeClasses = {
|
|
6
|
-
xs: "[&>svg]:size-icon-xs
|
|
7
|
-
sm: "[&>svg]:size-icon-sm
|
|
8
|
-
md: "[&>svg]:size-icon-md
|
|
9
|
-
lg: "[&>svg]:size-icon-lg
|
|
6
|
+
xs: "[&>svg]:size-icon-xs",
|
|
7
|
+
sm: "[&>svg]:size-icon-sm",
|
|
8
|
+
md: "[&>svg]:size-icon-md",
|
|
9
|
+
lg: "[&>svg]:size-icon-lg"
|
|
10
10
|
};
|
|
11
11
|
|
|
12
12
|
exports.iconSizeClasses = iconSizeClasses;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"icon-size-classes.cjs.js","sources":["../../src/ds/icons/icon-size-classes.ts"],"sourcesContent":["export type IconSize = 'xs' | 'sm' | 'md' | 'lg';\n\n//
|
|
1
|
+
{"version":3,"file":"icon-size-classes.cjs.js","sources":["../../src/ds/icons/icon-size-classes.ts"],"sourcesContent":["export type IconSize = 'xs' | 'sm' | 'md' | 'lg';\n\n// One rung per icon size. Line weight comes from `--icon-stroke-width` (see\n// `components.css`), so nothing here sets a stroke. The selector is `[&>svg]`, so a\n// control that renders a bare `<svg>` child rather than an `<Icon>` wrapper reads the\n// same rung from this one map.\nexport const iconSizeClasses: Record<IconSize, string> = {\n xs: '[&>svg]:size-icon-xs',\n sm: '[&>svg]:size-icon-sm',\n md: '[&>svg]:size-icon-md',\n lg: '[&>svg]:size-icon-lg',\n};\n"],"names":[],"mappings":";;;;AAMO,MAAM,eAAA,GAA4C;AAAA,EACvD,EAAA,EAAI,sBAAA;AAAA,EACJ,EAAA,EAAI,sBAAA;AAAA,EACJ,EAAA,EAAI,sBAAA;AAAA,EACJ,EAAA,EAAI;AACN;;;;"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
const iconSizeClasses = {
|
|
2
|
-
xs: "[&>svg]:size-icon-xs
|
|
3
|
-
sm: "[&>svg]:size-icon-sm
|
|
4
|
-
md: "[&>svg]:size-icon-md
|
|
5
|
-
lg: "[&>svg]:size-icon-lg
|
|
2
|
+
xs: "[&>svg]:size-icon-xs",
|
|
3
|
+
sm: "[&>svg]:size-icon-sm",
|
|
4
|
+
md: "[&>svg]:size-icon-md",
|
|
5
|
+
lg: "[&>svg]:size-icon-lg"
|
|
6
6
|
};
|
|
7
7
|
|
|
8
8
|
export { iconSizeClasses };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"icon-size-classes.es.js","sources":["../../src/ds/icons/icon-size-classes.ts"],"sourcesContent":["export type IconSize = 'xs' | 'sm' | 'md' | 'lg';\n\n//
|
|
1
|
+
{"version":3,"file":"icon-size-classes.es.js","sources":["../../src/ds/icons/icon-size-classes.ts"],"sourcesContent":["export type IconSize = 'xs' | 'sm' | 'md' | 'lg';\n\n// One rung per icon size. Line weight comes from `--icon-stroke-width` (see\n// `components.css`), so nothing here sets a stroke. The selector is `[&>svg]`, so a\n// control that renders a bare `<svg>` child rather than an `<Icon>` wrapper reads the\n// same rung from this one map.\nexport const iconSizeClasses: Record<IconSize, string> = {\n xs: '[&>svg]:size-icon-xs',\n sm: '[&>svg]:size-icon-sm',\n md: '[&>svg]:size-icon-md',\n lg: '[&>svg]:size-icon-lg',\n};\n"],"names":[],"mappings":"AAMO,MAAM,eAAA,GAA4C;AAAA,EACvD,EAAA,EAAI,sBAAA;AAAA,EACJ,EAAA,EAAI,sBAAA;AAAA,EACJ,EAAA,EAAI,sBAAA;AAAA,EACJ,EAAA,EAAI;AACN;;;;"}
|
|
@@ -2,7 +2,7 @@ import { jsx } from 'react/jsx-runtime';
|
|
|
2
2
|
import { Input } from '@base-ui/react/input';
|
|
3
3
|
import { c as cva } from './index-CHS9F_Eo.js';
|
|
4
4
|
import * as React from 'react';
|
|
5
|
-
import { B as Button } from './Button-
|
|
5
|
+
import { B as Button } from './Button-D8a5EWJ5.js';
|
|
6
6
|
import { k as keepOwnAccessibleName } from './field-control-aria-DB6y41tQ.js';
|
|
7
7
|
import { ControlSizeContext, controlHeight } from './primitives/control-size.es.js';
|
|
8
8
|
import { deprecatedErrorAria, fieldErrorRimWithin, inputSurfaceAndFocusWithinStyle } from './primitives/form-element.es.js';
|
|
@@ -196,4 +196,4 @@ function InputGroupButton({ size = "icon-sm", variant = "ghost", type = "button"
|
|
|
196
196
|
}
|
|
197
197
|
|
|
198
198
|
export { InputGroup as I, InputGroupAddon as a, InputGroupButton as b, InputGroupInput as c, InputGroupText as d, InputGroupTextarea as e, inputGroupControlClassName as f, inputGroupClassName as i };
|
|
199
|
-
//# sourceMappingURL=input-group-
|
|
199
|
+
//# sourceMappingURL=input-group-BAg6iSIe.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"input-group-CiBbTaPP.js","sources":["../src/ds/components/InputGroup/input-group.tsx"],"sourcesContent":["import { Input as InputPrimitive } from '@base-ui/react/input';\nimport { cva } from 'class-variance-authority';\nimport type { VariantProps } from 'class-variance-authority';\nimport * as React from 'react';\n\nimport { Button } from '@/ds/components/Button';\nimport type { ButtonProps } from '@/ds/components/Button/Button';\nimport { keepOwnAccessibleName } from '@/ds/components/Field/field-control-aria';\nimport { ControlSizeContext, controlHeight } from '@/ds/primitives/control-size';\nimport type { ControlSize } from '@/ds/primitives/control-size';\nimport {\n deprecatedErrorAria,\n fieldErrorRimWithin,\n inputSurfaceAndFocusWithinStyle,\n} from '@/ds/primitives/form-element';\nimport { textFieldAutofillProps } from '@/ds/primitives/password-manager-autofill';\nimport { TextareaControl } from '@/ds/primitives/textarea-control';\nimport { cn } from '@/lib/utils';\n\n// Size flows down as `data-size` on the named group root (`group/input-group`), read by the\n// control through `group-data-[size=…]` variants — no prop drilling. The one context read is\n// upward: a wrapper that owns the rung (ButtonsGroup) hands it to the field.\n\nconst inputGroupBaseClassName = cn(\n // `flex-1` (not `min-w-0`) lets the root fill a flex row while keeping its content-floor\n // so it never collapses to 0. `items-center` centres the control: it carries its own\n // h-form-* (2px taller than the root's content box), so stretch would push its text low\n // / overflow the bottom border, while centring overlaps the (transparent) borders cleanly.\n 'group/input-group relative flex w-full flex-1 items-center',\n // The wrapper owns its control's width — a bare control has no width of its own,\n // so the group is the one that decides the input fills the remaining space.\n '[&>[data-slot=input-group-control]]:min-w-0 [&>[data-slot=input-group-control]]:flex-1',\n 'text-foreground',\n 'has-[:disabled]:cursor-not-allowed has-[:disabled]:text-muted-foreground',\n // Height is on the root (border-box) so the group matches a same-size sibling control.\n // Auto height when vertical (block-* addon) or wrapping a textarea.\n 'has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col',\n 'has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col',\n 'has-[textarea]:h-auto',\n 'has-[>[data-align=inline-start]]:[&>[data-slot=input-group-control]]:pl-0',\n 'has-[>[data-align=inline-end]]:[&>[data-slot=input-group-control]]:pr-0',\n // In flex-col, flex-1 zeroes the control's height; force flex-none + w-full instead.\n 'has-[>[data-align=block-start]]:[&>[data-slot=input-group-control]]:w-full has-[>[data-align=block-start]]:[&>[data-slot=input-group-control]]:flex-none',\n 'has-[>[data-align=block-end]]:[&>[data-slot=input-group-control]]:w-full has-[>[data-align=block-end]]:[&>[data-slot=input-group-control]]:flex-none',\n);\n\nconst inputGroupRoundedTextareaClassName = cn(\n // Pill (rounded-full) only fits single-line inline shapes. Fall back to rounded-xl\n // whenever the group goes vertical (block-* addon) or wraps a textarea.\n 'has-[>[data-align=block-start]]:rounded-xl',\n 'has-[>[data-align=block-end]]:rounded-xl',\n 'has-[textarea]:rounded-xl',\n);\n\n// A group wears the field material — the same `bg-card` plus rim an Input wears — so a\n// group and a bare field beside it are one surface. Its states move the rim, and they\n// read the nested control's focus (`focus-within`) because the wrapper never takes focus\n// itself. There is no second look: a transparent `outline` group existed alongside this\n// one and only ever produced two boundary languages for the same control, which is why\n// four of its call sites had wrapped it in a hand-made `bg-card rounded-full` div to get\n// the material back.\n// eslint-disable-next-line react-refresh/only-export-components -- shared with InputNumber\nexport const inputGroupClassName = cn(\n inputGroupBaseClassName,\n 'rounded-full',\n inputSurfaceAndFocusWithinStyle,\n fieldErrorRimWithin,\n inputGroupRoundedTextareaClassName,\n);\n\nexport type InputGroupProps = React.ComponentProps<'div'> & {\n size?: ControlSize;\n};\n\nfunction InputGroup({ className, size, ...props }: InputGroupProps) {\n // A wrapper's rung wins over the field's own: inside a ButtonsGroup the group owns the\n // height of every segment, so a field that kept its own type scale would sit at one rung\n // and read at another.\n const groupSize = React.useContext(ControlSizeContext);\n const resolved = groupSize ?? size ?? 'md';\n return (\n <div\n role=\"group\"\n data-slot=\"input-group\"\n data-size={resolved}\n className={cn(inputGroupClassName, controlHeight[resolved], className)}\n {...props}\n />\n );\n}\n\nconst inputGroupControlTextBySize = cn(\n 'group-data-[size=sm]/input-group:text-caption',\n 'group-data-[size=md]/input-group:text-body-sm',\n 'group-data-[size=lg]/input-group:text-body',\n);\n\nconst inputGroupAddonVariants = cva(\n cn(\n 'flex items-center justify-center gap-2 text-muted-foreground select-none',\n inputGroupControlTextBySize,\n 'group-has-[:disabled]/input-group:text-muted-foreground',\n \"[&>svg:not([class*='size-'])]:size-4\",\n ),\n {\n variants: {\n variant: {\n default: '',\n flush: '',\n },\n align: {\n 'inline-start': 'order-first pr-1 pl-3 has-[>button]:pl-1',\n 'inline-end': 'order-last pr-3 pl-1 has-[>button]:pr-1',\n 'block-start': 'order-first w-full justify-start border-b border-border px-3 pt-2 pb-1',\n 'block-end': 'order-last w-full justify-start border-t border-border px-3 pt-1 pb-2',\n },\n },\n compoundVariants: [\n { variant: 'flush', align: ['inline-start', 'inline-end'], className: 'gap-0 [&>button]:mx-0' },\n { variant: 'flush', align: 'inline-start', className: 'pl-0 has-[>button]:pl-0' },\n { variant: 'flush', align: 'inline-end', className: 'pr-0 has-[>button]:pr-0' },\n ],\n defaultVariants: {\n variant: 'default',\n align: 'inline-start',\n },\n },\n);\n\nexport type InputGroupAddonProps = React.ComponentProps<'div'> &\n Omit<VariantProps<typeof inputGroupAddonVariants>, 'variant'> & {\n /** `flush` joins inline buttons without a gap or an inset from the field's outside edge. */\n variant?: VariantProps<typeof inputGroupAddonVariants>['variant'];\n };\n\nfunction InputGroupAddon({\n className,\n align = 'inline-start',\n variant = 'default',\n onClick,\n ...props\n}: InputGroupAddonProps) {\n return (\n <div\n role=\"group\"\n data-slot=\"input-group-addon\"\n data-align={align}\n data-variant={variant}\n className={cn(inputGroupAddonVariants({ align, variant }), className)}\n onClick={event => {\n // Click on non-interactive addon area focuses the control inside the group.\n // Skip when a button/input handled the click itself.\n const target = event.target as HTMLElement;\n if (!target.closest('button, input, textarea, [role=\"button\"]')) {\n event.currentTarget.parentElement\n ?.querySelector<HTMLInputElement | HTMLTextAreaElement>('[data-slot=input-group-control]')\n ?.focus();\n }\n onClick?.(event);\n }}\n {...props}\n />\n );\n}\n\n// Size flows from the parent group's `data-size` (no React context). All four sizes are\n// written out so Tailwind's scanner emits them. The control is sized to the root's\n// content box (token height minus the 1px border on each side) so it never overflows the\n// root — otherwise, in a flex-column parent, the root's content-based minimum would win\n// over its explicit height and the group would render 2px taller than a sibling control.\n// The explicit height also keeps the control from collapsing to the line-height in block\n// mode (flex-col + flex-none).\nconst inputGroupControlHeightBySize = cn(\n 'group-data-[size=sm]/input-group:h-[calc(var(--spacing-control-sm)-2px)]',\n 'group-data-[size=md]/input-group:h-[calc(var(--spacing-control-md)-2px)]',\n 'group-data-[size=lg]/input-group:h-[calc(var(--spacing-control-lg)-2px)]',\n);\n\n// eslint-disable-next-line react-refresh/only-export-components -- shared with InputNumber\nexport const inputGroupControlClassName = cn(\n 'min-w-0 flex-1 bg-transparent px-3 text-label text-foreground outline-hidden',\n inputGroupControlHeightBySize,\n 'placeholder:text-muted-foreground placeholder:transition-opacity placeholder:duration-normal',\n 'focus:placeholder:opacity-70',\n 'disabled:cursor-not-allowed',\n);\n\nexport type InputGroupInputProps = Omit<React.ComponentProps<'input'>, 'size'> & {\n testId?: string;\n /** @deprecated Wrap the group in `<Field invalid>`, or set `aria-invalid` on a control outside a `Field`. */\n error?: boolean;\n};\n\nfunction InputGroupInput({ className, testId, error, type = 'text', autoComplete, ...props }: InputGroupInputProps) {\n return (\n <InputPrimitive\n type={type}\n data-slot=\"input-group-control\"\n data-testid={testId}\n className={cn(\n inputGroupControlClassName,\n // WebKit and Firefox use different selectors for native number spinners.\n '[&::-webkit-outer-spin-button]:m-0 [&::-webkit-outer-spin-button]:appearance-none',\n '[&::-webkit-inner-spin-button]:m-0 [&::-webkit-inner-spin-button]:appearance-none',\n '[&[type=number]]:[appearance:textfield]',\n // type=\"search\": drop WebKit's native clear button so it doesn't double up with a\n // custom clear control (e.g. the scorers toolbar's InputGroupButton).\n '[&::-webkit-search-cancel-button]:appearance-none',\n className,\n )}\n {...deprecatedErrorAria(error)}\n {...props}\n {...textFieldAutofillProps(autoComplete)}\n {...keepOwnAccessibleName(props)}\n />\n );\n}\n\nexport type InputGroupTextareaProps = React.ComponentProps<'textarea'> & {\n testId?: string;\n /** @deprecated Wrap the group in `<Field invalid>`, or set `aria-invalid` on a control outside a `Field`. */\n error?: boolean;\n};\n\nfunction InputGroupTextarea({ className, testId, error, ...props }: InputGroupTextareaProps) {\n return (\n <TextareaControl\n data-slot=\"input-group-control\"\n data-testid={testId}\n className={cn(\n 'min-h-15 min-w-0 flex-1 resize-y bg-transparent px-3 py-2 text-foreground outline-hidden',\n inputGroupControlTextBySize,\n 'placeholder:text-muted-foreground placeholder:transition-opacity placeholder:duration-normal',\n 'focus:placeholder:opacity-70',\n 'disabled:cursor-not-allowed',\n className,\n )}\n {...deprecatedErrorAria(error)}\n {...props}\n />\n );\n}\n\nexport type InputGroupTextProps = React.ComponentProps<'span'>;\n\nfunction InputGroupText({ className, ...props }: InputGroupTextProps) {\n return (\n <span\n className={cn(\n 'flex items-center gap-2 text-caption text-muted-foreground [&_svg]:pointer-events-none',\n \"[&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport type InputGroupButtonProps = Omit<React.ComponentProps<typeof Button>, 'size' | 'variant'> & {\n size?: ButtonProps['size'];\n variant?: ButtonProps['variant'];\n};\n\nfunction InputGroupButton({ size = 'icon-sm', variant = 'ghost', type = 'button', ...props }: InputGroupButtonProps) {\n return <Button type={type} size={size} variant={variant} {...props} />;\n}\n\nexport { InputGroup, InputGroupAddon, InputGroupInput, InputGroupTextarea, InputGroupText, InputGroupButton };\n"],"names":["InputPrimitive"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"input-group-BAg6iSIe.js","sources":["../src/ds/components/InputGroup/input-group.tsx"],"sourcesContent":["import { Input as InputPrimitive } from '@base-ui/react/input';\nimport { cva } from 'class-variance-authority';\nimport type { VariantProps } from 'class-variance-authority';\nimport * as React from 'react';\n\nimport { Button } from '@/ds/components/Button';\nimport type { ButtonProps } from '@/ds/components/Button/Button';\nimport { keepOwnAccessibleName } from '@/ds/components/Field/field-control-aria';\nimport { ControlSizeContext, controlHeight } from '@/ds/primitives/control-size';\nimport type { ControlSize } from '@/ds/primitives/control-size';\nimport {\n deprecatedErrorAria,\n fieldErrorRimWithin,\n inputSurfaceAndFocusWithinStyle,\n} from '@/ds/primitives/form-element';\nimport { textFieldAutofillProps } from '@/ds/primitives/password-manager-autofill';\nimport { TextareaControl } from '@/ds/primitives/textarea-control';\nimport { cn } from '@/lib/utils';\n\n// Size flows down as `data-size` on the named group root (`group/input-group`), read by the\n// control through `group-data-[size=…]` variants — no prop drilling. The one context read is\n// upward: a wrapper that owns the rung (ButtonsGroup) hands it to the field.\n\nconst inputGroupBaseClassName = cn(\n // `flex-1` (not `min-w-0`) lets the root fill a flex row while keeping its content-floor\n // so it never collapses to 0. `items-center` centres the control: it carries its own\n // h-form-* (2px taller than the root's content box), so stretch would push its text low\n // / overflow the bottom border, while centring overlaps the (transparent) borders cleanly.\n 'group/input-group relative flex w-full flex-1 items-center',\n // The wrapper owns its control's width — a bare control has no width of its own,\n // so the group is the one that decides the input fills the remaining space.\n '[&>[data-slot=input-group-control]]:min-w-0 [&>[data-slot=input-group-control]]:flex-1',\n 'text-foreground',\n 'has-[:disabled]:cursor-not-allowed has-[:disabled]:text-muted-foreground',\n // Height is on the root (border-box) so the group matches a same-size sibling control.\n // Auto height when vertical (block-* addon) or wrapping a textarea.\n 'has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col',\n 'has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col',\n 'has-[textarea]:h-auto',\n 'has-[>[data-align=inline-start]]:[&>[data-slot=input-group-control]]:pl-0',\n 'has-[>[data-align=inline-end]]:[&>[data-slot=input-group-control]]:pr-0',\n // In flex-col, flex-1 zeroes the control's height; force flex-none + w-full instead.\n 'has-[>[data-align=block-start]]:[&>[data-slot=input-group-control]]:w-full has-[>[data-align=block-start]]:[&>[data-slot=input-group-control]]:flex-none',\n 'has-[>[data-align=block-end]]:[&>[data-slot=input-group-control]]:w-full has-[>[data-align=block-end]]:[&>[data-slot=input-group-control]]:flex-none',\n);\n\nconst inputGroupRoundedTextareaClassName = cn(\n // Pill (rounded-full) only fits single-line inline shapes. Fall back to rounded-xl\n // whenever the group goes vertical (block-* addon) or wraps a textarea.\n 'has-[>[data-align=block-start]]:rounded-xl',\n 'has-[>[data-align=block-end]]:rounded-xl',\n 'has-[textarea]:rounded-xl',\n);\n\n// A group wears the field material — the same `bg-card` plus rim an Input wears — so a\n// group and a bare field beside it are one surface. Its states move the rim, and they\n// read the nested control's focus (`focus-within`) because the wrapper never takes focus\n// itself. There is no second look: a transparent `outline` group existed alongside this\n// one and only ever produced two boundary languages for the same control, which is why\n// four of its call sites had wrapped it in a hand-made `bg-card rounded-full` div to get\n// the material back.\n// eslint-disable-next-line react-refresh/only-export-components -- shared with InputNumber\nexport const inputGroupClassName = cn(\n inputGroupBaseClassName,\n 'rounded-full',\n inputSurfaceAndFocusWithinStyle,\n fieldErrorRimWithin,\n inputGroupRoundedTextareaClassName,\n);\n\nexport type InputGroupProps = React.ComponentProps<'div'> & {\n size?: ControlSize;\n};\n\nfunction InputGroup({ className, size, ...props }: InputGroupProps) {\n // A wrapper's rung wins over the field's own: inside a ButtonsGroup the group owns the\n // height of every segment, so a field that kept its own type scale would sit at one rung\n // and read at another.\n const groupSize = React.useContext(ControlSizeContext);\n const resolved = groupSize ?? size ?? 'md';\n return (\n <div\n role=\"group\"\n data-slot=\"input-group\"\n data-size={resolved}\n className={cn(inputGroupClassName, controlHeight[resolved], className)}\n {...props}\n />\n );\n}\n\nconst inputGroupControlTextBySize = cn(\n 'group-data-[size=sm]/input-group:text-caption',\n 'group-data-[size=md]/input-group:text-body-sm',\n 'group-data-[size=lg]/input-group:text-body',\n);\n\nconst inputGroupAddonVariants = cva(\n cn(\n 'flex items-center justify-center gap-2 text-muted-foreground select-none',\n inputGroupControlTextBySize,\n 'group-has-[:disabled]/input-group:text-muted-foreground',\n \"[&>svg:not([class*='size-'])]:size-4\",\n ),\n {\n variants: {\n variant: {\n default: '',\n flush: '',\n },\n align: {\n 'inline-start': 'order-first pr-1 pl-3 has-[>button]:pl-1',\n 'inline-end': 'order-last pr-3 pl-1 has-[>button]:pr-1',\n 'block-start': 'order-first w-full justify-start border-b border-border px-3 pt-2 pb-1',\n 'block-end': 'order-last w-full justify-start border-t border-border px-3 pt-1 pb-2',\n },\n },\n compoundVariants: [\n { variant: 'flush', align: ['inline-start', 'inline-end'], className: 'gap-0 [&>button]:mx-0' },\n { variant: 'flush', align: 'inline-start', className: 'pl-0 has-[>button]:pl-0' },\n { variant: 'flush', align: 'inline-end', className: 'pr-0 has-[>button]:pr-0' },\n ],\n defaultVariants: {\n variant: 'default',\n align: 'inline-start',\n },\n },\n);\n\nexport type InputGroupAddonProps = React.ComponentProps<'div'> &\n Omit<VariantProps<typeof inputGroupAddonVariants>, 'variant'> & {\n /** `flush` joins inline buttons without a gap or an inset from the field's outside edge. */\n variant?: VariantProps<typeof inputGroupAddonVariants>['variant'];\n };\n\nfunction InputGroupAddon({\n className,\n align = 'inline-start',\n variant = 'default',\n onClick,\n ...props\n}: InputGroupAddonProps) {\n return (\n <div\n role=\"group\"\n data-slot=\"input-group-addon\"\n data-align={align}\n data-variant={variant}\n className={cn(inputGroupAddonVariants({ align, variant }), className)}\n onClick={event => {\n // Click on non-interactive addon area focuses the control inside the group.\n // Skip when a button/input handled the click itself.\n const target = event.target as HTMLElement;\n if (!target.closest('button, input, textarea, [role=\"button\"]')) {\n event.currentTarget.parentElement\n ?.querySelector<HTMLInputElement | HTMLTextAreaElement>('[data-slot=input-group-control]')\n ?.focus();\n }\n onClick?.(event);\n }}\n {...props}\n />\n );\n}\n\n// Size flows from the parent group's `data-size` (no React context). All four sizes are\n// written out so Tailwind's scanner emits them. The control is sized to the root's\n// content box (token height minus the 1px border on each side) so it never overflows the\n// root — otherwise, in a flex-column parent, the root's content-based minimum would win\n// over its explicit height and the group would render 2px taller than a sibling control.\n// The explicit height also keeps the control from collapsing to the line-height in block\n// mode (flex-col + flex-none).\nconst inputGroupControlHeightBySize = cn(\n 'group-data-[size=sm]/input-group:h-[calc(var(--spacing-control-sm)-2px)]',\n 'group-data-[size=md]/input-group:h-[calc(var(--spacing-control-md)-2px)]',\n 'group-data-[size=lg]/input-group:h-[calc(var(--spacing-control-lg)-2px)]',\n);\n\n// eslint-disable-next-line react-refresh/only-export-components -- shared with InputNumber\nexport const inputGroupControlClassName = cn(\n 'min-w-0 flex-1 bg-transparent px-3 text-label text-foreground outline-hidden',\n inputGroupControlHeightBySize,\n 'placeholder:text-muted-foreground placeholder:transition-opacity placeholder:duration-normal',\n 'focus:placeholder:opacity-70',\n 'disabled:cursor-not-allowed',\n);\n\nexport type InputGroupInputProps = Omit<React.ComponentProps<'input'>, 'size'> & {\n testId?: string;\n /** @deprecated Wrap the group in `<Field invalid>`, or set `aria-invalid` on a control outside a `Field`. */\n error?: boolean;\n};\n\nfunction InputGroupInput({ className, testId, error, type = 'text', autoComplete, ...props }: InputGroupInputProps) {\n return (\n <InputPrimitive\n type={type}\n data-slot=\"input-group-control\"\n data-testid={testId}\n className={cn(\n inputGroupControlClassName,\n // WebKit and Firefox use different selectors for native number spinners.\n '[&::-webkit-outer-spin-button]:m-0 [&::-webkit-outer-spin-button]:appearance-none',\n '[&::-webkit-inner-spin-button]:m-0 [&::-webkit-inner-spin-button]:appearance-none',\n '[&[type=number]]:[appearance:textfield]',\n // type=\"search\": drop WebKit's native clear button so it doesn't double up with a\n // custom clear control (e.g. the scorers toolbar's InputGroupButton).\n '[&::-webkit-search-cancel-button]:appearance-none',\n className,\n )}\n {...deprecatedErrorAria(error)}\n {...props}\n {...textFieldAutofillProps(autoComplete)}\n {...keepOwnAccessibleName(props)}\n />\n );\n}\n\nexport type InputGroupTextareaProps = React.ComponentProps<'textarea'> & {\n testId?: string;\n /** @deprecated Wrap the group in `<Field invalid>`, or set `aria-invalid` on a control outside a `Field`. */\n error?: boolean;\n};\n\nfunction InputGroupTextarea({ className, testId, error, ...props }: InputGroupTextareaProps) {\n return (\n <TextareaControl\n data-slot=\"input-group-control\"\n data-testid={testId}\n className={cn(\n 'min-h-15 min-w-0 flex-1 resize-y bg-transparent px-3 py-2 text-foreground outline-hidden',\n inputGroupControlTextBySize,\n 'placeholder:text-muted-foreground placeholder:transition-opacity placeholder:duration-normal',\n 'focus:placeholder:opacity-70',\n 'disabled:cursor-not-allowed',\n className,\n )}\n {...deprecatedErrorAria(error)}\n {...props}\n />\n );\n}\n\nexport type InputGroupTextProps = React.ComponentProps<'span'>;\n\nfunction InputGroupText({ className, ...props }: InputGroupTextProps) {\n return (\n <span\n className={cn(\n 'flex items-center gap-2 text-caption text-muted-foreground [&_svg]:pointer-events-none',\n \"[&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport type InputGroupButtonProps = Omit<React.ComponentProps<typeof Button>, 'size' | 'variant'> & {\n size?: ButtonProps['size'];\n variant?: ButtonProps['variant'];\n};\n\nfunction InputGroupButton({ size = 'icon-sm', variant = 'ghost', type = 'button', ...props }: InputGroupButtonProps) {\n return <Button type={type} size={size} variant={variant} {...props} />;\n}\n\nexport { InputGroup, InputGroupAddon, InputGroupInput, InputGroupTextarea, InputGroupText, InputGroupButton };\n"],"names":["InputPrimitive"],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@ const jsxRuntime = require('react/jsx-runtime');
|
|
|
4
4
|
const input = require('@base-ui/react/input');
|
|
5
5
|
const index = require('./index-BM43yKX5.cjs');
|
|
6
6
|
const React = require('react');
|
|
7
|
-
const Button = require('./Button-
|
|
7
|
+
const Button = require('./Button-C4I05uT4.cjs');
|
|
8
8
|
const fieldControlAria = require('./field-control-aria-WzMGs0A4.cjs');
|
|
9
9
|
const primitives_controlSize = require('./primitives/control-size.cjs.js');
|
|
10
10
|
const primitives_formElement = require('./primitives/form-element.cjs.js');
|
|
@@ -224,4 +224,4 @@ exports.InputGroupText = InputGroupText;
|
|
|
224
224
|
exports.InputGroupTextarea = InputGroupTextarea;
|
|
225
225
|
exports.inputGroupClassName = inputGroupClassName;
|
|
226
226
|
exports.inputGroupControlClassName = inputGroupControlClassName;
|
|
227
|
-
//# sourceMappingURL=input-group-
|
|
227
|
+
//# sourceMappingURL=input-group-DRXUthxe.cjs.map
|