@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
|
@@ -86,7 +86,7 @@ function FormFieldChrome({ mode, label, description, error, required, labelPlace
|
|
|
86
86
|
}
|
|
87
87
|
// ── RELAXED mode: generous spacing, heading-size label ──
|
|
88
88
|
if (effectiveMode === EditChromeMode.RELAXED) {
|
|
89
|
-
return (_jsxs("div", { "data-slot": "field-chrome", "data-chrome-mode": "relaxed", "data-label-placement": effectiveLabelPlacement, "data-field": fieldName, "data-testid": fieldName ? `field-${fieldName}` : undefined, "data-guidance-field": fieldName, "data-invalid": !!error || undefined, "data-disabled": disabled || undefined, className: cn("flex flex-col gap-field", className), children: [hiddenLabel, showLabel && (_jsxs("label", { htmlFor: fieldId, className: cn("text-lg font-semibold leading-snug", disabled && "opacity-[var(--opacity-disabled)]"), children: [label, required && _jsx("span", { className: "text-destructive ms-1", "aria-hidden": "true", children: "*" }), tooltip && _jsx(TooltipIcon, { text: tooltip })] })), showDescription && (_jsx("p", { id: descriptionId, className: "text-base text-muted-foreground leading-normal -mt-1", children: description })), _jsx("div", { className: "py-1", children: wrappedChildren }), showError && (_jsx("div", { id: errorId, role: "alert", className: "text-base text-destructive font-normal", children: error }))] }));
|
|
89
|
+
return (_jsxs("div", { "data-slot": "field-chrome", "data-chrome-mode": "relaxed", "data-label-placement": effectiveLabelPlacement, "data-field": fieldName, "data-testid": fieldName ? `field-${fieldName}` : undefined, "data-guidance-field": fieldName, "data-invalid": !!error || undefined, "data-disabled": disabled || undefined, className: cn("flex flex-col gap-field", className), children: [hiddenLabel, showLabel && (_jsxs("label", { id: labelId, htmlFor: fieldId, className: cn("text-lg font-semibold leading-snug", disabled && "opacity-[var(--opacity-disabled)]"), children: [label, required && _jsx("span", { className: "text-destructive ms-1", "aria-hidden": "true", children: "*" }), tooltip && _jsx(TooltipIcon, { text: tooltip })] })), showDescription && (_jsx("p", { id: descriptionId, className: "text-base text-muted-foreground leading-normal -mt-1", children: description })), _jsx("div", { className: "py-1", children: wrappedChildren }), showError && (_jsx("div", { id: errorId, role: "alert", className: "text-base text-destructive font-normal", children: error }))] }));
|
|
90
90
|
}
|
|
91
91
|
// ── SETTINGS_ROW mode: a self-contained settings list-item ──
|
|
92
92
|
// Label/description inline-start, control/error inline-end. The row owns ALL
|
|
@@ -142,7 +142,7 @@ function FormFieldChrome({ mode, label, description, error, required, labelPlace
|
|
|
142
142
|
// host); block padding stays tight (`py-card-sm`).
|
|
143
143
|
"flex min-h-10 px-card py-card-sm border-b border-border last:border-b-0 hover:bg-muted/50 transition-colors", stacksControl
|
|
144
144
|
? "flex-col gap-element-xs"
|
|
145
|
-
: cn("flex-row gap-section", showDescription ? "items-start" : "items-center has-[textarea]:items-start"), className), children: [_jsxs("div", { className: cn("flex min-w-0 flex-col gap-element-xs", !stacksControl && "flex-1"), children: [hiddenLabel, showLabel && (_jsxs("label", { htmlFor: fieldId, className: cn("text-sm font-medium leading-snug", disabled && "opacity-[var(--opacity-disabled)]"), children: [label, required && _jsx("span", { className: "text-destructive ms-0.5", "aria-hidden": "true", children: "*" }), tooltip && _jsx(TooltipIcon, { text: tooltip })] })), showDescription && (_jsx(FieldDescription, { id: descriptionId, children: description }))] }), _jsxs("div", { className: cn("flex min-w-0 flex-col gap-element-xs", stacksControl ? "w-full" : "w-72 max-w-[55%] shrink items-end"), children: [wrappedChildren, showError && _jsx(FieldError, { id: errorId, children: error })] })] }));
|
|
145
|
+
: cn("flex-row gap-section", showDescription ? "items-start" : "items-center has-[textarea]:items-start"), className), children: [_jsxs("div", { className: cn("flex min-w-0 flex-col gap-element-xs", !stacksControl && "flex-1"), children: [hiddenLabel, showLabel && (_jsxs("label", { id: labelId, htmlFor: fieldId, className: cn("text-sm font-medium leading-snug", disabled && "opacity-[var(--opacity-disabled)]"), children: [label, required && _jsx("span", { className: "text-destructive ms-0.5", "aria-hidden": "true", children: "*" }), tooltip && _jsx(TooltipIcon, { text: tooltip })] })), showDescription && (_jsx(FieldDescription, { id: descriptionId, children: description }))] }), _jsxs("div", { className: cn("flex min-w-0 flex-col gap-element-xs", stacksControl ? "w-full" : "w-72 max-w-[55%] shrink items-end"), children: [wrappedChildren, showError && _jsx(FieldError, { id: errorId, children: error })] })] }));
|
|
146
146
|
}
|
|
147
147
|
// ── STACKED mode (default): label above, control, description + error below ──
|
|
148
148
|
return (_jsxs(Field, { orientation: FieldVariants_Orientation.VERTICAL, "data-slot": "field-chrome", "data-chrome-mode": "stacked", "data-label-placement": effectiveLabelPlacement, "data-field": fieldName, "data-testid": fieldName ? `field-${fieldName}` : undefined, "data-guidance-field": fieldName, "data-invalid": !!error || undefined, "data-disabled": disabled || undefined, className: className, children: [hiddenLabel, showLabel && (_jsxs(FieldLabel, { id: labelId, htmlFor: fieldId, children: [label, required && _jsx("span", { className: "text-destructive ms-0.5", "aria-hidden": "true", children: "*" }), tooltip && _jsx(TooltipIcon, { text: tooltip })] })), wrappedChildren, showDescription && _jsx(FieldDescription, { id: descriptionId, children: description }), showError && _jsx(FieldError, { id: errorId, children: error })] }));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormFieldChrome.js","sourceRoot":"","sources":["../../../../../../src/components/form/chromes/FormFieldChrome.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\"\n\n/**\n * FormFieldChrome — centralized chrome (label, description, error, required indicator)\n * wrapper for form fields.\n *\n * Mirrors the display system pattern: FormField dispatches to a preset,\n * the preset returns bare interactive content, and FormFieldChrome wraps it\n * with the appropriate chrome layout.\n *\n * Chrome mode is resolved via a two-phase cascade:\n * Phase 1 (FormField): field decorator → section default → form default → surface policy → STACKED\n * Phase 2 (here): responsive viewport resolution via useUI()\n *\n * ## data-field safety net\n *\n * Every visible chrome mode renders `data-field={fieldName}` on its outer\n * wrapper element. This guarantees that `scrollToFirstError` (which queries\n * `[data-field=\"...\"]`) can always locate the DOM node for a field,\n * regardless of whether the inner control also emits the attribute.\n * Individual controls may still set `data-field` on their own root — that's\n * fine; the chrome's attribute serves as an outer fallback.\n */\n\nimport * as React from \"react\"\nimport { useMemo } from \"react\"\n\nimport { cn } from \"~wildo-frontend-lib/core/ui/cn\"\nimport {\n Field,\n FieldLabel,\n FieldDescription,\n FieldError,\n FieldContent,\n FieldTitle,\n FieldVariants_Orientation,\n} from \"~wildo-frontend-lib/components/form/chromes/field\"\nimport { Tooltip, TooltipTrigger, TooltipContent } from \"~wildo-frontend-lib/components/overlays/floating/tooltip\"\nimport { type WrapWithAutosaveIndicatorOptions } from \"~wildo-frontend-lib/components/form/automated/autosave-indicator\"\nimport { wrapWithAutosaveIndicator } from \"~wildo-frontend-lib/components/form/automated/autosave-indicator.utils\"\nimport { AutosaveFieldState } from '~wildo-frontend-lib/components/form/form-field-types'\nimport {\n EditChromeMode,\n type ResponsiveChromeMode,\n ViewportBreakpoint,\n} from \"@wildo-ai/zod-decorators\"\nimport type { ReactNode } from 'react'\n\nexport interface FormFieldChromeProps {\n mode?: ResponsiveChromeMode\n label?: string\n description?: string\n error?: string\n required?: boolean\n labelPlacement?: AutoLabelPlacement\n hideLabel?: boolean\n hideDescription?: boolean\n hideError?: boolean\n saveState?: AutosaveFieldState\n saveErrorMessage?: string\n onRetrySave?: () => void\n fieldName?: string\n disabled?: boolean\n tooltip?: string\n /**\n * The control is intrinsically wide/tall (file drop zone, image preview, …)\n * and cannot fit the SETTINGS_ROW fixed inline-end column (`w-72`). When the\n * EFFECTIVE mode resolves to SETTINGS_ROW, the row keeps its settings-list\n * shell (the `px-card` inset, `py-card-sm` rhythm, hairline divider, hover\n * affordance and `data-chrome-mode=\"settings_row\"` list identity) but stacks\n * the control FULL-WIDTH beneath the label instead of pinning it inline-end —\n * so the field stays a member of the flush, divided settings list rather than\n * dropping out as a misaligned bare STACKED block (the old behavior, which\n * lost the row inset and broke the list's flush stacking). Inert for every\n * other mode (a STACKED/mobile-collapsed field is already full-width).\n */\n wideControl?: boolean\n className?: string\n children: ReactNode\n}\nimport { useIconRegistry } from \"~wildo-frontend-lib/core/icons/useIconRegistry\"\nimport { StandardIconReference, IconSize } from \"~wildo-frontend-lib/core/icons/icon-registry.frontend.schemas\"\nimport { useI18n } from \"~wildo-frontend-lib/core/i18n/useI18n\"\nimport { FrontendComponentType, ButtonSize, type AutoLabelPlacement } from \"@wildo-ai/presets-components-models\"\nimport { useUI } from \"~wildo-frontend-lib/core/ui/useUI\"\nimport { Button, ButtonVariants_Variant } from \"~wildo-frontend-lib/components/actions/button\"\n\n\n// =============================================================================\n// VIEWPORT-AWARE MODE RESOLUTION\n// =============================================================================\n\nfunction resolveEffectiveChromeMode(\n chromeMode: ResponsiveChromeMode | undefined,\n currentBreakpoint: ViewportBreakpoint,\n isMobile: boolean,\n): EditChromeMode {\n if (chromeMode === undefined || chromeMode === null) {\n return EditChromeMode.STACKED;\n }\n\n // Simple string value — typeof narrows to a single EditChromeMode literal.\n //\n // SETTINGS_ROW is NOT collapsed to STACKED on mobile any more: the row lays its control out\n // beneath the label instead (see the SETTINGS_ROW branch). Switching MODE on a breakpoint swapped\n // the chrome's root element (`<div>` ↔ `<Field>`), which remounted the control and discarded its\n // local state — a pending avatar crop vanished when the window crossed 768px (#1191). `isMobile`\n // stays a parameter because the responsive mapping below is still keyed by breakpoint.\n if (typeof chromeMode === \"string\") {\n void isMobile;\n return chromeMode;\n }\n\n // Responsive mapping: { [breakpoint]: mode }\n return (\n chromeMode[currentBreakpoint] ??\n chromeMode[ViewportBreakpoint.DESKTOP] ??\n EditChromeMode.STACKED\n );\n}\n\n// =============================================================================\n// TOOLTIP ICON HELPER\n// =============================================================================\n\nfunction TooltipIcon({ text }: { text: string }): React.JSX.Element | null {\n const { renderIcon } = useIconRegistry();\n const { tComponent, isReady } = useI18n({\n component: FrontendComponentType.LOW_LEVEL_FORM_FIELD,\n });\n if (!isReady) return null;\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n type=\"button\"\n variant={ButtonVariants_Variant.GHOST}\n size={ButtonSize.ICON_SM}\n className=\"ms-1 rounded-full\"\n aria-label={tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD, 'moreInformation')}\n tabIndex={-1}\n >\n {renderIcon(StandardIconReference.INFO, { size: IconSize.XS })}\n </Button>\n </TooltipTrigger>\n <TooltipContent>{text}</TooltipContent>\n </Tooltip>\n );\n}\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\nfunction FormFieldChrome({\n mode,\n label,\n description,\n error,\n required,\n labelPlacement,\n hideLabel,\n hideDescription,\n hideError,\n saveState,\n saveErrorMessage,\n onRetrySave,\n fieldName,\n disabled,\n tooltip,\n wideControl,\n className,\n children,\n}: FormFieldChromeProps): React.JSX.Element {\n const { currentBreakpoint, isMobile } = useUI();\n\n const effectiveMode = useMemo(\n () => resolveEffectiveChromeMode(mode, currentBreakpoint, isMobile),\n [mode, currentBreakpoint, isMobile],\n );\n\n // Deterministic IDs for aria-describedby linkage and label-input association\n const fieldId = fieldName ? `field-${fieldName}` : undefined;\n const descriptionId = fieldName ? `field-${fieldName}-description` : undefined;\n const errorId = fieldName ? `field-${fieldName}-error` : undefined;\n // Lets a control that renders a GROUP of inputs (an address) name the group by this label.\n const labelId = fieldName ? `field-${fieldName}-label` : undefined;\n\n // Determine what to show based on mode + overrides\n const effectiveLabelPlacement = labelPlacement ?? (effectiveMode === EditChromeMode.INLINE ? 'inline' : 'top');\n const showLabel = !hideLabel && !!label && effectiveLabelPlacement !== 'hidden' && effectiveMode !== EditChromeMode.COMPACT && effectiveMode !== EditChromeMode.HIDDEN;\n const showDescription = !hideDescription && !!description && effectiveMode !== EditChromeMode.COMPACT && effectiveMode !== EditChromeMode.HIDDEN;\n const showError = !hideError && !!error && effectiveMode !== EditChromeMode.HIDDEN;\n const hiddenLabel = !hideLabel && !!label && effectiveLabelPlacement === 'hidden'\n ? <FieldLabel id={labelId} htmlFor={fieldId} className=\"sr-only\">{label}</FieldLabel>\n : null;\n\n // Determine autosave indicator variant based on chrome mode\n const autosaveVariant: WrapWithAutosaveIndicatorOptions[\"variant\"] =\n effectiveLabelPlacement === 'start' || effectiveLabelPlacement === 'inline' ? \"inline\" : \"block\";\n\n // Wrap children with autosave indicator\n const wrappedChildren = wrapWithAutosaveIndicator(\n <>{children}</>,\n { saveState, saveErrorMessage, onRetrySave, variant: autosaveVariant },\n );\n\n // ── HIDDEN mode: pass through ──\n if (effectiveMode === EditChromeMode.HIDDEN) {\n return <>{hiddenLabel}{wrappedChildren}</>;\n }\n\n // ── COMPACT mode: control + error only ──\n if (effectiveMode === EditChromeMode.COMPACT) {\n return (\n <div data-slot=\"field-chrome\" data-chrome-mode=\"compact\" data-label-placement={effectiveLabelPlacement} data-field={fieldName} data-testid={fieldName ? `field-${fieldName}` : undefined} data-guidance-field={fieldName} data-disabled={disabled || undefined} className={className}>\n {hiddenLabel}\n {wrappedChildren}\n {showError && <FieldError id={errorId}>{error}</FieldError>}\n </div>\n );\n }\n\n // ── Horizontal label modes ──\n if (effectiveLabelPlacement === 'start' || effectiveLabelPlacement === 'inline') {\n const labelContent = (\n <FieldContent>\n {showLabel && (\n <FieldTitle>\n <FieldLabel id={labelId} htmlFor={fieldId}>\n {label}\n {required && <span className=\"text-destructive ms-0.5\" aria-hidden=\"true\">*</span>}\n {tooltip && <TooltipIcon text={tooltip} />}\n </FieldLabel>\n </FieldTitle>\n )}\n {showDescription && <FieldDescription id={descriptionId}>{description}</FieldDescription>}\n {showError && <FieldError id={errorId}>{error}</FieldError>}\n </FieldContent>\n );\n\n return (\n <Field\n orientation={FieldVariants_Orientation.HORIZONTAL}\n data-slot=\"field-chrome\"\n data-chrome-mode=\"inline\"\n data-label-placement={effectiveLabelPlacement}\n data-field={fieldName}\n data-testid={fieldName ? `field-${fieldName}` : undefined}\n data-guidance-field={fieldName}\n data-invalid={!!error || undefined}\n data-disabled={disabled || undefined}\n className={className}\n >\n {effectiveLabelPlacement === 'start' && labelContent}\n {wrappedChildren}\n {effectiveLabelPlacement === 'inline' && labelContent}\n </Field>\n );\n }\n\n // ── RELAXED mode: generous spacing, heading-size label ──\n if (effectiveMode === EditChromeMode.RELAXED) {\n return (\n <div\n data-slot=\"field-chrome\"\n data-chrome-mode=\"relaxed\"\n data-label-placement={effectiveLabelPlacement}\n data-field={fieldName}\n data-testid={fieldName ? `field-${fieldName}` : undefined}\n data-guidance-field={fieldName}\n data-invalid={!!error || undefined}\n data-disabled={disabled || undefined}\n className={cn(\"flex flex-col gap-field\", className)}\n >\n {hiddenLabel}\n {showLabel && (\n <label\n htmlFor={fieldId}\n className={cn(\n \"text-lg font-semibold leading-snug\",\n disabled && \"opacity-[var(--opacity-disabled)]\",\n )}\n >\n {label}\n {required && <span className=\"text-destructive ms-1\" aria-hidden=\"true\">*</span>}\n {tooltip && <TooltipIcon text={tooltip} />}\n </label>\n )}\n {showDescription && (\n <p id={descriptionId} className=\"text-base text-muted-foreground leading-normal -mt-1\">\n {description}\n </p>\n )}\n <div className=\"py-1\">\n {wrappedChildren}\n </div>\n {showError && (\n <div id={errorId} role=\"alert\" className=\"text-base text-destructive font-normal\">\n {error}\n </div>\n )}\n </div>\n );\n }\n\n // ── SETTINGS_ROW mode: a self-contained settings list-item ──\n // Label/description inline-start, control/error inline-end. The row owns ALL\n // of its own structure so a stack of settings rows forms a clean, uniform,\n // divided list in ANY host — the generated flat template (`FormLayout` /\n // `DisplayLayout` render fields in a bare `<div>` with NO inter-field gap), an\n // authored `CARD` section, etc. — for both edit and display:\n // - `py-card-sm` gives every row the same compact vertical rhythm regardless\n // of its content height (fixes the \"rows collide\" symptom on generated\n // templates, which previously relied on a non-existent container gap).\n // - `border-b … last:border-b-0` is the hairline row divider — the signature\n // of the settings-list pattern (Cursor / Claude). `last:` suppresses the\n // trailing divider when the row is the final child (display lists); under a\n // form the trailing divider sits above the host-owned submit row, which is\n // the desired \"list ↔ actions\" separation.\n // - the control is a FIXED-width, inline-end-pinned column (replaces the old\n // ragged inline `min/max-width` box that made every control a different\n // width). `items-end` right-pins intrinsic controls (switch / checkbox /\n // button); `w-full` controls (input / select / textarea) fill the column,\n // so every control shares one inline-end edge.\n // `items-start` top-aligns the control with the label's first line (the title),\n // letting the description flow beneath on the inline-start side.\n if (effectiveMode === EditChromeMode.SETTINGS_ROW) {\n // STACKED layout: same settings-list row shell + identity, but the control\n // spans the row's full width beneath the label instead of the fixed\n // inline-end column. Two causes: an intrinsically wide control (`wideControl`,\n // e.g. a file drop zone) and a MOBILE viewport, where the row has no\n // horizontal room. `data-chrome-mode=\"settings_row\"` stays, so every\n // list-level rule (flush stacking at the layout roots, CARD-body\n // `gap-0`/full-bleed/re-inset) still treats it as a settings row;\n // `data-settings-row-layout` names the layout for diagnostics/tests.\n //\n // ONE element structure for both layouts, on purpose: root > [label column,\n // control column]. Only classes change between them, so a breakpoint crossing\n // re-lays the row out without remounting the control. Returning a different\n // tree per layout (or collapsing to the STACKED mode's `<Field>`) is what\n // discarded a pending avatar crop on resize (#1191).\n const stacksControl = !!wideControl || isMobile;\n return (\n <div\n data-slot=\"field-chrome\"\n data-chrome-mode=\"settings_row\"\n data-settings-row-layout={wideControl ? \"wide\" : isMobile ? \"stacked\" : undefined}\n data-label-placement={effectiveLabelPlacement}\n data-field={fieldName}\n data-testid={fieldName ? `field-${fieldName}` : undefined}\n data-guidance-field={fieldName}\n data-invalid={!!error || undefined}\n data-disabled={disabled || undefined}\n className={cn(\n // Row rhythm (T4): compact min-height + a subtle hover affordance,\n // matching the read-mode DisplayFieldChrome SETTINGS_ROW twin so a\n // view→edit drill keeps identical geometry. Vertical alignment is\n // CONTENT-AWARE: single-line rows CENTER (no dead space below the label);\n // rows with a description top-align so the control lines up with the\n // label's first line and the description flows beneath. A row hosting a\n // MULTI-LINE control (`textarea` — e.g. a bio field) also top-aligns:\n // centering a one-line label against a tall input strands the label\n // mid-row; the label must sit level with the control's first text line.\n // Extend the `has-[…]:items-start` list when another intrinsically tall\n // control family joins settings rows. The row OWNS its\n // inline padding (`px-card`) so its `border-b` runs full-bleed to the\n // padding-less CARD body edge (and gives consistent inset in a flat\n // host); block padding stays tight (`py-card-sm`).\n \"flex min-h-10 px-card py-card-sm border-b border-border last:border-b-0 hover:bg-muted/50 transition-colors\",\n stacksControl\n ? \"flex-col gap-element-xs\"\n : cn(\"flex-row gap-section\", showDescription ? \"items-start\" : \"items-center has-[textarea]:items-start\"),\n className,\n )}\n >\n {/* Inline-start side (above the control when stacked): label + description */}\n <div className={cn(\"flex min-w-0 flex-col gap-element-xs\", !stacksControl && \"flex-1\")}>\n {hiddenLabel}\n {showLabel && (\n <label\n htmlFor={fieldId}\n className={cn(\n \"text-sm font-medium leading-snug\",\n disabled && \"opacity-[var(--opacity-disabled)]\",\n )}\n >\n {label}\n {required && <span className=\"text-destructive ms-0.5\" aria-hidden=\"true\">*</span>}\n {tooltip && <TooltipIcon text={tooltip} />}\n </label>\n )}\n {showDescription && (\n <FieldDescription id={descriptionId}>{description}</FieldDescription>\n )}\n </div>\n\n {/* Inline-end side: right-pinned control + error column. `w-72` is the\n SHARED TARGET width (one inline-end edge across rows), but the column\n must stay shrinkable (`shrink` + `min-w-0`, NOT `shrink-0`): inside a\n padded CARD fieldset the row's available inline size can drop below\n label + gap + 18rem, and a non-shrinkable column overflows the\n fieldset and CLIPS against its border (the \"label cut at the card\n edge\" defect). With shrink enabled the row can never outgrow its\n container — the label and control columns compress instead. When\n stacked, the column spans the row instead. */}\n <div\n className={cn(\n \"flex min-w-0 flex-col gap-element-xs\",\n stacksControl ? \"w-full\" : \"w-72 max-w-[55%] shrink items-end\",\n )}\n >\n {wrappedChildren}\n {showError && <FieldError id={errorId}>{error}</FieldError>}\n </div>\n </div>\n );\n }\n\n // ── STACKED mode (default): label above, control, description + error below ──\n return (\n <Field\n orientation={FieldVariants_Orientation.VERTICAL}\n data-slot=\"field-chrome\"\n data-chrome-mode=\"stacked\"\n data-label-placement={effectiveLabelPlacement}\n data-field={fieldName}\n data-testid={fieldName ? `field-${fieldName}` : undefined}\n data-guidance-field={fieldName}\n data-invalid={!!error || undefined}\n data-disabled={disabled || undefined}\n className={className}\n >\n {hiddenLabel}\n {showLabel && (\n <FieldLabel id={labelId} htmlFor={fieldId}>\n {label}\n {required && <span className=\"text-destructive ms-0.5\" aria-hidden=\"true\">*</span>}\n {tooltip && <TooltipIcon text={tooltip} />}\n </FieldLabel>\n )}\n {wrappedChildren}\n {showDescription && <FieldDescription id={descriptionId}>{description}</FieldDescription>}\n {showError && <FieldError id={errorId}>{error}</FieldError>}\n </Field>\n );\n}\n\n;(FormFieldChrome as typeof FormFieldChrome & { displayName: string }).displayName = \"FormFieldChrome\"\n\nexport { FormFieldChrome, resolveEffectiveChromeMode }\n"]}
|
|
1
|
+
{"version":3,"file":"FormFieldChrome.js","sourceRoot":"","sources":["../../../../../../src/components/form/chromes/FormFieldChrome.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\"\n\n/**\n * FormFieldChrome — centralized chrome (label, description, error, required indicator)\n * wrapper for form fields.\n *\n * Mirrors the display system pattern: FormField dispatches to a preset,\n * the preset returns bare interactive content, and FormFieldChrome wraps it\n * with the appropriate chrome layout.\n *\n * Chrome mode is resolved via a two-phase cascade:\n * Phase 1 (FormField): field decorator → section default → form default → surface policy → STACKED\n * Phase 2 (here): responsive viewport resolution via useUI()\n *\n * ## data-field safety net\n *\n * Every visible chrome mode renders `data-field={fieldName}` on its outer\n * wrapper element. This guarantees that `scrollToFirstError` (which queries\n * `[data-field=\"...\"]`) can always locate the DOM node for a field,\n * regardless of whether the inner control also emits the attribute.\n * Individual controls may still set `data-field` on their own root — that's\n * fine; the chrome's attribute serves as an outer fallback.\n */\n\nimport * as React from \"react\"\nimport { useMemo } from \"react\"\n\nimport { cn } from \"~wildo-frontend-lib/core/ui/cn\"\nimport {\n Field,\n FieldLabel,\n FieldDescription,\n FieldError,\n FieldContent,\n FieldTitle,\n FieldVariants_Orientation,\n} from \"~wildo-frontend-lib/components/form/chromes/field\"\nimport { Tooltip, TooltipTrigger, TooltipContent } from \"~wildo-frontend-lib/components/overlays/floating/tooltip\"\nimport { type WrapWithAutosaveIndicatorOptions } from \"~wildo-frontend-lib/components/form/automated/autosave-indicator\"\nimport { wrapWithAutosaveIndicator } from \"~wildo-frontend-lib/components/form/automated/autosave-indicator.utils\"\nimport { AutosaveFieldState } from '~wildo-frontend-lib/components/form/form-field-types'\nimport {\n EditChromeMode,\n type ResponsiveChromeMode,\n ViewportBreakpoint,\n} from \"@wildo-ai/zod-decorators\"\nimport type { ReactNode } from 'react'\n\nexport interface FormFieldChromeProps {\n mode?: ResponsiveChromeMode\n label?: string\n description?: string\n error?: string\n required?: boolean\n labelPlacement?: AutoLabelPlacement\n hideLabel?: boolean\n hideDescription?: boolean\n hideError?: boolean\n saveState?: AutosaveFieldState\n saveErrorMessage?: string\n onRetrySave?: () => void\n fieldName?: string\n disabled?: boolean\n tooltip?: string\n /**\n * The control is intrinsically wide/tall (file drop zone, image preview, …)\n * and cannot fit the SETTINGS_ROW fixed inline-end column (`w-72`). When the\n * EFFECTIVE mode resolves to SETTINGS_ROW, the row keeps its settings-list\n * shell (the `px-card` inset, `py-card-sm` rhythm, hairline divider, hover\n * affordance and `data-chrome-mode=\"settings_row\"` list identity) but stacks\n * the control FULL-WIDTH beneath the label instead of pinning it inline-end —\n * so the field stays a member of the flush, divided settings list rather than\n * dropping out as a misaligned bare STACKED block (the old behavior, which\n * lost the row inset and broke the list's flush stacking). Inert for every\n * other mode (a STACKED/mobile-collapsed field is already full-width).\n */\n wideControl?: boolean\n className?: string\n children: ReactNode\n}\nimport { useIconRegistry } from \"~wildo-frontend-lib/core/icons/useIconRegistry\"\nimport { StandardIconReference, IconSize } from \"~wildo-frontend-lib/core/icons/icon-registry.frontend.schemas\"\nimport { useI18n } from \"~wildo-frontend-lib/core/i18n/useI18n\"\nimport { FrontendComponentType, ButtonSize, type AutoLabelPlacement } from \"@wildo-ai/presets-components-models\"\nimport { useUI } from \"~wildo-frontend-lib/core/ui/useUI\"\nimport { Button, ButtonVariants_Variant } from \"~wildo-frontend-lib/components/actions/button\"\n\n\n// =============================================================================\n// VIEWPORT-AWARE MODE RESOLUTION\n// =============================================================================\n\nfunction resolveEffectiveChromeMode(\n chromeMode: ResponsiveChromeMode | undefined,\n currentBreakpoint: ViewportBreakpoint,\n isMobile: boolean,\n): EditChromeMode {\n if (chromeMode === undefined || chromeMode === null) {\n return EditChromeMode.STACKED;\n }\n\n // Simple string value — typeof narrows to a single EditChromeMode literal.\n //\n // SETTINGS_ROW is NOT collapsed to STACKED on mobile any more: the row lays its control out\n // beneath the label instead (see the SETTINGS_ROW branch). Switching MODE on a breakpoint swapped\n // the chrome's root element (`<div>` ↔ `<Field>`), which remounted the control and discarded its\n // local state — a pending avatar crop vanished when the window crossed 768px (#1191). `isMobile`\n // stays a parameter because the responsive mapping below is still keyed by breakpoint.\n if (typeof chromeMode === \"string\") {\n void isMobile;\n return chromeMode;\n }\n\n // Responsive mapping: { [breakpoint]: mode }\n return (\n chromeMode[currentBreakpoint] ??\n chromeMode[ViewportBreakpoint.DESKTOP] ??\n EditChromeMode.STACKED\n );\n}\n\n// =============================================================================\n// TOOLTIP ICON HELPER\n// =============================================================================\n\nfunction TooltipIcon({ text }: { text: string }): React.JSX.Element | null {\n const { renderIcon } = useIconRegistry();\n const { tComponent, isReady } = useI18n({\n component: FrontendComponentType.LOW_LEVEL_FORM_FIELD,\n });\n if (!isReady) return null;\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n type=\"button\"\n variant={ButtonVariants_Variant.GHOST}\n size={ButtonSize.ICON_SM}\n className=\"ms-1 rounded-full\"\n aria-label={tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD, 'moreInformation')}\n tabIndex={-1}\n >\n {renderIcon(StandardIconReference.INFO, { size: IconSize.XS })}\n </Button>\n </TooltipTrigger>\n <TooltipContent>{text}</TooltipContent>\n </Tooltip>\n );\n}\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\nfunction FormFieldChrome({\n mode,\n label,\n description,\n error,\n required,\n labelPlacement,\n hideLabel,\n hideDescription,\n hideError,\n saveState,\n saveErrorMessage,\n onRetrySave,\n fieldName,\n disabled,\n tooltip,\n wideControl,\n className,\n children,\n}: FormFieldChromeProps): React.JSX.Element {\n const { currentBreakpoint, isMobile } = useUI();\n\n const effectiveMode = useMemo(\n () => resolveEffectiveChromeMode(mode, currentBreakpoint, isMobile),\n [mode, currentBreakpoint, isMobile],\n );\n\n // Deterministic IDs for aria-describedby linkage and label-input association\n const fieldId = fieldName ? `field-${fieldName}` : undefined;\n const descriptionId = fieldName ? `field-${fieldName}-description` : undefined;\n const errorId = fieldName ? `field-${fieldName}-error` : undefined;\n // Lets a control that renders a GROUP of inputs (an address) name the group by this label.\n const labelId = fieldName ? `field-${fieldName}-label` : undefined;\n\n // Determine what to show based on mode + overrides\n const effectiveLabelPlacement = labelPlacement ?? (effectiveMode === EditChromeMode.INLINE ? 'inline' : 'top');\n const showLabel = !hideLabel && !!label && effectiveLabelPlacement !== 'hidden' && effectiveMode !== EditChromeMode.COMPACT && effectiveMode !== EditChromeMode.HIDDEN;\n const showDescription = !hideDescription && !!description && effectiveMode !== EditChromeMode.COMPACT && effectiveMode !== EditChromeMode.HIDDEN;\n const showError = !hideError && !!error && effectiveMode !== EditChromeMode.HIDDEN;\n const hiddenLabel = !hideLabel && !!label && effectiveLabelPlacement === 'hidden'\n ? <FieldLabel id={labelId} htmlFor={fieldId} className=\"sr-only\">{label}</FieldLabel>\n : null;\n\n // Determine autosave indicator variant based on chrome mode\n const autosaveVariant: WrapWithAutosaveIndicatorOptions[\"variant\"] =\n effectiveLabelPlacement === 'start' || effectiveLabelPlacement === 'inline' ? \"inline\" : \"block\";\n\n // Wrap children with autosave indicator\n const wrappedChildren = wrapWithAutosaveIndicator(\n <>{children}</>,\n { saveState, saveErrorMessage, onRetrySave, variant: autosaveVariant },\n );\n\n // ── HIDDEN mode: pass through ──\n if (effectiveMode === EditChromeMode.HIDDEN) {\n return <>{hiddenLabel}{wrappedChildren}</>;\n }\n\n // ── COMPACT mode: control + error only ──\n if (effectiveMode === EditChromeMode.COMPACT) {\n return (\n <div data-slot=\"field-chrome\" data-chrome-mode=\"compact\" data-label-placement={effectiveLabelPlacement} data-field={fieldName} data-testid={fieldName ? `field-${fieldName}` : undefined} data-guidance-field={fieldName} data-disabled={disabled || undefined} className={className}>\n {hiddenLabel}\n {wrappedChildren}\n {showError && <FieldError id={errorId}>{error}</FieldError>}\n </div>\n );\n }\n\n // ── Horizontal label modes ──\n if (effectiveLabelPlacement === 'start' || effectiveLabelPlacement === 'inline') {\n const labelContent = (\n <FieldContent>\n {showLabel && (\n <FieldTitle>\n <FieldLabel id={labelId} htmlFor={fieldId}>\n {label}\n {required && <span className=\"text-destructive ms-0.5\" aria-hidden=\"true\">*</span>}\n {tooltip && <TooltipIcon text={tooltip} />}\n </FieldLabel>\n </FieldTitle>\n )}\n {showDescription && <FieldDescription id={descriptionId}>{description}</FieldDescription>}\n {showError && <FieldError id={errorId}>{error}</FieldError>}\n </FieldContent>\n );\n\n return (\n <Field\n orientation={FieldVariants_Orientation.HORIZONTAL}\n data-slot=\"field-chrome\"\n data-chrome-mode=\"inline\"\n data-label-placement={effectiveLabelPlacement}\n data-field={fieldName}\n data-testid={fieldName ? `field-${fieldName}` : undefined}\n data-guidance-field={fieldName}\n data-invalid={!!error || undefined}\n data-disabled={disabled || undefined}\n className={className}\n >\n {effectiveLabelPlacement === 'start' && labelContent}\n {wrappedChildren}\n {effectiveLabelPlacement === 'inline' && labelContent}\n </Field>\n );\n }\n\n // ── RELAXED mode: generous spacing, heading-size label ──\n if (effectiveMode === EditChromeMode.RELAXED) {\n return (\n <div\n data-slot=\"field-chrome\"\n data-chrome-mode=\"relaxed\"\n data-label-placement={effectiveLabelPlacement}\n data-field={fieldName}\n data-testid={fieldName ? `field-${fieldName}` : undefined}\n data-guidance-field={fieldName}\n data-invalid={!!error || undefined}\n data-disabled={disabled || undefined}\n className={cn(\"flex flex-col gap-field\", className)}\n >\n {hiddenLabel}\n {showLabel && (\n <label\n id={labelId}\n htmlFor={fieldId}\n className={cn(\n \"text-lg font-semibold leading-snug\",\n disabled && \"opacity-[var(--opacity-disabled)]\",\n )}\n >\n {label}\n {required && <span className=\"text-destructive ms-1\" aria-hidden=\"true\">*</span>}\n {tooltip && <TooltipIcon text={tooltip} />}\n </label>\n )}\n {showDescription && (\n <p id={descriptionId} className=\"text-base text-muted-foreground leading-normal -mt-1\">\n {description}\n </p>\n )}\n <div className=\"py-1\">\n {wrappedChildren}\n </div>\n {showError && (\n <div id={errorId} role=\"alert\" className=\"text-base text-destructive font-normal\">\n {error}\n </div>\n )}\n </div>\n );\n }\n\n // ── SETTINGS_ROW mode: a self-contained settings list-item ──\n // Label/description inline-start, control/error inline-end. The row owns ALL\n // of its own structure so a stack of settings rows forms a clean, uniform,\n // divided list in ANY host — the generated flat template (`FormLayout` /\n // `DisplayLayout` render fields in a bare `<div>` with NO inter-field gap), an\n // authored `CARD` section, etc. — for both edit and display:\n // - `py-card-sm` gives every row the same compact vertical rhythm regardless\n // of its content height (fixes the \"rows collide\" symptom on generated\n // templates, which previously relied on a non-existent container gap).\n // - `border-b … last:border-b-0` is the hairline row divider — the signature\n // of the settings-list pattern (Cursor / Claude). `last:` suppresses the\n // trailing divider when the row is the final child (display lists); under a\n // form the trailing divider sits above the host-owned submit row, which is\n // the desired \"list ↔ actions\" separation.\n // - the control is a FIXED-width, inline-end-pinned column (replaces the old\n // ragged inline `min/max-width` box that made every control a different\n // width). `items-end` right-pins intrinsic controls (switch / checkbox /\n // button); `w-full` controls (input / select / textarea) fill the column,\n // so every control shares one inline-end edge.\n // `items-start` top-aligns the control with the label's first line (the title),\n // letting the description flow beneath on the inline-start side.\n if (effectiveMode === EditChromeMode.SETTINGS_ROW) {\n // STACKED layout: same settings-list row shell + identity, but the control\n // spans the row's full width beneath the label instead of the fixed\n // inline-end column. Two causes: an intrinsically wide control (`wideControl`,\n // e.g. a file drop zone) and a MOBILE viewport, where the row has no\n // horizontal room. `data-chrome-mode=\"settings_row\"` stays, so every\n // list-level rule (flush stacking at the layout roots, CARD-body\n // `gap-0`/full-bleed/re-inset) still treats it as a settings row;\n // `data-settings-row-layout` names the layout for diagnostics/tests.\n //\n // ONE element structure for both layouts, on purpose: root > [label column,\n // control column]. Only classes change between them, so a breakpoint crossing\n // re-lays the row out without remounting the control. Returning a different\n // tree per layout (or collapsing to the STACKED mode's `<Field>`) is what\n // discarded a pending avatar crop on resize (#1191).\n const stacksControl = !!wideControl || isMobile;\n return (\n <div\n data-slot=\"field-chrome\"\n data-chrome-mode=\"settings_row\"\n data-settings-row-layout={wideControl ? \"wide\" : isMobile ? \"stacked\" : undefined}\n data-label-placement={effectiveLabelPlacement}\n data-field={fieldName}\n data-testid={fieldName ? `field-${fieldName}` : undefined}\n data-guidance-field={fieldName}\n data-invalid={!!error || undefined}\n data-disabled={disabled || undefined}\n className={cn(\n // Row rhythm (T4): compact min-height + a subtle hover affordance,\n // matching the read-mode DisplayFieldChrome SETTINGS_ROW twin so a\n // view→edit drill keeps identical geometry. Vertical alignment is\n // CONTENT-AWARE: single-line rows CENTER (no dead space below the label);\n // rows with a description top-align so the control lines up with the\n // label's first line and the description flows beneath. A row hosting a\n // MULTI-LINE control (`textarea` — e.g. a bio field) also top-aligns:\n // centering a one-line label against a tall input strands the label\n // mid-row; the label must sit level with the control's first text line.\n // Extend the `has-[…]:items-start` list when another intrinsically tall\n // control family joins settings rows. The row OWNS its\n // inline padding (`px-card`) so its `border-b` runs full-bleed to the\n // padding-less CARD body edge (and gives consistent inset in a flat\n // host); block padding stays tight (`py-card-sm`).\n \"flex min-h-10 px-card py-card-sm border-b border-border last:border-b-0 hover:bg-muted/50 transition-colors\",\n stacksControl\n ? \"flex-col gap-element-xs\"\n : cn(\"flex-row gap-section\", showDescription ? \"items-start\" : \"items-center has-[textarea]:items-start\"),\n className,\n )}\n >\n {/* Inline-start side (above the control when stacked): label + description */}\n <div className={cn(\"flex min-w-0 flex-col gap-element-xs\", !stacksControl && \"flex-1\")}>\n {hiddenLabel}\n {showLabel && (\n <label\n id={labelId}\n htmlFor={fieldId}\n className={cn(\n \"text-sm font-medium leading-snug\",\n disabled && \"opacity-[var(--opacity-disabled)]\",\n )}\n >\n {label}\n {required && <span className=\"text-destructive ms-0.5\" aria-hidden=\"true\">*</span>}\n {tooltip && <TooltipIcon text={tooltip} />}\n </label>\n )}\n {showDescription && (\n <FieldDescription id={descriptionId}>{description}</FieldDescription>\n )}\n </div>\n\n {/* Inline-end side: right-pinned control + error column. `w-72` is the\n SHARED TARGET width (one inline-end edge across rows), but the column\n must stay shrinkable (`shrink` + `min-w-0`, NOT `shrink-0`): inside a\n padded CARD fieldset the row's available inline size can drop below\n label + gap + 18rem, and a non-shrinkable column overflows the\n fieldset and CLIPS against its border (the \"label cut at the card\n edge\" defect). With shrink enabled the row can never outgrow its\n container — the label and control columns compress instead. When\n stacked, the column spans the row instead. */}\n <div\n className={cn(\n \"flex min-w-0 flex-col gap-element-xs\",\n stacksControl ? \"w-full\" : \"w-72 max-w-[55%] shrink items-end\",\n )}\n >\n {wrappedChildren}\n {showError && <FieldError id={errorId}>{error}</FieldError>}\n </div>\n </div>\n );\n }\n\n // ── STACKED mode (default): label above, control, description + error below ──\n return (\n <Field\n orientation={FieldVariants_Orientation.VERTICAL}\n data-slot=\"field-chrome\"\n data-chrome-mode=\"stacked\"\n data-label-placement={effectiveLabelPlacement}\n data-field={fieldName}\n data-testid={fieldName ? `field-${fieldName}` : undefined}\n data-guidance-field={fieldName}\n data-invalid={!!error || undefined}\n data-disabled={disabled || undefined}\n className={className}\n >\n {hiddenLabel}\n {showLabel && (\n <FieldLabel id={labelId} htmlFor={fieldId}>\n {label}\n {required && <span className=\"text-destructive ms-0.5\" aria-hidden=\"true\">*</span>}\n {tooltip && <TooltipIcon text={tooltip} />}\n </FieldLabel>\n )}\n {wrappedChildren}\n {showDescription && <FieldDescription id={descriptionId}>{description}</FieldDescription>}\n {showError && <FieldError id={errorId}>{error}</FieldError>}\n </Field>\n );\n}\n\n;(FormFieldChrome as typeof FormFieldChrome & { displayName: string }).displayName = \"FormFieldChrome\"\n\nexport { FormFieldChrome, resolveEffectiveChromeMode }\n"]}
|
|
@@ -45,6 +45,13 @@ export interface ComboboxProps<T extends string = string, TData = unknown> exten
|
|
|
45
45
|
shouldFilter?: boolean;
|
|
46
46
|
/** Called when the dropdown open state changes. Needed for async patterns (e.g., useResourceSearch). */
|
|
47
47
|
onOpenChange?: (open: boolean) => void;
|
|
48
|
+
/**
|
|
49
|
+
* Content rendered INSIDE the open list's popup, below the options — the same visual container as the
|
|
50
|
+
* results. For a line that must accompany the results themselves: a data source's required attribution
|
|
51
|
+
* (Google requires its "Google Maps" text "within the same visual container" as its results, #561).
|
|
52
|
+
* Not an option: it is not focusable through the list and is never selected.
|
|
53
|
+
*/
|
|
54
|
+
listFooter?: React.ReactNode;
|
|
48
55
|
surfacePolicyOverride?: DeepPartialSurfacePolicy;
|
|
49
56
|
}
|
|
50
57
|
export type ComboboxRef = HTMLButtonElement;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"combobox.d.ts","sourceRoot":"","sources":["../../../../../src/components/form/combobox.tsx"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"combobox.d.ts","sourceRoot":"","sources":["../../../../../src/components/form/combobox.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAqB,MAAM,OAAO,CAAA;AAEzC,OAAO,EAA0C,KAAK,wBAAwB,EAAE,MAAM,qCAAqC,CAAA;AAC3H,OAAO,EAAE,oBAAoB,EAAE,MAAM,kFAAkF,CAAA;AACvH,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,sDAAsD,CAAA;AAIzG,MAAM,WAAW,aAAa,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,KAAK,GAAG,OAAO,CACvE,SAAQ,IAAI,CAAC,gBAAgB,EAAE,OAAO,GAAG,UAAU,GAAG,cAAc,CAAC;IACrE,OAAO,EAAE,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,CAAA;IAChC,KAAK,CAAC,EAAE,CAAC,CAAA;IACT,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAA;IAC7B,YAAY,CAAC,EAAE,CAAC,CAAA;IAChB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC9B,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAA;IAClB,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,UAAU,EAAE,OAAO,KAAK,KAAK,CAAC,SAAS,CAAA;IACtF,mBAAmB,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,KAAK,CAAC,SAAS,CAAA;IACxE;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IAEpB;;;;;;;;OAQG;IACH,gBAAgB,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAElC,6EAA6E;IAC7E,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IACzC,qEAAqE;IACrE,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,iGAAiG;IACjG,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,wGAAwG;IACxG,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;IACtC;;;;;OAKG;IACH,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC5B,qBAAqB,CAAC,EAAE,wBAAwB,CAAA;CACjD;AAED,MAAM,MAAM,WAAW,GAAG,iBAAiB,CAAA;AAI3C,MAAM,WAAW,qBAAqB,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,KAAK,GAAG,OAAO,CAC/E,SAAQ,IAAI,CAAC,gBAAgB,EAAE,OAAO,GAAG,UAAU,GAAG,cAAc,CAAC;IACrE,OAAO,EAAE,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,CAAA;IAChC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAA;IACX,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,IAAI,CAAA;IAC/B,YAAY,CAAC,EAAE,CAAC,EAAE,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC9B,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAA;IAClB,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,UAAU,EAAE,OAAO,KAAK,KAAK,CAAC,SAAS,CAAA;IACtF,mBAAmB,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,KAAK,CAAC,SAAS,CAAA;IAExE,6EAA6E;IAC7E,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IACzC,qEAAqE;IACrE,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,iGAAiG;IACjG,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,wGAAwG;IACxG,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;IACtC,qBAAqB,CAAC,EAAE,wBAAwB,CAAA;CACjD;AAED,MAAM,MAAM,mBAAmB,GAAG,iBAAiB,CAAA;AAInD,eAAO,MAAM,QAAQ,iIAOpB,CAAA;AAGD,eAAO,MAAM,gBAAgB,yIAO5B,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"combobox.js","sourceRoot":"","sources":["../../../../../src/components/form/combobox.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,UAAU,EAAE,MAAM,OAAO,CAAA;AACzC,OAAO,EAAE,uBAAuB,EAAE,MAAM,iFAAiF,CAAA;AACzH,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAiC,MAAM,qCAAqC,CAAA;
|
|
1
|
+
{"version":3,"file":"combobox.js","sourceRoot":"","sources":["../../../../../src/components/form/combobox.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,UAAU,EAAE,MAAM,OAAO,CAAA;AACzC,OAAO,EAAE,uBAAuB,EAAE,MAAM,iFAAiF,CAAA;AACzH,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAiC,MAAM,qCAAqC,CAAA;AA8F3H,mBAAmB;AAEnB,MAAM,CAAC,MAAM,QAAQ,GAAG,UAAU,CAChC,CAAC,EAAE,MAAM,GAAG,eAAe,CAAC,OAAO,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE;IACtD,MAAM,SAAS,GAAG,uBAAuB,CACvC,qBAAqB,CAAC,kBAAkB,EAAE,UAAU,CACrD,CAAC,MAAM,CAAC,CAAA;IACT,OAAO,KAAC,SAAS,OAAK,KAAK,EAAE,GAAG,EAAE,GAAG,GAAI,CAAA;AAC3C,CAAC,CACF,CAAA;AACD,QAAQ,CAAC,WAAW,GAAG,UAAU,CAAA;AAEjC,MAAM,CAAC,MAAM,gBAAgB,GAAG,UAAU,CACxC,CAAC,EAAE,MAAM,GAAG,eAAe,CAAC,OAAO,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE;IACtD,MAAM,SAAS,GAAG,uBAAuB,CACvC,qBAAqB,CAAC,2BAA2B,EAAE,kBAAkB,CACtE,CAAC,MAAM,CAAC,CAAA;IACT,OAAO,KAAC,SAAS,OAAK,KAAK,EAAE,GAAG,EAAE,GAAG,GAAI,CAAA;AAC3C,CAAC,CACF,CAAA;AACD,gBAAgB,CAAC,WAAW,GAAG,kBAAkB,CAAA","sourcesContent":["import React, { forwardRef } from 'react'\nimport { createComponentResolver } from '~wildo-frontend-lib/core/components-registry/component-resolver.frontend.helper'\nimport { FrontendComponentType, CorePresetNames, type DeepPartialSurfacePolicy } from '@wildo-ai/presets-components-models'\nimport { ComponentPresetProps } from '~wildo-frontend-lib/core/components-registry/component-registry.frontend.schemas'\nimport type { ControlBaseProps, FieldOption } from '~wildo-frontend-lib/components/form/form-field-types'\n\n// --- Contract: Combobox (single-select, searchable) ---\n\nexport interface ComboboxProps<T extends string = string, TData = unknown>\n extends Omit<ControlBaseProps, 'value' | 'onChange' | 'defaultValue'> {\n options: FieldOption<T, TData>[]\n value?: T\n onChange?: (value: T) => void\n defaultValue?: T\n placeholder?: string\n searchPlaceholder?: string\n emptyMessage?: React.ReactNode\n size?: 'sm' | 'md'\n renderOption?: (option: FieldOption<T, TData>, isSelected: boolean) => React.ReactNode\n renderSelectedValue?: (option: FieldOption<T, TData>) => React.ReactNode\n /**\n * Makes the control CLEARABLE: when a value is selected the trigger grows a\n * small clear affordance at its trailing edge, INSIDE the control, before the\n * chevron — the standard clearable-picker shape.\n *\n * Inside rather than beside, deliberately: a clear button rendered NEXT TO the\n * control reads as another item in whatever row hosts it (in a menubar cluster\n * it looked like a fourth chrome icon alongside search/bell/avatar) and says\n * nothing about WHICH control it clears. Attached to the trigger, its target is\n * unambiguous.\n *\n * Omit for controls whose empty state is not a user-selectable state.\n */\n onClear?: () => void\n\n /**\n * Content rendered INSIDE the trigger, before the selected value — the\n * leading counterpart to {@link onClear}'s trailing affordance. Used to give a\n * control a visual identity (the scoped resource's icon on an app-scope\n * switcher) without spending a text label's width.\n *\n * Presentational only: it is `aria-hidden` at the render site, because the\n * control's accessible name comes from its label, not from this.\n */\n leadingAdornment?: React.ReactNode\n\n /** Called when the search input changes. For async/server-side filtering. */\n onSearchChange?: (search: string) => void\n /** Whether the combobox is loading options (shows loading state). */\n isLoading?: boolean\n /** When false, disables client-side filtering (use for server-side search). Defaults to true. */\n shouldFilter?: boolean\n /** Called when the dropdown open state changes. Needed for async patterns (e.g., useResourceSearch). */\n onOpenChange?: (open: boolean) => void\n /**\n * Content rendered INSIDE the open list's popup, below the options — the same visual container as the\n * results. For a line that must accompany the results themselves: a data source's required attribution\n * (Google requires its \"Google Maps\" text \"within the same visual container\" as its results, #561).\n * Not an option: it is not focusable through the list and is never selected.\n */\n listFooter?: React.ReactNode\n surfacePolicyOverride?: DeepPartialSurfacePolicy\n}\n\nexport type ComboboxRef = HTMLButtonElement\n\n// --- Contract: ComboboxMultiple (multi-select, searchable) ---\n\nexport interface ComboboxMultipleProps<T extends string = string, TData = unknown>\n extends Omit<ControlBaseProps, 'value' | 'onChange' | 'defaultValue'> {\n options: FieldOption<T, TData>[]\n value?: T[]\n onChange?: (value: T[]) => void\n defaultValue?: T[]\n placeholder?: string\n searchPlaceholder?: string\n emptyMessage?: React.ReactNode\n size?: 'sm' | 'md'\n maxDisplayedBadges?: number\n showSelectAll?: boolean\n renderOption?: (option: FieldOption<T, TData>, isSelected: boolean) => React.ReactNode\n renderSelectedValue?: (option: FieldOption<T, TData>) => React.ReactNode\n\n /** Called when the search input changes. For async/server-side filtering. */\n onSearchChange?: (search: string) => void\n /** Whether the combobox is loading options (shows loading state). */\n isLoading?: boolean\n /** When false, disables client-side filtering (use for server-side search). Defaults to true. */\n shouldFilter?: boolean\n /** Called when the dropdown open state changes. Needed for async patterns (e.g., useResourceSearch). */\n onOpenChange?: (open: boolean) => void\n surfacePolicyOverride?: DeepPartialSurfacePolicy\n}\n\nexport type ComboboxMultipleRef = HTMLButtonElement\n\n// --- Wrappers ---\n\nexport const Combobox = forwardRef<ComboboxRef, ComboboxProps & ComponentPresetProps>(\n ({ preset = CorePresetNames.DEFAULT, ...props }, ref) => {\n const Component = createComponentResolver<ComboboxProps & React.RefAttributes<ComboboxRef>>(\n FrontendComponentType.LOW_LEVEL_COMBOBOX, 'Combobox'\n )(preset)\n return <Component {...props} ref={ref} />\n }\n)\nCombobox.displayName = 'Combobox'\n\nexport const ComboboxMultiple = forwardRef<ComboboxMultipleRef, ComboboxMultipleProps & ComponentPresetProps>(\n ({ preset = CorePresetNames.DEFAULT, ...props }, ref) => {\n const Component = createComponentResolver<ComboboxMultipleProps & React.RefAttributes<ComboboxMultipleRef>>(\n FrontendComponentType.LOW_LEVEL_COMBOBOX_MULTIPLE, 'ComboboxMultiple'\n )(preset)\n return <Component {...props} ref={ref} />\n }\n)\nComboboxMultiple.displayName = 'ComboboxMultiple'\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"form-field-checkbox-group.d.ts","sourceRoot":"","sources":["../../../../../../src/components/form/controls/form-field-checkbox-group.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAW9B,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,sDAAsD,CAAA;AAGzG,MAAM,WAAW,2BAA4B,SAAQ,IAAI,CAAC,gBAAgB,EAAE,OAAO,GAAG,UAAU,GAAG,cAAc,CAAC;IAChH,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAA;IACpC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB,OAAO,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,CAAA;IAC/B,WAAW,CAAC,EAAE,UAAU,GAAG,YAAY,CAAA;IACvC,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,QAAA,MAAM,sBAAsB,
|
|
1
|
+
{"version":3,"file":"form-field-checkbox-group.d.ts","sourceRoot":"","sources":["../../../../../../src/components/form/controls/form-field-checkbox-group.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAW9B,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,sDAAsD,CAAA;AAGzG,MAAM,WAAW,2BAA4B,SAAQ,IAAI,CAAC,gBAAgB,EAAE,OAAO,GAAG,UAAU,GAAG,cAAc,CAAC;IAChH,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAA;IACpC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB,OAAO,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,CAAA;IAC/B,WAAW,CAAC,EAAE,UAAU,GAAG,YAAY,CAAA;IACvC,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,QAAA,MAAM,sBAAsB,oGA6L1B,CAAA;AAIF,OAAO,EAAE,sBAAsB,EAAE,CAAA"}
|
|
@@ -77,6 +77,19 @@ const FormFieldCheckboxGroup = React.forwardRef(({ schema, name, disabled, class
|
|
|
77
77
|
}, []);
|
|
78
78
|
const fieldId = name ?? 'checkbox-group-field';
|
|
79
79
|
if (options.length === 0) {
|
|
80
|
+
/*
|
|
81
|
+
* An option list that was SUPPLIED and is empty is a state, not a mistake: a picker over what the
|
|
82
|
+
* application declares shows nothing to choose while nothing is declared (an OAuth client's
|
|
83
|
+
* autonomous agents, before any agent exists). `FormFieldEnum` always supplies the list, so that is
|
|
84
|
+
* every empty group it renders. It reads as the combobox's empty list does, in words. Only a group
|
|
85
|
+
* used directly, with neither a list nor an enum in its schema, is an authoring mistake, and keeps
|
|
86
|
+
* the diagnostic.
|
|
87
|
+
*/
|
|
88
|
+
if (optionsProp !== undefined) {
|
|
89
|
+
if (!isReady)
|
|
90
|
+
return null;
|
|
91
|
+
return (_jsx("p", { className: "text-sm text-muted-foreground", children: tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD, 'noResults') }));
|
|
92
|
+
}
|
|
80
93
|
return (_jsx("div", { className: "text-sm text-destructive", children: "CHECKBOX_GROUP requires an array of enum values. No enum options found." }));
|
|
81
94
|
}
|
|
82
95
|
if (!isReady)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"form-field-checkbox-group.js","sourceRoot":"","sources":["../../../../../../src/components/form/controls/form-field-checkbox-group.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport * as CheckboxPrimitive from \"@radix-ui/react-checkbox\"\n\nimport { cn } from \"~wildo-frontend-lib/core/ui/cn\"\nimport { useIconRegistry } from \"~wildo-frontend-lib/core/icons/useIconRegistry\"\nimport { StandardIconReference, IconSize } from \"~wildo-frontend-lib/core/icons/icon-registry.frontend.schemas\"\nimport { useI18n } from \"~wildo-frontend-lib/core/i18n/useI18n\"\nimport { useUI } from \"~wildo-frontend-lib/core/ui/useUI\"\nimport { getArrayItemSchema, getEnumValues } from \"@wildo-ai/zod-decorators\"\nimport { resolveEnumDisplayConfig } from \"~wildo-frontend-lib/core/enums/common-enum-registry\"\nimport { UIBehavior, FormControlVariant, FrontendComponentType } from \"@wildo-ai/presets-components-models\"\nimport type { ControlBaseProps, FieldOption } from '~wildo-frontend-lib/components/form/form-field-types'\n\n// --- Contract ---\nexport interface FormFieldCheckboxGroupProps extends Omit<ControlBaseProps, 'value' | 'onChange' | 'defaultValue'> {\n value?: string[]\n onChange?: (value: string[]) => void\n defaultValue?: string[]\n options?: FieldOption<string>[]\n orientation?: 'vertical' | 'horizontal'\n columns?: number\n}\n\nconst FormFieldCheckboxGroup = React.forwardRef<HTMLDivElement, FormFieldCheckboxGroupProps>(\n ({\n schema,\n name,\n disabled,\n className,\n value: controlledValue,\n onChange,\n onBlur,\n defaultValue,\n validationMode: validationModeProp,\n options: optionsProp,\n orientation: orientationProp,\n columns: columnsProp,\n required,\n autoFocus,\n}, ref): React.JSX.Element | null => {\n const { tErrorValidation, tComponent, isReady } = useI18n({\n keys: ['errors_validation'],\n component: [FrontendComponentType.LOW_LEVEL_FORM_FIELD, FrontendComponentType.LOW_LEVEL_FORM_MESSAGE],\n })\n const { renderIcon } = useIconRegistry()\n const { getRecipe } = useUI()\n const checkboxRecipe = getRecipe(UIBehavior.FORM_CONTROL, FormControlVariant.CHECKBOX)\n\n const itemSchema = getArrayItemSchema(schema)\n const enumUI = itemSchema ? resolveEnumDisplayConfig(itemSchema) : undefined\n const orientation = orientationProp ?? enumUI?.edit?.editDirection ?? 'vertical'\n const columns = columnsProp ?? enumUI?.edit?.editColumnsCount ?? 1\n const enumValues = itemSchema ? getEnumValues(itemSchema) : []\n const options: FieldOption<string>[] = optionsProp ?? enumValues.map(v => ({ value: v, label: v }))\n\n const [internalValue, setInternalValue] = React.useState<string[]>(defaultValue ?? [])\n\n const isControlled = controlledValue !== undefined\n const currentValue = isControlled ? controlledValue : internalValue\n\n /*\n * HOW MANY MAY BE CHOSEN IS NOT THIS CONTROL'S QUESTION any more, and that is why the reading of\n * `getArrayConstraints`, the two refusals and the printed bound have all left this file.\n *\n * They were right, and they were here only — one of the seven controls a multiple selection can\n * render as. `FormFieldEnum` now asks the array once and hands every control the same answer: the\n * options arrive with `disabled` already set on whichever cannot move, and it guards the change\n * itself, because an option's disabled state cannot stop a \"select all\" or a paste. So this\n * renders what it is given, and a bound is honoured identically whichever control the author\n * chose.\n */\n const handleToggle = React.useCallback((optionValue: string, checked: boolean) => {\n const newValue = checked\n ? [...currentValue, optionValue]\n : currentValue.filter(v => v !== optionValue)\n\n if (isControlled) {\n onChange?.(newValue)\n } else {\n setInternalValue(newValue)\n }\n }, [currentValue, isControlled, onChange])\n\n const groupRef = React.useRef<HTMLDivElement>(null)\n const setRef = React.useCallback((el: HTMLDivElement | null) => {\n (groupRef as React.MutableRefObject<HTMLDivElement | null>).current = el\n if (typeof ref === 'function') ref(el)\n else if (ref) (ref as React.MutableRefObject<HTMLDivElement | null>).current = el\n }, [ref])\n const blurTimeoutRef = React.useRef<ReturnType<typeof setTimeout> | null>(null)\n\n const handleBlur = React.useCallback(() => {\n if (blurTimeoutRef.current) {\n clearTimeout(blurTimeoutRef.current)\n }\n blurTimeoutRef.current = setTimeout(() => {\n if (groupRef.current && !groupRef.current.contains(document.activeElement)) {\n onBlur?.()\n }\n }, 0)\n }, [onBlur])\n\n React.useEffect(() => {\n return () => {\n if (blurTimeoutRef.current) {\n clearTimeout(blurTimeoutRef.current)\n }\n }\n }, [])\n\n const fieldId = name ?? 'checkbox-group-field'\n\n if (options.length === 0) {\n return (\n <div className=\"text-sm text-destructive\">\n CHECKBOX_GROUP requires an array of enum values. No enum options found.\n </div>\n )\n }\n\n if (!isReady) return null;\n\n return (\n <>\n <div\n ref={setRef}\n role=\"group\"\n className={cn(\n orientation === 'horizontal'\n ? \"flex flex-wrap gap-field\"\n : columns > 1\n ? \"grid gap-group\"\n : \"flex flex-col gap-group\",\n className\n )}\n style={orientation === 'vertical' && columns > 1\n ? { gridTemplateColumns: `repeat(${columns}, minmax(0, 1fr))` }\n : undefined\n }\n >\n {options.map((option) => {\n const isChecked = currentValue.includes(option.value)\n const optionId = `${fieldId}-${option.value}`\n /*\n * `option.disabled` is READ now, and was not before: this computed its own bound flags\n * and never looked at the option's own. So a caller that disabled one option of a\n * checkbox group — which every other enum control here honours, and which is how\n * `FieldOption` says \"not this one\" — was ignored.\n */\n const isOptionDisabled = disabled === true || option.disabled === true\n\n return (\n <div\n key={option.value}\n className=\"flex items-center gap-element\"\n >\n <CheckboxPrimitive.Root\n id={optionId}\n checked={isChecked}\n onCheckedChange={(checked) => handleToggle(option.value, checked === true)}\n onBlur={handleBlur}\n disabled={isOptionDisabled}\n data-slot=\"checkbox\"\n className={cn(\n \"peer size-4 shrink-0 rounded-sm outline-none\",\n checkboxRecipe.base,\n checkboxRecipe.states.focus,\n checkboxRecipe.states.selected,\n checkboxRecipe.states.disabled,\n checkboxRecipe.states.invalid,\n checkboxRecipe.motion.transition,\n )}\n >\n <CheckboxPrimitive.Indicator\n data-slot=\"checkbox-indicator\"\n className=\"flex items-center justify-center text-current transition-none\"\n >\n {renderIcon(StandardIconReference.CHECK, { size: IconSize.SM })}\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n\n <label\n htmlFor={optionId}\n className={cn(\n \"text-sm font-normal cursor-pointer select-none\",\n isOptionDisabled && \"opacity-[var(--opacity-disabled)] cursor-not-allowed\"\n )}\n >\n {option.label}\n </label>\n </div>\n )\n })}\n </div>\n </>\n )\n})\n\nFormFieldCheckboxGroup.displayName = \"FormFieldCheckboxGroup\"\n\nexport { FormFieldCheckboxGroup }\n"]}
|
|
1
|
+
{"version":3,"file":"form-field-checkbox-group.js","sourceRoot":"","sources":["../../../../../../src/components/form/controls/form-field-checkbox-group.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport * as CheckboxPrimitive from \"@radix-ui/react-checkbox\"\n\nimport { cn } from \"~wildo-frontend-lib/core/ui/cn\"\nimport { useIconRegistry } from \"~wildo-frontend-lib/core/icons/useIconRegistry\"\nimport { StandardIconReference, IconSize } from \"~wildo-frontend-lib/core/icons/icon-registry.frontend.schemas\"\nimport { useI18n } from \"~wildo-frontend-lib/core/i18n/useI18n\"\nimport { useUI } from \"~wildo-frontend-lib/core/ui/useUI\"\nimport { getArrayItemSchema, getEnumValues } from \"@wildo-ai/zod-decorators\"\nimport { resolveEnumDisplayConfig } from \"~wildo-frontend-lib/core/enums/common-enum-registry\"\nimport { UIBehavior, FormControlVariant, FrontendComponentType } from \"@wildo-ai/presets-components-models\"\nimport type { ControlBaseProps, FieldOption } from '~wildo-frontend-lib/components/form/form-field-types'\n\n// --- Contract ---\nexport interface FormFieldCheckboxGroupProps extends Omit<ControlBaseProps, 'value' | 'onChange' | 'defaultValue'> {\n value?: string[]\n onChange?: (value: string[]) => void\n defaultValue?: string[]\n options?: FieldOption<string>[]\n orientation?: 'vertical' | 'horizontal'\n columns?: number\n}\n\nconst FormFieldCheckboxGroup = React.forwardRef<HTMLDivElement, FormFieldCheckboxGroupProps>(\n ({\n schema,\n name,\n disabled,\n className,\n value: controlledValue,\n onChange,\n onBlur,\n defaultValue,\n validationMode: validationModeProp,\n options: optionsProp,\n orientation: orientationProp,\n columns: columnsProp,\n required,\n autoFocus,\n}, ref): React.JSX.Element | null => {\n const { tErrorValidation, tComponent, isReady } = useI18n({\n keys: ['errors_validation'],\n component: [FrontendComponentType.LOW_LEVEL_FORM_FIELD, FrontendComponentType.LOW_LEVEL_FORM_MESSAGE],\n })\n const { renderIcon } = useIconRegistry()\n const { getRecipe } = useUI()\n const checkboxRecipe = getRecipe(UIBehavior.FORM_CONTROL, FormControlVariant.CHECKBOX)\n\n const itemSchema = getArrayItemSchema(schema)\n const enumUI = itemSchema ? resolveEnumDisplayConfig(itemSchema) : undefined\n const orientation = orientationProp ?? enumUI?.edit?.editDirection ?? 'vertical'\n const columns = columnsProp ?? enumUI?.edit?.editColumnsCount ?? 1\n const enumValues = itemSchema ? getEnumValues(itemSchema) : []\n const options: FieldOption<string>[] = optionsProp ?? enumValues.map(v => ({ value: v, label: v }))\n\n const [internalValue, setInternalValue] = React.useState<string[]>(defaultValue ?? [])\n\n const isControlled = controlledValue !== undefined\n const currentValue = isControlled ? controlledValue : internalValue\n\n /*\n * HOW MANY MAY BE CHOSEN IS NOT THIS CONTROL'S QUESTION any more, and that is why the reading of\n * `getArrayConstraints`, the two refusals and the printed bound have all left this file.\n *\n * They were right, and they were here only — one of the seven controls a multiple selection can\n * render as. `FormFieldEnum` now asks the array once and hands every control the same answer: the\n * options arrive with `disabled` already set on whichever cannot move, and it guards the change\n * itself, because an option's disabled state cannot stop a \"select all\" or a paste. So this\n * renders what it is given, and a bound is honoured identically whichever control the author\n * chose.\n */\n const handleToggle = React.useCallback((optionValue: string, checked: boolean) => {\n const newValue = checked\n ? [...currentValue, optionValue]\n : currentValue.filter(v => v !== optionValue)\n\n if (isControlled) {\n onChange?.(newValue)\n } else {\n setInternalValue(newValue)\n }\n }, [currentValue, isControlled, onChange])\n\n const groupRef = React.useRef<HTMLDivElement>(null)\n const setRef = React.useCallback((el: HTMLDivElement | null) => {\n (groupRef as React.MutableRefObject<HTMLDivElement | null>).current = el\n if (typeof ref === 'function') ref(el)\n else if (ref) (ref as React.MutableRefObject<HTMLDivElement | null>).current = el\n }, [ref])\n const blurTimeoutRef = React.useRef<ReturnType<typeof setTimeout> | null>(null)\n\n const handleBlur = React.useCallback(() => {\n if (blurTimeoutRef.current) {\n clearTimeout(blurTimeoutRef.current)\n }\n blurTimeoutRef.current = setTimeout(() => {\n if (groupRef.current && !groupRef.current.contains(document.activeElement)) {\n onBlur?.()\n }\n }, 0)\n }, [onBlur])\n\n React.useEffect(() => {\n return () => {\n if (blurTimeoutRef.current) {\n clearTimeout(blurTimeoutRef.current)\n }\n }\n }, [])\n\n const fieldId = name ?? 'checkbox-group-field'\n\n if (options.length === 0) {\n /*\n * An option list that was SUPPLIED and is empty is a state, not a mistake: a picker over what the\n * application declares shows nothing to choose while nothing is declared (an OAuth client's\n * autonomous agents, before any agent exists). `FormFieldEnum` always supplies the list, so that is\n * every empty group it renders. It reads as the combobox's empty list does, in words. Only a group\n * used directly, with neither a list nor an enum in its schema, is an authoring mistake, and keeps\n * the diagnostic.\n */\n if (optionsProp !== undefined) {\n if (!isReady) return null\n return (\n <p className=\"text-sm text-muted-foreground\">\n {tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD, 'noResults')}\n </p>\n )\n }\n return (\n <div className=\"text-sm text-destructive\">\n CHECKBOX_GROUP requires an array of enum values. No enum options found.\n </div>\n )\n }\n\n if (!isReady) return null;\n\n return (\n <>\n <div\n ref={setRef}\n role=\"group\"\n className={cn(\n orientation === 'horizontal'\n ? \"flex flex-wrap gap-field\"\n : columns > 1\n ? \"grid gap-group\"\n : \"flex flex-col gap-group\",\n className\n )}\n style={orientation === 'vertical' && columns > 1\n ? { gridTemplateColumns: `repeat(${columns}, minmax(0, 1fr))` }\n : undefined\n }\n >\n {options.map((option) => {\n const isChecked = currentValue.includes(option.value)\n const optionId = `${fieldId}-${option.value}`\n /*\n * `option.disabled` is READ now, and was not before: this computed its own bound flags\n * and never looked at the option's own. So a caller that disabled one option of a\n * checkbox group — which every other enum control here honours, and which is how\n * `FieldOption` says \"not this one\" — was ignored.\n */\n const isOptionDisabled = disabled === true || option.disabled === true\n\n return (\n <div\n key={option.value}\n className=\"flex items-center gap-element\"\n >\n <CheckboxPrimitive.Root\n id={optionId}\n checked={isChecked}\n onCheckedChange={(checked) => handleToggle(option.value, checked === true)}\n onBlur={handleBlur}\n disabled={isOptionDisabled}\n data-slot=\"checkbox\"\n className={cn(\n \"peer size-4 shrink-0 rounded-sm outline-none\",\n checkboxRecipe.base,\n checkboxRecipe.states.focus,\n checkboxRecipe.states.selected,\n checkboxRecipe.states.disabled,\n checkboxRecipe.states.invalid,\n checkboxRecipe.motion.transition,\n )}\n >\n <CheckboxPrimitive.Indicator\n data-slot=\"checkbox-indicator\"\n className=\"flex items-center justify-center text-current transition-none\"\n >\n {renderIcon(StandardIconReference.CHECK, { size: IconSize.SM })}\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n\n <label\n htmlFor={optionId}\n className={cn(\n \"text-sm font-normal cursor-pointer select-none\",\n isOptionDisabled && \"opacity-[var(--opacity-disabled)] cursor-not-allowed\"\n )}\n >\n {option.label}\n </label>\n </div>\n )\n })}\n </div>\n </>\n )\n})\n\nFormFieldCheckboxGroup.displayName = \"FormFieldCheckboxGroup\"\n\nexport { FormFieldCheckboxGroup }\n"]}
|
|
@@ -25,11 +25,27 @@
|
|
|
25
25
|
* Every part is held as a string draft while typing and composed into the value on each change:
|
|
26
26
|
* optional parts left empty are omitted, and a half-typed coordinate becomes `NaN`, which the schema
|
|
27
27
|
* refuses — the field shows an error instead of storing a point the user did not enter.
|
|
28
|
+
*
|
|
29
|
+
* ## The lookup slot (#1730, filled by #561)
|
|
30
|
+
*
|
|
31
|
+
* `renderLookup` is where an address LOOKUP renders — a vendor autocomplete such as a
|
|
32
|
+
* `FRONTEND_ADDRESS_LOOKUP` provider component — above the parts. The field hands it an
|
|
33
|
+
* {@link AddressFieldLookupHost} and nothing else: the field imports no provider code, resolves no
|
|
34
|
+
* provider, and works exactly the same by hand when the slot is empty, refused or failing. That split
|
|
35
|
+
* is the design, not a placeholder: the field owns the value, its validation and its persistence; a
|
|
36
|
+
* lookup only SUGGESTS a whole address, which lands in the parts as if the person had typed it and
|
|
37
|
+
* stays editable before anything is saved.
|
|
28
38
|
*/
|
|
29
39
|
import React from 'react';
|
|
30
40
|
import { type AddressValue } from '@wildo-ai/zod-decorators';
|
|
31
41
|
import { ComponentPresetProps } from '../../../core/components-registry/component-registry.frontend.schemas';
|
|
32
42
|
import type { ControlBaseProps } from '../../../components/form/form-field-types';
|
|
43
|
+
/** @wildo_source:part:start saas.frontend.form-field-address.lookup-slot facet:layer:frontend facet:family:component facet:audience:app-developer */
|
|
44
|
+
/**
|
|
45
|
+
* Props of `FormFieldAddress` (`@wildo-ai/saas-frontend-lib`), the control the framework renders for every
|
|
46
|
+
* field declared with `z_address()`. Forms dispatch to it automatically; an application passes these
|
|
47
|
+
* props itself only when it renders the control directly or fills its lookup slot.
|
|
48
|
+
*/
|
|
33
49
|
export interface FormFieldAddressProps extends Omit<ControlBaseProps, 'value' | 'onChange' | 'defaultValue'> {
|
|
34
50
|
value?: AddressValue;
|
|
35
51
|
/**
|
|
@@ -44,7 +60,49 @@ export interface FormFieldAddressProps extends Omit<ControlBaseProps, 'value' |
|
|
|
44
60
|
* which owns touch/submit visibility; the control only places each message under its input.
|
|
45
61
|
*/
|
|
46
62
|
partErrors?: Readonly<Record<string, string | undefined>>;
|
|
63
|
+
/**
|
|
64
|
+
* Renders an address LOOKUP (a vendor autocomplete) above the parts. Omitted, the field is the plain
|
|
65
|
+
* multi-part control, and it stays fully usable by hand when a lookup is refused or fails. The field
|
|
66
|
+
* decides nothing about which lookup this is and imports no provider code: whoever fills the slot
|
|
67
|
+
* resolves the provider, its consent and its errors, and fills the field through
|
|
68
|
+
* {@link AddressFieldLookupHost.applyAddress}.
|
|
69
|
+
*/
|
|
70
|
+
renderLookup?: (host: AddressFieldLookupHost) => React.ReactNode;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* What an address field hands to the lookup rendered in its `renderLookup` slot.
|
|
74
|
+
*
|
|
75
|
+
* Deliberately provider-free: every member is the FIELD's own knowledge (its `z_address()` options and
|
|
76
|
+
* its editability) plus one way to fill it. A vendor lookup narrows its suggestions to
|
|
77
|
+
* `countriesAllowed`, ranks by `defaultCountry`, and calls `applyAddress` with the place the person chose.
|
|
78
|
+
*/
|
|
79
|
+
export interface AddressFieldLookupHost {
|
|
80
|
+
/** ISO 3166-1 alpha-2 codes the field accepts, from `z_address({ countriesAllowed })`. Absent means any; never empty. */
|
|
81
|
+
readonly countriesAllowed?: readonly string[];
|
|
82
|
+
/** The field's default country, from `z_address({ defaultCountry })` — a ranking hint for suggestions. */
|
|
83
|
+
readonly defaultCountry?: string;
|
|
84
|
+
/** True while the field is disabled or read-only. A lookup must not offer to fill it then; `applyAddress` ignores the call. */
|
|
85
|
+
readonly disabled: boolean;
|
|
86
|
+
/**
|
|
87
|
+
* Replace every TEXT part and the country with the chosen address, as though the person had typed
|
|
88
|
+
* it, and emit the value.
|
|
89
|
+
*
|
|
90
|
+
* Every text part is replaced, including the ones the chosen address omits: a `line2` left over from
|
|
91
|
+
* the previous address describes a different place, so keeping it would compose an address that exists
|
|
92
|
+
* nowhere.
|
|
93
|
+
*
|
|
94
|
+
* Coordinates are ALWAYS cleared, whatever `address` carries. The previous geocode describes the previous
|
|
95
|
+
* place, and a lookup's geocode is never stored: vendors' terms either forbid storing it or allow it for a
|
|
96
|
+
* limited time, while a stored `coordinates` has no expiry, so nothing would ever delete it on the
|
|
97
|
+
* vendor's clock. The person can still enter coordinates by hand where the field offers them.
|
|
98
|
+
*
|
|
99
|
+
* The value is NOT validated here: it goes through the same form validation as a typed address, so a
|
|
100
|
+
* country outside `countriesAllowed` shows the same error under the country part. A caller that wants to
|
|
101
|
+
* refuse such a value before it reaches the field (the provider path does) validates it first.
|
|
102
|
+
*/
|
|
103
|
+
applyAddress(address: AddressValue): void;
|
|
47
104
|
}
|
|
105
|
+
/** @wildo_source:part:end saas.frontend.form-field-address.lookup-slot */
|
|
48
106
|
export type FormFieldAddressRef = HTMLInputElement;
|
|
49
107
|
/**
|
|
50
108
|
* FormFieldAddress component
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"form-field-address.d.ts","sourceRoot":"","sources":["../../../../../../src/components/form/fields/form-field-address.tsx"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"form-field-address.d.ts","sourceRoot":"","sources":["../../../../../../src/components/form/fields/form-field-address.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAEH,OAAO,KAAqB,MAAM,OAAO,CAAC;AAQ1C,OAAO,EAAwE,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAGnI,OAAO,EAAE,oBAAoB,EAAE,MAAM,kFAAkF,CAAC;AACxH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sDAAsD,CAAC;AAG7F,qJAAqJ;AACrJ;;;;GAIG;AACH,MAAM,WAAW,qBAAsB,SAAQ,IAAI,CAAC,gBAAgB,EAAE,OAAO,GAAG,UAAU,GAAG,cAAc,CAAC;IAC1G,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB;;;OAGG;IACH,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,GAAG,SAAS,KAAK,IAAI,CAAC;IACrD,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B;;;;OAIG;IACH,UAAU,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IAC1D;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,sBAAsB,KAAK,KAAK,CAAC,SAAS,CAAC;CAClE;AAED;;;;;;GAMG;AACH,MAAM,WAAW,sBAAsB;IACrC,yHAAyH;IACzH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9C,0GAA0G;IAC1G,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,+HAA+H;IAC/H,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B;;;;;;;;;;;;;;;;OAgBG;IACH,YAAY,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,CAAC;CAC3C;AACD,0EAA0E;AAE1E,MAAM,MAAM,mBAAmB,GAAG,gBAAgB,CAAC;AAsFnD;;;;GAIG;AACH,eAAO,MAAM,+BAA+B,gGAyN3C,CAAC;AAKF,eAAO,MAAM,gBAAgB,uHAQ5B,CAAC"}
|
|
@@ -26,13 +26,23 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
26
26
|
* Every part is held as a string draft while typing and composed into the value on each change:
|
|
27
27
|
* optional parts left empty are omitted, and a half-typed coordinate becomes `NaN`, which the schema
|
|
28
28
|
* refuses — the field shows an error instead of storing a point the user did not enter.
|
|
29
|
+
*
|
|
30
|
+
* ## The lookup slot (#1730, filled by #561)
|
|
31
|
+
*
|
|
32
|
+
* `renderLookup` is where an address LOOKUP renders — a vendor autocomplete such as a
|
|
33
|
+
* `FRONTEND_ADDRESS_LOOKUP` provider component — above the parts. The field hands it an
|
|
34
|
+
* {@link AddressFieldLookupHost} and nothing else: the field imports no provider code, resolves no
|
|
35
|
+
* provider, and works exactly the same by hand when the slot is empty, refused or failing. That split
|
|
36
|
+
* is the design, not a placeholder: the field owns the value, its validation and its persistence; a
|
|
37
|
+
* lookup only SUGGESTS a whole address, which lands in the parts as if the person had typed it and
|
|
38
|
+
* stays editable before anything is saved.
|
|
29
39
|
*/
|
|
30
40
|
import React, { forwardRef } from 'react';
|
|
31
41
|
import { cn } from '../../../core/ui/cn.js';
|
|
32
42
|
import { useUI } from '../../../core/ui/useUI.js';
|
|
33
43
|
import { useI18n } from '../../../core/i18n/useI18n.js';
|
|
34
44
|
import { InputRoot } from '../../../components/form/controls/input.js';
|
|
35
|
-
import { FieldError } from '../../../components/form/chromes/field.js';
|
|
45
|
+
import { FieldError, FieldLabel } from '../../../components/form/chromes/field.js';
|
|
36
46
|
import { ControlSize, CorePresetNames, FormControlVariant, FrontendComponentType, UIBehavior } from '@wildo-ai/presets-components-models';
|
|
37
47
|
import { AddressCoordinatePart, AddressPart, getAddressMetadata, getCountries } from '@wildo-ai/zod-decorators';
|
|
38
48
|
import { createComponentResolverWithRef } from '../../../core/components-registry/component-resolver.frontend.helper.js';
|
|
@@ -105,7 +115,7 @@ function buildCountryOptions(locale, countriesAllowed) {
|
|
|
105
115
|
*
|
|
106
116
|
* One labelled control per address part plus a country selector. Emits `AddressValue`.
|
|
107
117
|
*/
|
|
108
|
-
export const FormFieldAddress_Preset_Default = React.forwardRef(({ schema, name, disabled, readOnly, className, value: controlledValue, onChange, onBlur, defaultValue, autoFocus, clearable, partErrors, controlSize = ControlSize.MD, }, ref) => {
|
|
118
|
+
export const FormFieldAddress_Preset_Default = React.forwardRef(({ schema, name, disabled, readOnly, className, value: controlledValue, onChange, onBlur, defaultValue, autoFocus, clearable, partErrors, renderLookup, controlSize = ControlSize.MD, }, ref) => {
|
|
109
119
|
const { tComponent, currentLanguage } = useI18n({ component: [FrontendComponentType.LOW_LEVEL_FORM_FIELD_ADDRESS] });
|
|
110
120
|
const { getRecipe } = useUI();
|
|
111
121
|
const formRecipe = getRecipe(UIBehavior.FORM_CONTROL, FormControlVariant.DEFAULT);
|
|
@@ -138,8 +148,8 @@ export const FormFieldAddress_Preset_Default = React.forwardRef(({ schema, name,
|
|
|
138
148
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
139
149
|
}, [externalKey, defaultCountry]);
|
|
140
150
|
const countryOptions = React.useMemo(() => buildCountryOptions(currentLanguage, addressMetadata?.countriesAllowed), [currentLanguage, addressMetadata?.countriesAllowed]);
|
|
141
|
-
|
|
142
|
-
|
|
151
|
+
/** Adopt a new draft and emit the value it composes — the one path every edit, typed or looked up, takes. */
|
|
152
|
+
const commitDraft = React.useCallback((nextDraft) => {
|
|
143
153
|
draftRef.current = nextDraft;
|
|
144
154
|
setDraft(nextDraft);
|
|
145
155
|
const composed = composeAddress(nextDraft);
|
|
@@ -147,6 +157,17 @@ export const FormFieldAddress_Preset_Default = React.forwardRef(({ schema, name,
|
|
|
147
157
|
lastEmittedKeyRef.current = JSON.stringify(emitted ?? null);
|
|
148
158
|
onChange?.(emitted);
|
|
149
159
|
}, [clearable, onChange]);
|
|
160
|
+
const commitPart = React.useCallback((part, text) => commitDraft({ ...draftRef.current, [part]: text }), [commitDraft]);
|
|
161
|
+
const lookupDisabled = disabled === true || readOnly === true;
|
|
162
|
+
const applyAddress = React.useCallback((address) => {
|
|
163
|
+
// Checked here as well as advertised through `disabled`: a lookup that ignored the flag must still
|
|
164
|
+
// not be able to rewrite a field the person cannot edit.
|
|
165
|
+
if (lookupDisabled)
|
|
166
|
+
return;
|
|
167
|
+
// `coordinates` is dropped before the draft is built: see the `applyAddress` contract above.
|
|
168
|
+
const { coordinates: _lookupGeocode, ...textParts } = address;
|
|
169
|
+
commitDraft(draftFromValue(textParts, defaultCountry));
|
|
170
|
+
}, [commitDraft, defaultCountry, lookupDisabled]);
|
|
150
171
|
const handleGroupBlur = React.useCallback((event) => {
|
|
151
172
|
if (event.currentTarget.contains(event.relatedTarget))
|
|
152
173
|
return;
|
|
@@ -160,13 +181,20 @@ export const FormFieldAddress_Preset_Default = React.forwardRef(({ schema, name,
|
|
|
160
181
|
const id = partId(path);
|
|
161
182
|
const error = partErrors?.[path];
|
|
162
183
|
const errorId = `${id}-error`;
|
|
163
|
-
return (_jsxs("div", { className: "flex flex-col gap-1", children: [_jsx(
|
|
184
|
+
return (_jsxs("div", { className: "flex flex-col gap-1", children: [_jsx(FieldLabel, { htmlFor: id, className: labelClassName, children: label }), control({ id, ...(error && { 'aria-invalid': true, 'aria-describedby': errorId }) }), error && _jsx(FieldError, { id: errorId, children: error })] }, path));
|
|
164
185
|
};
|
|
165
186
|
const renderTextPart = ({ part, autoComplete }) => renderPart(part, tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_ADDRESS, part), (a11y) => (_jsx(InputRoot, { ...a11y, ref: part === AddressPart.LINE1 ? ref : undefined, name: `${name}.${part}`, type: "text", value: draft[part], onChange: (event) => commitPart(part, event.target.value), disabled: disabled, readOnly: readOnly, autoComplete: autoComplete, autoFocus: part === AddressPart.LINE1 ? autoFocus : undefined, controlSize: controlSize })));
|
|
166
187
|
const renderCoordinatePart = (part) => renderPart(`coordinates.${part}`, tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_ADDRESS, part), (a11y) => (_jsx(InputRoot, { ...a11y, name: `${name}.coordinates.${part}`, type: "number", step: "any", inputMode: "decimal", value: draft[part], onChange: (event) => commitPart(part, event.target.value), disabled: disabled, readOnly: readOnly, className: "tabular-nums", controlSize: controlSize })));
|
|
167
188
|
const [line1Control, line2Control, cityControl, stateControl, postalCodeControl] = ADDRESS_TEXT_PART_CONTROLS;
|
|
168
189
|
const countryIsListed = countryOptions.some((option) => option.code === draft.country);
|
|
169
|
-
return (_jsxs("div", { className: cn('flex w-full flex-col gap-element', className), role: "group", "aria-labelledby": `${fieldId}-label`, onBlur: handleGroupBlur, children: [
|
|
190
|
+
return (_jsxs("div", { className: cn('flex w-full flex-col gap-element', className), role: "group", "aria-labelledby": `${fieldId}-label`, onBlur: handleGroupBlur, children: [renderLookup?.({
|
|
191
|
+
// An empty list means "any country" to this field (see `buildCountryOptions`), so it is not handed
|
|
192
|
+
// over as a list a lookup could read as "no country allowed".
|
|
193
|
+
...(addressMetadata?.countriesAllowed && addressMetadata.countriesAllowed.length > 0 && { countriesAllowed: addressMetadata.countriesAllowed }),
|
|
194
|
+
...(defaultCountry !== undefined && { defaultCountry }),
|
|
195
|
+
disabled: lookupDisabled,
|
|
196
|
+
applyAddress,
|
|
197
|
+
}), renderTextPart(line1Control), renderTextPart(line2Control), _jsxs("div", { className: "grid gap-element sm:grid-cols-2", children: [renderTextPart(cityControl), renderTextPart(postalCodeControl)] }), renderTextPart(stateControl), renderPart(AddressPart.COUNTRY, tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_ADDRESS, AddressPart.COUNTRY), (a11y) => (_jsxs("select", { ...a11y, name: `${name}.${AddressPart.COUNTRY}`, value: draft.country, onChange: (event) => commitPart(AddressPart.COUNTRY, event.target.value), disabled: disabled || readOnly, autoComplete: "country", "data-size": controlSize, className: cn('flex w-full rounded-md bg-transparent text-sm', formRecipe.base, formRecipe.states.focus, formRecipe.states.disabled, formRecipe.sizes?.[controlSize], formRecipe.motion.transition), children: [draft.country === '' && (_jsx("option", { value: "", disabled: true, children: tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_ADDRESS, 'countryPlaceholder') })), draft.country !== '' && !countryIsListed && _jsx("option", { value: draft.country, children: draft.country }), countryOptions.map((option) => (_jsx("option", { value: option.code, children: option.name }, option.code)))] }))), withCoordinates && (_jsxs("div", { className: "grid gap-element sm:grid-cols-2", children: [renderCoordinatePart(AddressCoordinatePart.LATITUDE), renderCoordinatePart(AddressCoordinatePart.LONGITUDE)] }))] }));
|
|
170
198
|
});
|
|
171
199
|
FormFieldAddress_Preset_Default.displayName = 'FormFieldAddress_Preset_Default';
|
|
172
200
|
// --- Wrapper ---
|