@fivepixels-js/react 0.1.0
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/LICENSE +21 -0
- package/README.md +648 -0
- package/dist/components/ShortcutHint.d.ts +8 -0
- package/dist/components/ShortcutHint.d.ts.map +1 -0
- package/dist/components/ShortcutHint.js +9 -0
- package/dist/components/ShortcutHint.js.map +1 -0
- package/dist/components/icons/Icons.d.ts +70 -0
- package/dist/components/icons/Icons.d.ts.map +1 -0
- package/dist/components/icons/Icons.js +127 -0
- package/dist/components/icons/Icons.js.map +1 -0
- package/dist/components/icons/MaterialIcon.d.ts +8 -0
- package/dist/components/icons/MaterialIcon.d.ts.map +1 -0
- package/dist/components/icons/MaterialIcon.js +5 -0
- package/dist/components/icons/MaterialIcon.js.map +1 -0
- package/dist/components/motion/index.d.ts +48 -0
- package/dist/components/motion/index.d.ts.map +1 -0
- package/dist/components/motion/index.js +910 -0
- package/dist/components/motion/index.js.map +1 -0
- package/dist/components/overlay/ReportOverlayLayer.d.ts +7 -0
- package/dist/components/overlay/ReportOverlayLayer.d.ts.map +1 -0
- package/dist/components/overlay/ReportOverlayLayer.js +14 -0
- package/dist/components/overlay/ReportOverlayLayer.js.map +1 -0
- package/dist/components/overlay/TargetHighlights.d.ts +9 -0
- package/dist/components/overlay/TargetHighlights.d.ts.map +1 -0
- package/dist/components/overlay/TargetHighlights.js +24 -0
- package/dist/components/overlay/TargetHighlights.js.map +1 -0
- package/dist/components/panel/PanelDockGuides.d.ts +8 -0
- package/dist/components/panel/PanelDockGuides.d.ts.map +1 -0
- package/dist/components/panel/PanelDockGuides.js +15 -0
- package/dist/components/panel/PanelDockGuides.js.map +1 -0
- package/dist/components/panel/PanelDropdownMenu.d.ts +19 -0
- package/dist/components/panel/PanelDropdownMenu.d.ts.map +1 -0
- package/dist/components/panel/PanelDropdownMenu.js +132 -0
- package/dist/components/panel/PanelDropdownMenu.js.map +1 -0
- package/dist/components/panel/PanelMoreMenu.d.ts +20 -0
- package/dist/components/panel/PanelMoreMenu.d.ts.map +1 -0
- package/dist/components/panel/PanelMoreMenu.js +20 -0
- package/dist/components/panel/PanelMoreMenu.js.map +1 -0
- package/dist/components/panel/PanelOptionSwitch.d.ts +14 -0
- package/dist/components/panel/PanelOptionSwitch.d.ts.map +1 -0
- package/dist/components/panel/PanelOptionSwitch.js +10 -0
- package/dist/components/panel/PanelOptionSwitch.js.map +1 -0
- package/dist/components/panel/ReportCommandPanel.d.ts +18 -0
- package/dist/components/panel/ReportCommandPanel.d.ts.map +1 -0
- package/dist/components/panel/ReportCommandPanel.js +43 -0
- package/dist/components/panel/ReportCommandPanel.js.map +1 -0
- package/dist/components/panel/ReportCommandReplaceConfirmDialog.d.ts +9 -0
- package/dist/components/panel/ReportCommandReplaceConfirmDialog.d.ts.map +1 -0
- package/dist/components/panel/ReportCommandReplaceConfirmDialog.js +7 -0
- package/dist/components/panel/ReportCommandReplaceConfirmDialog.js.map +1 -0
- package/dist/components/panel/ReportControlPanel.d.ts +2 -0
- package/dist/components/panel/ReportControlPanel.d.ts.map +1 -0
- package/dist/components/panel/ReportControlPanel.js +119 -0
- package/dist/components/panel/ReportControlPanel.js.map +1 -0
- package/dist/components/panel/ReportDraftForm.d.ts +2 -0
- package/dist/components/panel/ReportDraftForm.d.ts.map +1 -0
- package/dist/components/panel/ReportDraftForm.js +33 -0
- package/dist/components/panel/ReportDraftForm.js.map +1 -0
- package/dist/components/panel/ReportFeedbackList.d.ts +2 -0
- package/dist/components/panel/ReportFeedbackList.d.ts.map +1 -0
- package/dist/components/panel/ReportFeedbackList.js +165 -0
- package/dist/components/panel/ReportFeedbackList.js.map +1 -0
- package/dist/components/panel/ReportImportConfirmDialog.d.ts +8 -0
- package/dist/components/panel/ReportImportConfirmDialog.d.ts.map +1 -0
- package/dist/components/panel/ReportImportConfirmDialog.js +7 -0
- package/dist/components/panel/ReportImportConfirmDialog.js.map +1 -0
- package/dist/components/panel/ReportImportProjectMismatchDialog.d.ts +12 -0
- package/dist/components/panel/ReportImportProjectMismatchDialog.d.ts.map +1 -0
- package/dist/components/panel/ReportImportProjectMismatchDialog.js +19 -0
- package/dist/components/panel/ReportImportProjectMismatchDialog.js.map +1 -0
- package/dist/components/panel/ReportPersonalKeyDialog.d.ts +8 -0
- package/dist/components/panel/ReportPersonalKeyDialog.d.ts.map +1 -0
- package/dist/components/panel/ReportPersonalKeyDialog.js +60 -0
- package/dist/components/panel/ReportPersonalKeyDialog.js.map +1 -0
- package/dist/components/panel/ReportRouteDetails.d.ts +2 -0
- package/dist/components/panel/ReportRouteDetails.d.ts.map +1 -0
- package/dist/components/panel/ReportRouteDetails.js +18 -0
- package/dist/components/panel/ReportRouteDetails.js.map +1 -0
- package/dist/components/panel/feedback/AuthorSelector.d.ts +9 -0
- package/dist/components/panel/feedback/AuthorSelector.d.ts.map +1 -0
- package/dist/components/panel/feedback/AuthorSelector.js +17 -0
- package/dist/components/panel/feedback/AuthorSelector.js.map +1 -0
- package/dist/components/panel/feedback/FeedbackComposer.d.ts +23 -0
- package/dist/components/panel/feedback/FeedbackComposer.d.ts.map +1 -0
- package/dist/components/panel/feedback/FeedbackComposer.js +48 -0
- package/dist/components/panel/feedback/FeedbackComposer.js.map +1 -0
- package/dist/components/panel/feedback/FeedbackCreatorBadge.d.ts +2 -0
- package/dist/components/panel/feedback/FeedbackCreatorBadge.d.ts.map +1 -0
- package/dist/components/panel/feedback/FeedbackCreatorBadge.js +7 -0
- package/dist/components/panel/feedback/FeedbackCreatorBadge.js.map +1 -0
- package/dist/components/panel/feedback/FeedbackFieldTags.d.ts +9 -0
- package/dist/components/panel/feedback/FeedbackFieldTags.d.ts.map +1 -0
- package/dist/components/panel/feedback/FeedbackFieldTags.js +8 -0
- package/dist/components/panel/feedback/FeedbackFieldTags.js.map +1 -0
- package/dist/components/panel/feedback/FeedbackHoverCard.d.ts +11 -0
- package/dist/components/panel/feedback/FeedbackHoverCard.d.ts.map +1 -0
- package/dist/components/panel/feedback/FeedbackHoverCard.js +14 -0
- package/dist/components/panel/feedback/FeedbackHoverCard.js.map +1 -0
- package/dist/components/panel/feedback/FeedbackIssueHeader.d.ts +12 -0
- package/dist/components/panel/feedback/FeedbackIssueHeader.d.ts.map +1 -0
- package/dist/components/panel/feedback/FeedbackIssueHeader.js +10 -0
- package/dist/components/panel/feedback/FeedbackIssueHeader.js.map +1 -0
- package/dist/components/panel/feedback/FeedbackStatusBadge.d.ts +8 -0
- package/dist/components/panel/feedback/FeedbackStatusBadge.d.ts.map +1 -0
- package/dist/components/panel/feedback/FeedbackStatusBadge.js +10 -0
- package/dist/components/panel/feedback/FeedbackStatusBadge.js.map +1 -0
- package/dist/components/panel/feedback/FeedbackThread.d.ts +21 -0
- package/dist/components/panel/feedback/FeedbackThread.d.ts.map +1 -0
- package/dist/components/panel/feedback/FeedbackThread.js +90 -0
- package/dist/components/panel/feedback/FeedbackThread.js.map +1 -0
- package/dist/components/panel/feedback/FieldTagSelector.d.ts +9 -0
- package/dist/components/panel/feedback/FieldTagSelector.d.ts.map +1 -0
- package/dist/components/panel/feedback/FieldTagSelector.js +15 -0
- package/dist/components/panel/feedback/FieldTagSelector.js.map +1 -0
- package/dist/components/panel/feedback/GitIssueButton.d.ts +12 -0
- package/dist/components/panel/feedback/GitIssueButton.d.ts.map +1 -0
- package/dist/components/panel/feedback/GitIssueButton.js +43 -0
- package/dist/components/panel/feedback/GitIssueButton.js.map +1 -0
- package/dist/components/panel/feedback/GitIssuedThreadEntry.d.ts +8 -0
- package/dist/components/panel/feedback/GitIssuedThreadEntry.d.ts.map +1 -0
- package/dist/components/panel/feedback/GitIssuedThreadEntry.js +25 -0
- package/dist/components/panel/feedback/GitIssuedThreadEntry.js.map +1 -0
- package/dist/components/point/ReportDraftMarker.d.ts +2 -0
- package/dist/components/point/ReportDraftMarker.d.ts.map +1 -0
- package/dist/components/point/ReportDraftMarker.js +28 -0
- package/dist/components/point/ReportDraftMarker.js.map +1 -0
- package/dist/components/point/ReportMarkersLayer.d.ts +2 -0
- package/dist/components/point/ReportMarkersLayer.d.ts.map +1 -0
- package/dist/components/point/ReportMarkersLayer.js +129 -0
- package/dist/components/point/ReportMarkersLayer.js.map +1 -0
- package/dist/components/report/FivePixels.d.ts +50 -0
- package/dist/components/report/FivePixels.d.ts.map +1 -0
- package/dist/components/report/FivePixels.js +15 -0
- package/dist/components/report/FivePixels.js.map +1 -0
- package/dist/components/report/ReportView.d.ts +2 -0
- package/dist/components/report/ReportView.d.ts.map +1 -0
- package/dist/components/report/ReportView.js +14 -0
- package/dist/components/report/ReportView.js.map +1 -0
- package/dist/components/report/ShadowReportRoot.d.ts +9 -0
- package/dist/components/report/ShadowReportRoot.d.ts.map +1 -0
- package/dist/components/report/ShadowReportRoot.js +80 -0
- package/dist/components/report/ShadowReportRoot.js.map +1 -0
- package/dist/components/report/index.d.ts +13 -0
- package/dist/components/report/index.d.ts.map +1 -0
- package/dist/components/report/index.js +9 -0
- package/dist/components/report/index.js.map +1 -0
- package/dist/components/ui/HoverTooltip.d.ts +10 -0
- package/dist/components/ui/HoverTooltip.d.ts.map +1 -0
- package/dist/components/ui/HoverTooltip.js +64 -0
- package/dist/components/ui/HoverTooltip.js.map +1 -0
- package/dist/components/ui/IconTooltipButton.d.ts +12 -0
- package/dist/components/ui/IconTooltipButton.d.ts.map +1 -0
- package/dist/components/ui/IconTooltipButton.js +7 -0
- package/dist/components/ui/IconTooltipButton.js.map +1 -0
- package/dist/constants/feedbackStatus.d.ts +6 -0
- package/dist/constants/feedbackStatus.d.ts.map +1 -0
- package/dist/constants/feedbackStatus.js +27 -0
- package/dist/constants/feedbackStatus.js.map +1 -0
- package/dist/constants/project.d.ts +2 -0
- package/dist/constants/project.d.ts.map +1 -0
- package/dist/constants/project.js +2 -0
- package/dist/constants/project.js.map +1 -0
- package/dist/constants/report.d.ts +7 -0
- package/dist/constants/report.d.ts.map +1 -0
- package/dist/constants/report.js +14 -0
- package/dist/constants/report.js.map +1 -0
- package/dist/constants/reportShortcuts.d.ts +31 -0
- package/dist/constants/reportShortcuts.d.ts.map +1 -0
- package/dist/constants/reportShortcuts.js +9 -0
- package/dist/constants/reportShortcuts.js.map +1 -0
- package/dist/constants/storageKeys.d.ts +5 -0
- package/dist/constants/storageKeys.d.ts.map +1 -0
- package/dist/constants/storageKeys.js +16 -0
- package/dist/constants/storageKeys.js.map +1 -0
- package/dist/hooks/report.api.d.ts +8 -0
- package/dist/hooks/report.api.d.ts.map +1 -0
- package/dist/hooks/report.api.js +20 -0
- package/dist/hooks/report.api.js.map +1 -0
- package/dist/hooks/report.query.d.ts +27 -0
- package/dist/hooks/report.query.d.ts.map +1 -0
- package/dist/hooks/report.query.js +137 -0
- package/dist/hooks/report.query.js.map +1 -0
- package/dist/hooks/useAppearancePreference.d.ts +6 -0
- package/dist/hooks/useAppearancePreference.d.ts.map +1 -0
- package/dist/hooks/useAppearancePreference.js +40 -0
- package/dist/hooks/useAppearancePreference.js.map +1 -0
- package/dist/hooks/useCurrentPathname.d.ts +2 -0
- package/dist/hooks/useCurrentPathname.d.ts.map +1 -0
- package/dist/hooks/useCurrentPathname.js +18 -0
- package/dist/hooks/useCurrentPathname.js.map +1 -0
- package/dist/hooks/useIsMobileViewport.d.ts +2 -0
- package/dist/hooks/useIsMobileViewport.d.ts.map +1 -0
- package/dist/hooks/useIsMobileViewport.js +12 -0
- package/dist/hooks/useIsMobileViewport.js.map +1 -0
- package/dist/hooks/useLocalePreference.d.ts +6 -0
- package/dist/hooks/useLocalePreference.d.ts.map +1 -0
- package/dist/hooks/useLocalePreference.js +40 -0
- package/dist/hooks/useLocalePreference.js.map +1 -0
- package/dist/hooks/useNativeHover.d.ts +7 -0
- package/dist/hooks/useNativeHover.d.ts.map +1 -0
- package/dist/hooks/useNativeHover.js +28 -0
- package/dist/hooks/useNativeHover.js.map +1 -0
- package/dist/hooks/usePanelDock.d.ts +29 -0
- package/dist/hooks/usePanelDock.d.ts.map +1 -0
- package/dist/hooks/usePanelDock.js +279 -0
- package/dist/hooks/usePanelDock.js.map +1 -0
- package/dist/hooks/usePanelFeedbackTransfer.d.ts +59 -0
- package/dist/hooks/usePanelFeedbackTransfer.d.ts.map +1 -0
- package/dist/hooks/usePanelFeedbackTransfer.js +250 -0
- package/dist/hooks/usePanelFeedbackTransfer.js.map +1 -0
- package/dist/hooks/usePersonalKey.d.ts +30 -0
- package/dist/hooks/usePersonalKey.d.ts.map +1 -0
- package/dist/hooks/usePersonalKey.js +72 -0
- package/dist/hooks/usePersonalKey.js.map +1 -0
- package/dist/hooks/useReportPersistence.d.ts +63 -0
- package/dist/hooks/useReportPersistence.d.ts.map +1 -0
- package/dist/hooks/useReportPersistence.js +142 -0
- package/dist/hooks/useReportPersistence.js.map +1 -0
- package/dist/hooks/useReportShortcuts.d.ts +5 -0
- package/dist/hooks/useReportShortcuts.d.ts.map +1 -0
- package/dist/hooks/useReportShortcuts.js +117 -0
- package/dist/hooks/useReportShortcuts.js.map +1 -0
- package/dist/hooks/useReportState.d.ts +177 -0
- package/dist/hooks/useReportState.d.ts.map +1 -0
- package/dist/hooks/useReportState.js +904 -0
- package/dist/hooks/useReportState.js.map +1 -0
- package/dist/hooks/useResolvedAppearance.d.ts +4 -0
- package/dist/hooks/useResolvedAppearance.d.ts.map +1 -0
- package/dist/hooks/useResolvedAppearance.js +23 -0
- package/dist/hooks/useResolvedAppearance.js.map +1 -0
- package/dist/hooks/useTooltipLayout.d.ts +21 -0
- package/dist/hooks/useTooltipLayout.d.ts.map +1 -0
- package/dist/hooks/useTooltipLayout.js +45 -0
- package/dist/hooks/useTooltipLayout.js.map +1 -0
- package/dist/i18n/en.d.ts +3 -0
- package/dist/i18n/en.d.ts.map +1 -0
- package/dist/i18n/en.js +277 -0
- package/dist/i18n/en.js.map +1 -0
- package/dist/i18n/index.d.ts +20 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +77 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/i18n/ko.d.ts +3 -0
- package/dist/i18n/ko.d.ts.map +1 -0
- package/dist/i18n/ko.js +277 -0
- package/dist/i18n/ko.js.map +1 -0
- package/dist/i18n/types.d.ts +267 -0
- package/dist/i18n/types.d.ts.map +1 -0
- package/dist/i18n/types.js +2 -0
- package/dist/i18n/types.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/providers/ReportProvider.d.ts +52 -0
- package/dist/providers/ReportProvider.d.ts.map +1 -0
- package/dist/providers/ReportProvider.js +49 -0
- package/dist/providers/ReportProvider.js.map +1 -0
- package/dist/providers/reportContext.d.ts +286 -0
- package/dist/providers/reportContext.d.ts.map +1 -0
- package/dist/providers/reportContext.js +11 -0
- package/dist/providers/reportContext.js.map +1 -0
- package/dist/storage/local/localStorageAdapter.d.ts +12 -0
- package/dist/storage/local/localStorageAdapter.d.ts.map +1 -0
- package/dist/storage/local/localStorageAdapter.js +187 -0
- package/dist/storage/local/localStorageAdapter.js.map +1 -0
- package/dist/styles/reportStylesheet.d.ts +2 -0
- package/dist/styles/reportStylesheet.d.ts.map +1 -0
- package/dist/styles/reportStylesheet.js +3 -0
- package/dist/styles/reportStylesheet.js.map +1 -0
- package/dist/types/report-ui.d.ts +47 -0
- package/dist/types/report-ui.d.ts.map +1 -0
- package/dist/types/report-ui.js +2 -0
- package/dist/types/report-ui.js.map +1 -0
- package/dist/types/report.d.ts +177 -0
- package/dist/types/report.d.ts.map +1 -0
- package/dist/types/report.js +8 -0
- package/dist/types/report.js.map +1 -0
- package/dist/utils/coordinates.d.ts +63 -0
- package/dist/utils/coordinates.d.ts.map +1 -0
- package/dist/utils/coordinates.js +236 -0
- package/dist/utils/coordinates.js.map +1 -0
- package/dist/utils/dom.d.ts +14 -0
- package/dist/utils/dom.d.ts.map +1 -0
- package/dist/utils/dom.js +104 -0
- package/dist/utils/dom.js.map +1 -0
- package/dist/utils/env.d.ts +6 -0
- package/dist/utils/env.d.ts.map +1 -0
- package/dist/utils/env.js +18 -0
- package/dist/utils/env.js.map +1 -0
- package/dist/utils/feedbackDataTransfer.d.ts +31 -0
- package/dist/utils/feedbackDataTransfer.d.ts.map +1 -0
- package/dist/utils/feedbackDataTransfer.js +195 -0
- package/dist/utils/feedbackDataTransfer.js.map +1 -0
- package/dist/utils/feedbackThread.d.ts +14 -0
- package/dist/utils/feedbackThread.d.ts.map +1 -0
- package/dist/utils/feedbackThread.js +57 -0
- package/dist/utils/feedbackThread.js.map +1 -0
- package/dist/utils/feedbackTransferSchema.d.ts +37 -0
- package/dist/utils/feedbackTransferSchema.d.ts.map +1 -0
- package/dist/utils/feedbackTransferSchema.js +162 -0
- package/dist/utils/feedbackTransferSchema.js.map +1 -0
- package/dist/utils/fields.d.ts +11 -0
- package/dist/utils/fields.d.ts.map +1 -0
- package/dist/utils/fields.js +43 -0
- package/dist/utils/fields.js.map +1 -0
- package/dist/utils/format.d.ts +6 -0
- package/dist/utils/format.d.ts.map +1 -0
- package/dist/utils/format.js +46 -0
- package/dist/utils/format.js.map +1 -0
- package/dist/utils/formatStatCount.d.ts +2 -0
- package/dist/utils/formatStatCount.d.ts.map +1 -0
- package/dist/utils/formatStatCount.js +4 -0
- package/dist/utils/formatStatCount.js.map +1 -0
- package/dist/utils/githubIntegration.d.ts +12 -0
- package/dist/utils/githubIntegration.d.ts.map +1 -0
- package/dist/utils/githubIntegration.js +56 -0
- package/dist/utils/githubIntegration.js.map +1 -0
- package/dist/utils/hoverTooltipLayout.d.ts +8 -0
- package/dist/utils/hoverTooltipLayout.d.ts.map +1 -0
- package/dist/utils/hoverTooltipLayout.js +30 -0
- package/dist/utils/hoverTooltipLayout.js.map +1 -0
- package/dist/utils/locateFeedback.d.ts +11 -0
- package/dist/utils/locateFeedback.d.ts.map +1 -0
- package/dist/utils/locateFeedback.js +16 -0
- package/dist/utils/locateFeedback.js.map +1 -0
- package/dist/utils/panelTypography.d.ts +4 -0
- package/dist/utils/panelTypography.d.ts.map +1 -0
- package/dist/utils/panelTypography.js +4 -0
- package/dist/utils/panelTypography.js.map +1 -0
- package/dist/utils/pathname.d.ts +2 -0
- package/dist/utils/pathname.d.ts.map +1 -0
- package/dist/utils/pathname.js +10 -0
- package/dist/utils/pathname.js.map +1 -0
- package/dist/utils/pathnameNavigation.d.ts +4 -0
- package/dist/utils/pathnameNavigation.d.ts.map +1 -0
- package/dist/utils/pathnameNavigation.js +52 -0
- package/dist/utils/pathnameNavigation.js.map +1 -0
- package/dist/utils/personalKey.d.ts +45 -0
- package/dist/utils/personalKey.d.ts.map +1 -0
- package/dist/utils/personalKey.js +180 -0
- package/dist/utils/personalKey.js.map +1 -0
- package/dist/utils/projectId.d.ts +2 -0
- package/dist/utils/projectId.d.ts.map +1 -0
- package/dist/utils/projectId.js +14 -0
- package/dist/utils/projectId.js.map +1 -0
- package/dist/utils/reportCallbacks.d.ts +20 -0
- package/dist/utils/reportCallbacks.d.ts.map +1 -0
- package/dist/utils/reportCallbacks.js +42 -0
- package/dist/utils/reportCallbacks.js.map +1 -0
- package/dist/utils/reportProject.d.ts +17 -0
- package/dist/utils/reportProject.d.ts.map +1 -0
- package/dist/utils/reportProject.js +9 -0
- package/dist/utils/reportProject.js.map +1 -0
- package/dist/utils/reportTeam.d.ts +15 -0
- package/dist/utils/reportTeam.d.ts.map +1 -0
- package/dist/utils/reportTeam.js +8 -0
- package/dist/utils/reportTeam.js.map +1 -0
- package/dist/utils/reportUi.d.ts +24 -0
- package/dist/utils/reportUi.d.ts.map +1 -0
- package/dist/utils/reportUi.js +19 -0
- package/dist/utils/reportUi.js.map +1 -0
- package/dist/utils/reportVisibility.d.ts +19 -0
- package/dist/utils/reportVisibility.d.ts.map +1 -0
- package/dist/utils/reportVisibility.js +12 -0
- package/dist/utils/reportVisibility.js.map +1 -0
- package/dist/utils/reportVisual.d.ts +12 -0
- package/dist/utils/reportVisual.d.ts.map +1 -0
- package/dist/utils/reportVisual.js +31 -0
- package/dist/utils/reportVisual.js.map +1 -0
- package/dist/utils/routeDetailStatus.d.ts +7 -0
- package/dist/utils/routeDetailStatus.d.ts.map +1 -0
- package/dist/utils/routeDetailStatus.js +29 -0
- package/dist/utils/routeDetailStatus.js.map +1 -0
- package/dist/utils/shortcuts.d.ts +12 -0
- package/dist/utils/shortcuts.d.ts.map +1 -0
- package/dist/utils/shortcuts.js +59 -0
- package/dist/utils/shortcuts.js.map +1 -0
- package/dist/utils/storage.d.ts +17 -0
- package/dist/utils/storage.d.ts.map +1 -0
- package/dist/utils/storage.js +36 -0
- package/dist/utils/storage.js.map +1 -0
- package/dist/utils/validateFeedbackImport.d.ts +4 -0
- package/dist/utils/validateFeedbackImport.d.ts.map +1 -0
- package/dist/utils/validateFeedbackImport.js +187 -0
- package/dist/utils/validateFeedbackImport.js.map +1 -0
- package/package.json +68 -0
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import { DOT_SIZE } from "../constants/report.js";
|
|
2
|
+
import { getFeedbackTargetSelector } from "./dom.js";
|
|
3
|
+
export function clampRatio(value) {
|
|
4
|
+
if (Number.isNaN(value)) {
|
|
5
|
+
return 0;
|
|
6
|
+
}
|
|
7
|
+
return Math.min(1, Math.max(0, value));
|
|
8
|
+
}
|
|
9
|
+
export function getMarkerFromReport(report, currentScrollY) {
|
|
10
|
+
const selector = getFeedbackTargetSelector(report.report_id, report.report_type);
|
|
11
|
+
const targetElement = document.querySelector(selector);
|
|
12
|
+
const pointLeft = window.innerWidth * report.x_ratio - DOT_SIZE / 2;
|
|
13
|
+
const pointTop = report.document_y - currentScrollY - DOT_SIZE / 2;
|
|
14
|
+
if (targetElement) {
|
|
15
|
+
const rect = targetElement.getBoundingClientRect();
|
|
16
|
+
return {
|
|
17
|
+
id: report.id,
|
|
18
|
+
report,
|
|
19
|
+
left: rect.left + rect.width * (report.element_x_ratio ?? report.x_ratio) - DOT_SIZE / 2,
|
|
20
|
+
top: rect.top + rect.height * (report.element_y_ratio ?? report.y_ratio) - DOT_SIZE / 2,
|
|
21
|
+
rect,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
return {
|
|
25
|
+
id: report.id,
|
|
26
|
+
report,
|
|
27
|
+
left: pointLeft,
|
|
28
|
+
top: pointTop,
|
|
29
|
+
rect: null,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
export function getDraftMarkerPosition(draft, selectedTarget) {
|
|
33
|
+
if (selectedTarget) {
|
|
34
|
+
return {
|
|
35
|
+
left: selectedTarget.rect.left + selectedTarget.rect.width * draft.elementXRatio - DOT_SIZE / 2,
|
|
36
|
+
top: selectedTarget.rect.top + selectedTarget.rect.height * draft.elementYRatio - DOT_SIZE / 2,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
return {
|
|
40
|
+
left: draft.clientX - DOT_SIZE / 2,
|
|
41
|
+
top: draft.clientY - DOT_SIZE / 2,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
export function resolveTooltipAnchor(markers, reportId) {
|
|
45
|
+
if (!reportId) {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
return markers.find((marker) => marker.report.id === reportId) ?? null;
|
|
49
|
+
}
|
|
50
|
+
const TOOLTIP_PREVIEW_WIDTH = 260;
|
|
51
|
+
const TOOLTIP_EXPANDED_WIDTH = 320;
|
|
52
|
+
export const TOOLTIP_MARGIN = 16;
|
|
53
|
+
const TOOLTIP_PREVIEW_HEIGHT_ESTIMATE = 140;
|
|
54
|
+
const TOOLTIP_EXPANDED_HEIGHT_ESTIMATE = 320;
|
|
55
|
+
function getTooltipHeightEstimate(expanded) {
|
|
56
|
+
return expanded ? TOOLTIP_EXPANDED_HEIGHT_ESTIMATE : TOOLTIP_PREVIEW_HEIGHT_ESTIMATE;
|
|
57
|
+
}
|
|
58
|
+
function getTooltipAboveTop(anchor) {
|
|
59
|
+
return anchor.top - DOT_SIZE / 2 - TOOLTIP_MARGIN;
|
|
60
|
+
}
|
|
61
|
+
function getTooltipBelowTop(anchor) {
|
|
62
|
+
return anchor.top + DOT_SIZE / 2 + TOOLTIP_MARGIN;
|
|
63
|
+
}
|
|
64
|
+
export function resolveTooltipPlacement(anchor, height, viewportHeight = window.innerHeight) {
|
|
65
|
+
const aboveAnchorTop = getTooltipAboveTop(anchor);
|
|
66
|
+
const belowTop = getTooltipBelowTop(anchor);
|
|
67
|
+
const spaceAbove = aboveAnchorTop - TOOLTIP_MARGIN;
|
|
68
|
+
const spaceBelow = viewportHeight - TOOLTIP_MARGIN - belowTop;
|
|
69
|
+
const aboveFits = height <= spaceAbove;
|
|
70
|
+
const belowFits = height <= spaceBelow;
|
|
71
|
+
if (aboveFits) {
|
|
72
|
+
return "above";
|
|
73
|
+
}
|
|
74
|
+
if (belowFits) {
|
|
75
|
+
return "below";
|
|
76
|
+
}
|
|
77
|
+
return spaceAbove >= spaceBelow ? "above" : "below";
|
|
78
|
+
}
|
|
79
|
+
function clampTooltipTop(top, height, placement, viewportHeight) {
|
|
80
|
+
if (placement === "above") {
|
|
81
|
+
const visualTop = top - height;
|
|
82
|
+
if (visualTop < TOOLTIP_MARGIN) {
|
|
83
|
+
return TOOLTIP_MARGIN + height;
|
|
84
|
+
}
|
|
85
|
+
return top;
|
|
86
|
+
}
|
|
87
|
+
const maxTop = Math.max(TOOLTIP_MARGIN, viewportHeight - TOOLTIP_MARGIN - height);
|
|
88
|
+
return Math.min(Math.max(top, TOOLTIP_MARGIN), maxTop);
|
|
89
|
+
}
|
|
90
|
+
export function getTooltipAnchorStyle(placement) {
|
|
91
|
+
if (placement === "above") {
|
|
92
|
+
return {
|
|
93
|
+
transform: "translateY(-100%)",
|
|
94
|
+
transformOrigin: "bottom left",
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
return {
|
|
98
|
+
transformOrigin: "top left",
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
export function getTooltipPosition(anchor, expanded, options) {
|
|
102
|
+
const width = expanded ? TOOLTIP_EXPANDED_WIDTH : TOOLTIP_PREVIEW_WIDTH;
|
|
103
|
+
const viewportWidth = options?.viewportWidth ?? window.innerWidth;
|
|
104
|
+
const viewportHeight = options?.viewportHeight ?? window.innerHeight;
|
|
105
|
+
const hasMeasuredHeight = options?.height !== undefined;
|
|
106
|
+
const height = options?.height ?? getTooltipHeightEstimate(expanded);
|
|
107
|
+
const preferredLeft = anchor.left - 12;
|
|
108
|
+
const left = Math.min(Math.max(preferredLeft, TOOLTIP_MARGIN), viewportWidth - width - TOOLTIP_MARGIN);
|
|
109
|
+
const aboveAnchorTop = getTooltipAboveTop(anchor);
|
|
110
|
+
let placement;
|
|
111
|
+
if (options?.placement) {
|
|
112
|
+
placement = options.placement;
|
|
113
|
+
}
|
|
114
|
+
else if (!hasMeasuredHeight) {
|
|
115
|
+
// Before measurement, keep the default above placement unless the marker hugs the top edge.
|
|
116
|
+
placement = aboveAnchorTop <= TOOLTIP_MARGIN ? "below" : "above";
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
placement = resolveTooltipPlacement(anchor, height, viewportHeight);
|
|
120
|
+
}
|
|
121
|
+
const anchorTop = placement === "above" ? aboveAnchorTop : getTooltipBelowTop(anchor);
|
|
122
|
+
const top = hasMeasuredHeight ? clampTooltipTop(anchorTop, height, placement, viewportHeight) : anchorTop;
|
|
123
|
+
return { left, top, width, placement };
|
|
124
|
+
}
|
|
125
|
+
export const DRAFT_POPOVER_WIDTH = 280;
|
|
126
|
+
export const DRAFT_POPOVER_HEIGHT = 260;
|
|
127
|
+
export const DRAFT_POPOVER_GAP = 10;
|
|
128
|
+
export const DRAFT_POPOVER_MARGIN = 16;
|
|
129
|
+
/** Horizontal line from bubble edge to marker center. */
|
|
130
|
+
export const DRAFT_POPOVER_CONNECTOR_WIDTH = DRAFT_POPOVER_GAP + DOT_SIZE / 2;
|
|
131
|
+
/** Nudge popover upward when vertically centered on the marker. */
|
|
132
|
+
export const DRAFT_POPOVER_VERTICAL_NUDGE = 6;
|
|
133
|
+
const DRAFT_POPOVER_PLACEMENTS = ["right", "left", "bottom", "top"];
|
|
134
|
+
function getDraftPopoverWidth(viewportWidth) {
|
|
135
|
+
return Math.min(DRAFT_POPOVER_WIDTH, viewportWidth - DRAFT_POPOVER_MARGIN * 2);
|
|
136
|
+
}
|
|
137
|
+
function getAnchorCenter(anchor) {
|
|
138
|
+
return {
|
|
139
|
+
x: anchor.left + DOT_SIZE / 2,
|
|
140
|
+
y: anchor.top + DOT_SIZE / 2,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
function getTailCornerForPlacement(placement) {
|
|
144
|
+
switch (placement) {
|
|
145
|
+
case "right":
|
|
146
|
+
return "bottom-left";
|
|
147
|
+
case "left":
|
|
148
|
+
return "bottom-right";
|
|
149
|
+
case "bottom":
|
|
150
|
+
return "top-left";
|
|
151
|
+
case "top":
|
|
152
|
+
return "bottom-left";
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
function isHorizontallyAlignedPlacement(placement) {
|
|
156
|
+
return placement === "right" || placement === "left";
|
|
157
|
+
}
|
|
158
|
+
function computeDraftPopoverCandidate(placement, center, width, height) {
|
|
159
|
+
const markerRadius = DOT_SIZE / 2;
|
|
160
|
+
switch (placement) {
|
|
161
|
+
case "right":
|
|
162
|
+
return {
|
|
163
|
+
left: center.x + markerRadius + DRAFT_POPOVER_GAP,
|
|
164
|
+
anchorCenterY: center.y - DRAFT_POPOVER_VERTICAL_NUDGE,
|
|
165
|
+
};
|
|
166
|
+
case "left":
|
|
167
|
+
return {
|
|
168
|
+
left: center.x - markerRadius - DRAFT_POPOVER_GAP - width,
|
|
169
|
+
anchorCenterY: center.y - DRAFT_POPOVER_VERTICAL_NUDGE,
|
|
170
|
+
};
|
|
171
|
+
case "bottom":
|
|
172
|
+
return {
|
|
173
|
+
left: center.x - width / 2,
|
|
174
|
+
top: center.y + markerRadius + DRAFT_POPOVER_GAP,
|
|
175
|
+
};
|
|
176
|
+
case "top":
|
|
177
|
+
return {
|
|
178
|
+
left: center.x - width / 2,
|
|
179
|
+
top: center.y - markerRadius - DRAFT_POPOVER_GAP - height,
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
function draftPopoverFitsInViewport(placement, left, width, height, viewportWidth, viewportHeight, anchorCenterY, top) {
|
|
184
|
+
const horizontalFits = left >= DRAFT_POPOVER_MARGIN && left + width <= viewportWidth - DRAFT_POPOVER_MARGIN;
|
|
185
|
+
if (isHorizontallyAlignedPlacement(placement) && anchorCenterY !== undefined) {
|
|
186
|
+
return horizontalFits && anchorCenterY - height / 2 >= DRAFT_POPOVER_MARGIN && anchorCenterY + height / 2 <= viewportHeight - DRAFT_POPOVER_MARGIN;
|
|
187
|
+
}
|
|
188
|
+
return horizontalFits && top !== undefined && top >= DRAFT_POPOVER_MARGIN && top + height <= viewportHeight - DRAFT_POPOVER_MARGIN;
|
|
189
|
+
}
|
|
190
|
+
function clampAnchorCenterY(anchorCenterY, height, viewportHeight) {
|
|
191
|
+
const halfHeight = height / 2;
|
|
192
|
+
const minCenterY = DRAFT_POPOVER_MARGIN + halfHeight;
|
|
193
|
+
const maxCenterY = Math.max(minCenterY, viewportHeight - DRAFT_POPOVER_MARGIN - halfHeight);
|
|
194
|
+
return Math.min(Math.max(anchorCenterY, minCenterY), maxCenterY);
|
|
195
|
+
}
|
|
196
|
+
function clampDraftPopoverPosition(placement, left, width, height, viewportWidth, viewportHeight, anchorCenterY, top) {
|
|
197
|
+
const maxLeft = Math.max(DRAFT_POPOVER_MARGIN, viewportWidth - width - DRAFT_POPOVER_MARGIN);
|
|
198
|
+
const clampedLeft = Math.min(Math.max(left, DRAFT_POPOVER_MARGIN), maxLeft);
|
|
199
|
+
if (isHorizontallyAlignedPlacement(placement) && anchorCenterY !== undefined) {
|
|
200
|
+
return {
|
|
201
|
+
left: clampedLeft,
|
|
202
|
+
anchorCenterY: clampAnchorCenterY(anchorCenterY, height, viewportHeight),
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
const maxTop = Math.max(DRAFT_POPOVER_MARGIN, viewportHeight - height - DRAFT_POPOVER_MARGIN);
|
|
206
|
+
return {
|
|
207
|
+
left: clampedLeft,
|
|
208
|
+
top: Math.min(Math.max(top ?? DRAFT_POPOVER_MARGIN, DRAFT_POPOVER_MARGIN), maxTop),
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
export function getDraftPopoverPosition(anchor, options) {
|
|
212
|
+
const viewportWidth = options?.viewportWidth ?? window.innerWidth;
|
|
213
|
+
const viewportHeight = options?.viewportHeight ?? window.innerHeight;
|
|
214
|
+
const width = options?.width ?? getDraftPopoverWidth(viewportWidth);
|
|
215
|
+
const height = options?.height ?? DRAFT_POPOVER_HEIGHT;
|
|
216
|
+
const center = getAnchorCenter(anchor);
|
|
217
|
+
let placement = "right";
|
|
218
|
+
let position = computeDraftPopoverCandidate("right", center, width, height);
|
|
219
|
+
for (const candidate of DRAFT_POPOVER_PLACEMENTS) {
|
|
220
|
+
const nextPosition = computeDraftPopoverCandidate(candidate, center, width, height);
|
|
221
|
+
if (draftPopoverFitsInViewport(candidate, nextPosition.left, width, height, viewportWidth, viewportHeight, nextPosition.anchorCenterY, nextPosition.top)) {
|
|
222
|
+
placement = candidate;
|
|
223
|
+
position = nextPosition;
|
|
224
|
+
break;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
const clamped = clampDraftPopoverPosition(placement, position.left, width, height, viewportWidth, viewportHeight, position.anchorCenterY, position.top);
|
|
228
|
+
return {
|
|
229
|
+
...clamped,
|
|
230
|
+
width,
|
|
231
|
+
placement,
|
|
232
|
+
centerVertically: isHorizontallyAlignedPlacement(placement),
|
|
233
|
+
tailCorner: getTailCornerForPlacement(placement),
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=coordinates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coordinates.js","sourceRoot":"","sources":["../../src/utils/coordinates.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ReportTargetType } from "../types/report.js";
|
|
2
|
+
import type { TargetSnapshot } from "../types/report-ui.js";
|
|
3
|
+
export declare function escapeAttribute(value: string): string;
|
|
4
|
+
export declare function resolveReportType(element: HTMLElement): ReportTargetType;
|
|
5
|
+
export declare function getFeedbackTargetSelector(reportId: string, reportType: ReportTargetType): string;
|
|
6
|
+
export declare function isSameHoverTarget(previous: TargetSnapshot | null, next: TargetSnapshot | null): boolean;
|
|
7
|
+
export declare function toSnapshot(element: HTMLElement | null): TargetSnapshot | null;
|
|
8
|
+
export declare function findTargetElement(baseElement: HTMLElement | null): HTMLElement | null;
|
|
9
|
+
export declare function getSelectableTargets(): TargetSnapshot[];
|
|
10
|
+
export declare function findTargetByPoint(overlay: HTMLDivElement | null, clientX: number, clientY: number): HTMLElement | null;
|
|
11
|
+
export declare function getReportPortalRoot(): HTMLElement;
|
|
12
|
+
export declare function ensureReportTooltipLayer(): HTMLElement;
|
|
13
|
+
export declare function getReportTooltipRoot(): HTMLElement;
|
|
14
|
+
//# sourceMappingURL=dom.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dom.d.ts","sourceRoot":"","sources":["../../src/utils/dom.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,UAE5C;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,WAAW,GAAG,gBAAgB,CAExE;AAED,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,gBAAgB,UAQvF;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI,EAAE,IAAI,EAAE,cAAc,GAAG,IAAI,WAU7F;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,GAAG,cAAc,GAAG,IAAI,CAgB7E;AAED,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI,sBAyBhE;AAED,wBAAgB,oBAAoB,qBAInC;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,sBAWjG;AAMD,wBAAgB,mBAAmB,IAAI,WAAW,CAQjD;AAED,wBAAgB,wBAAwB,IAAI,WAAW,CAsBtD;AAED,wBAAgB,oBAAoB,IAAI,WAAW,CAElD"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { TARGET_SELECTOR } from "../constants/report.js";
|
|
2
|
+
export function escapeAttribute(value) {
|
|
3
|
+
return value.split("\\").join("\\\\").split('"').join('\\"');
|
|
4
|
+
}
|
|
5
|
+
export function resolveReportType(element) {
|
|
6
|
+
return element.dataset.reportType === "group" ? "group" : "item";
|
|
7
|
+
}
|
|
8
|
+
export function getFeedbackTargetSelector(reportId, reportType) {
|
|
9
|
+
const escapedId = escapeAttribute(reportId);
|
|
10
|
+
if (reportType === "group") {
|
|
11
|
+
return `[data-report-id="${escapedId}"][data-report-type="group"]`;
|
|
12
|
+
}
|
|
13
|
+
return `[data-report-id="${escapedId}"]:not([data-report-type="group"])`;
|
|
14
|
+
}
|
|
15
|
+
export function isSameHoverTarget(previous, next) {
|
|
16
|
+
if (previous === next) {
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
if (!previous || !next) {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
return previous.id === next.id && previous.type === next.type;
|
|
23
|
+
}
|
|
24
|
+
export function toSnapshot(element) {
|
|
25
|
+
if (!element) {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
const reportId = element.dataset.reportId?.trim();
|
|
29
|
+
if (!reportId) {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
return {
|
|
33
|
+
id: reportId,
|
|
34
|
+
type: resolveReportType(element),
|
|
35
|
+
rect: element.getBoundingClientRect(),
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
export function findTargetElement(baseElement) {
|
|
39
|
+
if (!baseElement) {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
let groupFallback = null;
|
|
43
|
+
let node = baseElement;
|
|
44
|
+
while (node) {
|
|
45
|
+
const reportId = node.dataset.reportId?.trim();
|
|
46
|
+
if (reportId) {
|
|
47
|
+
if (resolveReportType(node) === "item") {
|
|
48
|
+
return node;
|
|
49
|
+
}
|
|
50
|
+
if (!groupFallback) {
|
|
51
|
+
groupFallback = node;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
node = node.parentElement;
|
|
55
|
+
}
|
|
56
|
+
return groupFallback;
|
|
57
|
+
}
|
|
58
|
+
export function getSelectableTargets() {
|
|
59
|
+
return Array.from(document.querySelectorAll(TARGET_SELECTOR))
|
|
60
|
+
.map((element) => toSnapshot(element))
|
|
61
|
+
.filter((snapshot) => snapshot !== null);
|
|
62
|
+
}
|
|
63
|
+
export function findTargetByPoint(overlay, clientX, clientY) {
|
|
64
|
+
if (!overlay) {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
const previousPointerEvents = overlay.style.pointerEvents;
|
|
68
|
+
overlay.style.pointerEvents = "none";
|
|
69
|
+
const hitElement = document.elementFromPoint(clientX, clientY);
|
|
70
|
+
overlay.style.pointerEvents = previousPointerEvents;
|
|
71
|
+
return findTargetElement(hitElement);
|
|
72
|
+
}
|
|
73
|
+
const REPORT_HOST_ID = "fivepixels-root";
|
|
74
|
+
const REPORT_MOUNT_ATTR = "data-fivepixels-mount";
|
|
75
|
+
const REPORT_TOOLTIP_LAYER_ATTR = "data-fivepixels-tooltip-layer";
|
|
76
|
+
export function getReportPortalRoot() {
|
|
77
|
+
const mount = document.getElementById(REPORT_HOST_ID)?.shadowRoot?.querySelector(`[${REPORT_MOUNT_ATTR}]`);
|
|
78
|
+
if (mount instanceof HTMLElement) {
|
|
79
|
+
return mount;
|
|
80
|
+
}
|
|
81
|
+
return document.body;
|
|
82
|
+
}
|
|
83
|
+
export function ensureReportTooltipLayer() {
|
|
84
|
+
const shadowRoot = document.getElementById(REPORT_HOST_ID)?.shadowRoot;
|
|
85
|
+
if (!shadowRoot) {
|
|
86
|
+
return document.body;
|
|
87
|
+
}
|
|
88
|
+
let layer = shadowRoot.querySelector(`[${REPORT_TOOLTIP_LAYER_ATTR}]`);
|
|
89
|
+
if (!(layer instanceof HTMLElement)) {
|
|
90
|
+
const newLayer = document.createElement("div");
|
|
91
|
+
newLayer.setAttribute(REPORT_TOOLTIP_LAYER_ATTR, "");
|
|
92
|
+
newLayer.style.cssText = "position:fixed;inset:0;z-index:2147483647;pointer-events:none;overflow:visible;";
|
|
93
|
+
shadowRoot.append(newLayer);
|
|
94
|
+
return newLayer;
|
|
95
|
+
}
|
|
96
|
+
if (layer !== shadowRoot.lastElementChild) {
|
|
97
|
+
shadowRoot.append(layer);
|
|
98
|
+
}
|
|
99
|
+
return layer;
|
|
100
|
+
}
|
|
101
|
+
export function getReportTooltipRoot() {
|
|
102
|
+
return ensureReportTooltipLayer();
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=dom.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dom.js","sourceRoot":"","sources":["../../src/utils/dom.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/utils/env.ts"],"names":[],"mappings":"AAMA,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AAED,wBAAgB,oBAAoB,CAAC,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAYpG"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
function readNodeEnv() {
|
|
2
|
+
const runtimeProcess = globalThis.process;
|
|
3
|
+
return runtimeProcess?.env?.NODE_ENV;
|
|
4
|
+
}
|
|
5
|
+
export function isProductionEnv() {
|
|
6
|
+
return readNodeEnv() === "production";
|
|
7
|
+
}
|
|
8
|
+
export function resolveReportEnabled(options = {}) {
|
|
9
|
+
const { enabled = true, devOnly = false } = options;
|
|
10
|
+
if (!enabled) {
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
if (devOnly && isProductionEnv()) {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/utils/env.ts"],"names":[],"mappings":"AAAA,SAAS,WAAW;IAChB,MAAM,cAAc,GAAI,UAA4D,CAAC,OAAO,CAAC;IAE7F,OAAO,cAAc,EAAE,GAAG,EAAE,QAAQ,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,eAAe;IAC3B,OAAO,WAAW,EAAE,KAAK,YAAY,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,UAAoD,EAAE;IACvF,MAAM,EAAE,OAAO,GAAG,IAAI,EAAE,OAAO,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IAEpD,IAAI,CAAC,OAAO,EAAE,CAAC;QACX,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,IAAI,OAAO,IAAI,eAAe,EAAE,EAAE,CAAC;QAC/B,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { ReportFeedback, ReportProject } from "../types/report.js";
|
|
2
|
+
import { type FeedbackImportPayload } from "./feedbackTransferSchema.js";
|
|
3
|
+
export type FeedbackTransferScope = {
|
|
4
|
+
projectId: string;
|
|
5
|
+
environment?: string;
|
|
6
|
+
appVersion?: string;
|
|
7
|
+
};
|
|
8
|
+
export type { FeedbackImportPayload } from "./feedbackTransferSchema.js";
|
|
9
|
+
export { buildProjectComparisonLines, isImportProjectCompatible, parseFeedbackCommandJson, parseFeedbackImportJson, serializeFeedbackExport, serializeFeedbackItem, toReportProject, } from "./feedbackTransferSchema.js";
|
|
10
|
+
export type FeedbackDownloadResult = "saved" | "downloaded" | "cancelled" | "failed";
|
|
11
|
+
export declare function getFeedbackStorageKey({ projectId, environment, appVersion }: FeedbackTransferScope): string;
|
|
12
|
+
export declare function readAllFeedback({ projectId, environment, appVersion }: FeedbackTransferScope): ReportFeedback[];
|
|
13
|
+
export declare function writeAllFeedback(scope: FeedbackTransferScope, items: ReportFeedback[]): void;
|
|
14
|
+
export type FeedbackInsertResult = {
|
|
15
|
+
inserted: number;
|
|
16
|
+
replaced: number;
|
|
17
|
+
};
|
|
18
|
+
export type FeedbackInsertConflict = {
|
|
19
|
+
id: string;
|
|
20
|
+
existing: ReportFeedback;
|
|
21
|
+
incoming: ReportFeedback;
|
|
22
|
+
};
|
|
23
|
+
export declare function findFeedbackInsertConflicts(scope: FeedbackTransferScope, incoming: ReportFeedback[]): FeedbackInsertConflict[];
|
|
24
|
+
export declare function insertFeedbackItems(scope: FeedbackTransferScope, incoming: ReportFeedback[]): FeedbackInsertResult;
|
|
25
|
+
export declare function upsertFeedbackItems(scope: FeedbackTransferScope, incoming: ReportFeedback[]): FeedbackInsertResult;
|
|
26
|
+
export declare function copyTextToClipboard(text: string): Promise<void>;
|
|
27
|
+
export declare function createFeedbackBackupFilename(projectId: string, environment?: string, appVersion?: string): string;
|
|
28
|
+
export declare function pickFeedbackJsonFile(): Promise<File | null>;
|
|
29
|
+
export declare function downloadFeedbackJson(filename: string, project: ReportProject, items: ReportFeedback[]): Promise<FeedbackDownloadResult>;
|
|
30
|
+
export declare function readFeedbackJsonFile(file: File): Promise<FeedbackImportPayload>;
|
|
31
|
+
//# sourceMappingURL=feedbackDataTransfer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feedbackDataTransfer.d.ts","sourceRoot":"","sources":["../../src/utils/feedbackDataTransfer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAMH,KAAK,qBAAqB,EAC7B,MAAM,6BAA6B,CAAC;AAErC,MAAM,MAAM,qBAAqB,GAAG;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,YAAY,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACzE,OAAO,EACH,2BAA2B,EAC3B,yBAAyB,EACzB,wBAAwB,EACxB,uBAAuB,EACvB,uBAAuB,EACvB,qBAAqB,EACrB,eAAe,GAClB,MAAM,6BAA6B,CAAC;AAErC,MAAM,MAAM,sBAAsB,GAAG,OAAO,GAAG,YAAY,GAAG,WAAW,GAAG,QAAQ,CAAC;AA0BrF,wBAAgB,qBAAqB,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,EAAE,qBAAqB,UAElG;AAED,wBAAgB,eAAe,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,EAAE,qBAAqB,oBAE5F;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,EAAE,KAAK,EAAE,cAAc,EAAE,QAErF;AAED,MAAM,MAAM,oBAAoB,GAAG;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,cAAc,CAAC;IACzB,QAAQ,EAAE,cAAc,CAAC;CAC5B,CAAC;AAEF,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,qBAAqB,EAAE,QAAQ,EAAE,cAAc,EAAE,GAAG,sBAAsB,EAAE,CAY9H;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,qBAAqB,EAAE,QAAQ,EAAE,cAAc,EAAE,GAAG,oBAAoB,CAclH;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,qBAAqB,EAAE,QAAQ,EAAE,cAAc,EAAE,GAAG,oBAAoB,CAuBlH;AAED,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,iBAqBrD;AAED,wBAAgB,4BAA4B,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,UAMxG;AA8DD,wBAAgB,oBAAoB,IAAI,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAwB3D;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAyCvI;AAED,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAGrF"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import { getActiveReportMessages } from "../i18n/index.js";
|
|
2
|
+
import { getReportsStorageKey } from "../constants/storageKeys.js";
|
|
3
|
+
import { readAllReportsFromStorage, writeAllReportsToStorage } from "../storage/local/localStorageAdapter.js";
|
|
4
|
+
import { parseFeedbackImportJson, serializeFeedbackExport, toReportProject, } from "./feedbackTransferSchema.js";
|
|
5
|
+
export { buildProjectComparisonLines, isImportProjectCompatible, parseFeedbackCommandJson, parseFeedbackImportJson, serializeFeedbackExport, serializeFeedbackItem, toReportProject, } from "./feedbackTransferSchema.js";
|
|
6
|
+
const JSON_FILE_TYPES = [
|
|
7
|
+
{
|
|
8
|
+
description: "JSON",
|
|
9
|
+
accept: { "application/json": [".json"] },
|
|
10
|
+
},
|
|
11
|
+
];
|
|
12
|
+
export function getFeedbackStorageKey({ projectId, environment, appVersion }) {
|
|
13
|
+
return getReportsStorageKey(projectId, environment, appVersion);
|
|
14
|
+
}
|
|
15
|
+
export function readAllFeedback({ projectId, environment, appVersion }) {
|
|
16
|
+
return readAllReportsFromStorage(getFeedbackStorageKey({ projectId, environment, appVersion }));
|
|
17
|
+
}
|
|
18
|
+
export function writeAllFeedback(scope, items) {
|
|
19
|
+
writeAllReportsToStorage(getFeedbackStorageKey(scope), items, toReportProject(scope));
|
|
20
|
+
}
|
|
21
|
+
export function findFeedbackInsertConflicts(scope, incoming) {
|
|
22
|
+
const existingById = new Map(readAllFeedback(scope).map((item) => [item.id, item]));
|
|
23
|
+
return incoming.flatMap((item) => {
|
|
24
|
+
const existing = existingById.get(item.id);
|
|
25
|
+
if (!existing) {
|
|
26
|
+
return [];
|
|
27
|
+
}
|
|
28
|
+
return [{ id: item.id, existing, incoming: item }];
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
export function insertFeedbackItems(scope, incoming) {
|
|
32
|
+
const existing = readAllFeedback(scope);
|
|
33
|
+
const existingIds = new Set(existing.map((item) => item.id));
|
|
34
|
+
if (incoming.some((item) => existingIds.has(item.id))) {
|
|
35
|
+
throw new Error(getActiveReportMessages().errors.duplicateIdIncluded);
|
|
36
|
+
}
|
|
37
|
+
writeAllFeedback(scope, [...existing, ...incoming]);
|
|
38
|
+
return {
|
|
39
|
+
inserted: incoming.length,
|
|
40
|
+
replaced: 0,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
export function upsertFeedbackItems(scope, incoming) {
|
|
44
|
+
const existing = readAllFeedback(scope);
|
|
45
|
+
const existingIds = new Set(existing.map((item) => item.id));
|
|
46
|
+
const incomingById = new Map(incoming.map((item) => [item.id, item]));
|
|
47
|
+
let replaced = 0;
|
|
48
|
+
let inserted = 0;
|
|
49
|
+
for (const item of incoming) {
|
|
50
|
+
if (existingIds.has(item.id)) {
|
|
51
|
+
replaced += 1;
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
inserted += 1;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
const kept = existing.filter((item) => !incomingById.has(item.id));
|
|
58
|
+
writeAllFeedback(scope, [...kept, ...incoming]);
|
|
59
|
+
return {
|
|
60
|
+
inserted,
|
|
61
|
+
replaced,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
export async function copyTextToClipboard(text) {
|
|
65
|
+
if (typeof navigator !== "undefined" && navigator.clipboard?.writeText) {
|
|
66
|
+
await navigator.clipboard.writeText(text);
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
const textarea = document.createElement("textarea");
|
|
70
|
+
textarea.value = text;
|
|
71
|
+
textarea.style.cssText = "position:fixed;top:0;left:0;width:1px;height:1px;opacity:0;pointer-events:none;";
|
|
72
|
+
getFileTransferParent().appendChild(textarea);
|
|
73
|
+
textarea.focus();
|
|
74
|
+
textarea.select();
|
|
75
|
+
const copied = document.execCommand("copy");
|
|
76
|
+
textarea.remove();
|
|
77
|
+
if (!copied) {
|
|
78
|
+
throw new Error(getActiveReportMessages().errors.clipboardCopyFailed);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
export function createFeedbackBackupFilename(projectId, environment, appVersion) {
|
|
82
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, "-");
|
|
83
|
+
const envSuffix = environment ? `-${environment}` : "";
|
|
84
|
+
const versionSuffix = appVersion ? `-${appVersion}` : "";
|
|
85
|
+
return `fivepixels-feedback-backup-${projectId}${envSuffix}${versionSuffix}-${timestamp}.json`;
|
|
86
|
+
}
|
|
87
|
+
function isAbortError(error) {
|
|
88
|
+
return error instanceof DOMException && error.name === "AbortError";
|
|
89
|
+
}
|
|
90
|
+
const SHADOW_HOST_ID = "fivepixels-root";
|
|
91
|
+
const SHADOW_MOUNT_ATTR = "data-fivepixels-mount";
|
|
92
|
+
function getShadowDomMount() {
|
|
93
|
+
const host = document.getElementById(SHADOW_HOST_ID);
|
|
94
|
+
const mount = host?.shadowRoot?.querySelector(`[${SHADOW_MOUNT_ATTR}]`);
|
|
95
|
+
return mount instanceof HTMLElement ? mount : null;
|
|
96
|
+
}
|
|
97
|
+
function getFileTransferParent() {
|
|
98
|
+
return getShadowDomMount() ?? document.body;
|
|
99
|
+
}
|
|
100
|
+
function downloadFeedbackJsonWithAnchor(filename, json) {
|
|
101
|
+
const blob = new Blob([json], { type: "application/json" });
|
|
102
|
+
const url = URL.createObjectURL(blob);
|
|
103
|
+
const anchor = document.createElement("a");
|
|
104
|
+
anchor.href = url;
|
|
105
|
+
anchor.download = filename;
|
|
106
|
+
anchor.rel = "noopener";
|
|
107
|
+
getFileTransferParent().appendChild(anchor);
|
|
108
|
+
anchor.click();
|
|
109
|
+
anchor.remove();
|
|
110
|
+
URL.revokeObjectURL(url);
|
|
111
|
+
}
|
|
112
|
+
function pickFeedbackJsonFileWithBodyInput() {
|
|
113
|
+
return new Promise((resolve) => {
|
|
114
|
+
const input = document.createElement("input");
|
|
115
|
+
input.type = "file";
|
|
116
|
+
input.accept = ".json,application/json";
|
|
117
|
+
input.multiple = false;
|
|
118
|
+
input.style.cssText = "position:fixed;top:0;left:0;width:1px;height:1px;opacity:0;pointer-events:none;";
|
|
119
|
+
const cleanup = () => {
|
|
120
|
+
input.remove();
|
|
121
|
+
};
|
|
122
|
+
input.addEventListener("change", () => {
|
|
123
|
+
const file = input.files?.[0] ?? null;
|
|
124
|
+
cleanup();
|
|
125
|
+
resolve(file);
|
|
126
|
+
}, { once: true });
|
|
127
|
+
getFileTransferParent().appendChild(input);
|
|
128
|
+
input.click();
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
export function pickFeedbackJsonFile() {
|
|
132
|
+
if (typeof window === "undefined") {
|
|
133
|
+
return Promise.resolve(null);
|
|
134
|
+
}
|
|
135
|
+
const pickerWindow = window;
|
|
136
|
+
if (typeof pickerWindow.showOpenFilePicker === "function") {
|
|
137
|
+
return pickerWindow
|
|
138
|
+
.showOpenFilePicker({
|
|
139
|
+
multiple: false,
|
|
140
|
+
types: JSON_FILE_TYPES,
|
|
141
|
+
})
|
|
142
|
+
.then(async ([handle]) => handle.getFile())
|
|
143
|
+
.catch((error) => {
|
|
144
|
+
if (isAbortError(error)) {
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
147
|
+
return pickFeedbackJsonFileWithBodyInput();
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
return pickFeedbackJsonFileWithBodyInput();
|
|
151
|
+
}
|
|
152
|
+
export function downloadFeedbackJson(filename, project, items) {
|
|
153
|
+
if (typeof window === "undefined") {
|
|
154
|
+
return Promise.resolve("failed");
|
|
155
|
+
}
|
|
156
|
+
const json = serializeFeedbackExport(project, items);
|
|
157
|
+
const pickerWindow = window;
|
|
158
|
+
if (typeof pickerWindow.showSaveFilePicker === "function") {
|
|
159
|
+
return pickerWindow
|
|
160
|
+
.showSaveFilePicker({
|
|
161
|
+
suggestedName: filename,
|
|
162
|
+
types: JSON_FILE_TYPES,
|
|
163
|
+
})
|
|
164
|
+
.then(async (handle) => {
|
|
165
|
+
const writable = await handle.createWritable();
|
|
166
|
+
await writable.write(json);
|
|
167
|
+
await writable.close();
|
|
168
|
+
return "saved";
|
|
169
|
+
})
|
|
170
|
+
.catch((error) => {
|
|
171
|
+
if (isAbortError(error)) {
|
|
172
|
+
return "cancelled";
|
|
173
|
+
}
|
|
174
|
+
try {
|
|
175
|
+
downloadFeedbackJsonWithAnchor(filename, json);
|
|
176
|
+
return "downloaded";
|
|
177
|
+
}
|
|
178
|
+
catch {
|
|
179
|
+
return "failed";
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
try {
|
|
184
|
+
downloadFeedbackJsonWithAnchor(filename, json);
|
|
185
|
+
return Promise.resolve("downloaded");
|
|
186
|
+
}
|
|
187
|
+
catch {
|
|
188
|
+
return Promise.resolve("failed");
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
export async function readFeedbackJsonFile(file) {
|
|
192
|
+
const raw = await file.text();
|
|
193
|
+
return parseFeedbackImportJson(raw);
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=feedbackDataTransfer.js.map
|