@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
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
2
|
+
import { CoreWebSocketEvent, HumanDecision_ActOutcomeKind, MAIN_API_BASE_PATH, MANUAL_CONTROLLER_ROUTES_URLS, ManualControllerRouteKey, } from '@wildo-ai/saas-models';
|
|
3
|
+
import { LoggerFrontendService } from '../../core/monitoring/logger.frontend.service.js';
|
|
4
|
+
import { useApplication } from '../../core/runtime/useApplication.js';
|
|
5
|
+
import { useWebSocket } from '../../core/requests/websockets/useWebSocket.js';
|
|
6
|
+
const logDebug = LoggerFrontendService.getLogger().debugByType('FlowsActorsDecisions');
|
|
7
|
+
/** A route template's `:param` segments, filled — encoded, so a decision id is never read as a path. */
|
|
8
|
+
function fillRoute(template, params) {
|
|
9
|
+
return template.replace(/:([A-Za-z]+)/g, (_segment, name) => encodeURIComponent(params[name] ?? ''));
|
|
10
|
+
}
|
|
11
|
+
const OUTCOME_KINDS = new Set(Object.values(HumanDecision_ActOutcomeKind));
|
|
12
|
+
/**
|
|
13
|
+
* The outcome a refusal carries. The act route answers a refusal with a non-2xx status AND the outcome as its
|
|
14
|
+
* body (404 for "not yours, missing or settled", 409 for a lost race, 422 for a refused edit…), so the body is
|
|
15
|
+
* read from the error rather than the status being turned into a guess.
|
|
16
|
+
*/
|
|
17
|
+
function outcomeOfRefusal(error) {
|
|
18
|
+
const data = error?.response?.data;
|
|
19
|
+
return data && typeof data.kind === 'string' && OUTCOME_KINDS.has(data.kind) ? data : undefined;
|
|
20
|
+
}
|
|
21
|
+
export function usePendingDecisions(options = {}) {
|
|
22
|
+
const list = options.list ?? true;
|
|
23
|
+
const { httpClient } = useApplication();
|
|
24
|
+
const { on } = useWebSocket();
|
|
25
|
+
const [decisions, setDecisions] = useState([]);
|
|
26
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
27
|
+
const mounted = useRef(true);
|
|
28
|
+
const refresh = useCallback(async () => {
|
|
29
|
+
if (!httpClient || !list)
|
|
30
|
+
return;
|
|
31
|
+
setIsLoading(true);
|
|
32
|
+
try {
|
|
33
|
+
const path = `${MAIN_API_BASE_PATH}${MANUAL_CONTROLLER_ROUTES_URLS[ManualControllerRouteKey.FLOWS_ACTORS_DECISIONS]}`;
|
|
34
|
+
const data = await httpClient.get(path, { silent: true });
|
|
35
|
+
if (mounted.current)
|
|
36
|
+
setDecisions(data?.decisions ?? []);
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
// No list is shown as no list, and logged: a failure here must not look like an empty inbox forever.
|
|
40
|
+
logDebug('Pending decisions could not be read', { error: error instanceof Error ? error.message : 'unknown' });
|
|
41
|
+
}
|
|
42
|
+
finally {
|
|
43
|
+
if (mounted.current)
|
|
44
|
+
setIsLoading(false);
|
|
45
|
+
}
|
|
46
|
+
}, [httpClient, list]);
|
|
47
|
+
const act = useCallback(async (decisionRef, act, request) => {
|
|
48
|
+
if (!httpClient)
|
|
49
|
+
return { kind: HumanDecision_ActOutcomeKind.NOT_ACTIONABLE };
|
|
50
|
+
const path = `${MAIN_API_BASE_PATH}${fillRoute(MANUAL_CONTROLLER_ROUTES_URLS[ManualControllerRouteKey.FLOWS_ACTORS_DECISION_ACT], { decisionRef, act })}`;
|
|
51
|
+
let outcome;
|
|
52
|
+
try {
|
|
53
|
+
outcome = await httpClient.post(path, request, { silent: true });
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
const refused = outcomeOfRefusal(error);
|
|
57
|
+
if (!refused)
|
|
58
|
+
throw error;
|
|
59
|
+
outcome = refused;
|
|
60
|
+
}
|
|
61
|
+
await refresh();
|
|
62
|
+
return outcome;
|
|
63
|
+
}, [httpClient, refresh]);
|
|
64
|
+
const candidates = useCallback(async (decisionRef) => {
|
|
65
|
+
if (!httpClient)
|
|
66
|
+
return [];
|
|
67
|
+
const path = `${MAIN_API_BASE_PATH}${fillRoute(MANUAL_CONTROLLER_ROUTES_URLS[ManualControllerRouteKey.FLOWS_ACTORS_DECISION_CANDIDATES], { decisionRef })}`;
|
|
68
|
+
try {
|
|
69
|
+
const data = await httpClient.get(path, { silent: true });
|
|
70
|
+
return data?.candidates ?? [];
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
if (outcomeOfRefusal(error))
|
|
74
|
+
return [];
|
|
75
|
+
throw error;
|
|
76
|
+
}
|
|
77
|
+
}, [httpClient]);
|
|
78
|
+
useEffect(() => {
|
|
79
|
+
mounted.current = true;
|
|
80
|
+
if (!list)
|
|
81
|
+
return () => { mounted.current = false; };
|
|
82
|
+
void refresh();
|
|
83
|
+
const unsubscribe = on(CoreWebSocketEvent.FLOWS_ACTORS_DECISION_ROUTED, () => { void refresh(); });
|
|
84
|
+
return () => {
|
|
85
|
+
mounted.current = false;
|
|
86
|
+
unsubscribe?.();
|
|
87
|
+
};
|
|
88
|
+
}, [on, refresh, list]);
|
|
89
|
+
return { decisions, isLoading, refresh, act, candidates };
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=usePendingDecisions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usePendingDecisions.js","sourceRoot":"","sources":["../../../../../src/core/flows-actors/usePendingDecisions.ts"],"names":[],"mappings":"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","sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react';\nimport {\n CoreWebSocketEvent,\n HumanDecision_ActOutcomeKind,\n MAIN_API_BASE_PATH,\n MANUAL_CONTROLLER_ROUTES_URLS,\n ManualControllerRouteKey,\n type HumanDecision_Act,\n type HumanDecision_ActOutcome,\n type HumanDecision_ActRequest,\n type HumanDecision_PendingCard,\n type HumanDecision_PendingListResponse,\n type HumanDecision_ReassignCandidate,\n type HumanDecision_ReassignCandidatesResponse,\n type WS_FlowsActorsDecisionRoutedPayload,\n} from '@wildo-ai/saas-models';\nimport { LoggerFrontendService } from '~wildo-frontend-lib/core/monitoring/logger.frontend.service';\nimport { useApplication } from '~wildo-frontend-lib/core/runtime/useApplication';\nimport { useWebSocket } from '~wildo-frontend-lib/core/requests/websockets/useWebSocket';\n\nconst logDebug: (message: string, context?: Record<string, unknown>) => void = LoggerFrontendService.getLogger().debugByType('FlowsActorsDecisions');\n\n/** A route template's `:param` segments, filled — encoded, so a decision id is never read as a path. */\nfunction fillRoute(template: string, params: Readonly<Record<string, string>>): string {\n return template.replace(/:([A-Za-z]+)/g, (_segment, name: string) => encodeURIComponent(params[name] ?? ''));\n}\n\nconst OUTCOME_KINDS: ReadonlySet<string> = new Set(Object.values(HumanDecision_ActOutcomeKind));\n\n/**\n * The outcome a refusal carries. The act route answers a refusal with a non-2xx status AND the outcome as its\n * body (404 for \"not yours, missing or settled\", 409 for a lost race, 422 for a refused edit…), so the body is\n * read from the error rather than the status being turned into a guess.\n */\nfunction outcomeOfRefusal(error: unknown): HumanDecision_ActOutcome | undefined {\n const data = (error as { response?: { data?: unknown } } | null)?.response?.data as { kind?: unknown } | undefined;\n return data && typeof data.kind === 'string' && OUTCOME_KINDS.has(data.kind) ? (data as HumanDecision_ActOutcome) : undefined;\n}\n\nexport interface PendingDecisionsState {\n /** The decisions the signed-in person may act on, soonest deadline first, as the server lists them. */\n readonly decisions: readonly HumanDecision_PendingCard[];\n readonly isLoading: boolean;\n /** Re-read the list — after an act, and whenever a decision is routed to this person. */\n readonly refresh: () => Promise<void>;\n /** One act on one decision. Resolves to what it came to; a refusal is an outcome, never a thrown error. */\n readonly act: (decisionRef: string, act: HumanDecision_Act, request: HumanDecision_ActRequest) => Promise<HumanDecision_ActOutcome>;\n /** Who a decision may be moved to — only people who could answer it. Empty when the caller may not move it. */\n readonly candidates: (decisionRef: string) => Promise<readonly HumanDecision_ReassignCandidate[]>;\n}\n\n/**\n * The pending decisions the signed-in person may act on, read from the SERVER (#1594 D6, D12).\n *\n * The inbox used to be assembled from live socket announcements on this page alone, so a reload — or a\n * decision routed to a reviewer who never saw the conversation — showed nothing. The server list is the\n * one source: it covers every conversation, it re-checks each card with the rule an act is checked with,\n * and it survives a reload.\n *\n * Refreshed when the server announces a decision routed to this person (`flows-actors:decision-routed`,\n * sent to their own room only) and after every act this hook sends.\n *\n * `list: false` is for a component that ANSWERS one decision it already holds (a named-option decision, a\n * free-text question): it acts, and neither reads nor subscribes to the inbox it does not show.\n */\nexport interface UsePendingDecisionsOptions {\n /** Read and follow the inbox list. Defaults to true. */\n readonly list?: boolean;\n}\n\nexport function usePendingDecisions(options: UsePendingDecisionsOptions = {}): PendingDecisionsState {\n const list = options.list ?? true;\n const { httpClient } = useApplication();\n const { on } = useWebSocket();\n const [decisions, setDecisions] = useState<readonly HumanDecision_PendingCard[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const mounted = useRef(true);\n\n const refresh = useCallback(async (): Promise<void> => {\n if (!httpClient || !list) return;\n setIsLoading(true);\n try {\n const path = `${MAIN_API_BASE_PATH}${MANUAL_CONTROLLER_ROUTES_URLS[ManualControllerRouteKey.FLOWS_ACTORS_DECISIONS]}`;\n const data = await httpClient.get<HumanDecision_PendingListResponse>(path, { silent: true });\n if (mounted.current) setDecisions(data?.decisions ?? []);\n } catch (error) {\n // No list is shown as no list, and logged: a failure here must not look like an empty inbox forever.\n logDebug('Pending decisions could not be read', { error: error instanceof Error ? error.message : 'unknown' });\n } finally {\n if (mounted.current) setIsLoading(false);\n }\n }, [httpClient, list]);\n\n const act = useCallback(async (decisionRef: string, act: HumanDecision_Act, request: HumanDecision_ActRequest): Promise<HumanDecision_ActOutcome> => {\n if (!httpClient) return { kind: HumanDecision_ActOutcomeKind.NOT_ACTIONABLE };\n const path = `${MAIN_API_BASE_PATH}${fillRoute(MANUAL_CONTROLLER_ROUTES_URLS[ManualControllerRouteKey.FLOWS_ACTORS_DECISION_ACT], { decisionRef, act })}`;\n let outcome: HumanDecision_ActOutcome;\n try {\n outcome = await httpClient.post<HumanDecision_ActOutcome>(path, request, { silent: true });\n } catch (error) {\n const refused = outcomeOfRefusal(error);\n if (!refused) throw error;\n outcome = refused;\n }\n await refresh();\n return outcome;\n }, [httpClient, refresh]);\n\n const candidates = useCallback(async (decisionRef: string): Promise<readonly HumanDecision_ReassignCandidate[]> => {\n if (!httpClient) return [];\n const path = `${MAIN_API_BASE_PATH}${fillRoute(MANUAL_CONTROLLER_ROUTES_URLS[ManualControllerRouteKey.FLOWS_ACTORS_DECISION_CANDIDATES], { decisionRef })}`;\n try {\n const data = await httpClient.get<HumanDecision_ReassignCandidatesResponse>(path, { silent: true });\n return data?.candidates ?? [];\n } catch (error) {\n if (outcomeOfRefusal(error)) return [];\n throw error;\n }\n }, [httpClient]);\n\n useEffect(() => {\n mounted.current = true;\n if (!list) return () => { mounted.current = false; };\n void refresh();\n const unsubscribe = on<WS_FlowsActorsDecisionRoutedPayload>(CoreWebSocketEvent.FLOWS_ACTORS_DECISION_ROUTED, () => { void refresh(); });\n return () => {\n mounted.current = false;\n unsubscribe?.();\n };\n }, [on, refresh, list]);\n\n return { decisions, isLoading, refresh, act, candidates };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GuidanceRenderer.d.ts","sourceRoot":"","sources":["../../../../../src/core/guidance/GuidanceRenderer.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAkD,MAAM,OAAO,CAAC;AAEvE,OAAO,KAAK,EAEV,oBAAoB,EACpB,iBAAiB,EAClB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAEL,qBAAqB,EAEtB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAmB,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAwB7F,MAAM,WAAW,4BAA4B;IAC3C,OAAO,EAAE,iBAAiB,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,oBAAoB,GAAG,SAAS,CAAC;IACxC;;;;;;;OAOG;IACH,UAAU,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAC;QAAC,sBAAsB,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChK,SAAS,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,yGAAyG;IACzG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,KAAK,MAAM,GAAG,SAAS,CAAC;CAClF;AAoBD;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,+BAA+B,EAAE,MAAM,CAAC,qBAAqB,EAAE,qBAAqB,CAWhG,CAAC;AAEF;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,8BAA8B,CAC5C,WAAW,EAAE,qBAAqB;AAClC;;;;GAIG;AACH,eAAe,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,qBAAqB,EAAE,KAAK,CAAC,EAAE,CAAC,4BAA4B,CAAC,CAAC,CAAC,GAC/F,KAAK,CAAC,EAAE,CAAC,4BAA4B,CAAC,GAAG,SAAS,CAWpD;AA0KD,MAAM,WAAW,qBAAqB;IACpC,eAAe,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,qBAAqB,EAAE,KAAK,CAAC,EAAE,CAAC,4BAA4B,CAAC,CAAC,CAAC,CAAC;CAClG;AAED,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,qBAAqB,
|
|
1
|
+
{"version":3,"file":"GuidanceRenderer.d.ts","sourceRoot":"","sources":["../../../../../src/core/guidance/GuidanceRenderer.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAkD,MAAM,OAAO,CAAC;AAEvE,OAAO,KAAK,EAEV,oBAAoB,EACpB,iBAAiB,EAClB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAEL,qBAAqB,EAEtB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAmB,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAwB7F,MAAM,WAAW,4BAA4B;IAC3C,OAAO,EAAE,iBAAiB,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,oBAAoB,GAAG,SAAS,CAAC;IACxC;;;;;;;OAOG;IACH,UAAU,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAC;QAAC,sBAAsB,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChK,SAAS,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,yGAAyG;IACzG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,KAAK,MAAM,GAAG,SAAS,CAAC;CAClF;AAoBD;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,+BAA+B,EAAE,MAAM,CAAC,qBAAqB,EAAE,qBAAqB,CAWhG,CAAC;AAEF;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,8BAA8B,CAC5C,WAAW,EAAE,qBAAqB;AAClC;;;;GAIG;AACH,eAAe,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,qBAAqB,EAAE,KAAK,CAAC,EAAE,CAAC,4BAA4B,CAAC,CAAC,CAAC,GAC/F,KAAK,CAAC,EAAE,CAAC,4BAA4B,CAAC,GAAG,SAAS,CAWpD;AA0KD,MAAM,WAAW,qBAAqB;IACpC,eAAe,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,qBAAqB,EAAE,KAAK,CAAC,EAAE,CAAC,4BAA4B,CAAC,CAAC,CAAC,CAAC;CAClG;AAED,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,qBAAqB,CAqX5D,CAAC"}
|
|
@@ -443,8 +443,9 @@ export const GuidanceRenderer = ({ customRenderers }) => {
|
|
|
443
443
|
*
|
|
444
444
|
* ## Why `absolute` is the fix rather than an offset
|
|
445
445
|
*
|
|
446
|
-
* The shell already publishes the right anchor and makes it work:
|
|
447
|
-
*
|
|
446
|
+
* The shell already publishes the right anchor and makes it work: the shell's content outlet
|
|
447
|
+
* (`AppShellContentOutlet`, which every layout container places — the default one with
|
|
448
|
+
* `className="flex-1 relative min-w-0"`) renders `<main>` and hands that element to
|
|
448
449
|
* `PortalContainerContext`, so it is BOTH the portal target and a containing block. `fixed` was
|
|
449
450
|
* the one thing standing between that arrangement and the correct result; `absolute inset-0` fills
|
|
450
451
|
* the content area exactly, and every self-positioning child — the banner's `top-0`, the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GuidanceRenderer.js","sourceRoot":"","sources":["../../../../../src/core/guidance/GuidanceRenderer.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * GuidanceRenderer\n *\n * Root renderer for the Guidance System. Reads active flows from\n * GuidanceContext and delegates rendering to render-mode-specific\n * sub-renderers (OVERLAY, INLINE, CHECKLIST). Each element within\n * a flow is mapped to its type-specific renderer component via\n * RENDERER_MAP.\n */\n\nimport React, { useCallback, useEffect, useMemo, useRef } from 'react';\nimport ReactDOM from 'react-dom';\nimport type {\n GuidanceFlowDefinition,\n GuidanceElementState,\n OnboardingElement,\n} from '@wildo-ai/saas-models';\nimport {\n GuidanceRenderMode,\n OnboardingElementType,\n resolveGuidanceElementRequiredLabelFields,\n} from '@wildo-ai/saas-models';\nimport { CorePresetNames, FrontendComponentType } from '@wildo-ai/presets-components-models';\nimport { ComponentRegistryService } from '~wildo-frontend-lib/core/components-registry/component-registry.frontend.service';\nimport { useGuidance } from './useGuidance';\nimport { useI18n } from '~wildo-frontend-lib/core/i18n/useI18n';\nimport { useEventBus } from '~wildo-frontend-lib/core/events/useEventBus';\nimport { FrontendEvents } from '~wildo-frontend-lib/core/events/events.frontend.schemas';\nimport { APP_LEVEL_NAVIGATION_SOURCE } from '~wildo-frontend-lib/core/navigation/navigation.schemas';\nimport { LoggerFrontendService } from '~wildo-frontend-lib/core/monitoring/logger.frontend.service';\nimport { usePortalContainer } from '~wildo-frontend-lib/core/app-shell/PortalContainerContext';\n\n// Renderers — imported lazily to avoid circular deps; wired in RENDERER_MAP below\nimport { GuidanceChecklist, type GuidanceChecklistProps } from './renderers/GuidanceChecklist';\nimport { GuidanceChecklistItem } from './renderers/GuidanceChecklistItem';\nimport { GuidanceTour } from './renderers/GuidanceTour';\nimport { GuidanceTooltip } from './renderers/GuidanceTooltip';\nimport { GuidanceModal } from './renderers/GuidanceModal';\nimport { GuidanceBanner } from './renderers/GuidanceBanner';\nimport { GuidanceAnnouncement } from './renderers/GuidanceAnnouncement';\nimport { GuidanceBadge } from './renderers/GuidanceBadge';\nimport { GuidanceCard } from './renderers/GuidanceCard';\nimport { GuidanceSurvey } from './renderers/GuidanceSurvey';\n\n// ─── Shared Props Interface ──────────────────────────────────────\n\nexport interface GuidanceElementRendererProps {\n element: OnboardingElement;\n flowRef: string;\n state: GuidanceElementState | undefined;\n /**\n * Record this element complete. REJECTS when a bound survey's answers could not be written\n * (#1372), in which case nothing was recorded — a renderer that can bind must await this and\n * surface the failure rather than leaving the person to wonder.\n *\n * Every element type but SURVEY, and every unbound survey, resolves without a round trip, so a\n * renderer with nothing to bind may keep ignoring the promise.\n */\n onComplete: (elementRef: string, data?: { surveyAnswers?: Record<string, unknown>; lastStepIndex?: number; declineResourceBinding?: boolean }) => Promise<void>;\n onDismiss: (elementRef: string) => void;\n onAction: (actionRef: string) => void;\n /** i18n translate function scoped to this flow+element. Returns undefined when no translation exists. */\n t: (key: string, params?: Record<string, string | number>) => string | undefined;\n}\n\n// ─── Renderer Map ────────────────────────────────────────────────\n\n/** Placeholder component for element types that don't have a renderer yet */\nconst UnimplementedRenderer: React.FC<GuidanceElementRendererProps> = () => null;\n\nconst RENDERER_MAP: Record<OnboardingElementType, React.FC<GuidanceElementRendererProps>> = {\n [OnboardingElementType.CHECKLIST]: GuidanceChecklist,\n [OnboardingElementType.CHECKLIST_ITEM]: GuidanceChecklistItem,\n [OnboardingElementType.TOUR]: GuidanceTour,\n [OnboardingElementType.TOOLTIP]: GuidanceTooltip,\n [OnboardingElementType.MODAL]: GuidanceModal,\n [OnboardingElementType.BANNER]: GuidanceBanner,\n [OnboardingElementType.ANNOUNCEMENT]: GuidanceAnnouncement,\n [OnboardingElementType.BADGE]: GuidanceBadge,\n [OnboardingElementType.CARD]: GuidanceCard,\n [OnboardingElementType.SURVEY]: GuidanceSurvey,\n};\n\n/**\n * The component-registry slot each guidance element type is replaceable through.\n *\n * ## Why this map exists\n *\n * Every `GUIDANCE_*` component type was already declared, already carried a frontend-component\n * SPECIFICATION advertising a `DEFAULT` preset and an exported registry key, and was already used\n * as an i18n namespace by the renderer that implements it — but nothing ever joined the element\n * type to the slot, so the slots were addressable for labels and unreachable for COMPONENTS. Each\n * one sat on the registry-completeness deny-list under \"framework-internal … not swappable\", and an\n * application that wanted a different banner had no way to supply one short of replacing the whole\n * `APP_LAYOUT_MAIN_CONTAINER` preset.\n *\n * Total over `OnboardingElementType` by construction: a new element type is a compile error here\n * until it declares which slot replaces it, rather than silently shipping as unswappable.\n */\nexport const GUIDANCE_ELEMENT_COMPONENT_TYPE: Record<OnboardingElementType, FrontendComponentType> = {\n [OnboardingElementType.CHECKLIST]: FrontendComponentType.GUIDANCE_CHECKLIST,\n [OnboardingElementType.CHECKLIST_ITEM]: FrontendComponentType.GUIDANCE_CHECKLIST_ITEM,\n [OnboardingElementType.TOUR]: FrontendComponentType.GUIDANCE_TOUR,\n [OnboardingElementType.TOOLTIP]: FrontendComponentType.GUIDANCE_TOOLTIP,\n [OnboardingElementType.MODAL]: FrontendComponentType.GUIDANCE_MODAL,\n [OnboardingElementType.BANNER]: FrontendComponentType.GUIDANCE_BANNER,\n [OnboardingElementType.ANNOUNCEMENT]: FrontendComponentType.GUIDANCE_ANNOUNCEMENT,\n [OnboardingElementType.BADGE]: FrontendComponentType.GUIDANCE_BADGE,\n [OnboardingElementType.CARD]: FrontendComponentType.GUIDANCE_CARD,\n [OnboardingElementType.SURVEY]: FrontendComponentType.GUIDANCE_SURVEY,\n};\n\n/**\n * Resolve the component that renders one element type, most specific source first.\n *\n * `customRenderers` (a prop) → a REGISTERED preset → the engine's built-in renderer.\n *\n * ## Why this is not `createComponentResolver`\n *\n * That helper renders `ComponentNotInjected` when a slot has no registration, which is right for a\n * slot the framework does not implement. These ten slots DO have working framework implementations,\n * so a missing registration must fall through to the built-in rather than blank the element — an\n * application that registers nothing keeps exactly the behaviour it has today, and one that\n * registers a preset gets its own component. Registration is therefore purely additive and cannot\n * break a guidance surface by its absence.\n *\n * `preset` is read from the registry under `CorePresetNames.DEFAULT`, which is the name an\n * application overrides. Named alternative presets are deliberately NOT resolved here: nothing in a\n * flow definition selects one, so admitting them would create a second selection axis with no\n * authoring surface behind it.\n */\nexport function resolveGuidanceElementRenderer(\n elementType: OnboardingElementType,\n /**\n * Optional, because the second caller — `OnboardingView` — has no equivalent prop. Leaving it\n * required would have meant that surface passing a literal `undefined`, which reads as an\n * oversight rather than as \"this surface takes no overrides\".\n */\n customRenderers?: Partial<Record<OnboardingElementType, React.FC<GuidanceElementRendererProps>>>,\n): React.FC<GuidanceElementRendererProps> | undefined {\n const custom = customRenderers?.[elementType];\n if (custom) return custom;\n\n const registered = ComponentRegistryService.resolve(\n GUIDANCE_ELEMENT_COMPONENT_TYPE[elementType],\n CorePresetNames.DEFAULT,\n );\n if (registered) return registered as React.FC<GuidanceElementRendererProps>;\n\n return RENDERER_MAP[elementType];\n}\n\n// ─── Error Boundary ──────────────────────────────────────────────\n\nclass GuidanceElementErrorBoundary extends React.Component<\n { elementRef: string; children: React.ReactNode },\n { hasError: boolean }\n> {\n constructor(props: { elementRef: string; children: React.ReactNode }) {\n super(props);\n this.state = { hasError: false };\n }\n\n static getDerivedStateFromError(): { hasError: boolean } {\n return { hasError: true };\n }\n\n componentDidCatch(error: Error): void {\n LoggerFrontendService.getLogger().error(\n `GuidanceRenderer: element \"${this.props.elementRef}\" threw an error`,\n error,\n );\n }\n\n render(): React.ReactNode {\n if (this.state.hasError) return null;\n return this.props.children;\n }\n}\n\n// ─── Target Element Resolution (Phase G / Step 25) ──────────────\n\nfunction resolveTargetSelector(element: OnboardingElement): string | null {\n if ('targetSelector' in element && typeof (element as Record<string, unknown>).targetSelector === 'string') {\n return (element as Record<string, unknown>).targetSelector as string;\n }\n\n if (element.targetField) {\n return `[data-guidance-field=\"${element.targetField}\"]`;\n }\n\n return null;\n}\n\n// ─── Presentable Elements (#539) ─────────────────────────────────\n\n/**\n * Whether an element mounted by the render loop actually PUTS SOMETHING ON SCREEN.\n *\n * Having a renderer is not the same as being visible, and four renderers answer `null` at runtime\n * for reasons the render loop cannot see from the element alone:\n *\n * - a TOOLTIP whose `targetSelector` matches no node — it renders nothing until a rect exists;\n * - a TOUR with no steps — `currentStep` is undefined and it returns before the portal;\n * - an INLINE element whose portal target is absent — `InlinePortal` returns `null`;\n * - any element of a CHECKLIST-mode flow that declares items and no container — the loop's own\n * container scan finds nothing and the items are never mounted.\n *\n * Each of those was counted as presented, so the flow's once-per-user occasion was spent on a\n * screen the user saw nothing on. The DOM lookups here are the same ones the renderers perform, and\n * this runs from an effect, after paint, so they see what the renderers saw AT THAT INSTANT.\n *\n * RESIDUAL, in the other direction and deliberately accepted: the presentation effect re-runs on\n * `activeFlows` and has no DOM signal, while `GuidanceTooltip` re-resolves its target on scroll,\n * resize and a `ResizeObserver`. A tooltip whose target mounts AFTER this effect therefore becomes\n * visible and is never recorded, so its flow fires again next session. That errs toward showing a\n * flow twice rather than spending an occasion on nothing, which is the direction #539 asks for —\n * but it is a residual, not an absence, and closing it means subscribing to the same signals the\n * renderers use.\n */\n/**\n * `document.querySelector` over an AUTHOR-SUPPLIED string, which may not be a selector at all.\n *\n * `targetSelector` is a bare `z.string()`, so `''` or a malformed value makes `querySelector` throw\n * `SyntaxError`. That used to be contained: the lookup lived inside `GuidanceTooltip`'s own effect,\n * under `GuidanceElementErrorBoundary`, so one bad selector cost one element. The visibility check\n * runs from `GuidanceRenderer`'s presentation effect, ABOVE every boundary it renders, so an\n * unguarded throw there takes the whole guidance surface down instead.\n *\n * A selector that cannot be parsed matches nothing, so `false` is also the truthful answer.\n */\nfunction matchesSomething(selector: string): boolean {\n try {\n return Boolean(document.querySelector(selector));\n } catch {\n if (!warnedInvalidSelectors.has(selector)) {\n warnedInvalidSelectors.add(selector);\n LoggerFrontendService.getLogger().warn(\n `GuidanceRenderer: \"${selector}\" is not a valid CSS selector, so the element targeting it can never be shown.`,\n );\n }\n return false;\n }\n}\n\n/** Selectors already reported as unparseable, so the warning fires once rather than per render. */\nconst warnedInvalidSelectors = new Set<string>();\n\nfunction isElementVisible(flow: GuidanceFlowDefinition, element: OnboardingElement): boolean {\n if (typeof document === 'undefined') return false;\n\n if (element.type === OnboardingElementType.TOOLTIP) {\n const selector = (element as Record<string, unknown>).targetSelector;\n return typeof selector === 'string' && matchesSomething(selector);\n }\n\n if (element.type === OnboardingElementType.TOUR) {\n const steps = (element as Record<string, unknown>).steps;\n return Array.isArray(steps) && steps.length > 0;\n }\n\n if (flow.renderMode === GuidanceRenderMode.INLINE) {\n // An inline element with no selector renders in place rather than through a portal, so only a\n // DECLARED target that resolves to nothing makes it invisible.\n const selector = resolveTargetSelector(element);\n return selector === null || matchesSomething(selector);\n }\n\n return true;\n}\n\n/**\n * The elements this renderer actually SHOWS for a flow — the population whose copy decides whether\n * showing the flow spends its occasion.\n *\n * CHECKLIST mode renders only its containers and items, and only when a container exists; every\n * other mode renders every element that has a renderer AND is visible. Kept beside the render\n * loop's own selection so the two cannot disagree about which elements a person sees — which they\n * did, because this function asked only whether a renderer existed. See {@link isElementVisible}.\n */\nfunction selectPresentedElements(\n flow: GuidanceFlowDefinition,\n renderers: Record<OnboardingElementType, React.FC<GuidanceElementRendererProps>>,\n): OnboardingElement[] {\n const hasRenderer = (element: OnboardingElement): boolean => {\n const Renderer = renderers[element.type];\n return Boolean(Renderer) && Renderer !== UnimplementedRenderer;\n };\n if (flow.renderMode === GuidanceRenderMode.CHECKLIST) {\n const containers = flow.elements.filter(el => el.type === OnboardingElementType.CHECKLIST && hasRenderer(el));\n // No container, no items: the render loop scans for containers and never reaches the items.\n if (containers.length === 0) return [];\n return flow.elements.filter(\n el => (el.type === OnboardingElementType.CHECKLIST || el.type === OnboardingElementType.CHECKLIST_ITEM) && hasRenderer(el),\n );\n }\n return flow.elements.filter(el => hasRenderer(el) && isElementVisible(flow, el));\n}\n\n// ─── Inline Portal Wrapper ───────────────────────────────────────\n\nconst InlinePortal: React.FC<{ targetSelector: string; children: React.ReactNode }> = ({ targetSelector, children }) => {\n // Through the guarded lookup: this call is in the RENDER path and outside every error boundary\n // this file mounts, so an author-supplied string that is not a valid selector would throw\n // `SyntaxError` and take the whole guidance surface down rather than hiding one element.\n const target = typeof document !== 'undefined' && matchesSomething(targetSelector)\n ? document.querySelector(targetSelector)\n : null;\n if (!target) return null;\n\n return ReactDOM.createPortal(\n <div className=\"absolute z-[calc(var(--z-guidance)-2)]\">\n {children}\n </div>,\n target,\n );\n};\n\n// ─── GuidanceRenderer Component ──────────────────────────────────\n\nexport interface GuidanceRendererProps {\n customRenderers?: Partial<Record<OnboardingElementType, React.FC<GuidanceElementRendererProps>>>;\n}\n\nexport const GuidanceRenderer: React.FC<GuidanceRendererProps> = ({ customRenderers }) => {\n const { activeFlows, flowStates, completeElement, dismissFlow, recordFlowPresented, reportFlowNotPresentable } = useGuidance();\n const guidanceI18nKeys = useMemo(() => activeFlows.map(f => `guidance.${f.ref}`), [activeFlows]);\n const { makeTrGuidanceElement, tGuidanceElement, isReady: isGuidanceI18nReady } = useI18n({ keys: guidanceI18nKeys });\n const { emit } = useEventBus();\n const portalContainer = usePortalContainer();\n\n /**\n * One resolved renderer per element type, built through\n * {@link resolveGuidanceElementRenderer} so a registered preset participates.\n *\n * This was `{ ...RENDERER_MAP, ...customRenderers }` — a spread over the built-ins that gave the\n * component registry no say at all, which is why every guidance surface was unswappable in\n * practice while its specification advertised a preset.\n *\n * ## Why the registration COUNT is a dependency\n *\n * An earlier version deliberately took none, reasoning that \"the registry is a module-level\n * singleton populated once at startup, before anything renders\". That is an assumption about every\n * host, not a property of the registry: a lazily-loaded preset bundle, a registration inside an\n * effect, and a code-split design system all register AFTER this memo first resolves — and the\n * failure is silent, because the application's component simply never appears.\n *\n * `getRegistrationCount()` grows with every new key, so it is the cheapest available version\n * signal and re-resolving costs one map lookup per element type. RESIDUAL: re-registering an\n * EXISTING key replaces the value without changing the count. That cannot affect a guidance slot\n * today — nothing in the engine registers one, so the first registration is always a new key — but\n * a registry that published a change signal would remove the caveat as well as the polling.\n *\n * ## Why the resolved map keeps its identity\n *\n * It is a dependency of `renderedFlows`, and the overwhelmingly common `customRenderers` call\n * shape is an inline object literal — a new identity every render. Returning the PREVIOUS object\n * when every entry is unchanged keeps that memo effective while still letting a genuine change\n * through.\n */\n const registrationCount = ComponentRegistryService.getRegistrationCount();\n const resolvedRenderersRef = useRef<Record<OnboardingElementType, React.FC<GuidanceElementRendererProps>> | null>(null);\n const effectiveRenderers = useMemo(\n () => {\n const resolved: Partial<Record<OnboardingElementType, React.FC<GuidanceElementRendererProps>>> = {};\n for (const elementType of Object.values(OnboardingElementType)) {\n const renderer = resolveGuidanceElementRenderer(elementType, customRenderers);\n if (renderer) resolved[elementType] = renderer;\n }\n const next = resolved as Record<OnboardingElementType, React.FC<GuidanceElementRendererProps>>;\n const previous = resolvedRenderersRef.current;\n if (previous && Object.values(OnboardingElementType).every(type => previous[type] === next[type])) {\n return previous;\n }\n resolvedRenderersRef.current = next;\n return next;\n },\n [customRenderers, registrationCount],\n );\n\n // Emit NAVIGATION_REQUEST with the unresolved operationRef.\n // Guidance sits above ResourceRegistryProvider, so we use the\n // operationRef shorthand (same pattern as NotificationContext).\n const handleAction = useCallback((actionRef: string) => {\n emit(FrontendEvents.NAVIGATION_REQUEST, {\n operationRef: actionRef,\n initiator: {\n sourceZone: APP_LEVEL_NAVIGATION_SOURCE,\n },\n });\n }, [emit]);\n\n const handleComplete = useCallback((flowRef: string, elementRef: string, data?: { surveyAnswers?: Record<string, unknown>; lastStepIndex?: number; declineResourceBinding?: boolean }): Promise<void> => {\n // The promise is RETURNED rather than swallowed: a bound survey rejects when its write is\n // refused, and its renderer awaits that to keep the form open (#1372).\n return completeElement(flowRef, elementRef, data);\n }, [completeElement]);\n\n const handleDismiss = useCallback((flowRef: string, _elementRef: string) => {\n dismissFlow(flowRef);\n }, [dismissFlow]);\n\n // Build per-flow rendering output\n const renderedFlows = useMemo(() => {\n if (activeFlows.length === 0) return null;\n\n const overlayElements: React.ReactNode[] = [];\n const inlineElements: React.ReactNode[] = [];\n const checklistElements: React.ReactNode[] = [];\n\n for (const flow of activeFlows) {\n const flowState = flowStates[flow.ref];\n\n if (flow.renderMode === GuidanceRenderMode.CHECKLIST) {\n // Group CHECKLIST_ITEM elements inside their parent CHECKLIST container\n const checklistContainers = flow.elements.filter(\n el => el.type === OnboardingElementType.CHECKLIST\n );\n const itemElements = flow.elements.filter(\n el => el.type === OnboardingElementType.CHECKLIST_ITEM\n );\n\n for (const container of checklistContainers) {\n const ChecklistRenderer = effectiveRenderers[OnboardingElementType.CHECKLIST];\n if (!ChecklistRenderer || ChecklistRenderer === UnimplementedRenderer) continue;\n\n const containerState: GuidanceElementState | undefined = flowState?.elements?.[container.ref];\n const containerT = makeTrGuidanceElement(flow.ref, container.ref, resolveGuidanceElementRequiredLabelFields(container));\n\n const ItemRenderer = effectiveRenderers[OnboardingElementType.CHECKLIST_ITEM];\n const itemNodes = ItemRenderer && ItemRenderer !== UnimplementedRenderer\n ? itemElements.map(item => {\n const itemState: GuidanceElementState | undefined = flowState?.elements?.[item.ref];\n const itemT = makeTrGuidanceElement(flow.ref, item.ref, resolveGuidanceElementRequiredLabelFields(item));\n return (\n <GuidanceElementErrorBoundary key={`${flow.ref}-${item.ref}`} elementRef={item.ref}>\n <ItemRenderer\n element={item}\n flowRef={flow.ref}\n state={itemState}\n onComplete={(elRef, data) => handleComplete(flow.ref, elRef, data)}\n onDismiss={(elRef) => handleDismiss(flow.ref, elRef)}\n onAction={handleAction}\n t={itemT}\n />\n </GuidanceElementErrorBoundary>\n );\n })\n : null;\n\n const node = (\n <GuidanceElementErrorBoundary key={`${flow.ref}-${container.ref}`} elementRef={container.ref}>\n <ChecklistRenderer\n element={container}\n flowRef={flow.ref}\n state={containerState}\n onComplete={(elRef, data) => handleComplete(flow.ref, elRef, data)}\n onDismiss={(elRef) => handleDismiss(flow.ref, elRef)}\n onAction={handleAction}\n t={containerT}\n {...({ children: itemNodes } as Partial<GuidanceChecklistProps>)}\n />\n </GuidanceElementErrorBoundary>\n );\n checklistElements.push(node);\n }\n continue;\n }\n\n for (const element of flow.elements) {\n const Renderer = effectiveRenderers[element.type];\n if (!Renderer || Renderer === UnimplementedRenderer) continue;\n\n const elementState: GuidanceElementState | undefined = flowState?.elements?.[element.ref];\n const t = makeTrGuidanceElement(flow.ref, element.ref, resolveGuidanceElementRequiredLabelFields(element));\n\n const node = (\n <GuidanceElementErrorBoundary key={`${flow.ref}-${element.ref}`} elementRef={element.ref}>\n <Renderer\n element={element}\n flowRef={flow.ref}\n state={elementState}\n onComplete={(elRef, data) => handleComplete(flow.ref, elRef, data)}\n onDismiss={(elRef) => handleDismiss(flow.ref, elRef)}\n onAction={handleAction}\n t={t}\n />\n </GuidanceElementErrorBoundary>\n );\n\n switch (flow.renderMode) {\n case GuidanceRenderMode.OVERLAY:\n overlayElements.push(node);\n break;\n case GuidanceRenderMode.INLINE: {\n const selector = resolveTargetSelector(element);\n if (selector) {\n inlineElements.push(\n <InlinePortal\n key={`inline-${flow.ref}-${element.ref}`}\n targetSelector={selector}\n >\n {node}\n </InlinePortal>,\n );\n } else {\n inlineElements.push(node);\n }\n break;\n }\n }\n }\n }\n\n return { overlayElements, inlineElements, checklistElements };\n // `effectiveRenderers` is read at three sites in this block and was MISSING from these\n // dependencies, so the memo kept the first resolution for the component's life: a\n // `customRenderers` prop that changed — a feature flag, a lazily loaded bundle, an A/B arm —\n // never took effect. It is identity-stable by content (see its own docblock), so including it\n // does not defeat the memo for the common inline-literal call shape.\n }, [activeFlows, flowStates, effectiveRenderers, makeTrGuidanceElement, handleAction, handleComplete, handleDismiss]);\n\n /*\n * PRESENTATION — the moment a flow's once-per-user occasion is spent (#539).\n *\n * Only this layer knows whether a flow's copy exists, so only this layer may\n * decide that showing it counted. A flow with every required label resolved is\n * recorded as presented. A flow missing one is still RENDERED — its required slots\n * show their raw keys, so the gap is visible — but it is not recorded, so it fires\n * again once the labelling pipeline has generated its copy instead of having been\n * silently consumed by an author's first run. The console names the missing keys,\n * once per flow and missing set, because every request in that situation is a 200.\n *\n * Waits for readiness: before the bundle settles every key reads as missing, and\n * recording nothing then is correct but warning would be noise.\n */\n const warnedMissingLabelSignaturesRef = useRef<Set<string>>(new Set());\n useEffect(() => {\n if (!isGuidanceI18nReady) return;\n for (const flow of activeFlows) {\n const presentedElements = selectPresentedElements(flow, effectiveRenderers);\n /*\n * Tell the context when a flow resolves to NOTHING. An OVERLAY flow whose elements never\n * render still occupied the single overlay slot for the session — it never reaches a terminal\n * status, so it never leaves the active set — and permanently suppressed a lower-priority\n * flow that would have rendered.\n */\n reportFlowNotPresentable(flow.ref, presentedElements.length === 0);\n if (presentedElements.length === 0) continue;\n const missingKeys = presentedElements.flatMap(element =>\n resolveGuidanceElementRequiredLabelFields(element)\n .filter(field => tGuidanceElement(flow.ref, element.ref, field) === undefined)\n .map(field => `guidance.${flow.ref}.elements.${element.ref}.${field}`),\n );\n if (missingKeys.length === 0) {\n recordFlowPresented(flow.ref);\n continue;\n }\n const signature = `${flow.ref}|${missingKeys.join(',')}`;\n if (warnedMissingLabelSignaturesRef.current.has(signature)) continue;\n warnedMissingLabelSignaturesRef.current.add(signature);\n LoggerFrontendService.getLogger().warn(\n `GuidanceRenderer: flow \"${flow.ref}\" is shown but NOT recorded as presented — its required labels are unresolved `\n + `[${missingKeys.join(', ')}]. Generate the labels; the flow will trigger again once they exist.`,\n );\n }\n }, [isGuidanceI18nReady, activeFlows, effectiveRenderers, tGuidanceElement, recordFlowPresented]);\n\n if (!isGuidanceI18nReady) return null;\n if (!renderedFlows) return null;\n\n const { overlayElements, inlineElements, checklistElements } = renderedFlows;\n const hasContent = overlayElements.length > 0 || inlineElements.length > 0 || checklistElements.length > 0;\n if (!hasContent) return null;\n const portalTarget = typeof document !== 'undefined' ? portalContainer ?? document.body : undefined;\n\n /**\n * The guidance layers position against the CONTENT AREA, not the viewport.\n *\n * ## What was wrong, measured in a running application\n *\n * Both layers were `fixed`. A fixed element resolves against the VIEWPORT and ignores whatever\n * containing block it was portalled into — so with the app shell's `<main>` at\n * `left: 256, top: 52` (sidebar 256 wide, header 52 tall), the overlay layer still covered\n * `0,0 → 1440×1000` and `GuidanceBanner`'s `absolute top-0 inset-x-0` landed on the viewport's top\n * edge. `document.elementFromPoint` at the header's own centre returned the BANNER's title: the\n * logo, the resource selector, global search, notifications and the user avatar were all covered,\n * and since the banner sets `pointer-events-auto` it took their clicks too. A dismissible notice\n * was hiding the application's primary navigation for as long as it was up.\n *\n * ## Why `absolute` is the fix rather than an offset\n *\n * The shell already publishes the right anchor and makes it work: `app-layout-main-container`\n * renders `<main ref={portalRef} className=\"flex-1 relative min-w-0\">` and hands that element to\n * `PortalContainerContext`, so it is BOTH the portal target and a containing block. `fixed` was\n * the one thing standing between that arrangement and the correct result; `absolute inset-0` fills\n * the content area exactly, and every self-positioning child — the banner's `top-0`, the\n * checklist's `bottom-6 end-6` — then means the top and bottom of the content area, which is what\n * those authoring values have always claimed to mean. No offset to keep in step with a header\n * height, and an END sidebar or a bottom status bar is respected for free.\n *\n * ## The fallback, and the contract\n *\n * With no portal container — the public and auth layouts, and unit tests — the target is\n * `document.body`, which is not positioned, so the layers stay `fixed` and behave exactly as\n * before. The contract this relies on: **a guidance portal container must be a containing block**\n * (`position` other than `static`). One provider sets it today and it satisfies that; a host that\n * sets its own must too.\n */\n const layerPosition = portalContainer ? 'absolute' : 'fixed';\n\n return (\n <>\n {/* OVERLAY -- rendered in the app portal target when available. */}\n {overlayElements.length > 0 && portalTarget &&\n ReactDOM.createPortal(\n /**\n * The OVERLAY layer positions the elements that do not position THEMSELVES.\n *\n * It was a bare `fixed inset-0 … pointer-events-none` with no layout at all. Modal, tour\n * and tooltip portal out of it and banner self-positions (`absolute top-0 inset-x-0`), so\n * those four were fine — but CARD, SURVEY, ANNOUNCEMENT and BADGE are ordinary in-flow\n * children, and an in-flow child of a `fixed inset-0` box with no layout renders\n * full-viewport-width, pinned to the top-left corner, stacked on top of any banner. That\n * is what `renderMode: OVERLAY` with any of those four element types actually produced,\n * and it is the default authoring path.\n *\n * Centred with a readable cap rather than stretched: an overlay card is a focal message,\n * and `max-w-md` is the width `GuidanceModal` already uses for the same kind of content,\n * so the two read as one system.\n *\n * ## No padding and no `overflow-y-auto` on THIS element, and both were here and wrong\n *\n * `GuidanceBanner` is `absolute top-0 inset-x-0` — NOT `fixed`, which an earlier version of\n * this comment asserted and reasoned from. An absolutely positioned child resolves against\n * the nearest positioned ancestor's PADDING BOX, and this layer is that ancestor, so a\n * `p-element` here inset the banner from all four viewport edges — visibly breaking the one\n * overlay element that had always positioned itself correctly. Edge spacing therefore lives\n * on the per-element wrapper below, which is static and so is not a containing block.\n *\n * `overflow-y-auto` was added claiming it made a third card reachable. It does not: content\n * overflowing the START edge of a centred flex container cannot be scrolled to, and the\n * layer is `pointer-events-none`, so a wheel event never targets it. Overflow with several\n * simultaneously eligible overlay flows is a real limitation and is left honestly\n * unaddressed rather than papered over by a class that does nothing.\n *\n * `pointer-events-none` stays — every renderer that is interactive sets\n * `pointer-events-auto` on its own root.\n */\n <div\n data-guidance-layer=\"overlay\"\n className={`${layerPosition} inset-0 z-(--z-guidance) pointer-events-none flex flex-col items-center justify-center gap-element`}\n >\n {overlayElements.map(node => (\n /**\n * Capped and padded per element rather than by a rule on the layer, because this\n * wrapper is STATIC: it establishes no containing block, so the absolutely positioned\n * banner resolves against the layer and ignores this box entirely, while\n * card/survey/announcement/badge are laid out by it. A `[&>*]` rule or padding on the\n * layer would reach the banner and did.\n *\n * `empty:hidden` because modal, tour, tooltip and banner all portal their DOM\n * elsewhere, leaving this wrapper with no child nodes. A childless flex item still\n * consumes a `gap`, so without this each portalling element added a slice of empty\n * space that pushed the genuinely centred cards off-centre.\n *\n * The node's OWN key is reused rather than the array index — these are keyed\n * `${flowRef}-${elementRef}` at construction, and several flows can be eligible at\n * once, so an index would remount the wrong subtree whenever eligibility reorders.\n */\n <div\n key={(node as React.ReactElement).key}\n className=\"w-full max-w-md shrink-0 px-element empty:hidden\"\n >\n {node}\n </div>\n ))}\n </div>,\n portalTarget,\n )\n }\n\n {/* INLINE -- already portalled individually per-element */}\n {inlineElements}\n\n {/* CHECKLIST -- floating panel, bottom-right via portal */}\n {checklistElements.length > 0 && portalTarget &&\n ReactDOM.createPortal(\n <div data-guidance-layer=\"checklist\" className={`${layerPosition} bottom-6 end-6 z-[calc(var(--z-guidance)-1)]`}>\n {checklistElements}\n </div>,\n portalTarget,\n )\n }\n </>\n );\n};\n"]}
|
|
1
|
+
{"version":3,"file":"GuidanceRenderer.js","sourceRoot":"","sources":["../../../../../src/core/guidance/GuidanceRenderer.tsx"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AACvE,OAAO,QAAQ,MAAM,WAAW,CAAC;AAMjC,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,yCAAyC,GAC1C,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAC7F,OAAO,EAAE,wBAAwB,EAAE,MAAM,kFAAkF,CAAC;AAC5H,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,uCAAuC,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,6CAA6C,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,yDAAyD,CAAC;AACzF,OAAO,EAAE,2BAA2B,EAAE,MAAM,wDAAwD,CAAC;AACrG,OAAO,EAAE,qBAAqB,EAAE,MAAM,6DAA6D,CAAC;AACpG,OAAO,EAAE,kBAAkB,EAAE,MAAM,2DAA2D,CAAC;AAE/F,kFAAkF;AAClF,OAAO,EAAE,iBAAiB,EAA+B,MAAM,+BAA+B,CAAC;AAC/F,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAuB5D,oEAAoE;AAEpE,6EAA6E;AAC7E,MAAM,qBAAqB,GAA2C,GAAG,EAAE,CAAC,IAAI,CAAC;AAEjF,MAAM,YAAY,GAA0E;IAC1F,CAAC,qBAAqB,CAAC,SAAS,CAAC,EAAE,iBAAiB;IACpD,CAAC,qBAAqB,CAAC,cAAc,CAAC,EAAE,qBAAqB;IAC7D,CAAC,qBAAqB,CAAC,IAAI,CAAC,EAAE,YAAY;IAC1C,CAAC,qBAAqB,CAAC,OAAO,CAAC,EAAE,eAAe;IAChD,CAAC,qBAAqB,CAAC,KAAK,CAAC,EAAE,aAAa;IAC5C,CAAC,qBAAqB,CAAC,MAAM,CAAC,EAAE,cAAc;IAC9C,CAAC,qBAAqB,CAAC,YAAY,CAAC,EAAE,oBAAoB;IAC1D,CAAC,qBAAqB,CAAC,KAAK,CAAC,EAAE,aAAa;IAC5C,CAAC,qBAAqB,CAAC,IAAI,CAAC,EAAE,YAAY;IAC1C,CAAC,qBAAqB,CAAC,MAAM,CAAC,EAAE,cAAc;CAC/C,CAAC;AAEF;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,+BAA+B,GAAyD;IACnG,CAAC,qBAAqB,CAAC,SAAS,CAAC,EAAE,qBAAqB,CAAC,kBAAkB;IAC3E,CAAC,qBAAqB,CAAC,cAAc,CAAC,EAAE,qBAAqB,CAAC,uBAAuB;IACrF,CAAC,qBAAqB,CAAC,IAAI,CAAC,EAAE,qBAAqB,CAAC,aAAa;IACjE,CAAC,qBAAqB,CAAC,OAAO,CAAC,EAAE,qBAAqB,CAAC,gBAAgB;IACvE,CAAC,qBAAqB,CAAC,KAAK,CAAC,EAAE,qBAAqB,CAAC,cAAc;IACnE,CAAC,qBAAqB,CAAC,MAAM,CAAC,EAAE,qBAAqB,CAAC,eAAe;IACrE,CAAC,qBAAqB,CAAC,YAAY,CAAC,EAAE,qBAAqB,CAAC,qBAAqB;IACjF,CAAC,qBAAqB,CAAC,KAAK,CAAC,EAAE,qBAAqB,CAAC,cAAc;IACnE,CAAC,qBAAqB,CAAC,IAAI,CAAC,EAAE,qBAAqB,CAAC,aAAa;IACjE,CAAC,qBAAqB,CAAC,MAAM,CAAC,EAAE,qBAAqB,CAAC,eAAe;CACtE,CAAC;AAEF;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,8BAA8B,CAC5C,WAAkC;AAClC;;;;GAIG;AACH,eAAgG;IAEhG,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC,WAAW,CAAC,CAAC;IAC9C,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAE1B,MAAM,UAAU,GAAG,wBAAwB,CAAC,OAAO,CACjD,+BAA+B,CAAC,WAAW,CAAC,EAC5C,eAAe,CAAC,OAAO,CACxB,CAAC;IACF,IAAI,UAAU;QAAE,OAAO,UAAoD,CAAC;IAE5E,OAAO,YAAY,CAAC,WAAW,CAAC,CAAC;AACnC,CAAC;AAED,oEAAoE;AAEpE,MAAM,4BAA6B,SAAQ,KAAK,CAAC,SAGhD;IACC,YAAY,KAAwD;QAClE,KAAK,CAAC,KAAK,CAAC,CAAC;QACb,IAAI,CAAC,KAAK,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IACnC,CAAC;IAED,MAAM,CAAC,wBAAwB;QAC7B,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC5B,CAAC;IAED,iBAAiB,CAAC,KAAY;QAC5B,qBAAqB,CAAC,SAAS,EAAE,CAAC,KAAK,CACrC,8BAA8B,IAAI,CAAC,KAAK,CAAC,UAAU,kBAAkB,EACrE,KAAK,CACN,CAAC;IACJ,CAAC;IAED,MAAM;QACJ,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC;QACrC,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;IAC7B,CAAC;CACF;AAED,mEAAmE;AAEnE,SAAS,qBAAqB,CAAC,OAA0B;IACvD,IAAI,gBAAgB,IAAI,OAAO,IAAI,OAAQ,OAAmC,CAAC,cAAc,KAAK,QAAQ,EAAE,CAAC;QAC3G,OAAQ,OAAmC,CAAC,cAAwB,CAAC;IACvE,CAAC;IAED,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;QACxB,OAAO,yBAAyB,OAAO,CAAC,WAAW,IAAI,CAAC;IAC1D,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,oEAAoE;AAEpE;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH;;;;;;;;;;GAUG;AACH,SAAS,gBAAgB,CAAC,QAAgB;IACxC,IAAI,CAAC;QACH,OAAO,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1C,sBAAsB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACrC,qBAAqB,CAAC,SAAS,EAAE,CAAC,IAAI,CACpC,sBAAsB,QAAQ,gFAAgF,CAC/G,CAAC;QACJ,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,mGAAmG;AACnG,MAAM,sBAAsB,GAAG,IAAI,GAAG,EAAU,CAAC;AAEjD,SAAS,gBAAgB,CAAC,IAA4B,EAAE,OAA0B;IAChF,IAAI,OAAO,QAAQ,KAAK,WAAW;QAAE,OAAO,KAAK,CAAC;IAElD,IAAI,OAAO,CAAC,IAAI,KAAK,qBAAqB,CAAC,OAAO,EAAE,CAAC;QACnD,MAAM,QAAQ,GAAI,OAAmC,CAAC,cAAc,CAAC;QACrE,OAAO,OAAO,QAAQ,KAAK,QAAQ,IAAI,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IACpE,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,KAAK,qBAAqB,CAAC,IAAI,EAAE,CAAC;QAChD,MAAM,KAAK,GAAI,OAAmC,CAAC,KAAK,CAAC;QACzD,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IAClD,CAAC;IAED,IAAI,IAAI,CAAC,UAAU,KAAK,kBAAkB,CAAC,MAAM,EAAE,CAAC;QAClD,8FAA8F;QAC9F,+DAA+D;QAC/D,MAAM,QAAQ,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;QAChD,OAAO,QAAQ,KAAK,IAAI,IAAI,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IACzD,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,uBAAuB,CAC9B,IAA4B,EAC5B,SAAgF;IAEhF,MAAM,WAAW,GAAG,CAAC,OAA0B,EAAW,EAAE;QAC1D,MAAM,QAAQ,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACzC,OAAO,OAAO,CAAC,QAAQ,CAAC,IAAI,QAAQ,KAAK,qBAAqB,CAAC;IACjE,CAAC,CAAC;IACF,IAAI,IAAI,CAAC,UAAU,KAAK,kBAAkB,CAAC,SAAS,EAAE,CAAC;QACrD,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,qBAAqB,CAAC,SAAS,IAAI,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9G,4FAA4F;QAC5F,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QACvC,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CACzB,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,KAAK,qBAAqB,CAAC,SAAS,IAAI,EAAE,CAAC,IAAI,KAAK,qBAAqB,CAAC,cAAc,CAAC,IAAI,WAAW,CAAC,EAAE,CAAC,CAC3H,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,IAAI,gBAAgB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;AACnF,CAAC;AAED,oEAAoE;AAEpE,MAAM,YAAY,GAAoE,CAAC,EAAE,cAAc,EAAE,QAAQ,EAAE,EAAE,EAAE;IACrH,+FAA+F;IAC/F,0FAA0F;IAC1F,yFAAyF;IACzF,MAAM,MAAM,GAAG,OAAO,QAAQ,KAAK,WAAW,IAAI,gBAAgB,CAAC,cAAc,CAAC;QAChF,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,cAAc,CAAC;QACxC,CAAC,CAAC,IAAI,CAAC;IACT,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAEzB,OAAO,QAAQ,CAAC,YAAY,CAC1B,cAAK,SAAS,EAAC,wCAAwC,YACpD,QAAQ,GACL,EACN,MAAM,CACP,CAAC;AACJ,CAAC,CAAC;AAQF,MAAM,CAAC,MAAM,gBAAgB,GAAoC,CAAC,EAAE,eAAe,EAAE,EAAE,EAAE;IACvF,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,eAAe,EAAE,WAAW,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,GAAG,WAAW,EAAE,CAAC;IAC/H,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IACjG,MAAM,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,OAAO,EAAE,mBAAmB,EAAE,GAAG,OAAO,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC,CAAC;IACtH,MAAM,EAAE,IAAI,EAAE,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,eAAe,GAAG,kBAAkB,EAAE,CAAC;IAE7C;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;IACH,MAAM,iBAAiB,GAAG,wBAAwB,CAAC,oBAAoB,EAAE,CAAC;IAC1E,MAAM,oBAAoB,GAAG,MAAM,CAA+E,IAAI,CAAC,CAAC;IACxH,MAAM,kBAAkB,GAAG,OAAO,CAChC,GAAG,EAAE;QACH,MAAM,QAAQ,GAAmF,EAAE,CAAC;QACpG,KAAK,MAAM,WAAW,IAAI,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC,EAAE,CAAC;YAC/D,MAAM,QAAQ,GAAG,8BAA8B,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;YAC9E,IAAI,QAAQ;gBAAE,QAAQ,CAAC,WAAW,CAAC,GAAG,QAAQ,CAAC;QACjD,CAAC;QACD,MAAM,IAAI,GAAG,QAAiF,CAAC;QAC/F,MAAM,QAAQ,GAAG,oBAAoB,CAAC,OAAO,CAAC;QAC9C,IAAI,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YAClG,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,oBAAoB,CAAC,OAAO,GAAG,IAAI,CAAC;QACpC,OAAO,IAAI,CAAC;IACd,CAAC,EACD,CAAC,eAAe,EAAE,iBAAiB,CAAC,CACrC,CAAC;IAEF,4DAA4D;IAC5D,8DAA8D;IAC9D,gEAAgE;IAChE,MAAM,YAAY,GAAG,WAAW,CAAC,CAAC,SAAiB,EAAE,EAAE;QACrD,IAAI,CAAC,cAAc,CAAC,kBAAkB,EAAE;YACtC,YAAY,EAAE,SAAS;YACvB,SAAS,EAAE;gBACT,UAAU,EAAE,2BAA2B;aACxC;SACF,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAEX,MAAM,cAAc,GAAG,WAAW,CAAC,CAAC,OAAe,EAAE,UAAkB,EAAE,IAA4G,EAAiB,EAAE;QACtM,0FAA0F;QAC1F,uEAAuE;QACvE,OAAO,eAAe,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;IACpD,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC;IAEtB,MAAM,aAAa,GAAG,WAAW,CAAC,CAAC,OAAe,EAAE,WAAmB,EAAE,EAAE;QACzE,WAAW,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IAElB,kCAAkC;IAClC,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,EAAE;QACjC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAE1C,MAAM,eAAe,GAAsB,EAAE,CAAC;QAC9C,MAAM,cAAc,GAAsB,EAAE,CAAC;QAC7C,MAAM,iBAAiB,GAAsB,EAAE,CAAC;QAEhD,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;YAC/B,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAEvC,IAAI,IAAI,CAAC,UAAU,KAAK,kBAAkB,CAAC,SAAS,EAAE,CAAC;gBACrD,wEAAwE;gBACxE,MAAM,mBAAmB,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAC9C,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,qBAAqB,CAAC,SAAS,CAClD,CAAC;gBACF,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CACvC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,qBAAqB,CAAC,cAAc,CACvD,CAAC;gBAEF,KAAK,MAAM,SAAS,IAAI,mBAAmB,EAAE,CAAC;oBAC5C,MAAM,iBAAiB,GAAG,kBAAkB,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC;oBAC9E,IAAI,CAAC,iBAAiB,IAAI,iBAAiB,KAAK,qBAAqB;wBAAE,SAAS;oBAEhF,MAAM,cAAc,GAAqC,SAAS,EAAE,QAAQ,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;oBAC9F,MAAM,UAAU,GAAG,qBAAqB,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,yCAAyC,CAAC,SAAS,CAAC,CAAC,CAAC;oBAExH,MAAM,YAAY,GAAG,kBAAkB,CAAC,qBAAqB,CAAC,cAAc,CAAC,CAAC;oBAC9E,MAAM,SAAS,GAAG,YAAY,IAAI,YAAY,KAAK,qBAAqB;wBACtE,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;4BACtB,MAAM,SAAS,GAAqC,SAAS,EAAE,QAAQ,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;4BACpF,MAAM,KAAK,GAAG,qBAAqB,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,yCAAyC,CAAC,IAAI,CAAC,CAAC,CAAC;4BACzG,OAAO,CACL,KAAC,4BAA4B,IAAiC,UAAU,EAAE,IAAI,CAAC,GAAG,YAChF,KAAC,YAAY,IACX,OAAO,EAAE,IAAI,EACb,OAAO,EAAE,IAAI,CAAC,GAAG,EACjB,KAAK,EAAE,SAAS,EAChB,UAAU,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,EAClE,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,EACpD,QAAQ,EAAE,YAAY,EACtB,CAAC,EAAE,KAAK,GACR,IAT+B,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,CAU7B,CAChC,CAAC;wBACJ,CAAC,CAAC;wBACJ,CAAC,CAAC,IAAI,CAAC;oBAET,MAAM,IAAI,GAAG,CACX,KAAC,4BAA4B,IAAsC,UAAU,EAAE,SAAS,CAAC,GAAG,YAC1F,KAAC,iBAAiB,IAChB,OAAO,EAAE,SAAS,EAClB,OAAO,EAAE,IAAI,CAAC,GAAG,EACjB,KAAK,EAAE,cAAc,EACrB,UAAU,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,EAClE,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,EACpD,QAAQ,EAAE,YAAY,EACtB,CAAC,EAAE,UAAU,KACR,EAAE,QAAQ,EAAE,SAAS,EAAsC,GAChE,IAV+B,GAAG,IAAI,CAAC,GAAG,IAAI,SAAS,CAAC,GAAG,EAAE,CAWlC,CAChC,CAAC;oBACF,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC/B,CAAC;gBACD,SAAS;YACX,CAAC;YAED,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACpC,MAAM,QAAQ,GAAG,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBAClD,IAAI,CAAC,QAAQ,IAAI,QAAQ,KAAK,qBAAqB;oBAAE,SAAS;gBAE9D,MAAM,YAAY,GAAqC,SAAS,EAAE,QAAQ,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBAC1F,MAAM,CAAC,GAAG,qBAAqB,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,yCAAyC,CAAC,OAAO,CAAC,CAAC,CAAC;gBAE3G,MAAM,IAAI,GAAG,CACX,KAAC,4BAA4B,IAAoC,UAAU,EAAE,OAAO,CAAC,GAAG,YACtF,KAAC,QAAQ,IACP,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,IAAI,CAAC,GAAG,EACjB,KAAK,EAAE,YAAY,EACnB,UAAU,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,EAClE,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,EACpD,QAAQ,EAAE,YAAY,EACtB,CAAC,EAAE,CAAC,GACJ,IAT+B,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAUhC,CAChC,CAAC;gBAEF,QAAQ,IAAI,CAAC,UAAU,EAAE,CAAC;oBACxB,KAAK,kBAAkB,CAAC,OAAO;wBAC7B,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;wBAC3B,MAAM;oBACR,KAAK,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC;wBAC/B,MAAM,QAAQ,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;wBAChD,IAAI,QAAQ,EAAE,CAAC;4BACb,cAAc,CAAC,IAAI,CACjB,KAAC,YAAY,IAEX,cAAc,EAAE,QAAQ,YAEvB,IAAI,IAHA,UAAU,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAI3B,CAChB,CAAC;wBACJ,CAAC;6BAAM,CAAC;4BACN,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;wBAC5B,CAAC;wBACD,MAAM;oBACR,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,iBAAiB,EAAE,CAAC;QAC9D,uFAAuF;QACvF,kFAAkF;QAClF,6FAA6F;QAC7F,8FAA8F;QAC9F,qEAAqE;IACvE,CAAC,EAAE,CAAC,WAAW,EAAE,UAAU,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,YAAY,EAAE,cAAc,EAAE,aAAa,CAAC,CAAC,CAAC;IAEtH;;;;;;;;;;;;;OAaG;IACH,MAAM,+BAA+B,GAAG,MAAM,CAAc,IAAI,GAAG,EAAE,CAAC,CAAC;IACvE,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,mBAAmB;YAAE,OAAO;QACjC,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;YAC/B,MAAM,iBAAiB,GAAG,uBAAuB,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;YAC5E;;;;;eAKG;YACH,wBAAwB,CAAC,IAAI,CAAC,GAAG,EAAE,iBAAiB,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC;YACnE,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YAC7C,MAAM,WAAW,GAAG,iBAAiB,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CACtD,yCAAyC,CAAC,OAAO,CAAC;iBAC/C,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,SAAS,CAAC;iBAC7E,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,IAAI,CAAC,GAAG,aAAa,OAAO,CAAC,GAAG,IAAI,KAAK,EAAE,CAAC,CACzE,CAAC;YACF,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC7B,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC9B,SAAS;YACX,CAAC;YACD,MAAM,SAAS,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACzD,IAAI,+BAA+B,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;gBAAE,SAAS;YACrE,+BAA+B,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACvD,qBAAqB,CAAC,SAAS,EAAE,CAAC,IAAI,CACpC,2BAA2B,IAAI,CAAC,GAAG,gFAAgF;kBAC/G,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,sEAAsE,CACrG,CAAC;QACJ,CAAC;IACH,CAAC,EAAE,CAAC,mBAAmB,EAAE,WAAW,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,mBAAmB,CAAC,CAAC,CAAC;IAElG,IAAI,CAAC,mBAAmB;QAAE,OAAO,IAAI,CAAC;IACtC,IAAI,CAAC,aAAa;QAAE,OAAO,IAAI,CAAC;IAEhC,MAAM,EAAE,eAAe,EAAE,cAAc,EAAE,iBAAiB,EAAE,GAAG,aAAa,CAAC;IAC7E,MAAM,UAAU,GAAG,eAAe,CAAC,MAAM,GAAG,CAAC,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC;IAC3G,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC;IAC7B,MAAM,YAAY,GAAG,OAAO,QAAQ,KAAK,WAAW,CAAC,CAAC,CAAC,eAAe,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IAEpG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAiCG;IACH,MAAM,aAAa,GAAG,eAAe,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC;IAE7D,OAAO,CACL,8BAEG,eAAe,CAAC,MAAM,GAAG,CAAC,IAAI,YAAY;gBACzC,QAAQ,CAAC,YAAY;gBACnB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mBAgCG;gBACH,qCACsB,SAAS,EAC7B,SAAS,EAAE,GAAG,aAAa,qGAAqG,YAE/H,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC3B;;;;;;;;;;;;;;;uBAeG;oBACH,cAEE,SAAS,EAAC,kDAAkD,YAE3D,IAAI,IAHC,IAA2B,CAAC,GAAG,CAIjC,CACP,CAAC,GACE,EACN,YAAY,CACb,EAIF,cAAc,EAGd,iBAAiB,CAAC,MAAM,GAAG,CAAC,IAAI,YAAY;gBAC3C,QAAQ,CAAC,YAAY,CACnB,qCAAyB,WAAW,EAAC,SAAS,EAAE,GAAG,aAAa,+CAA+C,YAC5G,iBAAiB,GACd,EACN,YAAY,CACb,IAEF,CACJ,CAAC;AACJ,CAAC,CAAC","sourcesContent":["/**\n * GuidanceRenderer\n *\n * Root renderer for the Guidance System. Reads active flows from\n * GuidanceContext and delegates rendering to render-mode-specific\n * sub-renderers (OVERLAY, INLINE, CHECKLIST). Each element within\n * a flow is mapped to its type-specific renderer component via\n * RENDERER_MAP.\n */\n\nimport React, { useCallback, useEffect, useMemo, useRef } from 'react';\nimport ReactDOM from 'react-dom';\nimport type {\n GuidanceFlowDefinition,\n GuidanceElementState,\n OnboardingElement,\n} from '@wildo-ai/saas-models';\nimport {\n GuidanceRenderMode,\n OnboardingElementType,\n resolveGuidanceElementRequiredLabelFields,\n} from '@wildo-ai/saas-models';\nimport { CorePresetNames, FrontendComponentType } from '@wildo-ai/presets-components-models';\nimport { ComponentRegistryService } from '~wildo-frontend-lib/core/components-registry/component-registry.frontend.service';\nimport { useGuidance } from './useGuidance';\nimport { useI18n } from '~wildo-frontend-lib/core/i18n/useI18n';\nimport { useEventBus } from '~wildo-frontend-lib/core/events/useEventBus';\nimport { FrontendEvents } from '~wildo-frontend-lib/core/events/events.frontend.schemas';\nimport { APP_LEVEL_NAVIGATION_SOURCE } from '~wildo-frontend-lib/core/navigation/navigation.schemas';\nimport { LoggerFrontendService } from '~wildo-frontend-lib/core/monitoring/logger.frontend.service';\nimport { usePortalContainer } from '~wildo-frontend-lib/core/app-shell/PortalContainerContext';\n\n// Renderers — imported lazily to avoid circular deps; wired in RENDERER_MAP below\nimport { GuidanceChecklist, type GuidanceChecklistProps } from './renderers/GuidanceChecklist';\nimport { GuidanceChecklistItem } from './renderers/GuidanceChecklistItem';\nimport { GuidanceTour } from './renderers/GuidanceTour';\nimport { GuidanceTooltip } from './renderers/GuidanceTooltip';\nimport { GuidanceModal } from './renderers/GuidanceModal';\nimport { GuidanceBanner } from './renderers/GuidanceBanner';\nimport { GuidanceAnnouncement } from './renderers/GuidanceAnnouncement';\nimport { GuidanceBadge } from './renderers/GuidanceBadge';\nimport { GuidanceCard } from './renderers/GuidanceCard';\nimport { GuidanceSurvey } from './renderers/GuidanceSurvey';\n\n// ─── Shared Props Interface ──────────────────────────────────────\n\nexport interface GuidanceElementRendererProps {\n element: OnboardingElement;\n flowRef: string;\n state: GuidanceElementState | undefined;\n /**\n * Record this element complete. REJECTS when a bound survey's answers could not be written\n * (#1372), in which case nothing was recorded — a renderer that can bind must await this and\n * surface the failure rather than leaving the person to wonder.\n *\n * Every element type but SURVEY, and every unbound survey, resolves without a round trip, so a\n * renderer with nothing to bind may keep ignoring the promise.\n */\n onComplete: (elementRef: string, data?: { surveyAnswers?: Record<string, unknown>; lastStepIndex?: number; declineResourceBinding?: boolean }) => Promise<void>;\n onDismiss: (elementRef: string) => void;\n onAction: (actionRef: string) => void;\n /** i18n translate function scoped to this flow+element. Returns undefined when no translation exists. */\n t: (key: string, params?: Record<string, string | number>) => string | undefined;\n}\n\n// ─── Renderer Map ────────────────────────────────────────────────\n\n/** Placeholder component for element types that don't have a renderer yet */\nconst UnimplementedRenderer: React.FC<GuidanceElementRendererProps> = () => null;\n\nconst RENDERER_MAP: Record<OnboardingElementType, React.FC<GuidanceElementRendererProps>> = {\n [OnboardingElementType.CHECKLIST]: GuidanceChecklist,\n [OnboardingElementType.CHECKLIST_ITEM]: GuidanceChecklistItem,\n [OnboardingElementType.TOUR]: GuidanceTour,\n [OnboardingElementType.TOOLTIP]: GuidanceTooltip,\n [OnboardingElementType.MODAL]: GuidanceModal,\n [OnboardingElementType.BANNER]: GuidanceBanner,\n [OnboardingElementType.ANNOUNCEMENT]: GuidanceAnnouncement,\n [OnboardingElementType.BADGE]: GuidanceBadge,\n [OnboardingElementType.CARD]: GuidanceCard,\n [OnboardingElementType.SURVEY]: GuidanceSurvey,\n};\n\n/**\n * The component-registry slot each guidance element type is replaceable through.\n *\n * ## Why this map exists\n *\n * Every `GUIDANCE_*` component type was already declared, already carried a frontend-component\n * SPECIFICATION advertising a `DEFAULT` preset and an exported registry key, and was already used\n * as an i18n namespace by the renderer that implements it — but nothing ever joined the element\n * type to the slot, so the slots were addressable for labels and unreachable for COMPONENTS. Each\n * one sat on the registry-completeness deny-list under \"framework-internal … not swappable\", and an\n * application that wanted a different banner had no way to supply one short of replacing the whole\n * `APP_LAYOUT_MAIN_CONTAINER` preset.\n *\n * Total over `OnboardingElementType` by construction: a new element type is a compile error here\n * until it declares which slot replaces it, rather than silently shipping as unswappable.\n */\nexport const GUIDANCE_ELEMENT_COMPONENT_TYPE: Record<OnboardingElementType, FrontendComponentType> = {\n [OnboardingElementType.CHECKLIST]: FrontendComponentType.GUIDANCE_CHECKLIST,\n [OnboardingElementType.CHECKLIST_ITEM]: FrontendComponentType.GUIDANCE_CHECKLIST_ITEM,\n [OnboardingElementType.TOUR]: FrontendComponentType.GUIDANCE_TOUR,\n [OnboardingElementType.TOOLTIP]: FrontendComponentType.GUIDANCE_TOOLTIP,\n [OnboardingElementType.MODAL]: FrontendComponentType.GUIDANCE_MODAL,\n [OnboardingElementType.BANNER]: FrontendComponentType.GUIDANCE_BANNER,\n [OnboardingElementType.ANNOUNCEMENT]: FrontendComponentType.GUIDANCE_ANNOUNCEMENT,\n [OnboardingElementType.BADGE]: FrontendComponentType.GUIDANCE_BADGE,\n [OnboardingElementType.CARD]: FrontendComponentType.GUIDANCE_CARD,\n [OnboardingElementType.SURVEY]: FrontendComponentType.GUIDANCE_SURVEY,\n};\n\n/**\n * Resolve the component that renders one element type, most specific source first.\n *\n * `customRenderers` (a prop) → a REGISTERED preset → the engine's built-in renderer.\n *\n * ## Why this is not `createComponentResolver`\n *\n * That helper renders `ComponentNotInjected` when a slot has no registration, which is right for a\n * slot the framework does not implement. These ten slots DO have working framework implementations,\n * so a missing registration must fall through to the built-in rather than blank the element — an\n * application that registers nothing keeps exactly the behaviour it has today, and one that\n * registers a preset gets its own component. Registration is therefore purely additive and cannot\n * break a guidance surface by its absence.\n *\n * `preset` is read from the registry under `CorePresetNames.DEFAULT`, which is the name an\n * application overrides. Named alternative presets are deliberately NOT resolved here: nothing in a\n * flow definition selects one, so admitting them would create a second selection axis with no\n * authoring surface behind it.\n */\nexport function resolveGuidanceElementRenderer(\n elementType: OnboardingElementType,\n /**\n * Optional, because the second caller — `OnboardingView` — has no equivalent prop. Leaving it\n * required would have meant that surface passing a literal `undefined`, which reads as an\n * oversight rather than as \"this surface takes no overrides\".\n */\n customRenderers?: Partial<Record<OnboardingElementType, React.FC<GuidanceElementRendererProps>>>,\n): React.FC<GuidanceElementRendererProps> | undefined {\n const custom = customRenderers?.[elementType];\n if (custom) return custom;\n\n const registered = ComponentRegistryService.resolve(\n GUIDANCE_ELEMENT_COMPONENT_TYPE[elementType],\n CorePresetNames.DEFAULT,\n );\n if (registered) return registered as React.FC<GuidanceElementRendererProps>;\n\n return RENDERER_MAP[elementType];\n}\n\n// ─── Error Boundary ──────────────────────────────────────────────\n\nclass GuidanceElementErrorBoundary extends React.Component<\n { elementRef: string; children: React.ReactNode },\n { hasError: boolean }\n> {\n constructor(props: { elementRef: string; children: React.ReactNode }) {\n super(props);\n this.state = { hasError: false };\n }\n\n static getDerivedStateFromError(): { hasError: boolean } {\n return { hasError: true };\n }\n\n componentDidCatch(error: Error): void {\n LoggerFrontendService.getLogger().error(\n `GuidanceRenderer: element \"${this.props.elementRef}\" threw an error`,\n error,\n );\n }\n\n render(): React.ReactNode {\n if (this.state.hasError) return null;\n return this.props.children;\n }\n}\n\n// ─── Target Element Resolution (Phase G / Step 25) ──────────────\n\nfunction resolveTargetSelector(element: OnboardingElement): string | null {\n if ('targetSelector' in element && typeof (element as Record<string, unknown>).targetSelector === 'string') {\n return (element as Record<string, unknown>).targetSelector as string;\n }\n\n if (element.targetField) {\n return `[data-guidance-field=\"${element.targetField}\"]`;\n }\n\n return null;\n}\n\n// ─── Presentable Elements (#539) ─────────────────────────────────\n\n/**\n * Whether an element mounted by the render loop actually PUTS SOMETHING ON SCREEN.\n *\n * Having a renderer is not the same as being visible, and four renderers answer `null` at runtime\n * for reasons the render loop cannot see from the element alone:\n *\n * - a TOOLTIP whose `targetSelector` matches no node — it renders nothing until a rect exists;\n * - a TOUR with no steps — `currentStep` is undefined and it returns before the portal;\n * - an INLINE element whose portal target is absent — `InlinePortal` returns `null`;\n * - any element of a CHECKLIST-mode flow that declares items and no container — the loop's own\n * container scan finds nothing and the items are never mounted.\n *\n * Each of those was counted as presented, so the flow's once-per-user occasion was spent on a\n * screen the user saw nothing on. The DOM lookups here are the same ones the renderers perform, and\n * this runs from an effect, after paint, so they see what the renderers saw AT THAT INSTANT.\n *\n * RESIDUAL, in the other direction and deliberately accepted: the presentation effect re-runs on\n * `activeFlows` and has no DOM signal, while `GuidanceTooltip` re-resolves its target on scroll,\n * resize and a `ResizeObserver`. A tooltip whose target mounts AFTER this effect therefore becomes\n * visible and is never recorded, so its flow fires again next session. That errs toward showing a\n * flow twice rather than spending an occasion on nothing, which is the direction #539 asks for —\n * but it is a residual, not an absence, and closing it means subscribing to the same signals the\n * renderers use.\n */\n/**\n * `document.querySelector` over an AUTHOR-SUPPLIED string, which may not be a selector at all.\n *\n * `targetSelector` is a bare `z.string()`, so `''` or a malformed value makes `querySelector` throw\n * `SyntaxError`. That used to be contained: the lookup lived inside `GuidanceTooltip`'s own effect,\n * under `GuidanceElementErrorBoundary`, so one bad selector cost one element. The visibility check\n * runs from `GuidanceRenderer`'s presentation effect, ABOVE every boundary it renders, so an\n * unguarded throw there takes the whole guidance surface down instead.\n *\n * A selector that cannot be parsed matches nothing, so `false` is also the truthful answer.\n */\nfunction matchesSomething(selector: string): boolean {\n try {\n return Boolean(document.querySelector(selector));\n } catch {\n if (!warnedInvalidSelectors.has(selector)) {\n warnedInvalidSelectors.add(selector);\n LoggerFrontendService.getLogger().warn(\n `GuidanceRenderer: \"${selector}\" is not a valid CSS selector, so the element targeting it can never be shown.`,\n );\n }\n return false;\n }\n}\n\n/** Selectors already reported as unparseable, so the warning fires once rather than per render. */\nconst warnedInvalidSelectors = new Set<string>();\n\nfunction isElementVisible(flow: GuidanceFlowDefinition, element: OnboardingElement): boolean {\n if (typeof document === 'undefined') return false;\n\n if (element.type === OnboardingElementType.TOOLTIP) {\n const selector = (element as Record<string, unknown>).targetSelector;\n return typeof selector === 'string' && matchesSomething(selector);\n }\n\n if (element.type === OnboardingElementType.TOUR) {\n const steps = (element as Record<string, unknown>).steps;\n return Array.isArray(steps) && steps.length > 0;\n }\n\n if (flow.renderMode === GuidanceRenderMode.INLINE) {\n // An inline element with no selector renders in place rather than through a portal, so only a\n // DECLARED target that resolves to nothing makes it invisible.\n const selector = resolveTargetSelector(element);\n return selector === null || matchesSomething(selector);\n }\n\n return true;\n}\n\n/**\n * The elements this renderer actually SHOWS for a flow — the population whose copy decides whether\n * showing the flow spends its occasion.\n *\n * CHECKLIST mode renders only its containers and items, and only when a container exists; every\n * other mode renders every element that has a renderer AND is visible. Kept beside the render\n * loop's own selection so the two cannot disagree about which elements a person sees — which they\n * did, because this function asked only whether a renderer existed. See {@link isElementVisible}.\n */\nfunction selectPresentedElements(\n flow: GuidanceFlowDefinition,\n renderers: Record<OnboardingElementType, React.FC<GuidanceElementRendererProps>>,\n): OnboardingElement[] {\n const hasRenderer = (element: OnboardingElement): boolean => {\n const Renderer = renderers[element.type];\n return Boolean(Renderer) && Renderer !== UnimplementedRenderer;\n };\n if (flow.renderMode === GuidanceRenderMode.CHECKLIST) {\n const containers = flow.elements.filter(el => el.type === OnboardingElementType.CHECKLIST && hasRenderer(el));\n // No container, no items: the render loop scans for containers and never reaches the items.\n if (containers.length === 0) return [];\n return flow.elements.filter(\n el => (el.type === OnboardingElementType.CHECKLIST || el.type === OnboardingElementType.CHECKLIST_ITEM) && hasRenderer(el),\n );\n }\n return flow.elements.filter(el => hasRenderer(el) && isElementVisible(flow, el));\n}\n\n// ─── Inline Portal Wrapper ───────────────────────────────────────\n\nconst InlinePortal: React.FC<{ targetSelector: string; children: React.ReactNode }> = ({ targetSelector, children }) => {\n // Through the guarded lookup: this call is in the RENDER path and outside every error boundary\n // this file mounts, so an author-supplied string that is not a valid selector would throw\n // `SyntaxError` and take the whole guidance surface down rather than hiding one element.\n const target = typeof document !== 'undefined' && matchesSomething(targetSelector)\n ? document.querySelector(targetSelector)\n : null;\n if (!target) return null;\n\n return ReactDOM.createPortal(\n <div className=\"absolute z-[calc(var(--z-guidance)-2)]\">\n {children}\n </div>,\n target,\n );\n};\n\n// ─── GuidanceRenderer Component ──────────────────────────────────\n\nexport interface GuidanceRendererProps {\n customRenderers?: Partial<Record<OnboardingElementType, React.FC<GuidanceElementRendererProps>>>;\n}\n\nexport const GuidanceRenderer: React.FC<GuidanceRendererProps> = ({ customRenderers }) => {\n const { activeFlows, flowStates, completeElement, dismissFlow, recordFlowPresented, reportFlowNotPresentable } = useGuidance();\n const guidanceI18nKeys = useMemo(() => activeFlows.map(f => `guidance.${f.ref}`), [activeFlows]);\n const { makeTrGuidanceElement, tGuidanceElement, isReady: isGuidanceI18nReady } = useI18n({ keys: guidanceI18nKeys });\n const { emit } = useEventBus();\n const portalContainer = usePortalContainer();\n\n /**\n * One resolved renderer per element type, built through\n * {@link resolveGuidanceElementRenderer} so a registered preset participates.\n *\n * This was `{ ...RENDERER_MAP, ...customRenderers }` — a spread over the built-ins that gave the\n * component registry no say at all, which is why every guidance surface was unswappable in\n * practice while its specification advertised a preset.\n *\n * ## Why the registration COUNT is a dependency\n *\n * An earlier version deliberately took none, reasoning that \"the registry is a module-level\n * singleton populated once at startup, before anything renders\". That is an assumption about every\n * host, not a property of the registry: a lazily-loaded preset bundle, a registration inside an\n * effect, and a code-split design system all register AFTER this memo first resolves — and the\n * failure is silent, because the application's component simply never appears.\n *\n * `getRegistrationCount()` grows with every new key, so it is the cheapest available version\n * signal and re-resolving costs one map lookup per element type. RESIDUAL: re-registering an\n * EXISTING key replaces the value without changing the count. That cannot affect a guidance slot\n * today — nothing in the engine registers one, so the first registration is always a new key — but\n * a registry that published a change signal would remove the caveat as well as the polling.\n *\n * ## Why the resolved map keeps its identity\n *\n * It is a dependency of `renderedFlows`, and the overwhelmingly common `customRenderers` call\n * shape is an inline object literal — a new identity every render. Returning the PREVIOUS object\n * when every entry is unchanged keeps that memo effective while still letting a genuine change\n * through.\n */\n const registrationCount = ComponentRegistryService.getRegistrationCount();\n const resolvedRenderersRef = useRef<Record<OnboardingElementType, React.FC<GuidanceElementRendererProps>> | null>(null);\n const effectiveRenderers = useMemo(\n () => {\n const resolved: Partial<Record<OnboardingElementType, React.FC<GuidanceElementRendererProps>>> = {};\n for (const elementType of Object.values(OnboardingElementType)) {\n const renderer = resolveGuidanceElementRenderer(elementType, customRenderers);\n if (renderer) resolved[elementType] = renderer;\n }\n const next = resolved as Record<OnboardingElementType, React.FC<GuidanceElementRendererProps>>;\n const previous = resolvedRenderersRef.current;\n if (previous && Object.values(OnboardingElementType).every(type => previous[type] === next[type])) {\n return previous;\n }\n resolvedRenderersRef.current = next;\n return next;\n },\n [customRenderers, registrationCount],\n );\n\n // Emit NAVIGATION_REQUEST with the unresolved operationRef.\n // Guidance sits above ResourceRegistryProvider, so we use the\n // operationRef shorthand (same pattern as NotificationContext).\n const handleAction = useCallback((actionRef: string) => {\n emit(FrontendEvents.NAVIGATION_REQUEST, {\n operationRef: actionRef,\n initiator: {\n sourceZone: APP_LEVEL_NAVIGATION_SOURCE,\n },\n });\n }, [emit]);\n\n const handleComplete = useCallback((flowRef: string, elementRef: string, data?: { surveyAnswers?: Record<string, unknown>; lastStepIndex?: number; declineResourceBinding?: boolean }): Promise<void> => {\n // The promise is RETURNED rather than swallowed: a bound survey rejects when its write is\n // refused, and its renderer awaits that to keep the form open (#1372).\n return completeElement(flowRef, elementRef, data);\n }, [completeElement]);\n\n const handleDismiss = useCallback((flowRef: string, _elementRef: string) => {\n dismissFlow(flowRef);\n }, [dismissFlow]);\n\n // Build per-flow rendering output\n const renderedFlows = useMemo(() => {\n if (activeFlows.length === 0) return null;\n\n const overlayElements: React.ReactNode[] = [];\n const inlineElements: React.ReactNode[] = [];\n const checklistElements: React.ReactNode[] = [];\n\n for (const flow of activeFlows) {\n const flowState = flowStates[flow.ref];\n\n if (flow.renderMode === GuidanceRenderMode.CHECKLIST) {\n // Group CHECKLIST_ITEM elements inside their parent CHECKLIST container\n const checklistContainers = flow.elements.filter(\n el => el.type === OnboardingElementType.CHECKLIST\n );\n const itemElements = flow.elements.filter(\n el => el.type === OnboardingElementType.CHECKLIST_ITEM\n );\n\n for (const container of checklistContainers) {\n const ChecklistRenderer = effectiveRenderers[OnboardingElementType.CHECKLIST];\n if (!ChecklistRenderer || ChecklistRenderer === UnimplementedRenderer) continue;\n\n const containerState: GuidanceElementState | undefined = flowState?.elements?.[container.ref];\n const containerT = makeTrGuidanceElement(flow.ref, container.ref, resolveGuidanceElementRequiredLabelFields(container));\n\n const ItemRenderer = effectiveRenderers[OnboardingElementType.CHECKLIST_ITEM];\n const itemNodes = ItemRenderer && ItemRenderer !== UnimplementedRenderer\n ? itemElements.map(item => {\n const itemState: GuidanceElementState | undefined = flowState?.elements?.[item.ref];\n const itemT = makeTrGuidanceElement(flow.ref, item.ref, resolveGuidanceElementRequiredLabelFields(item));\n return (\n <GuidanceElementErrorBoundary key={`${flow.ref}-${item.ref}`} elementRef={item.ref}>\n <ItemRenderer\n element={item}\n flowRef={flow.ref}\n state={itemState}\n onComplete={(elRef, data) => handleComplete(flow.ref, elRef, data)}\n onDismiss={(elRef) => handleDismiss(flow.ref, elRef)}\n onAction={handleAction}\n t={itemT}\n />\n </GuidanceElementErrorBoundary>\n );\n })\n : null;\n\n const node = (\n <GuidanceElementErrorBoundary key={`${flow.ref}-${container.ref}`} elementRef={container.ref}>\n <ChecklistRenderer\n element={container}\n flowRef={flow.ref}\n state={containerState}\n onComplete={(elRef, data) => handleComplete(flow.ref, elRef, data)}\n onDismiss={(elRef) => handleDismiss(flow.ref, elRef)}\n onAction={handleAction}\n t={containerT}\n {...({ children: itemNodes } as Partial<GuidanceChecklistProps>)}\n />\n </GuidanceElementErrorBoundary>\n );\n checklistElements.push(node);\n }\n continue;\n }\n\n for (const element of flow.elements) {\n const Renderer = effectiveRenderers[element.type];\n if (!Renderer || Renderer === UnimplementedRenderer) continue;\n\n const elementState: GuidanceElementState | undefined = flowState?.elements?.[element.ref];\n const t = makeTrGuidanceElement(flow.ref, element.ref, resolveGuidanceElementRequiredLabelFields(element));\n\n const node = (\n <GuidanceElementErrorBoundary key={`${flow.ref}-${element.ref}`} elementRef={element.ref}>\n <Renderer\n element={element}\n flowRef={flow.ref}\n state={elementState}\n onComplete={(elRef, data) => handleComplete(flow.ref, elRef, data)}\n onDismiss={(elRef) => handleDismiss(flow.ref, elRef)}\n onAction={handleAction}\n t={t}\n />\n </GuidanceElementErrorBoundary>\n );\n\n switch (flow.renderMode) {\n case GuidanceRenderMode.OVERLAY:\n overlayElements.push(node);\n break;\n case GuidanceRenderMode.INLINE: {\n const selector = resolveTargetSelector(element);\n if (selector) {\n inlineElements.push(\n <InlinePortal\n key={`inline-${flow.ref}-${element.ref}`}\n targetSelector={selector}\n >\n {node}\n </InlinePortal>,\n );\n } else {\n inlineElements.push(node);\n }\n break;\n }\n }\n }\n }\n\n return { overlayElements, inlineElements, checklistElements };\n // `effectiveRenderers` is read at three sites in this block and was MISSING from these\n // dependencies, so the memo kept the first resolution for the component's life: a\n // `customRenderers` prop that changed — a feature flag, a lazily loaded bundle, an A/B arm —\n // never took effect. It is identity-stable by content (see its own docblock), so including it\n // does not defeat the memo for the common inline-literal call shape.\n }, [activeFlows, flowStates, effectiveRenderers, makeTrGuidanceElement, handleAction, handleComplete, handleDismiss]);\n\n /*\n * PRESENTATION — the moment a flow's once-per-user occasion is spent (#539).\n *\n * Only this layer knows whether a flow's copy exists, so only this layer may\n * decide that showing it counted. A flow with every required label resolved is\n * recorded as presented. A flow missing one is still RENDERED — its required slots\n * show their raw keys, so the gap is visible — but it is not recorded, so it fires\n * again once the labelling pipeline has generated its copy instead of having been\n * silently consumed by an author's first run. The console names the missing keys,\n * once per flow and missing set, because every request in that situation is a 200.\n *\n * Waits for readiness: before the bundle settles every key reads as missing, and\n * recording nothing then is correct but warning would be noise.\n */\n const warnedMissingLabelSignaturesRef = useRef<Set<string>>(new Set());\n useEffect(() => {\n if (!isGuidanceI18nReady) return;\n for (const flow of activeFlows) {\n const presentedElements = selectPresentedElements(flow, effectiveRenderers);\n /*\n * Tell the context when a flow resolves to NOTHING. An OVERLAY flow whose elements never\n * render still occupied the single overlay slot for the session — it never reaches a terminal\n * status, so it never leaves the active set — and permanently suppressed a lower-priority\n * flow that would have rendered.\n */\n reportFlowNotPresentable(flow.ref, presentedElements.length === 0);\n if (presentedElements.length === 0) continue;\n const missingKeys = presentedElements.flatMap(element =>\n resolveGuidanceElementRequiredLabelFields(element)\n .filter(field => tGuidanceElement(flow.ref, element.ref, field) === undefined)\n .map(field => `guidance.${flow.ref}.elements.${element.ref}.${field}`),\n );\n if (missingKeys.length === 0) {\n recordFlowPresented(flow.ref);\n continue;\n }\n const signature = `${flow.ref}|${missingKeys.join(',')}`;\n if (warnedMissingLabelSignaturesRef.current.has(signature)) continue;\n warnedMissingLabelSignaturesRef.current.add(signature);\n LoggerFrontendService.getLogger().warn(\n `GuidanceRenderer: flow \"${flow.ref}\" is shown but NOT recorded as presented — its required labels are unresolved `\n + `[${missingKeys.join(', ')}]. Generate the labels; the flow will trigger again once they exist.`,\n );\n }\n }, [isGuidanceI18nReady, activeFlows, effectiveRenderers, tGuidanceElement, recordFlowPresented]);\n\n if (!isGuidanceI18nReady) return null;\n if (!renderedFlows) return null;\n\n const { overlayElements, inlineElements, checklistElements } = renderedFlows;\n const hasContent = overlayElements.length > 0 || inlineElements.length > 0 || checklistElements.length > 0;\n if (!hasContent) return null;\n const portalTarget = typeof document !== 'undefined' ? portalContainer ?? document.body : undefined;\n\n /**\n * The guidance layers position against the CONTENT AREA, not the viewport.\n *\n * ## What was wrong, measured in a running application\n *\n * Both layers were `fixed`. A fixed element resolves against the VIEWPORT and ignores whatever\n * containing block it was portalled into — so with the app shell's `<main>` at\n * `left: 256, top: 52` (sidebar 256 wide, header 52 tall), the overlay layer still covered\n * `0,0 → 1440×1000` and `GuidanceBanner`'s `absolute top-0 inset-x-0` landed on the viewport's top\n * edge. `document.elementFromPoint` at the header's own centre returned the BANNER's title: the\n * logo, the resource selector, global search, notifications and the user avatar were all covered,\n * and since the banner sets `pointer-events-auto` it took their clicks too. A dismissible notice\n * was hiding the application's primary navigation for as long as it was up.\n *\n * ## Why `absolute` is the fix rather than an offset\n *\n * The shell already publishes the right anchor and makes it work: the shell's content outlet\n * (`AppShellContentOutlet`, which every layout container places — the default one with\n * `className=\"flex-1 relative min-w-0\"`) renders `<main>` and hands that element to\n * `PortalContainerContext`, so it is BOTH the portal target and a containing block. `fixed` was\n * the one thing standing between that arrangement and the correct result; `absolute inset-0` fills\n * the content area exactly, and every self-positioning child — the banner's `top-0`, the\n * checklist's `bottom-6 end-6` — then means the top and bottom of the content area, which is what\n * those authoring values have always claimed to mean. No offset to keep in step with a header\n * height, and an END sidebar or a bottom status bar is respected for free.\n *\n * ## The fallback, and the contract\n *\n * With no portal container — the public and auth layouts, and unit tests — the target is\n * `document.body`, which is not positioned, so the layers stay `fixed` and behave exactly as\n * before. The contract this relies on: **a guidance portal container must be a containing block**\n * (`position` other than `static`). One provider sets it today and it satisfies that; a host that\n * sets its own must too.\n */\n const layerPosition = portalContainer ? 'absolute' : 'fixed';\n\n return (\n <>\n {/* OVERLAY -- rendered in the app portal target when available. */}\n {overlayElements.length > 0 && portalTarget &&\n ReactDOM.createPortal(\n /**\n * The OVERLAY layer positions the elements that do not position THEMSELVES.\n *\n * It was a bare `fixed inset-0 … pointer-events-none` with no layout at all. Modal, tour\n * and tooltip portal out of it and banner self-positions (`absolute top-0 inset-x-0`), so\n * those four were fine — but CARD, SURVEY, ANNOUNCEMENT and BADGE are ordinary in-flow\n * children, and an in-flow child of a `fixed inset-0` box with no layout renders\n * full-viewport-width, pinned to the top-left corner, stacked on top of any banner. That\n * is what `renderMode: OVERLAY` with any of those four element types actually produced,\n * and it is the default authoring path.\n *\n * Centred with a readable cap rather than stretched: an overlay card is a focal message,\n * and `max-w-md` is the width `GuidanceModal` already uses for the same kind of content,\n * so the two read as one system.\n *\n * ## No padding and no `overflow-y-auto` on THIS element, and both were here and wrong\n *\n * `GuidanceBanner` is `absolute top-0 inset-x-0` — NOT `fixed`, which an earlier version of\n * this comment asserted and reasoned from. An absolutely positioned child resolves against\n * the nearest positioned ancestor's PADDING BOX, and this layer is that ancestor, so a\n * `p-element` here inset the banner from all four viewport edges — visibly breaking the one\n * overlay element that had always positioned itself correctly. Edge spacing therefore lives\n * on the per-element wrapper below, which is static and so is not a containing block.\n *\n * `overflow-y-auto` was added claiming it made a third card reachable. It does not: content\n * overflowing the START edge of a centred flex container cannot be scrolled to, and the\n * layer is `pointer-events-none`, so a wheel event never targets it. Overflow with several\n * simultaneously eligible overlay flows is a real limitation and is left honestly\n * unaddressed rather than papered over by a class that does nothing.\n *\n * `pointer-events-none` stays — every renderer that is interactive sets\n * `pointer-events-auto` on its own root.\n */\n <div\n data-guidance-layer=\"overlay\"\n className={`${layerPosition} inset-0 z-(--z-guidance) pointer-events-none flex flex-col items-center justify-center gap-element`}\n >\n {overlayElements.map(node => (\n /**\n * Capped and padded per element rather than by a rule on the layer, because this\n * wrapper is STATIC: it establishes no containing block, so the absolutely positioned\n * banner resolves against the layer and ignores this box entirely, while\n * card/survey/announcement/badge are laid out by it. A `[&>*]` rule or padding on the\n * layer would reach the banner and did.\n *\n * `empty:hidden` because modal, tour, tooltip and banner all portal their DOM\n * elsewhere, leaving this wrapper with no child nodes. A childless flex item still\n * consumes a `gap`, so without this each portalling element added a slice of empty\n * space that pushed the genuinely centred cards off-centre.\n *\n * The node's OWN key is reused rather than the array index — these are keyed\n * `${flowRef}-${elementRef}` at construction, and several flows can be eligible at\n * once, so an index would remount the wrong subtree whenever eligibility reorders.\n */\n <div\n key={(node as React.ReactElement).key}\n className=\"w-full max-w-md shrink-0 px-element empty:hidden\"\n >\n {node}\n </div>\n ))}\n </div>,\n portalTarget,\n )\n }\n\n {/* INLINE -- already portalled individually per-element */}\n {inlineElements}\n\n {/* CHECKLIST -- floating panel, bottom-right via portal */}\n {checklistElements.length > 0 && portalTarget &&\n ReactDOM.createPortal(\n <div data-guidance-layer=\"checklist\" className={`${layerPosition} bottom-6 end-6 z-[calc(var(--z-guidance)-1)]`}>\n {checklistElements}\n </div>,\n portalTarget,\n )\n }\n </>\n );\n};\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React, { ReactNode } from 'react';
|
|
2
2
|
import type { DateDisplayMode } from '@wildo-ai/zod-decorators';
|
|
3
3
|
import { FrontendComponentType, AvailableLanguage, SystemEnumName, TextDirection, type RegionalFormattingConfig, NavigationViewLabelFamily, type ResourceOperationTextSlot } from '@wildo-ai/presets-components-models';
|
|
4
|
-
import { UserLanguagePreferences, UserPreferences, type ActivationCriterion } from '@wildo-ai/saas-models';
|
|
4
|
+
import { UserLanguagePreferences, UserPreferences, type ActivationCriterion, type ApplicationConfigVocabulary, type EngineOpenVocabulary } from '@wildo-ai/saas-models';
|
|
5
5
|
import type { z } from 'zod';
|
|
6
6
|
/**
|
|
7
7
|
* Internationalization Context
|
|
@@ -43,13 +43,19 @@ export interface I18nContextType {
|
|
|
43
43
|
getLanguagePreferences: () => UserLanguagePreferences | null;
|
|
44
44
|
getRegionalPreferences: () => UserPreferences['regional'] | null;
|
|
45
45
|
tResourceHeader: (resource: string, key: 'title' | 'description', params?: Record<string, string | number>) => string;
|
|
46
|
-
|
|
46
|
+
/**
|
|
47
|
+
* An empty state's OWN words. There is no `primaryActionLabel` key: the empty state's primary action IS the
|
|
48
|
+
* CREATE operation, so it is named by that operation's title (`tResourceOperation(resource, CREATE, 'title')`),
|
|
49
|
+
* the same word the toolbar's create button uses — one action, one name.
|
|
50
|
+
*/
|
|
51
|
+
tResourceEmptyState: (resource: string, key: 'title' | 'description' | 'secondaryActionLabel', params?: Record<string, string | number>) => string;
|
|
47
52
|
tResourceOperation: (resource: string, operation: string, key: `${ResourceOperationTextSlot}`, params?: Record<string, string | number>) => string;
|
|
48
53
|
tResourceFieldDisplay: (resource: string, fieldPath: string, key: 'label' | 'description' | 'tooltip', params?: Record<string, string | number>) => string;
|
|
49
54
|
tResourceFieldEdit: (resource: string, fieldPath: string, key: 'label' | 'description' | 'placeholder' | 'tooltip', params?: Record<string, string | number>) => string;
|
|
50
55
|
/**
|
|
51
|
-
* An enum value's word: the per-field key, then
|
|
52
|
-
*
|
|
56
|
+
* An enum value's word: the per-field key, then the word of the vocabulary the FIELD declares — where that
|
|
57
|
+
* vocabulary keeps it (`resolveVocabularyWordKey`: `system_enums.<name>.<value>`, or a feature's and a limit's
|
|
58
|
+
* billing section, #1851) — then the raw value. `fieldSchema` is REQUIRED-but-undefinable on purpose — it is where the declared enum is
|
|
53
59
|
* read (`.systemEnum(name)`, else an exact framework value-set match), and a caller that has no schema
|
|
54
60
|
* must say so: without one only the per-field key can answer (#966).
|
|
55
61
|
*/
|
|
@@ -60,7 +66,14 @@ export interface I18nContextType {
|
|
|
60
66
|
/** Resolve error guidance label: `errors_guidance.{guidanceKey}.{field}` — returns empty string when missing */
|
|
61
67
|
tErrorGuidance: (guidanceKey: string, field: string, params?: Record<string, string | number>) => string;
|
|
62
68
|
tNotificationCustom: (notificationRef: string, key?: string, params?: Record<string, string | number>) => string;
|
|
63
|
-
|
|
69
|
+
/**
|
|
70
|
+
* A value's word from where its vocabulary keeps it (`resolveVocabularyWordKey`, normally
|
|
71
|
+
* `system_enums.<enumName>.<value>`); the raw value when none is authored (a missing label that looks missing). `enumName` is a framework vocabulary (`SystemEnumName`), a framework-named vocabulary whose VALUES
|
|
72
|
+
* the application declares (`ApplicationConfigVocabulary`: the reason codes #1921, the organization types #1851, the gates' pause states #1864), or
|
|
73
|
+
* one of the engine's open vocabularies (`EngineOpenVocabulary`: the audit event types #1791). Typed closed on
|
|
74
|
+
* purpose: each of the three is a vocabulary the labelling planner plans.
|
|
75
|
+
*/
|
|
76
|
+
tSystemEnum: (enumName: SystemEnumName | ApplicationConfigVocabulary | EngineOpenVocabulary, enumValue: string) => string;
|
|
64
77
|
tResourceSection: (resource: string, sectionRef: string, key: 'title' | 'description', params?: Record<string, string | number>) => string;
|
|
65
78
|
tResourceWizardStep: (resource: string, stepRef: string, key: 'title' | 'description', params?: Record<string, string | number>) => string;
|
|
66
79
|
/**
|
|
@@ -102,8 +115,9 @@ export interface I18nContextType {
|
|
|
102
115
|
/**
|
|
103
116
|
* Resolve role label from `roles.<roleRef>.<label|description>`.
|
|
104
117
|
* Mirrors the labelling-policy shape in `LabellingPolicy[ROLES]` and the
|
|
105
|
-
* shared `tBilling*` precedent: returns the
|
|
106
|
-
*
|
|
118
|
+
* shared `tBilling*` precedent: returns the raw roleRef when the `label` key
|
|
119
|
+
* is missing — a missing label must look missing (#420) — and an empty string
|
|
120
|
+
* when `description` is missing.
|
|
107
121
|
* `roleRef` here is the bi-scoped key (e.g. `app.OWNER`) used by the
|
|
108
122
|
* `RoleSpecification` registry, matching what backend i18n collection emits.
|
|
109
123
|
*/
|
|
@@ -154,7 +168,7 @@ export interface I18nContextType {
|
|
|
154
168
|
/** Convenience: request resource translations by resource type name. */
|
|
155
169
|
requestResourceKeys: (resourceType: string | string[]) => Promise<void>;
|
|
156
170
|
makeTrResourceHeader: (resource: string) => (key?: 'title' | 'description', params?: Record<string, string | number>) => string;
|
|
157
|
-
makeTrResourceEmptyState: (resource: string) => (key?: 'title' | 'description' | '
|
|
171
|
+
makeTrResourceEmptyState: (resource: string) => (key?: 'title' | 'description' | 'secondaryActionLabel', params?: Record<string, string | number>) => string;
|
|
158
172
|
makeTrResourceOperation: (resource: string) => (operation: string, key?: 'title', params?: Record<string, string | number>) => string;
|
|
159
173
|
makeTrResourceFieldDisplay: (resource: string) => (fieldPath: string, key?: 'label' | 'tooltip', params?: Record<string, string | number>) => string;
|
|
160
174
|
makeTrResourceFieldEdit: (resource: string) => (fieldPath: string, key?: 'label' | 'placeholder' | 'tooltip', params?: Record<string, string | number>) => string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"I18nContext.d.ts","sourceRoot":"","sources":["../../../../../src/core/i18n/I18nContext.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAA2B,SAAS,EAAuD,MAAM,OAAO,CAAC;AAEvH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAEhE,OAAO,EACW,qBAAqB,EAAE,iBAAiB,EACxD,cAAc,EAA0B,aAAa,EACrD,KAAK,wBAAwB,EAE7B,yBAAyB,
|
|
1
|
+
{"version":3,"file":"I18nContext.d.ts","sourceRoot":"","sources":["../../../../../src/core/i18n/I18nContext.tsx"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import { jsx as _jsx } from "react/jsx-runtime";
|
|
|
2
2
|
import { createContext, useState, useEffect, useMemo, useRef, useCallback, useContext } from 'react';
|
|
3
3
|
import { DirectionProvider } from '@radix-ui/react-direction';
|
|
4
4
|
import { LOCAL_STORAGE_KEYS } from '../../core/commons/local-storage.frontend.schemas.js';
|
|
5
|
-
import { LabellingTypes, AvailableLanguage, LANGUAGE_INFO_MAP, TextDirection, RegionalFormattingUtils, EAGER_I18N_SECTIONS, } from '@wildo-ai/presets-components-models';
|
|
5
|
+
import { LabellingTypes, AvailableLanguage, LANGUAGE_INFO_MAP, TextDirection, RegionalFormattingUtils, EAGER_I18N_SECTIONS, resolveVocabularyWordKey, } from '@wildo-ai/presets-components-models';
|
|
6
6
|
import { getManualCallsHttpClient } from '../../core/requests/wildo-http-client-manual-calls.frontend.service.js';
|
|
7
7
|
import { MainContextInitComponents } from '../../core/runtime/runtime.frontend.schemas.js';
|
|
8
8
|
import { useApplication } from '../../core/runtime/useApplication.js';
|
|
@@ -132,10 +132,21 @@ export const I18nProvider = ({ children }) => {
|
|
|
132
132
|
if (configAllowUserOverride && supportsLanguage(userPreferences?.primaryLanguage)) {
|
|
133
133
|
return userPreferences.primaryLanguage;
|
|
134
134
|
}
|
|
135
|
+
// The user's own answer to "what if my language is not offered here" (#1799): their fallbacks, in
|
|
136
|
+
// order, before anything remembered or detected. It was stored and edited and read by nothing. The
|
|
137
|
+
// backend's email language makes the same choice (`resolveRecipientLanguage`).
|
|
138
|
+
if (configAllowUserOverride) {
|
|
139
|
+
const fallback = (userPreferences?.fallbackLanguages ?? []).find((language) => supportsLanguage(language));
|
|
140
|
+
if (fallback)
|
|
141
|
+
return fallback;
|
|
142
|
+
}
|
|
135
143
|
if (configAllowUserOverride && supportsLanguage(options?.savedLanguage)) {
|
|
136
144
|
return options.savedLanguage;
|
|
137
145
|
}
|
|
138
|
-
|
|
146
|
+
// The APPLICATION's setting decides whether to follow the browser. The per-user `autoDetect` it
|
|
147
|
+
// used to defer to was removed (#1799): it was consulted only after the primary had failed and
|
|
148
|
+
// nothing was remembered, which for a signed-in user almost never happens.
|
|
149
|
+
const shouldAutoDetect = configAllowUserOverride && configAutoDetect;
|
|
139
150
|
if (shouldAutoDetect && supportsLanguage(options?.browserLanguage)) {
|
|
140
151
|
return options.browserLanguage;
|
|
141
152
|
}
|
|
@@ -778,11 +789,11 @@ export const I18nProvider = ({ children }) => {
|
|
|
778
789
|
const tResourceEmptyState = (resource, key, params) => {
|
|
779
790
|
const base = `${LabellingTypes.RESOURCES}.${resource}.emptyState.${key}`;
|
|
780
791
|
const result = t(base, params);
|
|
781
|
-
// `title
|
|
782
|
-
//
|
|
783
|
-
//
|
|
784
|
-
//
|
|
785
|
-
//
|
|
792
|
+
// `title` and `description` are OPTIONAL by design: the labelling planner emits an `emptyState`
|
|
793
|
+
// block only for collection resources (measured 2026-09-21 on Wonder Todos: 160 of 176), and the
|
|
794
|
+
// title falls back to the generic `RESOURCES_LAYOUTS_LIST.noItems`. So `''` means "none authored",
|
|
795
|
+
// and a caller of the title must END its chain in that required label. (The primary action has no
|
|
796
|
+
// key here at all: it is the CREATE operation and takes that operation's title.)
|
|
786
797
|
//
|
|
787
798
|
// `secondaryActionLabel` is the exception, in the planner's words "the one empty-state label with
|
|
788
799
|
// NO fallback": it is planned exactly when the frontend declares a `secondaryAction`, which is
|
|
@@ -837,7 +848,8 @@ export const I18nProvider = ({ children }) => {
|
|
|
837
848
|
// gets authored, instead of a borrowed word that looks authored and never does.
|
|
838
849
|
const declaredEnumName = fieldSchema ? resolveResourceLabelSystemEnumName(fieldSchema) : undefined;
|
|
839
850
|
if (declaredEnumName) {
|
|
840
|
-
|
|
851
|
+
// Where the declared vocabulary keeps its words: `system_enums.<name>`, or its own section (a feature, a limit).
|
|
852
|
+
const systemKey = resolveVocabularyWordKey(declaredEnumName, enumValue);
|
|
841
853
|
const systemResult = t(systemKey);
|
|
842
854
|
if (systemResult !== systemKey)
|
|
843
855
|
return systemResult;
|
|
@@ -875,7 +887,7 @@ export const I18nProvider = ({ children }) => {
|
|
|
875
887
|
return t(base, params);
|
|
876
888
|
};
|
|
877
889
|
const tSystemEnum = (enumName, enumValue) => {
|
|
878
|
-
const base =
|
|
890
|
+
const base = resolveVocabularyWordKey(enumName, enumValue);
|
|
879
891
|
const result = t(base);
|
|
880
892
|
// If translation not found, fallback to enum value
|
|
881
893
|
return result === base ? enumValue : result;
|