@ryuzaki13/react-foundation-lib 2.31.1 → 2.31.3
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 +17 -5
- package/dist/analytical-table/definition/analyticalDefinitionConstants.d.ts +17 -0
- package/dist/analytical-table/definition/analyticalDefinitionConstants.d.ts.map +1 -0
- package/dist/analytical-table/definition/compileAnalyticalTableDefinition.d.ts.map +1 -1
- package/dist/analytical-table/definition/types.d.ts +6 -5
- package/dist/analytical-table/definition/types.d.ts.map +1 -1
- package/dist/analytical-table/dynamic-columns/analyticalDateColumnConstants.d.ts +7 -0
- package/dist/analytical-table/dynamic-columns/analyticalDateColumnConstants.d.ts.map +1 -0
- package/dist/analytical-table/dynamic-columns/dateColumns.d.ts.map +1 -1
- package/dist/analytical-table/dynamic-columns/types.d.ts +2 -1
- package/dist/analytical-table/dynamic-columns/types.d.ts.map +1 -1
- package/dist/analytical-table/index.js +124 -114
- package/dist/analytical-table/index.js.map +1 -1
- package/dist/analytical-table/projections/analyticalExportConstants.d.ts +7 -0
- package/dist/analytical-table/projections/analyticalExportConstants.d.ts.map +1 -0
- package/dist/analytical-table/projections/expansion.d.ts +2 -1
- package/dist/analytical-table/projections/expansion.d.ts.map +1 -1
- package/dist/analytical-table/projections/exportProjection.d.ts.map +1 -1
- package/dist/analytical-table/projections/types.d.ts +3 -2
- package/dist/analytical-table/projections/types.d.ts.map +1 -1
- package/dist/analytical-table/runtime/aggregation.d.ts.map +1 -1
- package/dist/analytical-table/runtime/analyticalRowConstants.d.ts +4 -0
- package/dist/analytical-table/runtime/analyticalRowConstants.d.ts.map +1 -0
- package/dist/analytical-table/runtime/analyticalViewConstants.d.ts +16 -0
- package/dist/analytical-table/runtime/analyticalViewConstants.d.ts.map +1 -0
- package/dist/analytical-table/runtime/buildGroupedModel.d.ts.map +1 -1
- package/dist/analytical-table/runtime/filtering.d.ts.map +1 -1
- package/dist/analytical-table/runtime/grouping.d.ts.map +1 -1
- package/dist/analytical-table/runtime/hierarchy.d.ts +2 -1
- package/dist/analytical-table/runtime/hierarchy.d.ts.map +1 -1
- package/dist/analytical-table/runtime/totals.d.ts +2 -2
- package/dist/analytical-table/runtime/totals.d.ts.map +1 -1
- package/dist/analytical-table/runtime/types.d.ts +5 -3
- package/dist/analytical-table/runtime/types.d.ts.map +1 -1
- package/dist/analytical-table/runtime/valueComparison.d.ts.map +1 -1
- package/dist/array/index.js +1 -1
- package/dist/array/reorder.d.ts +6 -1
- package/dist/array/reorder.d.ts.map +1 -1
- package/dist/async-task-runner/createCoalescingTaskRunner.d.ts.map +1 -1
- package/dist/async-task-runner/createDeadlineTimer.d.ts.map +1 -1
- package/dist/async-task-runner/index.js +39 -36
- package/dist/async-task-runner/index.js.map +1 -1
- package/dist/async-task-runner/nativeTimerConstants.d.ts +3 -0
- package/dist/async-task-runner/nativeTimerConstants.d.ts.map +1 -0
- package/dist/binary/base64Constants.d.ts +6 -0
- package/dist/binary/base64Constants.d.ts.map +1 -0
- package/dist/binary/binaryToBlob.d.ts.map +1 -1
- package/dist/binary/getBase64DecodedSize.d.ts.map +1 -1
- package/dist/binary/index.js +95 -70
- package/dist/binary/index.js.map +1 -1
- package/dist/browser-notifications/browserNotificationConstants.d.ts +3 -0
- package/dist/browser-notifications/browserNotificationConstants.d.ts.map +1 -0
- package/dist/browser-notifications/browserNotificationTypes.d.ts +2 -1
- package/dist/browser-notifications/browserNotificationTypes.d.ts.map +1 -1
- package/dist/browser-notifications/createBrowserNotificationPresenter.d.ts.map +1 -1
- package/dist/browser-notifications/index.js +38 -37
- package/dist/browser-notifications/index.js.map +1 -1
- package/dist/chunks/{array-D-_yMMUK.js → array-bd7LYFto.js} +1 -3
- package/dist/chunks/{array-D-_yMMUK.js.map → array-bd7LYFto.js.map} +1 -1
- package/dist/chunks/{dom-BK22UmgF.js → dom-ZSeWZ0Gg.js} +103 -98
- package/dist/chunks/dom-ZSeWZ0Gg.js.map +1 -0
- package/dist/chunks/formatDate-CNPcfNte.js +133 -0
- package/dist/chunks/formatDate-CNPcfNte.js.map +1 -0
- package/dist/chunks/{formatters-rxriDRPk.js → formatters-CO40zvVB.js} +496 -497
- package/dist/chunks/formatters-CO40zvVB.js.map +1 -0
- package/dist/chunks/{formulas-BXT_XBWI.js → formulas-Y0HOcFhe.js} +90 -86
- package/dist/chunks/formulas-Y0HOcFhe.js.map +1 -0
- package/dist/chunks/hasSignatureBytes-D2wO_Myl.js +11 -0
- package/dist/chunks/hasSignatureBytes-D2wO_Myl.js.map +1 -0
- package/dist/chunks/keyboardConstants-BZKskWsm.js +6 -0
- package/dist/chunks/keyboardConstants-BZKskWsm.js.map +1 -0
- package/dist/chunks/media-imBOXWwa.js +192 -0
- package/dist/chunks/media-imBOXWwa.js.map +1 -0
- package/dist/chunks/mimeTypeConstants-BzONV-b1.js +6 -0
- package/dist/chunks/mimeTypeConstants-BzONV-b1.js.map +1 -0
- package/dist/chunks/{query-client-CVRfrYZM.js → query-client-D0HQZ84w.js} +142 -142
- package/dist/chunks/query-client-D0HQZ84w.js.map +1 -0
- package/dist/chunks/scalarTypeClassification-D4YcGxtQ.js +766 -0
- package/dist/chunks/scalarTypeClassification-D4YcGxtQ.js.map +1 -0
- package/dist/chunks/scalarTypeConstants-CnSsjpGO.js +6 -0
- package/dist/chunks/scalarTypeConstants-CnSsjpGO.js.map +1 -0
- package/dist/chunks/utils-DW0Yso1Q.js +210 -0
- package/dist/chunks/utils-DW0Yso1Q.js.map +1 -0
- package/dist/chunks/{uuid-CUJPAbRY.js → uuid-izDzLv18.js} +1 -2
- package/dist/chunks/uuid-izDzLv18.js.map +1 -0
- package/dist/chunks/validate-8URYKKly.js +613 -0
- package/dist/chunks/validate-8URYKKly.js.map +1 -0
- package/dist/copy/index.js +5 -5
- package/dist/copy/index.js.map +1 -1
- package/dist/copy/useCopyFeedback.d.ts.map +1 -1
- package/dist/crypto/hashString.d.ts.map +1 -1
- package/dist/crypto/hexadecimalConstants.d.ts +3 -0
- package/dist/crypto/hexadecimalConstants.d.ts.map +1 -0
- package/dist/crypto/index.js +25 -24
- package/dist/crypto/index.js.map +1 -1
- package/dist/crypto/uuid.d.ts.map +1 -1
- package/dist/date-segments/index.js +81 -81
- package/dist/date-segments/index.js.map +1 -1
- package/dist/date-segments/mask.d.ts +13 -3
- package/dist/date-segments/mask.d.ts.map +1 -1
- package/dist/decimal/decimalConstants.d.ts +3 -0
- package/dist/decimal/decimalConstants.d.ts.map +1 -0
- package/dist/decimal/index.js +0 -2
- package/dist/decimal/index.js.map +1 -1
- package/dist/decimal/normalizeDecimal.d.ts.map +1 -1
- package/dist/decimal/normalizeDecimalLiteral.d.ts.map +1 -1
- package/dist/decimal/resolveDecimalMaxLength.d.ts.map +1 -1
- package/dist/decimal/sumDecimals.d.ts.map +1 -1
- package/dist/decimal/writeDecimalParts.d.ts.map +1 -1
- package/dist/dom/document-scroll/acquireDocumentScrollLock.d.ts.map +1 -1
- package/dist/dom/document-scroll/attachDocumentTouchScrollGuard.d.ts.map +1 -1
- package/dist/dom/document-scroll/canConsumeVerticalTouchScroll.d.ts.map +1 -1
- package/dist/dom/domEventConstants.d.ts +4 -0
- package/dist/dom/domEventConstants.d.ts.map +1 -0
- package/dist/dom/domScrollConstants.d.ts +3 -0
- package/dist/dom/domScrollConstants.d.ts.map +1 -0
- package/dist/dom/index.js +1 -1
- package/dist/dom/installFaviconOverride.d.ts.map +1 -1
- package/dist/dom/overlayFocusConstants.d.ts +4 -0
- package/dist/dom/overlayFocusConstants.d.ts.map +1 -0
- package/dist/dom/scroll-anchor/captureScrollAnchor.d.ts.map +1 -1
- package/dist/dom/useClickOutside.d.ts +1 -1
- package/dist/dom/useClickOutside.d.ts.map +1 -1
- package/dist/dom/useEscapeDismiss.d.ts +1 -1
- package/dist/dom/useEscapeDismiss.d.ts.map +1 -1
- package/dist/dom/useFocusTrap.d.ts.map +1 -1
- package/dist/dom/useIsTouchDevice.d.ts.map +1 -1
- package/dist/dom/useOverlayFocus.d.ts +3 -2
- package/dist/dom/useOverlayFocus.d.ts.map +1 -1
- package/dist/dom/visual-viewport/attachVisualViewportFrame.d.ts.map +1 -1
- package/dist/error-report/breadcrumbs.d.ts.map +1 -1
- package/dist/error-report/capture.d.ts.map +1 -1
- package/dist/error-report/captureOptions.d.ts +3 -2
- package/dist/error-report/captureOptions.d.ts.map +1 -1
- package/dist/error-report/capturePolicyConstants.d.ts +4 -0
- package/dist/error-report/capturePolicyConstants.d.ts.map +1 -0
- package/dist/error-report/dataPreview.d.ts.map +1 -1
- package/dist/error-report/diagnostics.d.ts.map +1 -1
- package/dist/error-report/drafts.d.ts.map +1 -1
- package/dist/error-report/environment.d.ts.map +1 -1
- package/dist/error-report/errorInfo.d.ts.map +1 -1
- package/dist/error-report/errorReportCaptureLimits.d.ts +26 -0
- package/dist/error-report/errorReportCaptureLimits.d.ts.map +1 -0
- package/dist/error-report/errorReportContractConstants.d.ts +32 -0
- package/dist/error-report/errorReportContractConstants.d.ts.map +1 -0
- package/dist/error-report/index.js +586 -587
- package/dist/error-report/index.js.map +1 -1
- package/dist/error-report/payload.d.ts.map +1 -1
- package/dist/error-report/queue.d.ts.map +1 -1
- package/dist/error-report/queueContract.d.ts +7 -6
- package/dist/error-report/queueContract.d.ts.map +1 -1
- package/dist/error-report/queueRecord.d.ts.map +1 -1
- package/dist/error-report/queueResultConstants.d.ts +14 -0
- package/dist/error-report/queueResultConstants.d.ts.map +1 -0
- package/dist/error-report/runtimeDeduplication.d.ts +2 -1
- package/dist/error-report/runtimeDeduplication.d.ts.map +1 -1
- package/dist/error-report/safeValue.d.ts.map +1 -1
- package/dist/error-report/safeValueMarkerConstants.d.ts +16 -0
- package/dist/error-report/safeValueMarkerConstants.d.ts.map +1 -0
- package/dist/error-report/schema.d.ts.map +1 -1
- package/dist/error-report/types.d.ts +10 -8
- package/dist/error-report/types.d.ts.map +1 -1
- package/dist/error-report-source-maps/archive.d.ts.map +1 -1
- package/dist/error-report-source-maps/artifact.d.ts.map +1 -1
- package/dist/error-report-source-maps/index.js +238 -238
- package/dist/error-report-source-maps/index.js.map +1 -1
- package/dist/error-report-source-maps/manifest.d.ts.map +1 -1
- package/dist/error-report-source-maps/package.d.ts.map +1 -1
- package/dist/error-report-source-maps/sourceMapArtifactConstants.d.ts +11 -0
- package/dist/error-report-source-maps/sourceMapArtifactConstants.d.ts.map +1 -0
- package/dist/error-report-source-maps/symbolicate.d.ts.map +1 -1
- package/dist/error-report-source-maps/symbolicationResultConstants.d.ts +6 -0
- package/dist/error-report-source-maps/symbolicationResultConstants.d.ts.map +1 -0
- package/dist/error-report-source-maps/types.d.ts +4 -2
- package/dist/error-report-source-maps/types.d.ts.map +1 -1
- package/dist/excel/excel.d.ts.map +1 -1
- package/dist/excel/excelWorkbookConstants.d.ts +6 -0
- package/dist/excel/excelWorkbookConstants.d.ts.map +1 -0
- package/dist/excel/index.js +117 -116
- package/dist/excel/index.js.map +1 -1
- package/dist/excel/matrixWorkbook.d.ts +6 -1
- package/dist/excel/matrixWorkbook.d.ts.map +1 -1
- package/dist/excel/tableExport.d.ts.map +1 -1
- package/dist/file/checkFileSignature.d.ts.map +1 -1
- package/dist/file/contentDisposition.d.ts.map +1 -1
- package/dist/file/fileSignatureConstants.d.ts +14 -18
- package/dist/file/fileSignatureConstants.d.ts.map +1 -1
- package/dist/file/fileSignatureTypes.d.ts +3 -3
- package/dist/file/fileSignatureTypes.d.ts.map +1 -1
- package/dist/file/image/imageReadConstants.d.ts +3 -0
- package/dist/file/image/imageReadConstants.d.ts.map +1 -0
- package/dist/file/image/readImageFile.d.ts +3 -2
- package/dist/file/image/readImageFile.d.ts.map +1 -1
- package/dist/file/image/types.d.ts +5 -3
- package/dist/file/image/types.d.ts.map +1 -1
- package/dist/file/index.js +139 -165
- package/dist/file/index.js.map +1 -1
- package/dist/file/mimeType.d.ts.map +1 -1
- package/dist/file/mimeTypeConstants.d.ts +18 -0
- package/dist/file/mimeTypeConstants.d.ts.map +1 -0
- package/dist/file/read-file/assert.d.ts.map +1 -1
- package/dist/file/read-file/readFile.d.ts +3 -11
- package/dist/file/read-file/readFile.d.ts.map +1 -1
- package/dist/file/read-file/readFileConstants.d.ts +13 -0
- package/dist/file/read-file/readFileConstants.d.ts.map +1 -0
- package/dist/file/read-file/types.d.ts +7 -6
- package/dist/file/read-file/types.d.ts.map +1 -1
- package/dist/file/signature/checkArchiveSignature.d.ts.map +1 -1
- package/dist/file-system/fileSystemConstants.d.ts +5 -0
- package/dist/file-system/fileSystemConstants.d.ts.map +1 -0
- package/dist/file-system/fileSystemTypes.d.ts +2 -1
- package/dist/file-system/fileSystemTypes.d.ts.map +1 -1
- package/dist/file-system/index.js +11 -10
- package/dist/file-system/index.js.map +1 -1
- package/dist/file-system/resolvePathInsideRoot.d.ts.map +1 -1
- package/dist/formatters/boolean/parseAbapBoolean.d.ts.map +1 -1
- package/dist/formatters/boolean/toAbapBoolean.d.ts.map +1 -1
- package/dist/formatters/date/calendarDate.d.ts.map +1 -1
- package/dist/formatters/date/calendarDateConstants.d.ts +13 -0
- package/dist/formatters/date/calendarDateConstants.d.ts.map +1 -0
- package/dist/formatters/date/calendarPeriod.d.ts +11 -2
- package/dist/formatters/date/calendarPeriod.d.ts.map +1 -1
- package/dist/formatters/date/dateFormatConstants.d.ts +17 -0
- package/dist/formatters/date/dateFormatConstants.d.ts.map +1 -0
- package/dist/formatters/date/datePatternConstants.d.ts +16 -0
- package/dist/formatters/date/datePatternConstants.d.ts.map +1 -0
- package/dist/formatters/date/datePresetNameConstants.d.ts +27 -0
- package/dist/formatters/date/datePresetNameConstants.d.ts.map +1 -0
- package/dist/formatters/date/dateRange.d.ts +3 -1
- package/dist/formatters/date/dateRange.d.ts.map +1 -1
- package/dist/formatters/date/dateValueConstants.d.ts +15 -0
- package/dist/formatters/date/dateValueConstants.d.ts.map +1 -0
- package/dist/formatters/date/educationDate.d.ts.map +1 -1
- package/dist/formatters/date/formatDate.d.ts.map +1 -1
- package/dist/formatters/date/formatInstantDateTime.d.ts.map +1 -1
- package/dist/formatters/date/parseDate.d.ts.map +1 -1
- package/dist/formatters/date/pattern.d.ts.map +1 -1
- package/dist/formatters/date/presets.d.ts.map +1 -1
- package/dist/formatters/date/types.d.ts +8 -6
- package/dist/formatters/date/types.d.ts.map +1 -1
- package/dist/formatters/formatDurationMinutes.d.ts.map +1 -1
- package/dist/formatters/formatFileSize.d.ts.map +1 -1
- package/dist/formatters/formatPhone.d.ts.map +1 -1
- package/dist/formatters/index.js +6 -6
- package/dist/formatters/normalizeLeadingZeros.d.ts.map +1 -1
- package/dist/formatters/number/compact.d.ts.map +1 -1
- package/dist/formatters/number/formatCompactNumber.d.ts.map +1 -1
- package/dist/formatters/number/formatNumber.d.ts.map +1 -1
- package/dist/formatters/number/numberFormatConstants.d.ts +11 -0
- package/dist/formatters/number/numberFormatConstants.d.ts.map +1 -0
- package/dist/formatters/number/numberPresetNameConstants.d.ts +16 -0
- package/dist/formatters/number/numberPresetNameConstants.d.ts.map +1 -0
- package/dist/formatters/number/parseNumber.d.ts.map +1 -1
- package/dist/formatters/number/presets.d.ts.map +1 -1
- package/dist/formatters/number/types.d.ts +2 -1
- package/dist/formatters/number/types.d.ts.map +1 -1
- package/dist/formatters/pipeline/clone.d.ts.map +1 -1
- package/dist/formatters/pipeline/definitions.d.ts.map +1 -1
- package/dist/formatters/pipeline/dependencies.d.ts.map +1 -1
- package/dist/formatters/pipeline/execute.d.ts +4 -1
- package/dist/formatters/pipeline/execute.d.ts.map +1 -1
- package/dist/formatters/pipeline/formattersPipelineConstants.d.ts +19 -0
- package/dist/formatters/pipeline/formattersPipelineConstants.d.ts.map +1 -0
- package/dist/formatters/pipeline/normalize.d.ts.map +1 -1
- package/dist/formatters/pipeline/pipelineValidationConstants.d.ts +40 -0
- package/dist/formatters/pipeline/pipelineValidationConstants.d.ts.map +1 -0
- package/dist/formatters/pipeline/registry.d.ts +1 -1
- package/dist/formatters/pipeline/registry.d.ts.map +1 -1
- package/dist/formatters/pipeline/rekey.d.ts.map +1 -1
- package/dist/formatters/pipeline/runtime.d.ts.map +1 -1
- package/dist/formatters/pipeline/types.d.ts +24 -21
- package/dist/formatters/pipeline/types.d.ts.map +1 -1
- package/dist/formatters/pipeline/validate.d.ts +2 -1
- package/dist/formatters/pipeline/validate.d.ts.map +1 -1
- package/dist/formatters/strings/spaceCharacterConstants.d.ts +5 -0
- package/dist/formatters/strings/spaceCharacterConstants.d.ts.map +1 -0
- package/dist/formatters/strings/stripInnerSpaces.d.ts.map +1 -1
- package/dist/formatters/strings/stripLeadingZeros.d.ts.map +1 -1
- package/dist/formatters/valueState/fixedValueStateResolver.d.ts.map +1 -1
- package/dist/formatters/valueState/presentation.d.ts.map +1 -1
- package/dist/formatters/valueState/resolveValueStateClassName.d.ts.map +1 -1
- package/dist/formatters/valueState/thresholdValueStateResolver.d.ts.map +1 -1
- package/dist/formatters/valueState/types.d.ts +2 -1
- package/dist/formatters/valueState/types.d.ts.map +1 -1
- package/dist/formatters/valueState/valueStateRegistry.d.ts.map +1 -1
- package/dist/formatters/valueState/valueStateResolverConstants.d.ts +6 -0
- package/dist/formatters/valueState/valueStateResolverConstants.d.ts.map +1 -0
- package/dist/formulas/execute.d.ts +3 -2
- package/dist/formulas/execute.d.ts.map +1 -1
- package/dist/formulas/index.js +1 -1
- package/dist/formulas/isTableFormulaDependency.d.ts.map +1 -1
- package/dist/formulas/tableFormulaConstants.d.ts +12 -0
- package/dist/formulas/tableFormulaConstants.d.ts.map +1 -0
- package/dist/formulas/types.d.ts +2 -1
- package/dist/formulas/types.d.ts.map +1 -1
- package/dist/formulas/validate.d.ts +2 -1
- package/dist/formulas/validate.d.ts.map +1 -1
- package/dist/hooks/index.js +110 -107
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/useBlockBrowserZoom.d.ts.map +1 -1
- package/dist/hooks/useDndSortableSensors.d.ts.map +1 -1
- package/dist/hooks/useFloatingListbox.d.ts +15 -33
- package/dist/hooks/useFloatingListbox.d.ts.map +1 -1
- package/dist/http/index.js +8 -7
- package/dist/http/index.js.map +1 -1
- package/dist/http/textResponse.d.ts.map +1 -1
- package/dist/indexed-records/createIndexedRecordsSchema.d.ts.map +1 -1
- package/dist/indexed-records/schema.js +24 -23
- package/dist/indexed-records/schema.js.map +1 -1
- package/dist/media/breakpointConstants.d.ts +5 -0
- package/dist/media/breakpointConstants.d.ts.map +1 -0
- package/dist/media/breakpoints.d.ts +2 -1
- package/dist/media/breakpoints.d.ts.map +1 -1
- package/dist/media/createNotificationTonePlayer.d.ts.map +1 -1
- package/dist/media/getCurrentFontSize.d.ts.map +1 -1
- package/dist/media/index.js +1 -1
- package/dist/media/mediaQueryConstants.d.ts +3 -0
- package/dist/media/mediaQueryConstants.d.ts.map +1 -0
- package/dist/media/responsive.d.ts +1 -1
- package/dist/media/responsive.d.ts.map +1 -1
- package/dist/media/useMatchMedia.d.ts.map +1 -1
- package/dist/media/useMediaQuery.d.ts.map +1 -1
- package/dist/metadata/baseMetaTypes.d.ts.map +1 -1
- package/dist/metadata/metadataTypes.d.ts +8 -7
- package/dist/metadata/metadataTypes.d.ts.map +1 -1
- package/dist/metadata/scalarTypeClassification.d.ts.map +1 -1
- package/dist/metadata/scalarTypeConstants.d.ts +21 -0
- package/dist/metadata/scalarTypeConstants.d.ts.map +1 -0
- package/dist/notifications/index.js +62 -62
- package/dist/notifications/index.js.map +1 -1
- package/dist/notifications/notificationTypeConstants.d.ts +6 -0
- package/dist/notifications/notificationTypeConstants.d.ts.map +1 -0
- package/dist/notifications/notify.d.ts.map +1 -1
- package/dist/notifications/store.d.ts.map +1 -1
- package/dist/notifications/types.d.ts +2 -1
- package/dist/notifications/types.d.ts.map +1 -1
- package/dist/number-scale/index.js +47 -46
- package/dist/number-scale/index.js.map +1 -1
- package/dist/number-scale/marksPositionConstants.d.ts +4 -0
- package/dist/number-scale/marksPositionConstants.d.ts.map +1 -0
- package/dist/number-scale/numberScale.d.ts +1 -1
- package/dist/number-scale/numberScale.d.ts.map +1 -1
- package/dist/number-scale/types.d.ts +2 -1
- package/dist/number-scale/types.d.ts.map +1 -1
- package/dist/odata-service/builder.d.ts.map +1 -1
- package/dist/odata-service/columns.d.ts.map +1 -1
- package/dist/odata-service/entityOperationConstants.d.ts +4 -0
- package/dist/odata-service/entityOperationConstants.d.ts.map +1 -0
- package/dist/odata-service/filterDefinitionConstants.d.ts +24 -0
- package/dist/odata-service/filterDefinitionConstants.d.ts.map +1 -0
- package/dist/odata-service/filterDefinitions.d.ts +19 -17
- package/dist/odata-service/filterDefinitions.d.ts.map +1 -1
- package/dist/odata-service/filterOperationConstants.d.ts +14 -0
- package/dist/odata-service/filterOperationConstants.d.ts.map +1 -0
- package/dist/odata-service/filters.d.ts.map +1 -1
- package/dist/odata-service/formatters.d.ts.map +1 -1
- package/dist/odata-service/index.js +439 -433
- package/dist/odata-service/index.js.map +1 -1
- package/dist/odata-service/odataMetadataConstants.d.ts +8 -0
- package/dist/odata-service/odataMetadataConstants.d.ts.map +1 -0
- package/dist/odata-service/parser.d.ts +1 -3
- package/dist/odata-service/parser.d.ts.map +1 -1
- package/dist/odata-service/schema.d.ts.map +1 -1
- package/dist/odata-service/sorts.d.ts.map +1 -1
- package/dist/odata-service/sqlFilters.d.ts +10 -5
- package/dist/odata-service/sqlFilters.d.ts.map +1 -1
- package/dist/odata-service/types.d.ts +5 -3
- package/dist/odata-service/types.d.ts.map +1 -1
- package/dist/pwa/index.js +72 -71
- package/dist/pwa/index.js.map +1 -1
- package/dist/pwa/sw-cache-policy.js +47 -47
- package/dist/pwa/sw-cache-policy.js.map +1 -1
- package/dist/pwa/swCachePolicy.d.ts +5 -1
- package/dist/pwa/swCachePolicy.d.ts.map +1 -1
- package/dist/pwa/useBrowserOnlineStatus.d.ts.map +1 -1
- package/dist/query-client/broadcast.d.ts +4 -3
- package/dist/query-client/broadcast.d.ts.map +1 -1
- package/dist/query-client/createQueryRestoreSchedulerGuard.d.ts.map +1 -1
- package/dist/query-client/createQueryRestoreStorage.d.ts.map +1 -1
- package/dist/query-client/index.js +1 -1
- package/dist/query-client/invalidationBroadcast.d.ts +2 -1
- package/dist/query-client/invalidationBroadcast.d.ts.map +1 -1
- package/dist/query-client/persistence.d.ts +9 -6
- package/dist/query-client/persistence.d.ts.map +1 -1
- package/dist/query-client/queryCacheEventConstants.d.ts +11 -0
- package/dist/query-client/queryCacheEventConstants.d.ts.map +1 -0
- package/dist/query-client/queryClient.d.ts +2 -1
- package/dist/query-client/queryClient.d.ts.map +1 -1
- package/dist/query-client/queryMeta.d.ts.map +1 -1
- package/dist/query-client/sessionPersistenceConstants.d.ts +5 -0
- package/dist/query-client/sessionPersistenceConstants.d.ts.map +1 -0
- package/dist/query-client/sessionScoped.d.ts.map +1 -1
- package/dist/query-client/sessionScopedResetConstants.d.ts +4 -0
- package/dist/query-client/sessionScopedResetConstants.d.ts.map +1 -0
- package/dist/query-client/sessionScopedResetLifecycleTypes.d.ts +2 -1
- package/dist/query-client/sessionScopedResetLifecycleTypes.d.ts.map +1 -1
- package/dist/seo/index.js +0 -1
- package/dist/seo/index.js.map +1 -1
- package/dist/seo/seo.d.ts +3 -2
- package/dist/seo/seo.d.ts.map +1 -1
- package/dist/seo/seoContentTypeConstants.d.ts +6 -0
- package/dist/seo/seoContentTypeConstants.d.ts.map +1 -0
- package/dist/seo/types.d.ts +2 -1
- package/dist/seo/types.d.ts.map +1 -1
- package/dist/session-storage/index.js +1 -1
- package/dist/table/cellSelection.d.ts.map +1 -1
- package/dist/table/index.js +83 -79
- package/dist/table/index.js.map +1 -1
- package/dist/table/odataAdapter.d.ts +3 -3
- package/dist/table/odataAdapter.d.ts.map +1 -1
- package/dist/table/selection.d.ts +2 -2
- package/dist/table/selection.d.ts.map +1 -1
- package/dist/table/tableColumnConstants.d.ts +5 -0
- package/dist/table/tableColumnConstants.d.ts.map +1 -0
- package/dist/table/tableSelectionConstants.d.ts +8 -0
- package/dist/table/tableSelectionConstants.d.ts.map +1 -0
- package/dist/table/tanStackFeatures.d.ts +8 -8
- package/dist/table/types.d.ts +5 -3
- package/dist/table/types.d.ts.map +1 -1
- package/dist/table/useTableRowSelection.d.ts +2 -2
- package/dist/table/useTableRowSelection.d.ts.map +1 -1
- package/dist/table-document/index.js +88 -87
- package/dist/table-document/index.js.map +1 -1
- package/dist/table-document/insertTableDocumentAxis.d.ts +2 -1
- package/dist/table-document/insertTableDocumentAxis.d.ts.map +1 -1
- package/dist/table-document/tableDocument.d.ts +2 -1
- package/dist/table-document/tableDocument.d.ts.map +1 -1
- package/dist/table-document/tableDocumentAxisGroups.d.ts +4 -3
- package/dist/table-document/tableDocumentAxisGroups.d.ts.map +1 -1
- package/dist/table-document/tableDocumentConstants.d.ts +8 -0
- package/dist/table-document/tableDocumentConstants.d.ts.map +1 -0
- package/dist/table-document/tableDocumentGeometry.d.ts.map +1 -1
- package/dist/three-scene/index.js +32 -32
- package/dist/three-scene/index.js.map +1 -1
- package/dist/three-scene/threeSceneAvailability.d.ts +4 -3
- package/dist/three-scene/threeSceneAvailability.d.ts.map +1 -1
- package/dist/three-scene/threeSceneConstants.d.ts +14 -0
- package/dist/three-scene/threeSceneConstants.d.ts.map +1 -0
- package/dist/three-scene/useThreeSceneAvailability.d.ts.map +1 -1
- package/dist/tree-table/index.js +1 -1
- package/dist/types/abapBooleanConstants.d.ts +4 -0
- package/dist/types/abapBooleanConstants.d.ts.map +1 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/types.d.ts +4 -2
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/valueStateConstants.d.ts +8 -0
- package/dist/types/valueStateConstants.d.ts.map +1 -0
- package/dist/utils/cloneFunctionStrategyConstants.d.ts +4 -0
- package/dist/utils/cloneFunctionStrategyConstants.d.ts.map +1 -0
- package/dist/utils/createLazyComponent.d.ts.map +1 -1
- package/dist/utils/deepCloneWithoutFunctions.d.ts +2 -1
- package/dist/utils/deepCloneWithoutFunctions.d.ts.map +1 -1
- package/dist/utils/deepCopyWithoutFunctions.d.ts +2 -1
- package/dist/utils/deepCopyWithoutFunctions.d.ts.map +1 -1
- package/dist/utils/index.js +2 -209
- package/dist/utils/keyboard.d.ts +2 -1
- package/dist/utils/keyboard.d.ts.map +1 -1
- package/dist/utils/keyboardConstants.d.ts +16 -0
- package/dist/utils/keyboardConstants.d.ts.map +1 -0
- package/dist/validators/index.js +3 -3
- package/dist/validators/index.js.map +1 -1
- package/dist/validators/validateUrl.d.ts.map +1 -1
- package/dist/value-transformers/execute.d.ts.map +1 -1
- package/dist/value-transformers/index.js +9 -6
- package/dist/value-transformers/index.js.map +1 -1
- package/dist/value-transformers/types.d.ts +3 -2
- package/dist/value-transformers/types.d.ts.map +1 -1
- package/dist/value-transformers/valueTransformerConstants.d.ts +4 -0
- package/dist/value-transformers/valueTransformerConstants.d.ts.map +1 -0
- package/package.json +6 -5
- package/src/binary/README.mdx +1 -1
- package/src/dom/README.mdx +1 -1
- package/src/query-client/README.mdx +4 -4
- package/dist/chunks/dom-BK22UmgF.js.map +0 -1
- package/dist/chunks/formatDate-BUvpRI7H.js +0 -133
- package/dist/chunks/formatDate-BUvpRI7H.js.map +0 -1
- package/dist/chunks/formatters-rxriDRPk.js.map +0 -1
- package/dist/chunks/formulas-BXT_XBWI.js.map +0 -1
- package/dist/chunks/media-WK38KtMl.js +0 -191
- package/dist/chunks/media-WK38KtMl.js.map +0 -1
- package/dist/chunks/query-client-CVRfrYZM.js.map +0 -1
- package/dist/chunks/scalarTypeClassification-BZcFmIyR.js +0 -764
- package/dist/chunks/scalarTypeClassification-BZcFmIyR.js.map +0 -1
- package/dist/chunks/uuid-CUJPAbRY.js.map +0 -1
- package/dist/chunks/validate-DsUR-bFF.js +0 -608
- package/dist/chunks/validate-DsUR-bFF.js.map +0 -1
- package/dist/utils/index.js.map +0 -1
package/dist/hooks/index.js
CHANGED
|
@@ -1,22 +1,24 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { c as e, d as t, g as n, o as r, s as i } from "../chunks/utils-DW0Yso1Q.js";
|
|
2
|
+
import "../chunks/keyboardConstants-BZKskWsm.js";
|
|
2
3
|
import { useCallback as a, useEffect as o, useLayoutEffect as s, useMemo as c, useRef as l, useState as u } from "react";
|
|
3
4
|
import { KeyboardSensor as d, MouseSensor as f, PointerSensor as p, TouchSensor as m, useSensor as h, useSensors as g } from "@dnd-kit/core";
|
|
4
5
|
import { sortableKeyboardCoordinates as _ } from "@dnd-kit/sortable";
|
|
5
|
-
import { autoPlacement as ee, autoUpdate as
|
|
6
|
+
import { autoPlacement as ee, autoUpdate as v, flip as te, offset as ne, shift as y, size as re, useDismiss as ie, useFloating as b, useInteractions as x, useRole as ae } from "@floating-ui/react";
|
|
6
7
|
import { useLocation as S, useNavigate as C, useSearch as w } from "@tanstack/react-router";
|
|
7
8
|
//#region src/hooks/useBlockBrowserZoom.ts
|
|
8
|
-
|
|
9
|
+
var T = "wheel";
|
|
10
|
+
function E(e) {
|
|
9
11
|
o(() => {
|
|
10
12
|
if (!e) return;
|
|
11
13
|
let t = (e) => {
|
|
12
14
|
e.ctrlKey && e.preventDefault();
|
|
13
15
|
};
|
|
14
|
-
return window.addEventListener(
|
|
16
|
+
return window.addEventListener(T, t, { passive: !1 }), () => window.removeEventListener(T, t);
|
|
15
17
|
}, [e]);
|
|
16
18
|
}
|
|
17
19
|
//#endregion
|
|
18
20
|
//#region src/hooks/useDebounce.ts
|
|
19
|
-
function
|
|
21
|
+
function D(e, t) {
|
|
20
22
|
let [n, r] = u(e);
|
|
21
23
|
return o(() => {
|
|
22
24
|
let n = setTimeout(() => {
|
|
@@ -27,7 +29,7 @@ function E(e, t) {
|
|
|
27
29
|
}
|
|
28
30
|
//#endregion
|
|
29
31
|
//#region src/hooks/useDebounceCallback.ts
|
|
30
|
-
function
|
|
32
|
+
function O(e, t, n) {
|
|
31
33
|
let r = l(e);
|
|
32
34
|
o(() => {
|
|
33
35
|
r.current = e;
|
|
@@ -56,8 +58,9 @@ function D(e, t, n) {
|
|
|
56
58
|
}
|
|
57
59
|
//#endregion
|
|
58
60
|
//#region src/hooks/useDndSortableSensors.ts
|
|
59
|
-
|
|
60
|
-
|
|
61
|
+
var k = 6;
|
|
62
|
+
function A(e = k) {
|
|
63
|
+
let t = typeof e == "number" ? { activationDistance: e } : e, n = t.activationDistance ?? k, r = h(p, { activationConstraint: { distance: n } }), i = h(f, { activationConstraint: { distance: n } }), a = h(m, { activationConstraint: {
|
|
61
64
|
delay: t.touchActivation?.delay ?? 0,
|
|
62
65
|
tolerance: t.touchActivation?.tolerance ?? n
|
|
63
66
|
} }), o = h(d, {
|
|
@@ -68,8 +71,8 @@ function O(e = 6) {
|
|
|
68
71
|
}
|
|
69
72
|
//#endregion
|
|
70
73
|
//#region src/hooks/useFloatingListbox.ts
|
|
71
|
-
var
|
|
72
|
-
|
|
74
|
+
var oe = "flip", se = "auto", j = "bottom-start", M = 8, ce = 4, le = 120, N = /* @__PURE__ */ new WeakMap(), P = /* @__PURE__ */ new WeakMap(), ue = [
|
|
75
|
+
j,
|
|
73
76
|
"bottom-end",
|
|
74
77
|
"top-start",
|
|
75
78
|
"top-end",
|
|
@@ -78,35 +81,35 @@ var k = /* @__PURE__ */ new WeakMap(), A = /* @__PURE__ */ new WeakMap(), j = [
|
|
|
78
81
|
"right-start",
|
|
79
82
|
"right-end"
|
|
80
83
|
];
|
|
81
|
-
function
|
|
82
|
-
let E = l([]), [D, O] = u(!1),
|
|
83
|
-
allowedPlacements:
|
|
84
|
+
function F({ options: n, selectedIndex: a, open: c, onOpenChange: d, getOptionDisabled: f, onSelect: p, disabled: m, placement: h = j, placementStrategy: g = oe, closeOnSelect: _ = !0, focusFloatingOnOpen: S = !0, allowOpenWithoutOptions: C = !1, restoreFocusOnClose: w = !0, resolveFloatingSize: T }) {
|
|
85
|
+
let E = l([]), [D, O] = u(!1), k = c ?? D, A = d ?? O, [F, I] = u(a >= 0 ? a : r(n, f)), [L] = u(() => ({})), R = (e) => n.length === 0 ? -1 : e >= 0 && e < n.length && !f?.(n[e]) ? e : a >= 0 && a < n.length && !f?.(n[a]) ? a : r(n, f), z = R(F), B = g === se ? ee({
|
|
86
|
+
allowedPlacements: ue,
|
|
84
87
|
crossAxis: !1,
|
|
85
|
-
padding:
|
|
86
|
-
}) :
|
|
87
|
-
open:
|
|
88
|
-
onOpenChange:
|
|
88
|
+
padding: M
|
|
89
|
+
}) : te({ padding: M }), { refs: V, floatingStyles: H, context: U, update: W } = b({
|
|
90
|
+
open: k,
|
|
91
|
+
onOpenChange: A,
|
|
89
92
|
placement: h,
|
|
90
93
|
transform: !1,
|
|
91
94
|
strategy: "fixed",
|
|
92
95
|
middleware: [
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
padding:
|
|
96
|
+
ne(ce),
|
|
97
|
+
B,
|
|
98
|
+
y({ padding: M }),
|
|
99
|
+
re({
|
|
100
|
+
padding: M,
|
|
98
101
|
apply({ availableWidth: e, availableHeight: t, rects: n, elements: r }) {
|
|
99
|
-
let i = r.floating.ownerDocument.documentElement, a = r.floating.style, o =
|
|
102
|
+
let i = r.floating.ownerDocument.documentElement, a = r.floating.style, o = P.get(L)?.({
|
|
100
103
|
availableWidth: e,
|
|
101
104
|
availableHeight: t,
|
|
102
105
|
viewportWidth: i.clientWidth,
|
|
103
106
|
viewportHeight: i.clientHeight,
|
|
104
107
|
referenceWidth: n.reference.width,
|
|
105
108
|
referenceHeight: n.reference.height
|
|
106
|
-
}), s =
|
|
109
|
+
}), s = N.get(r.floating);
|
|
107
110
|
for (let e of s?.customProperties ?? []) a.removeProperty(e);
|
|
108
111
|
for (let [e, t] of s?.standardProperties ?? []) a[e] = t;
|
|
109
|
-
a.minWidth = `${n.reference.width}px`, a.maxHeight = `${Math.max(t,
|
|
112
|
+
a.minWidth = `${n.reference.width}px`, a.maxHeight = `${Math.max(t, le)}px`;
|
|
110
113
|
let c = /* @__PURE__ */ new Set(), l = /* @__PURE__ */ new Map();
|
|
111
114
|
for (let [e, t] of Object.entries(o ?? {})) {
|
|
112
115
|
if (e.startsWith("--")) {
|
|
@@ -119,48 +122,48 @@ function M({ options: e, selectedIndex: a, open: c, onOpenChange: d, getOptionDi
|
|
|
119
122
|
l.set(n, a[n]), a[n] = t;
|
|
120
123
|
}
|
|
121
124
|
}
|
|
122
|
-
|
|
125
|
+
N.set(r.floating, {
|
|
123
126
|
customProperties: c,
|
|
124
127
|
standardProperties: l
|
|
125
128
|
});
|
|
126
129
|
}
|
|
127
130
|
})
|
|
128
131
|
],
|
|
129
|
-
whileElementsMounted:
|
|
130
|
-
}),
|
|
131
|
-
s(() => (T ?
|
|
132
|
-
|
|
133
|
-
}), [
|
|
134
|
-
!
|
|
132
|
+
whileElementsMounted: v
|
|
133
|
+
}), G = T !== void 0;
|
|
134
|
+
s(() => (T ? P.set(L, T) : P.delete(L), () => {
|
|
135
|
+
P.delete(L);
|
|
136
|
+
}), [L, T]), s(() => {
|
|
137
|
+
!k || !G || W();
|
|
135
138
|
}, [
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
139
|
+
G,
|
|
140
|
+
n.length,
|
|
141
|
+
k,
|
|
142
|
+
W
|
|
140
143
|
]);
|
|
141
|
-
let
|
|
144
|
+
let de = ie(U), fe = ae(U, { role: "listbox" }), { getFloatingProps: pe } = x([de, fe]), me = C || n.length > 0;
|
|
142
145
|
o(() => {
|
|
143
|
-
!
|
|
144
|
-
}, [
|
|
145
|
-
!
|
|
146
|
-
|
|
146
|
+
!k || z < 0 || E.current[z]?.scrollIntoView({ block: "nearest" });
|
|
147
|
+
}, [z, k]), o(() => {
|
|
148
|
+
!k || !S || requestAnimationFrame(() => {
|
|
149
|
+
V.floating.current?.focus();
|
|
147
150
|
});
|
|
148
151
|
}, [
|
|
149
152
|
S,
|
|
150
|
-
|
|
151
|
-
|
|
153
|
+
k,
|
|
154
|
+
V
|
|
152
155
|
]);
|
|
153
156
|
let K = () => {
|
|
154
|
-
if (
|
|
155
|
-
let e =
|
|
157
|
+
if (A(!1), w) {
|
|
158
|
+
let e = V.domReference.current;
|
|
156
159
|
e instanceof HTMLElement && e.focus();
|
|
157
160
|
}
|
|
158
|
-
}, q = (
|
|
159
|
-
m || !
|
|
161
|
+
}, q = (e) => {
|
|
162
|
+
m || !me || (n.length > 0 && I(R(e)), A(!0));
|
|
160
163
|
}, J = () => {
|
|
161
|
-
q(a >= 0 ? a :
|
|
162
|
-
},
|
|
163
|
-
if (
|
|
164
|
+
q(a >= 0 ? a : r(n, f));
|
|
165
|
+
}, he = () => {
|
|
166
|
+
if (k) {
|
|
164
167
|
K();
|
|
165
168
|
return;
|
|
166
169
|
}
|
|
@@ -168,109 +171,109 @@ function M({ options: e, selectedIndex: a, open: c, onOpenChange: d, getOptionDi
|
|
|
168
171
|
}, Y = (e) => {
|
|
169
172
|
f?.(e) || (p?.(e), _ && K());
|
|
170
173
|
}, X = () => {
|
|
171
|
-
if (
|
|
172
|
-
let
|
|
173
|
-
|
|
174
|
+
if (z < 0) return;
|
|
175
|
+
let e = n[z];
|
|
176
|
+
e !== void 0 && Y(e);
|
|
174
177
|
}, Z = () => {
|
|
175
|
-
|
|
178
|
+
I(r(n, f));
|
|
176
179
|
}, Q = () => {
|
|
177
|
-
|
|
178
|
-
},
|
|
180
|
+
I(i(n, f));
|
|
181
|
+
}, ge = (t) => {
|
|
179
182
|
if (!m) {
|
|
180
|
-
if (
|
|
181
|
-
if (
|
|
182
|
-
q(a >= 0 ? a :
|
|
183
|
+
if (t.key === "ArrowDown") {
|
|
184
|
+
if (t.preventDefault(), !k) {
|
|
185
|
+
q(a >= 0 ? a : r(n, f));
|
|
183
186
|
return;
|
|
184
187
|
}
|
|
185
|
-
|
|
188
|
+
I((t) => e(n, R(t), 1, f));
|
|
186
189
|
return;
|
|
187
190
|
}
|
|
188
|
-
if (
|
|
189
|
-
if (
|
|
190
|
-
q(a >= 0 ? a : n
|
|
191
|
+
if (t.key === "ArrowUp") {
|
|
192
|
+
if (t.preventDefault(), !k) {
|
|
193
|
+
q(a >= 0 ? a : i(n, f));
|
|
191
194
|
return;
|
|
192
195
|
}
|
|
193
|
-
|
|
196
|
+
I((t) => e(n, R(t), -1, f));
|
|
194
197
|
return;
|
|
195
198
|
}
|
|
196
|
-
if (
|
|
197
|
-
|
|
199
|
+
if (t.key === "Home" && k) {
|
|
200
|
+
t.preventDefault(), Z();
|
|
198
201
|
return;
|
|
199
202
|
}
|
|
200
|
-
if (
|
|
201
|
-
|
|
203
|
+
if (t.key === "End" && k) {
|
|
204
|
+
t.preventDefault(), Q();
|
|
202
205
|
return;
|
|
203
206
|
}
|
|
204
|
-
if (
|
|
205
|
-
|
|
207
|
+
if (t.key === "Escape" && k) {
|
|
208
|
+
t.preventDefault(), K();
|
|
206
209
|
return;
|
|
207
210
|
}
|
|
208
|
-
|
|
211
|
+
t.key === "Tab" && k && K();
|
|
209
212
|
}
|
|
210
|
-
},
|
|
211
|
-
if (
|
|
212
|
-
|
|
213
|
+
}, _e = (r) => {
|
|
214
|
+
if (r.target !== r.currentTarget) {
|
|
215
|
+
r.key === "Escape" && (r.preventDefault(), K());
|
|
213
216
|
return;
|
|
214
217
|
}
|
|
215
|
-
if (
|
|
216
|
-
|
|
218
|
+
if (r.key === "ArrowDown") {
|
|
219
|
+
r.preventDefault(), I((t) => e(n, R(t), 1, f));
|
|
217
220
|
return;
|
|
218
221
|
}
|
|
219
|
-
if (
|
|
220
|
-
|
|
222
|
+
if (r.key === "ArrowUp") {
|
|
223
|
+
r.preventDefault(), I((t) => e(n, R(t), -1, f));
|
|
221
224
|
return;
|
|
222
225
|
}
|
|
223
|
-
if (
|
|
224
|
-
|
|
226
|
+
if (r.key === "Home") {
|
|
227
|
+
r.preventDefault(), Z();
|
|
225
228
|
return;
|
|
226
229
|
}
|
|
227
|
-
if (
|
|
228
|
-
|
|
230
|
+
if (r.key === "End") {
|
|
231
|
+
r.preventDefault(), Q();
|
|
229
232
|
return;
|
|
230
233
|
}
|
|
231
|
-
if (!
|
|
232
|
-
if (
|
|
233
|
-
|
|
234
|
+
if (!t(r, X)) {
|
|
235
|
+
if (r.key === "Escape") {
|
|
236
|
+
r.preventDefault(), K();
|
|
234
237
|
return;
|
|
235
238
|
}
|
|
236
|
-
|
|
239
|
+
r.key === "Tab" && K();
|
|
237
240
|
}
|
|
238
241
|
}, $ = (e, t) => `${e}-option-${t}`;
|
|
239
242
|
return {
|
|
240
|
-
open:
|
|
241
|
-
setOpen:
|
|
242
|
-
activeIndex:
|
|
243
|
-
refs:
|
|
244
|
-
context:
|
|
245
|
-
floatingStyles:
|
|
246
|
-
getFloatingProps:
|
|
247
|
-
setReference:
|
|
248
|
-
setFloating:
|
|
243
|
+
open: k,
|
|
244
|
+
setOpen: A,
|
|
245
|
+
activeIndex: z,
|
|
246
|
+
refs: V,
|
|
247
|
+
context: U,
|
|
248
|
+
floatingStyles: H,
|
|
249
|
+
getFloatingProps: pe,
|
|
250
|
+
setReference: V.setReference,
|
|
251
|
+
setFloating: V.setFloating,
|
|
249
252
|
setOptionRef: (e, t) => {
|
|
250
253
|
E.current[e] = t;
|
|
251
254
|
},
|
|
252
255
|
close: K,
|
|
253
256
|
openList: J,
|
|
254
257
|
openWithIndex: q,
|
|
255
|
-
toggleOpen:
|
|
258
|
+
toggleOpen: he,
|
|
256
259
|
selectOption: Y,
|
|
257
260
|
selectActiveOption: X,
|
|
258
|
-
handleReferenceKeyDown:
|
|
259
|
-
handleFloatingKeyDown:
|
|
261
|
+
handleReferenceKeyDown: ge,
|
|
262
|
+
handleFloatingKeyDown: _e,
|
|
260
263
|
getOptionId: $,
|
|
261
|
-
getActiveOptionId: (e) =>
|
|
264
|
+
getActiveOptionId: (e) => z >= 0 ? $(e, z) : void 0
|
|
262
265
|
};
|
|
263
266
|
}
|
|
264
267
|
//#endregion
|
|
265
268
|
//#region src/hooks/useLazyComponent.ts
|
|
266
|
-
var
|
|
269
|
+
var I = (e, t, r) => c(() => n(e, t, r), [
|
|
267
270
|
r,
|
|
268
|
-
|
|
269
|
-
|
|
271
|
+
e,
|
|
272
|
+
t
|
|
270
273
|
]);
|
|
271
274
|
//#endregion
|
|
272
275
|
//#region src/hooks/useReferenceTrace.ts
|
|
273
|
-
function
|
|
276
|
+
function L(e, t) {
|
|
274
277
|
let n = l(t);
|
|
275
278
|
o(() => {
|
|
276
279
|
if (!__DEV__) return;
|
|
@@ -284,7 +287,7 @@ function P(e, t) {
|
|
|
284
287
|
}
|
|
285
288
|
//#endregion
|
|
286
289
|
//#region src/hooks/useSearchLink.ts
|
|
287
|
-
function
|
|
290
|
+
function R() {
|
|
288
291
|
let e = S();
|
|
289
292
|
return { buildLink: (t) => {
|
|
290
293
|
let n = new URLSearchParams(e.searchStr);
|
|
@@ -299,7 +302,7 @@ function F() {
|
|
|
299
302
|
}
|
|
300
303
|
//#endregion
|
|
301
304
|
//#region src/hooks/useSearchParams.ts
|
|
302
|
-
function
|
|
305
|
+
function z(e) {
|
|
303
306
|
let t = w({ strict: !1 }), n = C();
|
|
304
307
|
return {
|
|
305
308
|
params: t,
|
|
@@ -316,7 +319,7 @@ function I(e) {
|
|
|
316
319
|
}
|
|
317
320
|
//#endregion
|
|
318
321
|
//#region src/hooks/useThrottledCallback.ts
|
|
319
|
-
function
|
|
322
|
+
function B(e, t, n) {
|
|
320
323
|
let r = l(e);
|
|
321
324
|
o(() => {
|
|
322
325
|
r.current = e;
|
|
@@ -354,6 +357,6 @@ function L(e, t, n) {
|
|
|
354
357
|
};
|
|
355
358
|
}
|
|
356
359
|
//#endregion
|
|
357
|
-
export {
|
|
360
|
+
export { E as useBlockBrowserZoom, D as useDebounce, O as useDebouncedCallback, A as useDndSortableSensors, F as useFloatingListbox, I as useLazyComponent, L as useReferenceTrace, R as useSearchLink, z as useSearchParams, B as useThrottledCallback };
|
|
358
361
|
|
|
359
362
|
//# sourceMappingURL=index.js.map
|
package/dist/hooks/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../src/hooks/useBlockBrowserZoom.ts","../../src/hooks/useDebounce.ts","../../src/hooks/useDebounceCallback.ts","../../src/hooks/useDndSortableSensors.ts","../../src/hooks/useFloatingListbox.ts","../../src/hooks/useLazyComponent.ts","../../src/hooks/useReferenceTrace.ts","../../src/hooks/useSearchLink.ts","../../src/hooks/useSearchParams.ts","../../src/hooks/useThrottledCallback.ts"],"sourcesContent":["import { useEffect } from \"react\";\n\n/**\n * Глобально отключает браузерный zoom (ctrl+wheel).\n *\n * @param enabled если true — блокируем нативный зум страницы\n */\nexport function useBlockBrowserZoom(enabled: boolean) {\n\tuseEffect(() => {\n\t\tif (!enabled) return;\n\n\t\tconst handler = (e: WheelEvent) => {\n\t\t\tif (e.ctrlKey) {\n\t\t\t\te.preventDefault();\n\t\t\t}\n\t\t};\n\n\t\twindow.addEventListener(\"wheel\", handler, { passive: false });\n\t\treturn () => window.removeEventListener(\"wheel\", handler);\n\t}, [enabled]);\n}\n","import { useEffect, useState } from \"react\";\n\nexport function useDebounce<T>(value: T, delay: number): T {\n\tconst [debouncedValue, setDebouncedValue] = useState<T>(value);\n\n\tuseEffect(() => {\n\t\tconst timeoutId = setTimeout(() => {\n\t\t\tsetDebouncedValue(value);\n\t\t}, delay);\n\n\t\treturn () => clearTimeout(timeoutId);\n\t}, [value, delay]);\n\n\treturn debouncedValue;\n}\n","import { useCallback, useEffect, useRef } from \"react\";\n\n/**\n * Дебаунсит вызов колбэка: частые вызовы `call(value)` не вызывают `cb` сразу,\n * а откладывают его на `delayMs` после последнего вызова.\n *\n * Важно:\n * - Всегда сохраняется *последнее* значение (last-write-wins).\n * - `flush()` немедленно вызывает cb с последним сохранённым значением (если оно есть).\n * - `cancel()` отменяет таймер и забывает последнее значение.\n * - На unmount автоматически вызывается `cancel()` чтобы не было setState после размонтирования.\n *\n * Типовой кейс:\n * - onNodesChange -> call(snapshot)\n * - pointerup / blur / unmount -> flush() (или cancel(), если не надо сохранять)\n */\nexport function useDebouncedCallback<T>(cb: (arg: T) => void, delayMs: number, options?: { flushOnUnmount?: boolean }) {\n\t/**\n\t * Храним актуальную версию cb в ref, чтобы:\n\t * - не пересоздавать дебаунсер при каждом рендере,\n\t * - не ловить устаревший замыканием cb (stale closure),\n\t * - при этом всегда вызывать самую свежую функцию.\n\t */\n\tconst cbRef = useRef<(arg: T) => void>(cb);\n\n\t/**\n\t * Обновляем актуальную версию cb после commit'а\n\t */\n\tuseEffect(() => {\n\t\tcbRef.current = cb;\n\t}, [cb]);\n\n\t/**\n\t * id таймера. null означает что таймер не активен.\n\t */\n\tconst tRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n\t/**\n\t * Последнее значение, которое мы хотим \"закоммитить\" в cb.\n\t * Используем стратегию last-write-wins.\n\t */\n\tconst lastRef = useRef<T | null>(null);\n\n\t/**\n\t * cancel():\n\t * - останавливаем таймер, если он был,\n\t * - очищаем последнее значение (ничего не будет вызвано).\n\t */\n\tconst cancel = useCallback(() => {\n\t\tif (tRef.current) {\n\t\t\tclearTimeout(tRef.current);\n\t\t\ttRef.current = null;\n\t\t}\n\t\tlastRef.current = null;\n\t}, []);\n\n\t/**\n\t * flush():\n\t * - если есть отложенное значение, вызываем cb немедленно,\n\t * - сбрасываем таймер и lastRef.\n\t *\n\t * Используется, когда нужно гарантированно сохранить \"последнее\" прямо сейчас:\n\t * - unmount\n\t * - visibilitychange/blur\n\t * - pointerup/mouseup (конец взаимодействия)\n\t */\n\tconst flush = useCallback(() => {\n\t\tconst v = lastRef.current;\n\t\tif (v === null) return;\n\n\t\t// Сбрасываем before-call, чтобы если cb вызовет call() рекурсивно,\n\t\t// мы не держали старое значение.\n\t\tlastRef.current = null;\n\n\t\tif (tRef.current) {\n\t\t\tclearTimeout(tRef.current);\n\t\t\ttRef.current = null;\n\t\t}\n\n\t\tcbRef.current(v);\n\t}, []);\n\n\t/**\n\t * call(arg):\n\t * - сохраняем arg как \"последнее значение\"\n\t * - перезапускаем таймер\n\t * - по истечении delayMs вызываем flush()\n\t */\n\tconst call = useCallback(\n\t\t(arg: T) => {\n\t\t\tlastRef.current = arg;\n\n\t\t\t// Перезапуск таймера -> классический debounce\n\t\t\tif (tRef.current) clearTimeout(tRef.current);\n\n\t\t\ttRef.current = setTimeout(() => {\n\t\t\t\ttRef.current = null;\n\t\t\t\tflush();\n\t\t\t}, delayMs);\n\t\t},\n\t\t[delayMs, flush]\n\t);\n\n\t/**\n\t * Авто-cancel на unmount:\n\t * - убирает pending timeout\n\t * - предотвращает вызовы cb после размонтирования компонента\n\t */\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tif (options?.flushOnUnmount) {\n\t\t\t\tflush();\n\t\t\t} else {\n\t\t\t\tcancel();\n\t\t\t}\n\t\t};\n\t}, [cancel, flush, options?.flushOnUnmount]);\n\n\treturn { call, flush, cancel };\n}\n","import {\n\tKeyboardSensor,\n\tMouseSensor,\n\tPointerSensor,\n\tTouchSensor,\n\tuseSensor,\n\tuseSensors,\n\ttype KeyboardCodes,\n\ttype KeyboardCoordinateGetter\n} from \"@dnd-kit/core\";\nimport { sortableKeyboardCoordinates } from \"@dnd-kit/sortable\";\n\nexport interface UseDndSortableSensorsOptions {\n\tactivationDistance?: number;\n\t/**\n\t * Отдельная touch-конфигурация сохраняет нативную прокрутку до long press.\n\t * Без неё hook продолжает использовать единый PointerSensor.\n\t */\n\ttouchActivation?: {\n\t\treadonly delay: number;\n\t\treadonly tolerance?: number;\n\t};\n\t/** Позволяет предметной матрице выбирать только допустимые координаты вместо порядка sortable-list. */\n\tkeyboardCoordinateGetter?: KeyboardCoordinateGetter;\n\t/** Переопределяет клавиши начала/завершения, когда Enter занят primary action компонента. */\n\tkeyboardCodes?: KeyboardCodes;\n}\n\n/**\n * Стандартная конфигурация DnD-сенсоров для сортируемых списков и матриц.\n *\n * Зачем: исключить дублирование одинаковой настройки PointerSensor + KeyboardSensor\n * в каждом хуке персонализации (колонки, сортировки, группировки).\n *\n * @param distanceOrOptions — минимальное смещение указателя или расширенные настройки mouse/touch/keyboard.\n */\nexport function useDndSortableSensors(distanceOrOptions: number | UseDndSortableSensorsOptions = 6) {\n\tconst options = typeof distanceOrOptions === \"number\" ? { activationDistance: distanceOrOptions } : distanceOrOptions;\n\tconst distance = options.activationDistance ?? 6;\n\tconst pointerSensor = useSensor(PointerSensor, { activationConstraint: { distance } });\n\tconst mouseSensor = useSensor(MouseSensor, { activationConstraint: { distance } });\n\tconst touchSensor = useSensor(TouchSensor, {\n\t\tactivationConstraint: {\n\t\t\tdelay: options.touchActivation?.delay ?? 0,\n\t\t\ttolerance: options.touchActivation?.tolerance ?? distance\n\t\t}\n\t});\n\tconst keyboardSensor = useSensor(KeyboardSensor, {\n\t\tcoordinateGetter: options.keyboardCoordinateGetter ?? sortableKeyboardCoordinates,\n\t\tkeyboardCodes: options.keyboardCodes\n\t});\n\n\treturn useSensors(\n\t\toptions.touchActivation ? mouseSensor : pointerSensor,\n\t\toptions.touchActivation ? touchSensor : undefined,\n\t\tkeyboardSensor\n\t);\n}\n","import { useEffect, useLayoutEffect, useRef, useState } from \"react\";\n\nimport {\n\tautoPlacement,\n\tautoUpdate,\n\tflip,\n\toffset,\n\tPlacement,\n\tshift,\n\tsize as floatingSize,\n\tuseDismiss,\n\tuseFloating,\n\tuseInteractions,\n\tuseRole\n} from \"@floating-ui/react\";\n\nimport { findFirstEnabledIndex, findLastEnabledIndex, findNextEnabledIndex, handleKeyboardActivation } from \"../utils\";\n\n/** Геометрия, которую Floating UI вычислил для доступной стороны listbox. */\nexport type FloatingListboxSizeContext = {\n\tavailableWidth: number;\n\tavailableHeight: number;\n\tviewportWidth: number;\n\tviewportHeight: number;\n\treferenceWidth: number;\n\treferenceHeight: number;\n};\n\n/**\n * Размеры floating-элемента и CSS custom properties, которые специализированный\n * picker может вычислить из доступного viewport без собственного middleware.\n */\nexport type FloatingListboxSizeStyle = {\n\twidth?: string;\n\tminWidth?: string;\n\tmaxWidth?: string;\n\tmaxHeight?: string;\n} & {\n\t[customProperty: `--${string}`]: string | undefined;\n};\n\nexport type FloatingListboxSizeResolver = (context: FloatingListboxSizeContext) => FloatingListboxSizeStyle;\n\n/** Стратегия выбора стороны для floating-элемента относительно reference. */\nexport type FloatingListboxPlacementStrategy = \"flip\" | \"auto\";\n\ntype FloatingListboxStandardSizeProperty = \"width\" | \"minWidth\" | \"maxWidth\" | \"maxHeight\";\n\ntype FloatingListboxAppliedSizeState = {\n\tcustomProperties: Set<`--${string}`>;\n\tstandardProperties: Map<FloatingListboxStandardSizeProperty, string>;\n};\n\n/** Хранит свойства и их исходные значения до императивного применения resolver. */\nconst floatingListboxAppliedSizeState = new WeakMap<HTMLElement, FloatingListboxAppliedSizeState>();\n\n/** Хранит актуальный resolver отдельно от callback, который Floating UI может переиспользовать. */\nconst floatingListboxSizeResolvers = new WeakMap<object, FloatingListboxSizeResolver>();\n\n/** Полный набор выровненных сторон для поиска наиболее просторного положения. */\nconst FLOATING_LISTBOX_AUTO_PLACEMENTS: Placement[] = [\n\t\"bottom-start\",\n\t\"bottom-end\",\n\t\"top-start\",\n\t\"top-end\",\n\t\"left-start\",\n\t\"left-end\",\n\t\"right-start\",\n\t\"right-end\"\n];\n\ninterface UseFloatingListboxParams<T> {\n\toptions: readonly T[];\n\tselectedIndex: number;\n\topen?: boolean;\n\tonOpenChange?: (open: boolean) => void;\n\tgetOptionDisabled?: (option: T) => boolean;\n\tonSelect?: (option: T) => void;\n\tdisabled?: boolean;\n\tplacement?: Placement;\n\t/** `auto` сравнивает свободное место сверху, снизу, слева и справа. */\n\tplacementStrategy?: FloatingListboxPlacementStrategy;\n\tcloseOnSelect?: boolean;\n\tfocusFloatingOnOpen?: boolean;\n\tallowOpenWithoutOptions?: boolean;\n\trestoreFocusOnClose?: boolean;\n\tresolveFloatingSize?: FloatingListboxSizeResolver;\n}\n\nexport function useFloatingListbox<T>({\n\toptions,\n\tselectedIndex,\n\topen,\n\tonOpenChange,\n\tgetOptionDisabled,\n\tonSelect,\n\tdisabled,\n\tplacement = \"bottom-start\",\n\tplacementStrategy = \"flip\",\n\tcloseOnSelect = true,\n\tfocusFloatingOnOpen = true,\n\tallowOpenWithoutOptions = false,\n\trestoreFocusOnClose = true,\n\tresolveFloatingSize\n}: UseFloatingListboxParams<T>) {\n\tconst optionRefs = useRef<Array<HTMLElement | null>>([]);\n\tconst [internalOpen, setInternalOpen] = useState(false);\n\tconst resolvedOpen = open ?? internalOpen;\n\tconst setResolvedOpen = onOpenChange ?? setInternalOpen;\n\tconst [currentActiveIndex, setActiveIndex] = useState(\n\t\tselectedIndex >= 0 ? selectedIndex : findFirstEnabledIndex(options, getOptionDisabled)\n\t);\n\tconst [floatingSizeResolverOwner] = useState<object>(() => ({}));\n\n\t/**\n\t * Поддерживает активный индекс в валидном состоянии при изменении набора опций\n\t * или выбранного элемента, чтобы `aria-activedescendant` всегда ссылался на\n\t * существующую и доступную опцию.\n\t */\n\tconst resolveActiveIndex = (activeIndex: number) => {\n\t\tif (options.length === 0) {\n\t\t\treturn -1;\n\t\t}\n\n\t\tif (activeIndex >= 0 && activeIndex < options.length && !getOptionDisabled?.(options[activeIndex])) {\n\t\t\treturn activeIndex;\n\t\t}\n\n\t\tif (selectedIndex >= 0 && selectedIndex < options.length && !getOptionDisabled?.(options[selectedIndex])) {\n\t\t\treturn selectedIndex;\n\t\t}\n\n\t\treturn findFirstEnabledIndex(options, getOptionDisabled);\n\t};\n\tconst activeIndex = resolveActiveIndex(currentActiveIndex);\n\tconst placementMiddleware =\n\t\tplacementStrategy === \"auto\"\n\t\t\t? autoPlacement({\n\t\t\t\t\tallowedPlacements: FLOATING_LISTBOX_AUTO_PLACEMENTS,\n\t\t\t\t\t/*\n\t\t\t\t\t * Свободную сторону сравниваем по main axis. Варианты start/end при\n\t\t\t\t\t * этом всё равно исключаются autoPlacement, если не помещаются по\n\t\t\t\t\t * cross axis.\n\t\t\t\t\t */\n\t\t\t\t\tcrossAxis: false,\n\t\t\t\t\tpadding: 8\n\t\t\t\t})\n\t\t\t: flip({ padding: 8 });\n\n\tconst { refs, floatingStyles, context, update } = useFloating({\n\t\topen: resolvedOpen,\n\t\tonOpenChange: setResolvedOpen,\n\t\tplacement,\n\t\ttransform: false,\n\t\tstrategy: \"fixed\",\n\t\tmiddleware: [\n\t\t\toffset(4),\n\t\t\tplacementMiddleware,\n\t\t\tshift({ padding: 8 }),\n\t\t\tfloatingSize({\n\t\t\t\tpadding: 8,\n\t\t\t\tapply({ availableWidth, availableHeight, rects, elements }) {\n\t\t\t\t\tconst viewport = elements.floating.ownerDocument.documentElement;\n\t\t\t\t\tconst floatingStyle = elements.floating.style;\n\t\t\t\t\tconst resolvedSize = floatingListboxSizeResolvers.get(floatingSizeResolverOwner)?.({\n\t\t\t\t\t\tavailableWidth,\n\t\t\t\t\t\tavailableHeight,\n\t\t\t\t\t\tviewportWidth: viewport.clientWidth,\n\t\t\t\t\t\tviewportHeight: viewport.clientHeight,\n\t\t\t\t\t\treferenceWidth: rects.reference.width,\n\t\t\t\t\t\treferenceHeight: rects.reference.height\n\t\t\t\t\t});\n\n\t\t\t\t\t/*\n\t\t\t\t\t * Сначала сбрасываем размеры предыдущего resolver: Floating UI сохраняет\n\t\t\t\t\t * один DOM-узел между режимами, поэтому старые width и CSS-переменные\n\t\t\t\t\t * иначе продолжат влиять на следующий вариант отображения.\n\t\t\t\t\t */\n\t\t\t\t\tconst previousAppliedState = floatingListboxAppliedSizeState.get(elements.floating);\n\t\t\t\t\tfor (const property of previousAppliedState?.customProperties ?? []) {\n\t\t\t\t\t\tfloatingStyle.removeProperty(property);\n\t\t\t\t\t}\n\t\t\t\t\tfor (const [property, previousValue] of previousAppliedState?.standardProperties ?? []) {\n\t\t\t\t\t\tfloatingStyle[property] = previousValue;\n\t\t\t\t\t}\n\n\t\t\t\t\tfloatingStyle.minWidth = `${rects.reference.width}px`;\n\t\t\t\t\tfloatingStyle.maxHeight = `${Math.max(availableHeight, 120)}px`;\n\n\t\t\t\t\tconst nextCustomProperties = new Set<`--${string}`>();\n\t\t\t\t\tconst nextStandardProperties = new Map<FloatingListboxStandardSizeProperty, string>();\n\t\t\t\t\tfor (const [property, value] of Object.entries(resolvedSize ?? {})) {\n\t\t\t\t\t\tif (property.startsWith(\"--\")) {\n\t\t\t\t\t\t\tconst customProperty = property as `--${string}`;\n\t\t\t\t\t\t\tif (value !== undefined) {\n\t\t\t\t\t\t\t\tfloatingStyle.setProperty(customProperty, value);\n\t\t\t\t\t\t\t\tnextCustomProperties.add(customProperty);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (value !== undefined) {\n\t\t\t\t\t\t\tconst standardProperty = property as FloatingListboxStandardSizeProperty;\n\t\t\t\t\t\t\tnextStandardProperties.set(standardProperty, floatingStyle[standardProperty]);\n\t\t\t\t\t\t\tfloatingStyle[standardProperty] = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tfloatingListboxAppliedSizeState.set(elements.floating, {\n\t\t\t\t\t\tcustomProperties: nextCustomProperties,\n\t\t\t\t\t\tstandardProperties: nextStandardProperties\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t})\n\t\t],\n\t\twhileElementsMounted: autoUpdate\n\t});\n\tconst hasFloatingSizeResolver = resolveFloatingSize !== undefined;\n\n\t/*\n\t * Floating UI сравнивает middleware структурно и может сохранить первый\n\t * size.apply. WeakMap позволяет этому callback читать актуальный resolver после\n\t * загрузки OData-узлов, не пересоздавая конкурирующие middleware.\n\t */\n\tuseLayoutEffect(() => {\n\t\tif (resolveFloatingSize) {\n\t\t\tfloatingListboxSizeResolvers.set(floatingSizeResolverOwner, resolveFloatingSize);\n\t\t} else {\n\t\t\tfloatingListboxSizeResolvers.delete(floatingSizeResolverOwner);\n\t\t}\n\n\t\treturn () => {\n\t\t\tfloatingListboxSizeResolvers.delete(floatingSizeResolverOwner);\n\t\t};\n\t}, [floatingSizeResolverOwner, resolveFloatingSize]);\n\n\t/**\n\t * Асинхронно загруженные или отфильтрованные опции могут не изменить внешний\n\t * rect popup: grid с прежним числом строк остаётся того же размера. Явный\n\t * update повторно запускает placement и size middleware после commit списка.\n\t */\n\tuseLayoutEffect(() => {\n\t\tif (!resolvedOpen || !hasFloatingSizeResolver) {\n\t\t\treturn;\n\t\t}\n\n\t\tvoid update();\n\t}, [hasFloatingSizeResolver, options.length, resolvedOpen, update]);\n\n\tconst dismiss = useDismiss(context);\n\tconst role = useRole(context, { role: \"listbox\" });\n\tconst { getFloatingProps } = useInteractions([dismiss, role]);\n\n\tconst canOpen = allowOpenWithoutOptions || options.length > 0;\n\n\tuseEffect(() => {\n\t\tif (!resolvedOpen || activeIndex < 0) {\n\t\t\treturn;\n\t\t}\n\n\t\toptionRefs.current[activeIndex]?.scrollIntoView({ block: \"nearest\" });\n\t}, [activeIndex, resolvedOpen]);\n\n\tuseEffect(() => {\n\t\tif (!resolvedOpen || !focusFloatingOnOpen) {\n\t\t\treturn;\n\t\t}\n\n\t\trequestAnimationFrame(() => {\n\t\t\trefs.floating.current?.focus();\n\t\t});\n\t}, [focusFloatingOnOpen, resolvedOpen, refs]);\n\n\tconst close = () => {\n\t\tsetResolvedOpen(false);\n\n\t\tif (restoreFocusOnClose) {\n\t\t\tconst referenceElement = refs.domReference.current;\n\t\t\tif (referenceElement instanceof HTMLElement) {\n\t\t\t\treferenceElement.focus();\n\t\t\t}\n\t\t}\n\t};\n\n\tconst openWithIndex = (nextIndex: number) => {\n\t\tif (disabled || !canOpen) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (options.length > 0) {\n\t\t\tsetActiveIndex(resolveActiveIndex(nextIndex));\n\t\t}\n\n\t\tsetResolvedOpen(true);\n\t};\n\n\tconst openList = () => {\n\t\topenWithIndex(selectedIndex >= 0 ? selectedIndex : findFirstEnabledIndex(options, getOptionDisabled));\n\t};\n\n\tconst toggleOpen = () => {\n\t\tif (resolvedOpen) {\n\t\t\tclose();\n\t\t\treturn;\n\t\t}\n\n\t\topenList();\n\t};\n\n\tconst selectOption = (option: T) => {\n\t\tif (getOptionDisabled?.(option)) {\n\t\t\treturn;\n\t\t}\n\n\t\tonSelect?.(option);\n\n\t\tif (closeOnSelect) {\n\t\t\tclose();\n\t\t}\n\t};\n\n\tconst selectActiveOption = () => {\n\t\tif (activeIndex < 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst activeOption = options[activeIndex];\n\t\tif (activeOption !== undefined) {\n\t\t\tselectOption(activeOption);\n\t\t}\n\t};\n\n\tconst moveActiveToFirst = () => {\n\t\tsetActiveIndex(findFirstEnabledIndex(options, getOptionDisabled));\n\t};\n\n\tconst moveActiveToLast = () => {\n\t\tsetActiveIndex(findLastEnabledIndex(options, getOptionDisabled));\n\t};\n\n\tconst handleReferenceKeyDown = (event: React.KeyboardEvent<HTMLElement>) => {\n\t\tif (disabled) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.key === \"ArrowDown\") {\n\t\t\tevent.preventDefault();\n\n\t\t\tif (!resolvedOpen) {\n\t\t\t\topenWithIndex(selectedIndex >= 0 ? selectedIndex : findFirstEnabledIndex(options, getOptionDisabled));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsetActiveIndex((currentIndex) => findNextEnabledIndex(options, resolveActiveIndex(currentIndex), 1, getOptionDisabled));\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.key === \"ArrowUp\") {\n\t\t\tevent.preventDefault();\n\n\t\t\tif (!resolvedOpen) {\n\t\t\t\topenWithIndex(selectedIndex >= 0 ? selectedIndex : findLastEnabledIndex(options, getOptionDisabled));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsetActiveIndex((currentIndex) => findNextEnabledIndex(options, resolveActiveIndex(currentIndex), -1, getOptionDisabled));\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.key === \"Home\" && resolvedOpen) {\n\t\t\tevent.preventDefault();\n\t\t\tmoveActiveToFirst();\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.key === \"End\" && resolvedOpen) {\n\t\t\tevent.preventDefault();\n\t\t\tmoveActiveToLast();\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.key === \"Escape\" && resolvedOpen) {\n\t\t\tevent.preventDefault();\n\t\t\tclose();\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.key === \"Tab\" && resolvedOpen) {\n\t\t\tclose();\n\t\t}\n\t};\n\n\tconst handleFloatingKeyDown = (event: React.KeyboardEvent<HTMLElement>) => {\n\t\tif (event.target !== event.currentTarget) {\n\t\t\tif (event.key === \"Escape\") {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tclose();\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.key === \"ArrowDown\") {\n\t\t\tevent.preventDefault();\n\t\t\tsetActiveIndex((currentIndex) => findNextEnabledIndex(options, resolveActiveIndex(currentIndex), 1, getOptionDisabled));\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.key === \"ArrowUp\") {\n\t\t\tevent.preventDefault();\n\t\t\tsetActiveIndex((currentIndex) => findNextEnabledIndex(options, resolveActiveIndex(currentIndex), -1, getOptionDisabled));\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.key === \"Home\") {\n\t\t\tevent.preventDefault();\n\t\t\tmoveActiveToFirst();\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.key === \"End\") {\n\t\t\tevent.preventDefault();\n\t\t\tmoveActiveToLast();\n\t\t\treturn;\n\t\t}\n\n\t\tif (handleKeyboardActivation(event, selectActiveOption)) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.key === \"Escape\") {\n\t\t\tevent.preventDefault();\n\t\t\tclose();\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.key === \"Tab\") {\n\t\t\tclose();\n\t\t}\n\t};\n\n\tconst getOptionId = (listId: string, index: number) => `${listId}-option-${index}`;\n\tconst getActiveOptionId = (listId: string) => (activeIndex >= 0 ? getOptionId(listId, activeIndex) : undefined);\n\n\treturn {\n\t\topen: resolvedOpen,\n\t\tsetOpen: setResolvedOpen,\n\t\tactiveIndex,\n\t\trefs,\n\t\tcontext,\n\t\tfloatingStyles,\n\t\tgetFloatingProps,\n\t\tsetReference: refs.setReference,\n\t\tsetFloating: refs.setFloating,\n\t\tsetOptionRef: (index: number, node: HTMLElement | null) => {\n\t\t\toptionRefs.current[index] = node;\n\t\t},\n\t\tclose,\n\t\topenList,\n\t\topenWithIndex,\n\t\ttoggleOpen,\n\t\tselectOption,\n\t\tselectActiveOption,\n\t\thandleReferenceKeyDown,\n\t\thandleFloatingKeyDown,\n\t\tgetOptionId,\n\t\tgetActiveOptionId\n\t};\n}\n","import { type ComponentType, useMemo } from \"react\";\n\nimport { createLazyComponent } from \"../utils/createLazyComponent\";\n\n/**\n * Хук для создания ленивой компоненты, которая будет загружена только при первом рендере.\n *\n * @example\n *\n * ```tsx\n * const MyComponent = () => {\n * const TextEditor = useLazyComponent(\n * () => import(\"@components/content/article/editor/TextEditor\"),\n * \"TextEditor\"\n * );\n *\n * return (\n * <Suspense fallback={<div>Загрузка...</div>}>\n * <TextEditor />\n * </Suspense>\n * );\n * };\n * ```\n *\n * @param importFn - функция, которая возвращает промис, который резолвится в объект с компонентами\n * @param componentName - имя компонента, который нужно загрузить\n * @returns\n */\nconst useLazyComponent = <TProps extends object>(\n\timportFn: () => Promise<Record<string, ComponentType<TProps>> | null>,\n\tcomponentName: string,\n\tcacheKey?: string\n) => {\n\treturn useMemo(() => createLazyComponent(importFn, componentName, cacheKey), [cacheKey, importFn, componentName]);\n};\n\nexport { useLazyComponent };\n","import { useEffect, useRef } from \"react\";\n\nexport function useReferenceTrace<T>(name: string, value: T) {\n\tconst previousRef = useRef(value);\n\n\tuseEffect(() => {\n\t\tif (!__DEV__) return;\n\n\t\tconst referenceChanged = !Object.is(previousRef.current, value);\n\n\t\tconsole.debug(`[render trace] ${name}`, { referenceChanged, previous: previousRef.current, current: value });\n\n\t\tpreviousRef.current = value;\n\t});\n}\n","import { useLocation } from \"@tanstack/react-router\";\n\nimport { SearchParams } from \"./types\";\n\nexport function useSearchLink<K extends PropertyKey>() {\n\tconst location = useLocation();\n\n\tconst buildLink = (params: SearchParams<K>) => {\n\t\tconst next = new URLSearchParams(location.searchStr);\n\n\t\tparams = params || [];\n\n\t\tfor (const param in params) {\n\t\t\tconst value = params[param];\n\n\t\t\tif (value) {\n\t\t\t\tnext.set(param, String(value));\n\t\t\t} else {\n\t\t\t\tnext.delete(param);\n\t\t\t}\n\t\t}\n\n\t\tconst searchString = next.toString();\n\t\treturn `${location.pathname}${searchString ? `?${searchString}` : \"\"}${location.hash}`;\n\t};\n\n\treturn { buildLink };\n}\n","import { useMemo } from \"react\";\n\nimport { AnyRouter, useNavigate, useSearch } from \"@tanstack/react-router\";\n\nimport { SearchParams, SearchParamsUpdater } from \"./types\";\n\nexport function useSearchParams<K extends PropertyKey>(allowedKeys?: (keyof K)[]) {\n\tconst params = useSearch<AnyRouter, string, false, true, SearchParams<K>>({ strict: false });\n\tconst navigate = useNavigate();\n\n\t// Фильтруем параметры, оставляя только разрешенные ключи\n\tconst filteredParams = useMemo(() => {\n\t\tif (!allowedKeys) return params;\n\n\t\treturn Object.fromEntries(Object.entries(params).filter(([key]) => allowedKeys.includes(key as keyof K))) as SearchParams<K>;\n\t}, [params, allowedKeys]);\n\n\tconst setParams = (next: SearchParamsUpdater<K>) =>\n\t\tnavigate({\n\t\t\tto: \".\",\n\t\t\tsearch: (prev: SearchParams<K>) => ({\n\t\t\t\t...prev,\n\t\t\t\t...next\n\t\t\t}),\n\t\t\treplace: true\n\t\t});\n\n\treturn { params, setParams, filteredParams };\n}\n","import { useCallback, useEffect, useRef } from \"react\";\n\nexport type ThrottledCallback<T> = {\n\t/**\n\t * Основной вход: вызывай на каждом частом событии (например, onNodesChange).\n\t * Колбэк `cb` будет вызываться не чаще, чем 1 раз в `intervalMs`.\n\t *\n\t * Стратегия: last-write-wins — если за интервал пришло много значений,\n\t * по окончании интервала будет применено последнее.\n\t */\n\tcall: (arg: T) => void;\n\n\t/**\n\t * Немедленно применить последнее накопленное значение (если оно есть),\n\t * отменив запланированный вызов (если он был).\n\t * Полезно на:\n\t * - pointerup/mouseup (конец перетаскивания)\n\t * - blur/visibilitychange/beforeunload\n\t * - unmount (если хочешь гарантированно сохранить финальное состояние)\n\t */\n\tflush: () => void;\n\n\t/**\n\t * Отменить запланированный вызов и забыть накопленное значение.\n\t * Полезно, если ты переключаешь редактор/граф и не хочешь “долетов” старых данных.\n\t */\n\tcancel: () => void;\n};\n\n/**\n * useThrottledCallback (React 19 safe)\n *\n * Проблема:\n * - В xyflow onNodesChange/onEdgesChange может сыпаться очень часто.\n * - Если каждый раз писать “сериализуемый снапшот” в zustand → лишние ререндеры/CPU/GC.\n *\n * Решение:\n * - throttle: вызывать cb не чаще, чем 1 раз в intervalMs.\n * - last-write-wins: если за интервал пришло 50 обновлений — применим последнее.\n *\n * React 19 нюанс:\n * - нельзя мутировать ref.current во время render (линтер/правило).\n * - поэтому cbRef обновляем в useEffect.\n */\nexport function useThrottledCallback<T>(\n\tcb: (arg: T) => void,\n\tintervalMs: number,\n\toptions?: { flushOnUnmount?: boolean }\n): ThrottledCallback<T> {\n\t/**\n\t * Актуальная версия cb (обновляется только после commit’а).\n\t * Это решает \"stale closure\": call/flush/cancel стабильны,\n\t * но всегда дергают самый свежий cb.\n\t */\n\tconst cbRef = useRef<(arg: T) => void>(cb);\n\n\tuseEffect(() => {\n\t\tcbRef.current = cb;\n\t}, [cb]);\n\n\t/**\n\t * Таймер отложенного выполнения.\n\t * Он нужен, когда call() пришёл раньше, чем завершился текущий throttle-интервал:\n\t * мы планируем “выполнить в конце окна”.\n\t */\n\tconst tRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n\t/**\n\t * Накопленное “последнее значение”.\n\t * Всегда хранится последний arg, пришедший через call().\n\t */\n\tconst lastRef = useRef<T | null>(null);\n\n\t/**\n\t * Время (timestamp) последнего РЕАЛЬНОГО вызова cb.\n\t * Нужно, чтобы вычислять: можно ли выполнить сейчас или нужно подождать.\n\t */\n\tconst lastInvokeTsRef = useRef<number>(0);\n\n\t/**\n\t * cancel():\n\t * - отменяем отложенный таймер,\n\t * - забываем накопленное значение.\n\t * Важно: это не вызывает cb.\n\t */\n\tconst cancel = useCallback(() => {\n\t\tif (tRef.current) {\n\t\t\tclearTimeout(tRef.current);\n\t\t\ttRef.current = null;\n\t\t}\n\t\tlastRef.current = null;\n\t}, []);\n\n\t/**\n\t * flush():\n\t * - если есть накопленное значение, вызываем cb немедленно,\n\t * - чистим таймер,\n\t * - фиксируем lastInvokeTsRef (чтобы окно throttle считалось от flush тоже).\n\t */\n\tconst flush = useCallback(() => {\n\t\tconst v = lastRef.current;\n\t\tif (v === null) return;\n\n\t\t// Сбрасываем накопленное ДО вызова cb на случай,\n\t\t// если cb внутри синхронно вызовет call() снова.\n\t\tlastRef.current = null;\n\n\t\tif (tRef.current) {\n\t\t\tclearTimeout(tRef.current);\n\t\t\ttRef.current = null;\n\t\t}\n\n\t\tlastInvokeTsRef.current = Date.now();\n\t\tcbRef.current(v);\n\t}, []);\n\n\t/**\n\t * call(arg):\n\t * 1) сохраняем arg как последнее значение (last-write-wins)\n\t * 2) если с момента последнего вызова прошло достаточно времени → вызываем сразу\n\t * 3) иначе — планируем flush ровно в момент, когда throttle-окно закончится\n\t *\n\t * При этом мы гарантируем:\n\t * - не более одного cb вызова за intervalMs\n\t * - и что “последнее значение за интервал” будет применено в конце.\n\t */\n\tconst call = useCallback(\n\t\t(arg: T) => {\n\t\t\tlastRef.current = arg;\n\n\t\t\tconst now = Date.now();\n\t\t\tconst elapsed = now - lastInvokeTsRef.current;\n\n\t\t\t// Если окно уже прошло — можно выполнить немедленно.\n\t\t\tif (elapsed >= intervalMs) {\n\t\t\t\t// Немедленный вызов = “leading edge”.\n\t\t\t\t// Берём последнее значение, очищаем lastRef и вызываем cb.\n\t\t\t\tconst v = lastRef.current;\n\t\t\t\tlastRef.current = null;\n\n\t\t\t\t// На всякий случай прибираем таймер, если он был.\n\t\t\t\tif (tRef.current) {\n\t\t\t\t\tclearTimeout(tRef.current);\n\t\t\t\t\ttRef.current = null;\n\t\t\t\t}\n\n\t\t\t\tlastInvokeTsRef.current = now;\n\t\t\t\tif (v !== null) cbRef.current(v);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Иначе — “trailing edge”: планируем выполнение в конце окна.\n\t\t\t// Важно: если таймер уже запланирован — НЕ пересоздаём,\n\t\t\t// потому что trailing-вызов должен случиться в конкретный момент (конец окна),\n\t\t\t// а значение мы и так обновляем через lastRef.current.\n\t\t\tif (!tRef.current) {\n\t\t\t\tconst wait = intervalMs - elapsed;\n\n\t\t\t\ttRef.current = setTimeout(() => {\n\t\t\t\t\ttRef.current = null;\n\t\t\t\t\t// В конце окна применяем последнее накопленное значение\n\t\t\t\t\tflush();\n\t\t\t\t}, wait);\n\t\t\t}\n\t\t},\n\t\t[intervalMs, flush]\n\t);\n\n\t/**\n\t * Cleanup на unmount:\n\t * - по умолчанию cancel (не делаем побочных эффектов при размонтировании)\n\t * - при flushOnUnmount=true — пытаемся сохранить последнее значение.\n\t *\n\t * Для твоего кейса (сериализация финального snapshot) чаще полезно flushOnUnmount=true.\n\t */\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tif (options?.flushOnUnmount) flush();\n\t\t\telse cancel();\n\t\t};\n\t}, [cancel, flush, options?.flushOnUnmount]);\n\n\treturn { call, flush, cancel };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/hooks/useBlockBrowserZoom.ts","../../src/hooks/useDebounce.ts","../../src/hooks/useDebounceCallback.ts","../../src/hooks/useDndSortableSensors.ts","../../src/hooks/useFloatingListbox.ts","../../src/hooks/useLazyComponent.ts","../../src/hooks/useReferenceTrace.ts","../../src/hooks/useSearchLink.ts","../../src/hooks/useSearchParams.ts","../../src/hooks/useThrottledCallback.ts"],"sourcesContent":["import { useEffect } from \"react\";\n\nconst WHEEL_EVENT = \"wheel\";\n\n/**\n * Глобально отключает браузерный zoom (ctrl+wheel).\n *\n * @param enabled если true — блокируем нативный зум страницы\n */\nexport function useBlockBrowserZoom(enabled: boolean) {\n\tuseEffect(() => {\n\t\tif (!enabled) return;\n\n\t\tconst handler = (e: WheelEvent) => {\n\t\t\tif (e.ctrlKey) {\n\t\t\t\te.preventDefault();\n\t\t\t}\n\t\t};\n\n\t\twindow.addEventListener(WHEEL_EVENT, handler, { passive: false });\n\t\treturn () => window.removeEventListener(WHEEL_EVENT, handler);\n\t}, [enabled]);\n}\n","import { useEffect, useState } from \"react\";\n\nexport function useDebounce<T>(value: T, delay: number): T {\n\tconst [debouncedValue, setDebouncedValue] = useState<T>(value);\n\n\tuseEffect(() => {\n\t\tconst timeoutId = setTimeout(() => {\n\t\t\tsetDebouncedValue(value);\n\t\t}, delay);\n\n\t\treturn () => clearTimeout(timeoutId);\n\t}, [value, delay]);\n\n\treturn debouncedValue;\n}\n","import { useCallback, useEffect, useRef } from \"react\";\n\n/**\n * Дебаунсит вызов колбэка: частые вызовы `call(value)` не вызывают `cb` сразу,\n * а откладывают его на `delayMs` после последнего вызова.\n *\n * Важно:\n * - Всегда сохраняется *последнее* значение (last-write-wins).\n * - `flush()` немедленно вызывает cb с последним сохранённым значением (если оно есть).\n * - `cancel()` отменяет таймер и забывает последнее значение.\n * - На unmount автоматически вызывается `cancel()` чтобы не было setState после размонтирования.\n *\n * Типовой кейс:\n * - onNodesChange -> call(snapshot)\n * - pointerup / blur / unmount -> flush() (или cancel(), если не надо сохранять)\n */\nexport function useDebouncedCallback<T>(cb: (arg: T) => void, delayMs: number, options?: { flushOnUnmount?: boolean }) {\n\t/**\n\t * Храним актуальную версию cb в ref, чтобы:\n\t * - не пересоздавать дебаунсер при каждом рендере,\n\t * - не ловить устаревший замыканием cb (stale closure),\n\t * - при этом всегда вызывать самую свежую функцию.\n\t */\n\tconst cbRef = useRef<(arg: T) => void>(cb);\n\n\t/**\n\t * Обновляем актуальную версию cb после commit'а\n\t */\n\tuseEffect(() => {\n\t\tcbRef.current = cb;\n\t}, [cb]);\n\n\t/**\n\t * id таймера. null означает что таймер не активен.\n\t */\n\tconst tRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n\t/**\n\t * Последнее значение, которое мы хотим \"закоммитить\" в cb.\n\t * Используем стратегию last-write-wins.\n\t */\n\tconst lastRef = useRef<T | null>(null);\n\n\t/**\n\t * cancel():\n\t * - останавливаем таймер, если он был,\n\t * - очищаем последнее значение (ничего не будет вызвано).\n\t */\n\tconst cancel = useCallback(() => {\n\t\tif (tRef.current) {\n\t\t\tclearTimeout(tRef.current);\n\t\t\ttRef.current = null;\n\t\t}\n\t\tlastRef.current = null;\n\t}, []);\n\n\t/**\n\t * flush():\n\t * - если есть отложенное значение, вызываем cb немедленно,\n\t * - сбрасываем таймер и lastRef.\n\t *\n\t * Используется, когда нужно гарантированно сохранить \"последнее\" прямо сейчас:\n\t * - unmount\n\t * - visibilitychange/blur\n\t * - pointerup/mouseup (конец взаимодействия)\n\t */\n\tconst flush = useCallback(() => {\n\t\tconst v = lastRef.current;\n\t\tif (v === null) return;\n\n\t\t// Сбрасываем before-call, чтобы если cb вызовет call() рекурсивно,\n\t\t// мы не держали старое значение.\n\t\tlastRef.current = null;\n\n\t\tif (tRef.current) {\n\t\t\tclearTimeout(tRef.current);\n\t\t\ttRef.current = null;\n\t\t}\n\n\t\tcbRef.current(v);\n\t}, []);\n\n\t/**\n\t * call(arg):\n\t * - сохраняем arg как \"последнее значение\"\n\t * - перезапускаем таймер\n\t * - по истечении delayMs вызываем flush()\n\t */\n\tconst call = useCallback(\n\t\t(arg: T) => {\n\t\t\tlastRef.current = arg;\n\n\t\t\t// Перезапуск таймера -> классический debounce\n\t\t\tif (tRef.current) clearTimeout(tRef.current);\n\n\t\t\ttRef.current = setTimeout(() => {\n\t\t\t\ttRef.current = null;\n\t\t\t\tflush();\n\t\t\t}, delayMs);\n\t\t},\n\t\t[delayMs, flush]\n\t);\n\n\t/**\n\t * Авто-cancel на unmount:\n\t * - убирает pending timeout\n\t * - предотвращает вызовы cb после размонтирования компонента\n\t */\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tif (options?.flushOnUnmount) {\n\t\t\t\tflush();\n\t\t\t} else {\n\t\t\t\tcancel();\n\t\t\t}\n\t\t};\n\t}, [cancel, flush, options?.flushOnUnmount]);\n\n\treturn { call, flush, cancel };\n}\n","import {\n\tKeyboardSensor,\n\tMouseSensor,\n\tPointerSensor,\n\tTouchSensor,\n\tuseSensor,\n\tuseSensors,\n\ttype KeyboardCodes,\n\ttype KeyboardCoordinateGetter\n} from \"@dnd-kit/core\";\nimport { sortableKeyboardCoordinates } from \"@dnd-kit/sortable\";\n\nconst DEFAULT_SORTABLE_ACTIVATION_DISTANCE = 6;\n\nexport interface UseDndSortableSensorsOptions {\n\tactivationDistance?: number;\n\t/**\n\t * Отдельная touch-конфигурация сохраняет нативную прокрутку до long press.\n\t * Без неё hook продолжает использовать единый PointerSensor.\n\t */\n\ttouchActivation?: {\n\t\treadonly delay: number;\n\t\treadonly tolerance?: number;\n\t};\n\t/** Позволяет предметной матрице выбирать только допустимые координаты вместо порядка sortable-list. */\n\tkeyboardCoordinateGetter?: KeyboardCoordinateGetter;\n\t/** Переопределяет клавиши начала/завершения, когда Enter занят primary action компонента. */\n\tkeyboardCodes?: KeyboardCodes;\n}\n\n/**\n * Стандартная конфигурация DnD-сенсоров для сортируемых списков и матриц.\n *\n * Зачем: исключить дублирование одинаковой настройки PointerSensor + KeyboardSensor\n * в каждом хуке персонализации (колонки, сортировки, группировки).\n *\n * @param distanceOrOptions — минимальное смещение указателя или расширенные настройки mouse/touch/keyboard.\n */\nexport function useDndSortableSensors(distanceOrOptions: number | UseDndSortableSensorsOptions = DEFAULT_SORTABLE_ACTIVATION_DISTANCE) {\n\tconst options = typeof distanceOrOptions === \"number\" ? { activationDistance: distanceOrOptions } : distanceOrOptions;\n\tconst distance = options.activationDistance ?? DEFAULT_SORTABLE_ACTIVATION_DISTANCE;\n\tconst pointerSensor = useSensor(PointerSensor, { activationConstraint: { distance } });\n\tconst mouseSensor = useSensor(MouseSensor, { activationConstraint: { distance } });\n\tconst touchSensor = useSensor(TouchSensor, {\n\t\tactivationConstraint: {\n\t\t\tdelay: options.touchActivation?.delay ?? 0,\n\t\t\ttolerance: options.touchActivation?.tolerance ?? distance\n\t\t}\n\t});\n\tconst keyboardSensor = useSensor(KeyboardSensor, {\n\t\tcoordinateGetter: options.keyboardCoordinateGetter ?? sortableKeyboardCoordinates,\n\t\tkeyboardCodes: options.keyboardCodes\n\t});\n\n\treturn useSensors(\n\t\toptions.touchActivation ? mouseSensor : pointerSensor,\n\t\toptions.touchActivation ? touchSensor : undefined,\n\t\tkeyboardSensor\n\t);\n}\n","import { type KeyboardEvent, useEffect, useLayoutEffect, useRef, useState } from \"react\";\n\nimport {\n\tautoPlacement,\n\tautoUpdate,\n\tflip,\n\toffset,\n\ttype Placement,\n\tshift,\n\tsize as floatingSize,\n\tuseDismiss,\n\tuseFloating,\n\ttype UseFloatingReturn,\n\tuseInteractions,\n\ttype UseInteractionsReturn,\n\tuseRole\n} from \"@floating-ui/react\";\n\nimport { findFirstEnabledIndex, findLastEnabledIndex, findNextEnabledIndex, handleKeyboardActivation } from \"../utils\";\nimport {\n\tKEYBOARD_KEY_ARROW_DOWN,\n\tKEYBOARD_KEY_ARROW_UP,\n\tKEYBOARD_KEY_HOME,\n\tKEYBOARD_KEY_END,\n\tKEYBOARD_KEY_ESCAPE,\n\tKEYBOARD_KEY_TAB\n} from \"../utils/keyboardConstants\";\n\n// Общие стратегии размещения и параметры middleware не зависят от текущих options.\nconst FLOATING_LISTBOX_PLACEMENT_FLIP = \"flip\";\nconst FLOATING_LISTBOX_PLACEMENT_AUTO = \"auto\";\nconst FLOATING_LISTBOX_DEFAULT_PLACEMENT = \"bottom-start\";\nconst FLOATING_LISTBOX_VIEWPORT_PADDING = 8;\nconst FLOATING_LISTBOX_REFERENCE_OFFSET = 4;\nconst FLOATING_LISTBOX_MIN_HEIGHT = 120;\n\n/** Геометрия, которую Floating UI вычислил для доступной стороны listbox. */\nexport type FloatingListboxSizeContext = {\n\tavailableWidth: number;\n\tavailableHeight: number;\n\tviewportWidth: number;\n\tviewportHeight: number;\n\treferenceWidth: number;\n\treferenceHeight: number;\n};\n\n/**\n * Размеры floating-элемента и CSS custom properties, которые специализированный\n * picker может вычислить из доступного viewport без собственного middleware.\n */\nexport type FloatingListboxSizeStyle = {\n\twidth?: string;\n\tminWidth?: string;\n\tmaxWidth?: string;\n\tmaxHeight?: string;\n} & {\n\t[customProperty: `--${string}`]: string | undefined;\n};\n\nexport type FloatingListboxSizeResolver = (context: FloatingListboxSizeContext) => FloatingListboxSizeStyle;\n\n/** Стратегия выбора стороны для floating-элемента относительно reference. */\nexport type FloatingListboxPlacementStrategy = typeof FLOATING_LISTBOX_PLACEMENT_FLIP | typeof FLOATING_LISTBOX_PLACEMENT_AUTO;\n\ntype FloatingListboxStandardSizeProperty = \"width\" | \"minWidth\" | \"maxWidth\" | \"maxHeight\";\n\ntype FloatingListboxAppliedSizeState = {\n\tcustomProperties: Set<`--${string}`>;\n\tstandardProperties: Map<FloatingListboxStandardSizeProperty, string>;\n};\n\n/** Хранит свойства и их исходные значения до императивного применения resolver. */\nconst floatingListboxAppliedSizeState = new WeakMap<HTMLElement, FloatingListboxAppliedSizeState>();\n\n/** Хранит актуальный resolver отдельно от callback, который Floating UI может переиспользовать. */\nconst floatingListboxSizeResolvers = new WeakMap<object, FloatingListboxSizeResolver>();\n\n/** Полный набор выровненных сторон для поиска наиболее просторного положения. */\nconst FLOATING_LISTBOX_AUTO_PLACEMENTS: Placement[] = [\n\tFLOATING_LISTBOX_DEFAULT_PLACEMENT,\n\t\"bottom-end\",\n\t\"top-start\",\n\t\"top-end\",\n\t\"left-start\",\n\t\"left-end\",\n\t\"right-start\",\n\t\"right-end\"\n];\n\ninterface UseFloatingListboxParams<T> {\n\toptions: readonly T[];\n\tselectedIndex: number;\n\topen?: boolean;\n\tonOpenChange?: (open: boolean) => void;\n\tgetOptionDisabled?: (option: T) => boolean;\n\tonSelect?: (option: T) => void;\n\tdisabled?: boolean;\n\tplacement?: Placement;\n\t/** `auto` сравнивает свободное место сверху, снизу, слева и справа. */\n\tplacementStrategy?: FloatingListboxPlacementStrategy;\n\tcloseOnSelect?: boolean;\n\tfocusFloatingOnOpen?: boolean;\n\tallowOpenWithoutOptions?: boolean;\n\trestoreFocusOnClose?: boolean;\n\tresolveFloatingSize?: FloatingListboxSizeResolver;\n}\n\n/**\n * Форма результата использует публичные типы Floating UI: декларации пакета не\n * должны раскрывать пути его транзитивных зависимостей в конкретной установке.\n */\ntype UseFloatingListboxResult<T> = Pick<UseFloatingReturn, \"refs\" | \"context\" | \"floatingStyles\"> &\n\tPick<UseInteractionsReturn, \"getFloatingProps\"> & {\n\t\topen: boolean;\n\t\tsetOpen: (open: boolean) => void;\n\t\tactiveIndex: number;\n\t\tsetReference: UseFloatingReturn[\"refs\"][\"setReference\"];\n\t\tsetFloating: UseFloatingReturn[\"refs\"][\"setFloating\"];\n\t\tsetOptionRef: (index: number, node: HTMLElement | null) => void;\n\t\tclose: () => void;\n\t\topenList: () => void;\n\t\topenWithIndex: (nextIndex: number) => void;\n\t\ttoggleOpen: () => void;\n\t\tselectOption: (option: T) => void;\n\t\tselectActiveOption: () => void;\n\t\thandleReferenceKeyDown: (event: KeyboardEvent<HTMLElement>) => void;\n\t\thandleFloatingKeyDown: (event: KeyboardEvent<HTMLElement>) => void;\n\t\tgetOptionId: (listId: string, index: number) => string;\n\t\tgetActiveOptionId: (listId: string) => string | undefined;\n\t};\n\nexport function useFloatingListbox<T>({\n\toptions,\n\tselectedIndex,\n\topen,\n\tonOpenChange,\n\tgetOptionDisabled,\n\tonSelect,\n\tdisabled,\n\tplacement = FLOATING_LISTBOX_DEFAULT_PLACEMENT,\n\tplacementStrategy = FLOATING_LISTBOX_PLACEMENT_FLIP,\n\tcloseOnSelect = true,\n\tfocusFloatingOnOpen = true,\n\tallowOpenWithoutOptions = false,\n\trestoreFocusOnClose = true,\n\tresolveFloatingSize\n}: UseFloatingListboxParams<T>): UseFloatingListboxResult<T> {\n\tconst optionRefs = useRef<Array<HTMLElement | null>>([]);\n\tconst [internalOpen, setInternalOpen] = useState(false);\n\tconst resolvedOpen = open ?? internalOpen;\n\tconst setResolvedOpen = onOpenChange ?? setInternalOpen;\n\tconst [currentActiveIndex, setActiveIndex] = useState(\n\t\tselectedIndex >= 0 ? selectedIndex : findFirstEnabledIndex(options, getOptionDisabled)\n\t);\n\tconst [floatingSizeResolverOwner] = useState<object>(() => ({}));\n\n\t/**\n\t * Поддерживает активный индекс в валидном состоянии при изменении набора опций\n\t * или выбранного элемента, чтобы `aria-activedescendant` всегда ссылался на\n\t * существующую и доступную опцию.\n\t */\n\tconst resolveActiveIndex = (activeIndex: number) => {\n\t\tif (options.length === 0) {\n\t\t\treturn -1;\n\t\t}\n\n\t\tif (activeIndex >= 0 && activeIndex < options.length && !getOptionDisabled?.(options[activeIndex])) {\n\t\t\treturn activeIndex;\n\t\t}\n\n\t\tif (selectedIndex >= 0 && selectedIndex < options.length && !getOptionDisabled?.(options[selectedIndex])) {\n\t\t\treturn selectedIndex;\n\t\t}\n\n\t\treturn findFirstEnabledIndex(options, getOptionDisabled);\n\t};\n\tconst activeIndex = resolveActiveIndex(currentActiveIndex);\n\tconst placementMiddleware =\n\t\tplacementStrategy === FLOATING_LISTBOX_PLACEMENT_AUTO\n\t\t\t? autoPlacement({\n\t\t\t\t\tallowedPlacements: FLOATING_LISTBOX_AUTO_PLACEMENTS,\n\t\t\t\t\t/*\n\t\t\t\t\t * Свободную сторону сравниваем по main axis. Варианты start/end при\n\t\t\t\t\t * этом всё равно исключаются autoPlacement, если не помещаются по\n\t\t\t\t\t * cross axis.\n\t\t\t\t\t */\n\t\t\t\t\tcrossAxis: false,\n\t\t\t\t\tpadding: FLOATING_LISTBOX_VIEWPORT_PADDING\n\t\t\t\t})\n\t\t\t: flip({ padding: FLOATING_LISTBOX_VIEWPORT_PADDING });\n\n\tconst { refs, floatingStyles, context, update } = useFloating({\n\t\topen: resolvedOpen,\n\t\tonOpenChange: setResolvedOpen,\n\t\tplacement,\n\t\ttransform: false,\n\t\tstrategy: \"fixed\",\n\t\tmiddleware: [\n\t\t\toffset(FLOATING_LISTBOX_REFERENCE_OFFSET),\n\t\t\tplacementMiddleware,\n\t\t\tshift({ padding: FLOATING_LISTBOX_VIEWPORT_PADDING }),\n\t\t\tfloatingSize({\n\t\t\t\tpadding: FLOATING_LISTBOX_VIEWPORT_PADDING,\n\t\t\t\tapply({ availableWidth, availableHeight, rects, elements }) {\n\t\t\t\t\tconst viewport = elements.floating.ownerDocument.documentElement;\n\t\t\t\t\tconst floatingStyle = elements.floating.style;\n\t\t\t\t\tconst resolvedSize = floatingListboxSizeResolvers.get(floatingSizeResolverOwner)?.({\n\t\t\t\t\t\tavailableWidth,\n\t\t\t\t\t\tavailableHeight,\n\t\t\t\t\t\tviewportWidth: viewport.clientWidth,\n\t\t\t\t\t\tviewportHeight: viewport.clientHeight,\n\t\t\t\t\t\treferenceWidth: rects.reference.width,\n\t\t\t\t\t\treferenceHeight: rects.reference.height\n\t\t\t\t\t});\n\n\t\t\t\t\t/*\n\t\t\t\t\t * Сначала сбрасываем размеры предыдущего resolver: Floating UI сохраняет\n\t\t\t\t\t * один DOM-узел между режимами, поэтому старые width и CSS-переменные\n\t\t\t\t\t * иначе продолжат влиять на следующий вариант отображения.\n\t\t\t\t\t */\n\t\t\t\t\tconst previousAppliedState = floatingListboxAppliedSizeState.get(elements.floating);\n\t\t\t\t\tfor (const property of previousAppliedState?.customProperties ?? []) {\n\t\t\t\t\t\tfloatingStyle.removeProperty(property);\n\t\t\t\t\t}\n\t\t\t\t\tfor (const [property, previousValue] of previousAppliedState?.standardProperties ?? []) {\n\t\t\t\t\t\tfloatingStyle[property] = previousValue;\n\t\t\t\t\t}\n\n\t\t\t\t\tfloatingStyle.minWidth = `${rects.reference.width}px`;\n\t\t\t\t\tfloatingStyle.maxHeight = `${Math.max(availableHeight, FLOATING_LISTBOX_MIN_HEIGHT)}px`;\n\n\t\t\t\t\tconst nextCustomProperties = new Set<`--${string}`>();\n\t\t\t\t\tconst nextStandardProperties = new Map<FloatingListboxStandardSizeProperty, string>();\n\t\t\t\t\tfor (const [property, value] of Object.entries(resolvedSize ?? {})) {\n\t\t\t\t\t\tif (property.startsWith(\"--\")) {\n\t\t\t\t\t\t\tconst customProperty = property as `--${string}`;\n\t\t\t\t\t\t\tif (value !== undefined) {\n\t\t\t\t\t\t\t\tfloatingStyle.setProperty(customProperty, value);\n\t\t\t\t\t\t\t\tnextCustomProperties.add(customProperty);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (value !== undefined) {\n\t\t\t\t\t\t\tconst standardProperty = property as FloatingListboxStandardSizeProperty;\n\t\t\t\t\t\t\tnextStandardProperties.set(standardProperty, floatingStyle[standardProperty]);\n\t\t\t\t\t\t\tfloatingStyle[standardProperty] = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tfloatingListboxAppliedSizeState.set(elements.floating, {\n\t\t\t\t\t\tcustomProperties: nextCustomProperties,\n\t\t\t\t\t\tstandardProperties: nextStandardProperties\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t})\n\t\t],\n\t\twhileElementsMounted: autoUpdate\n\t});\n\tconst hasFloatingSizeResolver = resolveFloatingSize !== undefined;\n\n\t/*\n\t * Floating UI сравнивает middleware структурно и может сохранить первый\n\t * size.apply. WeakMap позволяет этому callback читать актуальный resolver после\n\t * загрузки OData-узлов, не пересоздавая конкурирующие middleware.\n\t */\n\tuseLayoutEffect(() => {\n\t\tif (resolveFloatingSize) {\n\t\t\tfloatingListboxSizeResolvers.set(floatingSizeResolverOwner, resolveFloatingSize);\n\t\t} else {\n\t\t\tfloatingListboxSizeResolvers.delete(floatingSizeResolverOwner);\n\t\t}\n\n\t\treturn () => {\n\t\t\tfloatingListboxSizeResolvers.delete(floatingSizeResolverOwner);\n\t\t};\n\t}, [floatingSizeResolverOwner, resolveFloatingSize]);\n\n\t/**\n\t * Асинхронно загруженные или отфильтрованные опции могут не изменить внешний\n\t * rect popup: grid с прежним числом строк остаётся того же размера. Явный\n\t * update повторно запускает placement и size middleware после commit списка.\n\t */\n\tuseLayoutEffect(() => {\n\t\tif (!resolvedOpen || !hasFloatingSizeResolver) {\n\t\t\treturn;\n\t\t}\n\n\t\tvoid update();\n\t}, [hasFloatingSizeResolver, options.length, resolvedOpen, update]);\n\n\tconst dismiss = useDismiss(context);\n\tconst role = useRole(context, { role: \"listbox\" });\n\tconst { getFloatingProps } = useInteractions([dismiss, role]);\n\n\tconst canOpen = allowOpenWithoutOptions || options.length > 0;\n\n\tuseEffect(() => {\n\t\tif (!resolvedOpen || activeIndex < 0) {\n\t\t\treturn;\n\t\t}\n\n\t\toptionRefs.current[activeIndex]?.scrollIntoView({ block: \"nearest\" });\n\t}, [activeIndex, resolvedOpen]);\n\n\tuseEffect(() => {\n\t\tif (!resolvedOpen || !focusFloatingOnOpen) {\n\t\t\treturn;\n\t\t}\n\n\t\trequestAnimationFrame(() => {\n\t\t\trefs.floating.current?.focus();\n\t\t});\n\t}, [focusFloatingOnOpen, resolvedOpen, refs]);\n\n\tconst close = () => {\n\t\tsetResolvedOpen(false);\n\n\t\tif (restoreFocusOnClose) {\n\t\t\tconst referenceElement = refs.domReference.current;\n\t\t\tif (referenceElement instanceof HTMLElement) {\n\t\t\t\treferenceElement.focus();\n\t\t\t}\n\t\t}\n\t};\n\n\tconst openWithIndex = (nextIndex: number) => {\n\t\tif (disabled || !canOpen) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (options.length > 0) {\n\t\t\tsetActiveIndex(resolveActiveIndex(nextIndex));\n\t\t}\n\n\t\tsetResolvedOpen(true);\n\t};\n\n\tconst openList = () => {\n\t\topenWithIndex(selectedIndex >= 0 ? selectedIndex : findFirstEnabledIndex(options, getOptionDisabled));\n\t};\n\n\tconst toggleOpen = () => {\n\t\tif (resolvedOpen) {\n\t\t\tclose();\n\t\t\treturn;\n\t\t}\n\n\t\topenList();\n\t};\n\n\tconst selectOption = (option: T) => {\n\t\tif (getOptionDisabled?.(option)) {\n\t\t\treturn;\n\t\t}\n\n\t\tonSelect?.(option);\n\n\t\tif (closeOnSelect) {\n\t\t\tclose();\n\t\t}\n\t};\n\n\tconst selectActiveOption = () => {\n\t\tif (activeIndex < 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst activeOption = options[activeIndex];\n\t\tif (activeOption !== undefined) {\n\t\t\tselectOption(activeOption);\n\t\t}\n\t};\n\n\tconst moveActiveToFirst = () => {\n\t\tsetActiveIndex(findFirstEnabledIndex(options, getOptionDisabled));\n\t};\n\n\tconst moveActiveToLast = () => {\n\t\tsetActiveIndex(findLastEnabledIndex(options, getOptionDisabled));\n\t};\n\n\tconst handleReferenceKeyDown = (event: React.KeyboardEvent<HTMLElement>) => {\n\t\tif (disabled) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.key === KEYBOARD_KEY_ARROW_DOWN) {\n\t\t\tevent.preventDefault();\n\n\t\t\tif (!resolvedOpen) {\n\t\t\t\topenWithIndex(selectedIndex >= 0 ? selectedIndex : findFirstEnabledIndex(options, getOptionDisabled));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsetActiveIndex((currentIndex) => findNextEnabledIndex(options, resolveActiveIndex(currentIndex), 1, getOptionDisabled));\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.key === KEYBOARD_KEY_ARROW_UP) {\n\t\t\tevent.preventDefault();\n\n\t\t\tif (!resolvedOpen) {\n\t\t\t\topenWithIndex(selectedIndex >= 0 ? selectedIndex : findLastEnabledIndex(options, getOptionDisabled));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsetActiveIndex((currentIndex) => findNextEnabledIndex(options, resolveActiveIndex(currentIndex), -1, getOptionDisabled));\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.key === KEYBOARD_KEY_HOME && resolvedOpen) {\n\t\t\tevent.preventDefault();\n\t\t\tmoveActiveToFirst();\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.key === KEYBOARD_KEY_END && resolvedOpen) {\n\t\t\tevent.preventDefault();\n\t\t\tmoveActiveToLast();\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.key === KEYBOARD_KEY_ESCAPE && resolvedOpen) {\n\t\t\tevent.preventDefault();\n\t\t\tclose();\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.key === KEYBOARD_KEY_TAB && resolvedOpen) {\n\t\t\tclose();\n\t\t}\n\t};\n\n\tconst handleFloatingKeyDown = (event: React.KeyboardEvent<HTMLElement>) => {\n\t\tif (event.target !== event.currentTarget) {\n\t\t\tif (event.key === KEYBOARD_KEY_ESCAPE) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tclose();\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.key === KEYBOARD_KEY_ARROW_DOWN) {\n\t\t\tevent.preventDefault();\n\t\t\tsetActiveIndex((currentIndex) => findNextEnabledIndex(options, resolveActiveIndex(currentIndex), 1, getOptionDisabled));\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.key === KEYBOARD_KEY_ARROW_UP) {\n\t\t\tevent.preventDefault();\n\t\t\tsetActiveIndex((currentIndex) => findNextEnabledIndex(options, resolveActiveIndex(currentIndex), -1, getOptionDisabled));\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.key === KEYBOARD_KEY_HOME) {\n\t\t\tevent.preventDefault();\n\t\t\tmoveActiveToFirst();\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.key === KEYBOARD_KEY_END) {\n\t\t\tevent.preventDefault();\n\t\t\tmoveActiveToLast();\n\t\t\treturn;\n\t\t}\n\n\t\tif (handleKeyboardActivation(event, selectActiveOption)) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.key === KEYBOARD_KEY_ESCAPE) {\n\t\t\tevent.preventDefault();\n\t\t\tclose();\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.key === KEYBOARD_KEY_TAB) {\n\t\t\tclose();\n\t\t}\n\t};\n\n\tconst getOptionId = (listId: string, index: number) => `${listId}-option-${index}`;\n\tconst getActiveOptionId = (listId: string) => (activeIndex >= 0 ? getOptionId(listId, activeIndex) : undefined);\n\n\treturn {\n\t\topen: resolvedOpen,\n\t\tsetOpen: setResolvedOpen,\n\t\tactiveIndex,\n\t\trefs,\n\t\tcontext,\n\t\tfloatingStyles,\n\t\tgetFloatingProps,\n\t\tsetReference: refs.setReference,\n\t\tsetFloating: refs.setFloating,\n\t\tsetOptionRef: (index: number, node: HTMLElement | null) => {\n\t\t\toptionRefs.current[index] = node;\n\t\t},\n\t\tclose,\n\t\topenList,\n\t\topenWithIndex,\n\t\ttoggleOpen,\n\t\tselectOption,\n\t\tselectActiveOption,\n\t\thandleReferenceKeyDown,\n\t\thandleFloatingKeyDown,\n\t\tgetOptionId,\n\t\tgetActiveOptionId\n\t};\n}\n","import { type ComponentType, useMemo } from \"react\";\n\nimport { createLazyComponent } from \"../utils/createLazyComponent\";\n\n/**\n * Хук для создания ленивой компоненты, которая будет загружена только при первом рендере.\n *\n * @example\n *\n * ```tsx\n * const MyComponent = () => {\n * const TextEditor = useLazyComponent(\n * () => import(\"@components/content/article/editor/TextEditor\"),\n * \"TextEditor\"\n * );\n *\n * return (\n * <Suspense fallback={<div>Загрузка...</div>}>\n * <TextEditor />\n * </Suspense>\n * );\n * };\n * ```\n *\n * @param importFn - функция, которая возвращает промис, который резолвится в объект с компонентами\n * @param componentName - имя компонента, который нужно загрузить\n * @returns\n */\nconst useLazyComponent = <TProps extends object>(\n\timportFn: () => Promise<Record<string, ComponentType<TProps>> | null>,\n\tcomponentName: string,\n\tcacheKey?: string\n) => {\n\treturn useMemo(() => createLazyComponent(importFn, componentName, cacheKey), [cacheKey, importFn, componentName]);\n};\n\nexport { useLazyComponent };\n","import { useEffect, useRef } from \"react\";\n\nexport function useReferenceTrace<T>(name: string, value: T) {\n\tconst previousRef = useRef(value);\n\n\tuseEffect(() => {\n\t\tif (!__DEV__) return;\n\n\t\tconst referenceChanged = !Object.is(previousRef.current, value);\n\n\t\tconsole.debug(`[render trace] ${name}`, { referenceChanged, previous: previousRef.current, current: value });\n\n\t\tpreviousRef.current = value;\n\t});\n}\n","import { useLocation } from \"@tanstack/react-router\";\n\nimport { SearchParams } from \"./types\";\n\nexport function useSearchLink<K extends PropertyKey>() {\n\tconst location = useLocation();\n\n\tconst buildLink = (params: SearchParams<K>) => {\n\t\tconst next = new URLSearchParams(location.searchStr);\n\n\t\tparams = params || [];\n\n\t\tfor (const param in params) {\n\t\t\tconst value = params[param];\n\n\t\t\tif (value) {\n\t\t\t\tnext.set(param, String(value));\n\t\t\t} else {\n\t\t\t\tnext.delete(param);\n\t\t\t}\n\t\t}\n\n\t\tconst searchString = next.toString();\n\t\treturn `${location.pathname}${searchString ? `?${searchString}` : \"\"}${location.hash}`;\n\t};\n\n\treturn { buildLink };\n}\n","import { useMemo } from \"react\";\n\nimport { AnyRouter, useNavigate, useSearch } from \"@tanstack/react-router\";\n\nimport { SearchParams, SearchParamsUpdater } from \"./types\";\n\nexport function useSearchParams<K extends PropertyKey>(allowedKeys?: (keyof K)[]) {\n\tconst params = useSearch<AnyRouter, string, false, true, SearchParams<K>>({ strict: false });\n\tconst navigate = useNavigate();\n\n\t// Фильтруем параметры, оставляя только разрешенные ключи\n\tconst filteredParams = useMemo(() => {\n\t\tif (!allowedKeys) return params;\n\n\t\treturn Object.fromEntries(Object.entries(params).filter(([key]) => allowedKeys.includes(key as keyof K))) as SearchParams<K>;\n\t}, [params, allowedKeys]);\n\n\tconst setParams = (next: SearchParamsUpdater<K>) =>\n\t\tnavigate({\n\t\t\tto: \".\",\n\t\t\tsearch: (prev: SearchParams<K>) => ({\n\t\t\t\t...prev,\n\t\t\t\t...next\n\t\t\t}),\n\t\t\treplace: true\n\t\t});\n\n\treturn { params, setParams, filteredParams };\n}\n","import { useCallback, useEffect, useRef } from \"react\";\n\nexport type ThrottledCallback<T> = {\n\t/**\n\t * Основной вход: вызывай на каждом частом событии (например, onNodesChange).\n\t * Колбэк `cb` будет вызываться не чаще, чем 1 раз в `intervalMs`.\n\t *\n\t * Стратегия: last-write-wins — если за интервал пришло много значений,\n\t * по окончании интервала будет применено последнее.\n\t */\n\tcall: (arg: T) => void;\n\n\t/**\n\t * Немедленно применить последнее накопленное значение (если оно есть),\n\t * отменив запланированный вызов (если он был).\n\t * Полезно на:\n\t * - pointerup/mouseup (конец перетаскивания)\n\t * - blur/visibilitychange/beforeunload\n\t * - unmount (если хочешь гарантированно сохранить финальное состояние)\n\t */\n\tflush: () => void;\n\n\t/**\n\t * Отменить запланированный вызов и забыть накопленное значение.\n\t * Полезно, если ты переключаешь редактор/граф и не хочешь “долетов” старых данных.\n\t */\n\tcancel: () => void;\n};\n\n/**\n * useThrottledCallback (React 19 safe)\n *\n * Проблема:\n * - В xyflow onNodesChange/onEdgesChange может сыпаться очень часто.\n * - Если каждый раз писать “сериализуемый снапшот” в zustand → лишние ререндеры/CPU/GC.\n *\n * Решение:\n * - throttle: вызывать cb не чаще, чем 1 раз в intervalMs.\n * - last-write-wins: если за интервал пришло 50 обновлений — применим последнее.\n *\n * React 19 нюанс:\n * - нельзя мутировать ref.current во время render (линтер/правило).\n * - поэтому cbRef обновляем в useEffect.\n */\nexport function useThrottledCallback<T>(\n\tcb: (arg: T) => void,\n\tintervalMs: number,\n\toptions?: { flushOnUnmount?: boolean }\n): ThrottledCallback<T> {\n\t/**\n\t * Актуальная версия cb (обновляется только после commit’а).\n\t * Это решает \"stale closure\": call/flush/cancel стабильны,\n\t * но всегда дергают самый свежий cb.\n\t */\n\tconst cbRef = useRef<(arg: T) => void>(cb);\n\n\tuseEffect(() => {\n\t\tcbRef.current = cb;\n\t}, [cb]);\n\n\t/**\n\t * Таймер отложенного выполнения.\n\t * Он нужен, когда call() пришёл раньше, чем завершился текущий throttle-интервал:\n\t * мы планируем “выполнить в конце окна”.\n\t */\n\tconst tRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n\t/**\n\t * Накопленное “последнее значение”.\n\t * Всегда хранится последний arg, пришедший через call().\n\t */\n\tconst lastRef = useRef<T | null>(null);\n\n\t/**\n\t * Время (timestamp) последнего РЕАЛЬНОГО вызова cb.\n\t * Нужно, чтобы вычислять: можно ли выполнить сейчас или нужно подождать.\n\t */\n\tconst lastInvokeTsRef = useRef<number>(0);\n\n\t/**\n\t * cancel():\n\t * - отменяем отложенный таймер,\n\t * - забываем накопленное значение.\n\t * Важно: это не вызывает cb.\n\t */\n\tconst cancel = useCallback(() => {\n\t\tif (tRef.current) {\n\t\t\tclearTimeout(tRef.current);\n\t\t\ttRef.current = null;\n\t\t}\n\t\tlastRef.current = null;\n\t}, []);\n\n\t/**\n\t * flush():\n\t * - если есть накопленное значение, вызываем cb немедленно,\n\t * - чистим таймер,\n\t * - фиксируем lastInvokeTsRef (чтобы окно throttle считалось от flush тоже).\n\t */\n\tconst flush = useCallback(() => {\n\t\tconst v = lastRef.current;\n\t\tif (v === null) return;\n\n\t\t// Сбрасываем накопленное ДО вызова cb на случай,\n\t\t// если cb внутри синхронно вызовет call() снова.\n\t\tlastRef.current = null;\n\n\t\tif (tRef.current) {\n\t\t\tclearTimeout(tRef.current);\n\t\t\ttRef.current = null;\n\t\t}\n\n\t\tlastInvokeTsRef.current = Date.now();\n\t\tcbRef.current(v);\n\t}, []);\n\n\t/**\n\t * call(arg):\n\t * 1) сохраняем arg как последнее значение (last-write-wins)\n\t * 2) если с момента последнего вызова прошло достаточно времени → вызываем сразу\n\t * 3) иначе — планируем flush ровно в момент, когда throttle-окно закончится\n\t *\n\t * При этом мы гарантируем:\n\t * - не более одного cb вызова за intervalMs\n\t * - и что “последнее значение за интервал” будет применено в конце.\n\t */\n\tconst call = useCallback(\n\t\t(arg: T) => {\n\t\t\tlastRef.current = arg;\n\n\t\t\tconst now = Date.now();\n\t\t\tconst elapsed = now - lastInvokeTsRef.current;\n\n\t\t\t// Если окно уже прошло — можно выполнить немедленно.\n\t\t\tif (elapsed >= intervalMs) {\n\t\t\t\t// Немедленный вызов = “leading edge”.\n\t\t\t\t// Берём последнее значение, очищаем lastRef и вызываем cb.\n\t\t\t\tconst v = lastRef.current;\n\t\t\t\tlastRef.current = null;\n\n\t\t\t\t// На всякий случай прибираем таймер, если он был.\n\t\t\t\tif (tRef.current) {\n\t\t\t\t\tclearTimeout(tRef.current);\n\t\t\t\t\ttRef.current = null;\n\t\t\t\t}\n\n\t\t\t\tlastInvokeTsRef.current = now;\n\t\t\t\tif (v !== null) cbRef.current(v);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Иначе — “trailing edge”: планируем выполнение в конце окна.\n\t\t\t// Важно: если таймер уже запланирован — НЕ пересоздаём,\n\t\t\t// потому что trailing-вызов должен случиться в конкретный момент (конец окна),\n\t\t\t// а значение мы и так обновляем через lastRef.current.\n\t\t\tif (!tRef.current) {\n\t\t\t\tconst wait = intervalMs - elapsed;\n\n\t\t\t\ttRef.current = setTimeout(() => {\n\t\t\t\t\ttRef.current = null;\n\t\t\t\t\t// В конце окна применяем последнее накопленное значение\n\t\t\t\t\tflush();\n\t\t\t\t}, wait);\n\t\t\t}\n\t\t},\n\t\t[intervalMs, flush]\n\t);\n\n\t/**\n\t * Cleanup на unmount:\n\t * - по умолчанию cancel (не делаем побочных эффектов при размонтировании)\n\t * - при flushOnUnmount=true — пытаемся сохранить последнее значение.\n\t *\n\t * Для твоего кейса (сериализация финального snapshot) чаще полезно flushOnUnmount=true.\n\t */\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tif (options?.flushOnUnmount) flush();\n\t\t\telse cancel();\n\t\t};\n\t}, [cancel, flush, options?.flushOnUnmount]);\n\n\treturn { call, flush, cancel };\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useBlockBrowserZoom.d.ts","sourceRoot":"","sources":["../../src/hooks/useBlockBrowserZoom.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useBlockBrowserZoom.d.ts","sourceRoot":"","sources":["../../src/hooks/useBlockBrowserZoom.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,QAanD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDndSortableSensors.d.ts","sourceRoot":"","sources":["../../src/hooks/useDndSortableSensors.ts"],"names":[],"mappings":"AAAA,OAAO,EAON,KAAK,aAAa,EAClB,KAAK,wBAAwB,EAC7B,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"useDndSortableSensors.d.ts","sourceRoot":"","sources":["../../src/hooks/useDndSortableSensors.ts"],"names":[],"mappings":"AAAA,OAAO,EAON,KAAK,aAAa,EAClB,KAAK,wBAAwB,EAC7B,MAAM,eAAe,CAAC;AAKvB,MAAM,WAAW,4BAA4B;IAC5C,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;OAGG;IACH,eAAe,CAAC,EAAE;QACjB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;KAC5B,CAAC;IACF,uGAAuG;IACvG,wBAAwB,CAAC,EAAE,wBAAwB,CAAC;IACpD,6FAA6F;IAC7F,aAAa,CAAC,EAAE,aAAa,CAAC;CAC9B;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,iBAAiB,GAAE,MAAM,GAAG,4BAAmE,qFAqBpI"}
|