@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":"DisplayFieldChrome.js","sourceRoot":"","sources":["../../../../../../src/components/data-display/chromes/DisplayFieldChrome.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\"\n\n/**\n * DisplayFieldChrome — centralized chrome (label, description, tooltip) wrapper\n * for display fields.\n *\n * Parallel to FormFieldChrome but simplified for read-only display context:\n * - 5 modes: STACKED, INLINE, SETTINGS_ROW, COMPACT, HIDDEN (no RELAXED)\n * - No error, required, saveState, disabled, or autosave indicator props\n * - No FieldError rendering\n *\n * Chrome mode is resolved via a two-phase cascade:\n * Phase 1 (DisplayField): field decorator → section default → display default → surface policy → STACKED\n * Phase 2 (here): responsive viewport resolution via useUI()\n *\n * ## data-field safety net\n *\n * Every mode that renders a WRAPPER puts `data-field={name}` on it, so guidance\n * targeting and DOM queries can locate the field node regardless of what the\n * inner value component does with its own attributes.\n *\n * `HIDDEN` is the one exception, and it is not a gap: that mode's whole contract\n * is \"no chrome at all — bare value output\", so it returns `children` directly\n * with no element of its own to carry the attribute. A caller that needs the\n * field locatable in the DOM must therefore not use `HIDDEN`; `COMPACT` is the\n * mode that drops the label and KEEPS the wrapper. Measured 2026-09-18 in the\n * browser (Labs → Field Chrome Modes): COMPACT emits\n * `<div data-slot=\"field-chrome\" data-chrome-mode=\"compact\" data-field=…>` while\n * HIDDEN emits the bare value node. This paragraph previously said \"every\n * visible chrome mode … can ALWAYS locate\", which reads as a guarantee with no\n * exception and is the sentence a guidance author would rely on.\n */\n\nimport * as React from \"react\"\nimport { useMemo } from \"react\"\n\nimport { cn } from \"~wildo-frontend-lib/core/ui/cn\"\nimport {\n Field,\n FieldLabel,\n FieldDescription,\n FieldContent,\n FieldTitle,\n FieldVariants_Orientation,\n} from \"~wildo-frontend-lib/components/form/chromes/field\"\nimport { Tooltip, TooltipTrigger, TooltipContent } from \"~wildo-frontend-lib/components/overlays/floating/tooltip\"\nimport {\n DisplayLabelStyle,\n DisplayChromeMode,\n ViewportBreakpoint,\n type ResponsiveAware,\n} from \"@wildo-ai/zod-decorators\"\nimport type { ReactNode } from 'react'\nimport { useIconRegistry } from \"~wildo-frontend-lib/core/icons/useIconRegistry\"\nimport { StandardIconReference, IconSize } from \"~wildo-frontend-lib/core/icons/icon-registry.frontend.schemas\"\nimport { useI18n } from \"~wildo-frontend-lib/core/i18n/useI18n\"\nimport { FrontendComponentType, ButtonSize, type AutoLabelPlacement } from \"@wildo-ai/presets-components-models\"\nimport { useUI } from \"~wildo-frontend-lib/core/ui/useUI\"\nimport { Button, ButtonVariants_Variant } from \"~wildo-frontend-lib/components/actions/button\"\n\nexport interface DisplayFieldChromeProps {\n mode?: ResponsiveAware<DisplayChromeMode>\n label?: string\n /** Label styling, orthogonal to the chrome mode's layout. See `DisplayLabelStyle`. */\n labelStyle?: DisplayLabelStyle\n description?: string\n tooltip?: string\n name?: string\n labelPlacement?: AutoLabelPlacement\n hideLabel?: boolean\n hideDescription?: boolean\n className?: string\n children: ReactNode\n}\n\n\n// =============================================================================\n// VIEWPORT-AWARE MODE RESOLUTION\n// =============================================================================\n\n/**\n * Resolves a potentially responsive DisplayChromeMode to a single concrete mode\n * for the current viewport.\n *\n * Fallback chain: mode[currentBreakpoint] → mode[DESKTOP] → STACKED\n *\n * SETTINGS_ROW is not collapsed to STACKED on mobile: the row stacks its value\n * beneath the label itself (see the SETTINGS_ROW branch), mirroring\n * FormFieldChrome so a view→edit drill keeps the same geometry at every width.\n * The edit twin stopped collapsing because swapping the chrome's root element on a\n * breakpoint remounted the control (#1191); display follows so the two stay aligned.\n */\nfunction resolveEffectiveDisplayChromeMode(\n chromeMode: ResponsiveAware<DisplayChromeMode> | undefined,\n currentBreakpoint: ViewportBreakpoint,\n): DisplayChromeMode {\n if (chromeMode === undefined || chromeMode === null) {\n return DisplayChromeMode.STACKED;\n }\n\n return typeof chromeMode === \"string\"\n ? chromeMode\n : (chromeMode[currentBreakpoint] ?? chromeMode[ViewportBreakpoint.DESKTOP] ?? DisplayChromeMode.STACKED);\n}\n\n// =============================================================================\n// TOOLTIP ICON HELPER\n// =============================================================================\n\nfunction DisplayTooltipIcon({ text }: { text: string }): React.JSX.Element | null {\n const { renderIcon } = useIconRegistry();\n const { tComponent, isReady } = useI18n({\n component: FrontendComponentType.LOW_LEVEL_FORM_FIELD,\n });\n if (!isReady) return null;\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n type=\"button\"\n variant={ButtonVariants_Variant.GHOST}\n size={ButtonSize.ICON_SM}\n className=\"ms-1 rounded-full\"\n aria-label={tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD, 'moreInformation')}\n tabIndex={-1}\n >\n {renderIcon(StandardIconReference.INFO, { size: IconSize.XS })}\n </Button>\n </TooltipTrigger>\n <TooltipContent>{text}</TooltipContent>\n </Tooltip>\n );\n}\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\nfunction DisplayFieldChrome({\n mode,\n label,\n labelStyle,\n description,\n tooltip,\n name,\n labelPlacement,\n hideLabel,\n hideDescription,\n className,\n children,\n}: DisplayFieldChromeProps): React.JSX.Element {\n const { currentBreakpoint, isMobile } = useUI();\n\n const effectiveMode = useMemo(\n () => resolveEffectiveDisplayChromeMode(mode, currentBreakpoint),\n [mode, currentBreakpoint],\n );\n\n /*\n * INLINE mode defaults to label-FIRST ('start': \"Metric — value\"), not the suffix 'inline'\n * placement — a labelled fact row reads label-first, and the suffix style stays reachable by\n * passing `labelPlacement: 'inline'` explicitly. Safe to (re)decide 2026-08-31: until the\n * surface-policy precedence fix landed the same day, INLINE mode was unreachable from\n * decorators on any surface declaring an auto placement, so no consumer saw either default.\n */\n const effectiveLabelPlacement = labelPlacement ?? (effectiveMode === DisplayChromeMode.INLINE ? 'start' : 'top');\n const showLabel = !hideLabel && !!label && effectiveLabelPlacement !== 'hidden' && effectiveMode !== DisplayChromeMode.COMPACT && effectiveMode !== DisplayChromeMode.HIDDEN;\n const showDescription = !hideDescription && !!description && effectiveMode !== DisplayChromeMode.COMPACT && effectiveMode !== DisplayChromeMode.HIDDEN;\n const hiddenLabel = !hideLabel && !!label && effectiveLabelPlacement === 'hidden'\n ? <span className=\"sr-only\">{label}</span>\n : null;\n\n // ── HIDDEN mode: pass through ──\n if (effectiveMode === DisplayChromeMode.HIDDEN) {\n return <>{hiddenLabel}{children}</>;\n }\n\n // ── COMPACT mode: bare value, no chrome ──\n if (effectiveMode === DisplayChromeMode.COMPACT) {\n return (\n <div\n data-slot=\"field-chrome\"\n data-chrome-mode=\"compact\"\n data-label-placement={effectiveLabelPlacement}\n data-field={name}\n data-testid={name ? `field-${name}` : undefined}\n data-guidance-field={name}\n className={className}\n >\n {hiddenLabel}\n {children}\n </div>\n );\n }\n\n // ── INLINE mode: a snug \"Label: value\" fact row ──\n // The label reads as a small bold prefix with a colon, the value directly beside it — one\n // labelled fact per line (\"Metric: within one day\"), wrapping when the value is long. This is\n // deliberately NOT the horizontal Field layout (label left, value pinned to the inline-end\n // edge): a fact row is read as one sentence, not scanned as a settings table.\n if (effectiveMode === DisplayChromeMode.INLINE) {\n return (\n <div\n data-slot=\"field-chrome\"\n data-chrome-mode=\"inline\"\n data-label-placement={effectiveLabelPlacement}\n data-field={name}\n data-testid={name ? `field-${name}` : undefined}\n data-guidance-field={name}\n className={cn(\"flex flex-wrap items-baseline gap-x-1.5 gap-y-element-xs\", className)}\n >\n {hiddenLabel}\n {showLabel && (\n <span className=\"shrink-0 text-xs font-semibold text-foreground\">\n {label}:\n {tooltip && <DisplayTooltipIcon text={tooltip} />}\n </span>\n )}\n <div className=\"min-w-0\">{children}</div>\n {showDescription && <FieldDescription className=\"w-full\">{description}</FieldDescription>}\n </div>\n );\n }\n\n // ── SETTINGS_ROW mode: a self-contained settings list-item (read mode) ──\n // Read-mode counterpart of the form's SETTINGS_ROW (FormFieldChrome) — IDENTICAL\n // row geometry (same `py-group` rhythm, same hairline `border-b … last:border-b-0`\n // divider, same fixed-width inline-end column) so a view→edit drill keeps the\n // value/control in the same place and a read-only settings list reads exactly\n // like its editable twin. Values right-align to the row's inline-end edge\n // (`items-end text-end`) so badges / ✓✗ booleans / text all share one edge\n // instead of the previous ragged 200–320px box. See FormFieldChrome for the\n // full rationale.\n //\n // On a MOBILE viewport the row keeps its shell and stacks the value beneath the\n // label (the same element structure, only classes change), mirroring the edit twin.\n if (effectiveMode === DisplayChromeMode.SETTINGS_ROW) {\n return (\n <div\n data-slot=\"field-chrome\"\n data-chrome-mode=\"settings_row\"\n data-settings-row-layout={isMobile ? \"stacked\" : undefined}\n data-label-placement={effectiveLabelPlacement}\n data-field={name}\n data-testid={name ? `field-${name}` : undefined}\n data-guidance-field={name}\n className={cn(\n // Row rhythm (T4): a compact min-height + a subtle hover affordance so a\n // settings list reads as scannable rows, not a flat stack. Vertical\n // alignment is CONTENT-AWARE: a single-line row (no description) CENTERS\n // its label + control in the min-height (`items-center`) so there is no\n // dead space below the label — this is what made the rows read too tall;\n // a row WITH a description top-aligns (`items-start`) so the control lines\n // up with the label's first line and the description flows beneath.\n // The row OWNS its inline padding (`px-card`): inside a CARD settings\n // list the body is padding-less, so the row's `border-b` runs full-bleed\n // to the card edge while `px-card` keeps the text inset; in a flat host\n // the same `px-card` gives consistent inset. Block padding stays tight\n // (`py-card-sm`) to keep rows compact.\n \"flex min-h-10 px-card py-card-sm border-b border-border last:border-b-0 hover:bg-muted/50 transition-colors\",\n isMobile\n ? \"flex-col gap-element-xs\"\n : cn(\"flex-row gap-section\", showDescription ? \"items-start\" : \"items-center\"),\n className,\n )}\n >\n {/* Inline-start: label + description */}\n <div className={cn(\"flex min-w-0 flex-col gap-element-xs\", !isMobile && \"flex-1\")}>\n {hiddenLabel}\n {showLabel && (\n <FieldLabel>\n {label}\n {tooltip && <DisplayTooltipIcon text={tooltip} />}\n </FieldLabel>\n )}\n {showDescription && <FieldDescription>{description}</FieldDescription>}\n </div>\n {/* Inline-end: value, right-pinned to the row's inline-end edge. `w-72` is\n the shared target width; `shrink` + `min-w-0` (NOT `shrink-0`) keeps the\n column compressible so the row can never outgrow a padded CARD fieldset\n and clip against its border — mirrors the edit-mode FormFieldChrome twin. */}\n <div\n className={cn(\n \"flex min-w-0 flex-col gap-element-xs\",\n isMobile ? \"w-full items-start text-start\" : \"w-72 max-w-[55%] shrink items-end text-end\",\n )}\n >\n {children}\n </div>\n </div>\n );\n }\n\n // ── Horizontal label modes ──\n if (effectiveLabelPlacement === 'start' || effectiveLabelPlacement === 'inline') {\n const isInlinePlacement = effectiveLabelPlacement === 'inline';\n return (\n <Field\n orientation={FieldVariants_Orientation.HORIZONTAL}\n data-slot=\"field-chrome\"\n data-chrome-mode=\"inline\"\n data-label-placement={effectiveLabelPlacement}\n data-field={name}\n data-testid={name ? `field-${name}` : undefined}\n data-guidance-field={name}\n className={cn(isInlinePlacement && \"flex-row-reverse\", className)}\n >\n {hiddenLabel}\n <FieldContent>\n {showLabel && (\n <FieldTitle>\n <FieldLabel>\n {label}\n {tooltip && <DisplayTooltipIcon text={tooltip} />}\n </FieldLabel>\n </FieldTitle>\n )}\n {showDescription && <FieldDescription>{description}</FieldDescription>}\n </FieldContent>\n {children}\n </Field>\n );\n }\n\n // ── STACKED mode (default): label above, value, description below ──\n return (\n <Field\n orientation={FieldVariants_Orientation.VERTICAL}\n data-slot=\"field-chrome\"\n data-chrome-mode=\"stacked\"\n data-label-placement={effectiveLabelPlacement}\n data-field={name}\n data-testid={name ? `field-${name}` : undefined}\n data-guidance-field={name}\n className={className}\n >\n {hiddenLabel}\n {showLabel && (\n labelStyle === DisplayLabelStyle.TITLE ? (\n /*\n * TITLE label style: the label reads as a SMALL TITLE above its content — for a field\n * acting as a mini-section inside a prose flow (\"Who suffers it\" above its answer),\n * where the ordinary muted label would not carry the structure.\n */\n <div className=\"pt-item-xs text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n {label}\n {tooltip && <DisplayTooltipIcon text={tooltip} />}\n </div>\n ) : (\n <FieldLabel>\n {label}\n {tooltip && <DisplayTooltipIcon text={tooltip} />}\n </FieldLabel>\n )\n )}\n {children}\n {showDescription && <FieldDescription>{description}</FieldDescription>}\n </Field>\n );\n}\n\n;(DisplayFieldChrome as typeof DisplayFieldChrome & { displayName: string }).displayName = \"DisplayFieldChrome\"\n\nexport { DisplayFieldChrome, resolveEffectiveDisplayChromeMode }\n"]}
1
+ {"version":3,"file":"DisplayFieldChrome.js","sourceRoot":"","sources":["../../../../../../src/components/data-display/chromes/DisplayFieldChrome.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\"\n\n/**\n * DisplayFieldChrome — centralized chrome (label, description, tooltip) wrapper\n * for display fields.\n *\n * Parallel to FormFieldChrome but simplified for read-only display context:\n * - 5 modes: STACKED, INLINE, SETTINGS_ROW, COMPACT, HIDDEN (no RELAXED)\n * - No error, required, saveState, disabled, or autosave indicator props\n * - No FieldError rendering\n *\n * Chrome mode is resolved via a two-phase cascade:\n * Phase 1 (DisplayField): field decorator → section default → display default → surface policy → STACKED\n * Phase 2 (here): responsive viewport resolution via useUI()\n *\n * ## data-field safety net\n *\n * Every mode that renders a WRAPPER puts `data-field={name}` on it, so guidance\n * targeting and DOM queries can locate the field node regardless of what the\n * inner value component does with its own attributes.\n *\n * `HIDDEN` is the one exception, and it is not a gap: that mode's whole contract\n * is \"no chrome at all — bare value output\", so it returns `children` directly\n * with no element of its own to carry the attribute. A caller that needs the\n * field locatable in the DOM must therefore not use `HIDDEN`; `COMPACT` is the\n * mode that drops the label and KEEPS the wrapper. Measured 2026-09-18 in the\n * browser (Labs → Field Chrome Modes): COMPACT emits\n * `<div data-slot=\"field-chrome\" data-chrome-mode=\"compact\" data-field=…>` while\n * HIDDEN emits the bare value node. This paragraph previously said \"every\n * visible chrome mode … can ALWAYS locate\", which reads as a guarantee with no\n * exception and is the sentence a guidance author would rely on.\n */\n\nimport * as React from \"react\"\nimport { useMemo } from \"react\"\n\nimport { cn } from \"~wildo-frontend-lib/core/ui/cn\"\nimport {\n Field,\n FieldLabel,\n FieldDescription,\n FieldContent,\n FieldTitle,\n FieldVariants_Orientation,\n} from \"~wildo-frontend-lib/components/form/chromes/field\"\nimport { Tooltip, TooltipTrigger, TooltipContent } from \"~wildo-frontend-lib/components/overlays/floating/tooltip\"\nimport {\n DisplayLabelStyle,\n DisplayChromeMode,\n ViewportBreakpoint,\n type ResponsiveAware,\n} from \"@wildo-ai/zod-decorators\"\nimport type { ReactNode } from 'react'\nimport { useIconRegistry } from \"~wildo-frontend-lib/core/icons/useIconRegistry\"\nimport { StandardIconReference, IconSize } from \"~wildo-frontend-lib/core/icons/icon-registry.frontend.schemas\"\nimport { useI18n } from \"~wildo-frontend-lib/core/i18n/useI18n\"\nimport { FrontendComponentType, ButtonSize, TypographyVariant, UIBehavior, type AutoLabelPlacement } from \"@wildo-ai/presets-components-models\"\nimport { useUI } from \"~wildo-frontend-lib/core/ui/useUI\"\nimport { Button, ButtonVariants_Variant } from \"~wildo-frontend-lib/components/actions/button\"\nimport { DisplayFieldProvenanceNote } from \"~wildo-frontend-lib/components/data-display/external-data-provenance/DisplayFieldProvenanceNote\"\nimport type { DisplayFieldProvenance } from \"~wildo-frontend-lib/components/data-display/external-data-provenance/external-data-provenance.frontend\"\n\nexport interface DisplayFieldChromeProps {\n mode?: ResponsiveAware<DisplayChromeMode>\n label?: string\n /** Label styling, orthogonal to the chrome mode's layout. See `DisplayLabelStyle`. */\n labelStyle?: DisplayLabelStyle\n description?: string\n tooltip?: string\n name?: string\n labelPlacement?: AutoLabelPlacement\n hideLabel?: boolean\n hideDescription?: boolean\n /**\n * Where the value came from, for a field an external-data pipeline writes (#1997): \"Synced from Odoo · as of\n * 12 minutes ago\". The chrome places it beneath the value in the description voice, so it reads as a note about the\n * value rather than as a second label; `DisplayFieldProvenanceNote` composes the words from the i18n tree.\n *\n * Shown in every mode that renders chrome and suppressed in COMPACT and HIDDEN, which are the bare-value modes: a\n * table cell or a card has no room for a provenance note, and the cue belongs where one record is read.\n */\n provenance?: DisplayFieldProvenance\n className?: string\n children: ReactNode\n}\n\n\n// =============================================================================\n// VIEWPORT-AWARE MODE RESOLUTION\n// =============================================================================\n\n/**\n * Resolves a potentially responsive DisplayChromeMode to a single concrete mode\n * for the current viewport.\n *\n * Fallback chain: mode[currentBreakpoint] → mode[DESKTOP] → STACKED\n *\n * SETTINGS_ROW is not collapsed to STACKED on mobile: the row stacks its value\n * beneath the label itself (see the SETTINGS_ROW branch), mirroring\n * FormFieldChrome so a view→edit drill keeps the same geometry at every width.\n * The edit twin stopped collapsing because swapping the chrome's root element on a\n * breakpoint remounted the control (#1191); display follows so the two stay aligned.\n */\nfunction resolveEffectiveDisplayChromeMode(\n chromeMode: ResponsiveAware<DisplayChromeMode> | undefined,\n currentBreakpoint: ViewportBreakpoint,\n): DisplayChromeMode {\n if (chromeMode === undefined || chromeMode === null) {\n return DisplayChromeMode.STACKED;\n }\n\n return typeof chromeMode === \"string\"\n ? chromeMode\n : (chromeMode[currentBreakpoint] ?? chromeMode[ViewportBreakpoint.DESKTOP] ?? DisplayChromeMode.STACKED);\n}\n\n// =============================================================================\n// TOOLTIP ICON HELPER\n// =============================================================================\n\nfunction DisplayTooltipIcon({ text }: { text: string }): React.JSX.Element | null {\n const { renderIcon } = useIconRegistry();\n const { tComponent, isReady } = useI18n({\n component: FrontendComponentType.LOW_LEVEL_FORM_FIELD,\n });\n if (!isReady) return null;\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n type=\"button\"\n variant={ButtonVariants_Variant.GHOST}\n size={ButtonSize.ICON_SM}\n className=\"ms-1 rounded-full\"\n aria-label={tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD, 'moreInformation')}\n tabIndex={-1}\n >\n {renderIcon(StandardIconReference.INFO, { size: IconSize.XS })}\n </Button>\n </TooltipTrigger>\n <TooltipContent>{text}</TooltipContent>\n </Tooltip>\n );\n}\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\nfunction DisplayFieldChrome({\n mode,\n label,\n labelStyle,\n description,\n tooltip,\n name,\n labelPlacement,\n hideLabel,\n hideDescription,\n provenance,\n className,\n children,\n}: DisplayFieldChromeProps): React.JSX.Element {\n const { currentBreakpoint, isMobile, getRecipe } = useUI();\n /*\n * A READ label is a TERM: it names the value beneath it and must not compete with it. The form's\n * `FieldLabel` is set in the foreground at the value's own size and weight, which is right above an\n * input (the label is what you read first) and wrong above a value, where it made every stacked\n * read-only field one undifferentiated run of text — measured on the workbench's Roadmap and Build\n * plan pages, where \"Sequence\", \"Theme\" and \"Objective\" could not be told from their answers.\n *\n * The DESCRIPTION recipe is the one the description list's `DescriptionTerm` already uses for the\n * same job, so a stacked field and a description-list row name their values in one voice.\n */\n const termRecipe = getRecipe(UIBehavior.TYPOGRAPHY, TypographyVariant.DESCRIPTION);\n /* The TITLE label style's voice: the theme's small label above a section, not a class list of its own. */\n const eyebrowRecipe = getRecipe(UIBehavior.TYPOGRAPHY, TypographyVariant.EYEBROW);\n\n const effectiveMode = useMemo(\n () => resolveEffectiveDisplayChromeMode(mode, currentBreakpoint),\n [mode, currentBreakpoint],\n );\n\n /*\n * INLINE mode defaults to label-FIRST ('start': \"Metric — value\"), not the suffix 'inline'\n * placement — a labelled fact row reads label-first, and the suffix style stays reachable by\n * passing `labelPlacement: 'inline'` explicitly. Safe to (re)decide 2026-08-31: until the\n * surface-policy precedence fix landed the same day, INLINE mode was unreachable from\n * decorators on any surface declaring an auto placement, so no consumer saw either default.\n */\n const effectiveLabelPlacement = labelPlacement ?? (effectiveMode === DisplayChromeMode.INLINE ? 'start' : 'top');\n const showLabel = !hideLabel && !!label && effectiveLabelPlacement !== 'hidden' && effectiveMode !== DisplayChromeMode.COMPACT && effectiveMode !== DisplayChromeMode.HIDDEN;\n const showDescription = !hideDescription && !!description && effectiveMode !== DisplayChromeMode.COMPACT && effectiveMode !== DisplayChromeMode.HIDDEN;\n // No mode test here on purpose: the COMPACT and HIDDEN branches below return before any note is placed, so the\n // bare-value modes carry none by construction (pinned in display-field-provenance-chrome.test.tsx).\n const showProvenance = !!provenance;\n const provenanceNote = showProvenance\n ? <DisplayFieldProvenanceNote provenance={provenance} />\n : null;\n const hiddenLabel = !hideLabel && !!label && effectiveLabelPlacement === 'hidden'\n ? <span className=\"sr-only\">{label}</span>\n : null;\n\n // ── HIDDEN mode: pass through ──\n if (effectiveMode === DisplayChromeMode.HIDDEN) {\n return <>{hiddenLabel}{children}</>;\n }\n\n // ── COMPACT mode: bare value, no chrome ──\n if (effectiveMode === DisplayChromeMode.COMPACT) {\n return (\n <div\n data-slot=\"field-chrome\"\n data-chrome-mode=\"compact\"\n data-label-placement={effectiveLabelPlacement}\n data-field={name}\n data-testid={name ? `field-${name}` : undefined}\n data-guidance-field={name}\n className={className}\n >\n {hiddenLabel}\n {children}\n </div>\n );\n }\n\n // ── INLINE mode: a snug \"Label: value\" fact row ──\n // The label reads as a prefix with a colon, the value directly beside it — one labelled fact per\n // line (\"Metric: within one day\"), wrapping when the value is long. This is deliberately NOT the\n // horizontal Field layout (label left, value pinned to the inline-end edge): a fact row is read as\n // one sentence, not scanned as a settings table.\n //\n // The prefix is the same muted TERM as a stacked label (since 2026-09-25). It was a small bold\n // foreground prefix, chosen while stacked labels were foreground too; once those became terms, an\n // entry mixing the two modes named its facts in two voices — \"Target window:\" dark and bold\n // beneath a muted \"Objective\" — which is the inconsistency a reader sees before reading anything.\n if (effectiveMode === DisplayChromeMode.INLINE) {\n return (\n <div\n data-slot=\"field-chrome\"\n data-chrome-mode=\"inline\"\n data-label-placement={effectiveLabelPlacement}\n data-field={name}\n data-testid={name ? `field-${name}` : undefined}\n data-guidance-field={name}\n className={cn(\"flex flex-wrap items-baseline gap-x-1.5 gap-y-element-xs\", className)}\n >\n {hiddenLabel}\n {showLabel && (\n <span className={cn(\"shrink-0\", termRecipe.base)}>\n {label}:\n {tooltip && <DisplayTooltipIcon text={tooltip} />}\n </span>\n )}\n <div className=\"min-w-0\">{children}</div>\n {showDescription && <FieldDescription className=\"w-full\">{description}</FieldDescription>}\n {showProvenance && <DisplayFieldProvenanceNote provenance={provenance} className=\"w-full\" />}\n </div>\n );\n }\n\n // ── SETTINGS_ROW mode: a self-contained settings list-item (read mode) ──\n // Read-mode counterpart of the form's SETTINGS_ROW (FormFieldChrome) — IDENTICAL\n // row geometry (same `py-group` rhythm, same hairline `border-b … last:border-b-0`\n // divider, same fixed-width inline-end column) so a view→edit drill keeps the\n // value/control in the same place and a read-only settings list reads exactly\n // like its editable twin. Values right-align to the row's inline-end edge\n // (`items-end text-end`) so badges / ✓✗ booleans / text all share one edge\n // instead of the previous ragged 200–320px box. See FormFieldChrome for the\n // full rationale.\n //\n // On a MOBILE viewport the row keeps its shell and stacks the value beneath the\n // label (the same element structure, only classes change), mirroring the edit twin.\n if (effectiveMode === DisplayChromeMode.SETTINGS_ROW) {\n return (\n <div\n data-slot=\"field-chrome\"\n data-chrome-mode=\"settings_row\"\n data-settings-row-layout={isMobile ? \"stacked\" : undefined}\n data-label-placement={effectiveLabelPlacement}\n data-field={name}\n data-testid={name ? `field-${name}` : undefined}\n data-guidance-field={name}\n className={cn(\n // Row rhythm (T4): a compact min-height + a subtle hover affordance so a\n // settings list reads as scannable rows, not a flat stack. Vertical\n // alignment is CONTENT-AWARE: a single-line row (no description) CENTERS\n // its label + control in the min-height (`items-center`) so there is no\n // dead space below the label — this is what made the rows read too tall;\n // a row WITH a description top-aligns (`items-start`) so the control lines\n // up with the label's first line and the description flows beneath.\n // The row OWNS its inline padding (`px-card`): inside a CARD settings\n // list the body is padding-less, so the row's `border-b` runs full-bleed\n // to the card edge while `px-card` keeps the text inset; in a flat host\n // the same `px-card` gives consistent inset. Block padding stays tight\n // (`py-card-sm`) to keep rows compact.\n \"flex min-h-10 px-card py-card-sm border-b border-border last:border-b-0 hover:bg-muted/50 transition-colors\",\n isMobile\n ? \"flex-col gap-element-xs\"\n : cn(\"flex-row gap-section\", showDescription ? \"items-start\" : \"items-center\"),\n className,\n )}\n >\n {/* Inline-start: label + description. The label stays the FORM label here, deliberately not\n the muted term the other read modes use: a settings row mirrors its editable twin, where\n the label is the setting's name and reads first, so a view→edit drill keeps its voice. */}\n <div className={cn(\"flex min-w-0 flex-col gap-element-xs\", !isMobile && \"flex-1\")}>\n {hiddenLabel}\n {showLabel && (\n <FieldLabel>\n {label}\n {tooltip && <DisplayTooltipIcon text={tooltip} />}\n </FieldLabel>\n )}\n {showDescription && <FieldDescription>{description}</FieldDescription>}\n </div>\n {/* Inline-end: value, right-pinned to the row's inline-end edge. `w-72` is\n the shared target width; `shrink` + `min-w-0` (NOT `shrink-0`) keeps the\n column compressible so the row can never outgrow a padded CARD fieldset\n and clip against its border — mirrors the edit-mode FormFieldChrome twin. */}\n <div\n className={cn(\n \"flex min-w-0 flex-col gap-element-xs\",\n isMobile ? \"w-full items-start text-start\" : \"w-72 max-w-[55%] shrink items-end text-end\",\n )}\n >\n {children}\n {provenanceNote}\n </div>\n </div>\n );\n }\n\n // ── Horizontal label modes ──\n if (effectiveLabelPlacement === 'start' || effectiveLabelPlacement === 'inline') {\n const isInlinePlacement = effectiveLabelPlacement === 'inline';\n return (\n <Field\n orientation={FieldVariants_Orientation.HORIZONTAL}\n data-slot=\"field-chrome\"\n data-chrome-mode=\"inline\"\n data-label-placement={effectiveLabelPlacement}\n data-field={name}\n data-testid={name ? `field-${name}` : undefined}\n data-guidance-field={name}\n className={cn(isInlinePlacement && \"flex-row-reverse\", className)}\n >\n {hiddenLabel}\n <FieldContent>\n {showLabel && (\n <FieldTitle>\n {/* The same muted TERM as the stacked and inline labels — one voice for naming a value. */}\n <FieldLabel className={termRecipe.base}>\n {label}\n {tooltip && <DisplayTooltipIcon text={tooltip} />}\n </FieldLabel>\n </FieldTitle>\n )}\n {showDescription && <FieldDescription>{description}</FieldDescription>}\n {provenanceNote}\n </FieldContent>\n {children}\n </Field>\n );\n }\n\n // ── STACKED mode (default): label above, value, description below ──\n return (\n <Field\n orientation={FieldVariants_Orientation.VERTICAL}\n data-slot=\"field-chrome\"\n data-chrome-mode=\"stacked\"\n data-label-placement={effectiveLabelPlacement}\n data-field={name}\n data-testid={name ? `field-${name}` : undefined}\n data-guidance-field={name}\n className={className}\n >\n {hiddenLabel}\n {showLabel && (\n labelStyle === DisplayLabelStyle.TITLE ? (\n /*\n * TITLE label style: the label reads as a SMALL TITLE above its content — for a field\n * acting as a mini-section inside a prose flow (\"Who suffers it\" above its answer),\n * where the ordinary muted label would not carry the structure.\n */\n <div className={cn(\"pt-item-xs\", eyebrowRecipe.base)}>\n {label}\n {tooltip && <DisplayTooltipIcon text={tooltip} />}\n </div>\n ) : (\n <FieldLabel className={termRecipe.base}>\n {label}\n {tooltip && <DisplayTooltipIcon text={tooltip} />}\n </FieldLabel>\n )\n )}\n {children}\n {showDescription && <FieldDescription>{description}</FieldDescription>}\n {provenanceNote}\n </Field>\n );\n}\n\n;(DisplayFieldChrome as typeof DisplayFieldChrome & { displayName: string }).displayName = \"DisplayFieldChrome\"\n\nexport { DisplayFieldChrome, resolveEffectiveDisplayChromeMode }\n"]}
@@ -11,6 +11,7 @@ import type { FieldSchemaType, FileFieldEndpoints, DisplayFieldComponent as Disp
11
11
  import type { DisplayChromeMode, DisplayLabelStyle, ResponsiveAware } from '@wildo-ai/zod-decorators';
12
12
  import type { AutoEmptyValue, AutoLabelPlacement } from '@wildo-ai/presets-components-models';
13
13
  import type { DisplayResourceLinkTrail } from './display-resource-link-trail';
14
+ import type { DisplayFieldProvenance } from './external-data-provenance/external-data-provenance.frontend';
14
15
  export interface DisplayFieldResolvedProps {
15
16
  /** Resolved Zod schema — gate guarantees this is defined. */
16
17
  schema: z.ZodTypeAny;
@@ -26,6 +27,11 @@ export interface DisplayFieldResolvedProps {
26
27
  description?: string;
27
28
  /** Resolved tooltip from props or context. */
28
29
  tooltip?: string;
30
+ /**
31
+ * The provenance of a field an external-data pipeline writes (#1997) — the instance and the last completed pass,
32
+ * resolved by the gate; absent for every other field. The chrome places it and suppresses it in its bare-value modes.
33
+ */
34
+ provenance?: DisplayFieldProvenance;
29
35
  /** Resolved enum labels from props or context. */
30
36
  enumLabels?: Record<string, string>;
31
37
  /** Display component override from decorator. */
@@ -1 +1 @@
1
- {"version":3,"file":"display-field-resolved-props.d.ts","sourceRoot":"","sources":["../../../../../src/components/data-display/display-field-resolved-props.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EAAE,eAAe,EAAE,kBAAkB,EAAE,qBAAqB,IAAI,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACxI,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AACtG,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAC9F,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAE9E,MAAM,WAAW,yBAAyB;IACxC,6DAA6D;IAC7D,MAAM,EAAE,CAAC,CAAC,UAAU,CAAC;IACrB,8DAA8D;IAC9D,UAAU,EAAE,eAAe,CAAC;IAC5B,8DAA8D;IAC9D,KAAK,EAAE,OAAO,CAAC;IACf,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kDAAkD;IAClD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8CAA8C;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kDAAkD;IAClD,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,iDAAiD;IACjD,gBAAgB,CAAC,EAAE,yBAAyB,CAAC;IAC7C,6DAA6D;IAC7D,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC;6GACyG;IACzG,iBAAiB,CAAC,EAAE,wBAAwB,CAAC;IAC7C;;;;;;;;OAQG;IACH,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,KAAK,KAAK,CAAC,SAAS,CAAC;IAC7E,sBAAsB;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+BAA+B;IAC/B,SAAS,EAAE,OAAO,CAAC;IACnB,qCAAqC;IACrC,eAAe,EAAE,OAAO,CAAC;IACzB,mGAAmG;IACnG,kBAAkB,CAAC,EAAE,eAAe,CAAC,iBAAiB,CAAC,CAAC;IACxD,qEAAqE;IACrE,sBAAsB,CAAC,EAAE,kBAAkB,CAAC;IAC5C,8FAA8F;IAC9F,kBAAkB,CAAC,EAAE,iBAAiB,CAAC;IACvC,yDAAyD;IACzD,kBAAkB,CAAC,EAAE,cAAc,CAAC;IACpC,yDAAyD;IACzD,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;CACxD"}
1
+ {"version":3,"file":"display-field-resolved-props.d.ts","sourceRoot":"","sources":["../../../../../src/components/data-display/display-field-resolved-props.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EAAE,eAAe,EAAE,kBAAkB,EAAE,qBAAqB,IAAI,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACxI,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AACtG,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAC9F,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAC9E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,8DAA8D,CAAC;AAE3G,MAAM,WAAW,yBAAyB;IACxC,6DAA6D;IAC7D,MAAM,EAAE,CAAC,CAAC,UAAU,CAAC;IACrB,8DAA8D;IAC9D,UAAU,EAAE,eAAe,CAAC;IAC5B,8DAA8D;IAC9D,KAAK,EAAE,OAAO,CAAC;IACf,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kDAAkD;IAClD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8CAA8C;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,UAAU,CAAC,EAAE,sBAAsB,CAAC;IACpC,kDAAkD;IAClD,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,iDAAiD;IACjD,gBAAgB,CAAC,EAAE,yBAAyB,CAAC;IAC7C,6DAA6D;IAC7D,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC;6GACyG;IACzG,iBAAiB,CAAC,EAAE,wBAAwB,CAAC;IAC7C;;;;;;;;OAQG;IACH,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,KAAK,KAAK,CAAC,SAAS,CAAC;IAC7E,sBAAsB;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+BAA+B;IAC/B,SAAS,EAAE,OAAO,CAAC;IACnB,qCAAqC;IACrC,eAAe,EAAE,OAAO,CAAC;IACzB,mGAAmG;IACnG,kBAAkB,CAAC,EAAE,eAAe,CAAC,iBAAiB,CAAC,CAAC;IACxD,qEAAqE;IACrE,sBAAsB,CAAC,EAAE,kBAAkB,CAAC;IAC5C,8FAA8F;IAC9F,kBAAkB,CAAC,EAAE,iBAAiB,CAAC;IACvC,yDAAyD;IACzD,kBAAkB,CAAC,EAAE,cAAc,CAAC;IACpC,yDAAyD;IACzD,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;CACxD"}
@@ -1 +1 @@
1
- {"version":3,"file":"display-field-resolved-props.js","sourceRoot":"","sources":["../../../../../src/components/data-display/display-field-resolved-props.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG","sourcesContent":["/**\n * Shared resolved props interface for DisplayFieldReadOnly and DisplayFieldEditable.\n *\n * These props are resolved by the DisplayField gate component from explicit props\n * and DisplayTemplateContext, then passed to the appropriate child component.\n * All context resolution happens in the gate — children receive concrete values.\n */\n\nimport type React from 'react';\nimport type { z } from 'zod';\nimport type { FieldSchemaType, FileFieldEndpoints, DisplayFieldComponent as DisplayFieldComponentEnum } from '@wildo-ai/zod-decorators';\nimport type { DisplayChromeMode, DisplayLabelStyle, ResponsiveAware } from '@wildo-ai/zod-decorators';\nimport type { AutoEmptyValue, AutoLabelPlacement } from '@wildo-ai/presets-components-models';\nimport type { DisplayResourceLinkTrail } from './display-resource-link-trail';\n\nexport interface DisplayFieldResolvedProps {\n /** Resolved Zod schema — gate guarantees this is defined. */\n schema: z.ZodTypeAny;\n /** Resolved schema type — gate guarantees this is defined. */\n schemaType: FieldSchemaType;\n /** Field value — may be undefined for null/missing fields. */\n value: unknown;\n /** Fully-qualified field name (with pathPrefix applied). */\n fieldName?: string;\n /** Resolved label from props or context. */\n label?: string;\n /** Resolved description from props or context. */\n description?: string;\n /** Resolved tooltip from props or context. */\n tooltip?: string;\n /** Resolved enum labels from props or context. */\n enumLabels?: Record<string, string>;\n /** Display component override from decorator. */\n displayComponent?: DisplayFieldComponentEnum;\n /** Parent data object for FK sibling extraction (REL-02). */\n parentData?: Record<string, unknown>;\n /** Resource-link trail — how many relationship objects were expanded to reach this subtree, and\n * which resource it now belongs to. Absent at the display root. See `display-resource-link-trail.ts`. */\n resourceLinkTrail?: DisplayResourceLinkTrail;\n /**\n * Per-item TEMPLATE for an ARRAY field, authored through `DisplayFieldArray.renderItem`.\n *\n * Receives the item's path AS THIS SURFACE ADDRESSES IT — on a read surface that is the display\n * path (`icps[0]`), which is what a nested `<DisplayField name=…>` resolves against. The\n * inline-editable path passes the array's LOCAL FORM path instead (`checklist.0`), because that\n * is what its autosave bindings resolve against. Same prop, two path shapes, because the two\n * surfaces genuinely address differently — see `DisplayFieldArray`.\n */\n renderItem?: (itemPath: string, itemSchema: z.ZodTypeAny) => React.ReactNode;\n /** CSS class name. */\n className?: string;\n /** Whether label is hidden. */\n hideLabel: boolean;\n /** Whether description is hidden. */\n hideDescription: boolean;\n /** Resolved chrome mode (field decorator → section default → display default → surface policy). */\n resolvedChromeMode?: ResponsiveAware<DisplayChromeMode>;\n /** Resolved label placement from explicit prop or surface policy. */\n resolvedLabelPlacement?: AutoLabelPlacement;\n /** Resolved label style (decorator `display.labelStyle` or an explicit template override). */\n resolvedLabelStyle?: DisplayLabelStyle;\n /** Resolved empty-value strategy from surface policy. */\n resolvedEmptyValue?: AutoEmptyValue;\n /** File upload endpoints from ResourceDisplayContext. */\n fileUploadContext?: Record<string, FileFieldEndpoints>;\n}\n"]}
1
+ {"version":3,"file":"display-field-resolved-props.js","sourceRoot":"","sources":["../../../../../src/components/data-display/display-field-resolved-props.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG","sourcesContent":["/**\n * Shared resolved props interface for DisplayFieldReadOnly and DisplayFieldEditable.\n *\n * These props are resolved by the DisplayField gate component from explicit props\n * and DisplayTemplateContext, then passed to the appropriate child component.\n * All context resolution happens in the gate — children receive concrete values.\n */\n\nimport type React from 'react';\nimport type { z } from 'zod';\nimport type { FieldSchemaType, FileFieldEndpoints, DisplayFieldComponent as DisplayFieldComponentEnum } from '@wildo-ai/zod-decorators';\nimport type { DisplayChromeMode, DisplayLabelStyle, ResponsiveAware } from '@wildo-ai/zod-decorators';\nimport type { AutoEmptyValue, AutoLabelPlacement } from '@wildo-ai/presets-components-models';\nimport type { DisplayResourceLinkTrail } from './display-resource-link-trail';\nimport type { DisplayFieldProvenance } from './external-data-provenance/external-data-provenance.frontend';\n\nexport interface DisplayFieldResolvedProps {\n /** Resolved Zod schema — gate guarantees this is defined. */\n schema: z.ZodTypeAny;\n /** Resolved schema type — gate guarantees this is defined. */\n schemaType: FieldSchemaType;\n /** Field value — may be undefined for null/missing fields. */\n value: unknown;\n /** Fully-qualified field name (with pathPrefix applied). */\n fieldName?: string;\n /** Resolved label from props or context. */\n label?: string;\n /** Resolved description from props or context. */\n description?: string;\n /** Resolved tooltip from props or context. */\n tooltip?: string;\n /**\n * The provenance of a field an external-data pipeline writes (#1997) — the instance and the last completed pass,\n * resolved by the gate; absent for every other field. The chrome places it and suppresses it in its bare-value modes.\n */\n provenance?: DisplayFieldProvenance;\n /** Resolved enum labels from props or context. */\n enumLabels?: Record<string, string>;\n /** Display component override from decorator. */\n displayComponent?: DisplayFieldComponentEnum;\n /** Parent data object for FK sibling extraction (REL-02). */\n parentData?: Record<string, unknown>;\n /** Resource-link trail — how many relationship objects were expanded to reach this subtree, and\n * which resource it now belongs to. Absent at the display root. See `display-resource-link-trail.ts`. */\n resourceLinkTrail?: DisplayResourceLinkTrail;\n /**\n * Per-item TEMPLATE for an ARRAY field, authored through `DisplayFieldArray.renderItem`.\n *\n * Receives the item's path AS THIS SURFACE ADDRESSES IT — on a read surface that is the display\n * path (`icps[0]`), which is what a nested `<DisplayField name=…>` resolves against. The\n * inline-editable path passes the array's LOCAL FORM path instead (`checklist.0`), because that\n * is what its autosave bindings resolve against. Same prop, two path shapes, because the two\n * surfaces genuinely address differently — see `DisplayFieldArray`.\n */\n renderItem?: (itemPath: string, itemSchema: z.ZodTypeAny) => React.ReactNode;\n /** CSS class name. */\n className?: string;\n /** Whether label is hidden. */\n hideLabel: boolean;\n /** Whether description is hidden. */\n hideDescription: boolean;\n /** Resolved chrome mode (field decorator → section default → display default → surface policy). */\n resolvedChromeMode?: ResponsiveAware<DisplayChromeMode>;\n /** Resolved label placement from explicit prop or surface policy. */\n resolvedLabelPlacement?: AutoLabelPlacement;\n /** Resolved label style (decorator `display.labelStyle` or an explicit template override). */\n resolvedLabelStyle?: DisplayLabelStyle;\n /** Resolved empty-value strategy from surface policy. */\n resolvedEmptyValue?: AutoEmptyValue;\n /** File upload endpoints from ResourceDisplayContext. */\n fileUploadContext?: Record<string, FileFieldEndpoints>;\n}\n"]}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * The provenance note beneath a pipeline-written value (#1997): "Synced from Odoo · as of 12 minutes ago".
3
+ *
4
+ * Every word comes from the i18n tree (`display-text-comes-from-i18n.md`):
5
+ * - the sentence is `components.LOW_LEVEL_FORM_FIELD.syncedFromAsOf`, with `system` and `asOf` params;
6
+ * - the instance is `systems_of_record.<name>.displayName`, planned by the labelling pipeline for every declared
7
+ * instance. A name nobody generated words for renders RAW (`odoo`) — the missing label looking missing, never a
8
+ * word derived from the identifier;
9
+ * - the instant is the viewer's regional formatting, relative when near ("12 minutes ago") and a date when far.
10
+ *
11
+ * Rendered with the `FieldDescription` recipe so it reads in the description voice, as a note about the value.
12
+ */
13
+ import React from 'react';
14
+ import type { DisplayFieldProvenance } from './external-data-provenance.frontend';
15
+ export interface DisplayFieldProvenanceNoteProps {
16
+ provenance: DisplayFieldProvenance;
17
+ className?: string;
18
+ }
19
+ export declare function DisplayFieldProvenanceNote({ provenance, className }: DisplayFieldProvenanceNoteProps): React.JSX.Element | null;
20
+ export declare namespace DisplayFieldProvenanceNote {
21
+ var displayName: string;
22
+ }
23
+ //# sourceMappingURL=DisplayFieldProvenanceNote.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DisplayFieldProvenanceNote.d.ts","sourceRoot":"","sources":["../../../../../../src/components/data-display/external-data-provenance/DisplayFieldProvenanceNote.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAkB,MAAM,OAAO,CAAC;AAOvC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAElF,MAAM,WAAW,+BAA+B;IAC9C,UAAU,EAAE,sBAAsB,CAAC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,0BAA0B,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,+BAA+B,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,CAkB/H;yBAlBe,0BAA0B"}
@@ -0,0 +1,35 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /**
3
+ * The provenance note beneath a pipeline-written value (#1997): "Synced from Odoo · as of 12 minutes ago".
4
+ *
5
+ * Every word comes from the i18n tree (`display-text-comes-from-i18n.md`):
6
+ * - the sentence is `components.LOW_LEVEL_FORM_FIELD.syncedFromAsOf`, with `system` and `asOf` params;
7
+ * - the instance is `systems_of_record.<name>.displayName`, planned by the labelling pipeline for every declared
8
+ * instance. A name nobody generated words for renders RAW (`odoo`) — the missing label looking missing, never a
9
+ * word derived from the identifier;
10
+ * - the instant is the viewer's regional formatting, relative when near ("12 minutes ago") and a date when far.
11
+ *
12
+ * Rendered with the `FieldDescription` recipe so it reads in the description voice, as a note about the value.
13
+ */
14
+ import { useMemo } from 'react';
15
+ import { DateDisplayMode } from '@wildo-ai/zod-decorators';
16
+ import { FrontendComponentType } from '@wildo-ai/presets-components-models';
17
+ import { buildSystemOfRecordDisplayNameLabelKey } from '@wildo-ai/saas-models';
18
+ import { FieldDescription } from '../../../components/form/chromes/field.js';
19
+ import { useI18n } from '../../../core/i18n/useI18n.js';
20
+ export function DisplayFieldProvenanceNote({ provenance, className }) {
21
+ const systemKey = buildSystemOfRecordDisplayNameLabelKey(provenance.system);
22
+ const keys = useMemo(() => [systemKey], [systemKey]);
23
+ const { tComponent, t, formatDateTimeForDisplayMode, isReady } = useI18n({
24
+ component: FrontendComponentType.LOW_LEVEL_FORM_FIELD,
25
+ keys,
26
+ });
27
+ if (!isReady)
28
+ return null;
29
+ const translatedSystem = t(systemKey);
30
+ const system = translatedSystem && translatedSystem !== systemKey ? translatedSystem : provenance.system;
31
+ const asOf = formatDateTimeForDisplayMode(provenance.currentAsOf, DateDisplayMode.AUTO);
32
+ return (_jsx(FieldDescription, { className: className, "data-field-provenance": "", children: tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD, 'syncedFromAsOf', { system, asOf }) }));
33
+ }
34
+ DisplayFieldProvenanceNote.displayName = 'DisplayFieldProvenanceNote';
35
+ //# sourceMappingURL=DisplayFieldProvenanceNote.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DisplayFieldProvenanceNote.js","sourceRoot":"","sources":["../../../../../../src/components/data-display/external-data-provenance/DisplayFieldProvenanceNote.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG;AACH,OAAc,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAC5E,OAAO,EAAE,sCAAsC,EAAE,MAAM,uBAAuB,CAAC;AAE/E,OAAO,EAAE,gBAAgB,EAAE,MAAM,mDAAmD,CAAC;AACrF,OAAO,EAAE,OAAO,EAAE,MAAM,uCAAuC,CAAC;AAQhE,MAAM,UAAU,0BAA0B,CAAC,EAAE,UAAU,EAAE,SAAS,EAAmC;IACnG,MAAM,SAAS,GAAG,sCAAsC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IAC5E,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IACrD,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE,4BAA4B,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;QACvE,SAAS,EAAE,qBAAqB,CAAC,oBAAoB;QACrD,IAAI;KACL,CAAC,CAAC;IACH,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAE1B,MAAM,gBAAgB,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,gBAAgB,IAAI,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC;IACzG,MAAM,IAAI,GAAG,4BAA4B,CAAC,UAAU,CAAC,WAAW,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC;IAExF,OAAO,CACL,KAAC,gBAAgB,IAAC,SAAS,EAAE,SAAS,2BAAwB,EAAE,YAC7D,UAAU,CAAC,qBAAqB,CAAC,oBAAoB,EAAE,gBAAgB,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAC1E,CACpB,CAAC;AACJ,CAAC;AAED,0BAA0B,CAAC,WAAW,GAAG,4BAA4B,CAAC","sourcesContent":["/**\n * The provenance note beneath a pipeline-written value (#1997): \"Synced from Odoo · as of 12 minutes ago\".\n *\n * Every word comes from the i18n tree (`display-text-comes-from-i18n.md`):\n * - the sentence is `components.LOW_LEVEL_FORM_FIELD.syncedFromAsOf`, with `system` and `asOf` params;\n * - the instance is `systems_of_record.<name>.displayName`, planned by the labelling pipeline for every declared\n * instance. A name nobody generated words for renders RAW (`odoo`) — the missing label looking missing, never a\n * word derived from the identifier;\n * - the instant is the viewer's regional formatting, relative when near (\"12 minutes ago\") and a date when far.\n *\n * Rendered with the `FieldDescription` recipe so it reads in the description voice, as a note about the value.\n */\nimport React, { useMemo } from 'react';\nimport { DateDisplayMode } from '@wildo-ai/zod-decorators';\nimport { FrontendComponentType } from '@wildo-ai/presets-components-models';\nimport { buildSystemOfRecordDisplayNameLabelKey } from '@wildo-ai/saas-models';\n\nimport { FieldDescription } from '~wildo-frontend-lib/components/form/chromes/field';\nimport { useI18n } from '~wildo-frontend-lib/core/i18n/useI18n';\nimport type { DisplayFieldProvenance } from './external-data-provenance.frontend';\n\nexport interface DisplayFieldProvenanceNoteProps {\n provenance: DisplayFieldProvenance;\n className?: string;\n}\n\nexport function DisplayFieldProvenanceNote({ provenance, className }: DisplayFieldProvenanceNoteProps): React.JSX.Element | null {\n const systemKey = buildSystemOfRecordDisplayNameLabelKey(provenance.system);\n const keys = useMemo(() => [systemKey], [systemKey]);\n const { tComponent, t, formatDateTimeForDisplayMode, isReady } = useI18n({\n component: FrontendComponentType.LOW_LEVEL_FORM_FIELD,\n keys,\n });\n if (!isReady) return null;\n\n const translatedSystem = t(systemKey);\n const system = translatedSystem && translatedSystem !== systemKey ? translatedSystem : provenance.system;\n const asOf = formatDateTimeForDisplayMode(provenance.currentAsOf, DateDisplayMode.AUTO);\n\n return (\n <FieldDescription className={className} data-field-provenance=\"\">\n {tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD, 'syncedFromAsOf', { system, asOf })}\n </FieldDescription>\n );\n}\n\nDisplayFieldProvenanceNote.displayName = 'DisplayFieldProvenanceNote';\n"]}
@@ -0,0 +1,47 @@
1
+ import { type ExternalDataPipelineDeclaration, type ExternalDataProvenanceResponse } from '@wildo-ai/saas-models/external-data';
2
+ import type { AnyFrontendResourceConfiguration } from '../../../core/resources/resources.frontend.schemas';
3
+ import type { WildoBackendHttpClient } from '../../../core/requests/wildo-http-client.frontend.service';
4
+ /** How long one answer is trusted: well under a pipeline's shortest sensible interval, well over one page's life. */
5
+ export declare const EXTERNAL_DATA_PROVENANCE_TTL_MS: number;
6
+ /**
7
+ * What the display chrome is handed for a synced field — the provenance answer once a pass has COMPLETED. A pipeline
8
+ * that never completed one produces no cue at all rather than an "as of" nobody can state.
9
+ */
10
+ export interface DisplayFieldProvenance {
11
+ /** The declared system-of-record instance NAME; its words come from `systems_of_record.<name>.displayName`. */
12
+ readonly system: string;
13
+ /** When the most recent completed pass BEGAN reading (ISO 8601) — the instant its rows are current as of. */
14
+ readonly currentAsOf: string;
15
+ }
16
+ /** The pipeline-written local fields of a destination, derived once per declaration object. */
17
+ export declare function externalDataSyncedFieldSet(declaration: ExternalDataPipelineDeclaration): ReadonlySet<string>;
18
+ /**
19
+ * The provenance route of a destination, composed from its default LIST operation's initiator URL. The LIST operation is
20
+ * selected with `isDefaultUrlBearingOperation`, the same predicate the backend mounts the route with
21
+ * (`external-data-provenance-route.backend.ts`), and exactly one must match there too — so the two sides select one
22
+ * operation and describe one path, rather than two selections that happen to agree.
23
+ *
24
+ * @returns a path under `/api/v1` for the HTTP client, or `undefined` when the destination has no LIST initiator whose
25
+ * parameters the current context can fill — in which case no request is made and no cue is shown.
26
+ */
27
+ export declare function buildExternalDataProvenancePath(params: {
28
+ resourceConfiguration: AnyFrontendResourceConfiguration;
29
+ contextualParameters: Record<string, string | number>;
30
+ }): string | undefined;
31
+ /** `useSyncExternalStore` subscription. */
32
+ export declare function subscribeExternalDataProvenance(listener: () => void): () => void;
33
+ /**
34
+ * How long until the cached answer for a path expires (ms, never negative), or `undefined` when nothing is cached — the
35
+ * hook's cue to schedule its re-read.
36
+ */
37
+ export declare function msUntilExternalDataProvenanceExpires(path: string | undefined, now?: number): number | undefined;
38
+ /** The cached answer for a path: the response, `null` for a refused/failed read, `undefined` while unknown. */
39
+ export declare function peekExternalDataProvenance(path: string | undefined): ExternalDataProvenanceResponse | null | undefined;
40
+ /**
41
+ * Read the path unless a fresh answer is cached or a read is already on its way. Every synced field of a record calls
42
+ * this; exactly one request leaves.
43
+ */
44
+ export declare function ensureExternalDataProvenance(path: string, httpClient: Pick<WildoBackendHttpClient, 'get'>, now?: number): void;
45
+ /** Test seam: forget every cached answer. */
46
+ export declare function resetExternalDataProvenanceCache(): void;
47
+ //# sourceMappingURL=external-data-provenance.frontend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external-data-provenance.frontend.d.ts","sourceRoot":"","sources":["../../../../../../src/components/data-display/external-data-provenance/external-data-provenance.frontend.ts"],"names":[],"mappings":"AA0BA,OAAO,EAIL,KAAK,+BAA+B,EACpC,KAAK,8BAA8B,EACpC,MAAM,qCAAqC,CAAC;AAI7C,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,+DAA+D,CAAC;AACtH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sEAAsE,CAAC;AAEnH,qHAAqH;AACrH,eAAO,MAAM,+BAA+B,QAAgB,CAAC;AAE7D;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACrC,+GAA+G;IAC/G,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,6GAA6G;IAC7G,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAID,+FAA+F;AAC/F,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,+BAA+B,GAAG,WAAW,CAAC,MAAM,CAAC,CAO5G;AAED;;;;;;;;GAQG;AACH,wBAAgB,+BAA+B,CAAC,MAAM,EAAE;IACtD,qBAAqB,EAAE,gCAAgC,CAAC;IACxD,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;CACvD,GAAG,MAAM,GAAG,SAAS,CAiBrB;AAeD,2CAA2C;AAC3C,wBAAgB,+BAA+B,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAGhF;AAED;;;GAGG;AACH,wBAAgB,oCAAoC,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,GAAG,GAAE,MAAmB,GAAG,MAAM,GAAG,SAAS,CAG3H;AAED,+GAA+G;AAC/G,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,8BAA8B,GAAG,IAAI,GAAG,SAAS,CAGtH;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,sBAAsB,EAAE,KAAK,CAAC,EAAE,GAAG,GAAE,MAAmB,GAAG,IAAI,CAiB1I;AAED,6CAA6C;AAC7C,wBAAgB,gCAAgC,IAAI,IAAI,CAIvD"}
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Reading a pipeline destination's provenance for the display chrome (#1997) — which fields a pipeline writes, the URL
3
+ * of the destination's provenance route, and a small cache so a record with six synced fields asks once.
4
+ *
5
+ * ## Why a module cache and not a provider in the context tree
6
+ *
7
+ * The answer is per DESTINATION and per ORGANIZATION (the route is scoped by the destination's LIST URL, which carries
8
+ * the organization), it changes at most once per pipeline pass, and only a handful of surfaces ever need it. A provider
9
+ * would have to sit in every application's tree for a read most of them never make. So the cache is keyed by the
10
+ * RESOLVED URL — which already names the organization, so switching organizations reads a different entry and never
11
+ * shows another tenant's answer — and entries expire after {@link EXTERNAL_DATA_PROVENANCE_TTL_MS}: the hook schedules
12
+ * a re-read at the expiry of the answer it shows, so a page left open across a pipeline pass does not keep saying
13
+ * "as of" an instant the copy has since moved past.
14
+ *
15
+ * ## Failure reads as silence
16
+ *
17
+ * A refused or failed read caches `null` for the same period, and the cue then renders nothing. The cue is a courtesy
18
+ * about a value that renders correctly without it; a failed read must not become an error on the field, and must not be
19
+ * retried on every render of every synced field.
20
+ */
21
+ import { MAIN_API_BASE_PATH, CoreResourceOperation, isDefaultUrlBearingOperation, } from '@wildo-ai/saas-models';
22
+ import { EXTERNAL_DATA_PROVENANCE_ROUTE_SEGMENT, ExternalDataProvenanceResponseSchema, listExternalDataPipelineSyncedLocalFields, } from '@wildo-ai/saas-models/external-data';
23
+ import { NavigationUtils } from '../../../core/navigation/navigation.utils.js';
24
+ import { FrontendResourceUtils } from '../../../core/resources/frontend-resource.utils.js';
25
+ /** How long one answer is trusted: well under a pipeline's shortest sensible interval, well over one page's life. */
26
+ export const EXTERNAL_DATA_PROVENANCE_TTL_MS = 5 * 60 * 1000;
27
+ const syncedFieldsByDeclaration = new WeakMap();
28
+ /** The pipeline-written local fields of a destination, derived once per declaration object. */
29
+ export function externalDataSyncedFieldSet(declaration) {
30
+ let fields = syncedFieldsByDeclaration.get(declaration);
31
+ if (!fields) {
32
+ fields = new Set(listExternalDataPipelineSyncedLocalFields(declaration));
33
+ syncedFieldsByDeclaration.set(declaration, fields);
34
+ }
35
+ return fields;
36
+ }
37
+ /**
38
+ * The provenance route of a destination, composed from its default LIST operation's initiator URL. The LIST operation is
39
+ * selected with `isDefaultUrlBearingOperation`, the same predicate the backend mounts the route with
40
+ * (`external-data-provenance-route.backend.ts`), and exactly one must match there too — so the two sides select one
41
+ * operation and describe one path, rather than two selections that happen to agree.
42
+ *
43
+ * @returns a path under `/api/v1` for the HTTP client, or `undefined` when the destination has no LIST initiator whose
44
+ * parameters the current context can fill — in which case no request is made and no cue is shown.
45
+ */
46
+ export function buildExternalDataProvenancePath(params) {
47
+ const { resourceConfiguration, contextualParameters } = params;
48
+ const listOperations = (resourceConfiguration.operations ?? []).filter((operation) => isDefaultUrlBearingOperation(operation, CoreResourceOperation.LIST));
49
+ if (listOperations.length !== 1)
50
+ return undefined;
51
+ const initiatorInfos = (listOperations[0].initiatorInfos ?? []);
52
+ if (initiatorInfos.length === 0)
53
+ return undefined;
54
+ const initiatorInfo = FrontendResourceUtils.selectOperationUrlInitiatorInfo({
55
+ initiatorInfos,
56
+ contextualParameters,
57
+ targetResourceType: resourceConfiguration.resourceIdentifier,
58
+ targetDefaultFieldIdentifier: resourceConfiguration.resourceFieldIdentifier,
59
+ });
60
+ if (!initiatorInfo)
61
+ return undefined;
62
+ const resolved = NavigationUtils.resolveUrlPath(`${MAIN_API_BASE_PATH}${initiatorInfo.url}`, contextualParameters);
63
+ if (!resolved || NavigationUtils.hasUnresolvedPlaceholders(resolved))
64
+ return undefined;
65
+ return `${resolved}/${EXTERNAL_DATA_PROVENANCE_ROUTE_SEGMENT}`;
66
+ }
67
+ const cache = new Map();
68
+ const inFlight = new Map();
69
+ const listeners = new Set();
70
+ function notify() {
71
+ for (const listener of listeners)
72
+ listener();
73
+ }
74
+ /** `useSyncExternalStore` subscription. */
75
+ export function subscribeExternalDataProvenance(listener) {
76
+ listeners.add(listener);
77
+ return () => { listeners.delete(listener); };
78
+ }
79
+ /**
80
+ * How long until the cached answer for a path expires (ms, never negative), or `undefined` when nothing is cached — the
81
+ * hook's cue to schedule its re-read.
82
+ */
83
+ export function msUntilExternalDataProvenanceExpires(path, now = Date.now()) {
84
+ const entry = path ? cache.get(path) : undefined;
85
+ return entry ? Math.max(0, entry.fetchedAt + EXTERNAL_DATA_PROVENANCE_TTL_MS - now) : undefined;
86
+ }
87
+ /** The cached answer for a path: the response, `null` for a refused/failed read, `undefined` while unknown. */
88
+ export function peekExternalDataProvenance(path) {
89
+ if (!path)
90
+ return undefined;
91
+ return cache.get(path)?.value;
92
+ }
93
+ /**
94
+ * Read the path unless a fresh answer is cached or a read is already on its way. Every synced field of a record calls
95
+ * this; exactly one request leaves.
96
+ */
97
+ export function ensureExternalDataProvenance(path, httpClient, now = Date.now()) {
98
+ const entry = cache.get(path);
99
+ if (entry && now - entry.fetchedAt < EXTERNAL_DATA_PROVENANCE_TTL_MS)
100
+ return;
101
+ if (inFlight.has(path))
102
+ return;
103
+ const read = (async () => {
104
+ let value;
105
+ try {
106
+ const parsed = ExternalDataProvenanceResponseSchema.safeParse(await httpClient.get(path, { silent: true }));
107
+ value = parsed.success ? parsed.data : null;
108
+ }
109
+ catch {
110
+ value = null;
111
+ }
112
+ cache.set(path, { value, fetchedAt: Date.now() });
113
+ inFlight.delete(path);
114
+ notify();
115
+ })();
116
+ inFlight.set(path, read);
117
+ }
118
+ /** Test seam: forget every cached answer. */
119
+ export function resetExternalDataProvenanceCache() {
120
+ cache.clear();
121
+ inFlight.clear();
122
+ notify();
123
+ }
124
+ //# sourceMappingURL=external-data-provenance.frontend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external-data-provenance.frontend.js","sourceRoot":"","sources":["../../../../../../src/components/data-display/external-data-provenance/external-data-provenance.frontend.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Reading a pipeline destination's provenance for the display chrome (#1997) — which fields a pipeline writes, the URL\n * of the destination's provenance route, and a small cache so a record with six synced fields asks once.\n *\n * ## Why a module cache and not a provider in the context tree\n *\n * The answer is per DESTINATION and per ORGANIZATION (the route is scoped by the destination's LIST URL, which carries\n * the organization), it changes at most once per pipeline pass, and only a handful of surfaces ever need it. A provider\n * would have to sit in every application's tree for a read most of them never make. So the cache is keyed by the\n * RESOLVED URL — which already names the organization, so switching organizations reads a different entry and never\n * shows another tenant's answer — and entries expire after {@link EXTERNAL_DATA_PROVENANCE_TTL_MS}: the hook schedules\n * a re-read at the expiry of the answer it shows, so a page left open across a pipeline pass does not keep saying\n * \"as of\" an instant the copy has since moved past.\n *\n * ## Failure reads as silence\n *\n * A refused or failed read caches `null` for the same period, and the cue then renders nothing. The cue is a courtesy\n * about a value that renders correctly without it; a failed read must not become an error on the field, and must not be\n * retried on every render of every synced field.\n */\nimport {\n MAIN_API_BASE_PATH,\n type ResourceConfiguration_Operation_UrlInitiatorInfo,\n CoreResourceOperation,\n isDefaultUrlBearingOperation,\n} from '@wildo-ai/saas-models';\nimport {\n EXTERNAL_DATA_PROVENANCE_ROUTE_SEGMENT,\n ExternalDataProvenanceResponseSchema,\n listExternalDataPipelineSyncedLocalFields,\n type ExternalDataPipelineDeclaration,\n type ExternalDataProvenanceResponse,\n} from '@wildo-ai/saas-models/external-data';\n\nimport { NavigationUtils } from '~wildo-frontend-lib/core/navigation/navigation.utils';\nimport { FrontendResourceUtils } from '~wildo-frontend-lib/core/resources/frontend-resource.utils';\nimport type { AnyFrontendResourceConfiguration } from '~wildo-frontend-lib/core/resources/resources.frontend.schemas';\nimport type { WildoBackendHttpClient } from '~wildo-frontend-lib/core/requests/wildo-http-client.frontend.service';\n\n/** How long one answer is trusted: well under a pipeline's shortest sensible interval, well over one page's life. */\nexport const EXTERNAL_DATA_PROVENANCE_TTL_MS = 5 * 60 * 1000;\n\n/**\n * What the display chrome is handed for a synced field — the provenance answer once a pass has COMPLETED. A pipeline\n * that never completed one produces no cue at all rather than an \"as of\" nobody can state.\n */\nexport interface DisplayFieldProvenance {\n /** The declared system-of-record instance NAME; its words come from `systems_of_record.<name>.displayName`. */\n readonly system: string;\n /** When the most recent completed pass BEGAN reading (ISO 8601) — the instant its rows are current as of. */\n readonly currentAsOf: string;\n}\n\nconst syncedFieldsByDeclaration = new WeakMap<ExternalDataPipelineDeclaration, ReadonlySet<string>>();\n\n/** The pipeline-written local fields of a destination, derived once per declaration object. */\nexport function externalDataSyncedFieldSet(declaration: ExternalDataPipelineDeclaration): ReadonlySet<string> {\n let fields = syncedFieldsByDeclaration.get(declaration);\n if (!fields) {\n fields = new Set(listExternalDataPipelineSyncedLocalFields(declaration));\n syncedFieldsByDeclaration.set(declaration, fields);\n }\n return fields;\n}\n\n/**\n * The provenance route of a destination, composed from its default LIST operation's initiator URL. The LIST operation is\n * selected with `isDefaultUrlBearingOperation`, the same predicate the backend mounts the route with\n * (`external-data-provenance-route.backend.ts`), and exactly one must match there too — so the two sides select one\n * operation and describe one path, rather than two selections that happen to agree.\n *\n * @returns a path under `/api/v1` for the HTTP client, or `undefined` when the destination has no LIST initiator whose\n * parameters the current context can fill — in which case no request is made and no cue is shown.\n */\nexport function buildExternalDataProvenancePath(params: {\n resourceConfiguration: AnyFrontendResourceConfiguration;\n contextualParameters: Record<string, string | number>;\n}): string | undefined {\n const { resourceConfiguration, contextualParameters } = params;\n const listOperations = (resourceConfiguration.operations ?? []).filter((operation) =>\n isDefaultUrlBearingOperation(operation, CoreResourceOperation.LIST));\n if (listOperations.length !== 1) return undefined;\n const initiatorInfos = (listOperations[0]!.initiatorInfos ?? []) as ResourceConfiguration_Operation_UrlInitiatorInfo[];\n if (initiatorInfos.length === 0) return undefined;\n const initiatorInfo = FrontendResourceUtils.selectOperationUrlInitiatorInfo({\n initiatorInfos,\n contextualParameters,\n targetResourceType: resourceConfiguration.resourceIdentifier,\n targetDefaultFieldIdentifier: resourceConfiguration.resourceFieldIdentifier,\n });\n if (!initiatorInfo) return undefined;\n const resolved = NavigationUtils.resolveUrlPath(`${MAIN_API_BASE_PATH}${initiatorInfo.url}`, contextualParameters);\n if (!resolved || NavigationUtils.hasUnresolvedPlaceholders(resolved)) return undefined;\n return `${resolved}/${EXTERNAL_DATA_PROVENANCE_ROUTE_SEGMENT}`;\n}\n\ninterface CacheEntry {\n readonly value: ExternalDataProvenanceResponse | null;\n readonly fetchedAt: number;\n}\n\nconst cache = new Map<string, CacheEntry>();\nconst inFlight = new Map<string, Promise<void>>();\nconst listeners = new Set<() => void>();\n\nfunction notify(): void {\n for (const listener of listeners) listener();\n}\n\n/** `useSyncExternalStore` subscription. */\nexport function subscribeExternalDataProvenance(listener: () => void): () => void {\n listeners.add(listener);\n return () => { listeners.delete(listener); };\n}\n\n/**\n * How long until the cached answer for a path expires (ms, never negative), or `undefined` when nothing is cached — the\n * hook's cue to schedule its re-read.\n */\nexport function msUntilExternalDataProvenanceExpires(path: string | undefined, now: number = Date.now()): number | undefined {\n const entry = path ? cache.get(path) : undefined;\n return entry ? Math.max(0, entry.fetchedAt + EXTERNAL_DATA_PROVENANCE_TTL_MS - now) : undefined;\n}\n\n/** The cached answer for a path: the response, `null` for a refused/failed read, `undefined` while unknown. */\nexport function peekExternalDataProvenance(path: string | undefined): ExternalDataProvenanceResponse | null | undefined {\n if (!path) return undefined;\n return cache.get(path)?.value;\n}\n\n/**\n * Read the path unless a fresh answer is cached or a read is already on its way. Every synced field of a record calls\n * this; exactly one request leaves.\n */\nexport function ensureExternalDataProvenance(path: string, httpClient: Pick<WildoBackendHttpClient, 'get'>, now: number = Date.now()): void {\n const entry = cache.get(path);\n if (entry && now - entry.fetchedAt < EXTERNAL_DATA_PROVENANCE_TTL_MS) return;\n if (inFlight.has(path)) return;\n const read = (async () => {\n let value: ExternalDataProvenanceResponse | null;\n try {\n const parsed = ExternalDataProvenanceResponseSchema.safeParse(await httpClient.get<unknown>(path, { silent: true }));\n value = parsed.success ? parsed.data : null;\n } catch {\n value = null;\n }\n cache.set(path, { value, fetchedAt: Date.now() });\n inFlight.delete(path);\n notify();\n })();\n inFlight.set(path, read);\n}\n\n/** Test seam: forget every cached answer. */\nexport function resetExternalDataProvenanceCache(): void {\n cache.clear();\n inFlight.clear();\n notify();\n}\n"]}
@@ -0,0 +1,8 @@
1
+ import { type DisplayFieldProvenance } from './external-data-provenance.frontend';
2
+ export declare function useExternalDataFieldProvenance(params: {
3
+ /** The field's full path as the gate resolved it. Only a TOP-LEVEL name can be pipeline-written. */
4
+ fieldName: string | undefined;
5
+ /** False on surfaces that never show the cue (SUMMARY: cards and FK previews), so they never cause a read. */
6
+ enabled: boolean;
7
+ }): DisplayFieldProvenance | undefined;
8
+ //# sourceMappingURL=useExternalDataFieldProvenance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useExternalDataFieldProvenance.d.ts","sourceRoot":"","sources":["../../../../../../src/components/data-display/external-data-provenance/useExternalDataFieldProvenance.ts"],"names":[],"mappings":"AAcA,OAAO,EAOL,KAAK,sBAAsB,EAC5B,MAAM,qCAAqC,CAAC;AAE7C,wBAAgB,8BAA8B,CAAC,MAAM,EAAE;IACrD,oGAAoG;IACpG,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,8GAA8G;IAC9G,OAAO,EAAE,OAAO,CAAC;CAClB,GAAG,sBAAsB,GAAG,SAAS,CAuCrC"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * The provenance of ONE displayed field (#1997): the answer the chrome shows beneath a value an external-data pipeline
3
+ * wrote, or `undefined` for every other field.
4
+ *
5
+ * Cheap for the overwhelming majority of fields, which is what lets the display gate call it for every field it
6
+ * renders: a resource that declares no pipeline, a nested path, an array item, or a field no mapping writes all return
7
+ * before any request exists. Words are NOT composed here — the note component does that, and only when it renders — so
8
+ * the gate takes on no i18n dependency for a field that never shows a cue.
9
+ */
10
+ import { useContext, useEffect, useMemo, useSyncExternalStore } from 'react';
11
+ import { useResourceDisplayContext } from '../automatic-displayer.utils.js';
12
+ import { ApplicationContext } from '../../../core/runtime/ApplicationContext.shared.js';
13
+ import { useResourceRegistrySafe } from '../../../core/resources/useResourceRegistry.js';
14
+ import { buildExternalDataProvenancePath, ensureExternalDataProvenance, externalDataSyncedFieldSet, msUntilExternalDataProvenanceExpires, peekExternalDataProvenance, subscribeExternalDataProvenance, } from './external-data-provenance.frontend.js';
15
+ export function useExternalDataFieldProvenance(params) {
16
+ const { resourceType, contextualParameters } = useResourceDisplayContext();
17
+ const registryContext = useResourceRegistrySafe();
18
+ // Read optionally: a display surface rendered outside an application (a test harness, a docs preview) has no client
19
+ // and simply shows no cue — the throwing `useApplication` would take every such surface down.
20
+ const httpClient = useContext(ApplicationContext)?.httpClient;
21
+ const resourceConfiguration = resourceType ? registryContext?.registry.resourceConfigurations[resourceType] : undefined;
22
+ const declaration = resourceConfiguration?.externalDataPipeline;
23
+ const isSyncedField = params.enabled
24
+ && !!declaration
25
+ && !!params.fieldName
26
+ && externalDataSyncedFieldSet(declaration).has(params.fieldName);
27
+ const path = useMemo(() => (isSyncedField && resourceConfiguration
28
+ ? buildExternalDataProvenancePath({ resourceConfiguration, contextualParameters: contextualParameters ?? {} })
29
+ : undefined), [isSyncedField, resourceConfiguration, contextualParameters]);
30
+ const answer = useSyncExternalStore(subscribeExternalDataProvenance, () => peekExternalDataProvenance(path));
31
+ // Read now if nothing fresh is cached, and again when the answer shown expires — a page left open across a pipeline
32
+ // pass must not keep its first "as of". The store dedupes, so every synced field of a record scheduling the same
33
+ // re-read still sends one request. `answer` is a dependency so the timer is re-armed each time a new answer lands.
34
+ useEffect(() => {
35
+ if (!path || !httpClient)
36
+ return undefined;
37
+ ensureExternalDataProvenance(path, httpClient);
38
+ const expiresIn = msUntilExternalDataProvenanceExpires(path);
39
+ if (expiresIn === undefined)
40
+ return undefined;
41
+ const timer = setTimeout(() => ensureExternalDataProvenance(path, httpClient), expiresIn + 1);
42
+ return () => clearTimeout(timer);
43
+ }, [path, httpClient, answer]);
44
+ return useMemo(() => (answer?.currentAsOf ? { system: answer.system, currentAsOf: answer.currentAsOf } : undefined), [answer]);
45
+ }
46
+ //# sourceMappingURL=useExternalDataFieldProvenance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useExternalDataFieldProvenance.js","sourceRoot":"","sources":["../../../../../../src/components/data-display/external-data-provenance/useExternalDataFieldProvenance.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAE7E,OAAO,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,4DAA4D,CAAC;AAChG,OAAO,EAAE,uBAAuB,EAAE,MAAM,wDAAwD,CAAC;AACjG,OAAO,EACL,+BAA+B,EAC/B,4BAA4B,EAC5B,0BAA0B,EAC1B,oCAAoC,EACpC,0BAA0B,EAC1B,+BAA+B,GAEhC,MAAM,qCAAqC,CAAC;AAE7C,MAAM,UAAU,8BAA8B,CAAC,MAK9C;IACC,MAAM,EAAE,YAAY,EAAE,oBAAoB,EAAE,GAAG,yBAAyB,EAAE,CAAC;IAC3E,MAAM,eAAe,GAAG,uBAAuB,EAAE,CAAC;IAClD,oHAAoH;IACpH,8FAA8F;IAC9F,MAAM,UAAU,GAAG,UAAU,CAAC,kBAAkB,CAAC,EAAE,UAAU,CAAC;IAE9D,MAAM,qBAAqB,GAAG,YAAY,CAAC,CAAC,CAAC,eAAe,EAAE,QAAQ,CAAC,sBAAsB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACxH,MAAM,WAAW,GAAG,qBAAqB,EAAE,oBAAoB,CAAC;IAChE,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO;WAC/B,CAAC,CAAC,WAAW;WACb,CAAC,CAAC,MAAM,CAAC,SAAS;WAClB,0BAA0B,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAEnE,MAAM,IAAI,GAAG,OAAO,CAClB,GAAG,EAAE,CAAC,CAAC,aAAa,IAAI,qBAAqB;QAC3C,CAAC,CAAC,+BAA+B,CAAC,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,oBAAoB,IAAI,EAAE,EAAE,CAAC;QAC9G,CAAC,CAAC,SAAS,CAAC,EACd,CAAC,aAAa,EAAE,qBAAqB,EAAE,oBAAoB,CAAC,CAC7D,CAAC;IAEF,MAAM,MAAM,GAAG,oBAAoB,CAAC,+BAA+B,EAAE,GAAG,EAAE,CAAC,0BAA0B,CAAC,IAAI,CAAC,CAAC,CAAC;IAE7G,oHAAoH;IACpH,iHAAiH;IACjH,mHAAmH;IACnH,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU;YAAE,OAAO,SAAS,CAAC;QAC3C,4BAA4B,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAC/C,MAAM,SAAS,GAAG,oCAAoC,CAAC,IAAI,CAAC,CAAC;QAC7D,IAAI,SAAS,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QAC9C,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,4BAA4B,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC;QAC9F,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;IAE/B,OAAO,OAAO,CACZ,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,EACpG,CAAC,MAAM,CAAC,CACT,CAAC;AACJ,CAAC","sourcesContent":["/**\n * The provenance of ONE displayed field (#1997): the answer the chrome shows beneath a value an external-data pipeline\n * wrote, or `undefined` for every other field.\n *\n * Cheap for the overwhelming majority of fields, which is what lets the display gate call it for every field it\n * renders: a resource that declares no pipeline, a nested path, an array item, or a field no mapping writes all return\n * before any request exists. Words are NOT composed here — the note component does that, and only when it renders — so\n * the gate takes on no i18n dependency for a field that never shows a cue.\n */\nimport { useContext, useEffect, useMemo, useSyncExternalStore } from 'react';\n\nimport { useResourceDisplayContext } from '../automatic-displayer.utils';\nimport { ApplicationContext } from '~wildo-frontend-lib/core/runtime/ApplicationContext.shared';\nimport { useResourceRegistrySafe } from '~wildo-frontend-lib/core/resources/useResourceRegistry';\nimport {\n buildExternalDataProvenancePath,\n ensureExternalDataProvenance,\n externalDataSyncedFieldSet,\n msUntilExternalDataProvenanceExpires,\n peekExternalDataProvenance,\n subscribeExternalDataProvenance,\n type DisplayFieldProvenance,\n} from './external-data-provenance.frontend';\n\nexport function useExternalDataFieldProvenance(params: {\n /** The field's full path as the gate resolved it. Only a TOP-LEVEL name can be pipeline-written. */\n fieldName: string | undefined;\n /** False on surfaces that never show the cue (SUMMARY: cards and FK previews), so they never cause a read. */\n enabled: boolean;\n}): DisplayFieldProvenance | undefined {\n const { resourceType, contextualParameters } = useResourceDisplayContext();\n const registryContext = useResourceRegistrySafe();\n // Read optionally: a display surface rendered outside an application (a test harness, a docs preview) has no client\n // and simply shows no cue — the throwing `useApplication` would take every such surface down.\n const httpClient = useContext(ApplicationContext)?.httpClient;\n\n const resourceConfiguration = resourceType ? registryContext?.registry.resourceConfigurations[resourceType] : undefined;\n const declaration = resourceConfiguration?.externalDataPipeline;\n const isSyncedField = params.enabled\n && !!declaration\n && !!params.fieldName\n && externalDataSyncedFieldSet(declaration).has(params.fieldName);\n\n const path = useMemo(\n () => (isSyncedField && resourceConfiguration\n ? buildExternalDataProvenancePath({ resourceConfiguration, contextualParameters: contextualParameters ?? {} })\n : undefined),\n [isSyncedField, resourceConfiguration, contextualParameters],\n );\n\n const answer = useSyncExternalStore(subscribeExternalDataProvenance, () => peekExternalDataProvenance(path));\n\n // Read now if nothing fresh is cached, and again when the answer shown expires — a page left open across a pipeline\n // pass must not keep its first \"as of\". The store dedupes, so every synced field of a record scheduling the same\n // re-read still sends one request. `answer` is a dependency so the timer is re-armed each time a new answer lands.\n useEffect(() => {\n if (!path || !httpClient) return undefined;\n ensureExternalDataProvenance(path, httpClient);\n const expiresIn = msUntilExternalDataProvenanceExpires(path);\n if (expiresIn === undefined) return undefined;\n const timer = setTimeout(() => ensureExternalDataProvenance(path, httpClient), expiresIn + 1);\n return () => clearTimeout(timer);\n }, [path, httpClient, answer]);\n\n return useMemo(\n () => (answer?.currentAsOf ? { system: answer.system, currentAsOf: answer.currentAsOf } : undefined),\n [answer],\n );\n}\n"]}
@@ -13,18 +13,31 @@ export interface ResourceEmptyStateWrapperProps extends ComponentPresetProps {
13
13
  /** Variant: 'default' for list/table, 'compact' for inline contexts */
14
14
  variant?: 'default' | 'compact';
15
15
  }
16
+ /**
17
+ * Whether the empty state will VISIBLY offer its primary action — the one decision a collection host needs
18
+ * to avoid offering the same action twice.
19
+ *
20
+ * An empty collection used to show two create buttons at once: the toolbar's trailing "Add task" and the
21
+ * empty state's own call to action, often under a DIFFERENT label ("Add draft" above, "Add note" below —
22
+ * measured on Wonder Todos' drafts). One action, one place. The empty state keeps it — the moment a collection
23
+ * is empty is the moment the first item is created, and a resource opts out with `emptyState.primaryAction:
24
+ * false` — so the host drops its copy.
25
+ *
26
+ * The answer is "no" whenever the surface policy hides or collapses the empty state, so a host that asks
27
+ * this never removes its own button in favour of one nobody can see. Exported beside the component, and
28
+ * read by the component itself, so the two can never disagree about which of them renders the action.
29
+ */
30
+ export declare function useResourceEmptyStateOffersPrimaryAction(config: ResourceUIBehavior_EmptyState | undefined, hasCreateOperation: boolean): boolean;
16
31
  /**
17
32
  * ResourceEmptyState — bridges resource config + i18n to the generic EmptyState preset.
18
33
  *
19
- * Resolves labels from i18n with the following priority:
20
- * 1. Resource-specific: `resources.{resourceType}.emptyState.title`
21
- * 2. Generic fallback: `tComponent(RESOURCES_LAYOUTS_LIST, 'noItems')`
22
- * 3. Hardcoded fallback: "No items found"
34
+ * Title: `resources.{resourceType}.emptyState.title`, else the generic `RESOURCES_LAYOUTS_LIST.noItems`.
35
+ * Description: `resources.{resourceType}.emptyState.description`, rendered only when it exists — it is planned
36
+ * only for a resource whose specification authors `frontend.emptyState.purpose`.
23
37
  *
24
- * Primary action:
25
- * - If config.primaryAction === false → no button
26
- * - If config.primaryAction is a string → use that operation ref (label from i18n)
27
- * - If config.primaryAction is undefined → auto-detect CREATE from hasCreateOperation
38
+ * Primary action (the collection's CREATE, named by that operation's title):
39
+ * - `config.primaryAction === false` → no button
40
+ * - otherwise → a button exactly when the caller can create (`hasCreateOperation`)
28
41
  */
29
42
  export declare function ResourceEmptyState({ resourceType, config, hasCreateOperation, onCreateAction, variant, preset, }: ResourceEmptyStateWrapperProps): React.JSX.Element | null;
30
43
  //# sourceMappingURL=resource-empty-state.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"resource-empty-state.d.ts","sourceRoot":"","sources":["../../../../../src/components/feedback/resource-empty-state.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAkB,MAAM,OAAO,CAAC;AAIvC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kFAAkF,CAAC;AAG7H,OAAO,EACL,KAAK,6BAA6B,EAEnC,MAAM,+DAA+D,CAAC;AAcvE,MAAM,WAAW,8BAA+B,SAAQ,oBAAoB;IAC1E,+CAA+C;IAC/C,YAAY,EAAE,MAAM,CAAC;IACrB,+DAA+D;IAC/D,MAAM,CAAC,EAAE,6BAA6B,CAAC;IACvC,kEAAkE;IAClE,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,gEAAgE;IAChE,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,uEAAuE;IACvE,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;CACjC;AAWD;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,YAAY,EACZ,MAAM,EACN,kBAA0B,EAC1B,cAAc,EACd,OAAmB,EACnB,MAAgC,GACjC,EAAE,8BAA8B,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,CA+F3D"}
1
+ {"version":3,"file":"resource-empty-state.d.ts","sourceRoot":"","sources":["../../../../../src/components/feedback/resource-empty-state.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAkB,MAAM,OAAO,CAAC;AAKvC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kFAAkF,CAAC;AAG7H,OAAO,EACL,KAAK,6BAA6B,EAEnC,MAAM,+DAA+D,CAAC;AAcvE,MAAM,WAAW,8BAA+B,SAAQ,oBAAoB;IAC1E,+CAA+C;IAC/C,YAAY,EAAE,MAAM,CAAC;IACrB,+DAA+D;IAC/D,MAAM,CAAC,EAAE,6BAA6B,CAAC;IACvC,kEAAkE;IAClE,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,gEAAgE;IAChE,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,uEAAuE;IACvE,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;CACjC;AAMD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,wCAAwC,CACtD,MAAM,EAAE,6BAA6B,GAAG,SAAS,EACjD,kBAAkB,EAAE,OAAO,GAC1B,OAAO,CAIT;AAwBD;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,YAAY,EACZ,MAAM,EACN,kBAA0B,EAC1B,cAAc,EACd,OAAmB,EACnB,MAAgC,GACjC,EAAE,8BAA8B,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,CA8F3D"}