@wildo-ai/saas-frontend-lib 1.1.5 → 1.1.6
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/dist/esm/components/actions/action-bar.d.ts +15 -0
- package/dist/esm/components/actions/action-bar.d.ts.map +1 -1
- package/dist/esm/components/actions/action-bar.js +15 -0
- package/dist/esm/components/actions/action-bar.js.map +1 -1
- package/dist/esm/components/ai-elements/decision/approval.d.ts +97 -7
- package/dist/esm/components/ai-elements/decision/approval.d.ts.map +1 -1
- package/dist/esm/components/ai-elements/decision/approval.js.map +1 -1
- package/dist/esm/components/app/AppLayout_AuthenticatedRoute.d.ts.map +1 -1
- package/dist/esm/components/app/AppLayout_AuthenticatedRoute.js +8 -3
- package/dist/esm/components/app/AppLayout_AuthenticatedRoute.js.map +1 -1
- package/dist/esm/components/auth/Auth_EnrollmentRequired.d.ts.map +1 -1
- package/dist/esm/components/auth/Auth_EnrollmentRequired.js +5 -1
- package/dist/esm/components/auth/Auth_EnrollmentRequired.js.map +1 -1
- package/dist/esm/components/auth/Auth_Main.d.ts.map +1 -1
- package/dist/esm/components/auth/Auth_Main.js +1 -4
- package/dist/esm/components/auth/Auth_Main.js.map +1 -1
- package/dist/esm/components/auth/Auth_Register.d.ts.map +1 -1
- package/dist/esm/components/auth/Auth_Register.js +1 -3
- package/dist/esm/components/auth/Auth_Register.js.map +1 -1
- package/dist/esm/components/auth/StepUpAuthDialog.d.ts +7 -0
- package/dist/esm/components/auth/StepUpAuthDialog.d.ts.map +1 -1
- package/dist/esm/components/auth/StepUpAuthDialog.js +13 -7
- package/dist/esm/components/auth/StepUpAuthDialog.js.map +1 -1
- package/dist/esm/components/auth/admin-config/AppPage_SecuritySettings.d.ts.map +1 -1
- package/dist/esm/components/auth/admin-config/AppPage_SecuritySettings.js +32 -33
- package/dist/esm/components/auth/admin-config/AppPage_SecuritySettings.js.map +1 -1
- package/dist/esm/components/auth/admin-config/AppPage_SecuritySettings.labels.d.ts.map +1 -1
- package/dist/esm/components/auth/admin-config/AppPage_SecuritySettings.labels.js +18 -20
- package/dist/esm/components/auth/admin-config/AppPage_SecuritySettings.labels.js.map +1 -1
- package/dist/esm/components/auth/methods/ExternalOAuth2AuthMethod.d.ts.map +1 -1
- package/dist/esm/components/auth/methods/ExternalOAuth2AuthMethod.js +2 -3
- package/dist/esm/components/auth/methods/ExternalOAuth2AuthMethod.js.map +1 -1
- package/dist/esm/components/auth/utils/oauth-provider-display-label.frontend.utils.d.ts +13 -16
- package/dist/esm/components/auth/utils/oauth-provider-display-label.frontend.utils.d.ts.map +1 -1
- package/dist/esm/components/auth/utils/oauth-provider-display-label.frontend.utils.js +18 -15
- package/dist/esm/components/auth/utils/oauth-provider-display-label.frontend.utils.js.map +1 -1
- package/dist/esm/components/billing/billing-invoice-history.js +2 -2
- package/dist/esm/components/billing/billing-invoice-history.js.map +1 -1
- package/dist/esm/components/billing/billing-portal-link.js +2 -2
- package/dist/esm/components/billing/billing-portal-link.js.map +1 -1
- package/dist/esm/components/billing/billing-pricing-table.d.ts +33 -1
- package/dist/esm/components/billing/billing-pricing-table.d.ts.map +1 -1
- package/dist/esm/components/billing/billing-pricing-table.js +34 -5
- package/dist/esm/components/billing/billing-pricing-table.js.map +1 -1
- package/dist/esm/components/billing/billing-subscription-status.js +2 -2
- package/dist/esm/components/billing/billing-subscription-status.js.map +1 -1
- package/dist/esm/components/billing/billing-usage-dashboard.d.ts +2 -0
- package/dist/esm/components/billing/billing-usage-dashboard.d.ts.map +1 -1
- package/dist/esm/components/billing/billing-usage-dashboard.js +1 -0
- package/dist/esm/components/billing/billing-usage-dashboard.js.map +1 -1
- package/dist/esm/components/data-display/DisplayField.d.ts.map +1 -1
- package/dist/esm/components/data-display/DisplayField.js +15 -1
- package/dist/esm/components/data-display/DisplayField.js.map +1 -1
- package/dist/esm/components/data-display/DisplayFieldArray.d.ts.map +1 -1
- package/dist/esm/components/data-display/DisplayFieldArray.js +11 -0
- package/dist/esm/components/data-display/DisplayFieldArray.js.map +1 -1
- package/dist/esm/components/data-display/DisplayFieldEditable.d.ts.map +1 -1
- package/dist/esm/components/data-display/DisplayFieldEditable.js +2 -2
- package/dist/esm/components/data-display/DisplayFieldEditable.js.map +1 -1
- package/dist/esm/components/data-display/DisplayFieldEditableArray.d.ts +12 -2
- package/dist/esm/components/data-display/DisplayFieldEditableArray.d.ts.map +1 -1
- package/dist/esm/components/data-display/DisplayFieldEditableArray.js +3 -2
- package/dist/esm/components/data-display/DisplayFieldEditableArray.js.map +1 -1
- package/dist/esm/components/data-display/DisplayFieldReadOnly.d.ts.map +1 -1
- package/dist/esm/components/data-display/DisplayFieldReadOnly.js +2 -2
- package/dist/esm/components/data-display/DisplayFieldReadOnly.js.map +1 -1
- package/dist/esm/components/data-display/DisplayFieldReadOnlyArraySection.d.ts.map +1 -1
- package/dist/esm/components/data-display/DisplayFieldReadOnlyArraySection.js +8 -2
- package/dist/esm/components/data-display/DisplayFieldReadOnlyArraySection.js.map +1 -1
- package/dist/esm/components/data-display/DisplayValueDispatcher.d.ts.map +1 -1
- package/dist/esm/components/data-display/DisplayValueDispatcher.js +18 -4
- package/dist/esm/components/data-display/DisplayValueDispatcher.js.map +1 -1
- package/dist/esm/components/data-display/ResourceAutomaticDisplayer.d.ts.map +1 -1
- package/dist/esm/components/data-display/ResourceAutomaticDisplayer.js +61 -3
- package/dist/esm/components/data-display/ResourceAutomaticDisplayer.js.map +1 -1
- package/dist/esm/components/data-display/ResourceSummaryDisplayer.d.ts +7 -5
- package/dist/esm/components/data-display/ResourceSummaryDisplayer.d.ts.map +1 -1
- package/dist/esm/components/data-display/ResourceSummaryDisplayer.js.map +1 -1
- package/dist/esm/components/data-display/chromes/DisplayFieldChrome.d.ts +11 -1
- package/dist/esm/components/data-display/chromes/DisplayFieldChrome.d.ts.map +1 -1
- package/dist/esm/components/data-display/chromes/DisplayFieldChrome.js +36 -11
- package/dist/esm/components/data-display/chromes/DisplayFieldChrome.js.map +1 -1
- package/dist/esm/components/data-display/display-field-resolved-props.d.ts +6 -0
- package/dist/esm/components/data-display/display-field-resolved-props.d.ts.map +1 -1
- package/dist/esm/components/data-display/display-field-resolved-props.js.map +1 -1
- package/dist/esm/components/data-display/external-data-provenance/DisplayFieldProvenanceNote.d.ts +23 -0
- package/dist/esm/components/data-display/external-data-provenance/DisplayFieldProvenanceNote.d.ts.map +1 -0
- package/dist/esm/components/data-display/external-data-provenance/DisplayFieldProvenanceNote.js +35 -0
- package/dist/esm/components/data-display/external-data-provenance/DisplayFieldProvenanceNote.js.map +1 -0
- package/dist/esm/components/data-display/external-data-provenance/external-data-provenance.frontend.d.ts +47 -0
- package/dist/esm/components/data-display/external-data-provenance/external-data-provenance.frontend.d.ts.map +1 -0
- package/dist/esm/components/data-display/external-data-provenance/external-data-provenance.frontend.js +124 -0
- package/dist/esm/components/data-display/external-data-provenance/external-data-provenance.frontend.js.map +1 -0
- package/dist/esm/components/data-display/external-data-provenance/useExternalDataFieldProvenance.d.ts +8 -0
- package/dist/esm/components/data-display/external-data-provenance/useExternalDataFieldProvenance.d.ts.map +1 -0
- package/dist/esm/components/data-display/external-data-provenance/useExternalDataFieldProvenance.js +46 -0
- package/dist/esm/components/data-display/external-data-provenance/useExternalDataFieldProvenance.js.map +1 -0
- package/dist/esm/components/feedback/resource-empty-state.d.ts +21 -8
- package/dist/esm/components/feedback/resource-empty-state.d.ts.map +1 -1
- package/dist/esm/components/feedback/resource-empty-state.js +56 -26
- package/dist/esm/components/feedback/resource-empty-state.js.map +1 -1
- package/dist/esm/components/flows-actors/approval.d.ts +29 -7
- package/dist/esm/components/flows-actors/approval.d.ts.map +1 -1
- package/dist/esm/components/flows-actors/approval.js +231 -101
- package/dist/esm/components/flows-actors/approval.js.map +1 -1
- package/dist/esm/components/flows-actors/approval.labels.d.ts.map +1 -1
- package/dist/esm/components/flows-actors/approval.labels.js +57 -0
- package/dist/esm/components/flows-actors/approval.labels.js.map +1 -1
- package/dist/esm/components/flows-actors/system-catalog.d.ts.map +1 -1
- package/dist/esm/components/flows-actors/system-catalog.js +4 -4
- package/dist/esm/components/flows-actors/system-catalog.js.map +1 -1
- package/dist/esm/components/flows-actors/system-catalog.labels.d.ts.map +1 -1
- package/dist/esm/components/flows-actors/system-catalog.labels.js +0 -5
- package/dist/esm/components/flows-actors/system-catalog.labels.js.map +1 -1
- package/dist/esm/components/form/Form.d.ts +2 -2
- package/dist/esm/components/form/Form.js +2 -2
- package/dist/esm/components/form/Form.js.map +1 -1
- package/dist/esm/components/form/automated/AutomatedArrayField.d.ts +28 -3
- package/dist/esm/components/form/automated/AutomatedArrayField.d.ts.map +1 -1
- package/dist/esm/components/form/automated/AutomatedArrayField.js +43 -14
- package/dist/esm/components/form/automated/AutomatedArrayField.js.map +1 -1
- package/dist/esm/components/form/automated/FormField.d.ts +3 -0
- package/dist/esm/components/form/automated/FormField.d.ts.map +1 -1
- package/dist/esm/components/form/automated/FormField.js +60 -21
- package/dist/esm/components/form/automated/FormField.js.map +1 -1
- package/dist/esm/components/form/automated/FormFieldArray.d.ts +6 -3
- package/dist/esm/components/form/automated/FormFieldArray.d.ts.map +1 -1
- package/dist/esm/components/form/automated/FormFieldArray.js +3 -2
- package/dist/esm/components/form/automated/FormFieldArray.js.map +1 -1
- package/dist/esm/components/form/automated/ResourceAutomatedForm.d.ts +5 -4
- package/dist/esm/components/form/automated/ResourceAutomatedForm.d.ts.map +1 -1
- package/dist/esm/components/form/automated/ResourceAutomatedForm.js +148 -55
- package/dist/esm/components/form/automated/ResourceAutomatedForm.js.map +1 -1
- package/dist/esm/components/form/automated/ResourceFormActionsContext.d.ts +30 -0
- package/dist/esm/components/form/automated/ResourceFormActionsContext.d.ts.map +1 -1
- package/dist/esm/components/form/automated/ResourceFormActionsContext.js +30 -1
- package/dist/esm/components/form/automated/ResourceFormActionsContext.js.map +1 -1
- package/dist/esm/components/form/automated/TemplatePlacedFieldsContext.d.ts +79 -0
- package/dist/esm/components/form/automated/TemplatePlacedFieldsContext.d.ts.map +1 -0
- package/dist/esm/components/form/automated/TemplatePlacedFieldsContext.js +203 -0
- package/dist/esm/components/form/automated/TemplatePlacedFieldsContext.js.map +1 -0
- package/dist/esm/components/form/automated/automated-form-submit.utils.d.ts +12 -0
- package/dist/esm/components/form/automated/automated-form-submit.utils.d.ts.map +1 -1
- package/dist/esm/components/form/automated/automated-form-submit.utils.js +11 -0
- package/dist/esm/components/form/automated/automated-form-submit.utils.js.map +1 -1
- package/dist/esm/components/form/chromes/FormFieldChrome.d.ts.map +1 -1
- package/dist/esm/components/form/chromes/FormFieldChrome.js +2 -2
- package/dist/esm/components/form/chromes/FormFieldChrome.js.map +1 -1
- package/dist/esm/components/form/combobox.d.ts +7 -0
- package/dist/esm/components/form/combobox.d.ts.map +1 -1
- package/dist/esm/components/form/combobox.js.map +1 -1
- package/dist/esm/components/form/controls/form-field-checkbox-group.d.ts.map +1 -1
- package/dist/esm/components/form/controls/form-field-checkbox-group.js +13 -0
- package/dist/esm/components/form/controls/form-field-checkbox-group.js.map +1 -1
- package/dist/esm/components/form/fields/form-field-address.d.ts +58 -0
- package/dist/esm/components/form/fields/form-field-address.d.ts.map +1 -1
- package/dist/esm/components/form/fields/form-field-address.js +34 -6
- package/dist/esm/components/form/fields/form-field-address.js.map +1 -1
- package/dist/esm/components/form/fields/form-field-address.labels.d.ts.map +1 -1
- package/dist/esm/components/form/fields/form-field-address.labels.js +60 -1
- package/dist/esm/components/form/fields/form-field-address.labels.js.map +1 -1
- package/dist/esm/components/form/fields/form-field-file.d.ts +0 -12
- package/dist/esm/components/form/fields/form-field-file.d.ts.map +1 -1
- package/dist/esm/components/form/fields/form-field-file.js +34 -13
- package/dist/esm/components/form/fields/form-field-file.js.map +1 -1
- package/dist/esm/components/form/fields/form-field-file.labels.d.ts.map +1 -1
- package/dist/esm/components/form/fields/form-field-file.labels.js +46 -0
- package/dist/esm/components/form/fields/form-field-file.labels.js.map +1 -1
- package/dist/esm/components/form/fields/form-field-string-organization-role.d.ts +73 -0
- package/dist/esm/components/form/fields/form-field-string-organization-role.d.ts.map +1 -0
- package/dist/esm/components/form/fields/form-field-string-organization-role.js +64 -0
- package/dist/esm/components/form/fields/form-field-string-organization-role.js.map +1 -0
- package/dist/esm/components/form/fields/form-field-string.d.ts.map +1 -1
- package/dist/esm/components/form/fields/form-field-string.js +8 -1
- package/dist/esm/components/form/fields/form-field-string.js.map +1 -1
- package/dist/esm/components/form/fields/form-field-string.labels.d.ts.map +1 -1
- package/dist/esm/components/form/fields/form-field-string.labels.js +4 -0
- package/dist/esm/components/form/fields/form-field-string.labels.js.map +1 -1
- package/dist/esm/components/form/validation-errors/FormErrorSummary.js +1 -1
- package/dist/esm/components/form/validation-errors/FormErrorSummary.js.map +1 -1
- package/dist/esm/components/form/validation-errors/resolver-error-nesting.d.ts +31 -0
- package/dist/esm/components/form/validation-errors/resolver-error-nesting.d.ts.map +1 -0
- package/dist/esm/components/form/validation-errors/resolver-error-nesting.js +81 -0
- package/dist/esm/components/form/validation-errors/resolver-error-nesting.js.map +1 -0
- package/dist/esm/components/form/validation-errors/resource-error-notification-context.utils.d.ts +14 -1
- package/dist/esm/components/form/validation-errors/resource-error-notification-context.utils.d.ts.map +1 -1
- package/dist/esm/components/form/validation-errors/resource-error-notification-context.utils.js +14 -0
- package/dist/esm/components/form/validation-errors/resource-error-notification-context.utils.js.map +1 -1
- package/dist/esm/components/form/validation-errors/zod-issue-resolver.d.ts +22 -0
- package/dist/esm/components/form/validation-errors/zod-issue-resolver.d.ts.map +1 -1
- package/dist/esm/components/form/validation-errors/zod-issue-resolver.js +1 -22
- package/dist/esm/components/form/validation-errors/zod-issue-resolver.js.map +1 -1
- package/dist/esm/components/layout/resizable.d.ts +11 -0
- package/dist/esm/components/layout/resizable.d.ts.map +1 -1
- package/dist/esm/components/layout/resizable.js.map +1 -1
- package/dist/esm/components/navigation/app-level/ApplicationLevel_NavigationBack.d.ts +11 -1
- package/dist/esm/components/navigation/app-level/ApplicationLevel_NavigationBack.d.ts.map +1 -1
- package/dist/esm/components/navigation/app-level/ApplicationLevel_NavigationBack.js +15 -3
- package/dist/esm/components/navigation/app-level/ApplicationLevel_NavigationBack.js.map +1 -1
- package/dist/esm/components/navigation/app-level/ApplicationLevel_StatusBar.d.ts +2 -2
- package/dist/esm/components/navigation/app-level/ApplicationLevel_StatusBar.d.ts.map +1 -1
- package/dist/esm/components/navigation/app-level/ApplicationLevel_StatusBar.js.map +1 -1
- package/dist/esm/components/navigation/app-level/HostedComponentInteractionsProvider.d.ts +2 -2
- package/dist/esm/components/navigation/app-level/HostedComponentInteractionsProvider.js +2 -2
- package/dist/esm/components/navigation/app-level/HostedComponentInteractionsProvider.js.map +1 -1
- package/dist/esm/components/navigation/app-level/SidebarResourceBrowser.js +18 -20
- package/dist/esm/components/navigation/app-level/SidebarResourceBrowser.js.map +1 -1
- package/dist/esm/components/navigation/app-level/useCommandMenuBehavior.d.ts.map +1 -1
- package/dist/esm/components/navigation/app-level/useCommandMenuBehavior.js +7 -1
- package/dist/esm/components/navigation/app-level/useCommandMenuBehavior.js.map +1 -1
- package/dist/esm/components/navigation/app-level/useMenuBarBehavior.d.ts.map +1 -1
- package/dist/esm/components/navigation/app-level/useMenuBarBehavior.js +4 -1
- package/dist/esm/components/navigation/app-level/useMenuBarBehavior.js.map +1 -1
- package/dist/esm/components/navigation/app-level/useMenuUserOrgBehavior.d.ts.map +1 -1
- package/dist/esm/components/navigation/app-level/useMenuUserOrgBehavior.js +18 -2
- package/dist/esm/components/navigation/app-level/useMenuUserOrgBehavior.js.map +1 -1
- package/dist/esm/components/navigation/app-level/useSidebarBehavior.d.ts.map +1 -1
- package/dist/esm/components/navigation/app-level/useSidebarBehavior.js +82 -10
- package/dist/esm/components/navigation/app-level/useSidebarBehavior.js.map +1 -1
- package/dist/esm/components/navigation/app-level/useStatusBarBehavior.d.ts +2 -2
- package/dist/esm/components/navigation/app-level/useStatusBarBehavior.d.ts.map +1 -1
- package/dist/esm/components/navigation/app-level/useStatusBarBehavior.js.map +1 -1
- package/dist/esm/components/resources/ResourceCollectionQuickFilterTabs.d.ts.map +1 -1
- package/dist/esm/components/resources/ResourceCollectionQuickFilterTabs.js +8 -1
- package/dist/esm/components/resources/ResourceCollectionQuickFilterTabs.js.map +1 -1
- package/dist/esm/components/resources/ResourceCollectionToolbar.d.ts +8 -2
- package/dist/esm/components/resources/ResourceCollectionToolbar.d.ts.map +1 -1
- package/dist/esm/components/resources/ResourceCollectionToolbar.js +6 -2
- package/dist/esm/components/resources/ResourceCollectionToolbar.js.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_Breadcrumb.d.ts.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_Breadcrumb.js +31 -16
- package/dist/esm/components/resources/ResourceLayout_Breadcrumb.js.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_ContainerDialogs.d.ts.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_ContainerDialogs.js +23 -8
- package/dist/esm/components/resources/ResourceLayout_ContainerDialogs.js.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_ContainerNested.js +2 -2
- package/dist/esm/components/resources/ResourceLayout_ContainerNested.js.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_Header.d.ts +13 -0
- package/dist/esm/components/resources/ResourceLayout_Header.d.ts.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_Header.js +55 -28
- package/dist/esm/components/resources/ResourceLayout_Header.js.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_List.d.ts.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_List.js +41 -20
- package/dist/esm/components/resources/ResourceLayout_List.js.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_List.labels.d.ts.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_List.labels.js +1 -2
- package/dist/esm/components/resources/ResourceLayout_List.labels.js.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_Read.d.ts +9 -4
- package/dist/esm/components/resources/ResourceLayout_Read.d.ts.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_Read.js +30 -11
- package/dist/esm/components/resources/ResourceLayout_Read.js.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_ReadSummary.d.ts.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_ReadSummary.js +4 -2
- package/dist/esm/components/resources/ResourceLayout_ReadSummary.js.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_ReadSummary_TableRow.d.ts.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_ReadSummary_TableRow.js +6 -2
- package/dist/esm/components/resources/ResourceLayout_ReadSummary_TableRow.js.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_Search.d.ts.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_Search.js +30 -14
- package/dist/esm/components/resources/ResourceLayout_Search.js.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_SemanticOperationFallback.d.ts.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_SemanticOperationFallback.js +14 -198
- package/dist/esm/components/resources/ResourceLayout_SemanticOperationFallback.js.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_Update.d.ts +2 -2
- package/dist/esm/components/resources/ResourceLayout_Update.js +2 -2
- package/dist/esm/components/resources/ResourceLayout_Update.js.map +1 -1
- package/dist/esm/components/resources/ResourceListItemRenderer.d.ts.map +1 -1
- package/dist/esm/components/resources/ResourceListItemRenderer.js +69 -39
- package/dist/esm/components/resources/ResourceListItemRenderer.js.map +1 -1
- package/dist/esm/components/resources/ResourceOperationActionDropdown.d.ts +32 -0
- package/dist/esm/components/resources/ResourceOperationActionDropdown.d.ts.map +1 -0
- package/dist/esm/components/resources/ResourceOperationActionDropdown.js +130 -0
- package/dist/esm/components/resources/ResourceOperationActionDropdown.js.map +1 -0
- package/dist/esm/components/resources/collection-create-placement.utils.d.ts +32 -0
- package/dist/esm/components/resources/collection-create-placement.utils.d.ts.map +1 -0
- package/dist/esm/components/resources/collection-create-placement.utils.js +37 -0
- package/dist/esm/components/resources/collection-create-placement.utils.js.map +1 -0
- package/dist/esm/components/resources/embeds/RelatedResourcePreview.d.ts.map +1 -1
- package/dist/esm/components/resources/embeds/RelatedResourcePreview.js +5 -1
- package/dist/esm/components/resources/embeds/RelatedResourcePreview.js.map +1 -1
- package/dist/esm/components/resources/embeds/RelatedResourceSections.d.ts +8 -1
- package/dist/esm/components/resources/embeds/RelatedResourceSections.d.ts.map +1 -1
- package/dist/esm/components/resources/embeds/RelatedResourceSections.js +49 -2
- package/dist/esm/components/resources/embeds/RelatedResourceSections.js.map +1 -1
- package/dist/esm/components/resources/embeds/ResourceEmbeds.d.ts +22 -0
- package/dist/esm/components/resources/embeds/ResourceEmbeds.d.ts.map +1 -1
- package/dist/esm/components/resources/embeds/ResourceEmbeds.js +85 -2
- package/dist/esm/components/resources/embeds/ResourceEmbeds.js.map +1 -1
- package/dist/esm/components/resources/resourceLayout.utils.d.ts +14 -0
- package/dist/esm/components/resources/resourceLayout.utils.d.ts.map +1 -1
- package/dist/esm/components/resources/resourceLayout.utils.js +22 -0
- package/dist/esm/components/resources/resourceLayout.utils.js.map +1 -1
- package/dist/esm/components/resources/skeleton/ArrayField.d.ts.map +1 -1
- package/dist/esm/components/resources/skeleton/ArrayField.js +3 -0
- package/dist/esm/components/resources/skeleton/ArrayField.js.map +1 -1
- package/dist/esm/components/resources/skeleton/FormLayout.d.ts.map +1 -1
- package/dist/esm/components/resources/skeleton/FormLayout.js +33 -1
- package/dist/esm/components/resources/skeleton/FormLayout.js.map +1 -1
- package/dist/esm/components/resources/skeleton/ObjectScope.d.ts.map +1 -1
- package/dist/esm/components/resources/skeleton/ObjectScope.js +3 -0
- package/dist/esm/components/resources/skeleton/ObjectScope.js.map +1 -1
- package/dist/esm/components/resources/skeleton/Section.d.ts +12 -0
- package/dist/esm/components/resources/skeleton/Section.d.ts.map +1 -1
- package/dist/esm/components/resources/skeleton/Section.js +28 -2
- package/dist/esm/components/resources/skeleton/Section.js.map +1 -1
- package/dist/esm/components/resources/skeleton/SectionFieldsContext.d.ts +70 -0
- package/dist/esm/components/resources/skeleton/SectionFieldsContext.d.ts.map +1 -1
- package/dist/esm/components/resources/skeleton/SectionFieldsContext.js +157 -1
- package/dist/esm/components/resources/skeleton/SectionFieldsContext.js.map +1 -1
- package/dist/esm/components/resources/skeleton/WizardLayout.d.ts +6 -0
- package/dist/esm/components/resources/skeleton/WizardLayout.d.ts.map +1 -1
- package/dist/esm/components/resources/skeleton/WizardLayout.js +13 -2
- package/dist/esm/components/resources/skeleton/WizardLayout.js.map +1 -1
- package/dist/esm/components/resources/skeleton/WizardStep.d.ts.map +1 -1
- package/dist/esm/components/resources/skeleton/WizardStep.js +2 -1
- package/dist/esm/components/resources/skeleton/WizardStep.js.map +1 -1
- package/dist/esm/components/resources-fields/_presets/resource-reference/ResourceFieldDisplayPreset_ResourceReference_Default.d.ts.map +1 -1
- package/dist/esm/components/resources-fields/_presets/resource-reference/ResourceFieldDisplayPreset_ResourceReference_Default.js +61 -15
- package/dist/esm/components/resources-fields/_presets/resource-reference/ResourceFieldDisplayPreset_ResourceReference_Default.js.map +1 -1
- package/dist/esm/components/resources-fields/resource-reference/resource-reference.shared.utils.d.ts +24 -2
- package/dist/esm/components/resources-fields/resource-reference/resource-reference.shared.utils.d.ts.map +1 -1
- package/dist/esm/components/resources-fields/resource-reference/resource-reference.shared.utils.js +69 -1
- package/dist/esm/components/resources-fields/resource-reference/resource-reference.shared.utils.js.map +1 -1
- package/dist/esm/components/resources-fields/resource-reference/useResourceSearch.d.ts.map +1 -1
- package/dist/esm/components/resources-fields/resource-reference/useResourceSearch.js +18 -19
- package/dist/esm/components/resources-fields/resource-reference/useResourceSearch.js.map +1 -1
- package/dist/esm/components/sections/ContentSectionContainer.d.ts.map +1 -1
- package/dist/esm/components/sections/ContentSectionContainer.js +5 -4
- package/dist/esm/components/sections/ContentSectionContainer.js.map +1 -1
- package/dist/esm/components/sections/stepper.d.ts +5 -0
- package/dist/esm/components/sections/stepper.d.ts.map +1 -1
- package/dist/esm/components/sections/stepper.js.map +1 -1
- package/dist/esm/components/sections/surface.d.ts.map +1 -1
- package/dist/esm/components/sections/surface.js +12 -3
- package/dist/esm/components/sections/surface.js.map +1 -1
- package/dist/esm/components/settings/AppPage_AgentWorkOverrideRateSettings.d.ts +43 -0
- package/dist/esm/components/settings/AppPage_AgentWorkOverrideRateSettings.d.ts.map +1 -0
- package/dist/esm/components/settings/AppPage_AgentWorkOverrideRateSettings.js +129 -0
- package/dist/esm/components/settings/AppPage_AgentWorkOverrideRateSettings.js.map +1 -0
- package/dist/esm/components/settings/AppPage_AgentWorkOverrideRateSettings.labels.d.ts +3 -0
- package/dist/esm/components/settings/AppPage_AgentWorkOverrideRateSettings.labels.d.ts.map +1 -0
- package/dist/esm/components/settings/AppPage_AgentWorkOverrideRateSettings.labels.js +34 -0
- package/dist/esm/components/settings/AppPage_AgentWorkOverrideRateSettings.labels.js.map +1 -0
- package/dist/esm/components/settings/AppPage_AppearanceSettings.d.ts.map +1 -1
- package/dist/esm/components/settings/AppPage_AppearanceSettings.js +9 -11
- package/dist/esm/components/settings/AppPage_AppearanceSettings.js.map +1 -1
- package/dist/esm/components/settings/AppPage_AppearanceSettings.labels.d.ts.map +1 -1
- package/dist/esm/components/settings/AppPage_AppearanceSettings.labels.js +3 -2
- package/dist/esm/components/settings/AppPage_AppearanceSettings.labels.js.map +1 -1
- package/dist/esm/components/settings/AppPage_BillingSettings.d.ts +4 -2
- package/dist/esm/components/settings/AppPage_BillingSettings.d.ts.map +1 -1
- package/dist/esm/components/settings/AppPage_BillingSettings.js +21 -3
- package/dist/esm/components/settings/AppPage_BillingSettings.js.map +1 -1
- package/dist/esm/components/settings/AppPage_BillingSettings.labels.d.ts.map +1 -1
- package/dist/esm/components/settings/AppPage_BillingSettings.labels.js +5 -10
- package/dist/esm/components/settings/AppPage_BillingSettings.labels.js.map +1 -1
- package/dist/esm/components/settings/AppPage_ConnectedAccountsSettings.d.ts +58 -0
- package/dist/esm/components/settings/AppPage_ConnectedAccountsSettings.d.ts.map +1 -1
- package/dist/esm/components/settings/AppPage_ConnectedAccountsSettings.js +243 -40
- package/dist/esm/components/settings/AppPage_ConnectedAccountsSettings.js.map +1 -1
- package/dist/esm/components/settings/AppPage_ConnectedAccountsSettings.labels.d.ts.map +1 -1
- package/dist/esm/components/settings/AppPage_ConnectedAccountsSettings.labels.js +67 -6
- package/dist/esm/components/settings/AppPage_ConnectedAccountsSettings.labels.js.map +1 -1
- package/dist/esm/components/settings/AppPage_InvitationsSettings.d.ts.map +1 -1
- package/dist/esm/components/settings/AppPage_InvitationsSettings.js +19 -11
- package/dist/esm/components/settings/AppPage_InvitationsSettings.js.map +1 -1
- package/dist/esm/components/settings/AppPage_InvitationsSettings.labels.d.ts.map +1 -1
- package/dist/esm/components/settings/AppPage_InvitationsSettings.labels.js +4 -2
- package/dist/esm/components/settings/AppPage_InvitationsSettings.labels.js.map +1 -1
- package/dist/esm/components/settings/SettingsHub.d.ts.map +1 -1
- package/dist/esm/components/settings/SettingsHub.js +3 -0
- package/dist/esm/components/settings/SettingsHub.js.map +1 -1
- package/dist/esm/components/settings/SettingsResourceOperationPanel.d.ts.map +1 -1
- package/dist/esm/components/settings/SettingsResourceOperationPanel.js +16 -1
- package/dist/esm/components/settings/SettingsResourceOperationPanel.js.map +1 -1
- package/dist/esm/components/settings/useOwnerProviderConnections.d.ts +59 -0
- package/dist/esm/components/settings/useOwnerProviderConnections.d.ts.map +1 -0
- package/dist/esm/components/settings/useOwnerProviderConnections.js +136 -0
- package/dist/esm/components/settings/useOwnerProviderConnections.js.map +1 -0
- package/dist/esm/components/views/chart-view/chart-view.utils.d.ts +5 -0
- package/dist/esm/components/views/chart-view/chart-view.utils.d.ts.map +1 -1
- package/dist/esm/components/views/chart-view/chart-view.utils.js +5 -0
- package/dist/esm/components/views/chart-view/chart-view.utils.js.map +1 -1
- package/dist/esm/components/views/chart-view/useResourceChartData.d.ts +50 -0
- package/dist/esm/components/views/chart-view/useResourceChartData.d.ts.map +1 -0
- package/dist/esm/components/views/chart-view/useResourceChartData.js +72 -0
- package/dist/esm/components/views/chart-view/useResourceChartData.js.map +1 -0
- package/dist/esm/components/views/composite-view/CompositeLayout.d.ts.map +1 -1
- package/dist/esm/components/views/composite-view/CompositeLayout.js +2 -1
- package/dist/esm/components/views/composite-view/CompositeLayout.js.map +1 -1
- package/dist/esm/core/app-shell/AppShellBuildingBlocks.d.ts +86 -0
- package/dist/esm/core/app-shell/AppShellBuildingBlocks.d.ts.map +1 -0
- package/dist/esm/core/app-shell/AppShellBuildingBlocks.js +187 -0
- package/dist/esm/core/app-shell/AppShellBuildingBlocks.js.map +1 -0
- package/dist/esm/core/app-shell/PortalContainerContext.d.ts +5 -2
- package/dist/esm/core/app-shell/PortalContainerContext.d.ts.map +1 -1
- package/dist/esm/core/app-shell/PortalContainerContext.js +5 -2
- package/dist/esm/core/app-shell/PortalContainerContext.js.map +1 -1
- package/dist/esm/core/app-shell/app-shell.schemas.d.ts +18 -9
- package/dist/esm/core/app-shell/app-shell.schemas.d.ts.map +1 -1
- package/dist/esm/core/app-shell/app-shell.schemas.js +1 -0
- package/dist/esm/core/app-shell/app-shell.schemas.js.map +1 -1
- package/dist/esm/core/app-shell/useAppShellLayout.d.ts +10 -0
- package/dist/esm/core/app-shell/useAppShellLayout.d.ts.map +1 -1
- package/dist/esm/core/app-shell/useAppShellLayout.js +28 -5
- package/dist/esm/core/app-shell/useAppShellLayout.js.map +1 -1
- package/dist/esm/core/app-shell/usePublicShellLayout.d.ts.map +1 -1
- package/dist/esm/core/app-shell/usePublicShellLayout.js +38 -0
- package/dist/esm/core/app-shell/usePublicShellLayout.js.map +1 -1
- package/dist/esm/core/automated-layout/automated-layout.frontend.utils.d.ts +15 -1
- package/dist/esm/core/automated-layout/automated-layout.frontend.utils.d.ts.map +1 -1
- package/dist/esm/core/automated-layout/automated-layout.frontend.utils.js +47 -13
- package/dist/esm/core/automated-layout/automated-layout.frontend.utils.js.map +1 -1
- package/dist/esm/core/billing/BillingContext.d.ts +25 -2
- package/dist/esm/core/billing/BillingContext.d.ts.map +1 -1
- package/dist/esm/core/billing/BillingContext.js +16 -25
- package/dist/esm/core/billing/BillingContext.js.map +1 -1
- package/dist/esm/core/billing/billing-provider-display.frontend.utils.d.ts +11 -3
- package/dist/esm/core/billing/billing-provider-display.frontend.utils.d.ts.map +1 -1
- package/dist/esm/core/billing/billing-provider-display.frontend.utils.js +14 -8
- package/dist/esm/core/billing/billing-provider-display.frontend.utils.js.map +1 -1
- package/dist/esm/core/billing/useBillingPlanChange.d.ts.map +1 -1
- package/dist/esm/core/billing/useBillingPlanChange.js +2 -0
- package/dist/esm/core/billing/useBillingPlanChange.js.map +1 -1
- package/dist/esm/core/components-registry/assert-registry-completeness.frontend.helper.d.ts.map +1 -1
- package/dist/esm/core/components-registry/assert-registry-completeness.frontend.helper.js +1 -0
- package/dist/esm/core/components-registry/assert-registry-completeness.frontend.helper.js.map +1 -1
- package/dist/esm/core/components-registry/provider-component-registry.frontend.service.d.ts +29 -229
- package/dist/esm/core/components-registry/provider-component-registry.frontend.service.d.ts.map +1 -1
- package/dist/esm/core/components-registry/provider-component-registry.frontend.service.js +29 -327
- package/dist/esm/core/components-registry/provider-component-registry.frontend.service.js.map +1 -1
- package/dist/esm/core/components-registry/useProviderComponent.frontend.hooks.d.ts +17 -27
- package/dist/esm/core/components-registry/useProviderComponent.frontend.hooks.d.ts.map +1 -1
- package/dist/esm/core/components-registry/useProviderComponent.frontend.hooks.js +28 -48
- package/dist/esm/core/components-registry/useProviderComponent.frontend.hooks.js.map +1 -1
- package/dist/esm/core/config/app-configuration-frontend.schemas.d.ts +21 -11
- package/dist/esm/core/config/app-configuration-frontend.schemas.d.ts.map +1 -1
- package/dist/esm/core/config/app-configuration-frontend.schemas.js +4 -4
- package/dist/esm/core/config/app-configuration-frontend.schemas.js.map +1 -1
- package/dist/esm/core/config/app-level-components.frontend.schemas.d.ts +17 -0
- package/dist/esm/core/config/app-level-components.frontend.schemas.d.ts.map +1 -1
- package/dist/esm/core/config/app-level-components.frontend.schemas.js +17 -0
- package/dist/esm/core/config/app-level-components.frontend.schemas.js.map +1 -1
- package/dist/esm/core/config/chart-view.frontend.schemas.d.ts +10 -10
- package/dist/esm/core/config/engine-settings-destinations.d.ts.map +1 -1
- package/dist/esm/core/config/engine-settings-destinations.js +221 -6
- package/dist/esm/core/config/engine-settings-destinations.js.map +1 -1
- package/dist/esm/core/config/launcher-items.frontend.schemas.d.ts +8 -0
- package/dist/esm/core/config/launcher-items.frontend.schemas.d.ts.map +1 -1
- package/dist/esm/core/config/launcher-items.frontend.schemas.js +1 -0
- package/dist/esm/core/config/launcher-items.frontend.schemas.js.map +1 -1
- package/dist/esm/core/config/settings-hub.frontend.schemas.d.ts +10 -1
- package/dist/esm/core/config/settings-hub.frontend.schemas.d.ts.map +1 -1
- package/dist/esm/core/config/settings-hub.frontend.schemas.js +9 -0
- package/dist/esm/core/config/settings-hub.frontend.schemas.js.map +1 -1
- package/dist/esm/core/config/verify-launcher-content.d.ts.map +1 -1
- package/dist/esm/core/config/verify-launcher-content.js +30 -19
- package/dist/esm/core/config/verify-launcher-content.js.map +1 -1
- package/dist/esm/core/errors/ErrorContext.d.ts.map +1 -1
- package/dist/esm/core/errors/ErrorContext.js +9 -1
- package/dist/esm/core/errors/ErrorContext.js.map +1 -1
- package/dist/esm/core/errors/GlobalErrorHandler.d.ts.map +1 -1
- package/dist/esm/core/errors/GlobalErrorHandler.js +5 -4
- package/dist/esm/core/errors/GlobalErrorHandler.js.map +1 -1
- package/dist/esm/core/errors/RouterErrorBoundary.js +1 -1
- package/dist/esm/core/errors/RouterErrorBoundary.js.map +1 -1
- package/dist/esm/core/errors/errors-builder.frontend.services.d.ts +2 -2
- package/dist/esm/core/errors/errors-builder.frontend.services.d.ts.map +1 -1
- package/dist/esm/core/errors/errors-builder.frontend.services.js +4 -4
- package/dist/esm/core/errors/errors-builder.frontend.services.js.map +1 -1
- package/dist/esm/core/errors/user-facing-error-message.frontend.utils.js +1 -1
- package/dist/esm/core/errors/user-facing-error-message.frontend.utils.js.map +1 -1
- package/dist/esm/core/events/NotificationContext.d.ts.map +1 -1
- package/dist/esm/core/events/NotificationContext.js +23 -5
- package/dist/esm/core/events/NotificationContext.js.map +1 -1
- package/dist/esm/core/events/events.frontend.schemas.d.ts +110 -43
- package/dist/esm/core/events/events.frontend.schemas.d.ts.map +1 -1
- package/dist/esm/core/events/events.frontend.schemas.js +89 -15
- package/dist/esm/core/events/events.frontend.schemas.js.map +1 -1
- package/dist/esm/core/execution/useExecutionParticipationRMM.d.ts +2 -0
- package/dist/esm/core/execution/useExecutionParticipationRMM.d.ts.map +1 -1
- package/dist/esm/core/execution/useExecutionParticipationRMM.js +2 -1
- package/dist/esm/core/execution/useExecutionParticipationRMM.js.map +1 -1
- package/dist/esm/core/execution/useExecutionResourceOperationSurface.d.ts +1 -1
- package/dist/esm/core/execution/useExecutionResourceOperationSurface.d.ts.map +1 -1
- package/dist/esm/core/execution/useExecutionResourceOperationSurface.js +5 -2
- package/dist/esm/core/execution/useExecutionResourceOperationSurface.js.map +1 -1
- package/dist/esm/core/external-providers/ConsentBasedProviderSdks.d.ts +63 -0
- package/dist/esm/core/external-providers/ConsentBasedProviderSdks.d.ts.map +1 -0
- package/dist/esm/core/external-providers/ConsentBasedProviderSdks.js +131 -0
- package/dist/esm/core/external-providers/ConsentBasedProviderSdks.js.map +1 -0
- package/dist/esm/core/external-providers/ProviderAddressLookupCombobox.d.ts +61 -0
- package/dist/esm/core/external-providers/ProviderAddressLookupCombobox.d.ts.map +1 -0
- package/dist/esm/core/external-providers/ProviderAddressLookupCombobox.js +178 -0
- package/dist/esm/core/external-providers/ProviderAddressLookupCombobox.js.map +1 -0
- package/dist/esm/core/external-providers/ProviderAddressLookupHost.d.ts +52 -0
- package/dist/esm/core/external-providers/ProviderAddressLookupHost.d.ts.map +1 -0
- package/dist/esm/core/external-providers/ProviderAddressLookupHost.js +144 -0
- package/dist/esm/core/external-providers/ProviderAddressLookupHost.js.map +1 -0
- package/dist/esm/core/external-providers/ProviderFilePickerHost.d.ts +22 -1
- package/dist/esm/core/external-providers/ProviderFilePickerHost.d.ts.map +1 -1
- package/dist/esm/core/external-providers/ProviderFilePickerHost.js +23 -3
- package/dist/esm/core/external-providers/ProviderFilePickerHost.js.map +1 -1
- package/dist/esm/core/external-providers/provider-address-lookup-selection.frontend.utils.d.ts +55 -0
- package/dist/esm/core/external-providers/provider-address-lookup-selection.frontend.utils.d.ts.map +1 -0
- package/dist/esm/core/external-providers/provider-address-lookup-selection.frontend.utils.js +65 -0
- package/dist/esm/core/external-providers/provider-address-lookup-selection.frontend.utils.js.map +1 -0
- package/dist/esm/core/external-providers/provider-scope-reauthorization-offers.frontend.d.ts +63 -0
- package/dist/esm/core/external-providers/provider-scope-reauthorization-offers.frontend.d.ts.map +1 -0
- package/dist/esm/core/external-providers/provider-scope-reauthorization-offers.frontend.js +100 -0
- package/dist/esm/core/external-providers/provider-scope-reauthorization-offers.frontend.js.map +1 -0
- package/dist/esm/core/flows-actors/FlowsActorsContext.d.ts +45 -7
- package/dist/esm/core/flows-actors/FlowsActorsContext.d.ts.map +1 -1
- package/dist/esm/core/flows-actors/FlowsActorsContext.js +112 -28
- package/dist/esm/core/flows-actors/FlowsActorsContext.js.map +1 -1
- package/dist/esm/core/flows-actors/usePendingDecisions.d.ts +32 -0
- package/dist/esm/core/flows-actors/usePendingDecisions.d.ts.map +1 -0
- package/dist/esm/core/flows-actors/usePendingDecisions.js +91 -0
- package/dist/esm/core/flows-actors/usePendingDecisions.js.map +1 -0
- package/dist/esm/core/guidance/GuidanceRenderer.d.ts.map +1 -1
- package/dist/esm/core/guidance/GuidanceRenderer.js +3 -2
- package/dist/esm/core/guidance/GuidanceRenderer.js.map +1 -1
- package/dist/esm/core/i18n/I18nContext.d.ts +22 -8
- package/dist/esm/core/i18n/I18nContext.d.ts.map +1 -1
- package/dist/esm/core/i18n/I18nContext.js +21 -9
- package/dist/esm/core/i18n/I18nContext.js.map +1 -1
- package/dist/esm/core/i18n/component-label-resolution.utils.d.ts +5 -3
- package/dist/esm/core/i18n/component-label-resolution.utils.d.ts.map +1 -1
- package/dist/esm/core/i18n/component-label-resolution.utils.js +5 -3
- package/dist/esm/core/i18n/component-label-resolution.utils.js.map +1 -1
- package/dist/esm/core/i18n/useI18n.d.ts +2 -1
- package/dist/esm/core/i18n/useI18n.d.ts.map +1 -1
- package/dist/esm/core/i18n/useI18n.js +2 -1
- package/dist/esm/core/i18n/useI18n.js.map +1 -1
- package/dist/esm/core/loading/LoadingContext.d.ts.map +1 -1
- package/dist/esm/core/loading/LoadingContext.js +7 -1
- package/dist/esm/core/loading/LoadingContext.js.map +1 -1
- package/dist/esm/core/loading/LoadingGate.d.ts.map +1 -1
- package/dist/esm/core/loading/LoadingGate.js +19 -1
- package/dist/esm/core/loading/LoadingGate.js.map +1 -1
- package/dist/esm/core/monitoring/analytics/AnalyticsContext.d.ts +15 -2
- package/dist/esm/core/monitoring/analytics/AnalyticsContext.d.ts.map +1 -1
- package/dist/esm/core/monitoring/analytics/AnalyticsContext.js +183 -20
- package/dist/esm/core/monitoring/analytics/AnalyticsContext.js.map +1 -1
- package/dist/esm/core/monitoring/analytics/AnalyticsEventBridge.js +2 -2
- package/dist/esm/core/monitoring/analytics/AnalyticsEventBridge.js.map +1 -1
- package/dist/esm/core/monitoring/analytics/analytics-provider-registry.frontend.service.d.ts +7 -15
- package/dist/esm/core/monitoring/analytics/analytics-provider-registry.frontend.service.d.ts.map +1 -1
- package/dist/esm/core/monitoring/analytics/analytics-provider-registry.frontend.service.js +8 -26
- package/dist/esm/core/monitoring/analytics/analytics-provider-registry.frontend.service.js.map +1 -1
- package/dist/esm/core/monitoring/analytics/analytics-provider.frontend.interface.d.ts +12 -3
- package/dist/esm/core/monitoring/analytics/analytics-provider.frontend.interface.d.ts.map +1 -1
- package/dist/esm/core/monitoring/analytics/analytics-provider.frontend.interface.js +3 -2
- package/dist/esm/core/monitoring/analytics/analytics-provider.frontend.interface.js.map +1 -1
- package/dist/esm/core/monitoring/analytics/providers/backend-proxy-analytics.provider.d.ts +42 -0
- package/dist/esm/core/monitoring/analytics/providers/backend-proxy-analytics.provider.d.ts.map +1 -1
- package/dist/esm/core/monitoring/analytics/providers/backend-proxy-analytics.provider.js +89 -5
- package/dist/esm/core/monitoring/analytics/providers/backend-proxy-analytics.provider.js.map +1 -1
- package/dist/esm/core/monitoring/analytics/providers/console-analytics.provider.d.ts +2 -0
- package/dist/esm/core/monitoring/analytics/providers/console-analytics.provider.d.ts.map +1 -1
- package/dist/esm/core/monitoring/analytics/providers/console-analytics.provider.js +2 -0
- package/dist/esm/core/monitoring/analytics/providers/console-analytics.provider.js.map +1 -1
- package/dist/esm/core/navigation/NavigationContentAreas.d.ts +78 -0
- package/dist/esm/core/navigation/NavigationContentAreas.d.ts.map +1 -1
- package/dist/esm/core/navigation/NavigationContentAreas.js +264 -16
- package/dist/esm/core/navigation/NavigationContentAreas.js.map +1 -1
- package/dist/esm/core/navigation/NavigationContext.d.ts +8 -0
- package/dist/esm/core/navigation/NavigationContext.d.ts.map +1 -1
- package/dist/esm/core/navigation/NavigationContext.js +137 -30
- package/dist/esm/core/navigation/NavigationContext.js.map +1 -1
- package/dist/esm/core/navigation/launcher-resolution.d.ts +2 -0
- package/dist/esm/core/navigation/launcher-resolution.d.ts.map +1 -1
- package/dist/esm/core/navigation/launcher-resolution.js +1 -0
- package/dist/esm/core/navigation/launcher-resolution.js.map +1 -1
- package/dist/esm/core/navigation/navigation-cascade.d.ts +46 -0
- package/dist/esm/core/navigation/navigation-cascade.d.ts.map +1 -0
- package/dist/esm/core/navigation/navigation-cascade.js +222 -0
- package/dist/esm/core/navigation/navigation-cascade.js.map +1 -0
- package/dist/esm/core/navigation/navigation-clean-break.frontend.utils.d.ts.map +1 -1
- package/dist/esm/core/navigation/navigation-clean-break.frontend.utils.js +21 -2
- package/dist/esm/core/navigation/navigation-clean-break.frontend.utils.js.map +1 -1
- package/dist/esm/core/navigation/navigation-controller-internals.d.ts +71 -0
- package/dist/esm/core/navigation/navigation-controller-internals.d.ts.map +1 -0
- package/dist/esm/core/navigation/navigation-controller-internals.js +84 -0
- package/dist/esm/core/navigation/navigation-controller-internals.js.map +1 -0
- package/dist/esm/core/navigation/navigation-policy-resolver.service.d.ts +86 -2
- package/dist/esm/core/navigation/navigation-policy-resolver.service.d.ts.map +1 -1
- package/dist/esm/core/navigation/navigation-policy-resolver.service.js +242 -124
- package/dist/esm/core/navigation/navigation-policy-resolver.service.js.map +1 -1
- package/dist/esm/core/navigation/navigation.schemas.d.ts +170 -8
- package/dist/esm/core/navigation/navigation.schemas.d.ts.map +1 -1
- package/dist/esm/core/navigation/navigation.schemas.js +121 -2
- package/dist/esm/core/navigation/navigation.schemas.js.map +1 -1
- package/dist/esm/core/navigation/navigation.utils.d.ts +102 -6
- package/dist/esm/core/navigation/navigation.utils.d.ts.map +1 -1
- package/dist/esm/core/navigation/navigation.utils.js +283 -34
- package/dist/esm/core/navigation/navigation.utils.js.map +1 -1
- package/dist/esm/core/navigation/useIsStackEntryActive.d.ts +0 -10
- package/dist/esm/core/navigation/useIsStackEntryActive.d.ts.map +0 -1
- package/dist/esm/core/navigation/useIsStackEntryActive.js.map +0 -1
- package/dist/esm/core/navigation/useNavigationController.d.ts +28 -157
- package/dist/esm/core/navigation/useNavigationController.d.ts.map +1 -1
- package/dist/esm/core/navigation/useNavigationController.js +211 -1189
- package/dist/esm/core/navigation/useNavigationController.js.map +1 -1
- package/dist/esm/core/navigation/useNavigationRouterSync.d.ts +174 -0
- package/dist/esm/core/navigation/useNavigationRouterSync.d.ts.map +1 -0
- package/dist/esm/core/navigation/useNavigationRouterSync.js +977 -0
- package/dist/esm/core/navigation/useNavigationRouterSync.js.map +1 -0
- package/dist/esm/core/navigation/useOverlayTitle.d.ts +13 -1
- package/dist/esm/core/navigation/useOverlayTitle.d.ts.map +1 -1
- package/dist/esm/core/navigation/useOverlayTitle.js +15 -10
- package/dist/esm/core/navigation/useOverlayTitle.js.map +1 -1
- package/dist/esm/core/navigation/useResponsiveZoneMigration.d.ts +43 -0
- package/dist/esm/core/navigation/useResponsiveZoneMigration.d.ts.map +1 -0
- package/dist/esm/core/navigation/useResponsiveZoneMigration.js +44 -0
- package/dist/esm/core/navigation/useResponsiveZoneMigration.js.map +1 -0
- package/dist/esm/core/navigation/zone-collapse-migration.d.ts +83 -0
- package/dist/esm/core/navigation/zone-collapse-migration.d.ts.map +1 -0
- package/dist/esm/core/navigation/zone-collapse-migration.js +116 -0
- package/dist/esm/core/navigation/zone-collapse-migration.js.map +1 -0
- package/dist/esm/core/navigation/zone-collapse.d.ts +51 -0
- package/dist/esm/core/navigation/zone-collapse.d.ts.map +1 -0
- package/dist/esm/core/navigation/zone-collapse.js +59 -0
- package/dist/esm/core/navigation/zone-collapse.js.map +1 -0
- package/dist/esm/core/navigation/zone-emphasis.d.ts +3 -0
- package/dist/esm/core/navigation/zone-emphasis.d.ts.map +1 -1
- package/dist/esm/core/navigation/zone-emphasis.js +26 -4
- package/dist/esm/core/navigation/zone-emphasis.js.map +1 -1
- package/dist/esm/core/navigation/zone-visible-entry.d.ts +22 -0
- package/dist/esm/core/navigation/zone-visible-entry.d.ts.map +1 -1
- package/dist/esm/core/navigation/zone-visible-entry.js +25 -0
- package/dist/esm/core/navigation/zone-visible-entry.js.map +1 -1
- package/dist/esm/core/requests/websockets/WebSocketContext.d.ts.map +1 -1
- package/dist/esm/core/requests/websockets/WebSocketContext.js +53 -18
- package/dist/esm/core/requests/websockets/WebSocketContext.js.map +1 -1
- package/dist/esm/core/requests/websockets/WebSocketEventBridge.d.ts.map +1 -1
- package/dist/esm/core/requests/websockets/WebSocketEventBridge.js +3 -1
- package/dist/esm/core/requests/websockets/WebSocketEventBridge.js.map +1 -1
- package/dist/esm/core/requests/websockets/useNotificationBadges.d.ts +22 -0
- package/dist/esm/core/requests/websockets/useNotificationBadges.d.ts.map +1 -1
- package/dist/esm/core/requests/websockets/useNotificationBadges.js +72 -3
- package/dist/esm/core/requests/websockets/useNotificationBadges.js.map +1 -1
- package/dist/esm/core/requests/websockets/usePublishNotificationBadgeCount.d.ts +28 -0
- package/dist/esm/core/requests/websockets/usePublishNotificationBadgeCount.d.ts.map +1 -0
- package/dist/esm/core/requests/websockets/usePublishNotificationBadgeCount.js +86 -0
- package/dist/esm/core/requests/websockets/usePublishNotificationBadgeCount.js.map +1 -0
- package/dist/esm/core/requests/wildo-http-client-manual-calls.frontend.service.d.ts +38 -3
- package/dist/esm/core/requests/wildo-http-client-manual-calls.frontend.service.d.ts.map +1 -1
- package/dist/esm/core/requests/wildo-http-client-manual-calls.frontend.service.js +57 -2
- package/dist/esm/core/requests/wildo-http-client-manual-calls.frontend.service.js.map +1 -1
- package/dist/esm/core/requests/wildo-http-client-resources.frontend.service.d.ts.map +1 -1
- package/dist/esm/core/requests/wildo-http-client-resources.frontend.service.js +4 -2
- package/dist/esm/core/requests/wildo-http-client-resources.frontend.service.js.map +1 -1
- package/dist/esm/core/requests/wildo-http-client.frontend.service.d.ts +30 -1
- package/dist/esm/core/requests/wildo-http-client.frontend.service.d.ts.map +1 -1
- package/dist/esm/core/requests/wildo-http-client.frontend.service.js +47 -4
- package/dist/esm/core/requests/wildo-http-client.frontend.service.js.map +1 -1
- package/dist/esm/core/resources/ResourceRegistryContext.d.ts.map +1 -1
- package/dist/esm/core/resources/ResourceRegistryContext.js +22 -1
- package/dist/esm/core/resources/ResourceRegistryContext.js.map +1 -1
- package/dist/esm/core/resources/context-resource-identifiers.frontend.utils.js +1 -1
- package/dist/esm/core/resources/context-resource-identifiers.frontend.utils.js.map +1 -1
- package/dist/esm/core/resources/frontend-resource.utils.d.ts +22 -1
- package/dist/esm/core/resources/frontend-resource.utils.d.ts.map +1 -1
- package/dist/esm/core/resources/frontend-resource.utils.js +25 -2
- package/dist/esm/core/resources/frontend-resource.utils.js.map +1 -1
- package/dist/esm/core/resources/operation-semantics.frontend.utils.d.ts +113 -13
- package/dist/esm/core/resources/operation-semantics.frontend.utils.d.ts.map +1 -1
- package/dist/esm/core/resources/operation-semantics.frontend.utils.js +173 -20
- package/dist/esm/core/resources/operation-semantics.frontend.utils.js.map +1 -1
- package/dist/esm/core/resources/relationship-surface-runtime.frontend.utils.d.ts +11 -0
- package/dist/esm/core/resources/relationship-surface-runtime.frontend.utils.d.ts.map +1 -1
- package/dist/esm/core/resources/relationship-surface-runtime.frontend.utils.js +7 -0
- package/dist/esm/core/resources/relationship-surface-runtime.frontend.utils.js.map +1 -1
- package/dist/esm/core/resources/resource-label-field-paths.frontend.utils.d.ts +3 -2
- package/dist/esm/core/resources/resource-label-field-paths.frontend.utils.d.ts.map +1 -1
- package/dist/esm/core/resources/resource-label-field-paths.frontend.utils.js +13 -5
- package/dist/esm/core/resources/resource-label-field-paths.frontend.utils.js.map +1 -1
- package/dist/esm/core/resources/resources-repository.frontend.service.d.ts +6 -0
- package/dist/esm/core/resources/resources-repository.frontend.service.d.ts.map +1 -1
- package/dist/esm/core/resources/resources-repository.frontend.service.js +90 -1
- package/dist/esm/core/resources/resources-repository.frontend.service.js.map +1 -1
- package/dist/esm/core/resources/resources.frontend.schemas.d.ts +139 -16
- package/dist/esm/core/resources/resources.frontend.schemas.d.ts.map +1 -1
- package/dist/esm/core/resources/resources.frontend.schemas.js +110 -11
- package/dist/esm/core/resources/resources.frontend.schemas.js.map +1 -1
- package/dist/esm/core/resources/rmm/ResourceMutationManager.d.ts.map +1 -1
- package/dist/esm/core/resources/rmm/ResourceMutationManager.js +3 -1
- package/dist/esm/core/resources/rmm/ResourceMutationManager.js.map +1 -1
- package/dist/esm/core/resources/rmm/update-like-mutation-fallback.frontend.d.ts +10 -0
- package/dist/esm/core/resources/rmm/update-like-mutation-fallback.frontend.d.ts.map +1 -1
- package/dist/esm/core/resources/rmm/update-like-mutation-fallback.frontend.js +8 -0
- package/dist/esm/core/resources/rmm/update-like-mutation-fallback.frontend.js.map +1 -1
- package/dist/esm/core/resources/rmm/useResourceRMM.d.ts +7 -0
- package/dist/esm/core/resources/rmm/useResourceRMM.d.ts.map +1 -1
- package/dist/esm/core/resources/rmm/useResourceRMM.js +9 -2
- package/dist/esm/core/resources/rmm/useResourceRMM.js.map +1 -1
- package/dist/esm/core/resources/useOperationDirectExecution.d.ts +59 -0
- package/dist/esm/core/resources/useOperationDirectExecution.d.ts.map +1 -0
- package/dist/esm/core/resources/useOperationDirectExecution.js +278 -0
- package/dist/esm/core/resources/useOperationDirectExecution.js.map +1 -0
- package/dist/esm/core/resources/useResourceOperationActions.d.ts +1 -1
- package/dist/esm/core/resources/useResourceOperationActions.d.ts.map +1 -1
- package/dist/esm/core/resources/useResourceOperationActions.js +69 -22
- package/dist/esm/core/resources/useResourceOperationActions.js.map +1 -1
- package/dist/esm/core/resources/useResourceOperationSurface.d.ts +8 -6
- package/dist/esm/core/resources/useResourceOperationSurface.d.ts.map +1 -1
- package/dist/esm/core/resources/useResourceOperationSurface.js +3 -2
- package/dist/esm/core/resources/useResourceOperationSurface.js.map +1 -1
- package/dist/esm/core/runtime/AppRouter.d.ts.map +1 -1
- package/dist/esm/core/runtime/AppRouter.js +23 -2
- package/dist/esm/core/runtime/AppRouter.js.map +1 -1
- package/dist/esm/core/runtime/ApplicationContext.shared.d.ts +4 -2
- package/dist/esm/core/runtime/ApplicationContext.shared.d.ts.map +1 -1
- package/dist/esm/core/runtime/ApplicationContext.shared.js.map +1 -1
- package/dist/esm/core/runtime/ApplicationMainContext.d.ts +12 -2
- package/dist/esm/core/runtime/ApplicationMainContext.d.ts.map +1 -1
- package/dist/esm/core/runtime/ApplicationMainContext.js +5 -2
- package/dist/esm/core/runtime/ApplicationMainContext.js.map +1 -1
- package/dist/esm/core/runtime/domain-module.frontend.definitions.d.ts +25 -1
- package/dist/esm/core/runtime/domain-module.frontend.definitions.d.ts.map +1 -1
- package/dist/esm/core/runtime/domain-module.frontend.definitions.js +37 -1
- package/dist/esm/core/runtime/domain-module.frontend.definitions.js.map +1 -1
- package/dist/esm/core/runtime/start-application.frontend.service.d.ts +21 -2
- package/dist/esm/core/runtime/start-application.frontend.service.d.ts.map +1 -1
- package/dist/esm/core/runtime/start-application.frontend.service.js +51 -4
- package/dist/esm/core/runtime/start-application.frontend.service.js.map +1 -1
- package/dist/esm/core/security/AuthSessionContext.d.ts +11 -0
- package/dist/esm/core/security/AuthSessionContext.d.ts.map +1 -1
- package/dist/esm/core/security/AuthSessionContext.js +70 -22
- package/dist/esm/core/security/AuthSessionContext.js.map +1 -1
- package/dist/esm/core/security/StepUpAuthContext.d.ts.map +1 -1
- package/dist/esm/core/security/StepUpAuthContext.js +10 -2
- package/dist/esm/core/security/StepUpAuthContext.js.map +1 -1
- package/dist/esm/core/security/UserOrgsContext.d.ts.map +1 -1
- package/dist/esm/core/security/UserOrgsContext.js +72 -8
- package/dist/esm/core/security/UserOrgsContext.js.map +1 -1
- package/dist/esm/core/security/route-organization-access.frontend.utils.d.ts +7 -0
- package/dist/esm/core/security/route-organization-access.frontend.utils.d.ts.map +1 -1
- package/dist/esm/core/security/route-organization-access.frontend.utils.js +8 -2
- package/dist/esm/core/security/route-organization-access.frontend.utils.js.map +1 -1
- package/dist/esm/core/security/useGrantedConsentPurposes.d.ts +30 -0
- package/dist/esm/core/security/useGrantedConsentPurposes.d.ts.map +1 -0
- package/dist/esm/core/security/useGrantedConsentPurposes.js +38 -0
- package/dist/esm/core/security/useGrantedConsentPurposes.js.map +1 -0
- package/dist/esm/core/ui/UIContext.d.ts.map +1 -1
- package/dist/esm/core/ui/UIContext.js +10 -6
- package/dist/esm/core/ui/UIContext.js.map +1 -1
- package/dist/esm/core/ui/color-conversion.utils.d.ts +20 -0
- package/dist/esm/core/ui/color-conversion.utils.d.ts.map +1 -1
- package/dist/esm/core/ui/color-conversion.utils.js +39 -5
- package/dist/esm/core/ui/color-conversion.utils.js.map +1 -1
- package/dist/esm/core/ui/themes/default.theme.d.ts.map +1 -1
- package/dist/esm/core/ui/themes/default.theme.js +22 -2
- package/dist/esm/core/ui/themes/default.theme.js.map +1 -1
- package/dist/esm/core/ui/ui.frontend.schemas.d.ts +6 -6
- package/dist/esm/core/ui/ui.frontend.schemas.d.ts.map +1 -1
- package/dist/esm/core/ui/ui.frontend.schemas.js +3 -3
- package/dist/esm/core/ui/ui.frontend.schemas.js.map +1 -1
- package/dist/esm/index.d.ts +10 -1
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +19 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/testing/app-shell-placement-coverage.d.ts +43 -0
- package/dist/esm/testing/app-shell-placement-coverage.d.ts.map +1 -0
- package/dist/esm/testing/app-shell-placement-coverage.js +114 -0
- package/dist/esm/testing/app-shell-placement-coverage.js.map +1 -0
- package/dist/esm/testing/mock-builders.d.ts.map +1 -1
- package/dist/esm/testing/mock-builders.js +5 -0
- package/dist/esm/testing/mock-builders.js.map +1 -1
- package/dist/esm/testing.d.ts +1 -0
- package/dist/esm/testing.d.ts.map +1 -1
- package/dist/esm/testing.js +1 -0
- package/dist/esm/testing.js.map +1 -1
- package/package.json +9 -7
- package/dist/esm/core/navigation/useIsStackEntryActive.js +0 -15
- package/dist/tsconfig.build.tsbuildinfo +0 -1
|
@@ -37,9 +37,11 @@ export declare function resolveOptionalComponentLabel(params: Parameters<typeof
|
|
|
37
37
|
* (Between 2026-08 and #1414 this returned `''` on a miss precisely so that idiom
|
|
38
38
|
* would be live. That traded a visible gap for an invisible one and is retired.)
|
|
39
39
|
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
*
|
|
40
|
+
* Its cousin `t('File attached') ?? 'File attached'`, on the PLAIN `t` with the
|
|
41
|
+
* English text as the key, was once called benign here because its `??` never
|
|
42
|
+
* hides a miss. It is not: an English sentence used as a key is in no label tree,
|
|
43
|
+
* so no locale but English can have it. The file field's last sites were moved to
|
|
44
|
+
* its component labels (#1557); declare the word in a `*.labels.ts` instead.
|
|
43
45
|
*/
|
|
44
46
|
export declare function makeComponentLabelResolver(tComponent: (componentType: FrontendComponentType, key: string, kvPairs?: Record<string, string | number>) => string, componentType: FrontendComponentType): (key: string, params?: Record<string, string | number>) => string;
|
|
45
47
|
export declare function resolveResourceHeaderLabel(params: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component-label-resolution.utils.d.ts","sourceRoot":"","sources":["../../../../../src/core/i18n/component-label-resolution.utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AA2BjF,wBAAgB,qBAAqB,CAAC,MAAM,EAAE;IAC5C,UAAU,EAAE,CACV,aAAa,EAAE,qBAAqB,EACpC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,KACtC,MAAM,CAAC;IACZ,aAAa,EAAE,qBAAqB,CAAC;IACrC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;CAC1C,GAAG,MAAM,CAQT;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAC,CAAC,CAAC,GAClD,MAAM,GAAG,SAAS,CAGpB;AAED
|
|
1
|
+
{"version":3,"file":"component-label-resolution.utils.d.ts","sourceRoot":"","sources":["../../../../../src/core/i18n/component-label-resolution.utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AA2BjF,wBAAgB,qBAAqB,CAAC,MAAM,EAAE;IAC5C,UAAU,EAAE,CACV,aAAa,EAAE,qBAAqB,EACpC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,KACtC,MAAM,CAAC;IACZ,aAAa,EAAE,qBAAqB,CAAC;IACrC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;CAC1C,GAAG,MAAM,CAQT;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAC,CAAC,CAAC,GAClD,MAAM,GAAG,SAAS,CAGpB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,0BAA0B,CACxC,UAAU,EAAE,CACV,aAAa,EAAE,qBAAqB,EACpC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,KACtC,MAAM,EACX,aAAa,EAAE,qBAAqB,GACnC,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,KAAK,MAAM,CAEnE;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE;IACjD,eAAe,EAAE,CACf,YAAY,EAAE,MAAM,EACpB,GAAG,EAAE,OAAO,GAAG,aAAa,EAC5B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,KACtC,MAAM,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE,OAAO,GAAG,aAAa,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;CAC1C,GAAG,MAAM,CAQT;AAED;;;;;;;GAOG;AACH,wBAAgB,wCAAwC,CAAC,MAAM,EAAE;IAC/D,eAAe,EAAE,CACf,YAAY,EAAE,MAAM,EACpB,GAAG,EAAE,OAAO,GAAG,aAAa,EAC5B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,KACtC,MAAM,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;CAC1C,GAAG,MAAM,GAAG,SAAS,CAGrB;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE;IAC5C,CAAC,EAAE,CACD,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,KACtC,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;CAC1C,GAAG,MAAM,CAGT"}
|
|
@@ -62,9 +62,11 @@ export function resolveOptionalComponentLabel(params) {
|
|
|
62
62
|
* (Between 2026-08 and #1414 this returned `''` on a miss precisely so that idiom
|
|
63
63
|
* would be live. That traded a visible gap for an invisible one and is retired.)
|
|
64
64
|
*
|
|
65
|
-
*
|
|
66
|
-
*
|
|
67
|
-
*
|
|
65
|
+
* Its cousin `t('File attached') ?? 'File attached'`, on the PLAIN `t` with the
|
|
66
|
+
* English text as the key, was once called benign here because its `??` never
|
|
67
|
+
* hides a miss. It is not: an English sentence used as a key is in no label tree,
|
|
68
|
+
* so no locale but English can have it. The file field's last sites were moved to
|
|
69
|
+
* its component labels (#1557); declare the word in a `*.labels.ts` instead.
|
|
68
70
|
*/
|
|
69
71
|
export function makeComponentLabelResolver(tComponent, componentType) {
|
|
70
72
|
return (key, params) => resolveComponentLabel({ tComponent, componentType, key, params });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component-label-resolution.utils.js","sourceRoot":"","sources":["../../../../../src/core/i18n/component-label-resolution.utils.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,SAAS,kBAAkB,CAAC,QAAgB,EAAE,UAAkB;IAC9D,OAAO,QAAQ,KAAK,UAAU,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MASrC;IACC,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAChC,MAAM,CAAC,aAAa,EACpB,MAAM,CAAC,GAAG,EACV,MAAM,CAAC,MAAM,CACd,CAAC;IACF,yEAAyE;IACzE,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,6BAA6B,CAC3C,MAAmD;IAEnD,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IACpF,OAAO,kBAAkB,CAAC,QAAQ,EAAE,cAAc,MAAM,CAAC,aAAa,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;AACjH,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"component-label-resolution.utils.js","sourceRoot":"","sources":["../../../../../src/core/i18n/component-label-resolution.utils.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,SAAS,kBAAkB,CAAC,QAAgB,EAAE,UAAkB;IAC9D,OAAO,QAAQ,KAAK,UAAU,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MASrC;IACC,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAChC,MAAM,CAAC,aAAa,EACpB,MAAM,CAAC,GAAG,EACV,MAAM,CAAC,MAAM,CACd,CAAC;IACF,yEAAyE;IACzE,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,6BAA6B,CAC3C,MAAmD;IAEnD,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IACpF,OAAO,kBAAkB,CAAC,QAAQ,EAAE,cAAc,MAAM,CAAC,aAAa,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;AACjH,CAAC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,0BAA0B,CACxC,UAIW,EACX,aAAoC;IAEpC,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC,qBAAqB,CAAC,EAAE,UAAU,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;AAC5F,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,MAS1C;IACC,MAAM,QAAQ,GAAG,MAAM,CAAC,eAAe,CACrC,MAAM,CAAC,YAAY,EACnB,MAAM,CAAC,GAAG,EACV,MAAM,CAAC,MAAM,CACd,CAAC;IACF,4FAA4F;IAC5F,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,wCAAwC,CAAC,MAQxD;IACC,MAAM,QAAQ,GAAG,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,YAAY,EAAE,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAC3F,OAAO,kBAAkB,CAAC,QAAQ,EAAE,aAAa,MAAM,CAAC,YAAY,qBAAqB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;AACpH,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAOrC;IACC,kEAAkE;IAClE,OAAO,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;AAC7C,CAAC","sourcesContent":["import type { FrontendComponentType } from '@wildo-ai/presets-components-models';\n\n/**\n * A MISSING LABEL LOOKS MISSING — the contract of every resolver in this module (#1414).\n *\n * `tComponent` / `tResourceHeader` / `t` answer an unresolved key with the KEY PATH itself. Every\n * resolver here hands that answer on unchanged: the key is visible, greppable, obviously not a\n * label, and names exactly what somebody has to author. It is the same unresolved form\n * `unresolvedLabel` in `I18nContext.tsx` gives the rest of the runtime, and it is what\n * `.claude/rules/display-text-comes-from-i18n.md` requires.\n *\n * Until 2026-09-21 this module did the opposite: a miss became `''`, \"instead of leaking the key\n * path into the UI\". An empty string is the LEAST visible answer available. It shipped a\n * relationship tab with no text and 16px of width, found only by listing the page's `role=tab`\n * elements, and it made `resolve(...) || 'English literal'` a live idiom at a dozen sites — a\n * second, untranslatable source for words the label tree owns.\n *\n * So a resolver here never answers a MISS with `''`, and a caller never writes `|| fallback` after\n * one: a miss is a non-empty key path, so the fallback is dead. (An AUTHORED empty string still\n * comes back as authored — that is somebody's decision, not a gap.) Where ABSENCE is a legitimate\n * authored state rather than a gap, say so by calling one of the `resolveOptional…` functions\n * below — a named decision, never a falsy check on a label.\n */\nfunction isMissingI18nValue(resolved: string, missingKey: string): boolean {\n return resolved === missingKey;\n}\n\nexport function resolveComponentLabel(params: {\n tComponent: (\n componentType: FrontendComponentType,\n key: string,\n kvPairs?: Record<string, string | number>,\n ) => string;\n componentType: FrontendComponentType;\n key: string;\n params?: Record<string, string | number>;\n}): string {\n const resolved = params.tComponent(\n params.componentType,\n params.key,\n params.params,\n );\n // On a miss `resolved` IS the key path — the unresolved form. It stands.\n return resolved;\n}\n\n/**\n * The OPTIONAL form of {@link resolveComponentLabel}: `undefined` when the key has no label.\n *\n * Use it only where a missing label is a legitimate state and not a gap somebody must close:\n *\n * - SUPPLEMENTARY text — a description or a tooltip under a primary label that is itself shown.\n * This is the runtime's own convention (`tResourceFieldDisplay`, `tBillingProduct`, … in\n * `I18nContext.tsx` answer the unresolved key for a `label`/`name` and nothing for a\n * `description`), because an absent description collapses cleanly and a key path in its place\n * reads as broken copy under a heading that is fine.\n * - A key built from an APPLICATION-defined identifier no framework declaration can enumerate,\n * where the caller falls back to that identifier — a value, never invented words.\n *\n * Never use it for a primary label (a title, a button, a tab, an accessible name). A primary label\n * that is missing must look missing; hiding it is the defect #1414 records.\n */\nexport function resolveOptionalComponentLabel(\n params: Parameters<typeof resolveComponentLabel>[0],\n): string | undefined {\n const resolved = params.tComponent(params.componentType, params.key, params.params);\n return isMissingI18nValue(resolved, `components.${params.componentType}.${params.key}`) ? undefined : resolved;\n}\n\n/**\n * Curried form of {@link resolveComponentLabel}, for a component that resolves\n * SEVERAL keys or hands its resolver down to a helper. It binds the component\n * type once, so the namespace lives in one place.\n *\n * Like every resolver here it answers a miss with the KEY PATH. Do not write\n * `t('x') || 'Fallback'` after it: the key path is a non-empty string, so the\n * `||` never fires — and it must not, because a component-local English literal\n * is a second source for words the label tree owns. A key that should always\n * exist belongs in that component's `*.labels.ts` so the labelling pipeline\n * generates real text in every locale; until it has, the key is what shows.\n *\n * (Between 2026-08 and #1414 this returned `''` on a miss precisely so that idiom\n * would be live. That traded a visible gap for an invisible one and is retired.)\n *\n * Its cousin `t('File attached') ?? 'File attached'`, on the PLAIN `t` with the\n * English text as the key, was once called benign here because its `??` never\n * hides a miss. It is not: an English sentence used as a key is in no label tree,\n * so no locale but English can have it. The file field's last sites were moved to\n * its component labels (#1557); declare the word in a `*.labels.ts` instead.\n */\nexport function makeComponentLabelResolver(\n tComponent: (\n componentType: FrontendComponentType,\n key: string,\n kvPairs?: Record<string, string | number>,\n ) => string,\n componentType: FrontendComponentType,\n): (key: string, params?: Record<string, string | number>) => string {\n return (key, params) => resolveComponentLabel({ tComponent, componentType, key, params });\n}\n\nexport function resolveResourceHeaderLabel(params: {\n tResourceHeader: (\n resourceType: string,\n key: 'title' | 'description',\n kvPairs?: Record<string, string | number>,\n ) => string;\n resourceType: string;\n key: 'title' | 'description';\n params?: Record<string, string | number>;\n}): string {\n const resolved = params.tResourceHeader(\n params.resourceType,\n params.key,\n params.params,\n );\n // On a miss `resolved` IS `resources.<type>.header.<key>` — the unresolved form. It stands.\n return resolved;\n}\n\n/**\n * A resource header's DESCRIPTION, or `undefined` when none is authored.\n *\n * The key is typed `'description'` alone on purpose: a header TITLE is a primary label and must\n * look missing (use {@link resolveResourceHeaderLabel}); only the description is supplementary\n * text whose absence lets the header collapse cleanly. See {@link resolveOptionalComponentLabel}\n * for the convention this follows.\n */\nexport function resolveOptionalResourceHeaderDescription(params: {\n tResourceHeader: (\n resourceType: string,\n key: 'title' | 'description',\n kvPairs?: Record<string, string | number>,\n ) => string;\n resourceType: string;\n params?: Record<string, string | number>;\n}): string | undefined {\n const resolved = params.tResourceHeader(params.resourceType, 'description', params.params);\n return isMissingI18nValue(resolved, `resources.${params.resourceType}.header.description`) ? undefined : resolved;\n}\n\nexport function resolveTranslationKey(params: {\n t: (\n key: string,\n kvPairs?: Record<string, string | number>,\n ) => string;\n key: string;\n params?: Record<string, string | number>;\n}): string {\n // On a miss `t` answers the key — the unresolved form. It stands.\n return params.t(params.key, params.params);\n}\n"]}
|
|
@@ -41,7 +41,8 @@ export interface I18nDependencyConfig {
|
|
|
41
41
|
* Declares which translations are needed. Internally calls `requestKeys`
|
|
42
42
|
* (microbatched) and tracks loading via `isKeyLoaded`.
|
|
43
43
|
*
|
|
44
|
-
* For eager sections (system_enums, errors_*, sidebar_sections, lifecycle
|
|
44
|
+
* For eager sections (`EAGER_I18N_SECTIONS`: system_enums, errors_*, sidebar_sections, settings_hub, lifecycle,
|
|
45
|
+
* billing_features, billing_limits),
|
|
45
46
|
* `isReady` is true on first render — zero overhead.
|
|
46
47
|
*
|
|
47
48
|
* @throws Error if used outside of I18nProvider
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useI18n.d.ts","sourceRoot":"","sources":["../../../../../src/core/i18n/useI18n.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AACjF,OAAO,EAAe,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AAGlE,MAAM,WAAW,oBAAoB;IACnC,6EAA6E;IAC7E,SAAS,CAAC,EAAE,qBAAqB,GAAG,qBAAqB,EAAE,CAAC;IAC5D,uDAAuD;IACvD,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC7B;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAMD
|
|
1
|
+
{"version":3,"file":"useI18n.d.ts","sourceRoot":"","sources":["../../../../../src/core/i18n/useI18n.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AACjF,OAAO,EAAe,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AAGlE,MAAM,WAAW,oBAAoB;IACnC,6EAA6E;IAC7E,SAAS,CAAC,EAAE,qBAAqB,GAAG,qBAAqB,EAAE,CAAC;IAC5D,uDAAuD;IACvD,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC7B;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAMD;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,OAAO,GAAI,OAAO,oBAAoB,KAAG,eAAe,GAAG;IAAE,OAAO,EAAE,OAAO,CAAA;CA+DzF,CAAC"}
|
|
@@ -33,7 +33,8 @@ logger.setDebugTypeLogging('useI18n', false);
|
|
|
33
33
|
* Declares which translations are needed. Internally calls `requestKeys`
|
|
34
34
|
* (microbatched) and tracks loading via `isKeyLoaded`.
|
|
35
35
|
*
|
|
36
|
-
* For eager sections (system_enums, errors_*, sidebar_sections, lifecycle
|
|
36
|
+
* For eager sections (`EAGER_I18N_SECTIONS`: system_enums, errors_*, sidebar_sections, settings_hub, lifecycle,
|
|
37
|
+
* billing_features, billing_limits),
|
|
37
38
|
* `isReady` is true on first render — zero overhead.
|
|
38
39
|
*
|
|
39
40
|
* @throws Error if used outside of I18nProvider
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useI18n.js","sourceRoot":"","sources":["../../../../../src/core/i18n/useI18n.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAEvD,OAAO,EAAE,WAAW,EAAwB,MAAM,eAAe,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,6DAA6D,CAAC;AAepG,MAAM,MAAM,GAAG,qBAAqB,CAAC,SAAS,EAAE,CAAC;AACjD,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;AAC/C,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;AAE7C
|
|
1
|
+
{"version":3,"file":"useI18n.js","sourceRoot":"","sources":["../../../../../src/core/i18n/useI18n.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAEvD,OAAO,EAAE,WAAW,EAAwB,MAAM,eAAe,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,6DAA6D,CAAC;AAepG,MAAM,MAAM,GAAG,qBAAqB,CAAC,SAAS,EAAE,CAAC;AACjD,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;AAC/C,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;AAE7C;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,IAA2B,EAA0C,EAAE;IAC7F,MAAM,OAAO,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;IACxC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,EAAE;QAChC,IAAI,CAAC,IAAI;YAAE,OAAO,EAAE,CAAC;QACrB,MAAM,IAAI,GAAa,EAAE,CAAC;QAE1B,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAChF,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,CAAC;QACpD,CAAC;QAED,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACjF,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;gBAC3B,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IAElD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QACtC,QAAQ,CAAC,gBAAgB,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrD;;;;;;;;;;;WAWG;QACH,KAAK,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAChE,CAAC,EAAE,CAAC,YAAY,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;IAExC;;;;;;;OAOG;IACH,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,KAAK,CAAC,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;IAE9F,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QACtC,QAAQ,CAAC,WAAW,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,KAAK,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjF,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;IAE5B,OAAO,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,CAAC;AACjC,CAAC,CAAC","sourcesContent":["/**\n * useI18n Hook\n *\n * ARCHITECTURE NOTE:\n * This hook is separated from I18nContext.tsx for React Fast Refresh compatibility.\n *\n * React Fast Refresh requires files to export EITHER:\n * - Only React components, OR\n * - Only non-component values (hooks, utilities)\n *\n * Mixing both in a single file causes HMR invalidation loops because Vite cannot\n * determine if the file should be hot-refreshed (components) or fully reloaded (utilities).\n *\n * By separating the hook:\n * - I18nContext.tsx exports only components and types → Fast Refresh works\n * - This file exports only the hook → Clean module boundary\n */\n\nimport { useContext, useEffect, useMemo } from 'react';\nimport type { FrontendComponentType } from '@wildo-ai/presets-components-models';\nimport { I18nContext, type I18nContextType } from './I18nContext';\nimport { LoggerFrontendService } from '~wildo-frontend-lib/core/monitoring/logger.frontend.service';\n\nexport interface I18nDependencyConfig {\n /** Component type(s) — resolves to key path `components.${componentType}` */\n component?: FrontendComponentType | FrontendComponentType[];\n /** Resource type(s) — resolves to `resources.${rt}` */\n resource?: string | string[];\n /**\n * Explicit key paths — used directly without transformation.\n * Must be memoized by the caller (useMemo) when passed inline\n * to avoid unnecessary requestKeys calls on every render.\n */\n keys?: string[];\n}\n\nconst logger = LoggerFrontendService.getLogger();\nconst logDebug = logger.debugByType('useI18n');\nlogger.setDebugTypeLogging('useI18n', false);\n\n/**\n * Hook to access the internationalization context with optional lazy dependency tracking.\n *\n * Without deps (backward-compatible):\n * `const { t, tComponent } = useI18n();`\n * `isReady` is always `true`.\n *\n * With deps (standard pattern for all i18n consumers):\n * `const { tComponent, isReady } = useI18n({ component: FrontendComponentType.X });`\n * Declares which translations are needed. Internally calls `requestKeys`\n * (microbatched) and tracks loading via `isKeyLoaded`.\n *\n * For eager sections (`EAGER_I18N_SECTIONS`: system_enums, errors_*, sidebar_sections, settings_hub, lifecycle,\n * billing_features, billing_limits),\n * `isReady` is true on first render — zero overhead.\n *\n * @throws Error if used outside of I18nProvider\n */\nexport const useI18n = (deps?: I18nDependencyConfig): I18nContextType & { isReady: boolean } => {\n const context = useContext(I18nContext);\n if (!context) {\n throw new Error('useI18n must be used within an I18nProvider');\n }\n\n const resolvedKeys = useMemo(() => {\n if (!deps) return [];\n const keys: string[] = [];\n\n if (deps.component) {\n const types = Array.isArray(deps.component) ? deps.component : [deps.component];\n keys.push(...types.map(ct => `components.${ct}`));\n }\n\n if (deps.resource) {\n const resources = Array.isArray(deps.resource) ? deps.resource : [deps.resource];\n for (const rt of resources) {\n keys.push(`resources.${rt}`);\n }\n }\n\n if (deps.keys) {\n keys.push(...deps.keys);\n }\n\n return keys;\n }, [deps?.component, deps?.resource, deps?.keys]);\n\n useEffect(() => {\n if (resolvedKeys.length === 0) return;\n logDebug(`requestKeys [${resolvedKeys.join(', ')}]`);\n /*\n * The rejection is CAUGHT here, not floated.\n *\n * `requestKeys` rejects when a bundle fetch fails, and this call was fire-and-forget — so every\n * failed bundle produced an unhandled promise rejection in the browser, on top of the readiness\n * hang that failure used to cause. The failure is already reported once, by the provider's own\n * `reportError`; a second, uncatchable copy at the window level is noise that buries it.\n *\n * Swallowing is right precisely BECAUSE readiness now settles on failure: the surface renders\n * with the labels it has and a missing label looks missing, so there is nothing left for a\n * caller of this hook to do about the rejection.\n */\n void context.requestKeys(resolvedKeys).catch(() => undefined);\n }, [resolvedKeys, context.requestKeys]);\n\n /*\n * SETTLED, not loaded. A bundle whose fetch failed is never added to the loaded set, so a\n * readiness gate keyed on `isKeyLoaded` waited forever: `AutomatedForm` renders a skeleton until\n * `isReady`, and one failed request made that skeleton permanent. Settling on failure lets the\n * surface render with the labels it has — a missing label then LOOKS missing, which is the\n * outcome `.claude/rules/display-text-comes-from-i18n.md` wants, rather than a page that never\n * arrives.\n */\n const isReady = resolvedKeys.length === 0 || resolvedKeys.every(k => context.isKeySettled(k));\n\n useEffect(() => {\n if (resolvedKeys.length === 0) return;\n logDebug(`isReady=${isReady ? 'true' : 'false'} [${resolvedKeys.join(', ')}]`);\n }, [isReady, resolvedKeys]);\n\n return { ...context, isReady };\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LoadingContext.d.ts","sourceRoot":"","sources":["../../../../../src/core/loading/LoadingContext.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,EAAsE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAKlH,OAAO,EACL,WAAW,EACX,YAAY,EACZ,KAAK,YAAY,EACjB,KAAK,qBAAqB,EAC1B,KAAK,aAAa,EACnB,MAAM,kCAAkC,CAAC;AAkH1C,MAAM,WAAW,kBAAkB;IAEjC,YAAY,EAAE,OAAO,CAAC;IACtB,iBAAiB,EAAE,aAAa,EAAE,CAAC;IAGnC,wBAAwB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,qBAAqB,GAAG,SAAS,CAAC;IAGlF,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,kBAAkB,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;IAC1E,YAAY,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAEzC;;;OAGG;IACH,WAAW,EAAE,CAAC,KAAK,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,YAAY,CAAC;QAAC,IAAI,CAAC,EAAE,WAAW,CAAA;KAAE,KAAK,IAAI,CAAC;IACnG;;;;OAIG;IACH,UAAU,EAAE,CAAC,KAAK,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,WAAW,CAAA;KAAE,KAAK,IAAI,CAAC;CAC7E;AAED;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAA4D,CAAC;AAItI,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"LoadingContext.d.ts","sourceRoot":"","sources":["../../../../../src/core/loading/LoadingContext.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,EAAsE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAKlH,OAAO,EACL,WAAW,EACX,YAAY,EACZ,KAAK,YAAY,EACjB,KAAK,qBAAqB,EAC1B,KAAK,aAAa,EACnB,MAAM,kCAAkC,CAAC;AAkH1C,MAAM,WAAW,kBAAkB;IAEjC,YAAY,EAAE,OAAO,CAAC;IACtB,iBAAiB,EAAE,aAAa,EAAE,CAAC;IAGnC,wBAAwB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,qBAAqB,GAAG,SAAS,CAAC;IAGlF,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,kBAAkB,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;IAC1E,YAAY,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAEzC;;;OAGG;IACH,WAAW,EAAE,CAAC,KAAK,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,YAAY,CAAC;QAAC,IAAI,CAAC,EAAE,WAAW,CAAA;KAAE,KAAK,IAAI,CAAC;IACnG;;;;OAIG;IACH,UAAU,EAAE,CAAC,KAAK,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,WAAW,CAAA;KAAE,KAAK,IAAI,CAAC;CAC7E;AAED;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAA4D,CAAC;AAItI,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,CA8L7D,CAAC"}
|
|
@@ -193,7 +193,13 @@ export const LoadingProvider = ({ children }) => {
|
|
|
193
193
|
loadedOnceCacheRef.current.clear();
|
|
194
194
|
}
|
|
195
195
|
}));
|
|
196
|
-
|
|
196
|
+
/*
|
|
197
|
+
* The person this tab knew is gone (#1996): the next person must see every resource's first-load state,
|
|
198
|
+
* not inherit the previous person's "already loaded" marks. `USER_LOGOUT` is announced once per
|
|
199
|
+
* departure on every path — sign-out, a refused refresh, a failed restore, another tab's sign-out, a
|
|
200
|
+
* replacement. This listened to `AUTH_LOGOUT_REQUIRED` before, an event nothing ever emitted.
|
|
201
|
+
*/
|
|
202
|
+
unsubscribes.push(frontendEventBus.on(FrontendEvents.USER_LOGOUT, () => {
|
|
197
203
|
loadedOnceCacheRef.current.clear();
|
|
198
204
|
}));
|
|
199
205
|
unsubscribes.push(frontendEventBus.on(FrontendEvents.WHOLE_APP_REFRESH, () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LoadingContext.js","sourceRoot":"","sources":["../../../../../src/core/loading/LoadingContext.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * Loading Context — Event-Driven State Aggregator\n *\n * Central loading state management. Subscribes to loading events on the EventBus\n * and maintains aggregate state for UI consumption.\n *\n * Architecture: EventBus → LoadingProvider (useReducer) → Context → Hooks\n *\n * Tier 1 (APPLICATION): Gates entire app — init, language change, org switch.\n * Tier 2 (COMPONENT): Per-scope — resource lists, detail views, etc.\n *\n * @see .cursor/plans/loading-system-architecture.md\n *\n * ARCHITECTURE NOTE:\n * This file exports the Provider component and context. Hooks are in separate files\n * (useAppLoading.ts, useComponentLoading.ts, useLoading.ts) for React Fast Refresh\n * compatibility — mixing components and hooks causes HMR invalidation loops.\n */\n\nimport React, { createContext, useReducer, useEffect, useRef, useCallback, useMemo, type ReactNode } from 'react';\nimport { frontendEventBus } from '~wildo-frontend-lib/core/events/event-bus.frontend.service';\nimport { FrontendEvents } from '~wildo-frontend-lib/core/events/events.frontend.schemas';\nimport { ResourcePrimaryScope } from '@wildo-ai/saas-models';\nimport { LoggerFrontendService } from '~wildo-frontend-lib/core/monitoring/logger.frontend.service';\nimport {\n LoadingTier,\n LoadingPhase,\n type LoadingScope,\n type ComponentLoadingState,\n type LoadingSource,\n} from './loading-types.frontend.schemas';\nimport { buildLoadingScopeKey } from './loading-scope.frontend.utils';\n\nconst logger = LoggerFrontendService.getLogger();\nconst logDebug = logger.debugByType('LoadingContext');\nlogger.setDebugTypeLogging('LoadingContext', false);\n\n// ─── Internal State ─────────────────────────────────────────────────────────\n\nenum LoadingActionType {\n APP_LOADING_START = 'APP_LOADING_START',\n APP_LOADING_END = 'APP_LOADING_END',\n COMPONENT_LOADING_START = 'COMPONENT_LOADING_START',\n COMPONENT_LOADING_END = 'COMPONENT_LOADING_END',\n}\n\ninterface LoadingInternalState {\n appLoadingSources: Map<string, LoadingSource>;\n componentLoadingMap: Map<string, ComponentLoadingState>;\n}\n\ntype LoadingAction =\n | { type: LoadingActionType.APP_LOADING_START; identifier: string; source: LoadingSource }\n | { type: LoadingActionType.APP_LOADING_END; identifier: string }\n | { type: LoadingActionType.COMPONENT_LOADING_START; scopeKey: string; phase: LoadingPhase }\n | { type: LoadingActionType.COMPONENT_LOADING_END; scopeKey: string };\n\nconst initialState: LoadingInternalState = {\n appLoadingSources: new Map(),\n componentLoadingMap: new Map(),\n};\n\n/**\n * IMPORTANT: Returns new Map instances on every mutation.\n * React detects state changes by reference equality — mutating a Map in place\n * returns the same reference and triggers no re-render.\n */\nfunction loadingReducer(state: LoadingInternalState, action: LoadingAction): LoadingInternalState {\n switch (action.type) {\n case LoadingActionType.APP_LOADING_START: {\n const next = new Map(state.appLoadingSources);\n next.set(action.identifier, action.source);\n return { ...state, appLoadingSources: next };\n }\n case LoadingActionType.APP_LOADING_END: {\n const next = new Map(state.appLoadingSources);\n next.delete(action.identifier);\n return { ...state, appLoadingSources: next };\n }\n case LoadingActionType.COMPONENT_LOADING_START: {\n const next = new Map(state.componentLoadingMap);\n const existing = next.get(action.scopeKey);\n const activeCount = (existing?.activeCount ?? 0) + 1;\n next.set(action.scopeKey, {\n hasLoadedOnce: existing?.hasLoadedOnce ?? false,\n isLoading: true,\n phase: action.phase,\n activeCount,\n });\n return { ...state, componentLoadingMap: next };\n }\n case LoadingActionType.COMPONENT_LOADING_END: {\n const next = new Map(state.componentLoadingMap);\n const existing = next.get(action.scopeKey);\n if (!existing) return state;\n const activeCount = Math.max(0, existing.activeCount - 1);\n next.set(action.scopeKey, {\n hasLoadedOnce: true,\n isLoading: activeCount > 0,\n phase: existing.phase,\n activeCount,\n });\n return { ...state, componentLoadingMap: next };\n }\n default:\n return state;\n }\n}\n\n// ─── LoadedOnce LRU Cache ───────────────────────────────────────────────────\n\n/**\n * Tracks data contexts that have been successfully loaded and rendered.\n * Used to distinguish initial loads from refreshes on re-visit.\n *\n * LRU eviction: oldest entries are evicted when cache exceeds maxEntries.\n * Map insertion order is exploited — delete+re-set moves entry to end.\n */\nclass LoadedOnceCache {\n private cache = new Map<string, { lastRenderedAt: number }>();\n private readonly maxEntries = 200;\n\n has(scopeKey: string, refreshThresholdMs: number = 5 * 60 * 1000): boolean {\n const entry = this.cache.get(scopeKey);\n if (!entry) return false;\n return (Date.now() - entry.lastRenderedAt) < refreshThresholdMs;\n }\n\n set(scopeKey: string): void {\n this.cache.delete(scopeKey);\n this.cache.set(scopeKey, { lastRenderedAt: Date.now() });\n if (this.cache.size > this.maxEntries) {\n const oldest = this.cache.keys().next().value;\n if (oldest !== undefined) this.cache.delete(oldest);\n }\n }\n\n clear(): void {\n this.cache.clear();\n }\n}\n\n// ─── Context Type ───────────────────────────────────────────────────────────\n\nexport interface LoadingContextType {\n // Tier 1 read-only state\n isAppLoading: boolean;\n appLoadingSources: LoadingSource[];\n\n // Tier 2 state access\n getComponentLoadingState: (scopeKey: string) => ComponentLoadingState | undefined;\n\n // hasLoadedOnce cache access\n hasLoadedOnce: (scopeKey: string, refreshThresholdMs?: number) => boolean;\n markRendered: (scopeKey: string) => void;\n\n /**\n * Emit a loading start event via EventBus.\n * State comes back through the subscription pipeline.\n */\n fireLoading: (scope: LoadingScope, options?: { phase?: LoadingPhase; tier?: LoadingTier }) => void;\n /**\n * Emit a loading end event via EventBus.\n * Must pass the same tier used in fireLoading() — APPLICATION-tier loading\n * won't be ended if tier is omitted (defaults to COMPONENT).\n */\n endLoading: (scope: LoadingScope, options?: { tier?: LoadingTier }) => void;\n}\n\n/**\n * @internal Use useLoading(), useAppLoading(), or useComponentLoading() hooks\n */\nexport const LoadingContext: React.Context<LoadingContextType | undefined> = createContext<LoadingContextType | undefined>(undefined);\n\n// ─── Provider ───────────────────────────────────────────────────────────────\n\nexport const LoadingProvider: React.FC<{ children: ReactNode }> = ({ children }) => {\n const [state, dispatch] = useReducer(loadingReducer, initialState);\n const loadedOnceCacheRef = useRef(new LoadedOnceCache());\n\n useEffect(() => {\n const identifiers = Array.from(state.appLoadingSources.keys());\n logDebug(`App loading state: ${state.appLoadingSources.size > 0 ? 'loading' : 'ready'} [${identifiers.join(', ') || 'none'}]`);\n }, [state.appLoadingSources]);\n\n // ── Subscribe to loading events ──────────────────────────────────────────\n\n useEffect(() => {\n const unsubscribes: Array<() => void> = [];\n\n unsubscribes.push(\n frontendEventBus.on(FrontendEvents.LOADING_RESOURCE_START, (payload) => {\n const scopeKey = buildLoadingScopeKey({\n resourceType: payload.resourceType,\n operation: payload.operationIdentifier,\n discriminator: payload.optionalDiscriminator,\n });\n const tier = payload.tier ?? LoadingTier.COMPONENT;\n const phase = payload.phase ?? LoadingPhase.INITIAL;\n\n if (tier === LoadingTier.APPLICATION) {\n logDebug(`APP_LOADING_START resource:${scopeKey}`);\n dispatch({ type: LoadingActionType.APP_LOADING_START, identifier: scopeKey, source: { identifier: scopeKey, tier, startedAt: Date.now() } });\n } else {\n dispatch({ type: LoadingActionType.COMPONENT_LOADING_START, scopeKey, phase });\n }\n })\n );\n\n unsubscribes.push(\n frontendEventBus.on(FrontendEvents.LOADING_RESOURCE_END, (payload) => {\n const scopeKey = buildLoadingScopeKey({\n resourceType: payload.resourceType,\n operation: payload.operationIdentifier,\n discriminator: payload.optionalDiscriminator,\n });\n const tier = payload.tier ?? LoadingTier.COMPONENT;\n\n if (tier === LoadingTier.APPLICATION) {\n logDebug(`APP_LOADING_END resource:${scopeKey}`);\n dispatch({ type: LoadingActionType.APP_LOADING_END, identifier: scopeKey });\n } else {\n dispatch({ type: LoadingActionType.COMPONENT_LOADING_END, scopeKey });\n }\n })\n );\n\n unsubscribes.push(\n frontendEventBus.on(FrontendEvents.LOADING_CUSTOM_START, (payload) => {\n const tier = payload.tier ?? LoadingTier.COMPONENT;\n const phase = payload.phase ?? LoadingPhase.INITIAL;\n if (tier === LoadingTier.APPLICATION) {\n logDebug(`APP_LOADING_START custom:${payload.identifier}`);\n dispatch({ type: LoadingActionType.APP_LOADING_START, identifier: payload.identifier, source: { identifier: payload.identifier, tier, startedAt: Date.now() } });\n } else {\n dispatch({ type: LoadingActionType.COMPONENT_LOADING_START, scopeKey: `custom:${payload.identifier}`, phase });\n }\n })\n );\n\n unsubscribes.push(\n frontendEventBus.on(FrontendEvents.LOADING_CUSTOM_END, (payload) => {\n const tier = payload.tier ?? LoadingTier.COMPONENT;\n if (tier === LoadingTier.APPLICATION) {\n logDebug(`APP_LOADING_END custom:${payload.identifier}`);\n dispatch({ type: LoadingActionType.APP_LOADING_END, identifier: payload.identifier });\n } else {\n dispatch({ type: LoadingActionType.COMPONENT_LOADING_END, scopeKey: `custom:${payload.identifier}` });\n }\n })\n );\n\n return () => unsubscribes.forEach(unsub => unsub());\n }, []);\n\n // ── Global clear events — invalidate hasLoadedOnce cache ─────────────────\n\n useEffect(() => {\n const unsubscribes: Array<() => void> = [];\n\n unsubscribes.push(\n frontendEventBus.on(FrontendEvents.PRIMARY_SCOPE_CHANGED, (payload) => {\n if (payload.scopeLevel === ResourcePrimaryScope.ORGANIZATIONS) {\n loadedOnceCacheRef.current.clear();\n }\n })\n );\n\n unsubscribes.push(\n frontendEventBus.on(FrontendEvents.AUTH_LOGOUT_REQUIRED, () => {\n loadedOnceCacheRef.current.clear();\n })\n );\n\n unsubscribes.push(\n frontendEventBus.on(FrontendEvents.WHOLE_APP_REFRESH, () => {\n loadedOnceCacheRef.current.clear();\n })\n );\n\n return () => unsubscribes.forEach(unsub => unsub());\n }, []);\n\n // ── New API methods ──────────────────────────────────────────────────────\n\n const getComponentLoadingState = useCallback(\n (scopeKey: string): ComponentLoadingState | undefined => state.componentLoadingMap.get(scopeKey),\n [state.componentLoadingMap]\n );\n\n const hasLoadedOnce = useCallback(\n (scopeKey: string, refreshThresholdMs?: number): boolean => loadedOnceCacheRef.current.has(scopeKey, refreshThresholdMs),\n []\n );\n\n const markRendered = useCallback(\n (scopeKey: string): void => loadedOnceCacheRef.current.set(scopeKey),\n []\n );\n\n const fireLoading = useCallback((scope: LoadingScope, options?: { phase?: LoadingPhase; tier?: LoadingTier }) => {\n const isCustom = !!scope.customIdentifier;\n if (isCustom) {\n frontendEventBus.emit(FrontendEvents.LOADING_CUSTOM_START, {\n identifier: scope.customIdentifier!,\n data: undefined,\n tier: options?.tier,\n phase: options?.phase,\n });\n } else {\n frontendEventBus.emit(FrontendEvents.LOADING_RESOURCE_START, {\n resourceType: scope.resourceType ?? '',\n operationIdentifier: scope.operation ?? '',\n optionalDiscriminator: scope.discriminator,\n contextResourceIdentifiers: {},\n tier: options?.tier,\n phase: options?.phase,\n });\n }\n }, []);\n\n const endLoading = useCallback((scope: LoadingScope, options?: { tier?: LoadingTier }) => {\n const isCustom = !!scope.customIdentifier;\n if (isCustom) {\n frontendEventBus.emit(FrontendEvents.LOADING_CUSTOM_END, {\n identifier: scope.customIdentifier!,\n data: undefined,\n tier: options?.tier,\n });\n } else {\n frontendEventBus.emit(FrontendEvents.LOADING_RESOURCE_END, {\n resourceType: scope.resourceType ?? '',\n operationIdentifier: scope.operation ?? '',\n optionalDiscriminator: scope.discriminator,\n contextResourceIdentifiers: {},\n tier: options?.tier,\n });\n }\n }, []);\n\n // ── Build context value ──────────────────────────────────────────────────\n\n const value: LoadingContextType = useMemo(() => ({\n isAppLoading: state.appLoadingSources.size > 0,\n appLoadingSources: Array.from(state.appLoadingSources.values()),\n getComponentLoadingState,\n hasLoadedOnce,\n markRendered,\n fireLoading,\n endLoading,\n }), [\n state.appLoadingSources,\n getComponentLoadingState,\n hasLoadedOnce,\n markRendered,\n fireLoading,\n endLoading,\n ]);\n\n return <LoadingContext.Provider value={value}>{children}</LoadingContext.Provider>;\n};\n"]}
|
|
1
|
+
{"version":3,"file":"LoadingContext.js","sourceRoot":"","sources":["../../../../../src/core/loading/LoadingContext.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAc,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAkB,MAAM,OAAO,CAAC;AAClH,OAAO,EAAE,gBAAgB,EAAE,MAAM,4DAA4D,CAAC;AAC9F,OAAO,EAAE,cAAc,EAAE,MAAM,yDAAyD,CAAC;AACzF,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,6DAA6D,CAAC;AACpG,OAAO,EACL,WAAW,EACX,YAAY,GAIb,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAEtE,MAAM,MAAM,GAAG,qBAAqB,CAAC,SAAS,EAAE,CAAC;AACjD,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC;AACtD,MAAM,CAAC,mBAAmB,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;AAEpD,+EAA+E;AAE/E,IAAK,iBAKJ;AALD,WAAK,iBAAiB;IACpB,4DAAuC,CAAA;IACvC,wDAAmC,CAAA;IACnC,wEAAmD,CAAA;IACnD,oEAA+C,CAAA;AACjD,CAAC,EALI,iBAAiB,KAAjB,iBAAiB,QAKrB;AAaD,MAAM,YAAY,GAAyB;IACzC,iBAAiB,EAAE,IAAI,GAAG,EAAE;IAC5B,mBAAmB,EAAE,IAAI,GAAG,EAAE;CAC/B,CAAC;AAEF;;;;GAIG;AACH,SAAS,cAAc,CAAC,KAA2B,EAAE,MAAqB;IACxE,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,iBAAiB,CAAC,iBAAiB,CAAC,CAAC,CAAC;YACzC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;YAC9C,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YAC3C,OAAO,EAAE,GAAG,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC;QAC/C,CAAC;QACD,KAAK,iBAAiB,CAAC,eAAe,CAAC,CAAC,CAAC;YACvC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;YAC9C,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAC/B,OAAO,EAAE,GAAG,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC;QAC/C,CAAC;QACD,KAAK,iBAAiB,CAAC,uBAAuB,CAAC,CAAC,CAAC;YAC/C,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;YAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC3C,MAAM,WAAW,GAAG,CAAC,QAAQ,EAAE,WAAW,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YACrD,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE;gBACxB,aAAa,EAAE,QAAQ,EAAE,aAAa,IAAI,KAAK;gBAC/C,SAAS,EAAE,IAAI;gBACf,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,WAAW;aACZ,CAAC,CAAC;YACH,OAAO,EAAE,GAAG,KAAK,EAAE,mBAAmB,EAAE,IAAI,EAAE,CAAC;QACjD,CAAC;QACD,KAAK,iBAAiB,CAAC,qBAAqB,CAAC,CAAC,CAAC;YAC7C,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;YAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC3C,IAAI,CAAC,QAAQ;gBAAE,OAAO,KAAK,CAAC;YAC5B,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC;YAC1D,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE;gBACxB,aAAa,EAAE,IAAI;gBACnB,SAAS,EAAE,WAAW,GAAG,CAAC;gBAC1B,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,WAAW;aACZ,CAAC,CAAC;YACH,OAAO,EAAE,GAAG,KAAK,EAAE,mBAAmB,EAAE,IAAI,EAAE,CAAC;QACjD,CAAC;QACD;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC;AAED,+EAA+E;AAE/E;;;;;;GAMG;AACH,MAAM,eAAe;IACX,KAAK,GAAG,IAAI,GAAG,EAAsC,CAAC;IAC7C,UAAU,GAAG,GAAG,CAAC;IAElC,GAAG,CAAC,QAAgB,EAAE,qBAA6B,CAAC,GAAG,EAAE,GAAG,IAAI;QAC9D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACvC,IAAI,CAAC,KAAK;YAAE,OAAO,KAAK,CAAC;QACzB,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,cAAc,CAAC,GAAG,kBAAkB,CAAC;IAClE,CAAC;IAED,GAAG,CAAC,QAAgB;QAClB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,cAAc,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACzD,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YACtC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;YAC9C,IAAI,MAAM,KAAK,SAAS;gBAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAED,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;CACF;AA6BD;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAkD,aAAa,CAAiC,SAAS,CAAC,CAAC;AAEtI,+EAA+E;AAE/E,MAAM,CAAC,MAAM,eAAe,GAAsC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE;IACjF,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,UAAU,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;IACnE,MAAM,kBAAkB,GAAG,MAAM,CAAC,IAAI,eAAe,EAAE,CAAC,CAAC;IAEzD,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAC,CAAC;QAC/D,QAAQ,CAAC,sBAAsB,KAAK,CAAC,iBAAiB,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,KAAK,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC;IACjI,CAAC,EAAE,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAE9B,4EAA4E;IAE5E,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,YAAY,GAAsB,EAAE,CAAC;QAE3C,YAAY,CAAC,IAAI,CACf,gBAAgB,CAAC,EAAE,CAAC,cAAc,CAAC,sBAAsB,EAAE,CAAC,OAAO,EAAE,EAAE;YACrE,MAAM,QAAQ,GAAG,oBAAoB,CAAC;gBACpC,YAAY,EAAE,OAAO,CAAC,YAAY;gBAClC,SAAS,EAAE,OAAO,CAAC,mBAAmB;gBACtC,aAAa,EAAE,OAAO,CAAC,qBAAqB;aAC7C,CAAC,CAAC;YACH,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,WAAW,CAAC,SAAS,CAAC;YACnD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,YAAY,CAAC,OAAO,CAAC;YAEpD,IAAI,IAAI,KAAK,WAAW,CAAC,WAAW,EAAE,CAAC;gBACrC,QAAQ,CAAC,8BAA8B,QAAQ,EAAE,CAAC,CAAC;gBACnD,QAAQ,CAAC,EAAE,IAAI,EAAE,iBAAiB,CAAC,iBAAiB,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;YAC/I,CAAC;iBAAM,CAAC;gBACN,QAAQ,CAAC,EAAE,IAAI,EAAE,iBAAiB,CAAC,uBAAuB,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;YACjF,CAAC;QACH,CAAC,CAAC,CACH,CAAC;QAEF,YAAY,CAAC,IAAI,CACf,gBAAgB,CAAC,EAAE,CAAC,cAAc,CAAC,oBAAoB,EAAE,CAAC,OAAO,EAAE,EAAE;YACnE,MAAM,QAAQ,GAAG,oBAAoB,CAAC;gBACpC,YAAY,EAAE,OAAO,CAAC,YAAY;gBAClC,SAAS,EAAE,OAAO,CAAC,mBAAmB;gBACtC,aAAa,EAAE,OAAO,CAAC,qBAAqB;aAC7C,CAAC,CAAC;YACH,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,WAAW,CAAC,SAAS,CAAC;YAEnD,IAAI,IAAI,KAAK,WAAW,CAAC,WAAW,EAAE,CAAC;gBACrC,QAAQ,CAAC,4BAA4B,QAAQ,EAAE,CAAC,CAAC;gBACjD,QAAQ,CAAC,EAAE,IAAI,EAAE,iBAAiB,CAAC,eAAe,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC9E,CAAC;iBAAM,CAAC;gBACN,QAAQ,CAAC,EAAE,IAAI,EAAE,iBAAiB,CAAC,qBAAqB,EAAE,QAAQ,EAAE,CAAC,CAAC;YACxE,CAAC;QACH,CAAC,CAAC,CACH,CAAC;QAEF,YAAY,CAAC,IAAI,CACf,gBAAgB,CAAC,EAAE,CAAC,cAAc,CAAC,oBAAoB,EAAE,CAAC,OAAO,EAAE,EAAE;YACnE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,WAAW,CAAC,SAAS,CAAC;YACnD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,YAAY,CAAC,OAAO,CAAC;YACpD,IAAI,IAAI,KAAK,WAAW,CAAC,WAAW,EAAE,CAAC;gBACrC,QAAQ,CAAC,4BAA4B,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;gBAC3D,QAAQ,CAAC,EAAE,IAAI,EAAE,iBAAiB,CAAC,iBAAiB,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;YACnK,CAAC;iBAAM,CAAC;gBACN,QAAQ,CAAC,EAAE,IAAI,EAAE,iBAAiB,CAAC,uBAAuB,EAAE,QAAQ,EAAE,UAAU,OAAO,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;YACjH,CAAC;QACH,CAAC,CAAC,CACH,CAAC;QAEF,YAAY,CAAC,IAAI,CACf,gBAAgB,CAAC,EAAE,CAAC,cAAc,CAAC,kBAAkB,EAAE,CAAC,OAAO,EAAE,EAAE;YACjE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,WAAW,CAAC,SAAS,CAAC;YACnD,IAAI,IAAI,KAAK,WAAW,CAAC,WAAW,EAAE,CAAC;gBACrC,QAAQ,CAAC,0BAA0B,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;gBACzD,QAAQ,CAAC,EAAE,IAAI,EAAE,iBAAiB,CAAC,eAAe,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;YACxF,CAAC;iBAAM,CAAC;gBACN,QAAQ,CAAC,EAAE,IAAI,EAAE,iBAAiB,CAAC,qBAAqB,EAAE,QAAQ,EAAE,UAAU,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YACxG,CAAC;QACH,CAAC,CAAC,CACH,CAAC;QAEF,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC;IACtD,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,4EAA4E;IAE5E,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,YAAY,GAAsB,EAAE,CAAC;QAE3C,YAAY,CAAC,IAAI,CACf,gBAAgB,CAAC,EAAE,CAAC,cAAc,CAAC,qBAAqB,EAAE,CAAC,OAAO,EAAE,EAAE;YACpE,IAAI,OAAO,CAAC,UAAU,KAAK,oBAAoB,CAAC,aAAa,EAAE,CAAC;gBAC9D,kBAAkB,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACrC,CAAC;QACH,CAAC,CAAC,CACH,CAAC;QAEF;;;;;WAKG;QACH,YAAY,CAAC,IAAI,CACf,gBAAgB,CAAC,EAAE,CAAC,cAAc,CAAC,WAAW,EAAE,GAAG,EAAE;YACnD,kBAAkB,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrC,CAAC,CAAC,CACH,CAAC;QAEF,YAAY,CAAC,IAAI,CACf,gBAAgB,CAAC,EAAE,CAAC,cAAc,CAAC,iBAAiB,EAAE,GAAG,EAAE;YACzD,kBAAkB,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrC,CAAC,CAAC,CACH,CAAC;QAEF,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC;IACtD,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,4EAA4E;IAE5E,MAAM,wBAAwB,GAAG,WAAW,CAC1C,CAAC,QAAgB,EAAqC,EAAE,CAAC,KAAK,CAAC,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAChG,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAC5B,CAAC;IAEF,MAAM,aAAa,GAAG,WAAW,CAC/B,CAAC,QAAgB,EAAE,kBAA2B,EAAW,EAAE,CAAC,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,kBAAkB,CAAC,EACxH,EAAE,CACH,CAAC;IAEF,MAAM,YAAY,GAAG,WAAW,CAC9B,CAAC,QAAgB,EAAQ,EAAE,CAAC,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EACpE,EAAE,CACH,CAAC;IAEF,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,KAAmB,EAAE,OAAsD,EAAE,EAAE;QAC9G,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC;QAC1C,IAAI,QAAQ,EAAE,CAAC;YACb,gBAAgB,CAAC,IAAI,CAAC,cAAc,CAAC,oBAAoB,EAAE;gBACzD,UAAU,EAAE,KAAK,CAAC,gBAAiB;gBACnC,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,OAAO,EAAE,IAAI;gBACnB,KAAK,EAAE,OAAO,EAAE,KAAK;aACtB,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,gBAAgB,CAAC,IAAI,CAAC,cAAc,CAAC,sBAAsB,EAAE;gBAC3D,YAAY,EAAE,KAAK,CAAC,YAAY,IAAI,EAAE;gBACtC,mBAAmB,EAAE,KAAK,CAAC,SAAS,IAAI,EAAE;gBAC1C,qBAAqB,EAAE,KAAK,CAAC,aAAa;gBAC1C,0BAA0B,EAAE,EAAE;gBAC9B,IAAI,EAAE,OAAO,EAAE,IAAI;gBACnB,KAAK,EAAE,OAAO,EAAE,KAAK;aACtB,CAAC,CAAC;QACL,CAAC;IACH,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,KAAmB,EAAE,OAAgC,EAAE,EAAE;QACvF,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC;QAC1C,IAAI,QAAQ,EAAE,CAAC;YACb,gBAAgB,CAAC,IAAI,CAAC,cAAc,CAAC,kBAAkB,EAAE;gBACvD,UAAU,EAAE,KAAK,CAAC,gBAAiB;gBACnC,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,OAAO,EAAE,IAAI;aACpB,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,gBAAgB,CAAC,IAAI,CAAC,cAAc,CAAC,oBAAoB,EAAE;gBACzD,YAAY,EAAE,KAAK,CAAC,YAAY,IAAI,EAAE;gBACtC,mBAAmB,EAAE,KAAK,CAAC,SAAS,IAAI,EAAE;gBAC1C,qBAAqB,EAAE,KAAK,CAAC,aAAa;gBAC1C,0BAA0B,EAAE,EAAE;gBAC9B,IAAI,EAAE,OAAO,EAAE,IAAI;aACpB,CAAC,CAAC;QACL,CAAC;IACH,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,4EAA4E;IAE5E,MAAM,KAAK,GAAuB,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QAC/C,YAAY,EAAE,KAAK,CAAC,iBAAiB,CAAC,IAAI,GAAG,CAAC;QAC9C,iBAAiB,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,MAAM,EAAE,CAAC;QAC/D,wBAAwB;QACxB,aAAa;QACb,YAAY;QACZ,WAAW;QACX,UAAU;KACX,CAAC,EAAE;QACF,KAAK,CAAC,iBAAiB;QACvB,wBAAwB;QACxB,aAAa;QACb,YAAY;QACZ,WAAW;QACX,UAAU;KACX,CAAC,CAAC;IAEH,OAAO,KAAC,cAAc,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YAAG,QAAQ,GAA2B,CAAC;AACrF,CAAC,CAAC","sourcesContent":["/**\n * Loading Context — Event-Driven State Aggregator\n *\n * Central loading state management. Subscribes to loading events on the EventBus\n * and maintains aggregate state for UI consumption.\n *\n * Architecture: EventBus → LoadingProvider (useReducer) → Context → Hooks\n *\n * Tier 1 (APPLICATION): Gates entire app — init, language change, org switch.\n * Tier 2 (COMPONENT): Per-scope — resource lists, detail views, etc.\n *\n * @see .cursor/plans/loading-system-architecture.md\n *\n * ARCHITECTURE NOTE:\n * This file exports the Provider component and context. Hooks are in separate files\n * (useAppLoading.ts, useComponentLoading.ts, useLoading.ts) for React Fast Refresh\n * compatibility — mixing components and hooks causes HMR invalidation loops.\n */\n\nimport React, { createContext, useReducer, useEffect, useRef, useCallback, useMemo, type ReactNode } from 'react';\nimport { frontendEventBus } from '~wildo-frontend-lib/core/events/event-bus.frontend.service';\nimport { FrontendEvents } from '~wildo-frontend-lib/core/events/events.frontend.schemas';\nimport { ResourcePrimaryScope } from '@wildo-ai/saas-models';\nimport { LoggerFrontendService } from '~wildo-frontend-lib/core/monitoring/logger.frontend.service';\nimport {\n LoadingTier,\n LoadingPhase,\n type LoadingScope,\n type ComponentLoadingState,\n type LoadingSource,\n} from './loading-types.frontend.schemas';\nimport { buildLoadingScopeKey } from './loading-scope.frontend.utils';\n\nconst logger = LoggerFrontendService.getLogger();\nconst logDebug = logger.debugByType('LoadingContext');\nlogger.setDebugTypeLogging('LoadingContext', false);\n\n// ─── Internal State ─────────────────────────────────────────────────────────\n\nenum LoadingActionType {\n APP_LOADING_START = 'APP_LOADING_START',\n APP_LOADING_END = 'APP_LOADING_END',\n COMPONENT_LOADING_START = 'COMPONENT_LOADING_START',\n COMPONENT_LOADING_END = 'COMPONENT_LOADING_END',\n}\n\ninterface LoadingInternalState {\n appLoadingSources: Map<string, LoadingSource>;\n componentLoadingMap: Map<string, ComponentLoadingState>;\n}\n\ntype LoadingAction =\n | { type: LoadingActionType.APP_LOADING_START; identifier: string; source: LoadingSource }\n | { type: LoadingActionType.APP_LOADING_END; identifier: string }\n | { type: LoadingActionType.COMPONENT_LOADING_START; scopeKey: string; phase: LoadingPhase }\n | { type: LoadingActionType.COMPONENT_LOADING_END; scopeKey: string };\n\nconst initialState: LoadingInternalState = {\n appLoadingSources: new Map(),\n componentLoadingMap: new Map(),\n};\n\n/**\n * IMPORTANT: Returns new Map instances on every mutation.\n * React detects state changes by reference equality — mutating a Map in place\n * returns the same reference and triggers no re-render.\n */\nfunction loadingReducer(state: LoadingInternalState, action: LoadingAction): LoadingInternalState {\n switch (action.type) {\n case LoadingActionType.APP_LOADING_START: {\n const next = new Map(state.appLoadingSources);\n next.set(action.identifier, action.source);\n return { ...state, appLoadingSources: next };\n }\n case LoadingActionType.APP_LOADING_END: {\n const next = new Map(state.appLoadingSources);\n next.delete(action.identifier);\n return { ...state, appLoadingSources: next };\n }\n case LoadingActionType.COMPONENT_LOADING_START: {\n const next = new Map(state.componentLoadingMap);\n const existing = next.get(action.scopeKey);\n const activeCount = (existing?.activeCount ?? 0) + 1;\n next.set(action.scopeKey, {\n hasLoadedOnce: existing?.hasLoadedOnce ?? false,\n isLoading: true,\n phase: action.phase,\n activeCount,\n });\n return { ...state, componentLoadingMap: next };\n }\n case LoadingActionType.COMPONENT_LOADING_END: {\n const next = new Map(state.componentLoadingMap);\n const existing = next.get(action.scopeKey);\n if (!existing) return state;\n const activeCount = Math.max(0, existing.activeCount - 1);\n next.set(action.scopeKey, {\n hasLoadedOnce: true,\n isLoading: activeCount > 0,\n phase: existing.phase,\n activeCount,\n });\n return { ...state, componentLoadingMap: next };\n }\n default:\n return state;\n }\n}\n\n// ─── LoadedOnce LRU Cache ───────────────────────────────────────────────────\n\n/**\n * Tracks data contexts that have been successfully loaded and rendered.\n * Used to distinguish initial loads from refreshes on re-visit.\n *\n * LRU eviction: oldest entries are evicted when cache exceeds maxEntries.\n * Map insertion order is exploited — delete+re-set moves entry to end.\n */\nclass LoadedOnceCache {\n private cache = new Map<string, { lastRenderedAt: number }>();\n private readonly maxEntries = 200;\n\n has(scopeKey: string, refreshThresholdMs: number = 5 * 60 * 1000): boolean {\n const entry = this.cache.get(scopeKey);\n if (!entry) return false;\n return (Date.now() - entry.lastRenderedAt) < refreshThresholdMs;\n }\n\n set(scopeKey: string): void {\n this.cache.delete(scopeKey);\n this.cache.set(scopeKey, { lastRenderedAt: Date.now() });\n if (this.cache.size > this.maxEntries) {\n const oldest = this.cache.keys().next().value;\n if (oldest !== undefined) this.cache.delete(oldest);\n }\n }\n\n clear(): void {\n this.cache.clear();\n }\n}\n\n// ─── Context Type ───────────────────────────────────────────────────────────\n\nexport interface LoadingContextType {\n // Tier 1 read-only state\n isAppLoading: boolean;\n appLoadingSources: LoadingSource[];\n\n // Tier 2 state access\n getComponentLoadingState: (scopeKey: string) => ComponentLoadingState | undefined;\n\n // hasLoadedOnce cache access\n hasLoadedOnce: (scopeKey: string, refreshThresholdMs?: number) => boolean;\n markRendered: (scopeKey: string) => void;\n\n /**\n * Emit a loading start event via EventBus.\n * State comes back through the subscription pipeline.\n */\n fireLoading: (scope: LoadingScope, options?: { phase?: LoadingPhase; tier?: LoadingTier }) => void;\n /**\n * Emit a loading end event via EventBus.\n * Must pass the same tier used in fireLoading() — APPLICATION-tier loading\n * won't be ended if tier is omitted (defaults to COMPONENT).\n */\n endLoading: (scope: LoadingScope, options?: { tier?: LoadingTier }) => void;\n}\n\n/**\n * @internal Use useLoading(), useAppLoading(), or useComponentLoading() hooks\n */\nexport const LoadingContext: React.Context<LoadingContextType | undefined> = createContext<LoadingContextType | undefined>(undefined);\n\n// ─── Provider ───────────────────────────────────────────────────────────────\n\nexport const LoadingProvider: React.FC<{ children: ReactNode }> = ({ children }) => {\n const [state, dispatch] = useReducer(loadingReducer, initialState);\n const loadedOnceCacheRef = useRef(new LoadedOnceCache());\n\n useEffect(() => {\n const identifiers = Array.from(state.appLoadingSources.keys());\n logDebug(`App loading state: ${state.appLoadingSources.size > 0 ? 'loading' : 'ready'} [${identifiers.join(', ') || 'none'}]`);\n }, [state.appLoadingSources]);\n\n // ── Subscribe to loading events ──────────────────────────────────────────\n\n useEffect(() => {\n const unsubscribes: Array<() => void> = [];\n\n unsubscribes.push(\n frontendEventBus.on(FrontendEvents.LOADING_RESOURCE_START, (payload) => {\n const scopeKey = buildLoadingScopeKey({\n resourceType: payload.resourceType,\n operation: payload.operationIdentifier,\n discriminator: payload.optionalDiscriminator,\n });\n const tier = payload.tier ?? LoadingTier.COMPONENT;\n const phase = payload.phase ?? LoadingPhase.INITIAL;\n\n if (tier === LoadingTier.APPLICATION) {\n logDebug(`APP_LOADING_START resource:${scopeKey}`);\n dispatch({ type: LoadingActionType.APP_LOADING_START, identifier: scopeKey, source: { identifier: scopeKey, tier, startedAt: Date.now() } });\n } else {\n dispatch({ type: LoadingActionType.COMPONENT_LOADING_START, scopeKey, phase });\n }\n })\n );\n\n unsubscribes.push(\n frontendEventBus.on(FrontendEvents.LOADING_RESOURCE_END, (payload) => {\n const scopeKey = buildLoadingScopeKey({\n resourceType: payload.resourceType,\n operation: payload.operationIdentifier,\n discriminator: payload.optionalDiscriminator,\n });\n const tier = payload.tier ?? LoadingTier.COMPONENT;\n\n if (tier === LoadingTier.APPLICATION) {\n logDebug(`APP_LOADING_END resource:${scopeKey}`);\n dispatch({ type: LoadingActionType.APP_LOADING_END, identifier: scopeKey });\n } else {\n dispatch({ type: LoadingActionType.COMPONENT_LOADING_END, scopeKey });\n }\n })\n );\n\n unsubscribes.push(\n frontendEventBus.on(FrontendEvents.LOADING_CUSTOM_START, (payload) => {\n const tier = payload.tier ?? LoadingTier.COMPONENT;\n const phase = payload.phase ?? LoadingPhase.INITIAL;\n if (tier === LoadingTier.APPLICATION) {\n logDebug(`APP_LOADING_START custom:${payload.identifier}`);\n dispatch({ type: LoadingActionType.APP_LOADING_START, identifier: payload.identifier, source: { identifier: payload.identifier, tier, startedAt: Date.now() } });\n } else {\n dispatch({ type: LoadingActionType.COMPONENT_LOADING_START, scopeKey: `custom:${payload.identifier}`, phase });\n }\n })\n );\n\n unsubscribes.push(\n frontendEventBus.on(FrontendEvents.LOADING_CUSTOM_END, (payload) => {\n const tier = payload.tier ?? LoadingTier.COMPONENT;\n if (tier === LoadingTier.APPLICATION) {\n logDebug(`APP_LOADING_END custom:${payload.identifier}`);\n dispatch({ type: LoadingActionType.APP_LOADING_END, identifier: payload.identifier });\n } else {\n dispatch({ type: LoadingActionType.COMPONENT_LOADING_END, scopeKey: `custom:${payload.identifier}` });\n }\n })\n );\n\n return () => unsubscribes.forEach(unsub => unsub());\n }, []);\n\n // ── Global clear events — invalidate hasLoadedOnce cache ─────────────────\n\n useEffect(() => {\n const unsubscribes: Array<() => void> = [];\n\n unsubscribes.push(\n frontendEventBus.on(FrontendEvents.PRIMARY_SCOPE_CHANGED, (payload) => {\n if (payload.scopeLevel === ResourcePrimaryScope.ORGANIZATIONS) {\n loadedOnceCacheRef.current.clear();\n }\n })\n );\n\n /*\n * The person this tab knew is gone (#1996): the next person must see every resource's first-load state,\n * not inherit the previous person's \"already loaded\" marks. `USER_LOGOUT` is announced once per\n * departure on every path — sign-out, a refused refresh, a failed restore, another tab's sign-out, a\n * replacement. This listened to `AUTH_LOGOUT_REQUIRED` before, an event nothing ever emitted.\n */\n unsubscribes.push(\n frontendEventBus.on(FrontendEvents.USER_LOGOUT, () => {\n loadedOnceCacheRef.current.clear();\n })\n );\n\n unsubscribes.push(\n frontendEventBus.on(FrontendEvents.WHOLE_APP_REFRESH, () => {\n loadedOnceCacheRef.current.clear();\n })\n );\n\n return () => unsubscribes.forEach(unsub => unsub());\n }, []);\n\n // ── New API methods ──────────────────────────────────────────────────────\n\n const getComponentLoadingState = useCallback(\n (scopeKey: string): ComponentLoadingState | undefined => state.componentLoadingMap.get(scopeKey),\n [state.componentLoadingMap]\n );\n\n const hasLoadedOnce = useCallback(\n (scopeKey: string, refreshThresholdMs?: number): boolean => loadedOnceCacheRef.current.has(scopeKey, refreshThresholdMs),\n []\n );\n\n const markRendered = useCallback(\n (scopeKey: string): void => loadedOnceCacheRef.current.set(scopeKey),\n []\n );\n\n const fireLoading = useCallback((scope: LoadingScope, options?: { phase?: LoadingPhase; tier?: LoadingTier }) => {\n const isCustom = !!scope.customIdentifier;\n if (isCustom) {\n frontendEventBus.emit(FrontendEvents.LOADING_CUSTOM_START, {\n identifier: scope.customIdentifier!,\n data: undefined,\n tier: options?.tier,\n phase: options?.phase,\n });\n } else {\n frontendEventBus.emit(FrontendEvents.LOADING_RESOURCE_START, {\n resourceType: scope.resourceType ?? '',\n operationIdentifier: scope.operation ?? '',\n optionalDiscriminator: scope.discriminator,\n contextResourceIdentifiers: {},\n tier: options?.tier,\n phase: options?.phase,\n });\n }\n }, []);\n\n const endLoading = useCallback((scope: LoadingScope, options?: { tier?: LoadingTier }) => {\n const isCustom = !!scope.customIdentifier;\n if (isCustom) {\n frontendEventBus.emit(FrontendEvents.LOADING_CUSTOM_END, {\n identifier: scope.customIdentifier!,\n data: undefined,\n tier: options?.tier,\n });\n } else {\n frontendEventBus.emit(FrontendEvents.LOADING_RESOURCE_END, {\n resourceType: scope.resourceType ?? '',\n operationIdentifier: scope.operation ?? '',\n optionalDiscriminator: scope.discriminator,\n contextResourceIdentifiers: {},\n tier: options?.tier,\n });\n }\n }, []);\n\n // ── Build context value ──────────────────────────────────────────────────\n\n const value: LoadingContextType = useMemo(() => ({\n isAppLoading: state.appLoadingSources.size > 0,\n appLoadingSources: Array.from(state.appLoadingSources.values()),\n getComponentLoadingState,\n hasLoadedOnce,\n markRendered,\n fireLoading,\n endLoading,\n }), [\n state.appLoadingSources,\n getComponentLoadingState,\n hasLoadedOnce,\n markRendered,\n fireLoading,\n endLoading,\n ]);\n\n return <LoadingContext.Provider value={value}>{children}</LoadingContext.Provider>;\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LoadingGate.d.ts","sourceRoot":"","sources":["../../../../../src/core/loading/LoadingGate.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA2D,MAAM,OAAO,CAAC;AAChF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,mBAAmB,EAAyB,MAAM,kCAAkC,CAAC;AAWtJ,MAAM,WAAW,gBAAgB;IAC/B,uEAAuE;IACvE,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC;IAC/B,uEAAuE;IACvE,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,yEAAyE;IACzE,SAAS,CAAC,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IACpD,4DAA4D;IAC5D,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,0EAA0E;IAC1E,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,SAAS,CAAC;IAC7D,0DAA0D;IAC1D,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,SAAS,CAAC;IAC1D,oFAAoF;IACpF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,SAAS,CAAC;CACrB;
|
|
1
|
+
{"version":3,"file":"LoadingGate.d.ts","sourceRoot":"","sources":["../../../../../src/core/loading/LoadingGate.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA2D,MAAM,OAAO,CAAC;AAChF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,mBAAmB,EAAyB,MAAM,kCAAkC,CAAC;AAWtJ,MAAM,WAAW,gBAAgB;IAC/B,uEAAuE;IACvE,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC;IAC/B,uEAAuE;IACvE,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,yEAAyE;IACzE,SAAS,CAAC,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IACpD,4DAA4D;IAC5D,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,0EAA0E;IAC1E,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,SAAS,CAAC;IAC7D,0DAA0D;IAC1D,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,SAAS,CAAC;IAC1D,oFAAoF;IACpF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAkDD;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CAAC,EAC1B,aAAa,EACb,QAAQ,EACR,SAAS,EACT,MAAM,EACN,aAAa,EACb,WAAW,EACX,SAAS,EACT,QAAQ,GACT,EAAE,gBAAgB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CA0OtC"}
|
|
@@ -29,6 +29,24 @@ function resolveSurfaceLoadingPolicy(value) {
|
|
|
29
29
|
return undefined;
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
|
+
/**
|
|
33
|
+
* The box a READY child-keeping gate wraps its children in — transparent to its PARENT's layout model.
|
|
34
|
+
*
|
|
35
|
+
* `display: contents` is transparent to a FLEX or GRID parent: the children become the items, so gaps,
|
|
36
|
+
* `h-full` chains and grid placement all survive (the reason the wrapper is `contents` at all — see the
|
|
37
|
+
* comment where it renders). It is NOT transparent to a MARGIN STACK. `space-y-*` spaces a parent's
|
|
38
|
+
* children with `margin-block-end` on each one, and a `contents` box has no box to hold a margin, so the
|
|
39
|
+
* gap after every gated surface vanished: measured 2026-09-25 on Wonder Todos, where a todo's record body
|
|
40
|
+
* and the workspace composite below it touched edge to edge on every READ page, because the displayer's
|
|
41
|
+
* gate sat directly inside the read layout's `space-y-section`.
|
|
42
|
+
*
|
|
43
|
+
* In a margin stack the parent is ordinary block flow, and there a plain block wrapper is the transparent
|
|
44
|
+
* choice: it lays out exactly as its content would and carries the stack's margin. So the gate is a block
|
|
45
|
+
* box when its parent is a `space-y-*` stack and `contents` everywhere else. Keyed on the parent's own
|
|
46
|
+
* utility because that is the layout decision the gate has to agree with; the class list is the only place
|
|
47
|
+
* it is written down.
|
|
48
|
+
*/
|
|
49
|
+
const READY_GATE_TRANSPARENT_BOX_CLASS = "contents [:where([class*='space-y-'])>&]:block";
|
|
32
50
|
/** Treatments that render the gate's children while loading — the ones a remount would cost something under. */
|
|
33
51
|
const CHILD_KEEPING_TREATMENTS = new Set([
|
|
34
52
|
LoadingTreatment.OPACITY_OVERLAY,
|
|
@@ -182,7 +200,7 @@ export function LoadingGate({ loadingScopes, i18nKeys, readiness, policy, render
|
|
|
182
200
|
const keepsChildrenWhileLoading = CHILD_KEEPING_TREATMENTS.has(refreshTreatment) || CHILD_KEEPING_TREATMENTS.has(initialTreatment);
|
|
183
201
|
if (allReady) {
|
|
184
202
|
return keepsChildrenWhileLoading
|
|
185
|
-
? _jsx("div", { className:
|
|
203
|
+
? _jsx("div", { className: READY_GATE_TRANSPARENT_BOX_CLASS, "data-loading-gate": "ready", children: children })
|
|
186
204
|
: _jsx(_Fragment, { children: children });
|
|
187
205
|
}
|
|
188
206
|
// ── Not ready — render loading treatment ────────────────────────────────
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LoadingGate.js","sourceRoot":"","sources":["../../../../../src/core/loading/LoadingGate.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useContext, useEffect, useMemo, useRef, useState } from 'react';\nimport type { ReactNode } from 'react';\nimport type { LoadingScope, LoadingPolicy, LoadingRenderContext, LoadingErrorContext, ComponentLoadingState } from './loading-types.frontend.schemas';\nimport { LoadingTreatment, LoadingPhase } from './loading-types.frontend.schemas';\nimport { LoadingContext } from './LoadingContext';\nimport { buildLoadingScopeKey } from './loading-scope.frontend.utils';\nimport { LoadingSpinner } from '~wildo-frontend-lib/components/feedback/loading-spinner';\nimport { LoadingOverlay } from '~wildo-frontend-lib/components/feedback/loading-overlay';\nimport { Skeleton } from '~wildo-frontend-lib/components/feedback/skeleton';\nimport { useI18n } from '~wildo-frontend-lib/core/i18n/useI18n';\nimport { useSurfacePolicy } from '~wildo-frontend-lib/core/ui/SurfacePolicyContext';\nimport type { LoadingDisplayMode } from '@wildo-ai/presets-components-models';\n\nexport interface LoadingGateProps {\n /** Loading scopes to wait for — each scope is tracked independently */\n loadingScopes?: LoadingScope[];\n /** i18n dot-path keys that must be loaded before rendering children */\n i18nKeys?: string[];\n /** Custom readiness signals — all must be `true` for the gate to open */\n readiness?: Array<{ id: string; isReady: boolean }>;\n /** Loading policy determining visual treatment per phase */\n policy?: LoadingPolicy;\n /** Custom loading renderer — called for CUSTOM and SKELETON treatments */\n renderLoading?: (context: LoadingRenderContext) => ReactNode;\n /** Error renderer — called on timeout or loading error */\n renderError?: (context: LoadingErrorContext) => ReactNode;\n /** Timeout in ms after which the gate shows an error state. Default: no timeout. */\n timeoutMs?: number;\n children: ReactNode;\n}\n\nfunction resolveSurfaceLoadingPolicy(value: LoadingDisplayMode | string | undefined): LoadingPolicy | undefined {\n switch (value) {\n case 'overlay':\n return {\n initialLoad: LoadingTreatment.OPACITY_OVERLAY,\n refresh: LoadingTreatment.OPACITY_OVERLAY,\n };\n case 'spinner-only':\n return {\n initialLoad: LoadingTreatment.SPINNER,\n refresh: LoadingTreatment.SPINNER,\n };\n case 'skeleton-children':\n return {\n initialLoad: LoadingTreatment.SKELETON,\n refresh: LoadingTreatment.OPACITY_OVERLAY,\n };\n default:\n return undefined;\n }\n}\n\n/** Treatments that render the gate's children while loading — the ones a remount would cost something under. */\nconst CHILD_KEEPING_TREATMENTS: ReadonlySet<LoadingTreatment> = new Set([\n LoadingTreatment.OPACITY_OVERLAY,\n LoadingTreatment.HIDDEN,\n LoadingTreatment.INVISIBLE,\n]);\n\n/**\n * LoadingGate — Universal gating component for loading dependencies.\n *\n * Waits for all specified dependencies (loading scopes, i18n keys, custom\n * readiness signals) before rendering children. While waiting, renders the\n * appropriate visual treatment based on the loading policy.\n *\n * Explicit `policy` props win first. When absent, the enclosing surface policy\n * chooses the default treatment: BASE-style surfaces skeleton, OVERLAY surfaces\n * overlay children, and TRANSIENT surfaces use a spinner-only affordance.\n *\n * @see loading-system-architecture.md §2.5\n */\nexport function LoadingGate({\n loadingScopes,\n i18nKeys,\n readiness,\n policy,\n renderLoading,\n renderError,\n timeoutMs,\n children,\n}: LoadingGateProps): React.JSX.Element {\n if (process.env.NODE_ENV !== 'production' && timeoutMs && !renderError) {\n console.warn('[LoadingGate] timeoutMs is set without renderError — timeout will have no visible effect. Provide renderError to surface timeout failures.');\n }\n\n const context = useContext(LoadingContext);\n if (!context) throw new Error('LoadingGate must be used within a LoadingProvider');\n\n const surfacePolicy = useSurfacePolicy();\n const effectivePolicy = policy ?? resolveSurfaceLoadingPolicy(surfacePolicy.interactiveState?.loadingDisplay);\n\n const i18nDeps = useMemo(() => ({ keys: i18nKeys ?? [] }), [i18nKeys]);\n const { requestKeys, isKeySettled, isReady } = useI18n(i18nDeps);\n\n // ── Loading scope states ─────────────────────────────────────────────────\n\n const scopeStates = useMemo(() => {\n if (!loadingScopes?.length) return [];\n return loadingScopes.map(scope => {\n const key = buildLoadingScopeKey(scope);\n const state: ComponentLoadingState | undefined = context.getComponentLoadingState(key);\n const isLoading = state?.isLoading ?? false;\n const hasLoadedOnce = context.hasLoadedOnce(key);\n return { scope, key, isLoading, hasLoadedOnce };\n });\n }, [loadingScopes, context]);\n\n const loadingScopesReady = scopeStates.length === 0 || scopeStates.every(s => !s.isLoading);\n\n // ── i18n key readiness ──────────────────────────────────────────────────\n\n useEffect(() => {\n if (i18nKeys?.length) {\n /*\n * Fire-and-forget, so the rejection is observed here. `requestKeys` rejects when the bundle\n * fetch fails; with nobody awaiting it that reaches the window as an unhandled rejection,\n * while saying nothing new — `flushBatch` already reported the failure once and settled the\n * keys. The gate below reads that settled state.\n */\n void requestKeys(i18nKeys).catch(() => undefined);\n }\n }, [i18nKeys, requestKeys]);\n\n /*\n * SETTLED, not loaded — the same distinction `useI18n.isReady` makes, and for the same reason.\n * `isKeyLoaded` stays false forever for a key whose bundle failed, so gating on it turned one\n * failed request into a gate that never opens: a permanent spinner in place of the content. A\n * settled-but-failed key opens the gate and the label lookup reports the label as missing, which\n * is visible and correct, rather than hiding the whole surface behind a loader.\n */\n const i18nReady = !i18nKeys?.length || i18nKeys.every(k => isKeySettled(k));\n\n // ── Custom readiness signals ────────────────────────────────────────────\n\n const customReady = !readiness?.length || readiness.every(r => r.isReady);\n\n // ── Combined readiness ──────────────────────────────────────────────────\n\n const allReady = loadingScopesReady && i18nReady && customReady;\n\n // ── Determine loading phase ─────────────────────────────────────────────\n\n const phase = useMemo(() => {\n if (scopeStates.some(s => s.isLoading && !s.hasLoadedOnce)) return LoadingPhase.INITIAL;\n if (scopeStates.some(s => s.isLoading && s.hasLoadedOnce)) return LoadingPhase.REFRESH;\n return LoadingPhase.INITIAL;\n }, [scopeStates]);\n\n // ── Timeout handling ────────────────────────────────────────────────────\n\n const [timedOut, setTimedOut] = useState(false);\n const loadingStartRef = useRef<number | null>(null);\n\n useEffect(() => {\n if (allReady) {\n loadingStartRef.current = null;\n setTimedOut(false);\n return;\n }\n\n if (!loadingStartRef.current) {\n loadingStartRef.current = Date.now();\n }\n\n if (!timeoutMs) return;\n\n const elapsed = Date.now() - loadingStartRef.current;\n const remaining = timeoutMs - elapsed;\n\n if (remaining <= 0) {\n setTimedOut(true);\n return;\n }\n\n const timer = setTimeout(() => setTimedOut(true), remaining);\n return () => clearTimeout(timer);\n }, [allReady, timeoutMs]);\n\n // ── Mark rendered on first ready ────────────────────────────────────────\n\n const hasMarkedRef = useRef(false);\n\n useEffect(() => {\n if (allReady && !hasMarkedRef.current && loadingScopes?.length) {\n hasMarkedRef.current = true;\n for (const scope of loadingScopes) {\n context.markRendered(buildLoadingScopeKey(scope));\n }\n }\n if (!allReady) {\n hasMarkedRef.current = false;\n }\n }, [allReady, loadingScopes, context]);\n\n // ── Timeout error state ─────────────────────────────────────────────────\n\n if (timedOut && renderError) {\n const failedScopes = scopeStates.filter(s => s.isLoading).map(s => s.scope);\n return (\n <>\n {renderError({\n failedScopes,\n reason: 'timeout',\n retry: () => {\n setTimedOut(false);\n loadingStartRef.current = Date.now();\n },\n })}\n </>\n );\n }\n\n // ── Ready — render children ─────────────────────────────────────────────\n\n const refreshTreatment = effectivePolicy?.refresh ?? LoadingTreatment.OPACITY_OVERLAY;\n const initialTreatment = effectivePolicy?.initialLoad ?? LoadingTreatment.SKELETON;\n /*\n * ONE WRAPPER ACROSS THE TRANSITION, for every treatment that keeps the children on screen.\n *\n * React keeps a subtree's state only while its parent is the same element TYPE at the same\n * position. The ready branch returned a fragment and `OPACITY_OVERLAY` / `HIDDEN` / `INVISIBLE`\n * returned a `<div>`, so every passage between them — the end of a load, and the start AND end of\n * every refresh — unmounted the whole surface and mounted a new one. Everything a reader had set\n * inside it went with it: the selected tab, an open accordion, the scroll position.\n *\n * Measured 2026-09-21 on the workbench's actor-task modal, whose READ takes ~3 s: a tab clicked\n * during the load was reset to the first one when the record arrived, and the replaced ancestor\n * was this gate's own `relative` overlay wrapper. It presented as \"the Conversation tab does not\n * work\", three layers away from the cause.\n *\n * So a gate whose policy CAN keep its children renders the same `<div>` in both states and only\n * its class moves. Ready is `display: contents`, which leaves the children laid out exactly as\n * the fragment did — flex items, grid items and `h-full` chains all survive, which a block\n * wrapper would break in the state a surface spends its life in. Rejected alternative: keeping\n * the fragment and floating the overlay beside the children, which leaves the overlay with no\n * positioned box of its own to cover.\n *\n * A gate whose policy never keeps children (skeleton / spinner / full screen in both phases) has\n * nothing to preserve and keeps the bare fragment.\n */\n const keepsChildrenWhileLoading = CHILD_KEEPING_TREATMENTS.has(refreshTreatment) || CHILD_KEEPING_TREATMENTS.has(initialTreatment);\n\n if (allReady) {\n return keepsChildrenWhileLoading\n ? <div className=\"contents\" data-loading-gate=\"ready\">{children}</div>\n : <>{children}</>;\n }\n\n // ── Not ready — render loading treatment ────────────────────────────────\n\n const treatment = phase === LoadingPhase.REFRESH ? refreshTreatment : initialTreatment;\n\n const renderContext: LoadingRenderContext = {\n phase,\n scope: scopeStates[0]?.scope ?? { customIdentifier: 'loading-gate' },\n };\n\n switch (treatment) {\n case LoadingTreatment.CUSTOM:\n return <>{renderLoading?.(renderContext) ?? children}</>;\n\n case LoadingTreatment.SKELETON:\n /*\n * The live region wraps a CUSTOM silhouette too.\n *\n * `renderLoading` used to return early, so a surface that drew its own skeleton — which is the\n * surface that most needs one, since it draws a whole collection — silently lost the `role=status`\n * announcement and the screen-reader \"Loading\" text. Supplying a better SHAPE should not cost the\n * assistive channel; the two are independent, and only the shape was ever being overridden.\n *\n * `CUSTOM` is different and still hands over everything: it means \"this treatment is not a\n * skeleton at all\", so the caller owns the semantics as well as the pixels.\n */\n return (\n <div role=\"status\" aria-live=\"polite\">\n <span className=\"sr-only\">Loading</span>\n {renderLoading\n ? renderLoading(renderContext)\n : <Skeleton template=\"auto\" density=\"auto\" aria-hidden=\"true\" />}\n </div>\n );\n\n case LoadingTreatment.SPINNER:\n return (\n <div className=\"flex items-center justify-center py-8\">\n <LoadingSpinner size={32} />\n </div>\n );\n\n case LoadingTreatment.OPACITY_OVERLAY:\n // `{children}` stays the FIRST child of the same `<div>` as the ready branch — see above.\n return (\n <div className=\"relative\" data-loading-gate=\"loading\">\n {children}\n <LoadingOverlay />\n </div>\n );\n\n case LoadingTreatment.HIDDEN:\n return <div style={{ display: 'none' }} data-loading-gate=\"loading\">{children}</div>;\n\n case LoadingTreatment.INVISIBLE:\n return <div style={{ visibility: 'hidden' }} data-loading-gate=\"loading\">{children}</div>;\n\n case LoadingTreatment.FULL_SCREEN:\n return (\n <div className=\"fixed inset-0 z-(--z-critical) flex items-center justify-center bg-background/80\">\n <LoadingSpinner size={48} />\n </div>\n );\n\n default:\n return <>{children}</>;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"LoadingGate.js","sourceRoot":"","sources":["../../../../../src/core/loading/LoadingGate.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useContext, useEffect, useMemo, useRef, useState } from 'react';\nimport type { ReactNode } from 'react';\nimport type { LoadingScope, LoadingPolicy, LoadingRenderContext, LoadingErrorContext, ComponentLoadingState } from './loading-types.frontend.schemas';\nimport { LoadingTreatment, LoadingPhase } from './loading-types.frontend.schemas';\nimport { LoadingContext } from './LoadingContext';\nimport { buildLoadingScopeKey } from './loading-scope.frontend.utils';\nimport { LoadingSpinner } from '~wildo-frontend-lib/components/feedback/loading-spinner';\nimport { LoadingOverlay } from '~wildo-frontend-lib/components/feedback/loading-overlay';\nimport { Skeleton } from '~wildo-frontend-lib/components/feedback/skeleton';\nimport { useI18n } from '~wildo-frontend-lib/core/i18n/useI18n';\nimport { useSurfacePolicy } from '~wildo-frontend-lib/core/ui/SurfacePolicyContext';\nimport type { LoadingDisplayMode } from '@wildo-ai/presets-components-models';\n\nexport interface LoadingGateProps {\n /** Loading scopes to wait for — each scope is tracked independently */\n loadingScopes?: LoadingScope[];\n /** i18n dot-path keys that must be loaded before rendering children */\n i18nKeys?: string[];\n /** Custom readiness signals — all must be `true` for the gate to open */\n readiness?: Array<{ id: string; isReady: boolean }>;\n /** Loading policy determining visual treatment per phase */\n policy?: LoadingPolicy;\n /** Custom loading renderer — called for CUSTOM and SKELETON treatments */\n renderLoading?: (context: LoadingRenderContext) => ReactNode;\n /** Error renderer — called on timeout or loading error */\n renderError?: (context: LoadingErrorContext) => ReactNode;\n /** Timeout in ms after which the gate shows an error state. Default: no timeout. */\n timeoutMs?: number;\n children: ReactNode;\n}\n\nfunction resolveSurfaceLoadingPolicy(value: LoadingDisplayMode | string | undefined): LoadingPolicy | undefined {\n switch (value) {\n case 'overlay':\n return {\n initialLoad: LoadingTreatment.OPACITY_OVERLAY,\n refresh: LoadingTreatment.OPACITY_OVERLAY,\n };\n case 'spinner-only':\n return {\n initialLoad: LoadingTreatment.SPINNER,\n refresh: LoadingTreatment.SPINNER,\n };\n case 'skeleton-children':\n return {\n initialLoad: LoadingTreatment.SKELETON,\n refresh: LoadingTreatment.OPACITY_OVERLAY,\n };\n default:\n return undefined;\n }\n}\n\n/**\n * The box a READY child-keeping gate wraps its children in — transparent to its PARENT's layout model.\n *\n * `display: contents` is transparent to a FLEX or GRID parent: the children become the items, so gaps,\n * `h-full` chains and grid placement all survive (the reason the wrapper is `contents` at all — see the\n * comment where it renders). It is NOT transparent to a MARGIN STACK. `space-y-*` spaces a parent's\n * children with `margin-block-end` on each one, and a `contents` box has no box to hold a margin, so the\n * gap after every gated surface vanished: measured 2026-09-25 on Wonder Todos, where a todo's record body\n * and the workspace composite below it touched edge to edge on every READ page, because the displayer's\n * gate sat directly inside the read layout's `space-y-section`.\n *\n * In a margin stack the parent is ordinary block flow, and there a plain block wrapper is the transparent\n * choice: it lays out exactly as its content would and carries the stack's margin. So the gate is a block\n * box when its parent is a `space-y-*` stack and `contents` everywhere else. Keyed on the parent's own\n * utility because that is the layout decision the gate has to agree with; the class list is the only place\n * it is written down.\n */\nconst READY_GATE_TRANSPARENT_BOX_CLASS = \"contents [:where([class*='space-y-'])>&]:block\";\n\n/** Treatments that render the gate's children while loading — the ones a remount would cost something under. */\nconst CHILD_KEEPING_TREATMENTS: ReadonlySet<LoadingTreatment> = new Set([\n LoadingTreatment.OPACITY_OVERLAY,\n LoadingTreatment.HIDDEN,\n LoadingTreatment.INVISIBLE,\n]);\n\n/**\n * LoadingGate — Universal gating component for loading dependencies.\n *\n * Waits for all specified dependencies (loading scopes, i18n keys, custom\n * readiness signals) before rendering children. While waiting, renders the\n * appropriate visual treatment based on the loading policy.\n *\n * Explicit `policy` props win first. When absent, the enclosing surface policy\n * chooses the default treatment: BASE-style surfaces skeleton, OVERLAY surfaces\n * overlay children, and TRANSIENT surfaces use a spinner-only affordance.\n *\n * @see loading-system-architecture.md §2.5\n */\nexport function LoadingGate({\n loadingScopes,\n i18nKeys,\n readiness,\n policy,\n renderLoading,\n renderError,\n timeoutMs,\n children,\n}: LoadingGateProps): React.JSX.Element {\n if (process.env.NODE_ENV !== 'production' && timeoutMs && !renderError) {\n console.warn('[LoadingGate] timeoutMs is set without renderError — timeout will have no visible effect. Provide renderError to surface timeout failures.');\n }\n\n const context = useContext(LoadingContext);\n if (!context) throw new Error('LoadingGate must be used within a LoadingProvider');\n\n const surfacePolicy = useSurfacePolicy();\n const effectivePolicy = policy ?? resolveSurfaceLoadingPolicy(surfacePolicy.interactiveState?.loadingDisplay);\n\n const i18nDeps = useMemo(() => ({ keys: i18nKeys ?? [] }), [i18nKeys]);\n const { requestKeys, isKeySettled, isReady } = useI18n(i18nDeps);\n\n // ── Loading scope states ─────────────────────────────────────────────────\n\n const scopeStates = useMemo(() => {\n if (!loadingScopes?.length) return [];\n return loadingScopes.map(scope => {\n const key = buildLoadingScopeKey(scope);\n const state: ComponentLoadingState | undefined = context.getComponentLoadingState(key);\n const isLoading = state?.isLoading ?? false;\n const hasLoadedOnce = context.hasLoadedOnce(key);\n return { scope, key, isLoading, hasLoadedOnce };\n });\n }, [loadingScopes, context]);\n\n const loadingScopesReady = scopeStates.length === 0 || scopeStates.every(s => !s.isLoading);\n\n // ── i18n key readiness ──────────────────────────────────────────────────\n\n useEffect(() => {\n if (i18nKeys?.length) {\n /*\n * Fire-and-forget, so the rejection is observed here. `requestKeys` rejects when the bundle\n * fetch fails; with nobody awaiting it that reaches the window as an unhandled rejection,\n * while saying nothing new — `flushBatch` already reported the failure once and settled the\n * keys. The gate below reads that settled state.\n */\n void requestKeys(i18nKeys).catch(() => undefined);\n }\n }, [i18nKeys, requestKeys]);\n\n /*\n * SETTLED, not loaded — the same distinction `useI18n.isReady` makes, and for the same reason.\n * `isKeyLoaded` stays false forever for a key whose bundle failed, so gating on it turned one\n * failed request into a gate that never opens: a permanent spinner in place of the content. A\n * settled-but-failed key opens the gate and the label lookup reports the label as missing, which\n * is visible and correct, rather than hiding the whole surface behind a loader.\n */\n const i18nReady = !i18nKeys?.length || i18nKeys.every(k => isKeySettled(k));\n\n // ── Custom readiness signals ────────────────────────────────────────────\n\n const customReady = !readiness?.length || readiness.every(r => r.isReady);\n\n // ── Combined readiness ──────────────────────────────────────────────────\n\n const allReady = loadingScopesReady && i18nReady && customReady;\n\n // ── Determine loading phase ─────────────────────────────────────────────\n\n const phase = useMemo(() => {\n if (scopeStates.some(s => s.isLoading && !s.hasLoadedOnce)) return LoadingPhase.INITIAL;\n if (scopeStates.some(s => s.isLoading && s.hasLoadedOnce)) return LoadingPhase.REFRESH;\n return LoadingPhase.INITIAL;\n }, [scopeStates]);\n\n // ── Timeout handling ────────────────────────────────────────────────────\n\n const [timedOut, setTimedOut] = useState(false);\n const loadingStartRef = useRef<number | null>(null);\n\n useEffect(() => {\n if (allReady) {\n loadingStartRef.current = null;\n setTimedOut(false);\n return;\n }\n\n if (!loadingStartRef.current) {\n loadingStartRef.current = Date.now();\n }\n\n if (!timeoutMs) return;\n\n const elapsed = Date.now() - loadingStartRef.current;\n const remaining = timeoutMs - elapsed;\n\n if (remaining <= 0) {\n setTimedOut(true);\n return;\n }\n\n const timer = setTimeout(() => setTimedOut(true), remaining);\n return () => clearTimeout(timer);\n }, [allReady, timeoutMs]);\n\n // ── Mark rendered on first ready ────────────────────────────────────────\n\n const hasMarkedRef = useRef(false);\n\n useEffect(() => {\n if (allReady && !hasMarkedRef.current && loadingScopes?.length) {\n hasMarkedRef.current = true;\n for (const scope of loadingScopes) {\n context.markRendered(buildLoadingScopeKey(scope));\n }\n }\n if (!allReady) {\n hasMarkedRef.current = false;\n }\n }, [allReady, loadingScopes, context]);\n\n // ── Timeout error state ─────────────────────────────────────────────────\n\n if (timedOut && renderError) {\n const failedScopes = scopeStates.filter(s => s.isLoading).map(s => s.scope);\n return (\n <>\n {renderError({\n failedScopes,\n reason: 'timeout',\n retry: () => {\n setTimedOut(false);\n loadingStartRef.current = Date.now();\n },\n })}\n </>\n );\n }\n\n // ── Ready — render children ─────────────────────────────────────────────\n\n const refreshTreatment = effectivePolicy?.refresh ?? LoadingTreatment.OPACITY_OVERLAY;\n const initialTreatment = effectivePolicy?.initialLoad ?? LoadingTreatment.SKELETON;\n /*\n * ONE WRAPPER ACROSS THE TRANSITION, for every treatment that keeps the children on screen.\n *\n * React keeps a subtree's state only while its parent is the same element TYPE at the same\n * position. The ready branch returned a fragment and `OPACITY_OVERLAY` / `HIDDEN` / `INVISIBLE`\n * returned a `<div>`, so every passage between them — the end of a load, and the start AND end of\n * every refresh — unmounted the whole surface and mounted a new one. Everything a reader had set\n * inside it went with it: the selected tab, an open accordion, the scroll position.\n *\n * Measured 2026-09-21 on the workbench's actor-task modal, whose READ takes ~3 s: a tab clicked\n * during the load was reset to the first one when the record arrived, and the replaced ancestor\n * was this gate's own `relative` overlay wrapper. It presented as \"the Conversation tab does not\n * work\", three layers away from the cause.\n *\n * So a gate whose policy CAN keep its children renders the same `<div>` in both states and only\n * its class moves. Ready is `display: contents`, which leaves the children laid out exactly as\n * the fragment did — flex items, grid items and `h-full` chains all survive, which a block\n * wrapper would break in the state a surface spends its life in. Rejected alternative: keeping\n * the fragment and floating the overlay beside the children, which leaves the overlay with no\n * positioned box of its own to cover.\n *\n * A gate whose policy never keeps children (skeleton / spinner / full screen in both phases) has\n * nothing to preserve and keeps the bare fragment.\n */\n const keepsChildrenWhileLoading = CHILD_KEEPING_TREATMENTS.has(refreshTreatment) || CHILD_KEEPING_TREATMENTS.has(initialTreatment);\n\n if (allReady) {\n return keepsChildrenWhileLoading\n ? <div className={READY_GATE_TRANSPARENT_BOX_CLASS} data-loading-gate=\"ready\">{children}</div>\n : <>{children}</>;\n }\n\n // ── Not ready — render loading treatment ────────────────────────────────\n\n const treatment = phase === LoadingPhase.REFRESH ? refreshTreatment : initialTreatment;\n\n const renderContext: LoadingRenderContext = {\n phase,\n scope: scopeStates[0]?.scope ?? { customIdentifier: 'loading-gate' },\n };\n\n switch (treatment) {\n case LoadingTreatment.CUSTOM:\n return <>{renderLoading?.(renderContext) ?? children}</>;\n\n case LoadingTreatment.SKELETON:\n /*\n * The live region wraps a CUSTOM silhouette too.\n *\n * `renderLoading` used to return early, so a surface that drew its own skeleton — which is the\n * surface that most needs one, since it draws a whole collection — silently lost the `role=status`\n * announcement and the screen-reader \"Loading\" text. Supplying a better SHAPE should not cost the\n * assistive channel; the two are independent, and only the shape was ever being overridden.\n *\n * `CUSTOM` is different and still hands over everything: it means \"this treatment is not a\n * skeleton at all\", so the caller owns the semantics as well as the pixels.\n */\n return (\n <div role=\"status\" aria-live=\"polite\">\n <span className=\"sr-only\">Loading</span>\n {renderLoading\n ? renderLoading(renderContext)\n : <Skeleton template=\"auto\" density=\"auto\" aria-hidden=\"true\" />}\n </div>\n );\n\n case LoadingTreatment.SPINNER:\n return (\n <div className=\"flex items-center justify-center py-8\">\n <LoadingSpinner size={32} />\n </div>\n );\n\n case LoadingTreatment.OPACITY_OVERLAY:\n // `{children}` stays the FIRST child of the same `<div>` as the ready branch — see above.\n return (\n <div className=\"relative\" data-loading-gate=\"loading\">\n {children}\n <LoadingOverlay />\n </div>\n );\n\n case LoadingTreatment.HIDDEN:\n return <div style={{ display: 'none' }} data-loading-gate=\"loading\">{children}</div>;\n\n case LoadingTreatment.INVISIBLE:\n return <div style={{ visibility: 'hidden' }} data-loading-gate=\"loading\">{children}</div>;\n\n case LoadingTreatment.FULL_SCREEN:\n return (\n <div className=\"fixed inset-0 z-(--z-critical) flex items-center justify-center bg-background/80\">\n <LoadingSpinner size={48} />\n </div>\n );\n\n default:\n return <>{children}</>;\n }\n}\n"]}
|
|
@@ -5,7 +5,6 @@
|
|
|
5
5
|
* consent gating, and provider lifecycle management.
|
|
6
6
|
*/
|
|
7
7
|
import React from 'react';
|
|
8
|
-
import type { IAnalyticsProvider } from './analytics-provider.frontend.interface';
|
|
9
8
|
export interface AnalyticsContextValue {
|
|
10
9
|
/** Track a custom event (app-custom usage) */
|
|
11
10
|
track: (name: string, properties?: Record<string, unknown>) => void;
|
|
@@ -38,7 +37,21 @@ export interface AnalyticsIdentity {
|
|
|
38
37
|
export declare const AnalyticsIdentityPublisherContext: React.Context<(identity: AnalyticsIdentity) => () => void>;
|
|
39
38
|
export interface AnalyticsContextProviderProps {
|
|
40
39
|
children: React.ReactNode;
|
|
41
|
-
customProviders?: IAnalyticsProvider[];
|
|
42
40
|
}
|
|
41
|
+
/**
|
|
42
|
+
* Two kinds of destination, and only ONE of them is a vendor (#1704).
|
|
43
|
+
*
|
|
44
|
+
* - The ENGINE's own destinations (`console`, `backend_proxy`), selected by `analytics.providers`. They send
|
|
45
|
+
* nothing to a third party (the proxy posts to the application's own backend), and they keep the gate
|
|
46
|
+
* below: `analytics.enabled`, then `analytics.requiresConsent` / the ANALYTICS grant.
|
|
47
|
+
* - VENDORS (PostHog, …) arrive as `FRONTEND_PRODUCT_ANALYTICS` provider modules. They are started by the
|
|
48
|
+
* consent-based activation consumer once the person grants what they rest on, and stopped on withdrawal
|
|
49
|
+
* or sign-out; this context only dispatches to the sinks that are running. That replaced an
|
|
50
|
+
* `analyticsProviders` / `customProviders` door which let an application pass a vendor client here,
|
|
51
|
+
* behind a second consent gate and outside the CSP footprint — two gates for one decision.
|
|
52
|
+
*
|
|
53
|
+
* `analytics.enabled` stays the master switch for both: with it off, a `FRONTEND_PRODUCT_ANALYTICS` vendor is not
|
|
54
|
+
* even loaded (the consent-based consumer skips it), and any sink that is running receives nothing.
|
|
55
|
+
*/
|
|
43
56
|
export declare const AnalyticsContextProvider: React.FC<AnalyticsContextProviderProps>;
|
|
44
57
|
//# sourceMappingURL=AnalyticsContext.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AnalyticsContext.d.ts","sourceRoot":"","sources":["../../../../../../src/core/monitoring/analytics/AnalyticsContext.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAuF,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"AnalyticsContext.d.ts","sourceRoot":"","sources":["../../../../../../src/core/monitoring/analytics/AnalyticsContext.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAuF,MAAM,OAAO,CAAC;AAe5G,MAAM,WAAW,qBAAqB;IACpC,8CAA8C;IAC9C,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IACpE,wBAAwB;IACxB,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IACnE,8DAA8D;IAC9D,QAAQ,EAAE,OAAO,CAAC;IAClB,qDAAqD;IACrD,qBAAqB,EAAE,MAAM,CAAC;IAC9B,wEAAwE;IACxE,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7B,gFAAgF;IAChF,kBAAkB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACvE;;;;;OAKG;IACH,WAAW,EAAE,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;CAC5G;AAKD,eAAO,MAAM,gBAAgB,sCAAoD,CAAC;AAElF,sGAAsG;AACtG,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AACD,eAAO,MAAM,iCAAiC,2BAA6B,iBAAiB,KAAK,MAAM,IAAI,CAAe,CAAC;AAuB3H,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,wBAAwB,EAAE,KAAK,CAAC,EAAE,CAAC,6BAA6B,CAmb5E,CAAC"}
|