@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.
Files changed (777) hide show
  1. package/dist/esm/components/actions/action-bar.d.ts +15 -0
  2. package/dist/esm/components/actions/action-bar.d.ts.map +1 -1
  3. package/dist/esm/components/actions/action-bar.js +15 -0
  4. package/dist/esm/components/actions/action-bar.js.map +1 -1
  5. package/dist/esm/components/ai-elements/decision/approval.d.ts +97 -7
  6. package/dist/esm/components/ai-elements/decision/approval.d.ts.map +1 -1
  7. package/dist/esm/components/ai-elements/decision/approval.js.map +1 -1
  8. package/dist/esm/components/app/AppLayout_AuthenticatedRoute.d.ts.map +1 -1
  9. package/dist/esm/components/app/AppLayout_AuthenticatedRoute.js +8 -3
  10. package/dist/esm/components/app/AppLayout_AuthenticatedRoute.js.map +1 -1
  11. package/dist/esm/components/auth/Auth_EnrollmentRequired.d.ts.map +1 -1
  12. package/dist/esm/components/auth/Auth_EnrollmentRequired.js +5 -1
  13. package/dist/esm/components/auth/Auth_EnrollmentRequired.js.map +1 -1
  14. package/dist/esm/components/auth/Auth_Main.d.ts.map +1 -1
  15. package/dist/esm/components/auth/Auth_Main.js +1 -4
  16. package/dist/esm/components/auth/Auth_Main.js.map +1 -1
  17. package/dist/esm/components/auth/Auth_Register.d.ts.map +1 -1
  18. package/dist/esm/components/auth/Auth_Register.js +1 -3
  19. package/dist/esm/components/auth/Auth_Register.js.map +1 -1
  20. package/dist/esm/components/auth/StepUpAuthDialog.d.ts +7 -0
  21. package/dist/esm/components/auth/StepUpAuthDialog.d.ts.map +1 -1
  22. package/dist/esm/components/auth/StepUpAuthDialog.js +13 -7
  23. package/dist/esm/components/auth/StepUpAuthDialog.js.map +1 -1
  24. package/dist/esm/components/auth/admin-config/AppPage_SecuritySettings.d.ts.map +1 -1
  25. package/dist/esm/components/auth/admin-config/AppPage_SecuritySettings.js +32 -33
  26. package/dist/esm/components/auth/admin-config/AppPage_SecuritySettings.js.map +1 -1
  27. package/dist/esm/components/auth/admin-config/AppPage_SecuritySettings.labels.d.ts.map +1 -1
  28. package/dist/esm/components/auth/admin-config/AppPage_SecuritySettings.labels.js +18 -20
  29. package/dist/esm/components/auth/admin-config/AppPage_SecuritySettings.labels.js.map +1 -1
  30. package/dist/esm/components/auth/methods/ExternalOAuth2AuthMethod.d.ts.map +1 -1
  31. package/dist/esm/components/auth/methods/ExternalOAuth2AuthMethod.js +2 -3
  32. package/dist/esm/components/auth/methods/ExternalOAuth2AuthMethod.js.map +1 -1
  33. package/dist/esm/components/auth/utils/oauth-provider-display-label.frontend.utils.d.ts +13 -16
  34. package/dist/esm/components/auth/utils/oauth-provider-display-label.frontend.utils.d.ts.map +1 -1
  35. package/dist/esm/components/auth/utils/oauth-provider-display-label.frontend.utils.js +18 -15
  36. package/dist/esm/components/auth/utils/oauth-provider-display-label.frontend.utils.js.map +1 -1
  37. package/dist/esm/components/billing/billing-invoice-history.js +2 -2
  38. package/dist/esm/components/billing/billing-invoice-history.js.map +1 -1
  39. package/dist/esm/components/billing/billing-portal-link.js +2 -2
  40. package/dist/esm/components/billing/billing-portal-link.js.map +1 -1
  41. package/dist/esm/components/billing/billing-pricing-table.d.ts +33 -1
  42. package/dist/esm/components/billing/billing-pricing-table.d.ts.map +1 -1
  43. package/dist/esm/components/billing/billing-pricing-table.js +34 -5
  44. package/dist/esm/components/billing/billing-pricing-table.js.map +1 -1
  45. package/dist/esm/components/billing/billing-subscription-status.js +2 -2
  46. package/dist/esm/components/billing/billing-subscription-status.js.map +1 -1
  47. package/dist/esm/components/billing/billing-usage-dashboard.d.ts +2 -0
  48. package/dist/esm/components/billing/billing-usage-dashboard.d.ts.map +1 -1
  49. package/dist/esm/components/billing/billing-usage-dashboard.js +1 -0
  50. package/dist/esm/components/billing/billing-usage-dashboard.js.map +1 -1
  51. package/dist/esm/components/data-display/DisplayField.d.ts.map +1 -1
  52. package/dist/esm/components/data-display/DisplayField.js +15 -1
  53. package/dist/esm/components/data-display/DisplayField.js.map +1 -1
  54. package/dist/esm/components/data-display/DisplayFieldArray.d.ts.map +1 -1
  55. package/dist/esm/components/data-display/DisplayFieldArray.js +11 -0
  56. package/dist/esm/components/data-display/DisplayFieldArray.js.map +1 -1
  57. package/dist/esm/components/data-display/DisplayFieldEditable.d.ts.map +1 -1
  58. package/dist/esm/components/data-display/DisplayFieldEditable.js +2 -2
  59. package/dist/esm/components/data-display/DisplayFieldEditable.js.map +1 -1
  60. package/dist/esm/components/data-display/DisplayFieldEditableArray.d.ts +12 -2
  61. package/dist/esm/components/data-display/DisplayFieldEditableArray.d.ts.map +1 -1
  62. package/dist/esm/components/data-display/DisplayFieldEditableArray.js +3 -2
  63. package/dist/esm/components/data-display/DisplayFieldEditableArray.js.map +1 -1
  64. package/dist/esm/components/data-display/DisplayFieldReadOnly.d.ts.map +1 -1
  65. package/dist/esm/components/data-display/DisplayFieldReadOnly.js +2 -2
  66. package/dist/esm/components/data-display/DisplayFieldReadOnly.js.map +1 -1
  67. package/dist/esm/components/data-display/DisplayFieldReadOnlyArraySection.d.ts.map +1 -1
  68. package/dist/esm/components/data-display/DisplayFieldReadOnlyArraySection.js +8 -2
  69. package/dist/esm/components/data-display/DisplayFieldReadOnlyArraySection.js.map +1 -1
  70. package/dist/esm/components/data-display/DisplayValueDispatcher.d.ts.map +1 -1
  71. package/dist/esm/components/data-display/DisplayValueDispatcher.js +18 -4
  72. package/dist/esm/components/data-display/DisplayValueDispatcher.js.map +1 -1
  73. package/dist/esm/components/data-display/ResourceAutomaticDisplayer.d.ts.map +1 -1
  74. package/dist/esm/components/data-display/ResourceAutomaticDisplayer.js +61 -3
  75. package/dist/esm/components/data-display/ResourceAutomaticDisplayer.js.map +1 -1
  76. package/dist/esm/components/data-display/ResourceSummaryDisplayer.d.ts +7 -5
  77. package/dist/esm/components/data-display/ResourceSummaryDisplayer.d.ts.map +1 -1
  78. package/dist/esm/components/data-display/ResourceSummaryDisplayer.js.map +1 -1
  79. package/dist/esm/components/data-display/chromes/DisplayFieldChrome.d.ts +11 -1
  80. package/dist/esm/components/data-display/chromes/DisplayFieldChrome.d.ts.map +1 -1
  81. package/dist/esm/components/data-display/chromes/DisplayFieldChrome.js +36 -11
  82. package/dist/esm/components/data-display/chromes/DisplayFieldChrome.js.map +1 -1
  83. package/dist/esm/components/data-display/display-field-resolved-props.d.ts +6 -0
  84. package/dist/esm/components/data-display/display-field-resolved-props.d.ts.map +1 -1
  85. package/dist/esm/components/data-display/display-field-resolved-props.js.map +1 -1
  86. package/dist/esm/components/data-display/external-data-provenance/DisplayFieldProvenanceNote.d.ts +23 -0
  87. package/dist/esm/components/data-display/external-data-provenance/DisplayFieldProvenanceNote.d.ts.map +1 -0
  88. package/dist/esm/components/data-display/external-data-provenance/DisplayFieldProvenanceNote.js +35 -0
  89. package/dist/esm/components/data-display/external-data-provenance/DisplayFieldProvenanceNote.js.map +1 -0
  90. package/dist/esm/components/data-display/external-data-provenance/external-data-provenance.frontend.d.ts +47 -0
  91. package/dist/esm/components/data-display/external-data-provenance/external-data-provenance.frontend.d.ts.map +1 -0
  92. package/dist/esm/components/data-display/external-data-provenance/external-data-provenance.frontend.js +124 -0
  93. package/dist/esm/components/data-display/external-data-provenance/external-data-provenance.frontend.js.map +1 -0
  94. package/dist/esm/components/data-display/external-data-provenance/useExternalDataFieldProvenance.d.ts +8 -0
  95. package/dist/esm/components/data-display/external-data-provenance/useExternalDataFieldProvenance.d.ts.map +1 -0
  96. package/dist/esm/components/data-display/external-data-provenance/useExternalDataFieldProvenance.js +46 -0
  97. package/dist/esm/components/data-display/external-data-provenance/useExternalDataFieldProvenance.js.map +1 -0
  98. package/dist/esm/components/feedback/resource-empty-state.d.ts +21 -8
  99. package/dist/esm/components/feedback/resource-empty-state.d.ts.map +1 -1
  100. package/dist/esm/components/feedback/resource-empty-state.js +56 -26
  101. package/dist/esm/components/feedback/resource-empty-state.js.map +1 -1
  102. package/dist/esm/components/flows-actors/approval.d.ts +29 -7
  103. package/dist/esm/components/flows-actors/approval.d.ts.map +1 -1
  104. package/dist/esm/components/flows-actors/approval.js +231 -101
  105. package/dist/esm/components/flows-actors/approval.js.map +1 -1
  106. package/dist/esm/components/flows-actors/approval.labels.d.ts.map +1 -1
  107. package/dist/esm/components/flows-actors/approval.labels.js +57 -0
  108. package/dist/esm/components/flows-actors/approval.labels.js.map +1 -1
  109. package/dist/esm/components/flows-actors/system-catalog.d.ts.map +1 -1
  110. package/dist/esm/components/flows-actors/system-catalog.js +4 -4
  111. package/dist/esm/components/flows-actors/system-catalog.js.map +1 -1
  112. package/dist/esm/components/flows-actors/system-catalog.labels.d.ts.map +1 -1
  113. package/dist/esm/components/flows-actors/system-catalog.labels.js +0 -5
  114. package/dist/esm/components/flows-actors/system-catalog.labels.js.map +1 -1
  115. package/dist/esm/components/form/Form.d.ts +2 -2
  116. package/dist/esm/components/form/Form.js +2 -2
  117. package/dist/esm/components/form/Form.js.map +1 -1
  118. package/dist/esm/components/form/automated/AutomatedArrayField.d.ts +28 -3
  119. package/dist/esm/components/form/automated/AutomatedArrayField.d.ts.map +1 -1
  120. package/dist/esm/components/form/automated/AutomatedArrayField.js +43 -14
  121. package/dist/esm/components/form/automated/AutomatedArrayField.js.map +1 -1
  122. package/dist/esm/components/form/automated/FormField.d.ts +3 -0
  123. package/dist/esm/components/form/automated/FormField.d.ts.map +1 -1
  124. package/dist/esm/components/form/automated/FormField.js +60 -21
  125. package/dist/esm/components/form/automated/FormField.js.map +1 -1
  126. package/dist/esm/components/form/automated/FormFieldArray.d.ts +6 -3
  127. package/dist/esm/components/form/automated/FormFieldArray.d.ts.map +1 -1
  128. package/dist/esm/components/form/automated/FormFieldArray.js +3 -2
  129. package/dist/esm/components/form/automated/FormFieldArray.js.map +1 -1
  130. package/dist/esm/components/form/automated/ResourceAutomatedForm.d.ts +5 -4
  131. package/dist/esm/components/form/automated/ResourceAutomatedForm.d.ts.map +1 -1
  132. package/dist/esm/components/form/automated/ResourceAutomatedForm.js +148 -55
  133. package/dist/esm/components/form/automated/ResourceAutomatedForm.js.map +1 -1
  134. package/dist/esm/components/form/automated/ResourceFormActionsContext.d.ts +30 -0
  135. package/dist/esm/components/form/automated/ResourceFormActionsContext.d.ts.map +1 -1
  136. package/dist/esm/components/form/automated/ResourceFormActionsContext.js +30 -1
  137. package/dist/esm/components/form/automated/ResourceFormActionsContext.js.map +1 -1
  138. package/dist/esm/components/form/automated/TemplatePlacedFieldsContext.d.ts +79 -0
  139. package/dist/esm/components/form/automated/TemplatePlacedFieldsContext.d.ts.map +1 -0
  140. package/dist/esm/components/form/automated/TemplatePlacedFieldsContext.js +203 -0
  141. package/dist/esm/components/form/automated/TemplatePlacedFieldsContext.js.map +1 -0
  142. package/dist/esm/components/form/automated/automated-form-submit.utils.d.ts +12 -0
  143. package/dist/esm/components/form/automated/automated-form-submit.utils.d.ts.map +1 -1
  144. package/dist/esm/components/form/automated/automated-form-submit.utils.js +11 -0
  145. package/dist/esm/components/form/automated/automated-form-submit.utils.js.map +1 -1
  146. package/dist/esm/components/form/chromes/FormFieldChrome.d.ts.map +1 -1
  147. package/dist/esm/components/form/chromes/FormFieldChrome.js +2 -2
  148. package/dist/esm/components/form/chromes/FormFieldChrome.js.map +1 -1
  149. package/dist/esm/components/form/combobox.d.ts +7 -0
  150. package/dist/esm/components/form/combobox.d.ts.map +1 -1
  151. package/dist/esm/components/form/combobox.js.map +1 -1
  152. package/dist/esm/components/form/controls/form-field-checkbox-group.d.ts.map +1 -1
  153. package/dist/esm/components/form/controls/form-field-checkbox-group.js +13 -0
  154. package/dist/esm/components/form/controls/form-field-checkbox-group.js.map +1 -1
  155. package/dist/esm/components/form/fields/form-field-address.d.ts +58 -0
  156. package/dist/esm/components/form/fields/form-field-address.d.ts.map +1 -1
  157. package/dist/esm/components/form/fields/form-field-address.js +34 -6
  158. package/dist/esm/components/form/fields/form-field-address.js.map +1 -1
  159. package/dist/esm/components/form/fields/form-field-address.labels.d.ts.map +1 -1
  160. package/dist/esm/components/form/fields/form-field-address.labels.js +60 -1
  161. package/dist/esm/components/form/fields/form-field-address.labels.js.map +1 -1
  162. package/dist/esm/components/form/fields/form-field-file.d.ts +0 -12
  163. package/dist/esm/components/form/fields/form-field-file.d.ts.map +1 -1
  164. package/dist/esm/components/form/fields/form-field-file.js +34 -13
  165. package/dist/esm/components/form/fields/form-field-file.js.map +1 -1
  166. package/dist/esm/components/form/fields/form-field-file.labels.d.ts.map +1 -1
  167. package/dist/esm/components/form/fields/form-field-file.labels.js +46 -0
  168. package/dist/esm/components/form/fields/form-field-file.labels.js.map +1 -1
  169. package/dist/esm/components/form/fields/form-field-string-organization-role.d.ts +73 -0
  170. package/dist/esm/components/form/fields/form-field-string-organization-role.d.ts.map +1 -0
  171. package/dist/esm/components/form/fields/form-field-string-organization-role.js +64 -0
  172. package/dist/esm/components/form/fields/form-field-string-organization-role.js.map +1 -0
  173. package/dist/esm/components/form/fields/form-field-string.d.ts.map +1 -1
  174. package/dist/esm/components/form/fields/form-field-string.js +8 -1
  175. package/dist/esm/components/form/fields/form-field-string.js.map +1 -1
  176. package/dist/esm/components/form/fields/form-field-string.labels.d.ts.map +1 -1
  177. package/dist/esm/components/form/fields/form-field-string.labels.js +4 -0
  178. package/dist/esm/components/form/fields/form-field-string.labels.js.map +1 -1
  179. package/dist/esm/components/form/validation-errors/FormErrorSummary.js +1 -1
  180. package/dist/esm/components/form/validation-errors/FormErrorSummary.js.map +1 -1
  181. package/dist/esm/components/form/validation-errors/resolver-error-nesting.d.ts +31 -0
  182. package/dist/esm/components/form/validation-errors/resolver-error-nesting.d.ts.map +1 -0
  183. package/dist/esm/components/form/validation-errors/resolver-error-nesting.js +81 -0
  184. package/dist/esm/components/form/validation-errors/resolver-error-nesting.js.map +1 -0
  185. package/dist/esm/components/form/validation-errors/resource-error-notification-context.utils.d.ts +14 -1
  186. package/dist/esm/components/form/validation-errors/resource-error-notification-context.utils.d.ts.map +1 -1
  187. package/dist/esm/components/form/validation-errors/resource-error-notification-context.utils.js +14 -0
  188. package/dist/esm/components/form/validation-errors/resource-error-notification-context.utils.js.map +1 -1
  189. package/dist/esm/components/form/validation-errors/zod-issue-resolver.d.ts +22 -0
  190. package/dist/esm/components/form/validation-errors/zod-issue-resolver.d.ts.map +1 -1
  191. package/dist/esm/components/form/validation-errors/zod-issue-resolver.js +1 -22
  192. package/dist/esm/components/form/validation-errors/zod-issue-resolver.js.map +1 -1
  193. package/dist/esm/components/layout/resizable.d.ts +11 -0
  194. package/dist/esm/components/layout/resizable.d.ts.map +1 -1
  195. package/dist/esm/components/layout/resizable.js.map +1 -1
  196. package/dist/esm/components/navigation/app-level/ApplicationLevel_NavigationBack.d.ts +11 -1
  197. package/dist/esm/components/navigation/app-level/ApplicationLevel_NavigationBack.d.ts.map +1 -1
  198. package/dist/esm/components/navigation/app-level/ApplicationLevel_NavigationBack.js +15 -3
  199. package/dist/esm/components/navigation/app-level/ApplicationLevel_NavigationBack.js.map +1 -1
  200. package/dist/esm/components/navigation/app-level/ApplicationLevel_StatusBar.d.ts +2 -2
  201. package/dist/esm/components/navigation/app-level/ApplicationLevel_StatusBar.d.ts.map +1 -1
  202. package/dist/esm/components/navigation/app-level/ApplicationLevel_StatusBar.js.map +1 -1
  203. package/dist/esm/components/navigation/app-level/HostedComponentInteractionsProvider.d.ts +2 -2
  204. package/dist/esm/components/navigation/app-level/HostedComponentInteractionsProvider.js +2 -2
  205. package/dist/esm/components/navigation/app-level/HostedComponentInteractionsProvider.js.map +1 -1
  206. package/dist/esm/components/navigation/app-level/SidebarResourceBrowser.js +18 -20
  207. package/dist/esm/components/navigation/app-level/SidebarResourceBrowser.js.map +1 -1
  208. package/dist/esm/components/navigation/app-level/useCommandMenuBehavior.d.ts.map +1 -1
  209. package/dist/esm/components/navigation/app-level/useCommandMenuBehavior.js +7 -1
  210. package/dist/esm/components/navigation/app-level/useCommandMenuBehavior.js.map +1 -1
  211. package/dist/esm/components/navigation/app-level/useMenuBarBehavior.d.ts.map +1 -1
  212. package/dist/esm/components/navigation/app-level/useMenuBarBehavior.js +4 -1
  213. package/dist/esm/components/navigation/app-level/useMenuBarBehavior.js.map +1 -1
  214. package/dist/esm/components/navigation/app-level/useMenuUserOrgBehavior.d.ts.map +1 -1
  215. package/dist/esm/components/navigation/app-level/useMenuUserOrgBehavior.js +18 -2
  216. package/dist/esm/components/navigation/app-level/useMenuUserOrgBehavior.js.map +1 -1
  217. package/dist/esm/components/navigation/app-level/useSidebarBehavior.d.ts.map +1 -1
  218. package/dist/esm/components/navigation/app-level/useSidebarBehavior.js +82 -10
  219. package/dist/esm/components/navigation/app-level/useSidebarBehavior.js.map +1 -1
  220. package/dist/esm/components/navigation/app-level/useStatusBarBehavior.d.ts +2 -2
  221. package/dist/esm/components/navigation/app-level/useStatusBarBehavior.d.ts.map +1 -1
  222. package/dist/esm/components/navigation/app-level/useStatusBarBehavior.js.map +1 -1
  223. package/dist/esm/components/resources/ResourceCollectionQuickFilterTabs.d.ts.map +1 -1
  224. package/dist/esm/components/resources/ResourceCollectionQuickFilterTabs.js +8 -1
  225. package/dist/esm/components/resources/ResourceCollectionQuickFilterTabs.js.map +1 -1
  226. package/dist/esm/components/resources/ResourceCollectionToolbar.d.ts +8 -2
  227. package/dist/esm/components/resources/ResourceCollectionToolbar.d.ts.map +1 -1
  228. package/dist/esm/components/resources/ResourceCollectionToolbar.js +6 -2
  229. package/dist/esm/components/resources/ResourceCollectionToolbar.js.map +1 -1
  230. package/dist/esm/components/resources/ResourceLayout_Breadcrumb.d.ts.map +1 -1
  231. package/dist/esm/components/resources/ResourceLayout_Breadcrumb.js +31 -16
  232. package/dist/esm/components/resources/ResourceLayout_Breadcrumb.js.map +1 -1
  233. package/dist/esm/components/resources/ResourceLayout_ContainerDialogs.d.ts.map +1 -1
  234. package/dist/esm/components/resources/ResourceLayout_ContainerDialogs.js +23 -8
  235. package/dist/esm/components/resources/ResourceLayout_ContainerDialogs.js.map +1 -1
  236. package/dist/esm/components/resources/ResourceLayout_ContainerNested.js +2 -2
  237. package/dist/esm/components/resources/ResourceLayout_ContainerNested.js.map +1 -1
  238. package/dist/esm/components/resources/ResourceLayout_Header.d.ts +13 -0
  239. package/dist/esm/components/resources/ResourceLayout_Header.d.ts.map +1 -1
  240. package/dist/esm/components/resources/ResourceLayout_Header.js +55 -28
  241. package/dist/esm/components/resources/ResourceLayout_Header.js.map +1 -1
  242. package/dist/esm/components/resources/ResourceLayout_List.d.ts.map +1 -1
  243. package/dist/esm/components/resources/ResourceLayout_List.js +41 -20
  244. package/dist/esm/components/resources/ResourceLayout_List.js.map +1 -1
  245. package/dist/esm/components/resources/ResourceLayout_List.labels.d.ts.map +1 -1
  246. package/dist/esm/components/resources/ResourceLayout_List.labels.js +1 -2
  247. package/dist/esm/components/resources/ResourceLayout_List.labels.js.map +1 -1
  248. package/dist/esm/components/resources/ResourceLayout_Read.d.ts +9 -4
  249. package/dist/esm/components/resources/ResourceLayout_Read.d.ts.map +1 -1
  250. package/dist/esm/components/resources/ResourceLayout_Read.js +30 -11
  251. package/dist/esm/components/resources/ResourceLayout_Read.js.map +1 -1
  252. package/dist/esm/components/resources/ResourceLayout_ReadSummary.d.ts.map +1 -1
  253. package/dist/esm/components/resources/ResourceLayout_ReadSummary.js +4 -2
  254. package/dist/esm/components/resources/ResourceLayout_ReadSummary.js.map +1 -1
  255. package/dist/esm/components/resources/ResourceLayout_ReadSummary_TableRow.d.ts.map +1 -1
  256. package/dist/esm/components/resources/ResourceLayout_ReadSummary_TableRow.js +6 -2
  257. package/dist/esm/components/resources/ResourceLayout_ReadSummary_TableRow.js.map +1 -1
  258. package/dist/esm/components/resources/ResourceLayout_Search.d.ts.map +1 -1
  259. package/dist/esm/components/resources/ResourceLayout_Search.js +30 -14
  260. package/dist/esm/components/resources/ResourceLayout_Search.js.map +1 -1
  261. package/dist/esm/components/resources/ResourceLayout_SemanticOperationFallback.d.ts.map +1 -1
  262. package/dist/esm/components/resources/ResourceLayout_SemanticOperationFallback.js +14 -198
  263. package/dist/esm/components/resources/ResourceLayout_SemanticOperationFallback.js.map +1 -1
  264. package/dist/esm/components/resources/ResourceLayout_Update.d.ts +2 -2
  265. package/dist/esm/components/resources/ResourceLayout_Update.js +2 -2
  266. package/dist/esm/components/resources/ResourceLayout_Update.js.map +1 -1
  267. package/dist/esm/components/resources/ResourceListItemRenderer.d.ts.map +1 -1
  268. package/dist/esm/components/resources/ResourceListItemRenderer.js +69 -39
  269. package/dist/esm/components/resources/ResourceListItemRenderer.js.map +1 -1
  270. package/dist/esm/components/resources/ResourceOperationActionDropdown.d.ts +32 -0
  271. package/dist/esm/components/resources/ResourceOperationActionDropdown.d.ts.map +1 -0
  272. package/dist/esm/components/resources/ResourceOperationActionDropdown.js +130 -0
  273. package/dist/esm/components/resources/ResourceOperationActionDropdown.js.map +1 -0
  274. package/dist/esm/components/resources/collection-create-placement.utils.d.ts +32 -0
  275. package/dist/esm/components/resources/collection-create-placement.utils.d.ts.map +1 -0
  276. package/dist/esm/components/resources/collection-create-placement.utils.js +37 -0
  277. package/dist/esm/components/resources/collection-create-placement.utils.js.map +1 -0
  278. package/dist/esm/components/resources/embeds/RelatedResourcePreview.d.ts.map +1 -1
  279. package/dist/esm/components/resources/embeds/RelatedResourcePreview.js +5 -1
  280. package/dist/esm/components/resources/embeds/RelatedResourcePreview.js.map +1 -1
  281. package/dist/esm/components/resources/embeds/RelatedResourceSections.d.ts +8 -1
  282. package/dist/esm/components/resources/embeds/RelatedResourceSections.d.ts.map +1 -1
  283. package/dist/esm/components/resources/embeds/RelatedResourceSections.js +49 -2
  284. package/dist/esm/components/resources/embeds/RelatedResourceSections.js.map +1 -1
  285. package/dist/esm/components/resources/embeds/ResourceEmbeds.d.ts +22 -0
  286. package/dist/esm/components/resources/embeds/ResourceEmbeds.d.ts.map +1 -1
  287. package/dist/esm/components/resources/embeds/ResourceEmbeds.js +85 -2
  288. package/dist/esm/components/resources/embeds/ResourceEmbeds.js.map +1 -1
  289. package/dist/esm/components/resources/resourceLayout.utils.d.ts +14 -0
  290. package/dist/esm/components/resources/resourceLayout.utils.d.ts.map +1 -1
  291. package/dist/esm/components/resources/resourceLayout.utils.js +22 -0
  292. package/dist/esm/components/resources/resourceLayout.utils.js.map +1 -1
  293. package/dist/esm/components/resources/skeleton/ArrayField.d.ts.map +1 -1
  294. package/dist/esm/components/resources/skeleton/ArrayField.js +3 -0
  295. package/dist/esm/components/resources/skeleton/ArrayField.js.map +1 -1
  296. package/dist/esm/components/resources/skeleton/FormLayout.d.ts.map +1 -1
  297. package/dist/esm/components/resources/skeleton/FormLayout.js +33 -1
  298. package/dist/esm/components/resources/skeleton/FormLayout.js.map +1 -1
  299. package/dist/esm/components/resources/skeleton/ObjectScope.d.ts.map +1 -1
  300. package/dist/esm/components/resources/skeleton/ObjectScope.js +3 -0
  301. package/dist/esm/components/resources/skeleton/ObjectScope.js.map +1 -1
  302. package/dist/esm/components/resources/skeleton/Section.d.ts +12 -0
  303. package/dist/esm/components/resources/skeleton/Section.d.ts.map +1 -1
  304. package/dist/esm/components/resources/skeleton/Section.js +28 -2
  305. package/dist/esm/components/resources/skeleton/Section.js.map +1 -1
  306. package/dist/esm/components/resources/skeleton/SectionFieldsContext.d.ts +70 -0
  307. package/dist/esm/components/resources/skeleton/SectionFieldsContext.d.ts.map +1 -1
  308. package/dist/esm/components/resources/skeleton/SectionFieldsContext.js +157 -1
  309. package/dist/esm/components/resources/skeleton/SectionFieldsContext.js.map +1 -1
  310. package/dist/esm/components/resources/skeleton/WizardLayout.d.ts +6 -0
  311. package/dist/esm/components/resources/skeleton/WizardLayout.d.ts.map +1 -1
  312. package/dist/esm/components/resources/skeleton/WizardLayout.js +13 -2
  313. package/dist/esm/components/resources/skeleton/WizardLayout.js.map +1 -1
  314. package/dist/esm/components/resources/skeleton/WizardStep.d.ts.map +1 -1
  315. package/dist/esm/components/resources/skeleton/WizardStep.js +2 -1
  316. package/dist/esm/components/resources/skeleton/WizardStep.js.map +1 -1
  317. package/dist/esm/components/resources-fields/_presets/resource-reference/ResourceFieldDisplayPreset_ResourceReference_Default.d.ts.map +1 -1
  318. package/dist/esm/components/resources-fields/_presets/resource-reference/ResourceFieldDisplayPreset_ResourceReference_Default.js +61 -15
  319. package/dist/esm/components/resources-fields/_presets/resource-reference/ResourceFieldDisplayPreset_ResourceReference_Default.js.map +1 -1
  320. package/dist/esm/components/resources-fields/resource-reference/resource-reference.shared.utils.d.ts +24 -2
  321. package/dist/esm/components/resources-fields/resource-reference/resource-reference.shared.utils.d.ts.map +1 -1
  322. package/dist/esm/components/resources-fields/resource-reference/resource-reference.shared.utils.js +69 -1
  323. package/dist/esm/components/resources-fields/resource-reference/resource-reference.shared.utils.js.map +1 -1
  324. package/dist/esm/components/resources-fields/resource-reference/useResourceSearch.d.ts.map +1 -1
  325. package/dist/esm/components/resources-fields/resource-reference/useResourceSearch.js +18 -19
  326. package/dist/esm/components/resources-fields/resource-reference/useResourceSearch.js.map +1 -1
  327. package/dist/esm/components/sections/ContentSectionContainer.d.ts.map +1 -1
  328. package/dist/esm/components/sections/ContentSectionContainer.js +5 -4
  329. package/dist/esm/components/sections/ContentSectionContainer.js.map +1 -1
  330. package/dist/esm/components/sections/stepper.d.ts +5 -0
  331. package/dist/esm/components/sections/stepper.d.ts.map +1 -1
  332. package/dist/esm/components/sections/stepper.js.map +1 -1
  333. package/dist/esm/components/sections/surface.d.ts.map +1 -1
  334. package/dist/esm/components/sections/surface.js +12 -3
  335. package/dist/esm/components/sections/surface.js.map +1 -1
  336. package/dist/esm/components/settings/AppPage_AgentWorkOverrideRateSettings.d.ts +43 -0
  337. package/dist/esm/components/settings/AppPage_AgentWorkOverrideRateSettings.d.ts.map +1 -0
  338. package/dist/esm/components/settings/AppPage_AgentWorkOverrideRateSettings.js +129 -0
  339. package/dist/esm/components/settings/AppPage_AgentWorkOverrideRateSettings.js.map +1 -0
  340. package/dist/esm/components/settings/AppPage_AgentWorkOverrideRateSettings.labels.d.ts +3 -0
  341. package/dist/esm/components/settings/AppPage_AgentWorkOverrideRateSettings.labels.d.ts.map +1 -0
  342. package/dist/esm/components/settings/AppPage_AgentWorkOverrideRateSettings.labels.js +34 -0
  343. package/dist/esm/components/settings/AppPage_AgentWorkOverrideRateSettings.labels.js.map +1 -0
  344. package/dist/esm/components/settings/AppPage_AppearanceSettings.d.ts.map +1 -1
  345. package/dist/esm/components/settings/AppPage_AppearanceSettings.js +9 -11
  346. package/dist/esm/components/settings/AppPage_AppearanceSettings.js.map +1 -1
  347. package/dist/esm/components/settings/AppPage_AppearanceSettings.labels.d.ts.map +1 -1
  348. package/dist/esm/components/settings/AppPage_AppearanceSettings.labels.js +3 -2
  349. package/dist/esm/components/settings/AppPage_AppearanceSettings.labels.js.map +1 -1
  350. package/dist/esm/components/settings/AppPage_BillingSettings.d.ts +4 -2
  351. package/dist/esm/components/settings/AppPage_BillingSettings.d.ts.map +1 -1
  352. package/dist/esm/components/settings/AppPage_BillingSettings.js +21 -3
  353. package/dist/esm/components/settings/AppPage_BillingSettings.js.map +1 -1
  354. package/dist/esm/components/settings/AppPage_BillingSettings.labels.d.ts.map +1 -1
  355. package/dist/esm/components/settings/AppPage_BillingSettings.labels.js +5 -10
  356. package/dist/esm/components/settings/AppPage_BillingSettings.labels.js.map +1 -1
  357. package/dist/esm/components/settings/AppPage_ConnectedAccountsSettings.d.ts +58 -0
  358. package/dist/esm/components/settings/AppPage_ConnectedAccountsSettings.d.ts.map +1 -1
  359. package/dist/esm/components/settings/AppPage_ConnectedAccountsSettings.js +243 -40
  360. package/dist/esm/components/settings/AppPage_ConnectedAccountsSettings.js.map +1 -1
  361. package/dist/esm/components/settings/AppPage_ConnectedAccountsSettings.labels.d.ts.map +1 -1
  362. package/dist/esm/components/settings/AppPage_ConnectedAccountsSettings.labels.js +67 -6
  363. package/dist/esm/components/settings/AppPage_ConnectedAccountsSettings.labels.js.map +1 -1
  364. package/dist/esm/components/settings/AppPage_InvitationsSettings.d.ts.map +1 -1
  365. package/dist/esm/components/settings/AppPage_InvitationsSettings.js +19 -11
  366. package/dist/esm/components/settings/AppPage_InvitationsSettings.js.map +1 -1
  367. package/dist/esm/components/settings/AppPage_InvitationsSettings.labels.d.ts.map +1 -1
  368. package/dist/esm/components/settings/AppPage_InvitationsSettings.labels.js +4 -2
  369. package/dist/esm/components/settings/AppPage_InvitationsSettings.labels.js.map +1 -1
  370. package/dist/esm/components/settings/SettingsHub.d.ts.map +1 -1
  371. package/dist/esm/components/settings/SettingsHub.js +3 -0
  372. package/dist/esm/components/settings/SettingsHub.js.map +1 -1
  373. package/dist/esm/components/settings/SettingsResourceOperationPanel.d.ts.map +1 -1
  374. package/dist/esm/components/settings/SettingsResourceOperationPanel.js +16 -1
  375. package/dist/esm/components/settings/SettingsResourceOperationPanel.js.map +1 -1
  376. package/dist/esm/components/settings/useOwnerProviderConnections.d.ts +59 -0
  377. package/dist/esm/components/settings/useOwnerProviderConnections.d.ts.map +1 -0
  378. package/dist/esm/components/settings/useOwnerProviderConnections.js +136 -0
  379. package/dist/esm/components/settings/useOwnerProviderConnections.js.map +1 -0
  380. package/dist/esm/components/views/chart-view/chart-view.utils.d.ts +5 -0
  381. package/dist/esm/components/views/chart-view/chart-view.utils.d.ts.map +1 -1
  382. package/dist/esm/components/views/chart-view/chart-view.utils.js +5 -0
  383. package/dist/esm/components/views/chart-view/chart-view.utils.js.map +1 -1
  384. package/dist/esm/components/views/chart-view/useResourceChartData.d.ts +50 -0
  385. package/dist/esm/components/views/chart-view/useResourceChartData.d.ts.map +1 -0
  386. package/dist/esm/components/views/chart-view/useResourceChartData.js +72 -0
  387. package/dist/esm/components/views/chart-view/useResourceChartData.js.map +1 -0
  388. package/dist/esm/components/views/composite-view/CompositeLayout.d.ts.map +1 -1
  389. package/dist/esm/components/views/composite-view/CompositeLayout.js +2 -1
  390. package/dist/esm/components/views/composite-view/CompositeLayout.js.map +1 -1
  391. package/dist/esm/core/app-shell/AppShellBuildingBlocks.d.ts +86 -0
  392. package/dist/esm/core/app-shell/AppShellBuildingBlocks.d.ts.map +1 -0
  393. package/dist/esm/core/app-shell/AppShellBuildingBlocks.js +187 -0
  394. package/dist/esm/core/app-shell/AppShellBuildingBlocks.js.map +1 -0
  395. package/dist/esm/core/app-shell/PortalContainerContext.d.ts +5 -2
  396. package/dist/esm/core/app-shell/PortalContainerContext.d.ts.map +1 -1
  397. package/dist/esm/core/app-shell/PortalContainerContext.js +5 -2
  398. package/dist/esm/core/app-shell/PortalContainerContext.js.map +1 -1
  399. package/dist/esm/core/app-shell/app-shell.schemas.d.ts +18 -9
  400. package/dist/esm/core/app-shell/app-shell.schemas.d.ts.map +1 -1
  401. package/dist/esm/core/app-shell/app-shell.schemas.js +1 -0
  402. package/dist/esm/core/app-shell/app-shell.schemas.js.map +1 -1
  403. package/dist/esm/core/app-shell/useAppShellLayout.d.ts +10 -0
  404. package/dist/esm/core/app-shell/useAppShellLayout.d.ts.map +1 -1
  405. package/dist/esm/core/app-shell/useAppShellLayout.js +28 -5
  406. package/dist/esm/core/app-shell/useAppShellLayout.js.map +1 -1
  407. package/dist/esm/core/app-shell/usePublicShellLayout.d.ts.map +1 -1
  408. package/dist/esm/core/app-shell/usePublicShellLayout.js +38 -0
  409. package/dist/esm/core/app-shell/usePublicShellLayout.js.map +1 -1
  410. package/dist/esm/core/automated-layout/automated-layout.frontend.utils.d.ts +15 -1
  411. package/dist/esm/core/automated-layout/automated-layout.frontend.utils.d.ts.map +1 -1
  412. package/dist/esm/core/automated-layout/automated-layout.frontend.utils.js +47 -13
  413. package/dist/esm/core/automated-layout/automated-layout.frontend.utils.js.map +1 -1
  414. package/dist/esm/core/billing/BillingContext.d.ts +25 -2
  415. package/dist/esm/core/billing/BillingContext.d.ts.map +1 -1
  416. package/dist/esm/core/billing/BillingContext.js +16 -25
  417. package/dist/esm/core/billing/BillingContext.js.map +1 -1
  418. package/dist/esm/core/billing/billing-provider-display.frontend.utils.d.ts +11 -3
  419. package/dist/esm/core/billing/billing-provider-display.frontend.utils.d.ts.map +1 -1
  420. package/dist/esm/core/billing/billing-provider-display.frontend.utils.js +14 -8
  421. package/dist/esm/core/billing/billing-provider-display.frontend.utils.js.map +1 -1
  422. package/dist/esm/core/billing/useBillingPlanChange.d.ts.map +1 -1
  423. package/dist/esm/core/billing/useBillingPlanChange.js +2 -0
  424. package/dist/esm/core/billing/useBillingPlanChange.js.map +1 -1
  425. package/dist/esm/core/components-registry/assert-registry-completeness.frontend.helper.d.ts.map +1 -1
  426. package/dist/esm/core/components-registry/assert-registry-completeness.frontend.helper.js +1 -0
  427. package/dist/esm/core/components-registry/assert-registry-completeness.frontend.helper.js.map +1 -1
  428. package/dist/esm/core/components-registry/provider-component-registry.frontend.service.d.ts +29 -229
  429. package/dist/esm/core/components-registry/provider-component-registry.frontend.service.d.ts.map +1 -1
  430. package/dist/esm/core/components-registry/provider-component-registry.frontend.service.js +29 -327
  431. package/dist/esm/core/components-registry/provider-component-registry.frontend.service.js.map +1 -1
  432. package/dist/esm/core/components-registry/useProviderComponent.frontend.hooks.d.ts +17 -27
  433. package/dist/esm/core/components-registry/useProviderComponent.frontend.hooks.d.ts.map +1 -1
  434. package/dist/esm/core/components-registry/useProviderComponent.frontend.hooks.js +28 -48
  435. package/dist/esm/core/components-registry/useProviderComponent.frontend.hooks.js.map +1 -1
  436. package/dist/esm/core/config/app-configuration-frontend.schemas.d.ts +21 -11
  437. package/dist/esm/core/config/app-configuration-frontend.schemas.d.ts.map +1 -1
  438. package/dist/esm/core/config/app-configuration-frontend.schemas.js +4 -4
  439. package/dist/esm/core/config/app-configuration-frontend.schemas.js.map +1 -1
  440. package/dist/esm/core/config/app-level-components.frontend.schemas.d.ts +17 -0
  441. package/dist/esm/core/config/app-level-components.frontend.schemas.d.ts.map +1 -1
  442. package/dist/esm/core/config/app-level-components.frontend.schemas.js +17 -0
  443. package/dist/esm/core/config/app-level-components.frontend.schemas.js.map +1 -1
  444. package/dist/esm/core/config/chart-view.frontend.schemas.d.ts +10 -10
  445. package/dist/esm/core/config/engine-settings-destinations.d.ts.map +1 -1
  446. package/dist/esm/core/config/engine-settings-destinations.js +221 -6
  447. package/dist/esm/core/config/engine-settings-destinations.js.map +1 -1
  448. package/dist/esm/core/config/launcher-items.frontend.schemas.d.ts +8 -0
  449. package/dist/esm/core/config/launcher-items.frontend.schemas.d.ts.map +1 -1
  450. package/dist/esm/core/config/launcher-items.frontend.schemas.js +1 -0
  451. package/dist/esm/core/config/launcher-items.frontend.schemas.js.map +1 -1
  452. package/dist/esm/core/config/settings-hub.frontend.schemas.d.ts +10 -1
  453. package/dist/esm/core/config/settings-hub.frontend.schemas.d.ts.map +1 -1
  454. package/dist/esm/core/config/settings-hub.frontend.schemas.js +9 -0
  455. package/dist/esm/core/config/settings-hub.frontend.schemas.js.map +1 -1
  456. package/dist/esm/core/config/verify-launcher-content.d.ts.map +1 -1
  457. package/dist/esm/core/config/verify-launcher-content.js +30 -19
  458. package/dist/esm/core/config/verify-launcher-content.js.map +1 -1
  459. package/dist/esm/core/errors/ErrorContext.d.ts.map +1 -1
  460. package/dist/esm/core/errors/ErrorContext.js +9 -1
  461. package/dist/esm/core/errors/ErrorContext.js.map +1 -1
  462. package/dist/esm/core/errors/GlobalErrorHandler.d.ts.map +1 -1
  463. package/dist/esm/core/errors/GlobalErrorHandler.js +5 -4
  464. package/dist/esm/core/errors/GlobalErrorHandler.js.map +1 -1
  465. package/dist/esm/core/errors/RouterErrorBoundary.js +1 -1
  466. package/dist/esm/core/errors/RouterErrorBoundary.js.map +1 -1
  467. package/dist/esm/core/errors/errors-builder.frontend.services.d.ts +2 -2
  468. package/dist/esm/core/errors/errors-builder.frontend.services.d.ts.map +1 -1
  469. package/dist/esm/core/errors/errors-builder.frontend.services.js +4 -4
  470. package/dist/esm/core/errors/errors-builder.frontend.services.js.map +1 -1
  471. package/dist/esm/core/errors/user-facing-error-message.frontend.utils.js +1 -1
  472. package/dist/esm/core/errors/user-facing-error-message.frontend.utils.js.map +1 -1
  473. package/dist/esm/core/events/NotificationContext.d.ts.map +1 -1
  474. package/dist/esm/core/events/NotificationContext.js +23 -5
  475. package/dist/esm/core/events/NotificationContext.js.map +1 -1
  476. package/dist/esm/core/events/events.frontend.schemas.d.ts +110 -43
  477. package/dist/esm/core/events/events.frontend.schemas.d.ts.map +1 -1
  478. package/dist/esm/core/events/events.frontend.schemas.js +89 -15
  479. package/dist/esm/core/events/events.frontend.schemas.js.map +1 -1
  480. package/dist/esm/core/execution/useExecutionParticipationRMM.d.ts +2 -0
  481. package/dist/esm/core/execution/useExecutionParticipationRMM.d.ts.map +1 -1
  482. package/dist/esm/core/execution/useExecutionParticipationRMM.js +2 -1
  483. package/dist/esm/core/execution/useExecutionParticipationRMM.js.map +1 -1
  484. package/dist/esm/core/execution/useExecutionResourceOperationSurface.d.ts +1 -1
  485. package/dist/esm/core/execution/useExecutionResourceOperationSurface.d.ts.map +1 -1
  486. package/dist/esm/core/execution/useExecutionResourceOperationSurface.js +5 -2
  487. package/dist/esm/core/execution/useExecutionResourceOperationSurface.js.map +1 -1
  488. package/dist/esm/core/external-providers/ConsentBasedProviderSdks.d.ts +63 -0
  489. package/dist/esm/core/external-providers/ConsentBasedProviderSdks.d.ts.map +1 -0
  490. package/dist/esm/core/external-providers/ConsentBasedProviderSdks.js +131 -0
  491. package/dist/esm/core/external-providers/ConsentBasedProviderSdks.js.map +1 -0
  492. package/dist/esm/core/external-providers/ProviderAddressLookupCombobox.d.ts +61 -0
  493. package/dist/esm/core/external-providers/ProviderAddressLookupCombobox.d.ts.map +1 -0
  494. package/dist/esm/core/external-providers/ProviderAddressLookupCombobox.js +178 -0
  495. package/dist/esm/core/external-providers/ProviderAddressLookupCombobox.js.map +1 -0
  496. package/dist/esm/core/external-providers/ProviderAddressLookupHost.d.ts +52 -0
  497. package/dist/esm/core/external-providers/ProviderAddressLookupHost.d.ts.map +1 -0
  498. package/dist/esm/core/external-providers/ProviderAddressLookupHost.js +144 -0
  499. package/dist/esm/core/external-providers/ProviderAddressLookupHost.js.map +1 -0
  500. package/dist/esm/core/external-providers/ProviderFilePickerHost.d.ts +22 -1
  501. package/dist/esm/core/external-providers/ProviderFilePickerHost.d.ts.map +1 -1
  502. package/dist/esm/core/external-providers/ProviderFilePickerHost.js +23 -3
  503. package/dist/esm/core/external-providers/ProviderFilePickerHost.js.map +1 -1
  504. package/dist/esm/core/external-providers/provider-address-lookup-selection.frontend.utils.d.ts +55 -0
  505. package/dist/esm/core/external-providers/provider-address-lookup-selection.frontend.utils.d.ts.map +1 -0
  506. package/dist/esm/core/external-providers/provider-address-lookup-selection.frontend.utils.js +65 -0
  507. package/dist/esm/core/external-providers/provider-address-lookup-selection.frontend.utils.js.map +1 -0
  508. package/dist/esm/core/external-providers/provider-scope-reauthorization-offers.frontend.d.ts +63 -0
  509. package/dist/esm/core/external-providers/provider-scope-reauthorization-offers.frontend.d.ts.map +1 -0
  510. package/dist/esm/core/external-providers/provider-scope-reauthorization-offers.frontend.js +100 -0
  511. package/dist/esm/core/external-providers/provider-scope-reauthorization-offers.frontend.js.map +1 -0
  512. package/dist/esm/core/flows-actors/FlowsActorsContext.d.ts +45 -7
  513. package/dist/esm/core/flows-actors/FlowsActorsContext.d.ts.map +1 -1
  514. package/dist/esm/core/flows-actors/FlowsActorsContext.js +112 -28
  515. package/dist/esm/core/flows-actors/FlowsActorsContext.js.map +1 -1
  516. package/dist/esm/core/flows-actors/usePendingDecisions.d.ts +32 -0
  517. package/dist/esm/core/flows-actors/usePendingDecisions.d.ts.map +1 -0
  518. package/dist/esm/core/flows-actors/usePendingDecisions.js +91 -0
  519. package/dist/esm/core/flows-actors/usePendingDecisions.js.map +1 -0
  520. package/dist/esm/core/guidance/GuidanceRenderer.d.ts.map +1 -1
  521. package/dist/esm/core/guidance/GuidanceRenderer.js +3 -2
  522. package/dist/esm/core/guidance/GuidanceRenderer.js.map +1 -1
  523. package/dist/esm/core/i18n/I18nContext.d.ts +22 -8
  524. package/dist/esm/core/i18n/I18nContext.d.ts.map +1 -1
  525. package/dist/esm/core/i18n/I18nContext.js +21 -9
  526. package/dist/esm/core/i18n/I18nContext.js.map +1 -1
  527. package/dist/esm/core/i18n/component-label-resolution.utils.d.ts +5 -3
  528. package/dist/esm/core/i18n/component-label-resolution.utils.d.ts.map +1 -1
  529. package/dist/esm/core/i18n/component-label-resolution.utils.js +5 -3
  530. package/dist/esm/core/i18n/component-label-resolution.utils.js.map +1 -1
  531. package/dist/esm/core/i18n/useI18n.d.ts +2 -1
  532. package/dist/esm/core/i18n/useI18n.d.ts.map +1 -1
  533. package/dist/esm/core/i18n/useI18n.js +2 -1
  534. package/dist/esm/core/i18n/useI18n.js.map +1 -1
  535. package/dist/esm/core/loading/LoadingContext.d.ts.map +1 -1
  536. package/dist/esm/core/loading/LoadingContext.js +7 -1
  537. package/dist/esm/core/loading/LoadingContext.js.map +1 -1
  538. package/dist/esm/core/loading/LoadingGate.d.ts.map +1 -1
  539. package/dist/esm/core/loading/LoadingGate.js +19 -1
  540. package/dist/esm/core/loading/LoadingGate.js.map +1 -1
  541. package/dist/esm/core/monitoring/analytics/AnalyticsContext.d.ts +15 -2
  542. package/dist/esm/core/monitoring/analytics/AnalyticsContext.d.ts.map +1 -1
  543. package/dist/esm/core/monitoring/analytics/AnalyticsContext.js +183 -20
  544. package/dist/esm/core/monitoring/analytics/AnalyticsContext.js.map +1 -1
  545. package/dist/esm/core/monitoring/analytics/AnalyticsEventBridge.js +2 -2
  546. package/dist/esm/core/monitoring/analytics/AnalyticsEventBridge.js.map +1 -1
  547. package/dist/esm/core/monitoring/analytics/analytics-provider-registry.frontend.service.d.ts +7 -15
  548. package/dist/esm/core/monitoring/analytics/analytics-provider-registry.frontend.service.d.ts.map +1 -1
  549. package/dist/esm/core/monitoring/analytics/analytics-provider-registry.frontend.service.js +8 -26
  550. package/dist/esm/core/monitoring/analytics/analytics-provider-registry.frontend.service.js.map +1 -1
  551. package/dist/esm/core/monitoring/analytics/analytics-provider.frontend.interface.d.ts +12 -3
  552. package/dist/esm/core/monitoring/analytics/analytics-provider.frontend.interface.d.ts.map +1 -1
  553. package/dist/esm/core/monitoring/analytics/analytics-provider.frontend.interface.js +3 -2
  554. package/dist/esm/core/monitoring/analytics/analytics-provider.frontend.interface.js.map +1 -1
  555. package/dist/esm/core/monitoring/analytics/providers/backend-proxy-analytics.provider.d.ts +42 -0
  556. package/dist/esm/core/monitoring/analytics/providers/backend-proxy-analytics.provider.d.ts.map +1 -1
  557. package/dist/esm/core/monitoring/analytics/providers/backend-proxy-analytics.provider.js +89 -5
  558. package/dist/esm/core/monitoring/analytics/providers/backend-proxy-analytics.provider.js.map +1 -1
  559. package/dist/esm/core/monitoring/analytics/providers/console-analytics.provider.d.ts +2 -0
  560. package/dist/esm/core/monitoring/analytics/providers/console-analytics.provider.d.ts.map +1 -1
  561. package/dist/esm/core/monitoring/analytics/providers/console-analytics.provider.js +2 -0
  562. package/dist/esm/core/monitoring/analytics/providers/console-analytics.provider.js.map +1 -1
  563. package/dist/esm/core/navigation/NavigationContentAreas.d.ts +78 -0
  564. package/dist/esm/core/navigation/NavigationContentAreas.d.ts.map +1 -1
  565. package/dist/esm/core/navigation/NavigationContentAreas.js +264 -16
  566. package/dist/esm/core/navigation/NavigationContentAreas.js.map +1 -1
  567. package/dist/esm/core/navigation/NavigationContext.d.ts +8 -0
  568. package/dist/esm/core/navigation/NavigationContext.d.ts.map +1 -1
  569. package/dist/esm/core/navigation/NavigationContext.js +137 -30
  570. package/dist/esm/core/navigation/NavigationContext.js.map +1 -1
  571. package/dist/esm/core/navigation/launcher-resolution.d.ts +2 -0
  572. package/dist/esm/core/navigation/launcher-resolution.d.ts.map +1 -1
  573. package/dist/esm/core/navigation/launcher-resolution.js +1 -0
  574. package/dist/esm/core/navigation/launcher-resolution.js.map +1 -1
  575. package/dist/esm/core/navigation/navigation-cascade.d.ts +46 -0
  576. package/dist/esm/core/navigation/navigation-cascade.d.ts.map +1 -0
  577. package/dist/esm/core/navigation/navigation-cascade.js +222 -0
  578. package/dist/esm/core/navigation/navigation-cascade.js.map +1 -0
  579. package/dist/esm/core/navigation/navigation-clean-break.frontend.utils.d.ts.map +1 -1
  580. package/dist/esm/core/navigation/navigation-clean-break.frontend.utils.js +21 -2
  581. package/dist/esm/core/navigation/navigation-clean-break.frontend.utils.js.map +1 -1
  582. package/dist/esm/core/navigation/navigation-controller-internals.d.ts +71 -0
  583. package/dist/esm/core/navigation/navigation-controller-internals.d.ts.map +1 -0
  584. package/dist/esm/core/navigation/navigation-controller-internals.js +84 -0
  585. package/dist/esm/core/navigation/navigation-controller-internals.js.map +1 -0
  586. package/dist/esm/core/navigation/navigation-policy-resolver.service.d.ts +86 -2
  587. package/dist/esm/core/navigation/navigation-policy-resolver.service.d.ts.map +1 -1
  588. package/dist/esm/core/navigation/navigation-policy-resolver.service.js +242 -124
  589. package/dist/esm/core/navigation/navigation-policy-resolver.service.js.map +1 -1
  590. package/dist/esm/core/navigation/navigation.schemas.d.ts +170 -8
  591. package/dist/esm/core/navigation/navigation.schemas.d.ts.map +1 -1
  592. package/dist/esm/core/navigation/navigation.schemas.js +121 -2
  593. package/dist/esm/core/navigation/navigation.schemas.js.map +1 -1
  594. package/dist/esm/core/navigation/navigation.utils.d.ts +102 -6
  595. package/dist/esm/core/navigation/navigation.utils.d.ts.map +1 -1
  596. package/dist/esm/core/navigation/navigation.utils.js +283 -34
  597. package/dist/esm/core/navigation/navigation.utils.js.map +1 -1
  598. package/dist/esm/core/navigation/useIsStackEntryActive.d.ts +0 -10
  599. package/dist/esm/core/navigation/useIsStackEntryActive.d.ts.map +0 -1
  600. package/dist/esm/core/navigation/useIsStackEntryActive.js.map +0 -1
  601. package/dist/esm/core/navigation/useNavigationController.d.ts +28 -157
  602. package/dist/esm/core/navigation/useNavigationController.d.ts.map +1 -1
  603. package/dist/esm/core/navigation/useNavigationController.js +211 -1189
  604. package/dist/esm/core/navigation/useNavigationController.js.map +1 -1
  605. package/dist/esm/core/navigation/useNavigationRouterSync.d.ts +174 -0
  606. package/dist/esm/core/navigation/useNavigationRouterSync.d.ts.map +1 -0
  607. package/dist/esm/core/navigation/useNavigationRouterSync.js +977 -0
  608. package/dist/esm/core/navigation/useNavigationRouterSync.js.map +1 -0
  609. package/dist/esm/core/navigation/useOverlayTitle.d.ts +13 -1
  610. package/dist/esm/core/navigation/useOverlayTitle.d.ts.map +1 -1
  611. package/dist/esm/core/navigation/useOverlayTitle.js +15 -10
  612. package/dist/esm/core/navigation/useOverlayTitle.js.map +1 -1
  613. package/dist/esm/core/navigation/useResponsiveZoneMigration.d.ts +43 -0
  614. package/dist/esm/core/navigation/useResponsiveZoneMigration.d.ts.map +1 -0
  615. package/dist/esm/core/navigation/useResponsiveZoneMigration.js +44 -0
  616. package/dist/esm/core/navigation/useResponsiveZoneMigration.js.map +1 -0
  617. package/dist/esm/core/navigation/zone-collapse-migration.d.ts +83 -0
  618. package/dist/esm/core/navigation/zone-collapse-migration.d.ts.map +1 -0
  619. package/dist/esm/core/navigation/zone-collapse-migration.js +116 -0
  620. package/dist/esm/core/navigation/zone-collapse-migration.js.map +1 -0
  621. package/dist/esm/core/navigation/zone-collapse.d.ts +51 -0
  622. package/dist/esm/core/navigation/zone-collapse.d.ts.map +1 -0
  623. package/dist/esm/core/navigation/zone-collapse.js +59 -0
  624. package/dist/esm/core/navigation/zone-collapse.js.map +1 -0
  625. package/dist/esm/core/navigation/zone-emphasis.d.ts +3 -0
  626. package/dist/esm/core/navigation/zone-emphasis.d.ts.map +1 -1
  627. package/dist/esm/core/navigation/zone-emphasis.js +26 -4
  628. package/dist/esm/core/navigation/zone-emphasis.js.map +1 -1
  629. package/dist/esm/core/navigation/zone-visible-entry.d.ts +22 -0
  630. package/dist/esm/core/navigation/zone-visible-entry.d.ts.map +1 -1
  631. package/dist/esm/core/navigation/zone-visible-entry.js +25 -0
  632. package/dist/esm/core/navigation/zone-visible-entry.js.map +1 -1
  633. package/dist/esm/core/requests/websockets/WebSocketContext.d.ts.map +1 -1
  634. package/dist/esm/core/requests/websockets/WebSocketContext.js +53 -18
  635. package/dist/esm/core/requests/websockets/WebSocketContext.js.map +1 -1
  636. package/dist/esm/core/requests/websockets/WebSocketEventBridge.d.ts.map +1 -1
  637. package/dist/esm/core/requests/websockets/WebSocketEventBridge.js +3 -1
  638. package/dist/esm/core/requests/websockets/WebSocketEventBridge.js.map +1 -1
  639. package/dist/esm/core/requests/websockets/useNotificationBadges.d.ts +22 -0
  640. package/dist/esm/core/requests/websockets/useNotificationBadges.d.ts.map +1 -1
  641. package/dist/esm/core/requests/websockets/useNotificationBadges.js +72 -3
  642. package/dist/esm/core/requests/websockets/useNotificationBadges.js.map +1 -1
  643. package/dist/esm/core/requests/websockets/usePublishNotificationBadgeCount.d.ts +28 -0
  644. package/dist/esm/core/requests/websockets/usePublishNotificationBadgeCount.d.ts.map +1 -0
  645. package/dist/esm/core/requests/websockets/usePublishNotificationBadgeCount.js +86 -0
  646. package/dist/esm/core/requests/websockets/usePublishNotificationBadgeCount.js.map +1 -0
  647. package/dist/esm/core/requests/wildo-http-client-manual-calls.frontend.service.d.ts +38 -3
  648. package/dist/esm/core/requests/wildo-http-client-manual-calls.frontend.service.d.ts.map +1 -1
  649. package/dist/esm/core/requests/wildo-http-client-manual-calls.frontend.service.js +57 -2
  650. package/dist/esm/core/requests/wildo-http-client-manual-calls.frontend.service.js.map +1 -1
  651. package/dist/esm/core/requests/wildo-http-client-resources.frontend.service.d.ts.map +1 -1
  652. package/dist/esm/core/requests/wildo-http-client-resources.frontend.service.js +4 -2
  653. package/dist/esm/core/requests/wildo-http-client-resources.frontend.service.js.map +1 -1
  654. package/dist/esm/core/requests/wildo-http-client.frontend.service.d.ts +30 -1
  655. package/dist/esm/core/requests/wildo-http-client.frontend.service.d.ts.map +1 -1
  656. package/dist/esm/core/requests/wildo-http-client.frontend.service.js +47 -4
  657. package/dist/esm/core/requests/wildo-http-client.frontend.service.js.map +1 -1
  658. package/dist/esm/core/resources/ResourceRegistryContext.d.ts.map +1 -1
  659. package/dist/esm/core/resources/ResourceRegistryContext.js +22 -1
  660. package/dist/esm/core/resources/ResourceRegistryContext.js.map +1 -1
  661. package/dist/esm/core/resources/context-resource-identifiers.frontend.utils.js +1 -1
  662. package/dist/esm/core/resources/context-resource-identifiers.frontend.utils.js.map +1 -1
  663. package/dist/esm/core/resources/frontend-resource.utils.d.ts +22 -1
  664. package/dist/esm/core/resources/frontend-resource.utils.d.ts.map +1 -1
  665. package/dist/esm/core/resources/frontend-resource.utils.js +25 -2
  666. package/dist/esm/core/resources/frontend-resource.utils.js.map +1 -1
  667. package/dist/esm/core/resources/operation-semantics.frontend.utils.d.ts +113 -13
  668. package/dist/esm/core/resources/operation-semantics.frontend.utils.d.ts.map +1 -1
  669. package/dist/esm/core/resources/operation-semantics.frontend.utils.js +173 -20
  670. package/dist/esm/core/resources/operation-semantics.frontend.utils.js.map +1 -1
  671. package/dist/esm/core/resources/relationship-surface-runtime.frontend.utils.d.ts +11 -0
  672. package/dist/esm/core/resources/relationship-surface-runtime.frontend.utils.d.ts.map +1 -1
  673. package/dist/esm/core/resources/relationship-surface-runtime.frontend.utils.js +7 -0
  674. package/dist/esm/core/resources/relationship-surface-runtime.frontend.utils.js.map +1 -1
  675. package/dist/esm/core/resources/resource-label-field-paths.frontend.utils.d.ts +3 -2
  676. package/dist/esm/core/resources/resource-label-field-paths.frontend.utils.d.ts.map +1 -1
  677. package/dist/esm/core/resources/resource-label-field-paths.frontend.utils.js +13 -5
  678. package/dist/esm/core/resources/resource-label-field-paths.frontend.utils.js.map +1 -1
  679. package/dist/esm/core/resources/resources-repository.frontend.service.d.ts +6 -0
  680. package/dist/esm/core/resources/resources-repository.frontend.service.d.ts.map +1 -1
  681. package/dist/esm/core/resources/resources-repository.frontend.service.js +90 -1
  682. package/dist/esm/core/resources/resources-repository.frontend.service.js.map +1 -1
  683. package/dist/esm/core/resources/resources.frontend.schemas.d.ts +139 -16
  684. package/dist/esm/core/resources/resources.frontend.schemas.d.ts.map +1 -1
  685. package/dist/esm/core/resources/resources.frontend.schemas.js +110 -11
  686. package/dist/esm/core/resources/resources.frontend.schemas.js.map +1 -1
  687. package/dist/esm/core/resources/rmm/ResourceMutationManager.d.ts.map +1 -1
  688. package/dist/esm/core/resources/rmm/ResourceMutationManager.js +3 -1
  689. package/dist/esm/core/resources/rmm/ResourceMutationManager.js.map +1 -1
  690. package/dist/esm/core/resources/rmm/update-like-mutation-fallback.frontend.d.ts +10 -0
  691. package/dist/esm/core/resources/rmm/update-like-mutation-fallback.frontend.d.ts.map +1 -1
  692. package/dist/esm/core/resources/rmm/update-like-mutation-fallback.frontend.js +8 -0
  693. package/dist/esm/core/resources/rmm/update-like-mutation-fallback.frontend.js.map +1 -1
  694. package/dist/esm/core/resources/rmm/useResourceRMM.d.ts +7 -0
  695. package/dist/esm/core/resources/rmm/useResourceRMM.d.ts.map +1 -1
  696. package/dist/esm/core/resources/rmm/useResourceRMM.js +9 -2
  697. package/dist/esm/core/resources/rmm/useResourceRMM.js.map +1 -1
  698. package/dist/esm/core/resources/useOperationDirectExecution.d.ts +59 -0
  699. package/dist/esm/core/resources/useOperationDirectExecution.d.ts.map +1 -0
  700. package/dist/esm/core/resources/useOperationDirectExecution.js +278 -0
  701. package/dist/esm/core/resources/useOperationDirectExecution.js.map +1 -0
  702. package/dist/esm/core/resources/useResourceOperationActions.d.ts +1 -1
  703. package/dist/esm/core/resources/useResourceOperationActions.d.ts.map +1 -1
  704. package/dist/esm/core/resources/useResourceOperationActions.js +69 -22
  705. package/dist/esm/core/resources/useResourceOperationActions.js.map +1 -1
  706. package/dist/esm/core/resources/useResourceOperationSurface.d.ts +8 -6
  707. package/dist/esm/core/resources/useResourceOperationSurface.d.ts.map +1 -1
  708. package/dist/esm/core/resources/useResourceOperationSurface.js +3 -2
  709. package/dist/esm/core/resources/useResourceOperationSurface.js.map +1 -1
  710. package/dist/esm/core/runtime/AppRouter.d.ts.map +1 -1
  711. package/dist/esm/core/runtime/AppRouter.js +23 -2
  712. package/dist/esm/core/runtime/AppRouter.js.map +1 -1
  713. package/dist/esm/core/runtime/ApplicationContext.shared.d.ts +4 -2
  714. package/dist/esm/core/runtime/ApplicationContext.shared.d.ts.map +1 -1
  715. package/dist/esm/core/runtime/ApplicationContext.shared.js.map +1 -1
  716. package/dist/esm/core/runtime/ApplicationMainContext.d.ts +12 -2
  717. package/dist/esm/core/runtime/ApplicationMainContext.d.ts.map +1 -1
  718. package/dist/esm/core/runtime/ApplicationMainContext.js +5 -2
  719. package/dist/esm/core/runtime/ApplicationMainContext.js.map +1 -1
  720. package/dist/esm/core/runtime/domain-module.frontend.definitions.d.ts +25 -1
  721. package/dist/esm/core/runtime/domain-module.frontend.definitions.d.ts.map +1 -1
  722. package/dist/esm/core/runtime/domain-module.frontend.definitions.js +37 -1
  723. package/dist/esm/core/runtime/domain-module.frontend.definitions.js.map +1 -1
  724. package/dist/esm/core/runtime/start-application.frontend.service.d.ts +21 -2
  725. package/dist/esm/core/runtime/start-application.frontend.service.d.ts.map +1 -1
  726. package/dist/esm/core/runtime/start-application.frontend.service.js +51 -4
  727. package/dist/esm/core/runtime/start-application.frontend.service.js.map +1 -1
  728. package/dist/esm/core/security/AuthSessionContext.d.ts +11 -0
  729. package/dist/esm/core/security/AuthSessionContext.d.ts.map +1 -1
  730. package/dist/esm/core/security/AuthSessionContext.js +70 -22
  731. package/dist/esm/core/security/AuthSessionContext.js.map +1 -1
  732. package/dist/esm/core/security/StepUpAuthContext.d.ts.map +1 -1
  733. package/dist/esm/core/security/StepUpAuthContext.js +10 -2
  734. package/dist/esm/core/security/StepUpAuthContext.js.map +1 -1
  735. package/dist/esm/core/security/UserOrgsContext.d.ts.map +1 -1
  736. package/dist/esm/core/security/UserOrgsContext.js +72 -8
  737. package/dist/esm/core/security/UserOrgsContext.js.map +1 -1
  738. package/dist/esm/core/security/route-organization-access.frontend.utils.d.ts +7 -0
  739. package/dist/esm/core/security/route-organization-access.frontend.utils.d.ts.map +1 -1
  740. package/dist/esm/core/security/route-organization-access.frontend.utils.js +8 -2
  741. package/dist/esm/core/security/route-organization-access.frontend.utils.js.map +1 -1
  742. package/dist/esm/core/security/useGrantedConsentPurposes.d.ts +30 -0
  743. package/dist/esm/core/security/useGrantedConsentPurposes.d.ts.map +1 -0
  744. package/dist/esm/core/security/useGrantedConsentPurposes.js +38 -0
  745. package/dist/esm/core/security/useGrantedConsentPurposes.js.map +1 -0
  746. package/dist/esm/core/ui/UIContext.d.ts.map +1 -1
  747. package/dist/esm/core/ui/UIContext.js +10 -6
  748. package/dist/esm/core/ui/UIContext.js.map +1 -1
  749. package/dist/esm/core/ui/color-conversion.utils.d.ts +20 -0
  750. package/dist/esm/core/ui/color-conversion.utils.d.ts.map +1 -1
  751. package/dist/esm/core/ui/color-conversion.utils.js +39 -5
  752. package/dist/esm/core/ui/color-conversion.utils.js.map +1 -1
  753. package/dist/esm/core/ui/themes/default.theme.d.ts.map +1 -1
  754. package/dist/esm/core/ui/themes/default.theme.js +22 -2
  755. package/dist/esm/core/ui/themes/default.theme.js.map +1 -1
  756. package/dist/esm/core/ui/ui.frontend.schemas.d.ts +6 -6
  757. package/dist/esm/core/ui/ui.frontend.schemas.d.ts.map +1 -1
  758. package/dist/esm/core/ui/ui.frontend.schemas.js +3 -3
  759. package/dist/esm/core/ui/ui.frontend.schemas.js.map +1 -1
  760. package/dist/esm/index.d.ts +10 -1
  761. package/dist/esm/index.d.ts.map +1 -1
  762. package/dist/esm/index.js +19 -1
  763. package/dist/esm/index.js.map +1 -1
  764. package/dist/esm/testing/app-shell-placement-coverage.d.ts +43 -0
  765. package/dist/esm/testing/app-shell-placement-coverage.d.ts.map +1 -0
  766. package/dist/esm/testing/app-shell-placement-coverage.js +114 -0
  767. package/dist/esm/testing/app-shell-placement-coverage.js.map +1 -0
  768. package/dist/esm/testing/mock-builders.d.ts.map +1 -1
  769. package/dist/esm/testing/mock-builders.js +5 -0
  770. package/dist/esm/testing/mock-builders.js.map +1 -1
  771. package/dist/esm/testing.d.ts +1 -0
  772. package/dist/esm/testing.d.ts.map +1 -1
  773. package/dist/esm/testing.js +1 -0
  774. package/dist/esm/testing.js.map +1 -1
  775. package/package.json +9 -7
  776. package/dist/esm/core/navigation/useIsStackEntryActive.js +0 -15
  777. package/dist/tsconfig.build.tsbuildinfo +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"AppPage_ConnectedAccountsSettings.labels.js","sourceRoot":"","sources":["../../../../../src/components/settings/AppPage_ConnectedAccountsSettings.labels.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,SAAS,EAET,uBAAuB,GACxB,MAAM,qCAAqC,CAAC;AAE7C,iGAAiG;AACjG,0DAA0D;AAC1D,gGAAgG;AAChG,6FAA6F;AAC7F,8DAA8D;AAC9D,EAAE;AACF,oGAAoG;AACpG,+FAA+F;AAC/F,iGAAiG;AACjG,kGAAkG;AAClG,kGAAkG;AAClG,mGAAmG;AACnG,kGAAkG;AAClG,8BAA8B;AAC9B,4FAA4F;AAC5F,uDAAuD;AACvD,EAAE;AACF,gGAAgG;AAChG,iGAAiG;AACjG,oGAAoG;AACpG,mGAAmG;AACnG,4FAA4F;AAC5F,gGAAgG;AAChG,4FAA4F;AAC5F,kGAAkG;AAClG,MAAM,CAAC,MAAM,yCAAyC,GAA0B;IAC9E,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,8EAA8E,EAAE;IACtI,EAAE,GAAG,EAAE,iBAAiB,EAAE,IAAI,EAAE,SAAS,CAAC,WAAW,EAAE,OAAO,EAAE,8JAA8J,EAAE;IAChO,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,+DAA+D,EAAE;IACrH,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,oFAAoF,EAAE;IACxI,EAAE,GAAG,EAAE,uBAAuB,EAAE,IAAI,EAAE,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,sFAAsF,EAAE;IAC1J,EAAE,GAAG,EAAE,mBAAmB,EAAE,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,+GAA+G,EAAE;IAC7K,EAAE,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,iHAAiH,EAAE;IAC5K,EAAE,GAAG,EAAE,kBAAkB,EAAE,IAAI,EAAE,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,wGAAwG,EAAE;IACtK,EAAE,GAAG,EAAE,mBAAmB,EAAE,IAAI,EAAE,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,iLAAiL,EAAE;IACjP,EAAE,GAAG,EAAE,uBAAuB,EAAE,IAAI,EAAE,SAAS,CAAC,WAAW,EAAE,OAAO,EAAE,0MAA0M,EAAE;IAClR,EAAE,GAAG,EAAE,uBAAuB,EAAE,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,+EAA+E,EAAE;IACjJ,EAAE,GAAG,EAAE,yBAAyB,EAAE,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,gJAAgJ,EAAE;IACpN,EAAE,GAAG,EAAE,sBAAsB,EAAE,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,yIAAyI,EAAE;IAC1M,EAAE,GAAG,EAAE,oCAAoC,EAAE,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,0LAA0L,EAAE;IACzQ,EAAE,GAAG,EAAE,gCAAgC,EAAE,IAAI,EAAE,SAAS,CAAC,WAAW,EAAE,OAAO,EAAE,gQAAgQ,EAAE;IACjV,EAAE,GAAG,EAAE,mBAAmB,EAAE,IAAI,EAAE,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,gIAAgI,EAAE;IAChM,EAAE,GAAG,EAAE,uBAAuB,EAAE,IAAI,EAAE,SAAS,CAAC,WAAW,EAAE,OAAO,EAAE,0IAA0I,EAAE;IAClN,EAAE,GAAG,EAAE,8BAA8B,EAAE,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,kLAAkL,EAAE;IAC3P,EAAE,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,iGAAiG,EAAE;IAC1J,EAAE,GAAG,EAAE,kBAAkB,EAAE,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,0LAA0L,EAAE;IACvP,EAAE,GAAG,EAAE,wBAAwB,EAAE,IAAI,EAAE,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,0GAA0G,EAAE;IAC/K,EAAE,GAAG,EAAE,iBAAiB,EAAE,IAAI,EAAE,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,+FAA+F,EAAE;IAC7J,EAAE,GAAG,EAAE,gBAAgB,EAAE,IAAI,EAAE,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,2GAA2G,EAAE;IACxK,EAAE,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,oHAAoH,EAAE;IAC/K,EAAE,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,uFAAuF,EAAE;IAClJ,EAAE,GAAG,EAAE,0BAA0B,EAAE,IAAI,EAAE,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,2HAA2H,EAAE;IAClM,EAAE,GAAG,EAAE,8BAA8B,EAAE,IAAI,EAAE,SAAS,CAAC,WAAW,EAAE,OAAO,EAAE,wNAAwN,EAAE;IACvS,EAAE,GAAG,EAAE,qBAAqB,EAAE,IAAI,EAAE,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,sOAAsO,EAAE;IACxS,EAAE,GAAG,EAAE,wBAAwB,EAAE,IAAI,EAAE,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,yJAAyJ,EAAE;IAC9N,EAAE,GAAG,EAAE,kBAAkB,EAAE,IAAI,EAAE,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,mUAAmU,EAAE;IAClY,EAAE,GAAG,EAAE,yBAAyB,EAAE,IAAI,EAAE,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,oNAAoN,EAAE;IAC1R,EAAE,GAAG,EAAE,uBAAuB,EAAE,IAAI,EAAE,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,uTAAuT,EAAE;CAC5X,CAAC;AAEF,uBAAuB,CAAC,qBAAqB,CAAC,uCAAuC,EAAE,yCAAyC,CAAC,CAAC","sourcesContent":["import {\n FrontendComponentType,\n LabelKind,\n type LabellingUnitaryDef,\n registerComponentLabels,\n} from '@wildo-ai/presets-components-models';\n\n// Companion-only label metadata for the Connected-accounts panel: keys + kind + per-key purpose.\n// Statically scanned by the dev companion to generate the\n// `components.APP_LAYOUTS_CONNECTED_ACCOUNTS_SETTINGS.*` bundle; NOT imported at runtime, so it\n// never ships in the browser bundle. Keep in lock-step with the keys the component reads via\n// `tComponent(APP_LAYOUTS_CONNECTED_ACCOUNTS_SETTINGS, ...)`.\n//\n// LOCK-STEP DRIFTS SILENTLY IN BOTH DIRECTIONS, and on 2026-09-10 it had drifted both ways at once.\n// Nothing mechanical compares this array to the component's `t('...')` call sites, and neither\n// failure raises anything: a key the component reads and this array omits renders as its RAW KEY\n// PATH in the browser — visible only to somebody looking at the panel — while a key declared here\n// and never read costs a generated entry plus a translation round trip in every locale, and tells\n// the next reader the panel renders a message it does not. Five of each had accumulated before the\n// panel was first rendered. When you add or remove a `t('...')` call, edit this array in the same\n// change, and regenerate with\n// `wildo generate labels --units component:APP_LAYOUTS_CONNECTED_ACCOUNTS_SETTINGS --force`\n// followed by the matching `wildo generate translate`.\n//\n// `errorNotAdmissible` and `errorForbidden` were declared here and REMOVED on 2026-09-10 rather\n// than wired. The start route really does answer 409 CONNECTION_NOT_ADMISSIBLE and 403 FORBIDDEN\n// with those two distinct meanings — but this panel's catch does `if (isWildoBackendError(e)) throw\n// e`, so a structured backend refusal propagates to the global error handler and no branch in this\n// component can ever render either message. Reintroducing them is a real option and it is a\n// DECISION, not a cleanup: it means this panel stops re-throwing those two statuses and reports\n// them itself, which departs from the repository-wide convention that a `WildoBackendError`\n// belongs to the global handler. Declare them again in the same change that makes them reachable.\nexport const AppLayoutsConnectedAccountsSettingsLabels: LabellingUnitaryDef[] = [\n { ref: 'pageTitle', kind: LabelKind.HEADING, purpose: 'Heading for the panel where a person connects their own third-party accounts' },\n { ref: 'pageDescription', kind: LabelKind.DESCRIPTION, purpose: 'Sub-heading explaining that connecting an account lets this application act as that account on the person’s behalf, and that they can disconnect at any time' },\n { ref: 'loading', kind: LabelKind.MESSAGE, purpose: 'Shown while the list of connectable providers is being loaded' },\n { ref: 'empty', kind: LabelKind.MESSAGE, purpose: 'Shown when this application declares no provider a person may connect individually' },\n { ref: 'chooseProviderHeading', kind: LabelKind.HEADING, purpose: 'Heading above the control where somebody picks which third-party provider to connect' },\n { ref: 'choosePlaceholder', kind: LabelKind.LABEL, purpose: 'Placeholder shown in the provider chooser before anything is selected, inviting the person to pick a provider' },\n { ref: 'connectButton', kind: LabelKind.BUTTON, purpose: 'Button that starts connecting the named third-party account, sending the person to that vendor to grant consent' },\n { ref: 'connectingButton', kind: LabelKind.BUTTON, purpose: 'Button caption while the authorization URL is being obtained, before the browser leaves for the vendor' },\n { ref: 'delegationHeading', kind: LabelKind.HEADING, purpose: 'Heading above the control asking on whose behalf the connection will act — shown only for a provider that admits both a service identity and a user-delegated one at this scope' },\n { ref: 'delegationDescription', kind: LabelKind.DESCRIPTION, purpose: 'Explains that this provider can be connected either as the tenant itself or as the person acting, that these are two different accounts at the vendor, and that nobody may choose on the person’s behalf' },\n { ref: 'delegationPlaceholder', kind: LabelKind.LABEL, purpose: 'Placeholder in the on-whose-behalf chooser before either delegation is picked' },\n { ref: 'delegationServiceOption', kind: LabelKind.LABEL, purpose: 'Option naming the connection that acts as the organization or application itself, using a shared identity rather than any individual’s account' },\n { ref: 'delegationUserOption', kind: LabelKind.LABEL, purpose: 'Option naming the connection that acts as the individual person authorizing it, so anything it does at the vendor is attributed to them' },\n { ref: 'organizationWideUseAcknowledgement', kind: LabelKind.LABEL, purpose: 'Checkbox label a member ticks before linking THEIR OWN vendor account for the whole organization, stating that every member of the organization will be able to act through that account' },\n { ref: 'organizationWideUseDescription', kind: LabelKind.DESCRIPTION, purpose: 'Explains beneath that checkbox that anything a colleague does through this connection is attributed to the linking person at the vendor, that the linking person is trusting their colleagues with it, and that the audit trail records whose account was used' },\n { ref: 'parametersHeading', kind: LabelKind.HEADING, purpose: 'Heading above the inputs a person must answer before connecting, such as which cloud or which directory their account lives in' },\n { ref: 'parametersDescription', kind: LabelKind.DESCRIPTION, purpose: 'Explains that these answers are facts about the account being connected and that the vendor’s own addresses cannot be built without them' },\n { ref: 'parameterAdmittedHostsPrefix', kind: LabelKind.LABEL, purpose: 'Prefix before the list of vendor hostnames a connection parameter accepts, shown above a typed host field so the person knows which addresses will be allowed (e.g. \"Accepted:\")' },\n { ref: 'scopesPrefix', kind: LabelKind.LABEL, purpose: 'Prefix before the list of permissions the connection will ask the vendor for (e.g. \"Requests:\")' },\n { ref: 'scopeChosenBelow', kind: LabelKind.LABEL, purpose: 'Stands in, inside the list of requested permissions, for a permission that depends on an answer the person has not given yet in the fields below (e.g. \"(depends on your answer below)\")' },\n { ref: 'credentialStoredNotice', kind: LabelKind.MESSAGE, purpose: 'Confirmation shown after a typed credential has been saved for a provider that has no authorization flow' },\n { ref: 'connectedNotice', kind: LabelKind.MESSAGE, purpose: 'Confirmation shown after returning from a vendor where the account was connected successfully' },\n { ref: 'declinedNotice', kind: LabelKind.MESSAGE, purpose: 'Shown after returning from a vendor where the person chose not to grant access — a decision, not an error' },\n { ref: 'failedNotice', kind: LabelKind.MESSAGE, purpose: 'Shown after returning from a vendor when the connection attempt could not be completed and should be started again' },\n { ref: 'errorGeneric', kind: LabelKind.MESSAGE, purpose: 'Generic error shown when listing connectable providers or starting a connection fails' },\n { ref: 'configurationGapsHeading', kind: LabelKind.HEADING, purpose: 'Heading of the block listing every provider whose application-level configuration is incomplete, shown before the chooser' },\n { ref: 'configurationGapsDescription', kind: LabelKind.DESCRIPTION, purpose: 'Explains that the providers listed below cannot be connected by anybody until an operator sets the named environment variables for this deployment, and that this is a configuration gap rather than a lack of support' },\n { ref: 'notRegisteredNotice', kind: LabelKind.MESSAGE, purpose: 'Explains that this application has not yet registered with the provider, so connecting is not possible until an operator creates an application at that vendor and configures its credentials — shown in place of the Connect button' },\n { ref: 'pastedCredentialNotice', kind: LabelKind.MESSAGE, purpose: 'Explains that this provider has no authorization flow because its credential is typed rather than granted, and points the person at the credentials tab' },\n { ref: 'disconnectNotice', kind: LabelKind.MESSAGE, purpose: 'Standing note shown when NO connected provider can be told: removing a connection deletes this application\\u2019s copy of the authorization but does not withdraw it at the provider, so the person should also remove the application in the provider\\u2019s own connected-applications settings if they want access ended there' },\n { ref: 'disconnectRevokesNotice', kind: LabelKind.MESSAGE, purpose: 'Standing note shown when EVERY connected provider can be told: removing a connection also hands the authorization back to the provider, so access ends there as well and nothing further needs doing at the vendor' },\n { ref: 'disconnectMixedNotice', kind: LabelKind.MESSAGE, purpose: 'Standing note shown when SOME connected providers can be told and others cannot: removing a connection ends access at the providers that accept a withdrawal and only deletes this application\\u2019s copy for the rest, so the person should check the provider\\u2019s own connected-applications settings for those' },\n];\n\nregisterComponentLabels(FrontendComponentType.APP_LAYOUTS_CONNECTED_ACCOUNTS_SETTINGS, AppLayoutsConnectedAccountsSettingsLabels);\n"]}
1
+ {"version":3,"file":"AppPage_ConnectedAccountsSettings.labels.js","sourceRoot":"","sources":["../../../../../src/components/settings/AppPage_ConnectedAccountsSettings.labels.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n FrontendComponentType,\n LabelKind,\n type LabellingUnitaryDef,\n registerComponentLabels,\n} from '@wildo-ai/presets-components-models';\n\n// Companion-only label metadata for the Connected-accounts panel: keys + kind + per-key purpose.\n// Statically scanned by the dev companion to generate the\n// `components.APP_LAYOUTS_CONNECTED_ACCOUNTS_SETTINGS.*` bundle; NOT imported at runtime, so it\n// never ships in the browser bundle. Keep in lock-step with the keys the component reads via\n// `tComponent(APP_LAYOUTS_CONNECTED_ACCOUNTS_SETTINGS, ...)`.\n//\n// LOCK-STEP DRIFTS SILENTLY IN BOTH DIRECTIONS, and on 2026-09-10 it had drifted both ways at once.\n// Nothing mechanical compares this array to the component's `t('...')` call sites, and neither\n// failure raises anything: a key the component reads and this array omits renders as its RAW KEY\n// PATH in the browser — visible only to somebody looking at the panel — while a key declared here\n// and never read costs a generated entry plus a translation round trip in every locale, and tells\n// the next reader the panel renders a message it does not. Five of each had accumulated before the\n// panel was first rendered. When you add or remove a `t('...')` call, edit this array in the same\n// change, and regenerate with\n// `wildo generate labels --units component:APP_LAYOUTS_CONNECTED_ACCOUNTS_SETTINGS --force`\n// followed by the matching `wildo generate translate`.\n//\n// `errorNotAdmissible` and `errorForbidden` were declared here and REMOVED on 2026-09-10 rather\n// than wired. The start route really does answer 409 CONNECTION_NOT_ADMISSIBLE and 403 FORBIDDEN\n// with those two distinct meanings — but this panel's catch does `if (isWildoBackendError(e)) throw\n// e`, so a structured backend refusal propagates to the global error handler and no branch in this\n// component can ever render either message. Reintroducing them is a real option and it is a\n// DECISION, not a cleanup: it means this panel stops re-throwing those two statuses and reports\n// them itself, which departs from the repository-wide convention that a `WildoBackendError`\n// belongs to the global handler. Declare them again in the same change that makes them reachable.\n// `pageTitle`, `pageDescription`, `chooseProviderHeading` and `notRegisteredNotice` were REMOVED on\n// 2026-09-27 with the text they rendered: the panel's own heading restated its tab and destination, the\n// card heading restated the chooser's placeholder, and the per-provider \"not registered\" notice repeated\n// the environment variables the configuration block above the chooser already names for every provider.\nexport const AppLayoutsConnectedAccountsSettingsLabels: LabellingUnitaryDef[] = [\n { ref: 'loading', kind: LabelKind.MESSAGE, purpose: 'Shown while the list of connectable providers is being loaded' },\n { ref: 'empty', kind: LabelKind.MESSAGE, purpose: 'Shown when this application declares no provider a person may connect individually' },\n { ref: 'choosePlaceholder', kind: LabelKind.LABEL, purpose: 'Placeholder shown in the provider chooser before anything is selected, inviting the person to pick a provider' },\n { ref: 'connectButton', kind: LabelKind.BUTTON, purpose: 'Button that starts connecting the named third-party account, sending the person to that vendor to grant consent' },\n { ref: 'connectingButton', kind: LabelKind.BUTTON, purpose: 'Button caption while the authorization URL is being obtained, before the browser leaves for the vendor' },\n { ref: 'delegationHeading', kind: LabelKind.HEADING, purpose: 'Heading above the control asking on whose behalf the connection will act — shown only for a provider that admits both a service identity and a user-delegated one at this scope' },\n { ref: 'delegationDescription', kind: LabelKind.DESCRIPTION, purpose: 'Explains that this provider can be connected either as the tenant itself or as the person acting, that these are two different accounts at the vendor, and that nobody may choose on the person’s behalf' },\n { ref: 'delegationPlaceholder', kind: LabelKind.LABEL, purpose: 'Placeholder in the on-whose-behalf chooser before either delegation is picked' },\n { ref: 'delegationServiceOption', kind: LabelKind.LABEL, purpose: 'Option naming the connection that acts as the organization or application itself, using a shared identity rather than any individual’s account' },\n { ref: 'delegationUserOption', kind: LabelKind.LABEL, purpose: 'Option naming the connection that acts as the individual person authorizing it, so anything it does at the vendor is attributed to them' },\n { ref: 'organizationWideUseAcknowledgement', kind: LabelKind.LABEL, purpose: 'Checkbox label a member ticks before linking THEIR OWN vendor account for the whole organization, stating that every member of the organization will be able to act through that account' },\n { ref: 'organizationWideUseDescription', kind: LabelKind.DESCRIPTION, purpose: 'Explains beneath that checkbox that anything a colleague does through this connection is attributed to the linking person at the vendor, that the linking person is trusting their colleagues with it, and that the audit trail records whose account was used' },\n { ref: 'parametersHeading', kind: LabelKind.HEADING, purpose: 'Heading above the inputs a person must answer before connecting, such as which cloud or which directory their account lives in' },\n { ref: 'parametersDescription', kind: LabelKind.DESCRIPTION, purpose: 'Explains that these answers are facts about the account being connected and that the vendor’s own addresses cannot be built without them' },\n { ref: 'parameterAdmittedHostsPrefix', kind: LabelKind.LABEL, purpose: 'Prefix before the list of vendor hostnames a connection parameter accepts, shown above a typed host field so the person knows which addresses will be allowed (e.g. \"Accepted:\")' },\n { ref: 'scopesPrefix', kind: LabelKind.LABEL, purpose: 'Prefix before the list of permissions the connection will ask the vendor for (e.g. \"Requests:\")' },\n { ref: 'scopeChosenBelow', kind: LabelKind.LABEL, purpose: 'Stands in, inside the list of requested permissions, for a permission that depends on an answer the person has not given yet in the fields below (e.g. \"(depends on your answer below)\")' },\n { ref: 'credentialStoredNotice', kind: LabelKind.MESSAGE, purpose: 'Confirmation shown after a typed credential has been saved for a provider that has no authorization flow' },\n { ref: 'connectedNotice', kind: LabelKind.MESSAGE, purpose: 'Confirmation shown after returning from a vendor where the account was connected successfully' },\n { ref: 'declinedNotice', kind: LabelKind.MESSAGE, purpose: 'Shown after returning from a vendor where the person chose not to grant access — a decision, not an error' },\n { ref: 'failedNotice', kind: LabelKind.MESSAGE, purpose: 'Shown after returning from a vendor when the connection attempt could not be completed and should be started again' },\n { ref: 'errorGeneric', kind: LabelKind.MESSAGE, purpose: 'Generic error shown when listing connectable providers or starting a connection fails' },\n { ref: 'configurationGapsHeading', kind: LabelKind.HEADING, purpose: 'Heading of the block listing every provider whose application-level configuration is incomplete, shown before the chooser' },\n { ref: 'configurationGapsDescription', kind: LabelKind.DESCRIPTION, purpose: 'Explains that the providers listed below cannot be connected by anybody until an operator sets the named environment variables for this deployment, and that this is a configuration gap rather than a lack of support' },\n { ref: 'pastedCredentialNotice', kind: LabelKind.MESSAGE, purpose: 'Explains that this provider has no authorization flow because its credential is typed rather than granted, and points the person at the credentials tab' },\n { ref: 'disconnectNotice', kind: LabelKind.MESSAGE, purpose: 'Note shown when NO connected provider can be told (standing, beneath the chooser), and in the confirmation before removing a connection whose provider cannot be told: removing a connection deletes this application\\u2019s copy of the authorization but does not withdraw it at the provider, so the person should also remove the application in the provider\\u2019s own connected-applications settings if they want access ended there' },\n { ref: 'disconnectRevokesNotice', kind: LabelKind.MESSAGE, purpose: 'Note shown when EVERY connected provider can be told (standing, beneath the chooser), and in the confirmation before removing a connection whose provider can be told: removing a connection also hands the authorization back to the provider, so access ends there as well and nothing further needs doing at the vendor' },\n { ref: 'disconnectMixedNotice', kind: LabelKind.MESSAGE, purpose: 'Standing note shown when SOME connected providers can be told and others cannot: removing a connection ends access at the providers that accept a withdrawal and only deletes this application\\u2019s copy for the rest, so the person should check the provider\\u2019s own connected-applications settings for those' },\n // ── The connections this owner HOLDS — one row per connection (#1727) ──\n { ref: 'connectionsHeading', kind: LabelKind.HEADING, purpose: 'Heading of the list of third-party accounts already connected at this scope (the person\\u2019s own, or the organization\\u2019s), one entry per connected account' },\n { ref: 'connectionsLoading', kind: LabelKind.MESSAGE, purpose: 'Shown while the list of connected accounts is being loaded' },\n { ref: 'connectionsFailed', kind: LabelKind.MESSAGE, purpose: 'Shown when the list of connected accounts could not be loaded — distinct from having none' },\n { ref: 'connectionsEmpty', kind: LabelKind.EMPTY_STATE, purpose: 'Shown when no third-party account is connected yet at this scope; the chooser below is where one is connected' },\n { ref: 'statusLabel', kind: LabelKind.LABEL, purpose: 'Term naming the health of one connected account in its summary (e.g. \"Status\")' },\n { ref: 'statusWorking', kind: LabelKind.LABEL, purpose: 'Status of a connected account the vendor has accepted' },\n { ref: 'statusNotYetUsed', kind: LabelKind.LABEL, purpose: 'Status of a connected account that is stored but has not been used yet, so nothing has proven it works or fails' },\n { ref: 'statusNeedsReauthorization', kind: LabelKind.LABEL, purpose: 'Status of a connected account the vendor refused, which must be connected again; shown once for the account, whatever number of features use it' },\n { ref: 'statusDisabled', kind: LabelKind.LABEL, purpose: 'Status of a connected account that is switched off, so no feature can use it' },\n { ref: 'statusSuperseded', kind: LabelKind.LABEL, purpose: 'Status of an old connection that no feature uses any more, because the feature now shares another connection of the same vendor' },\n { ref: 'servesLabel', kind: LabelKind.LABEL, purpose: 'Term before the list of features (named by their vendor product names) that use one connected account — connecting it once gives all of them access (e.g. \"Used by\")' },\n { ref: 'grantedScopesLabel', kind: LabelKind.LABEL, purpose: 'Term before the list of permissions the person has granted this connected account so far, shown verbatim in the vendor\\u2019s own words (e.g. \"Permissions granted\")' },\n {\n ref: 'supersededNotice',\n kind: LabelKind.MESSAGE,\n params: [{ key: 'connection', meaning: 'the vendor name of the connection the feature now uses instead' }],\n purpose: 'Explains that this old connection is no longer used because its feature now uses the {connection} connection, and that the person should connect {connection} and remove this one',\n },\n { ref: 'needsReauthorizationNotice', kind: LabelKind.MESSAGE, purpose: 'Explains that the vendor refused this connected account, that every feature listed for it has stopped working, and that connecting it again repairs all of them at once' },\n { ref: 'reconnectButton', kind: LabelKind.BUTTON, purpose: 'Button that starts connecting this account again, after the vendor refused it' },\n {\n ref: 'reconnectAccessibleName',\n kind: LabelKind.ARIA,\n params: [{ key: 'provider', meaning: 'the vendor name of the connected account' }],\n purpose: 'Screen-reader name of the reconnect button, naming which account it reconnects (e.g. \"Reconnect {provider}\")',\n },\n { ref: 'reauthorizationOfferDescription', kind: LabelKind.MESSAGE, purpose: 'Explains that a feature asked this connected account for something it has not been granted, and that granting more access asks the vendor only for what is missing' },\n { ref: 'reauthorizationScopesPrefix', kind: LabelKind.LABEL, purpose: 'Prefix before the list of permissions granting more access will ask the vendor for, shown verbatim (e.g. \"Will ask for:\")' },\n { ref: 'reauthorizationAdministratorPrefix', kind: LabelKind.LABEL, purpose: 'Prefix before permissions only an administrator of the vendor account can grant, so granting more access here cannot obtain them (e.g. \"Needs an administrator of the account:\")' },\n { ref: 'reauthorizationLinkerOnlyNotice', kind: LabelKind.MESSAGE, purpose: 'Explains that only the member who linked this organization account can grant it more access, so the person should ask them' },\n { ref: 'grantMoreAccessButton', kind: LabelKind.BUTTON, purpose: 'Button that sends the person to the vendor to grant this connected account the extra permissions a feature needs' },\n {\n ref: 'grantMoreAccessAccessibleName',\n kind: LabelKind.ARIA,\n params: [{ key: 'provider', meaning: 'the vendor name of the connected account' }],\n purpose: 'Screen-reader name of the grant-more-access button, naming the account (e.g. \"Grant {provider} more access\")',\n },\n { ref: 'disconnectButton', kind: LabelKind.BUTTON, purpose: 'Button that begins removing this connected account; a confirmation follows before anything is removed' },\n {\n ref: 'disconnectAccessibleName',\n kind: LabelKind.ARIA,\n params: [{ key: 'provider', meaning: 'the vendor name of the connected account' }],\n purpose: 'Screen-reader name of the disconnect button, naming which account (e.g. \"Disconnect {provider}\")',\n },\n {\n ref: 'disconnectConfirmDescription',\n kind: LabelKind.MESSAGE,\n params: [{ key: 'provider', meaning: 'the vendor name of the connected account' }],\n purpose: 'Confirmation text before removing the {provider} connection: removing it ends access for EVERY feature listed for it, not only one',\n },\n { ref: 'disconnectConfirmButton', kind: LabelKind.BUTTON, purpose: 'Button that confirms removing the connected account' },\n {\n ref: 'disconnectConfirmAccessibleName',\n kind: LabelKind.ARIA,\n params: [{ key: 'provider', meaning: 'the vendor name of the connected account' }],\n purpose: 'Screen-reader name of the confirm button, naming the account being removed (e.g. \"Confirm disconnecting {provider}\")',\n },\n { ref: 'disconnectCancelButton', kind: LabelKind.BUTTON, purpose: 'Button that abandons removing the connected account and keeps it' },\n { ref: 'disconnectedNotice', kind: LabelKind.MESSAGE, purpose: 'Confirmation shown after a connected account was removed' },\n { ref: 'disconnectFailedNotice', kind: LabelKind.MESSAGE, purpose: 'Shown when removing a connected account failed; the list is refreshed so the person sees what remains' },\n];\n\nregisterComponentLabels(FrontendComponentType.APP_LAYOUTS_CONNECTED_ACCOUNTS_SETTINGS, AppLayoutsConnectedAccountsSettingsLabels);\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"AppPage_InvitationsSettings.d.ts","sourceRoot":"","sources":["../../../../../src/components/settings/AppPage_InvitationsSettings.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,KAA2C,MAAM,OAAO,CAAC;AAchE,eAAO,MAAM,2BAA2B,EAAE,KAAK,CAAC,EA4J/C,CAAC"}
1
+ {"version":3,"file":"AppPage_InvitationsSettings.d.ts","sourceRoot":"","sources":["../../../../../src/components/settings/AppPage_InvitationsSettings.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,KAA2C,MAAM,OAAO,CAAC;AAoBhE,eAAO,MAAM,2BAA2B,EAAE,KAAK,CAAC,EA6J/C,CAAC"}
@@ -18,17 +18,25 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
18
18
  * hardcoded fallback strings here.
19
19
  */
20
20
  import { useCallback, useEffect, useState } from 'react';
21
- import { ButtonSize, FrontendComponentType } from '@wildo-ai/presets-components-models';
21
+ import { ButtonSize, FrontendComponentType, LabellingTypes } from '@wildo-ai/presets-components-models';
22
22
  import { isWildoBackendError } from '@wildo-ai/saas-models';
23
- import { Card, CardContent, CardHeader, CardTitle } from '../../components/sections/card.js';
23
+ import { Card, CardContent } from '../../components/sections/card.js';
24
24
  import { Button, ButtonVariants_Variant } from '../../components/actions/button.js';
25
25
  import { Text } from '../../components/typography/text.js';
26
26
  import { Alert, AlertDescription } from '../../components/overlays/containers/alert.js';
27
27
  import { useI18n } from '../../core/i18n/useI18n.js';
28
28
  import { useUserOrgs } from '../../core/security/useUserOrgs.js';
29
29
  import { getManualCallsHttpClient, } from '../../core/requests/wildo-http-client-manual-calls.frontend.service.js';
30
+ /*
31
+ * The role words live in the application's `roles` labels, planned from every registered role, not in this
32
+ * panel's own namespace. Module-level so the requested set keeps one identity across renders.
33
+ */
34
+ const INVITATION_ROLE_LABEL_NAMESPACES = [LabellingTypes.ROLES];
30
35
  export const AppPage_InvitationsSettings = () => {
31
- const { tComponent, isReady } = useI18n({ component: FrontendComponentType.APP_LAYOUTS_INVITATIONS_SETTINGS });
36
+ const { tComponent, tRole, isReady } = useI18n({
37
+ component: FrontendComponentType.APP_LAYOUTS_INVITATIONS_SETTINGS,
38
+ keys: INVITATION_ROLE_LABEL_NAMESPACES,
39
+ });
32
40
  const { refreshOrganizations } = useUserOrgs();
33
41
  const t = useCallback((key) => tComponent(FrontendComponentType.APP_LAYOUTS_INVITATIONS_SETTINGS, key), [tComponent]);
34
42
  const [invitations, setInvitations] = useState([]);
@@ -101,13 +109,13 @@ export const AppPage_InvitationsSettings = () => {
101
109
  // Gate on label readiness so the panel never flashes raw key paths (Appearance convention).
102
110
  if (!isReady)
103
111
  return null;
104
- return (_jsxs("div", { className: "flex flex-col gap-section", children: [_jsxs("div", { className: "flex flex-col gap-item-xs", children: [_jsx("h3", { className: "text-base font-semibold tracking-tight", children: t('pageTitle') }), _jsx(Text, { className: "text-sm text-muted-foreground", children: t('pageDescription') })] }), error && (_jsx(Alert, { variant: "destructive", children: _jsx(AlertDescription, { children: error }) })), successMsg && (_jsx(Alert, { children: _jsx(AlertDescription, { children: successMsg }) })), _jsxs(Card, { children: [_jsx(CardHeader, { children: _jsx(CardTitle, { children: t('listHeading') }) }), _jsx(CardContent, { children: loading ? (_jsx(Text, { className: "text-sm text-muted-foreground", children: t('loading') })) : invitations.length === 0 ? (_jsx(Text, { className: "text-sm text-muted-foreground", children: t('empty') })) : (
105
- /* Flush divided list — same settings-list geometry as the
106
- SETTINGS_ROW field chrome (label/meta inline-start, actions
107
- inline-end, `py-group` rhythm, `divide-y` hairline dividers) so
108
- this bespoke action panel reads as the same family as the
109
- decorator-driven settings surfaces. (Was per-row bordered boxes
110
- with `space-y-2`, a visually divergent pattern.) */
111
- _jsx("ul", { className: "divide-y divide-border", children: invitations.map((invitation) => (_jsxs("li", { className: "flex items-center justify-between gap-section py-group", children: [_jsxs("div", { className: "flex min-w-0 flex-col gap-item-xs", children: [_jsx(Text, { className: "font-medium", children: invitation.organizationName ?? t('unknownOrganization') }), invitation.roles.length > 0 && (_jsxs(Text, { className: "text-xs text-muted-foreground", children: [t('rolesPrefix'), " ", invitation.roles.join(', ')] }))] }), _jsxs("div", { className: "flex shrink-0 gap-element", children: [_jsx(Button, { variant: ButtonVariants_Variant.OUTLINE, size: ButtonSize.SM, disabled: busyId === invitation.membershipId, onClick: () => handleReject(invitation.membershipId), children: t('rejectButton') }), _jsx(Button, { size: ButtonSize.SM, disabled: busyId === invitation.membershipId, onClick: () => handleAccept(invitation.membershipId), children: t('acceptButton') })] })] }, invitation.membershipId))) })) })] })] }));
112
+ return (_jsxs("div", { className: "flex flex-col gap-section", children: [_jsx("h3", { className: "text-base font-semibold tracking-tight", children: t('pageTitle') }), error && (_jsx(Alert, { variant: "destructive", children: _jsx(AlertDescription, { children: error }) })), successMsg && (_jsx(Alert, { children: _jsx(AlertDescription, { children: successMsg }) })), _jsx(Card, { children: _jsx(CardContent, { className: "p-card", children: loading ? (_jsx(Text, { className: "text-sm text-muted-foreground", children: t('loading') })) : invitations.length === 0 ? (_jsx(Text, { className: "text-sm text-muted-foreground", children: t('empty') })) : (
113
+ /* Flush divided list — same settings-list geometry as the
114
+ SETTINGS_ROW field chrome (label/meta inline-start, actions
115
+ inline-end, `py-group` rhythm, `divide-y` hairline dividers) so
116
+ this bespoke action panel reads as the same family as the
117
+ decorator-driven settings surfaces. (Was per-row bordered boxes
118
+ with `space-y-2`, a visually divergent pattern.) */
119
+ _jsx("ul", { className: "divide-y divide-border", children: invitations.map((invitation) => (_jsxs("li", { className: "flex items-center justify-between gap-section py-group", children: [_jsxs("div", { className: "flex min-w-0 flex-col gap-item-xs", children: [_jsx(Text, { className: "font-medium", children: invitation.organizationName ?? t('unknownOrganization') }), invitation.roles.length > 0 && (_jsxs(Text, { className: "text-xs text-muted-foreground", children: [t('rolesPrefix'), " ", invitation.roles.map((role) => tRole(role, 'label')).join(', ')] }))] }), _jsxs("div", { className: "flex shrink-0 gap-element", children: [_jsx(Button, { variant: ButtonVariants_Variant.OUTLINE, size: ButtonSize.SM, disabled: busyId === invitation.membershipId, onClick: () => handleReject(invitation.membershipId), children: t('rejectButton') }), _jsx(Button, { size: ButtonSize.SM, disabled: busyId === invitation.membershipId, onClick: () => handleAccept(invitation.membershipId), children: t('acceptButton') })] })] }, invitation.membershipId))) })) }) })] }));
112
120
  };
113
121
  //# sourceMappingURL=AppPage_InvitationsSettings.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AppPage_InvitationsSettings.js","sourceRoot":"","sources":["../../../../../src/components/settings/AppPage_InvitationsSettings.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * AppPage_InvitationsSettings — the Settings Hub \"Invitations\" panel (Approach P).\n *\n * A bespoke `ENGINE_PANEL` (not a resource surface) that lets a signed-in user act on\n * THEIR OWN pending organization invitations in-app, without opening the emailed link.\n * It lists the caller's pending invitations — their own INVITED membership rows, resolved\n * server-side by userId-ownership via `GET /auth/invitations/mine` — and offers Accept /\n * Decline per row (Accept flips the row to ACTIVE; Decline deletes it) — calling the\n * authenticated `acceptMyInvitation` / `rejectMyInvitation` endpoints (no token, no new\n * session). On accept the caller becomes a member, so the panel refreshes the user's\n * organizations via `useUserOrgs().refreshOrganizations()` and re-lists.\n *\n * i18n follows the framework convention (same shape as `AppPage_AppearanceSettings`):\n * `useI18n({ component })` requests this component's label namespace, the panel gates\n * rendering on `isReady` so it never flashes raw key paths, and a thin `t(key)` reads\n * each label. Copy is owned by the labelling pipeline (sibling `.labels.ts`) — no\n * hardcoded fallback strings here.\n */\nimport React, { useCallback, useEffect, useState } from 'react';\nimport { ButtonSize, FrontendComponentType } from '@wildo-ai/presets-components-models';\nimport { isWildoBackendError } from '@wildo-ai/saas-models';\nimport { Card, CardContent, CardHeader, CardTitle } from '~wildo-frontend-lib/components/sections/card';\nimport { Button, ButtonVariants_Variant } from '~wildo-frontend-lib/components/actions/button';\nimport { Text } from '~wildo-frontend-lib/components/typography/text';\nimport { Alert, AlertDescription } from '~wildo-frontend-lib/components/overlays/containers/alert';\nimport { useI18n } from '~wildo-frontend-lib/core/i18n/useI18n';\nimport { useUserOrgs } from '~wildo-frontend-lib/core/security/useUserOrgs';\nimport {\n getManualCallsHttpClient,\n type MyPendingInvitationView,\n} from '~wildo-frontend-lib/core/requests/wildo-http-client-manual-calls.frontend.service';\n\nexport const AppPage_InvitationsSettings: React.FC = () => {\n const { tComponent, isReady } = useI18n({ component: FrontendComponentType.APP_LAYOUTS_INVITATIONS_SETTINGS });\n const { refreshOrganizations } = useUserOrgs();\n\n const t = useCallback(\n (key: string) => tComponent(FrontendComponentType.APP_LAYOUTS_INVITATIONS_SETTINGS, key),\n [tComponent],\n );\n\n const [invitations, setInvitations] = useState<MyPendingInvitationView[]>([]);\n const [loading, setLoading] = useState(true);\n const [busyId, setBusyId] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [successMsg, setSuccessMsg] = useState<string | null>(null);\n\n const refresh = useCallback(async () => {\n setLoading(true);\n setError(null);\n try {\n const res = await getManualCallsHttpClient().listMyPendingInvitations();\n setInvitations(res.invitations ?? []);\n } catch (e: unknown) {\n if (isWildoBackendError(e)) throw e;\n setError(t('errorGeneric'));\n } finally {\n setLoading(false);\n }\n }, [t]);\n\n useEffect(() => {\n refresh();\n }, [refresh]);\n\n // Auto-dismiss the success banner (same convention as AppPage_SecuritySettings).\n useEffect(() => {\n if (!successMsg) return;\n const timer = setTimeout(() => setSuccessMsg(null), 5000);\n return () => clearTimeout(timer);\n }, [successMsg]);\n\n const handleAccept = useCallback(\n async (membershipId: string) => {\n setBusyId(membershipId);\n setError(null);\n try {\n await getManualCallsHttpClient().acceptMyInvitation(membershipId);\n // The caller just became a member — refresh their org list before re-listing.\n await refreshOrganizations();\n setSuccessMsg(t('acceptSuccess'));\n await refresh();\n } catch (e: unknown) {\n if (isWildoBackendError(e)) throw e;\n setError(t('errorGeneric'));\n } finally {\n setBusyId(null);\n }\n },\n [refresh, refreshOrganizations, t],\n );\n\n const handleReject = useCallback(\n async (membershipId: string) => {\n setBusyId(membershipId);\n setError(null);\n try {\n await getManualCallsHttpClient().rejectMyInvitation(membershipId);\n setSuccessMsg(t('rejectSuccess'));\n await refresh();\n } catch (e: unknown) {\n if (isWildoBackendError(e)) throw e;\n setError(t('errorGeneric'));\n } finally {\n setBusyId(null);\n }\n },\n [refresh, t],\n );\n\n // Gate on label readiness so the panel never flashes raw key paths (Appearance convention).\n if (!isReady) return null;\n\n return (\n <div className=\"flex flex-col gap-section\">\n <div className=\"flex flex-col gap-item-xs\">\n {/* `h3`, not `h2`: the Settings Hub header owns the `h2` for this dialog,\n so a panel heading is one level below it. */}\n <h3 className=\"text-base font-semibold tracking-tight\">{t('pageTitle')}</h3>\n <Text className=\"text-sm text-muted-foreground\">{t('pageDescription')}</Text>\n </div>\n\n {error && (\n <Alert variant=\"destructive\">\n <AlertDescription>{error}</AlertDescription>\n </Alert>\n )}\n {successMsg && (\n <Alert>\n <AlertDescription>{successMsg}</AlertDescription>\n </Alert>\n )}\n\n <Card>\n <CardHeader>\n <CardTitle>{t('listHeading')}</CardTitle>\n </CardHeader>\n <CardContent>\n {loading ? (\n <Text className=\"text-sm text-muted-foreground\">{t('loading')}</Text>\n ) : invitations.length === 0 ? (\n <Text className=\"text-sm text-muted-foreground\">{t('empty')}</Text>\n ) : (\n /* Flush divided list — same settings-list geometry as the\n SETTINGS_ROW field chrome (label/meta inline-start, actions\n inline-end, `py-group` rhythm, `divide-y` hairline dividers) so\n this bespoke action panel reads as the same family as the\n decorator-driven settings surfaces. (Was per-row bordered boxes\n with `space-y-2`, a visually divergent pattern.) */\n <ul className=\"divide-y divide-border\">\n {invitations.map((invitation) => (\n <li\n key={invitation.membershipId}\n className=\"flex items-center justify-between gap-section py-group\"\n >\n <div className=\"flex min-w-0 flex-col gap-item-xs\">\n <Text className=\"font-medium\">{invitation.organizationName ?? t('unknownOrganization')}</Text>\n {invitation.roles.length > 0 && (\n <Text className=\"text-xs text-muted-foreground\">\n {t('rolesPrefix')} {invitation.roles.join(', ')}\n </Text>\n )}\n </div>\n <div className=\"flex shrink-0 gap-element\">\n <Button\n variant={ButtonVariants_Variant.OUTLINE}\n size={ButtonSize.SM}\n disabled={busyId === invitation.membershipId}\n onClick={() => handleReject(invitation.membershipId)}\n >\n {t('rejectButton')}\n </Button>\n <Button\n size={ButtonSize.SM}\n disabled={busyId === invitation.membershipId}\n onClick={() => handleAccept(invitation.membershipId)}\n >\n {t('acceptButton')}\n </Button>\n </div>\n </li>\n ))}\n </ul>\n )}\n </CardContent>\n </Card>\n </div>\n );\n};\n"]}
1
+ {"version":3,"file":"AppPage_InvitationsSettings.js","sourceRoot":"","sources":["../../../../../src/components/settings/AppPage_InvitationsSettings.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * AppPage_InvitationsSettings — the Settings Hub \"Invitations\" panel (Approach P).\n *\n * A bespoke `ENGINE_PANEL` (not a resource surface) that lets a signed-in user act on\n * THEIR OWN pending organization invitations in-app, without opening the emailed link.\n * It lists the caller's pending invitations — their own INVITED membership rows, resolved\n * server-side by userId-ownership via `GET /auth/invitations/mine` — and offers Accept /\n * Decline per row (Accept flips the row to ACTIVE; Decline deletes it) — calling the\n * authenticated `acceptMyInvitation` / `rejectMyInvitation` endpoints (no token, no new\n * session). On accept the caller becomes a member, so the panel refreshes the user's\n * organizations via `useUserOrgs().refreshOrganizations()` and re-lists.\n *\n * i18n follows the framework convention (same shape as `AppPage_AppearanceSettings`):\n * `useI18n({ component })` requests this component's label namespace, the panel gates\n * rendering on `isReady` so it never flashes raw key paths, and a thin `t(key)` reads\n * each label. Copy is owned by the labelling pipeline (sibling `.labels.ts`) — no\n * hardcoded fallback strings here.\n */\nimport React, { useCallback, useEffect, useState } from 'react';\nimport { ButtonSize, FrontendComponentType, LabellingTypes } from '@wildo-ai/presets-components-models';\nimport { isWildoBackendError } from '@wildo-ai/saas-models';\nimport { Card, CardContent } from '~wildo-frontend-lib/components/sections/card';\nimport { Button, ButtonVariants_Variant } from '~wildo-frontend-lib/components/actions/button';\nimport { Text } from '~wildo-frontend-lib/components/typography/text';\nimport { Alert, AlertDescription } from '~wildo-frontend-lib/components/overlays/containers/alert';\nimport { useI18n } from '~wildo-frontend-lib/core/i18n/useI18n';\nimport { useUserOrgs } from '~wildo-frontend-lib/core/security/useUserOrgs';\nimport {\n getManualCallsHttpClient,\n type MyPendingInvitationView,\n} from '~wildo-frontend-lib/core/requests/wildo-http-client-manual-calls.frontend.service';\n\n/*\n * The role words live in the application's `roles` labels, planned from every registered role, not in this\n * panel's own namespace. Module-level so the requested set keeps one identity across renders.\n */\nconst INVITATION_ROLE_LABEL_NAMESPACES = [LabellingTypes.ROLES];\n\nexport const AppPage_InvitationsSettings: React.FC = () => {\n const { tComponent, tRole, isReady } = useI18n({\n component: FrontendComponentType.APP_LAYOUTS_INVITATIONS_SETTINGS,\n keys: INVITATION_ROLE_LABEL_NAMESPACES,\n });\n const { refreshOrganizations } = useUserOrgs();\n\n const t = useCallback(\n (key: string) => tComponent(FrontendComponentType.APP_LAYOUTS_INVITATIONS_SETTINGS, key),\n [tComponent],\n );\n\n const [invitations, setInvitations] = useState<MyPendingInvitationView[]>([]);\n const [loading, setLoading] = useState(true);\n const [busyId, setBusyId] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [successMsg, setSuccessMsg] = useState<string | null>(null);\n\n const refresh = useCallback(async () => {\n setLoading(true);\n setError(null);\n try {\n const res = await getManualCallsHttpClient().listMyPendingInvitations();\n setInvitations(res.invitations ?? []);\n } catch (e: unknown) {\n if (isWildoBackendError(e)) throw e;\n setError(t('errorGeneric'));\n } finally {\n setLoading(false);\n }\n }, [t]);\n\n useEffect(() => {\n refresh();\n }, [refresh]);\n\n // Auto-dismiss the success banner (same convention as AppPage_SecuritySettings).\n useEffect(() => {\n if (!successMsg) return;\n const timer = setTimeout(() => setSuccessMsg(null), 5000);\n return () => clearTimeout(timer);\n }, [successMsg]);\n\n const handleAccept = useCallback(\n async (membershipId: string) => {\n setBusyId(membershipId);\n setError(null);\n try {\n await getManualCallsHttpClient().acceptMyInvitation(membershipId);\n // The caller just became a member — refresh their org list before re-listing.\n await refreshOrganizations();\n setSuccessMsg(t('acceptSuccess'));\n await refresh();\n } catch (e: unknown) {\n if (isWildoBackendError(e)) throw e;\n setError(t('errorGeneric'));\n } finally {\n setBusyId(null);\n }\n },\n [refresh, refreshOrganizations, t],\n );\n\n const handleReject = useCallback(\n async (membershipId: string) => {\n setBusyId(membershipId);\n setError(null);\n try {\n await getManualCallsHttpClient().rejectMyInvitation(membershipId);\n setSuccessMsg(t('rejectSuccess'));\n await refresh();\n } catch (e: unknown) {\n if (isWildoBackendError(e)) throw e;\n setError(t('errorGeneric'));\n } finally {\n setBusyId(null);\n }\n },\n [refresh, t],\n );\n\n // Gate on label readiness so the panel never flashes raw key paths (Appearance convention).\n if (!isReady) return null;\n\n return (\n <div className=\"flex flex-col gap-section\">\n {/* `h3`, not `h2`: the Settings Hub header owns the `h2` for this dialog,\n so a panel heading is one level below it. No sub-heading: it restated\n the Accept / Decline buttons each row carries. */}\n <h3 className=\"text-base font-semibold tracking-tight\">{t('pageTitle')}</h3>\n\n {error && (\n <Alert variant=\"destructive\">\n <AlertDescription>{error}</AlertDescription>\n </Alert>\n )}\n {successMsg && (\n <Alert>\n <AlertDescription>{successMsg}</AlertDescription>\n </Alert>\n )}\n\n {/* No card title: \"Pending Invitations\" repeated the panel heading one line\n above it, and every row it could hold is by definition pending. */}\n <Card>\n <CardContent className=\"p-card\">\n {loading ? (\n <Text className=\"text-sm text-muted-foreground\">{t('loading')}</Text>\n ) : invitations.length === 0 ? (\n <Text className=\"text-sm text-muted-foreground\">{t('empty')}</Text>\n ) : (\n /* Flush divided list — same settings-list geometry as the\n SETTINGS_ROW field chrome (label/meta inline-start, actions\n inline-end, `py-group` rhythm, `divide-y` hairline dividers) so\n this bespoke action panel reads as the same family as the\n decorator-driven settings surfaces. (Was per-row bordered boxes\n with `space-y-2`, a visually divergent pattern.) */\n <ul className=\"divide-y divide-border\">\n {invitations.map((invitation) => (\n <li\n key={invitation.membershipId}\n className=\"flex items-center justify-between gap-section py-group\"\n >\n <div className=\"flex min-w-0 flex-col gap-item-xs\">\n <Text className=\"font-medium\">{invitation.organizationName ?? t('unknownOrganization')}</Text>\n {invitation.roles.length > 0 && (\n <Text className=\"text-xs text-muted-foreground\">\n {/* Each role by its word, as a member directory shows it; a role with no word shows its key. */}\n {t('rolesPrefix')} {invitation.roles.map((role) => tRole(role, 'label')).join(', ')}\n </Text>\n )}\n </div>\n <div className=\"flex shrink-0 gap-element\">\n <Button\n variant={ButtonVariants_Variant.OUTLINE}\n size={ButtonSize.SM}\n disabled={busyId === invitation.membershipId}\n onClick={() => handleReject(invitation.membershipId)}\n >\n {t('rejectButton')}\n </Button>\n <Button\n size={ButtonSize.SM}\n disabled={busyId === invitation.membershipId}\n onClick={() => handleAccept(invitation.membershipId)}\n >\n {t('acceptButton')}\n </Button>\n </div>\n </li>\n ))}\n </ul>\n )}\n </CardContent>\n </Card>\n </div>\n );\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"AppPage_InvitationsSettings.labels.d.ts","sourceRoot":"","sources":["../../../../../src/components/settings/AppPage_InvitationsSettings.labels.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,mBAAmB,EAEzB,MAAM,qCAAqC,CAAC;AAO7C,eAAO,MAAM,mCAAmC,EAAE,mBAAmB,EAapE,CAAC"}
1
+ {"version":3,"file":"AppPage_InvitationsSettings.labels.d.ts","sourceRoot":"","sources":["../../../../../src/components/settings/AppPage_InvitationsSettings.labels.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,mBAAmB,EAEzB,MAAM,qCAAqC,CAAC;AAW7C,eAAO,MAAM,mCAAmC,EAAE,mBAAmB,EAWpE,CAAC"}
@@ -4,10 +4,12 @@ import { FrontendComponentType, LabelKind, registerComponentLabels, } from '@wil
4
4
  // `components.APP_LAYOUTS_INVITATIONS_SETTINGS.*` bundle; NOT imported at runtime,
5
5
  // so it never ships in the browser bundle. Keep in lock-step with the keys the
6
6
  // component reads via `tComponent(APP_LAYOUTS_INVITATIONS_SETTINGS, ...)`.
7
+ //
8
+ // No sub-heading and no list heading: `pageDescription` restated the Accept /
9
+ // Decline buttons, and `listHeading` ("Pending Invitations") restated the panel
10
+ // heading directly above it. Both were removed with the text they rendered.
7
11
  export const AppLayoutsInvitationsSettingsLabels = [
8
12
  { ref: 'pageTitle', kind: LabelKind.HEADING, purpose: 'Heading for the Invitations settings panel (the user’s own pending org invitations)' },
9
- { ref: 'pageDescription', kind: LabelKind.DESCRIPTION, purpose: 'Sub-heading explaining the panel lists organizations that invited this user, to accept or decline' },
10
- { ref: 'listHeading', kind: LabelKind.HEADING, purpose: 'Section title above the list of pending invitations' },
11
13
  { ref: 'loading', kind: LabelKind.MESSAGE, purpose: 'Shown while the pending invitations are being loaded' },
12
14
  { ref: 'empty', kind: LabelKind.MESSAGE, purpose: 'Shown when the user has no pending invitations' },
13
15
  { ref: 'unknownOrganization', kind: LabelKind.LABEL, purpose: 'Fallback label for an invitation whose organization name could not be resolved' },
@@ -1 +1 @@
1
- {"version":3,"file":"AppPage_InvitationsSettings.labels.js","sourceRoot":"","sources":["../../../../../src/components/settings/AppPage_InvitationsSettings.labels.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,SAAS,EAET,uBAAuB,GACxB,MAAM,qCAAqC,CAAC;AAE7C,gFAAgF;AAChF,6EAA6E;AAC7E,mFAAmF;AACnF,+EAA+E;AAC/E,2EAA2E;AAC3E,MAAM,CAAC,MAAM,mCAAmC,GAA0B;IACxE,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,qFAAqF,EAAE;IAC7I,EAAE,GAAG,EAAE,iBAAiB,EAAE,IAAI,EAAE,SAAS,CAAC,WAAW,EAAE,OAAO,EAAE,mGAAmG,EAAE;IACrK,EAAE,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,qDAAqD,EAAE;IAC/G,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,sDAAsD,EAAE;IAC5G,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,gDAAgD,EAAE;IACpG,EAAE,GAAG,EAAE,qBAAqB,EAAE,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,gFAAgF,EAAE;IAChJ,EAAE,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,uEAAuE,EAAE;IAC/H,EAAE,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,+DAA+D,EAAE;IACzH,EAAE,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,qCAAqC,EAAE;IAC/F,EAAE,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,yDAAyD,EAAE;IACrH,EAAE,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,0DAA0D,EAAE;IACtH,EAAE,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,0EAA0E,EAAE;CACtI,CAAC;AAEF,uBAAuB,CAAC,qBAAqB,CAAC,gCAAgC,EAAE,mCAAmC,CAAC,CAAC","sourcesContent":["import {\n FrontendComponentType,\n LabelKind,\n type LabellingUnitaryDef,\n registerComponentLabels,\n} from '@wildo-ai/presets-components-models';\n\n// Companion-only label metadata for the Invitations settings panel: keys + kind\n// + per-key purpose. Statically scanned by the dev companion to generate the\n// `components.APP_LAYOUTS_INVITATIONS_SETTINGS.*` bundle; NOT imported at runtime,\n// so it never ships in the browser bundle. Keep in lock-step with the keys the\n// component reads via `tComponent(APP_LAYOUTS_INVITATIONS_SETTINGS, ...)`.\nexport const AppLayoutsInvitationsSettingsLabels: LabellingUnitaryDef[] = [\n { ref: 'pageTitle', kind: LabelKind.HEADING, purpose: 'Heading for the Invitations settings panel (the user’s own pending org invitations)' },\n { ref: 'pageDescription', kind: LabelKind.DESCRIPTION, purpose: 'Sub-heading explaining the panel lists organizations that invited this user, to accept or decline' },\n { ref: 'listHeading', kind: LabelKind.HEADING, purpose: 'Section title above the list of pending invitations' },\n { ref: 'loading', kind: LabelKind.MESSAGE, purpose: 'Shown while the pending invitations are being loaded' },\n { ref: 'empty', kind: LabelKind.MESSAGE, purpose: 'Shown when the user has no pending invitations' },\n { ref: 'unknownOrganization', kind: LabelKind.LABEL, purpose: 'Fallback label for an invitation whose organization name could not be resolved' },\n { ref: 'rolesPrefix', kind: LabelKind.LABEL, purpose: 'Prefix before the list of roles the invitation grants (e.g. \"Roles:\")' },\n { ref: 'acceptButton', kind: LabelKind.BUTTON, purpose: 'Button that accepts the invitation and joins the organization' },\n { ref: 'rejectButton', kind: LabelKind.BUTTON, purpose: 'Button that declines the invitation' },\n { ref: 'acceptSuccess', kind: LabelKind.MESSAGE, purpose: 'Confirmation shown after the user accepts an invitation' },\n { ref: 'rejectSuccess', kind: LabelKind.MESSAGE, purpose: 'Confirmation shown after the user declines an invitation' },\n { ref: 'errorGeneric', kind: LabelKind.MESSAGE, purpose: 'Generic error shown when listing/accepting/declining an invitation fails' },\n];\n\nregisterComponentLabels(FrontendComponentType.APP_LAYOUTS_INVITATIONS_SETTINGS, AppLayoutsInvitationsSettingsLabels);\n"]}
1
+ {"version":3,"file":"AppPage_InvitationsSettings.labels.js","sourceRoot":"","sources":["../../../../../src/components/settings/AppPage_InvitationsSettings.labels.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,SAAS,EAET,uBAAuB,GACxB,MAAM,qCAAqC,CAAC;AAE7C,gFAAgF;AAChF,6EAA6E;AAC7E,mFAAmF;AACnF,+EAA+E;AAC/E,2EAA2E;AAC3E,EAAE;AACF,8EAA8E;AAC9E,gFAAgF;AAChF,4EAA4E;AAC5E,MAAM,CAAC,MAAM,mCAAmC,GAA0B;IACxE,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,qFAAqF,EAAE;IAC7I,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,sDAAsD,EAAE;IAC5G,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,gDAAgD,EAAE;IACpG,EAAE,GAAG,EAAE,qBAAqB,EAAE,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,gFAAgF,EAAE;IAChJ,EAAE,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,uEAAuE,EAAE;IAC/H,EAAE,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,+DAA+D,EAAE;IACzH,EAAE,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,qCAAqC,EAAE;IAC/F,EAAE,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,yDAAyD,EAAE;IACrH,EAAE,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,0DAA0D,EAAE;IACtH,EAAE,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,0EAA0E,EAAE;CACtI,CAAC;AAEF,uBAAuB,CAAC,qBAAqB,CAAC,gCAAgC,EAAE,mCAAmC,CAAC,CAAC","sourcesContent":["import {\n FrontendComponentType,\n LabelKind,\n type LabellingUnitaryDef,\n registerComponentLabels,\n} from '@wildo-ai/presets-components-models';\n\n// Companion-only label metadata for the Invitations settings panel: keys + kind\n// + per-key purpose. Statically scanned by the dev companion to generate the\n// `components.APP_LAYOUTS_INVITATIONS_SETTINGS.*` bundle; NOT imported at runtime,\n// so it never ships in the browser bundle. Keep in lock-step with the keys the\n// component reads via `tComponent(APP_LAYOUTS_INVITATIONS_SETTINGS, ...)`.\n//\n// No sub-heading and no list heading: `pageDescription` restated the Accept /\n// Decline buttons, and `listHeading` (\"Pending Invitations\") restated the panel\n// heading directly above it. Both were removed with the text they rendered.\nexport const AppLayoutsInvitationsSettingsLabels: LabellingUnitaryDef[] = [\n { ref: 'pageTitle', kind: LabelKind.HEADING, purpose: 'Heading for the Invitations settings panel (the user’s own pending org invitations)' },\n { ref: 'loading', kind: LabelKind.MESSAGE, purpose: 'Shown while the pending invitations are being loaded' },\n { ref: 'empty', kind: LabelKind.MESSAGE, purpose: 'Shown when the user has no pending invitations' },\n { ref: 'unknownOrganization', kind: LabelKind.LABEL, purpose: 'Fallback label for an invitation whose organization name could not be resolved' },\n { ref: 'rolesPrefix', kind: LabelKind.LABEL, purpose: 'Prefix before the list of roles the invitation grants (e.g. \"Roles:\")' },\n { ref: 'acceptButton', kind: LabelKind.BUTTON, purpose: 'Button that accepts the invitation and joins the organization' },\n { ref: 'rejectButton', kind: LabelKind.BUTTON, purpose: 'Button that declines the invitation' },\n { ref: 'acceptSuccess', kind: LabelKind.MESSAGE, purpose: 'Confirmation shown after the user accepts an invitation' },\n { ref: 'rejectSuccess', kind: LabelKind.MESSAGE, purpose: 'Confirmation shown after the user declines an invitation' },\n { ref: 'errorGeneric', kind: LabelKind.MESSAGE, purpose: 'Generic error shown when listing/accepting/declining an invitation fails' },\n];\n\nregisterComponentLabels(FrontendComponentType.APP_LAYOUTS_INVITATIONS_SETTINGS, AppLayoutsInvitationsSettingsLabels);\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"SettingsHub.d.ts","sourceRoot":"","sources":["../../../../../src/components/settings/SettingsHub.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,KAA4D,MAAM,OAAO,CAAC;AAyMjF,MAAM,WAAW,gBAAgB;IAC/B,6DAA6D;IAC7D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0FAA0F;IAC1F,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,WAAW,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,gBAAgB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CA2T1F"}
1
+ {"version":3,"file":"SettingsHub.d.ts","sourceRoot":"","sources":["../../../../../src/components/settings/SettingsHub.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,KAA4D,MAAM,OAAO,CAAC;AA4MjF,MAAM,WAAW,gBAAgB;IAC/B,6DAA6D;IAC7D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0FAA0F;IAC1F,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,WAAW,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,gBAAgB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CA2T1F"}
@@ -38,6 +38,7 @@ import { AppPage_InvitationsSettings } from './AppPage_InvitationsSettings.js';
38
38
  import { AppPage_BillingSettings } from './AppPage_BillingSettings.js';
39
39
  import { ExternalProvider_Connection_OwnerScope } from '@wildo-ai/external-connectors-models';
40
40
  import { AppPage_ConnectedAccountsSettings } from './AppPage_ConnectedAccountsSettings.js';
41
+ import { AppPage_AgentWorkOverrideRateSettings } from './AppPage_AgentWorkOverrideRateSettings.js';
41
42
  import { ComponentRegistryService } from '../../core/components-registry/component-registry.frontend.service.js';
42
43
  import { ComponentNotInjected } from '../../core/components-registry/ComponentNotInjected.js';
43
44
  import { SettingsPanelRef, SettingsSectionTargetKind } from '../../core/config/settings-hub.frontend.schemas.js';
@@ -88,6 +89,8 @@ function SettingsEnginePanel({ panelRef }) {
88
89
  // A default is invisible at the call site, and the one thing a reader must be able to see here
89
90
  // is whose account each panel connects.
90
91
  return _jsx(AppPage_ConnectedAccountsSettings, { ownerScope: ExternalProvider_Connection_OwnerScope.ORGANIZATION });
92
+ case SettingsPanelRef.AGENT_WORK_OVERRIDE_RATE:
93
+ return _jsx(AppPage_AgentWorkOverrideRateSettings, {});
91
94
  }
92
95
  }
93
96
  function SettingsTargetRenderer({ target, resolveSubTabLabel, subTabRef, onSubTabChange, }) {
@@ -1 +1 @@
1
- {"version":3,"file":"SettingsHub.js","sourceRoot":"","sources":["../../../../../src/components/settings/SettingsHub.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * SettingsHub — the unified settings surface.\n *\n * Renders the declarative `ResolvedSettingsHubConfig` as a vertical NAVIGATION rail beside a\n * content panel. Categories become labelled groups of links, each destination addressed by its own\n * URL. A section's `target` resolves to a framework panel, an auto-rendered resource surface, a\n * custom component, or a set of horizontal sub-tabs.\n *\n * The rail was a `Tabs`/`TabsList` until 2026-09-19, chosen so that section state and keyboard\n * roving came from the primitive rather than being hand-rolled. It became navigation because a\n * tablist switches panels WITHIN a view while these are thirty destinations that each own a URL —\n * and the keyboard argument dissolves rather than transferring: roving tabindex is a tablist\n * requirement, and navigation wants ordinary Tab order through links. See the rail's own comment.\n *\n * The SUB-TABS are still `Tabs`, correctly: Configuration/Connections inside one destination is\n * exactly what a tablist is for.\n *\n * Mounted by `NavigationContentRenderer` for `NavigationContentType.SETTINGS_HUB`\n * (always in the overlay zone). The `sectionRef` prop pre-selects the open\n * section and is kept in sync so URL-driven section changes re-select the rail.\n */\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { Link, useNavigate } from 'react-router-dom';\nimport { ViewportBreakpoint } from '@wildo-ai/zod-decorators';\nimport { CorePresetNames, FrontendComponentType, SelectableVariant, UIBehavior } from '@wildo-ai/presets-components-models';\nimport { Tabs, TabsList, TabsTrigger, TabsContent } from '~wildo-frontend-lib/components/sections/tabs';\nimport { Separator } from '~wildo-frontend-lib/components/layout/separator';\nimport { Button, ButtonVariants_Variant } from '~wildo-frontend-lib/components/actions/button';\nimport { ButtonSize } from '@wildo-ai/presets-components-models';\nimport { useIconRegistry } from '~wildo-frontend-lib/core/icons/useIconRegistry';\nimport { IconSize, StandardIconReference } from '~wildo-frontend-lib/core/icons/icon-registry.frontend.schemas';\nimport { useUI } from '~wildo-frontend-lib/core/ui/useUI';\nimport { cn } from '~wildo-frontend-lib/core/ui/cn';\nimport { AppPage_SecuritySettings } from '~wildo-frontend-lib/components/auth/admin-config/AppPage_SecuritySettings';\nimport { AppPage_AppearanceSettings } from './AppPage_AppearanceSettings';\nimport { AppPage_InvitationsSettings } from './AppPage_InvitationsSettings';\nimport { AppPage_BillingSettings } from './AppPage_BillingSettings';\nimport { ExternalProvider_Connection_OwnerScope } from '@wildo-ai/external-connectors-models';\nimport { AppPage_ConnectedAccountsSettings } from './AppPage_ConnectedAccountsSettings';\nimport { ComponentRegistryService } from '~wildo-frontend-lib/core/components-registry/component-registry.frontend.service';\nimport { ComponentNotInjected } from '~wildo-frontend-lib/core/components-registry/ComponentNotInjected';\nimport { SettingsPanelRef, SettingsSectionTargetKind } from '~wildo-frontend-lib/core/config/settings-hub.frontend.schemas';\nimport type {\n ResolvedSettingsHubConfig,\n SettingsCategory,\n SettingsSection,\n SettingsSectionTarget,\n SettingsSubTabsTarget,\n} from '~wildo-frontend-lib/core/config/settings-hub.frontend.schemas';\nimport { CommonRoutePaths } from '~wildo-frontend-lib/core/runtime/routes.frontend.definitions';\nimport { useVisibleSettingsHubConfig } from '~wildo-frontend-lib/core/config/useVisibleSettingsHubConfig';\nimport { useI18n } from '~wildo-frontend-lib/core/i18n/useI18n';\nimport { FeatureGate } from '~wildo-frontend-lib/core/features/FeatureGate';\nimport { LoadingGate } from '~wildo-frontend-lib/core/loading/LoadingGate';\nimport { SettingsResourceOperationPanel } from './SettingsResourceOperationPanel';\n\n// ──────────────────────────────────────────────────────────────\n// Config helpers\n// ──────────────────────────────────────────────────────────────\n\nfunction orderedCategories(config: ResolvedSettingsHubConfig): SettingsCategory[] {\n return [...config.categories].sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\n}\n\nfunction sectionsForCategory(config: ResolvedSettingsHubConfig, categoryRef: string): SettingsSection[] {\n return config.sections\n .filter(section => section.categoryRef === categoryRef)\n .sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\n}\n\n/** Resolve the section to open: requested → config default → first section. */\nfunction resolveActiveSection(config: ResolvedSettingsHubConfig, sectionRef?: string): string | undefined {\n if (sectionRef && config.sections.some(section => section.ref === sectionRef)) return sectionRef;\n if (config.defaultSectionRef && config.sections.some(section => section.ref === config.defaultSectionRef)) {\n return config.defaultSectionRef;\n }\n return config.sections[0]?.ref;\n}\n\n// ──────────────────────────────────────────────────────────────\n// Target rendering (function declarations → hoisted for mutual recursion\n// between a SUB_TABS target and its leaf targets)\n// ──────────────────────────────────────────────────────────────\n\nfunction SettingsEnginePanel({ panelRef }: { panelRef: SettingsPanelRef }): React.JSX.Element {\n switch (panelRef) {\n case SettingsPanelRef.SECURITY:\n return <AppPage_SecuritySettings />;\n case SettingsPanelRef.APPEARANCE:\n return <AppPage_AppearanceSettings />;\n case SettingsPanelRef.INVITATIONS:\n return <AppPage_InvitationsSettings />;\n case SettingsPanelRef.BILLING:\n return <AppPage_BillingSettings />;\n case SettingsPanelRef.CONNECTED_ACCOUNTS:\n return <AppPage_ConnectedAccountsSettings ownerScope={ExternalProvider_Connection_OwnerScope.USER} />;\n case SettingsPanelRef.ORGANIZATION_CONNECTED_ACCOUNTS:\n // The scope is passed EXPLICITLY at both sites rather than left to the component's default.\n // A default is invisible at the call site, and the one thing a reader must be able to see here\n // is whose account each panel connects.\n return <AppPage_ConnectedAccountsSettings ownerScope={ExternalProvider_Connection_OwnerScope.ORGANIZATION} />;\n }\n}\n\n/** Resolves a display label for a section/sub-tab ref, falling back to the authored label. */\ntype SettingsLabelResolver = (ref: string, fallbackLabel: string) => string;\n\nfunction SettingsTargetRenderer({\n target,\n resolveSubTabLabel,\n subTabRef,\n onSubTabChange,\n}: {\n target: SettingsSectionTarget;\n resolveSubTabLabel: SettingsLabelResolver;\n subTabRef?: string;\n onSubTabChange?: (subTabRef: string) => void;\n}): React.JSX.Element {\n switch (target.kind) {\n case SettingsSectionTargetKind.ENGINE_PANEL:\n return <SettingsEnginePanel panelRef={target.panelRef} />;\n case SettingsSectionTargetKind.CUSTOM_COMPONENT: {\n const CustomComponent = ComponentRegistryService.resolve(\n target.componentRef,\n CorePresetNames.DEFAULT,\n );\n if (!CustomComponent) {\n return <ComponentNotInjected componentType={target.componentRef} componentName={target.componentRef} />;\n }\n return (\n <React.Suspense fallback={<div className=\"h-8 animate-pulse motion-reduce:animate-none bg-muted rounded\" aria-hidden=\"true\" />}>\n <CustomComponent />\n </React.Suspense>\n );\n }\n case SettingsSectionTargetKind.RESOURCE_OPERATION:\n return (\n <SettingsResourceOperationPanel\n resourceType={target.resourceType}\n operation={target.operation}\n operationVariant={target.operationVariant}\n />\n );\n case SettingsSectionTargetKind.SUB_TABS:\n return (\n <SettingsSubTabs\n target={target}\n resolveSubTabLabel={resolveSubTabLabel}\n subTabRef={subTabRef}\n onSubTabChange={onSubTabChange}\n />\n );\n }\n}\n\n/**\n * The sub-tab strip inside one section.\n *\n * The active tab is URL-DRIVEN since 2026-09-17. It used to be `useState(target.subTabs[0]?.ref)` —\n * local state that read nothing from the URL — so all twenty-one sub-tab panels in the shipped\n * catalogue were unaddressable: every link to a sub-tabbed section opened its FIRST tab, and\n * \"Single sign-on → Connections\" could not be sent to anybody. That contradicted the hub's own\n * contract, which is that the URL is its single source of truth, and it made the outcome banner a\n * connect-callback renders depend on tab ORDER rather than on the URL it returns to.\n *\n * A `subTabRef` the section does not declare is IGNORED rather than refused: the tab falls back to\n * the first entry, so a stale bookmark or a hand-typed segment still opens the section instead of an\n * error. `onSubTabChange` writes the selection back, which is what makes the strip a navigation\n * control rather than a widget with a URL beside it.\n */\nfunction SettingsSubTabs({\n target,\n resolveSubTabLabel,\n subTabRef,\n onSubTabChange,\n}: {\n target: SettingsSubTabsTarget;\n resolveSubTabLabel: SettingsLabelResolver;\n subTabRef?: string;\n onSubTabChange?: (subTabRef: string) => void;\n}): React.JSX.Element | null {\n const active = target.subTabs.some(subTab => subTab.ref === subTabRef)\n ? subTabRef\n : target.subTabs[0]?.ref;\n if (target.subTabs.length === 0) return null;\n return (\n <Tabs value={active} onValueChange={next => onSubTabChange?.(next)}>\n <TabsList>\n {target.subTabs.map(subTab => (\n // `data-ref` is the i18n-independent automation hook (labels are\n // runtime-translated; e2e drives must never key off them).\n <TabsTrigger key={subTab.ref} value={subTab.ref} data-ref={subTab.ref}>\n {resolveSubTabLabel(subTab.ref, subTab.label)}\n </TabsTrigger>\n ))}\n </TabsList>\n {target.subTabs.map(subTab => (\n <TabsContent key={subTab.ref} value={subTab.ref}>\n {/* Leaf targets only (schema forbids nested sub-tabs); the resolver is\n still threaded to satisfy the shared renderer signature. */}\n <SettingsTargetRenderer target={subTab.target} resolveSubTabLabel={resolveSubTabLabel} />\n </TabsContent>\n ))}\n </Tabs>\n );\n}\n\n/**\n * A rail item's layout classes — full-width, left-aligned, icon-tolerant.\n *\n * Carried here rather than reused from the tab trigger because the rail is no longer a tab: this is\n * a navigation item and owns its own shape. Only the SELECTED treatment is shared, and that comes\n * from the theme recipe rather than from a copied class string, so a theme change still reaches\n * both.\n */\nconst RAIL_ITEM_CLASSES =\n \"inline-flex w-full cursor-pointer items-center justify-start gap-1.5 whitespace-nowrap rounded-md px-card-sm py-item text-sm font-medium no-underline [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\";\n\n// ──────────────────────────────────────────────────────────────\n// Hub\n// ──────────────────────────────────────────────────────────────\n\nexport interface SettingsHubProps {\n /** Section to pre-open; falls back to the config default. */\n sectionRef?: string;\n /** Sub-tab of `sectionRef` to pre-open; ignored when the section declares no such tab. */\n subTabRef?: string;\n}\n\nexport function SettingsHub({ sectionRef, subTabRef }: SettingsHubProps): React.JSX.Element {\n const config = useVisibleSettingsHubConfig();\n const categories = useMemo(() => orderedCategories(config), [config]);\n const [active, setActive] = useState<string | undefined>(() => resolveActiveSection(config, sectionRef));\n const routerNavigate = useNavigate();\n\n /*\n * In-hub navigation WRITES the URL. Until 2026-09-17 it did not, at either level: the rail set\n * local state and the sub-tab strip held its own, so the address bar kept whatever section the\n * hub was opened at. Deep-linking IN worked and linking OUT never did — you could be looking at\n * Administration → Single sign-on → Connections with `/settings/profile` in the address bar, and\n * no sequence of clicks produced a URL for where you were.\n *\n * REPLACE rather than push, deliberately. A settings rail is a switcher, not a trail: pushing\n * would make Back walk every section a person browsed before leaving the hub, which is the\n * behaviour the overlay's own dismiss already owns. Replace keeps the address bar truthful and\n * leaves Back meaning \"leave settings\".\n *\n * The overlay reconciler converges on the new URL — it keys on section AND sub-tab, so a tab\n * switch inside one section is seen as a change rather than as already-correct. There is no loop:\n * only a user gesture calls these, and the reconciler emits no navigation of its own.\n */\n // The SECTION half of this used to be `navigateToSection`, which the rail's triggers called. The\n // rail's links now carry `to` + `replace` themselves, and `active` is driven by the URL-sync\n // effect below — so the helper had no caller left. The SUB-TAB half stays: those really are tabs.\n\n const handleSubTabChange = useCallback((nextSubTabRef: string) => {\n if (!active) return;\n routerNavigate(`${CommonRoutePaths.settings}/${active}/${nextSubTabRef}`, { replace: true });\n }, [active, routerNavigate]);\n\n /*\n * On a small screen the hub is a BACK-STACK rather than two panes.\n *\n * It had no responsive treatment at all before 2026-09-17 — a fixed `w-60 shrink-0` rail at every\n * width, which is 240px of a ~375px viewport, and the rail is now thirty entries rather than\n * sixteen. The back-stack is chosen over a drawer or a collapsed select because the panel BELOW\n * already works this way: `SettingsSectionNavigationHost` keeps a section's own drill-ins\n * (view → edit → back) inside the panel, so mobile becomes the same mechanism one level up\n * instead of a second navigation concept.\n *\n * WHICH screen shows is the URL's business, not local state: `/settings` is the list and\n * `/settings/:sectionRef` is a section. That falls out of the hub's own contract — the URL is its\n * single source of truth — and it means Back, a deep link and a shared link all agree without any\n * of them being special-cased.\n *\n * Both panes stay MOUNTED and only their classes change. `field-chrome-and-sections.md` Gotcha 1b\n * records what the alternative costs: a chrome that swapped element structure across a breakpoint\n * remounted its control and dropped a pending edit on resize. Hiding is a class here for exactly\n * that reason.\n */\n const { UIConfig, getRecipe } = useUI();\n /*\n * The rail item's SELECTED styling comes from the theme's SELECTABLE/FILLED recipe — the same one\n * the vertical tab trigger used, so the rail looks exactly as it did and still follows whatever a\n * theme dresses it in. The recipe keys on `data-state`, which each link sets from `active`.\n */\n const railItemRecipe = getRecipe(UIBehavior.SELECTABLE, SelectableVariant.FILLED);\n const { renderIcon } = useIconRegistry();\n const isMobile = UIConfig?.currentBreakpoint === ViewportBreakpoint.MOBILE;\n const mobileShowsSection = isMobile && Boolean(sectionRef);\n\n const handleBackToSections = useCallback(() => {\n routerNavigate(CommonRoutePaths.settings, { replace: true });\n }, [routerNavigate]);\n\n\n const { tComponent, tSettingsHubCategory, tSettingsHubSection, isReady } = useI18n({\n component: FrontendComponentType.APP_LAYOUTS_SETTINGS_HUB,\n });\n // Hub chrome labels (title, rail aria-label) read from the scoped component\n // namespace. Copy is owned by the labelling pipeline (declared in the sibling\n // `.labels.ts`), so there are deliberately no inline fallback strings — the\n // hub gates on `isReady` below, the same convention as the panels it hosts\n // (`AppPage_SecuritySettings` / `AppPage_AppearanceSettings`). The dynamic\n // category/section labels keep their config-authored `fallbackLabel` (the\n // required contract of `tSettingsHubCategory` / `tSettingsHubSection`).\n const t = useCallback(\n (key: string) => tComponent(FrontendComponentType.APP_LAYOUTS_SETTINGS_HUB, key),\n [tComponent],\n );\n\n /** The pushed section's own label — the mobile header's only cue for where you are. */\n const activeSectionLabel = useMemo(() => {\n const section = config.sections.find(candidate => candidate.ref === active);\n return section ? tSettingsHubSection(section.ref, section.label) : undefined;\n }, [config.sections, active, tSettingsHubSection]);\n\n // Keep the rail in sync with URL-driven section changes (deep-link / browser\n // nav). Keyed on `sectionRef` ALONE — deliberately not on `config` as well.\n // The gated config is derived from live signals (scope, roles, features,\n // runtime capabilities), so its identity churns independently of its content;\n // with `config` in the deps this ran after essentially every render and\n // re-asserted the requested-or-default section, which overwrote the section\n // the user had just clicked in the rail. The rail then looked inert: the\n // click did select, and the effect immediately put it back.\n useEffect(() => {\n if (!sectionRef) return;\n setActive(previous => (previous === sectionRef ? previous : sectionRef));\n }, [sectionRef]);\n\n /*\n * Bring the OPEN section into view when it is not — and only then.\n *\n * The rail carries thirty destinations and scrolls, so a cold load or a deep link at a section\n * near the bottom (`/settings/webhooks`) renders a list scrolled to the top with nothing on it\n * marked: the one cue that says where you are is off screen, and the reader has to scroll a list\n * of thirty to find out.\n *\n * `block: 'nearest'` is what makes this safe to run on every section change rather than only on\n * mount: it is defined to move the container by the MINIMUM needed, so an item already fully\n * visible — the ordinary case when somebody clicks the rail — is not scrolled at all. That is the\n * whole reason it is 'nearest' and not 'center', which would yank the list on every click and\n * replace one annoyance with another.\n *\n * It pairs with, and does not substitute for, the key fix in `getContentKey`: this positions the\n * rail, that one stops the rail being rebuilt (and its scroll offset discarded) on every click.\n * Without the key fix this would fire into a freshly mounted `<nav>` each time and merely make the\n * reset land somewhere else.\n */\n const activeRailItemRef = useRef<HTMLAnchorElement | null>(null);\n useEffect(() => {\n if (!active) return;\n activeRailItemRef.current?.scrollIntoView({ block: 'nearest', inline: 'nearest' });\n }, [active]);\n\n // Adopt a section from the config ONLY when the current one is not (or is no\n // longer) selectable — first resolve after an async gating signal lands, or a\n // section disappearing because the user's roles/features changed. Anything\n // broader would re-run the reset described above.\n useEffect(() => {\n setActive(previous =>\n previous && config.sections.some(section => section.ref === previous)\n ? previous\n : resolveActiveSection(config, sectionRef),\n );\n // `sectionRef` is read as the fallback preference only; following ITS\n // changes is the effect above.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [config]);\n\n /*\n * Gate on label readiness so the hub chrome never flashes raw key paths — copy is pipeline-owned\n * with no inline fallback, matching the hosted panels.\n *\n * Through `LoadingGate` rather than `if (!isReady) return null`, which is what this was until\n * 2026-09-17. Returning null is correct about the raw keys and wrong about everything else: the\n * overlay is already open and mounted by the time the hub renders, so a null gave a person an\n * empty dialog with no indication that anything was coming — and the wait got longer as the rail\n * grew. `LoadingGate` keeps the same guarantee (children are not rendered until ready) and lets\n * the ENCLOSING SURFACE POLICY choose the treatment, which for an overlay is to overlay the\n * children rather than to blank them. The hub does not pick a visual here on purpose: that choice\n * belongs to the surface it is hosted in, and hard-coding a skeleton would override a policy the\n * design system already owns.\n */\n return (\n <LoadingGate readiness={[{ id: 'settings-hub-labels', isReady }]}>\n {/*\n `min-w-0` is REQUIRED: this is the grid item of the (fixed-width) dialog surface.\n Without it the item keeps its default `min-width: auto` and cannot shrink below its\n content's min-content width — a wide field row (e.g. a file card with a long\n filename, or a text input) then pushes the whole two-pane body past the dialog edge,\n and the dialog's `overflow-x: hidden` clips the right side of every field. `min-w-0`\n lets the item fit the track so the content pane (and its form) reflow within it.\n */}\n <div className=\"flex h-full min-h-0 flex-col min-w-0\">\n <header className=\"flex h-14 shrink-0 items-center gap-item border-b px-card-lg\">\n {mobileShowsSection && (\n <Button\n variant={ButtonVariants_Variant.GHOST}\n size={ButtonSize.ICON_SM}\n aria-label={t('backToSections')}\n onClick={handleBackToSections}\n >\n {renderIcon(StandardIconReference.BACK, { size: IconSize.SM })}\n </Button>\n )}\n {/* On mobile the header names the SECTION you pushed into — without it the back-stack loses\n the one cue that says where you are, since the rail that said so is off screen. */}\n <h2 className=\"truncate text-base font-semibold tracking-tight\">\n {mobileShowsSection ? activeSectionLabel ?? t('title') : t('title')}\n </h2>\n </header>\n <div className=\"flex min-h-0 flex-1\">\n {/*\n * The rail is NAVIGATION, not a tablist, and until 2026-09-19 it was rendered as one —\n * thirty `<button role=\"tab\">` in a `TabsList`. Three things followed, all measured on the\n * running application:\n *\n * - No destination could be OPENED any other way. `/settings/members` is a real route the\n * hub already writes to the address bar, but with no `href` there was nothing to\n * ⌘-click, middle-click or \"copy link address\" — the one gesture an operator uses to\n * send a colleague to a setting.\n * - The ARIA pattern was wrong for what this is. A tablist switches panels WITHIN a view;\n * a list of destinations that each own a URL is navigation (WAI-ARIA APG). That is not a\n * preference — it decides what an assistive technology announces and how it is reached.\n * - The category headings carried `role=\"presentation\"`, so they were invisible to\n * assistive technology, and a tablist cannot nest labelled groups anyway. That left AT\n * users with a flat list of thirty items containing NINE duplicated names — \"General\",\n * \"Entitlements\", \"API keys\", \"Connected accounts\", \"Single sign-on\", \"User\n * provisioning\", \"Audit streaming\", \"Webhooks\" and \"Audit log\" each appear under two\n * scopes — with nothing to tell the pairs apart.\n *\n * A `<nav>` of grouped links fixes all three at once, and the keyboard concern the previous\n * shape was chosen for DISSOLVES rather than needing to be reimplemented: roving tabindex\n * is a tablist requirement. Navigation uses ordinary Tab order through links, which is what\n * a reader expects and what the browser already does.\n *\n * `replace` is kept from the old `navigateToSection` and for its reason: a settings rail is\n * a switcher, not a trail, so Back means \"leave settings\" rather than walking every section\n * somebody browsed.\n */}\n <nav\n aria-label={t('sectionsNavLabel')}\n className={cn(\n 'overflow-y-auto px-card-sm py-card',\n // Desktop: the fixed rail beside the content. Mobile: the full-width first screen of the\n // back-stack, with no divider because there is nothing beside it.\n isMobile ? 'w-full flex-1' : 'w-60 shrink-0 border-e',\n mobileShowsSection && 'hidden',\n )}\n >\n {categories.map((category, index) => {\n const sections = sectionsForCategory(config, category.ref);\n if (sections.length === 0) return null;\n const categoryLabelId = `settings-hub-category-${category.ref}`;\n return (\n <React.Fragment key={category.ref}>\n {index > 0 && <Separator className=\"my-item\" />}\n {/* Named, not decorative: this heading is the ONLY thing distinguishing the nine\n section labels that appear under two scopes, so it has to reach AT. */}\n <div\n id={categoryLabelId}\n className=\"px-card-sm py-card-sm text-xs font-medium uppercase tracking-wider text-muted-foreground\"\n >\n {tSettingsHubCategory(category.ref, category.label)}\n </div>\n <div role=\"group\" aria-labelledby={categoryLabelId}>\n {sections.map(section => {\n const isActive = section.ref === active;\n return (\n // `data-ref` = i18n-independent automation hook (see sub-tabs above).\n <Link\n key={section.ref}\n // Only the OPEN item is tracked — the effect above needs one element, and a\n // ref on all thirty would be thirty callbacks re-created every render.\n ref={isActive ? activeRailItemRef : undefined}\n to={`${CommonRoutePaths.settings}/${section.ref}`}\n replace\n data-ref={section.ref}\n aria-current={isActive ? 'page' : undefined}\n data-state={isActive ? 'active' : 'inactive'}\n className={cn(\n RAIL_ITEM_CLASSES,\n // Composed part by part, exactly as the tab trigger does — `getRecipe`\n // returns a STRUCTURE (base / states / motion), not a class string, and\n // handing the object to `cn()` silently yields nothing. That is how the\n // first cut of this lost the selected fill while every other class held.\n railItemRecipe.base,\n railItemRecipe.states.focus,\n railItemRecipe.states.selected,\n railItemRecipe.motion.transition,\n )}\n >\n {tSettingsHubSection(section.ref, section.label)}\n </Link>\n );\n })}\n </div>\n </React.Fragment>\n );\n })}\n </nav>\n <div\n className={cn(\n 'min-w-0 flex-1 overflow-y-auto p-card-lg',\n isMobile && !mobileShowsSection && 'hidden',\n )}\n >\n {/*\n * ONE section renders — the active one. `TabsContent` unmounts its inactive panels\n * anyway, so this is the same mounting behaviour written directly rather than delegated\n * to a primitive the rail no longer uses.\n */}\n {config.sections.filter(section => section.ref === active).map(section => (\n <React.Fragment key={section.ref}>\n {section.entitlementFeatureId ? (\n // Section SURVIVED because the app OFFERS this feature\n // (`runtimeAvailability` capability = plan-independent\n // `isFeatureOffered`). Render its body through the entitlement gate:\n // entitled → the config surface; offered-but-not-entitled → the\n // policy-driven upgrade/add-on prompt (never a silent disappearance).\n <FeatureGate featureId={section.entitlementFeatureId}>\n <SettingsTargetRenderer\n target={section.target}\n resolveSubTabLabel={tSettingsHubSection}\n subTabRef={section.ref === active ? subTabRef : undefined}\n onSubTabChange={handleSubTabChange}\n />\n </FeatureGate>\n ) : (\n <SettingsTargetRenderer\n target={section.target}\n resolveSubTabLabel={tSettingsHubSection}\n subTabRef={section.ref === active ? subTabRef : undefined}\n onSubTabChange={handleSubTabChange}\n />\n )}\n </React.Fragment>\n ))}\n </div>\n </div>\n </div>\n </LoadingGate>\n );\n}\n"]}
1
+ {"version":3,"file":"SettingsHub.js","sourceRoot":"","sources":["../../../../../src/components/settings/SettingsHub.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * SettingsHub — the unified settings surface.\n *\n * Renders the declarative `ResolvedSettingsHubConfig` as a vertical NAVIGATION rail beside a\n * content panel. Categories become labelled groups of links, each destination addressed by its own\n * URL. A section's `target` resolves to a framework panel, an auto-rendered resource surface, a\n * custom component, or a set of horizontal sub-tabs.\n *\n * The rail was a `Tabs`/`TabsList` until 2026-09-19, chosen so that section state and keyboard\n * roving came from the primitive rather than being hand-rolled. It became navigation because a\n * tablist switches panels WITHIN a view while these are thirty destinations that each own a URL —\n * and the keyboard argument dissolves rather than transferring: roving tabindex is a tablist\n * requirement, and navigation wants ordinary Tab order through links. See the rail's own comment.\n *\n * The SUB-TABS are still `Tabs`, correctly: Configuration/Connections inside one destination is\n * exactly what a tablist is for.\n *\n * Mounted by `NavigationContentRenderer` for `NavigationContentType.SETTINGS_HUB`\n * (always in the overlay zone). The `sectionRef` prop pre-selects the open\n * section and is kept in sync so URL-driven section changes re-select the rail.\n */\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { Link, useNavigate } from 'react-router-dom';\nimport { ViewportBreakpoint } from '@wildo-ai/zod-decorators';\nimport { CorePresetNames, FrontendComponentType, SelectableVariant, UIBehavior } from '@wildo-ai/presets-components-models';\nimport { Tabs, TabsList, TabsTrigger, TabsContent } from '~wildo-frontend-lib/components/sections/tabs';\nimport { Separator } from '~wildo-frontend-lib/components/layout/separator';\nimport { Button, ButtonVariants_Variant } from '~wildo-frontend-lib/components/actions/button';\nimport { ButtonSize } from '@wildo-ai/presets-components-models';\nimport { useIconRegistry } from '~wildo-frontend-lib/core/icons/useIconRegistry';\nimport { IconSize, StandardIconReference } from '~wildo-frontend-lib/core/icons/icon-registry.frontend.schemas';\nimport { useUI } from '~wildo-frontend-lib/core/ui/useUI';\nimport { cn } from '~wildo-frontend-lib/core/ui/cn';\nimport { AppPage_SecuritySettings } from '~wildo-frontend-lib/components/auth/admin-config/AppPage_SecuritySettings';\nimport { AppPage_AppearanceSettings } from './AppPage_AppearanceSettings';\nimport { AppPage_InvitationsSettings } from './AppPage_InvitationsSettings';\nimport { AppPage_BillingSettings } from './AppPage_BillingSettings';\nimport { ExternalProvider_Connection_OwnerScope } from '@wildo-ai/external-connectors-models';\nimport { AppPage_ConnectedAccountsSettings } from './AppPage_ConnectedAccountsSettings';\nimport { AppPage_AgentWorkOverrideRateSettings } from './AppPage_AgentWorkOverrideRateSettings';\nimport { ComponentRegistryService } from '~wildo-frontend-lib/core/components-registry/component-registry.frontend.service';\nimport { ComponentNotInjected } from '~wildo-frontend-lib/core/components-registry/ComponentNotInjected';\nimport { SettingsPanelRef, SettingsSectionTargetKind } from '~wildo-frontend-lib/core/config/settings-hub.frontend.schemas';\nimport type {\n ResolvedSettingsHubConfig,\n SettingsCategory,\n SettingsSection,\n SettingsSectionTarget,\n SettingsSubTabsTarget,\n} from '~wildo-frontend-lib/core/config/settings-hub.frontend.schemas';\nimport { CommonRoutePaths } from '~wildo-frontend-lib/core/runtime/routes.frontend.definitions';\nimport { useVisibleSettingsHubConfig } from '~wildo-frontend-lib/core/config/useVisibleSettingsHubConfig';\nimport { useI18n } from '~wildo-frontend-lib/core/i18n/useI18n';\nimport { FeatureGate } from '~wildo-frontend-lib/core/features/FeatureGate';\nimport { LoadingGate } from '~wildo-frontend-lib/core/loading/LoadingGate';\nimport { SettingsResourceOperationPanel } from './SettingsResourceOperationPanel';\n\n// ──────────────────────────────────────────────────────────────\n// Config helpers\n// ──────────────────────────────────────────────────────────────\n\nfunction orderedCategories(config: ResolvedSettingsHubConfig): SettingsCategory[] {\n return [...config.categories].sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\n}\n\nfunction sectionsForCategory(config: ResolvedSettingsHubConfig, categoryRef: string): SettingsSection[] {\n return config.sections\n .filter(section => section.categoryRef === categoryRef)\n .sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\n}\n\n/** Resolve the section to open: requested → config default → first section. */\nfunction resolveActiveSection(config: ResolvedSettingsHubConfig, sectionRef?: string): string | undefined {\n if (sectionRef && config.sections.some(section => section.ref === sectionRef)) return sectionRef;\n if (config.defaultSectionRef && config.sections.some(section => section.ref === config.defaultSectionRef)) {\n return config.defaultSectionRef;\n }\n return config.sections[0]?.ref;\n}\n\n// ──────────────────────────────────────────────────────────────\n// Target rendering (function declarations → hoisted for mutual recursion\n// between a SUB_TABS target and its leaf targets)\n// ──────────────────────────────────────────────────────────────\n\nfunction SettingsEnginePanel({ panelRef }: { panelRef: SettingsPanelRef }): React.JSX.Element {\n switch (panelRef) {\n case SettingsPanelRef.SECURITY:\n return <AppPage_SecuritySettings />;\n case SettingsPanelRef.APPEARANCE:\n return <AppPage_AppearanceSettings />;\n case SettingsPanelRef.INVITATIONS:\n return <AppPage_InvitationsSettings />;\n case SettingsPanelRef.BILLING:\n return <AppPage_BillingSettings />;\n case SettingsPanelRef.CONNECTED_ACCOUNTS:\n return <AppPage_ConnectedAccountsSettings ownerScope={ExternalProvider_Connection_OwnerScope.USER} />;\n case SettingsPanelRef.ORGANIZATION_CONNECTED_ACCOUNTS:\n // The scope is passed EXPLICITLY at both sites rather than left to the component's default.\n // A default is invisible at the call site, and the one thing a reader must be able to see here\n // is whose account each panel connects.\n return <AppPage_ConnectedAccountsSettings ownerScope={ExternalProvider_Connection_OwnerScope.ORGANIZATION} />;\n case SettingsPanelRef.AGENT_WORK_OVERRIDE_RATE:\n return <AppPage_AgentWorkOverrideRateSettings />;\n }\n}\n\n/** Resolves a display label for a section/sub-tab ref, falling back to the authored label. */\ntype SettingsLabelResolver = (ref: string, fallbackLabel: string) => string;\n\nfunction SettingsTargetRenderer({\n target,\n resolveSubTabLabel,\n subTabRef,\n onSubTabChange,\n}: {\n target: SettingsSectionTarget;\n resolveSubTabLabel: SettingsLabelResolver;\n subTabRef?: string;\n onSubTabChange?: (subTabRef: string) => void;\n}): React.JSX.Element {\n switch (target.kind) {\n case SettingsSectionTargetKind.ENGINE_PANEL:\n return <SettingsEnginePanel panelRef={target.panelRef} />;\n case SettingsSectionTargetKind.CUSTOM_COMPONENT: {\n const CustomComponent = ComponentRegistryService.resolve(\n target.componentRef,\n CorePresetNames.DEFAULT,\n );\n if (!CustomComponent) {\n return <ComponentNotInjected componentType={target.componentRef} componentName={target.componentRef} />;\n }\n return (\n <React.Suspense fallback={<div className=\"h-8 animate-pulse motion-reduce:animate-none bg-muted rounded\" aria-hidden=\"true\" />}>\n <CustomComponent />\n </React.Suspense>\n );\n }\n case SettingsSectionTargetKind.RESOURCE_OPERATION:\n return (\n <SettingsResourceOperationPanel\n resourceType={target.resourceType}\n operation={target.operation}\n operationVariant={target.operationVariant}\n />\n );\n case SettingsSectionTargetKind.SUB_TABS:\n return (\n <SettingsSubTabs\n target={target}\n resolveSubTabLabel={resolveSubTabLabel}\n subTabRef={subTabRef}\n onSubTabChange={onSubTabChange}\n />\n );\n }\n}\n\n/**\n * The sub-tab strip inside one section.\n *\n * The active tab is URL-DRIVEN since 2026-09-17. It used to be `useState(target.subTabs[0]?.ref)` —\n * local state that read nothing from the URL — so all twenty-one sub-tab panels in the shipped\n * catalogue were unaddressable: every link to a sub-tabbed section opened its FIRST tab, and\n * \"Single sign-on → Connections\" could not be sent to anybody. That contradicted the hub's own\n * contract, which is that the URL is its single source of truth, and it made the outcome banner a\n * connect-callback renders depend on tab ORDER rather than on the URL it returns to.\n *\n * A `subTabRef` the section does not declare is IGNORED rather than refused: the tab falls back to\n * the first entry, so a stale bookmark or a hand-typed segment still opens the section instead of an\n * error. `onSubTabChange` writes the selection back, which is what makes the strip a navigation\n * control rather than a widget with a URL beside it.\n */\nfunction SettingsSubTabs({\n target,\n resolveSubTabLabel,\n subTabRef,\n onSubTabChange,\n}: {\n target: SettingsSubTabsTarget;\n resolveSubTabLabel: SettingsLabelResolver;\n subTabRef?: string;\n onSubTabChange?: (subTabRef: string) => void;\n}): React.JSX.Element | null {\n const active = target.subTabs.some(subTab => subTab.ref === subTabRef)\n ? subTabRef\n : target.subTabs[0]?.ref;\n if (target.subTabs.length === 0) return null;\n return (\n <Tabs value={active} onValueChange={next => onSubTabChange?.(next)}>\n <TabsList>\n {target.subTabs.map(subTab => (\n // `data-ref` is the i18n-independent automation hook (labels are\n // runtime-translated; e2e drives must never key off them).\n <TabsTrigger key={subTab.ref} value={subTab.ref} data-ref={subTab.ref}>\n {resolveSubTabLabel(subTab.ref, subTab.label)}\n </TabsTrigger>\n ))}\n </TabsList>\n {target.subTabs.map(subTab => (\n <TabsContent key={subTab.ref} value={subTab.ref}>\n {/* Leaf targets only (schema forbids nested sub-tabs); the resolver is\n still threaded to satisfy the shared renderer signature. */}\n <SettingsTargetRenderer target={subTab.target} resolveSubTabLabel={resolveSubTabLabel} />\n </TabsContent>\n ))}\n </Tabs>\n );\n}\n\n/**\n * A rail item's layout classes — full-width, left-aligned, icon-tolerant.\n *\n * Carried here rather than reused from the tab trigger because the rail is no longer a tab: this is\n * a navigation item and owns its own shape. Only the SELECTED treatment is shared, and that comes\n * from the theme recipe rather than from a copied class string, so a theme change still reaches\n * both.\n */\nconst RAIL_ITEM_CLASSES =\n \"inline-flex w-full cursor-pointer items-center justify-start gap-1.5 whitespace-nowrap rounded-md px-card-sm py-item text-sm font-medium no-underline [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\";\n\n// ──────────────────────────────────────────────────────────────\n// Hub\n// ──────────────────────────────────────────────────────────────\n\nexport interface SettingsHubProps {\n /** Section to pre-open; falls back to the config default. */\n sectionRef?: string;\n /** Sub-tab of `sectionRef` to pre-open; ignored when the section declares no such tab. */\n subTabRef?: string;\n}\n\nexport function SettingsHub({ sectionRef, subTabRef }: SettingsHubProps): React.JSX.Element {\n const config = useVisibleSettingsHubConfig();\n const categories = useMemo(() => orderedCategories(config), [config]);\n const [active, setActive] = useState<string | undefined>(() => resolveActiveSection(config, sectionRef));\n const routerNavigate = useNavigate();\n\n /*\n * In-hub navigation WRITES the URL. Until 2026-09-17 it did not, at either level: the rail set\n * local state and the sub-tab strip held its own, so the address bar kept whatever section the\n * hub was opened at. Deep-linking IN worked and linking OUT never did — you could be looking at\n * Administration → Single sign-on → Connections with `/settings/profile` in the address bar, and\n * no sequence of clicks produced a URL for where you were.\n *\n * REPLACE rather than push, deliberately. A settings rail is a switcher, not a trail: pushing\n * would make Back walk every section a person browsed before leaving the hub, which is the\n * behaviour the overlay's own dismiss already owns. Replace keeps the address bar truthful and\n * leaves Back meaning \"leave settings\".\n *\n * The overlay reconciler converges on the new URL — it keys on section AND sub-tab, so a tab\n * switch inside one section is seen as a change rather than as already-correct. There is no loop:\n * only a user gesture calls these, and the reconciler emits no navigation of its own.\n */\n // The SECTION half of this used to be `navigateToSection`, which the rail's triggers called. The\n // rail's links now carry `to` + `replace` themselves, and `active` is driven by the URL-sync\n // effect below — so the helper had no caller left. The SUB-TAB half stays: those really are tabs.\n\n const handleSubTabChange = useCallback((nextSubTabRef: string) => {\n if (!active) return;\n routerNavigate(`${CommonRoutePaths.settings}/${active}/${nextSubTabRef}`, { replace: true });\n }, [active, routerNavigate]);\n\n /*\n * On a small screen the hub is a BACK-STACK rather than two panes.\n *\n * It had no responsive treatment at all before 2026-09-17 — a fixed `w-60 shrink-0` rail at every\n * width, which is 240px of a ~375px viewport, and the rail is now thirty entries rather than\n * sixteen. The back-stack is chosen over a drawer or a collapsed select because the panel BELOW\n * already works this way: `SettingsSectionNavigationHost` keeps a section's own drill-ins\n * (view → edit → back) inside the panel, so mobile becomes the same mechanism one level up\n * instead of a second navigation concept.\n *\n * WHICH screen shows is the URL's business, not local state: `/settings` is the list and\n * `/settings/:sectionRef` is a section. That falls out of the hub's own contract — the URL is its\n * single source of truth — and it means Back, a deep link and a shared link all agree without any\n * of them being special-cased.\n *\n * Both panes stay MOUNTED and only their classes change. `field-chrome-and-sections.md` Gotcha 1b\n * records what the alternative costs: a chrome that swapped element structure across a breakpoint\n * remounted its control and dropped a pending edit on resize. Hiding is a class here for exactly\n * that reason.\n */\n const { UIConfig, getRecipe } = useUI();\n /*\n * The rail item's SELECTED styling comes from the theme's SELECTABLE/FILLED recipe — the same one\n * the vertical tab trigger used, so the rail looks exactly as it did and still follows whatever a\n * theme dresses it in. The recipe keys on `data-state`, which each link sets from `active`.\n */\n const railItemRecipe = getRecipe(UIBehavior.SELECTABLE, SelectableVariant.FILLED);\n const { renderIcon } = useIconRegistry();\n const isMobile = UIConfig?.currentBreakpoint === ViewportBreakpoint.MOBILE;\n const mobileShowsSection = isMobile && Boolean(sectionRef);\n\n const handleBackToSections = useCallback(() => {\n routerNavigate(CommonRoutePaths.settings, { replace: true });\n }, [routerNavigate]);\n\n\n const { tComponent, tSettingsHubCategory, tSettingsHubSection, isReady } = useI18n({\n component: FrontendComponentType.APP_LAYOUTS_SETTINGS_HUB,\n });\n // Hub chrome labels (title, rail aria-label) read from the scoped component\n // namespace. Copy is owned by the labelling pipeline (declared in the sibling\n // `.labels.ts`), so there are deliberately no inline fallback strings — the\n // hub gates on `isReady` below, the same convention as the panels it hosts\n // (`AppPage_SecuritySettings` / `AppPage_AppearanceSettings`). The dynamic\n // category/section labels keep their config-authored `fallbackLabel` (the\n // required contract of `tSettingsHubCategory` / `tSettingsHubSection`).\n const t = useCallback(\n (key: string) => tComponent(FrontendComponentType.APP_LAYOUTS_SETTINGS_HUB, key),\n [tComponent],\n );\n\n /** The pushed section's own label — the mobile header's only cue for where you are. */\n const activeSectionLabel = useMemo(() => {\n const section = config.sections.find(candidate => candidate.ref === active);\n return section ? tSettingsHubSection(section.ref, section.label) : undefined;\n }, [config.sections, active, tSettingsHubSection]);\n\n // Keep the rail in sync with URL-driven section changes (deep-link / browser\n // nav). Keyed on `sectionRef` ALONE — deliberately not on `config` as well.\n // The gated config is derived from live signals (scope, roles, features,\n // runtime capabilities), so its identity churns independently of its content;\n // with `config` in the deps this ran after essentially every render and\n // re-asserted the requested-or-default section, which overwrote the section\n // the user had just clicked in the rail. The rail then looked inert: the\n // click did select, and the effect immediately put it back.\n useEffect(() => {\n if (!sectionRef) return;\n setActive(previous => (previous === sectionRef ? previous : sectionRef));\n }, [sectionRef]);\n\n /*\n * Bring the OPEN section into view when it is not — and only then.\n *\n * The rail carries thirty destinations and scrolls, so a cold load or a deep link at a section\n * near the bottom (`/settings/webhooks`) renders a list scrolled to the top with nothing on it\n * marked: the one cue that says where you are is off screen, and the reader has to scroll a list\n * of thirty to find out.\n *\n * `block: 'nearest'` is what makes this safe to run on every section change rather than only on\n * mount: it is defined to move the container by the MINIMUM needed, so an item already fully\n * visible — the ordinary case when somebody clicks the rail — is not scrolled at all. That is the\n * whole reason it is 'nearest' and not 'center', which would yank the list on every click and\n * replace one annoyance with another.\n *\n * It pairs with, and does not substitute for, the key fix in `getContentKey`: this positions the\n * rail, that one stops the rail being rebuilt (and its scroll offset discarded) on every click.\n * Without the key fix this would fire into a freshly mounted `<nav>` each time and merely make the\n * reset land somewhere else.\n */\n const activeRailItemRef = useRef<HTMLAnchorElement | null>(null);\n useEffect(() => {\n if (!active) return;\n activeRailItemRef.current?.scrollIntoView({ block: 'nearest', inline: 'nearest' });\n }, [active]);\n\n // Adopt a section from the config ONLY when the current one is not (or is no\n // longer) selectable — first resolve after an async gating signal lands, or a\n // section disappearing because the user's roles/features changed. Anything\n // broader would re-run the reset described above.\n useEffect(() => {\n setActive(previous =>\n previous && config.sections.some(section => section.ref === previous)\n ? previous\n : resolveActiveSection(config, sectionRef),\n );\n // `sectionRef` is read as the fallback preference only; following ITS\n // changes is the effect above.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [config]);\n\n /*\n * Gate on label readiness so the hub chrome never flashes raw key paths — copy is pipeline-owned\n * with no inline fallback, matching the hosted panels.\n *\n * Through `LoadingGate` rather than `if (!isReady) return null`, which is what this was until\n * 2026-09-17. Returning null is correct about the raw keys and wrong about everything else: the\n * overlay is already open and mounted by the time the hub renders, so a null gave a person an\n * empty dialog with no indication that anything was coming — and the wait got longer as the rail\n * grew. `LoadingGate` keeps the same guarantee (children are not rendered until ready) and lets\n * the ENCLOSING SURFACE POLICY choose the treatment, which for an overlay is to overlay the\n * children rather than to blank them. The hub does not pick a visual here on purpose: that choice\n * belongs to the surface it is hosted in, and hard-coding a skeleton would override a policy the\n * design system already owns.\n */\n return (\n <LoadingGate readiness={[{ id: 'settings-hub-labels', isReady }]}>\n {/*\n `min-w-0` is REQUIRED: this is the grid item of the (fixed-width) dialog surface.\n Without it the item keeps its default `min-width: auto` and cannot shrink below its\n content's min-content width — a wide field row (e.g. a file card with a long\n filename, or a text input) then pushes the whole two-pane body past the dialog edge,\n and the dialog's `overflow-x: hidden` clips the right side of every field. `min-w-0`\n lets the item fit the track so the content pane (and its form) reflow within it.\n */}\n <div className=\"flex h-full min-h-0 flex-col min-w-0\">\n <header className=\"flex h-14 shrink-0 items-center gap-item border-b px-card-lg\">\n {mobileShowsSection && (\n <Button\n variant={ButtonVariants_Variant.GHOST}\n size={ButtonSize.ICON_SM}\n aria-label={t('backToSections')}\n onClick={handleBackToSections}\n >\n {renderIcon(StandardIconReference.BACK, { size: IconSize.SM })}\n </Button>\n )}\n {/* On mobile the header names the SECTION you pushed into — without it the back-stack loses\n the one cue that says where you are, since the rail that said so is off screen. */}\n <h2 className=\"truncate text-base font-semibold tracking-tight\">\n {mobileShowsSection ? activeSectionLabel ?? t('title') : t('title')}\n </h2>\n </header>\n <div className=\"flex min-h-0 flex-1\">\n {/*\n * The rail is NAVIGATION, not a tablist, and until 2026-09-19 it was rendered as one —\n * thirty `<button role=\"tab\">` in a `TabsList`. Three things followed, all measured on the\n * running application:\n *\n * - No destination could be OPENED any other way. `/settings/members` is a real route the\n * hub already writes to the address bar, but with no `href` there was nothing to\n * ⌘-click, middle-click or \"copy link address\" — the one gesture an operator uses to\n * send a colleague to a setting.\n * - The ARIA pattern was wrong for what this is. A tablist switches panels WITHIN a view;\n * a list of destinations that each own a URL is navigation (WAI-ARIA APG). That is not a\n * preference — it decides what an assistive technology announces and how it is reached.\n * - The category headings carried `role=\"presentation\"`, so they were invisible to\n * assistive technology, and a tablist cannot nest labelled groups anyway. That left AT\n * users with a flat list of thirty items containing NINE duplicated names — \"General\",\n * \"Entitlements\", \"API keys\", \"Connected accounts\", \"Single sign-on\", \"User\n * provisioning\", \"Audit streaming\", \"Webhooks\" and \"Audit log\" each appear under two\n * scopes — with nothing to tell the pairs apart.\n *\n * A `<nav>` of grouped links fixes all three at once, and the keyboard concern the previous\n * shape was chosen for DISSOLVES rather than needing to be reimplemented: roving tabindex\n * is a tablist requirement. Navigation uses ordinary Tab order through links, which is what\n * a reader expects and what the browser already does.\n *\n * `replace` is kept from the old `navigateToSection` and for its reason: a settings rail is\n * a switcher, not a trail, so Back means \"leave settings\" rather than walking every section\n * somebody browsed.\n */}\n <nav\n aria-label={t('sectionsNavLabel')}\n className={cn(\n 'overflow-y-auto px-card-sm py-card',\n // Desktop: the fixed rail beside the content. Mobile: the full-width first screen of the\n // back-stack, with no divider because there is nothing beside it.\n isMobile ? 'w-full flex-1' : 'w-60 shrink-0 border-e',\n mobileShowsSection && 'hidden',\n )}\n >\n {categories.map((category, index) => {\n const sections = sectionsForCategory(config, category.ref);\n if (sections.length === 0) return null;\n const categoryLabelId = `settings-hub-category-${category.ref}`;\n return (\n <React.Fragment key={category.ref}>\n {index > 0 && <Separator className=\"my-item\" />}\n {/* Named, not decorative: this heading is the ONLY thing distinguishing the nine\n section labels that appear under two scopes, so it has to reach AT. */}\n <div\n id={categoryLabelId}\n className=\"px-card-sm py-card-sm text-xs font-medium uppercase tracking-wider text-muted-foreground\"\n >\n {tSettingsHubCategory(category.ref, category.label)}\n </div>\n <div role=\"group\" aria-labelledby={categoryLabelId}>\n {sections.map(section => {\n const isActive = section.ref === active;\n return (\n // `data-ref` = i18n-independent automation hook (see sub-tabs above).\n <Link\n key={section.ref}\n // Only the OPEN item is tracked — the effect above needs one element, and a\n // ref on all thirty would be thirty callbacks re-created every render.\n ref={isActive ? activeRailItemRef : undefined}\n to={`${CommonRoutePaths.settings}/${section.ref}`}\n replace\n data-ref={section.ref}\n aria-current={isActive ? 'page' : undefined}\n data-state={isActive ? 'active' : 'inactive'}\n className={cn(\n RAIL_ITEM_CLASSES,\n // Composed part by part, exactly as the tab trigger does — `getRecipe`\n // returns a STRUCTURE (base / states / motion), not a class string, and\n // handing the object to `cn()` silently yields nothing. That is how the\n // first cut of this lost the selected fill while every other class held.\n railItemRecipe.base,\n railItemRecipe.states.focus,\n railItemRecipe.states.selected,\n railItemRecipe.motion.transition,\n )}\n >\n {tSettingsHubSection(section.ref, section.label)}\n </Link>\n );\n })}\n </div>\n </React.Fragment>\n );\n })}\n </nav>\n <div\n className={cn(\n 'min-w-0 flex-1 overflow-y-auto p-card-lg',\n isMobile && !mobileShowsSection && 'hidden',\n )}\n >\n {/*\n * ONE section renders — the active one. `TabsContent` unmounts its inactive panels\n * anyway, so this is the same mounting behaviour written directly rather than delegated\n * to a primitive the rail no longer uses.\n */}\n {config.sections.filter(section => section.ref === active).map(section => (\n <React.Fragment key={section.ref}>\n {section.entitlementFeatureId ? (\n // Section SURVIVED because the app OFFERS this feature\n // (`runtimeAvailability` capability = plan-independent\n // `isFeatureOffered`). Render its body through the entitlement gate:\n // entitled → the config surface; offered-but-not-entitled → the\n // policy-driven upgrade/add-on prompt (never a silent disappearance).\n <FeatureGate featureId={section.entitlementFeatureId}>\n <SettingsTargetRenderer\n target={section.target}\n resolveSubTabLabel={tSettingsHubSection}\n subTabRef={section.ref === active ? subTabRef : undefined}\n onSubTabChange={handleSubTabChange}\n />\n </FeatureGate>\n ) : (\n <SettingsTargetRenderer\n target={section.target}\n resolveSubTabLabel={tSettingsHubSection}\n subTabRef={section.ref === active ? subTabRef : undefined}\n onSubTabChange={handleSubTabChange}\n />\n )}\n </React.Fragment>\n ))}\n </div>\n </div>\n </div>\n </LoadingGate>\n );\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"SettingsResourceOperationPanel.d.ts","sourceRoot":"","sources":["../../../../../src/components/settings/SettingsResourceOperationPanel.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,OAAO,KAA8B,MAAM,OAAO,CAAC;AAanD,MAAM,WAAW,mCAAmC;IAClD,2DAA2D;IAC3D,YAAY,EAAE,MAAM,CAAC;IACrB,4DAA4D;IAC5D,SAAS,EAAE,MAAM,CAAC;IAClB,gFAAgF;IAChF,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAiCD,wBAAgB,8BAA8B,CAAC,EAC7C,YAAY,EACZ,SAAS,EACT,gBAAgB,GACjB,EAAE,mCAAmC,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CA6EzD"}
1
+ {"version":3,"file":"SettingsResourceOperationPanel.d.ts","sourceRoot":"","sources":["../../../../../src/components/settings/SettingsResourceOperationPanel.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,OAAO,KAA8B,MAAM,OAAO,CAAC;AAanD,MAAM,WAAW,mCAAmC;IAClD,2DAA2D;IAC3D,YAAY,EAAE,MAAM,CAAC;IACrB,4DAA4D;IAC5D,SAAS,EAAE,MAAM,CAAC;IAClB,gFAAgF;IAChF,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAiCD,wBAAgB,8BAA8B,CAAC,EAC7C,YAAY,EACZ,SAAS,EACT,gBAAgB,GACjB,EAAE,mCAAmC,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CA4FzD"}
@@ -125,6 +125,21 @@ export function SettingsResourceOperationPanel({ resourceType, operation, operat
125
125
  // instead of escaping the hub to the global zones (and 404-ing on org-scoped
126
126
  // routes that aren't registered). The host installs a scoped navigation
127
127
  // controller; the surface beneath renders the current stack level.
128
- return _jsx(SettingsSectionNavigationHost, { rootContext: resourceContext });
128
+ //
129
+ // Keyed on what the root ADDRESSES — the scope ids and the operation — because the host seeds its
130
+ // stack from `rootContext` once. The root is rebuilt when the application identity arrives after
131
+ // the hub has mounted (`currentApplicationId` falls back to null until it does), and without a key
132
+ // stack[0] kept the context it mounted with: an application-scoped section querying with no
133
+ // application. Keyed on VALUES, not object identity, so an unrelated re-render never resets a
134
+ // section the reader has drilled into.
135
+ const hostKey = [
136
+ resourceType,
137
+ operation,
138
+ operationVariant ?? '',
139
+ appScope?.currentOrganizationId ?? '',
140
+ appScope?.currentUserId ?? '',
141
+ currentApplicationId ?? '',
142
+ ].join('|');
143
+ return _jsx(SettingsSectionNavigationHost, { rootContext: resourceContext }, hostKey);
129
144
  }
130
145
  //# sourceMappingURL=SettingsResourceOperationPanel.js.map