@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
@@ -66,6 +66,26 @@ export declare function parseCssColorToRgb(value: string): RgbColor | null;
66
66
  * {@link parseCssColorToRgb} returns `null`, so the common notations never pay for a layout read.
67
67
  */
68
68
  export declare function resolveCssColorViaDom(value: string): RgbColor | null;
69
+ /**
70
+ * The browser's COMPUTED form of a CSS colour, as a string — `var()` references resolved against the
71
+ * document's custom properties and `color-mix()` evaluated — or `null` for a value the browser rejects.
72
+ *
73
+ * {@link resolveCssColorViaDom} narrows this to straight sRGB channels, which drops anything the browser
74
+ * serialises in another space: a computed `oklch(...)`, an `oklab(...)` from `color-mix(in oklab, …)`,
75
+ * a `color(srgb …)`. A caller that can read those spaces (the optional 3D frame's token resolver, which
76
+ * parses them with `culori`) takes the string instead, so there is one DOM probe rather than two.
77
+ *
78
+ * Browser-only by construction, like the function above: it reads a computed style, against whatever
79
+ * custom properties the document holds at the moment of the call.
80
+ *
81
+ * A `var()` naming a custom property the document does not define is accepted when it is SET (a `var()` is
82
+ * only checked at computed-value time) and then makes `color` fall back to the INHERITED colour — so a naive
83
+ * read would answer the parent's text colour for a reference that resolves to nothing. The probe is therefore
84
+ * read under two different parent colours: a value that resolves reads the same under both, a value that
85
+ * inherited does not, and the second answers `null`. The same holds for `currentcolor`, which names no colour
86
+ * of its own.
87
+ */
88
+ export declare function readComputedCssColorViaDom(value: string): string | null;
69
89
  /**
70
90
  * Convert sRGB channels to the HSV model the picking surface is drawn in.
71
91
  *
@@ -1 +1 @@
1
- {"version":3,"file":"color-conversion.utils.d.ts","sourceRoot":"","sources":["../../../../../src/core/ui/color-conversion.utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;;;;;;;;GAWG;AACH,oBAAY,aAAa;IACvB,iGAAiG;IACjG,GAAG,QAAQ;IACX,wEAAwE;IACxE,GAAG,QAAQ;IACX,2FAA2F;IAC3F,GAAG,QAAQ;CACZ;AAED,0CAA0C;AAC1C,MAAM,WAAW,QAAQ;IACvB,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;CACV;AAED;;;;;;GAMG;AACH,MAAM,WAAW,QAAQ;IACvB,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;CACV;AAWD;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAyCjE;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAiBpE;AAED;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,QAAQ,GAAG,QAAQ,CAoBxD;AAED,oEAAoE;AACpE,wBAAgB,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,QAAQ,GAAG,QAAQ,CAsBxD;AAED,+CAA+C;AAC/C,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,QAAQ,CAsBlE;AAED,oDAAoD;AACpD,wBAAgB,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,QAAQ,GAAG,MAAM,CAItD;AAED,0DAA0D;AAC1D,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,GAAG,MAAM,CA2BlF;AAED,oFAAoF;AACpF,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,GAAG,MAAM,CAElF;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,QAAQ,GAAG,MAAM,CAM/D"}
1
+ {"version":3,"file":"color-conversion.utils.d.ts","sourceRoot":"","sources":["../../../../../src/core/ui/color-conversion.utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;;;;;;;;GAWG;AACH,oBAAY,aAAa;IACvB,iGAAiG;IACjG,GAAG,QAAQ;IACX,wEAAwE;IACxE,GAAG,QAAQ;IACX,2FAA2F;IAC3F,GAAG,QAAQ;CACZ;AAED,0CAA0C;AAC1C,MAAM,WAAW,QAAQ;IACvB,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;CACV;AAED;;;;;;GAMG;AACH,MAAM,WAAW,QAAQ;IACvB,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;CACV;AAWD;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAyCjE;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAGpE;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAyBvE;AAED;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,QAAQ,GAAG,QAAQ,CAoBxD;AAED,oEAAoE;AACpE,wBAAgB,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,QAAQ,GAAG,QAAQ,CAsBxD;AAED,+CAA+C;AAC/C,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,QAAQ,CAsBlE;AAED,oDAAoD;AACpD,wBAAgB,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,QAAQ,GAAG,MAAM,CAItD;AAED,0DAA0D;AAC1D,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,GAAG,MAAM,CA2BlF;AAED,oFAAoF;AACpF,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,GAAG,MAAM,CAElF;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,QAAQ,GAAG,MAAM,CAM/D"}
@@ -95,6 +95,29 @@ export function parseCssColorToRgb(value) {
95
95
  * {@link parseCssColorToRgb} returns `null`, so the common notations never pay for a layout read.
96
96
  */
97
97
  export function resolveCssColorViaDom(value) {
98
+ const computed = readComputedCssColorViaDom(value);
99
+ return computed === null ? null : parseCssColorToRgb(computed);
100
+ }
101
+ /**
102
+ * The browser's COMPUTED form of a CSS colour, as a string — `var()` references resolved against the
103
+ * document's custom properties and `color-mix()` evaluated — or `null` for a value the browser rejects.
104
+ *
105
+ * {@link resolveCssColorViaDom} narrows this to straight sRGB channels, which drops anything the browser
106
+ * serialises in another space: a computed `oklch(...)`, an `oklab(...)` from `color-mix(in oklab, …)`,
107
+ * a `color(srgb …)`. A caller that can read those spaces (the optional 3D frame's token resolver, which
108
+ * parses them with `culori`) takes the string instead, so there is one DOM probe rather than two.
109
+ *
110
+ * Browser-only by construction, like the function above: it reads a computed style, against whatever
111
+ * custom properties the document holds at the moment of the call.
112
+ *
113
+ * A `var()` naming a custom property the document does not define is accepted when it is SET (a `var()` is
114
+ * only checked at computed-value time) and then makes `color` fall back to the INHERITED colour — so a naive
115
+ * read would answer the parent's text colour for a reference that resolves to nothing. The probe is therefore
116
+ * read under two different parent colours: a value that resolves reads the same under both, a value that
117
+ * inherited does not, and the second answers `null`. The same holds for `currentcolor`, which names no colour
118
+ * of its own.
119
+ */
120
+ export function readComputedCssColorViaDom(value) {
98
121
  const trimmed = value.trim();
99
122
  if (trimmed.length === 0)
100
123
  return null;
@@ -105,11 +128,22 @@ export function resolveCssColorViaDom(value) {
105
128
  probe.style.color = trimmed;
106
129
  if (probe.style.color === '')
107
130
  return null;
108
- probe.style.display = 'none';
109
- document.body.appendChild(probe);
110
- const computed = window.getComputedStyle(probe).color;
111
- document.body.removeChild(probe);
112
- return parseCssColorToRgb(computed);
131
+ const parent = document.createElement('span');
132
+ parent.style.display = 'none';
133
+ parent.appendChild(probe);
134
+ document.body.appendChild(parent);
135
+ try {
136
+ parent.style.color = 'rgb(1, 2, 3)';
137
+ const underFirst = window.getComputedStyle(probe).color;
138
+ parent.style.color = 'rgb(4, 5, 6)';
139
+ const underSecond = window.getComputedStyle(probe).color;
140
+ if (underFirst !== underSecond)
141
+ return null;
142
+ return underFirst || null;
143
+ }
144
+ finally {
145
+ document.body.removeChild(parent);
146
+ }
113
147
  }
114
148
  /**
115
149
  * Convert sRGB channels to the HSV model the picking surface is drawn in.
@@ -1 +1 @@
1
- {"version":3,"file":"color-conversion.utils.js","sourceRoot":"","sources":["../../../../../src/core/ui/color-conversion.utils.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Color conversion utilities for the framework's color controls.\n *\n * These exist because the browser's own colour surfaces (`<input type=\"color\">`, the OS colour\n * dialog) cannot participate in the design system — they carry platform appearance no theme,\n * recipe or surface policy can reach. The framework therefore renders its own picking surface,\n * and a picking surface needs the colour maths the native element was hiding.\n *\n * Everything here except {@link resolveCssColorViaDom} is pure and side-effect free.\n */\n\n/**\n * The CSS notation a control emits when the USER PICKS a colour from a picking surface.\n *\n * This is a closed vocabulary rather than a literal union so each member can carry its meaning,\n * and so schemas, props and comparisons all derive from one runtime source.\n *\n * NOTE the deliberate absence of alpha-bearing members (`rgba`/`hsla`). The framework's colour\n * field (`ZodTypeForColors`) accepts those notations as authored TEXT, but its hex branch only\n * admits 3- and 6-digit hex — so an 8-digit (alpha) hex would be REJECTED by the very schema the\n * control is bound to. A picking surface that could emit alpha would therefore be able to produce\n * schema-invalid values under the default notation. Adding alpha means widening the schema first.\n */\nexport enum ColorNotation {\n /** `#rrggbb` — the default, and the only notation the field's hex branch round-trips exactly. */\n HEX = 'hex',\n /** `rgb(r, g, b)` — channel-oriented, for authors who reason in RGB. */\n RGB = 'rgb',\n /** `hsl(h, s%, l%)` — the notation whose components a designer can read off the picker. */\n HSL = 'hsl',\n}\n\n/** Straight sRGB channels, each 0–255. */\nexport interface RgbColor {\n r: number\n g: number\n b: number\n}\n\n/**\n * Hue 0–360, saturation 0–100, value (brightness) 0–100.\n *\n * HSV — not HSL — is the picking-surface model: its saturation/value plane maps to the familiar\n * rectangle where left→right adds colour and top→bottom removes light, which is what every\n * two-dimensional colour area in the industry draws.\n */\nexport interface HsvColor {\n h: number\n s: number\n v: number\n}\n\nconst HEX_SIX = /^#([0-9a-f]{6})$/i\nconst HEX_THREE = /^#([0-9a-f]{3})$/i\nconst RGB_FUNCTION = /^rgba?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*(?:,\\s*[\\d.]+\\s*)?\\)$/i\nconst HSL_FUNCTION = /^hsla?\\(\\s*(\\d{1,3}(?:\\.\\d+)?)\\s*,\\s*(\\d{1,3}(?:\\.\\d+)?)%\\s*,\\s*(\\d{1,3}(?:\\.\\d+)?)%\\s*(?:,\\s*[\\d.]+\\s*)?\\)$/i\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value))\n}\n\n/**\n * Parse a CSS colour string into RGB channels, WITHOUT touching the DOM.\n *\n * Handles the notations the framework's colour schema defines analytically: 3- and 6-digit hex,\n * `rgb()`/`rgba()`, `hsl()`/`hsla()`. Alpha is parsed-and-discarded rather than rejected, so an\n * authored translucent value still positions the picker instead of resetting it.\n *\n * Returns `null` for anything it cannot read — including CSS named colours, which need the DOM.\n * See {@link resolveCssColorViaDom} for that half.\n */\nexport function parseCssColorToRgb(value: string): RgbColor | null {\n const trimmed = value.trim()\n if (trimmed.length === 0) return null\n\n const sixDigit = HEX_SIX.exec(trimmed)\n if (sixDigit) {\n const hex = sixDigit[1]\n return {\n r: parseInt(hex.slice(0, 2), 16),\n g: parseInt(hex.slice(2, 4), 16),\n b: parseInt(hex.slice(4, 6), 16),\n }\n }\n\n const threeDigit = HEX_THREE.exec(trimmed)\n if (threeDigit) {\n const [r, g, b] = threeDigit[1].split('')\n return {\n r: parseInt(`${r}${r}`, 16),\n g: parseInt(`${g}${g}`, 16),\n b: parseInt(`${b}${b}`, 16),\n }\n }\n\n const rgbMatch = RGB_FUNCTION.exec(trimmed)\n if (rgbMatch) {\n const channels = [rgbMatch[1], rgbMatch[2], rgbMatch[3]].map((channel) => parseInt(channel, 10))\n if (channels.some((channel) => channel > 255)) return null\n return { r: channels[0], g: channels[1], b: channels[2] }\n }\n\n const hslMatch = HSL_FUNCTION.exec(trimmed)\n if (hslMatch) {\n const h = parseFloat(hslMatch[1])\n const s = parseFloat(hslMatch[2])\n const l = parseFloat(hslMatch[3])\n if (h > 360 || s > 100 || l > 100) return null\n return hslToRgb(h, s, l)\n }\n\n return null\n}\n\n/**\n * Resolve ANY CSS colour the browser understands — notably the named colours (`rebeccapurple`,\n * `tomato`) the framework's schema accepts but no regex should enumerate — by asking the browser\n * to compute it.\n *\n * Browser-only by construction: it reads a computed style. Call it as a FALLBACK after\n * {@link parseCssColorToRgb} returns `null`, so the common notations never pay for a layout read.\n */\nexport function resolveCssColorViaDom(value: string): RgbColor | null {\n const trimmed = value.trim()\n if (trimmed.length === 0) return null\n\n const probe = document.createElement('span')\n // A rejected value leaves the property untouched, which is how an invalid colour is detected\n // without maintaining a list of what the browser considers valid.\n probe.style.color = ''\n probe.style.color = trimmed\n if (probe.style.color === '') return null\n\n probe.style.display = 'none'\n document.body.appendChild(probe)\n const computed = window.getComputedStyle(probe).color\n document.body.removeChild(probe)\n\n return parseCssColorToRgb(computed)\n}\n\n/**\n * Convert sRGB channels to the HSV model the picking surface is drawn in.\n *\n * Components are returned UNROUNDED on purpose. Rounding here looks harmless — a picker thumb\n * cannot be placed to a hundredth of a percent — but it makes `hsvToRgb(rgbToHsv(x)) !== x`, so\n * every trip through the surface shifts an authored colour by a unit per channel. Rounding is a\n * PRESENTATION concern: round at the point a component is displayed or announced, not here.\n */\nexport function rgbToHsv({ r, g, b }: RgbColor): HsvColor {\n const rn = r / 255\n const gn = g / 255\n const bn = b / 255\n const max = Math.max(rn, gn, bn)\n const min = Math.min(rn, gn, bn)\n const delta = max - min\n\n let h = 0\n if (delta !== 0) {\n if (max === rn) h = ((gn - bn) / delta + (gn < bn ? 6 : 0)) * 60\n else if (max === gn) h = ((bn - rn) / delta + 2) * 60\n else h = ((rn - gn) / delta + 4) * 60\n }\n\n return {\n h,\n s: max === 0 ? 0 : (delta / max) * 100,\n v: max * 100,\n }\n}\n\n/** Convert a point on the picking surface back to sRGB channels. */\nexport function hsvToRgb({ h, s, v }: HsvColor): RgbColor {\n const hn = ((h % 360) + 360) % 360\n const sn = clamp(s, 0, 100) / 100\n const vn = clamp(v, 0, 100) / 100\n\n const chroma = vn * sn\n const secondary = chroma * (1 - Math.abs(((hn / 60) % 2) - 1))\n const offset = vn - chroma\n\n let rgb: [number, number, number]\n if (hn < 60) rgb = [chroma, secondary, 0]\n else if (hn < 120) rgb = [secondary, chroma, 0]\n else if (hn < 180) rgb = [0, chroma, secondary]\n else if (hn < 240) rgb = [0, secondary, chroma]\n else if (hn < 300) rgb = [secondary, 0, chroma]\n else rgb = [chroma, 0, secondary]\n\n return {\n r: Math.round((rgb[0] + offset) * 255),\n g: Math.round((rgb[1] + offset) * 255),\n b: Math.round((rgb[2] + offset) * 255),\n }\n}\n\n/** Convert HSL components to sRGB channels. */\nexport function hslToRgb(h: number, s: number, l: number): RgbColor {\n const hn = ((h % 360) + 360) % 360\n const sn = clamp(s, 0, 100) / 100\n const ln = clamp(l, 0, 100) / 100\n\n const chroma = (1 - Math.abs(2 * ln - 1)) * sn\n const secondary = chroma * (1 - Math.abs(((hn / 60) % 2) - 1))\n const offset = ln - chroma / 2\n\n let rgb: [number, number, number]\n if (hn < 60) rgb = [chroma, secondary, 0]\n else if (hn < 120) rgb = [secondary, chroma, 0]\n else if (hn < 180) rgb = [0, chroma, secondary]\n else if (hn < 240) rgb = [0, secondary, chroma]\n else if (hn < 300) rgb = [secondary, 0, chroma]\n else rgb = [chroma, 0, secondary]\n\n return {\n r: Math.round((rgb[0] + offset) * 255),\n g: Math.round((rgb[1] + offset) * 255),\n b: Math.round((rgb[2] + offset) * 255),\n }\n}\n\n/** Render sRGB channels as `#rrggbb`, lowercase. */\nexport function rgbToHex({ r, g, b }: RgbColor): string {\n const channel = (component: number): string =>\n clamp(Math.round(component), 0, 255).toString(16).padStart(2, '0')\n return `#${channel(r)}${channel(g)}${channel(b)}`\n}\n\n/** Render sRGB channels in the requested CSS notation. */\nexport function formatRgbAsCssColor(rgb: RgbColor, notation: ColorNotation): string {\n if (notation === ColorNotation.RGB) {\n return `rgb(${Math.round(rgb.r)}, ${Math.round(rgb.g)}, ${Math.round(rgb.b)})`\n }\n\n if (notation === ColorNotation.HSL) {\n const rn = rgb.r / 255\n const gn = rgb.g / 255\n const bn = rgb.b / 255\n const max = Math.max(rn, gn, bn)\n const min = Math.min(rn, gn, bn)\n const delta = max - min\n const l = (max + min) / 2\n\n let h = 0\n let s = 0\n if (delta !== 0) {\n s = l > 0.5 ? delta / (2 - max - min) : delta / (max + min)\n if (max === rn) h = ((gn - bn) / delta + (gn < bn ? 6 : 0)) * 60\n else if (max === gn) h = ((bn - rn) / delta + 2) * 60\n else h = ((rn - gn) / delta + 4) * 60\n }\n\n return `hsl(${Math.round(h)}, ${Math.round(s * 100)}%, ${Math.round(l * 100)}%)`\n }\n\n return rgbToHex(rgb)\n}\n\n/** Render a point on the picking surface directly in the requested CSS notation. */\nexport function formatHsvAsCssColor(hsv: HsvColor, notation: ColorNotation): string {\n return formatRgbAsCssColor(hsvToRgb(hsv), notation)\n}\n\n/**\n * Relative luminance per WCAG 2.x, used to decide whether chrome drawn ON a colour (the picking\n * surface thumb, a swatch's selected indicator) should be dark or light. A fixed white indicator\n * disappears against pale yellows; this is what keeps it visible across the whole gamut.\n */\nexport function relativeLuminance({ r, g, b }: RgbColor): number {\n const channel = (component: number): number => {\n const normalized = clamp(component, 0, 255) / 255\n return normalized <= 0.03928 ? normalized / 12.92 : Math.pow((normalized + 0.055) / 1.055, 2.4)\n }\n return 0.2126 * channel(r) + 0.7152 * channel(g) + 0.0722 * channel(b)\n}\n"]}
1
+ {"version":3,"file":"color-conversion.utils.js","sourceRoot":"","sources":["../../../../../src/core/ui/color-conversion.utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;;;;;;;;GAWG;AACH,MAAM,CAAN,IAAY,aAOX;AAPD,WAAY,aAAa;IACvB,iGAAiG;IACjG,4BAAW,CAAA;IACX,wEAAwE;IACxE,4BAAW,CAAA;IACX,2FAA2F;IAC3F,4BAAW,CAAA;AACb,CAAC,EAPW,aAAa,KAAb,aAAa,QAOxB;AAsBD,MAAM,OAAO,GAAG,mBAAmB,CAAA;AACnC,MAAM,SAAS,GAAG,mBAAmB,CAAA;AACrC,MAAM,YAAY,GAAG,+EAA+E,CAAA;AACpG,MAAM,YAAY,GAAG,+GAA+G,CAAA;AAEpI,SAAS,KAAK,CAAC,KAAa,EAAE,GAAW,EAAE,GAAW;IACpD,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAA;AAC5C,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAA;IAC5B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAA;IAErC,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACtC,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;QACvB,OAAO;YACL,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;YAChC,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;YAChC,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;SACjC,CAAA;IACH,CAAC;IAED,MAAM,UAAU,GAAG,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAC1C,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;QACzC,OAAO;YACL,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC;YAC3B,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC;YAC3B,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC;SAC5B,CAAA;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAC3C,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,QAAQ,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAA;QAChG,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,GAAG,GAAG,CAAC;YAAE,OAAO,IAAI,CAAA;QAC1D,OAAO,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAA;IAC3D,CAAC;IAED,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAC3C,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;QACjC,MAAM,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;QACjC,MAAM,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;QACjC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG;YAAE,OAAO,IAAI,CAAA;QAC9C,OAAO,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IAC1B,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAa;IACjD,MAAM,QAAQ,GAAG,0BAA0B,CAAC,KAAK,CAAC,CAAA;IAClD,OAAO,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAA;AAChE,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,0BAA0B,CAAC,KAAa;IACtD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAA;IAC5B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAA;IAErC,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAA;IAC5C,6FAA6F;IAC7F,kEAAkE;IAClE,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAA;IACtB,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,OAAO,CAAA;IAC3B,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,KAAK,EAAE;QAAE,OAAO,IAAI,CAAA;IAEzC,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAA;IAC7C,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAA;IAC7B,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;IACzB,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAA;IACjC,IAAI,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,cAAc,CAAA;QACnC,MAAM,UAAU,GAAG,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,KAAK,CAAA;QACvD,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,cAAc,CAAA;QACnC,MAAM,WAAW,GAAG,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,KAAK,CAAA;QACxD,IAAI,UAAU,KAAK,WAAW;YAAE,OAAO,IAAI,CAAA;QAC3C,OAAO,UAAU,IAAI,IAAI,CAAA;IAC3B,CAAC;YAAS,CAAC;QACT,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAA;IACnC,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAY;IAC5C,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,CAAA;IAClB,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,CAAA;IAClB,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,CAAA;IAClB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;IAChC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;IAChC,MAAM,KAAK,GAAG,GAAG,GAAG,GAAG,CAAA;IAEvB,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;QAChB,IAAI,GAAG,KAAK,EAAE;YAAE,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAA;aAC3D,IAAI,GAAG,KAAK,EAAE;YAAE,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,GAAG,EAAE,CAAA;;YAChD,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,GAAG,EAAE,CAAA;IACvC,CAAC;IAED,OAAO;QACL,CAAC;QACD,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,GAAG;QACtC,CAAC,EAAE,GAAG,GAAG,GAAG;KACb,CAAA;AACH,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAY;IAC5C,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAA;IAClC,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,GAAG,CAAA;IACjC,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,GAAG,CAAA;IAEjC,MAAM,MAAM,GAAG,EAAE,GAAG,EAAE,CAAA;IACtB,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IAC9D,MAAM,MAAM,GAAG,EAAE,GAAG,MAAM,CAAA;IAE1B,IAAI,GAA6B,CAAA;IACjC,IAAI,EAAE,GAAG,EAAE;QAAE,GAAG,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,CAAA;SACpC,IAAI,EAAE,GAAG,GAAG;QAAE,GAAG,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC,CAAA;SAC1C,IAAI,EAAE,GAAG,GAAG;QAAE,GAAG,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,CAAA;SAC1C,IAAI,EAAE,GAAG,GAAG;QAAE,GAAG,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,CAAA;SAC1C,IAAI,EAAE,GAAG,GAAG;QAAE,GAAG,GAAG,CAAC,SAAS,EAAE,CAAC,EAAE,MAAM,CAAC,CAAA;;QAC1C,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,SAAS,CAAC,CAAA;IAEjC,OAAO;QACL,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,GAAG,CAAC;QACtC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,GAAG,CAAC;QACtC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,GAAG,CAAC;KACvC,CAAA;AACH,CAAC;AAED,+CAA+C;AAC/C,MAAM,UAAU,QAAQ,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS;IACtD,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAA;IAClC,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,GAAG,CAAA;IACjC,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,GAAG,CAAA;IAEjC,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAA;IAC9C,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IAC9D,MAAM,MAAM,GAAG,EAAE,GAAG,MAAM,GAAG,CAAC,CAAA;IAE9B,IAAI,GAA6B,CAAA;IACjC,IAAI,EAAE,GAAG,EAAE;QAAE,GAAG,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,CAAA;SACpC,IAAI,EAAE,GAAG,GAAG;QAAE,GAAG,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC,CAAA;SAC1C,IAAI,EAAE,GAAG,GAAG;QAAE,GAAG,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,CAAA;SAC1C,IAAI,EAAE,GAAG,GAAG;QAAE,GAAG,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,CAAA;SAC1C,IAAI,EAAE,GAAG,GAAG;QAAE,GAAG,GAAG,CAAC,SAAS,EAAE,CAAC,EAAE,MAAM,CAAC,CAAA;;QAC1C,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,SAAS,CAAC,CAAA;IAEjC,OAAO;QACL,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,GAAG,CAAC;QACtC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,GAAG,CAAC;QACtC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,GAAG,CAAC;KACvC,CAAA;AACH,CAAC;AAED,oDAAoD;AACpD,MAAM,UAAU,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAY;IAC5C,MAAM,OAAO,GAAG,CAAC,SAAiB,EAAU,EAAE,CAC5C,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IACpE,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,CAAA;AACnD,CAAC;AAED,0DAA0D;AAC1D,MAAM,UAAU,mBAAmB,CAAC,GAAa,EAAE,QAAuB;IACxE,IAAI,QAAQ,KAAK,aAAa,CAAC,GAAG,EAAE,CAAC;QACnC,OAAO,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAA;IAChF,CAAC;IAED,IAAI,QAAQ,KAAK,aAAa,CAAC,GAAG,EAAE,CAAC;QACnC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAA;QACtB,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAA;QACtB,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAA;QACtB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;QAChC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;QAChC,MAAM,KAAK,GAAG,GAAG,GAAG,GAAG,CAAA;QACvB,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAA;QAEzB,IAAI,CAAC,GAAG,CAAC,CAAA;QACT,IAAI,CAAC,GAAG,CAAC,CAAA;QACT,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;YAChB,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,CAAA;YAC3D,IAAI,GAAG,KAAK,EAAE;gBAAE,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAA;iBAC3D,IAAI,GAAG,KAAK,EAAE;gBAAE,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,GAAG,EAAE,CAAA;;gBAChD,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,GAAG,EAAE,CAAA;QACvC,CAAC;QAED,OAAO,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,CAAA;IAClF,CAAC;IAED,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAA;AACtB,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,mBAAmB,CAAC,GAAa,EAAE,QAAuB;IACxE,OAAO,mBAAmB,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAA;AACrD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAY;IACrD,MAAM,OAAO,GAAG,CAAC,SAAiB,EAAU,EAAE;QAC5C,MAAM,UAAU,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,GAAG,CAAA;QACjD,OAAO,UAAU,IAAI,OAAO,CAAC,CAAC,CAAC,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,UAAU,GAAG,KAAK,CAAC,GAAG,KAAK,EAAE,GAAG,CAAC,CAAA;IACjG,CAAC,CAAA;IACD,OAAO,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;AACxE,CAAC","sourcesContent":["/**\n * Color conversion utilities for the framework's color controls.\n *\n * These exist because the browser's own colour surfaces (`<input type=\"color\">`, the OS colour\n * dialog) cannot participate in the design system — they carry platform appearance no theme,\n * recipe or surface policy can reach. The framework therefore renders its own picking surface,\n * and a picking surface needs the colour maths the native element was hiding.\n *\n * Everything here except {@link resolveCssColorViaDom} is pure and side-effect free.\n */\n\n/**\n * The CSS notation a control emits when the USER PICKS a colour from a picking surface.\n *\n * This is a closed vocabulary rather than a literal union so each member can carry its meaning,\n * and so schemas, props and comparisons all derive from one runtime source.\n *\n * NOTE the deliberate absence of alpha-bearing members (`rgba`/`hsla`). The framework's colour\n * field (`ZodTypeForColors`) accepts those notations as authored TEXT, but its hex branch only\n * admits 3- and 6-digit hex — so an 8-digit (alpha) hex would be REJECTED by the very schema the\n * control is bound to. A picking surface that could emit alpha would therefore be able to produce\n * schema-invalid values under the default notation. Adding alpha means widening the schema first.\n */\nexport enum ColorNotation {\n /** `#rrggbb` — the default, and the only notation the field's hex branch round-trips exactly. */\n HEX = 'hex',\n /** `rgb(r, g, b)` — channel-oriented, for authors who reason in RGB. */\n RGB = 'rgb',\n /** `hsl(h, s%, l%)` — the notation whose components a designer can read off the picker. */\n HSL = 'hsl',\n}\n\n/** Straight sRGB channels, each 0–255. */\nexport interface RgbColor {\n r: number\n g: number\n b: number\n}\n\n/**\n * Hue 0–360, saturation 0–100, value (brightness) 0–100.\n *\n * HSV — not HSL — is the picking-surface model: its saturation/value plane maps to the familiar\n * rectangle where left→right adds colour and top→bottom removes light, which is what every\n * two-dimensional colour area in the industry draws.\n */\nexport interface HsvColor {\n h: number\n s: number\n v: number\n}\n\nconst HEX_SIX = /^#([0-9a-f]{6})$/i\nconst HEX_THREE = /^#([0-9a-f]{3})$/i\nconst RGB_FUNCTION = /^rgba?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*(?:,\\s*[\\d.]+\\s*)?\\)$/i\nconst HSL_FUNCTION = /^hsla?\\(\\s*(\\d{1,3}(?:\\.\\d+)?)\\s*,\\s*(\\d{1,3}(?:\\.\\d+)?)%\\s*,\\s*(\\d{1,3}(?:\\.\\d+)?)%\\s*(?:,\\s*[\\d.]+\\s*)?\\)$/i\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value))\n}\n\n/**\n * Parse a CSS colour string into RGB channels, WITHOUT touching the DOM.\n *\n * Handles the notations the framework's colour schema defines analytically: 3- and 6-digit hex,\n * `rgb()`/`rgba()`, `hsl()`/`hsla()`. Alpha is parsed-and-discarded rather than rejected, so an\n * authored translucent value still positions the picker instead of resetting it.\n *\n * Returns `null` for anything it cannot read — including CSS named colours, which need the DOM.\n * See {@link resolveCssColorViaDom} for that half.\n */\nexport function parseCssColorToRgb(value: string): RgbColor | null {\n const trimmed = value.trim()\n if (trimmed.length === 0) return null\n\n const sixDigit = HEX_SIX.exec(trimmed)\n if (sixDigit) {\n const hex = sixDigit[1]\n return {\n r: parseInt(hex.slice(0, 2), 16),\n g: parseInt(hex.slice(2, 4), 16),\n b: parseInt(hex.slice(4, 6), 16),\n }\n }\n\n const threeDigit = HEX_THREE.exec(trimmed)\n if (threeDigit) {\n const [r, g, b] = threeDigit[1].split('')\n return {\n r: parseInt(`${r}${r}`, 16),\n g: parseInt(`${g}${g}`, 16),\n b: parseInt(`${b}${b}`, 16),\n }\n }\n\n const rgbMatch = RGB_FUNCTION.exec(trimmed)\n if (rgbMatch) {\n const channels = [rgbMatch[1], rgbMatch[2], rgbMatch[3]].map((channel) => parseInt(channel, 10))\n if (channels.some((channel) => channel > 255)) return null\n return { r: channels[0], g: channels[1], b: channels[2] }\n }\n\n const hslMatch = HSL_FUNCTION.exec(trimmed)\n if (hslMatch) {\n const h = parseFloat(hslMatch[1])\n const s = parseFloat(hslMatch[2])\n const l = parseFloat(hslMatch[3])\n if (h > 360 || s > 100 || l > 100) return null\n return hslToRgb(h, s, l)\n }\n\n return null\n}\n\n/**\n * Resolve ANY CSS colour the browser understands — notably the named colours (`rebeccapurple`,\n * `tomato`) the framework's schema accepts but no regex should enumerate — by asking the browser\n * to compute it.\n *\n * Browser-only by construction: it reads a computed style. Call it as a FALLBACK after\n * {@link parseCssColorToRgb} returns `null`, so the common notations never pay for a layout read.\n */\nexport function resolveCssColorViaDom(value: string): RgbColor | null {\n const computed = readComputedCssColorViaDom(value)\n return computed === null ? null : parseCssColorToRgb(computed)\n}\n\n/**\n * The browser's COMPUTED form of a CSS colour, as a string — `var()` references resolved against the\n * document's custom properties and `color-mix()` evaluated — or `null` for a value the browser rejects.\n *\n * {@link resolveCssColorViaDom} narrows this to straight sRGB channels, which drops anything the browser\n * serialises in another space: a computed `oklch(...)`, an `oklab(...)` from `color-mix(in oklab, …)`,\n * a `color(srgb …)`. A caller that can read those spaces (the optional 3D frame's token resolver, which\n * parses them with `culori`) takes the string instead, so there is one DOM probe rather than two.\n *\n * Browser-only by construction, like the function above: it reads a computed style, against whatever\n * custom properties the document holds at the moment of the call.\n *\n * A `var()` naming a custom property the document does not define is accepted when it is SET (a `var()` is\n * only checked at computed-value time) and then makes `color` fall back to the INHERITED colour — so a naive\n * read would answer the parent's text colour for a reference that resolves to nothing. The probe is therefore\n * read under two different parent colours: a value that resolves reads the same under both, a value that\n * inherited does not, and the second answers `null`. The same holds for `currentcolor`, which names no colour\n * of its own.\n */\nexport function readComputedCssColorViaDom(value: string): string | null {\n const trimmed = value.trim()\n if (trimmed.length === 0) return null\n\n const probe = document.createElement('span')\n // A rejected value leaves the property untouched, which is how an invalid colour is detected\n // without maintaining a list of what the browser considers valid.\n probe.style.color = ''\n probe.style.color = trimmed\n if (probe.style.color === '') return null\n\n const parent = document.createElement('span')\n parent.style.display = 'none'\n parent.appendChild(probe)\n document.body.appendChild(parent)\n try {\n parent.style.color = 'rgb(1, 2, 3)'\n const underFirst = window.getComputedStyle(probe).color\n parent.style.color = 'rgb(4, 5, 6)'\n const underSecond = window.getComputedStyle(probe).color\n if (underFirst !== underSecond) return null\n return underFirst || null\n } finally {\n document.body.removeChild(parent)\n }\n}\n\n/**\n * Convert sRGB channels to the HSV model the picking surface is drawn in.\n *\n * Components are returned UNROUNDED on purpose. Rounding here looks harmless — a picker thumb\n * cannot be placed to a hundredth of a percent — but it makes `hsvToRgb(rgbToHsv(x)) !== x`, so\n * every trip through the surface shifts an authored colour by a unit per channel. Rounding is a\n * PRESENTATION concern: round at the point a component is displayed or announced, not here.\n */\nexport function rgbToHsv({ r, g, b }: RgbColor): HsvColor {\n const rn = r / 255\n const gn = g / 255\n const bn = b / 255\n const max = Math.max(rn, gn, bn)\n const min = Math.min(rn, gn, bn)\n const delta = max - min\n\n let h = 0\n if (delta !== 0) {\n if (max === rn) h = ((gn - bn) / delta + (gn < bn ? 6 : 0)) * 60\n else if (max === gn) h = ((bn - rn) / delta + 2) * 60\n else h = ((rn - gn) / delta + 4) * 60\n }\n\n return {\n h,\n s: max === 0 ? 0 : (delta / max) * 100,\n v: max * 100,\n }\n}\n\n/** Convert a point on the picking surface back to sRGB channels. */\nexport function hsvToRgb({ h, s, v }: HsvColor): RgbColor {\n const hn = ((h % 360) + 360) % 360\n const sn = clamp(s, 0, 100) / 100\n const vn = clamp(v, 0, 100) / 100\n\n const chroma = vn * sn\n const secondary = chroma * (1 - Math.abs(((hn / 60) % 2) - 1))\n const offset = vn - chroma\n\n let rgb: [number, number, number]\n if (hn < 60) rgb = [chroma, secondary, 0]\n else if (hn < 120) rgb = [secondary, chroma, 0]\n else if (hn < 180) rgb = [0, chroma, secondary]\n else if (hn < 240) rgb = [0, secondary, chroma]\n else if (hn < 300) rgb = [secondary, 0, chroma]\n else rgb = [chroma, 0, secondary]\n\n return {\n r: Math.round((rgb[0] + offset) * 255),\n g: Math.round((rgb[1] + offset) * 255),\n b: Math.round((rgb[2] + offset) * 255),\n }\n}\n\n/** Convert HSL components to sRGB channels. */\nexport function hslToRgb(h: number, s: number, l: number): RgbColor {\n const hn = ((h % 360) + 360) % 360\n const sn = clamp(s, 0, 100) / 100\n const ln = clamp(l, 0, 100) / 100\n\n const chroma = (1 - Math.abs(2 * ln - 1)) * sn\n const secondary = chroma * (1 - Math.abs(((hn / 60) % 2) - 1))\n const offset = ln - chroma / 2\n\n let rgb: [number, number, number]\n if (hn < 60) rgb = [chroma, secondary, 0]\n else if (hn < 120) rgb = [secondary, chroma, 0]\n else if (hn < 180) rgb = [0, chroma, secondary]\n else if (hn < 240) rgb = [0, secondary, chroma]\n else if (hn < 300) rgb = [secondary, 0, chroma]\n else rgb = [chroma, 0, secondary]\n\n return {\n r: Math.round((rgb[0] + offset) * 255),\n g: Math.round((rgb[1] + offset) * 255),\n b: Math.round((rgb[2] + offset) * 255),\n }\n}\n\n/** Render sRGB channels as `#rrggbb`, lowercase. */\nexport function rgbToHex({ r, g, b }: RgbColor): string {\n const channel = (component: number): string =>\n clamp(Math.round(component), 0, 255).toString(16).padStart(2, '0')\n return `#${channel(r)}${channel(g)}${channel(b)}`\n}\n\n/** Render sRGB channels in the requested CSS notation. */\nexport function formatRgbAsCssColor(rgb: RgbColor, notation: ColorNotation): string {\n if (notation === ColorNotation.RGB) {\n return `rgb(${Math.round(rgb.r)}, ${Math.round(rgb.g)}, ${Math.round(rgb.b)})`\n }\n\n if (notation === ColorNotation.HSL) {\n const rn = rgb.r / 255\n const gn = rgb.g / 255\n const bn = rgb.b / 255\n const max = Math.max(rn, gn, bn)\n const min = Math.min(rn, gn, bn)\n const delta = max - min\n const l = (max + min) / 2\n\n let h = 0\n let s = 0\n if (delta !== 0) {\n s = l > 0.5 ? delta / (2 - max - min) : delta / (max + min)\n if (max === rn) h = ((gn - bn) / delta + (gn < bn ? 6 : 0)) * 60\n else if (max === gn) h = ((bn - rn) / delta + 2) * 60\n else h = ((rn - gn) / delta + 4) * 60\n }\n\n return `hsl(${Math.round(h)}, ${Math.round(s * 100)}%, ${Math.round(l * 100)}%)`\n }\n\n return rgbToHex(rgb)\n}\n\n/** Render a point on the picking surface directly in the requested CSS notation. */\nexport function formatHsvAsCssColor(hsv: HsvColor, notation: ColorNotation): string {\n return formatRgbAsCssColor(hsvToRgb(hsv), notation)\n}\n\n/**\n * Relative luminance per WCAG 2.x, used to decide whether chrome drawn ON a colour (the picking\n * surface thumb, a swatch's selected indicator) should be dark or light. A fixed white indicator\n * disappears against pale yellows; this is what keeps it visible across the whole gamut.\n */\nexport function relativeLuminance({ r, g, b }: RgbColor): number {\n const channel = (component: number): number => {\n const normalized = clamp(component, 0, 255) / 255\n return normalized <= 0.03928 ? normalized / 12.92 : Math.pow((normalized + 0.055) / 1.055, 2.4)\n }\n return 0.2126 * channel(r) + 0.7152 * channel(g) + 0.0722 * channel(b)\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"default.theme.d.ts","sourceRoot":"","sources":["../../../../../../src/core/ui/themes/default.theme.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAstB/E,eAAO,MAAM,YAAY,EAAE,mBAqB1B,CAAC"}
1
+ {"version":3,"file":"default.theme.d.ts","sourceRoot":"","sources":["../../../../../../src/core/ui/themes/default.theme.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AA0uB/E,eAAO,MAAM,YAAY,EAAE,mBAqB1B,CAAC"}
@@ -189,8 +189,18 @@ const interactive = {
189
189
  * inset RING is `Card`'s reasoning for a selected card: "the ring is what still reads when
190
190
  * the card's own fill is close to" its surroundings, which is precisely a segment whose
191
191
  * fill is the hover fill.
192
+ *
193
+ * Both the fill and the ring are NEUTRAL — an ink wash of `foreground`, never `accent` and
194
+ * never `ring` (2026-09-25). `ring` is the FOCUS/brand colour, so a chosen toggle wore a
195
+ * primary outline that read as "focused" or "error-adjacent" rather than "on", on every pill
196
+ * and segment at once. And `accent` is the HOVER tint: in a theme whose accent sits one
197
+ * lightness step off the page (Wonder Todos: L 0.929 on 0.984) the chosen state barely
198
+ * separated from the background it sat on. A translucent `foreground` wash is darker than
199
+ * the hover tint in every theme by construction, tracks light and dark without a second
200
+ * token, and keeps `SelectableVariant.FILLED`'s promise that weight — not a brand colour —
201
+ * carries "you are here".
192
202
  */
193
- selected: "data-[state=on]:bg-accent data-[state=on]:text-accent-foreground data-[state=on]:font-semibold data-[state=on]:ring-1 data-[state=on]:ring-inset data-[state=on]:ring-ring",
203
+ selected: "data-[state=on]:bg-foreground/10 data-[state=on]:text-foreground data-[state=on]:font-semibold data-[state=on]:ring-1 data-[state=on]:ring-inset data-[state=on]:ring-foreground/25 dark:data-[state=on]:bg-foreground/15",
194
204
  disabled: interactiveDisabled,
195
205
  invalid: interactiveInvalid,
196
206
  },
@@ -226,8 +236,18 @@ const interactive = {
226
236
  * inset RING is `Card`'s reasoning for a selected card: "the ring is what still reads when
227
237
  * the card's own fill is close to" its surroundings, which is precisely a segment whose
228
238
  * fill is the hover fill.
239
+ *
240
+ * Both the fill and the ring are NEUTRAL — an ink wash of `foreground`, never `accent` and
241
+ * never `ring` (2026-09-25). `ring` is the FOCUS/brand colour, so a chosen toggle wore a
242
+ * primary outline that read as "focused" or "error-adjacent" rather than "on", on every pill
243
+ * and segment at once. And `accent` is the HOVER tint: in a theme whose accent sits one
244
+ * lightness step off the page (Wonder Todos: L 0.929 on 0.984) the chosen state barely
245
+ * separated from the background it sat on. A translucent `foreground` wash is darker than
246
+ * the hover tint in every theme by construction, tracks light and dark without a second
247
+ * token, and keeps `SelectableVariant.FILLED`'s promise that weight — not a brand colour —
248
+ * carries "you are here".
229
249
  */
230
- selected: "data-[state=on]:bg-accent data-[state=on]:text-accent-foreground data-[state=on]:font-semibold data-[state=on]:ring-1 data-[state=on]:ring-inset data-[state=on]:ring-ring",
250
+ selected: "data-[state=on]:bg-foreground/10 data-[state=on]:text-foreground data-[state=on]:font-semibold data-[state=on]:ring-1 data-[state=on]:ring-inset data-[state=on]:ring-foreground/25 dark:data-[state=on]:bg-foreground/15",
231
251
  highlighted: "focus:bg-accent focus:text-accent-foreground",
232
252
  open: "data-[state=open]:bg-accent data-[state=open]:text-accent-foreground",
233
253
  disabled: interactiveDisabled,
@@ -1 +1 @@
1
- {"version":3,"file":"default.theme.js","sourceRoot":"","sources":["../../../../../../src/core/ui/themes/default.theme.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ComponentStyleTheme } from '@wildo-ai/presets-components-models';\nimport {\n DividerVariant,\n InteractiveVariant,\n SurfaceVariant,\n FormControlVariant,\n IndicatorVariant,\n SelectableVariant,\n TypographyVariant,\n SKELETON_NEUTRAL_TINT,\n} from '@wildo-ai/presets-components-models';\nimport type { UIBehaviorRecipe } from '@wildo-ai/presets-components-models';\nimport { DEFAULT_CHART_STYLE_PRESET } from '../chart-style-defaults';\n\n// ============================================================\n// Helper\n// ============================================================\n\nfunction recipe(r: Partial<UIBehaviorRecipe> & { base: string }): UIBehaviorRecipe {\n return {\n base: r.base,\n states: r.states ?? {},\n sizes: r.sizes,\n motion: r.motion ?? {},\n gesture: r.gesture,\n policy: r.policy,\n };\n}\n\n// ============================================================\n// Motion constants — reference Level 1 tokens via CSS variables\n//\n// Each behavior targets SPECIFIC properties (no transition-all).\n// Durations and easings come from Level 1 --motion-* tokens.\n// All include motion-reduce for accessibility.\n// ============================================================\n//\n// MOTION PERSONALITY — Default (shadcn / Material-inspired SaaS)\n// Hover/focus : FAST (150ms) + DEFAULT → Material Standard curve.\n// Bidirectional state changes,\n// subtle but present.\n// Overlay enter: NORMAL (250ms) + ENTER → fade + zoom-95 + 2px slide.\n// Pure decelerate.\n// Overlay exit : FAST (150ms) + EXIT → quicker than enter.\n// Backdrop : NORMAL/FAST + ENTER/EXIT → matches overlays.\n// Gestures : NONE — neutral SaaS baseline. CSS-only motion is the\n// contract; theme can be swapped without removing\n// motion.dev wrappers from app code (which any theme\n// may activate via the recipe `gesture` slot).\n//\n// This theme is the reference baseline for the framework. All other\n// themes deviate FROM it intentionally — Glass adds gestures, Editorial\n// stretches durations, Terminal/Trading collapse them, Neo-Brutalist\n// strips easing, Cozy adds gentle springs.\n// ============================================================\n\nconst MOTION = {\n /** Interactive elements: bg, color, border, shadow, transform changes */\n interactive: \"transition-[background-color,color,border-color,box-shadow,transform] duration-[var(--motion-duration-fast)] ease-[var(--motion-easing-default)] motion-reduce:transition-none\",\n\n /** Form controls: border, shadow, color changes on focus/validation */\n formControl: \"transition-[color,border-color,box-shadow] duration-[var(--motion-duration-fast)] ease-[var(--motion-easing-default)] motion-reduce:transition-none\",\n\n /** Selectable items: bg, color, border on state change */\n selectable: \"transition-[background-color,color,border-color] duration-[var(--motion-duration-fast)] ease-[var(--motion-easing-default)] motion-reduce:transition-none\",\n\n /** Sidebar: width/height collapse */\n sidebarCollapse: \"transition-[width,height,padding] duration-[var(--motion-duration-normal)] ease-[var(--motion-easing-default)] motion-reduce:transition-none\",\n\n /** Enter animation for overlays/surfaces (fade + zoom) */\n enterFadeZoom: \"data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 data-[state=open]:duration-[var(--motion-duration-normal)] data-[state=open]:ease-[var(--motion-easing-enter)] motion-reduce:data-[state=open]:animate-none\",\n\n /** Exit animation for overlays/surfaces */\n exitFadeZoom: \"data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=closed]:duration-[var(--motion-duration-fast)] data-[state=closed]:ease-[var(--motion-easing-exit)] motion-reduce:data-[state=closed]:animate-none\",\n\n /** Enter for directional popovers (fade + zoom + slide per side) */\n enterDirectional: \"data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 data-[state=open]:duration-[var(--motion-duration-normal)] data-[state=open]:ease-[var(--motion-easing-enter)] data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 motion-reduce:data-[state=open]:animate-none\",\n\n /** Enter/exit for backdrop overlay (fade only).\n *\n * Uses explicit ENTER/EXIT easing tokens. Without\n * `ease-[...]`, browsers fall back to the CSS default `ease` curve,\n * silently inheriting a generic curve instead of the theme's ENTER\n * (decelerate) / EXIT (accelerate) personality. Backdrops fade only\n * so the perceptual difference is small, but consistency matters\n * for the \"every motion uses an explicit theme token\" rule. */\n backdropEnter: \"data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:duration-[var(--motion-duration-normal)] data-[state=open]:ease-[var(--motion-easing-enter)] motion-reduce:data-[state=open]:animate-none\",\n backdropExit: \"data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:duration-[var(--motion-duration-fast)] data-[state=closed]:ease-[var(--motion-easing-exit)] motion-reduce:data-[state=closed]:animate-none\",\n};\n\n// ============================================================\n// INTERACTIVE — Buttons, menu items, clickable surfaces\n// ============================================================\n\n// T5 radius ladder: interactive controls sit one clean step under cards —\n// control `rounded-lg` (8) · popover `rounded-lg` (RAISED) · card `rounded-xl` (12).\n// `md`/`icon` inherit the base recipe's `rounded-lg`; the explicit size overrides\n// (xs/sm/lg) mirror it so every size is of-a-piece.\nconst interactiveSizes: Record<string, string> = {\n xs: \"h-7 px-2.5 text-xs gap-1 rounded-lg has-[>svg]:px-2 pointer-coarse:min-h-9\",\n sm: \"h-8 px-3 gap-1.5 rounded-lg has-[>svg]:px-2.5 pointer-coarse:min-h-11\",\n md: \"h-9 px-4 py-2 has-[>svg]:px-3 pointer-coarse:min-h-11\",\n lg: \"h-10 px-6 rounded-lg has-[>svg]:px-4 pointer-coarse:min-h-11\",\n icon: \"size-9 pointer-coarse:min-h-11 pointer-coarse:min-w-11\",\n \"icon-sm\": \"size-7 pointer-coarse:min-h-9 pointer-coarse:min-w-9\",\n};\n\nconst interactiveDisabled: string = \"disabled:pointer-events-none disabled:opacity-[var(--opacity-disabled)] aria-disabled:cursor-not-allowed aria-disabled:opacity-[var(--opacity-disabled)]\";\nconst interactiveInvalid: string = \"aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\";\n\n// ============================================================\n// Focus-ring constants — single source of truth\n// for the keyboard-focus indicators used by INTERACTIVE, FORM_CONTROL,\n// SELECTABLE, and INDICATOR recipes. Shape mirrors the global\n// `.focus-ring-offset` / `.focus-ring-inset` Tailwind utilities exposed\n// in `index.css`; the recipes use raw classes (rather than the @apply\n// utility) because some variants pair the ring with a coloured border.\n// ============================================================\n/** Standard 2px offset ring + matching border-ring (most controls). */\nconst FOCUS_RING_OFFSET_WITH_BORDER: string =\n \"focus-visible:border-ring focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\";\n/** Standard 2px offset ring with NO border-ring change (filled / accent). */\nconst FOCUS_RING_OFFSET: string =\n \"focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\";\n/** Compact 2px ring used by indicator badges and selectable items. */\nconst FOCUS_RING_COMPACT: string =\n \"focus-visible:ring-2 focus-visible:ring-ring\";\n\nconst interactive: Record<InteractiveVariant, UIBehaviorRecipe> = {\n [InteractiveVariant.PRIMARY]: recipe({\n // T2 tactile: a hairline edge (`border-primary/50`) + `shadow-sm` give the\n // button real elevation, and the press (`active:translate-y-px active:shadow-none`)\n // reads as a physical push. `MOTION.interactive` already transitions transform,\n // so the press animates for free.\n base: \"bg-primary text-primary-foreground rounded-lg border border-primary/50 shadow-sm font-medium text-sm cursor-pointer\",\n states: {\n hover: \"hover:bg-primary/90\",\n active: \"active:bg-primary/80 active:shadow-none active:translate-y-px\",\n focus: FOCUS_RING_OFFSET_WITH_BORDER,\n disabled: interactiveDisabled,\n invalid: interactiveInvalid,\n },\n sizes: interactiveSizes,\n motion: { transition: MOTION.interactive },\n }),\n\n /*\n * Danger is carried by the EDGE and the GLYPH, never by a fill.\n *\n * This was `bg-destructive text-destructive-foreground` — a solid red slab — until 2026-09-20, and\n * the fill is what made it wrong for the only places it is used. Every consumer of this variant in\n * the product is an OFFER rather than a commitment: the risky entries of a resource action bar\n * (`riskLevelToVariant` returns DESTRUCTIVE for HIGH/CRITICAL), a file card's remove control, an\n * error display's recovery action, a decision option. A filled button is the loudest thing a page\n * can contain, so an action bar with one or two risky verbs in it read as a page ABOUT deleting,\n * and the surrounding actions — its real content — read as secondary to it.\n *\n * The distinction this keeps is the one `AppPage_SecuritySettings` already states for its factor\n * rows: a fill asserts \"this is the one thing to do next\", and asserting that of every dangerous\n * verb on a page asserts it of none of them while spending all the emphasis. What a dangerous verb\n * needs is to be TELLABLE APART from its neighbours, which a coloured edge and a coloured glyph do\n * pre-attentively and at two channels rather than one — and it stays legible beside the GHOST\n * siblings that share an action bar with it, which a slab does not.\n *\n * The LABEL stays `text-foreground`. Red on the border and the icon is the whole signal; tinting\n * the words as well pushes it back toward the emphasis just removed, and a red word next to a red\n * glyph adds no information.\n *\n * SCOPE — this is the DEFAULT theme's dressing of the semantic role, not a redefinition of the\n * role. `theme.interactive[DESTRUCTIVE]` is \"what this theme does with a dangerous action\", and\n * the alternative themes keep their own answers deliberately: neo-brutalist's slab is its whole\n * idiom, and trading remaps the variant to the SELL button, where a fill is the point. Changing\n * those would impose one theme's taste on design languages chosen for being different.\n *\n * Menus are unaffected: `DropdownMenuItem` / `ContextMenuItem` read `states.highlighted` only and\n * never `base`, so a destructive menu row keeps its borderless tinted-row treatment.\n */\n [InteractiveVariant.DESTRUCTIVE]: recipe({\n // `:not([class*='text-'])` mirrors the menus' convention — an icon that declares its own colour\n // keeps it, so a call site can still override without fighting the recipe.\n base: \"border border-destructive/60 bg-transparent text-foreground rounded-lg font-medium text-sm cursor-pointer [&_svg:not([class*='text-'])]:text-destructive\",\n states: {\n hover: \"hover:border-destructive hover:bg-destructive/10 dark:hover:bg-destructive/20\",\n active: \"active:bg-destructive/15 dark:active:bg-destructive/25 active:translate-y-px\",\n // FOCUS_RING_OFFSET, not ..._WITH_BORDER: that constant repaints the border to `ring`, which\n // for every other bordered variant is harmless because their border is decorative. Here the\n // border IS the danger cue, so swapping it out would strip the warning from a keyboard user at\n // the exact moment they are about to press the thing.\n focus: FOCUS_RING_OFFSET,\n highlighted: \"focus:bg-destructive/10 dark:focus:bg-destructive/20 focus:text-destructive\",\n disabled: interactiveDisabled,\n invalid: interactiveInvalid,\n },\n sizes: interactiveSizes,\n motion: { transition: MOTION.interactive },\n }),\n\n [InteractiveVariant.OUTLINE]: recipe({\n /*\n * The edge is `border-strong`, in both themes (#1322) — a DESIGN decision, taken from the accepted\n * creation-board proposal: a control's edge is drawn one strength above the hairline that divides\n * content, so a row of buttons reads as controls rather than as boxed text. It is not an\n * accessibility obligation: a button's label already identifies it, and the guidance for\n * non-text contrast says so. The obligation is on the FORM CONTROL recipes below, where the edge\n * is the only cue. `dark:border-input` went with it; it resolved to the hairline's lightness.\n * spec-cite: Understanding WCAG 2.1 SC 1.4.11 — https://www.w3.org/WAI/WCAG21/Understanding/non-text-contrast.html\n */\n base: \"border border-border-strong bg-background shadow-xs rounded-lg font-medium text-sm cursor-pointer dark:bg-input/30\",\n states: {\n hover: \"hover:bg-accent hover:text-accent-foreground dark:hover:bg-input/50 dark:hover:text-foreground\",\n active: \"active:bg-accent/80 active:shadow-none active:translate-y-px\",\n focus: FOCUS_RING_OFFSET_WITH_BORDER,\n /*\n * SELECTED IS NOT HOVER. It used to be the same two classes as `hover`, so a segmented\n * control could not say which segment was chosen while the pointer was anywhere on it —\n * the chosen one and the one under the cursor were the same pixels.\n *\n * The two additions are both decisions this design system has already taken elsewhere.\n * WEIGHT carries the choice, per `SelectableVariant.FILLED`: \"the selected item is the\n * 'you are here' anchor — WEIGHT carries the emphasis instead of a primary tint\". And the\n * inset RING is `Card`'s reasoning for a selected card: \"the ring is what still reads when\n * the card's own fill is close to\" its surroundings, which is precisely a segment whose\n * fill is the hover fill.\n */\n selected: \"data-[state=on]:bg-accent data-[state=on]:text-accent-foreground data-[state=on]:font-semibold data-[state=on]:ring-1 data-[state=on]:ring-inset data-[state=on]:ring-ring\",\n disabled: interactiveDisabled,\n invalid: interactiveInvalid,\n },\n sizes: interactiveSizes,\n motion: { transition: MOTION.interactive },\n }),\n\n [InteractiveVariant.SECONDARY]: recipe({\n base: \"bg-secondary text-secondary-foreground rounded-lg font-medium text-sm cursor-pointer\",\n states: {\n hover: \"hover:bg-secondary/80\",\n active: \"active:bg-secondary/70 active:translate-y-px\",\n focus: FOCUS_RING_OFFSET_WITH_BORDER,\n disabled: interactiveDisabled,\n invalid: interactiveInvalid,\n },\n sizes: interactiveSizes,\n motion: { transition: MOTION.interactive },\n }),\n\n [InteractiveVariant.GHOST]: recipe({\n base: \"rounded-lg font-medium text-sm cursor-pointer\",\n states: {\n hover: \"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50\",\n active: \"active:bg-accent/80\",\n focus: FOCUS_RING_OFFSET_WITH_BORDER,\n /*\n * SELECTED IS NOT HOVER. It used to be the same two classes as `hover`, so a segmented\n * control could not say which segment was chosen while the pointer was anywhere on it —\n * the chosen one and the one under the cursor were the same pixels.\n *\n * The two additions are both decisions this design system has already taken elsewhere.\n * WEIGHT carries the choice, per `SelectableVariant.FILLED`: \"the selected item is the\n * 'you are here' anchor — WEIGHT carries the emphasis instead of a primary tint\". And the\n * inset RING is `Card`'s reasoning for a selected card: \"the ring is what still reads when\n * the card's own fill is close to\" its surroundings, which is precisely a segment whose\n * fill is the hover fill.\n */\n selected: \"data-[state=on]:bg-accent data-[state=on]:text-accent-foreground data-[state=on]:font-semibold data-[state=on]:ring-1 data-[state=on]:ring-inset data-[state=on]:ring-ring\",\n highlighted: \"focus:bg-accent focus:text-accent-foreground\",\n open: \"data-[state=open]:bg-accent data-[state=open]:text-accent-foreground\",\n disabled: interactiveDisabled,\n invalid: interactiveInvalid,\n },\n sizes: interactiveSizes,\n motion: { transition: MOTION.interactive },\n }),\n\n [InteractiveVariant.LINK]: recipe({\n base: \"text-primary underline-offset-4 font-medium text-sm cursor-pointer\",\n states: {\n hover: \"hover:underline\",\n active: \"active:text-primary/80\",\n focus: FOCUS_RING_OFFSET_WITH_BORDER,\n disabled: interactiveDisabled,\n invalid: interactiveInvalid,\n },\n sizes: {\n xs: \"h-7 px-2.5 text-xs gap-1 pointer-coarse:min-h-9\",\n sm: \"h-8 px-3 gap-1.5 pointer-coarse:min-h-11\",\n md: \"h-9 px-4 py-2 pointer-coarse:min-h-11\",\n lg: \"h-10 px-6 pointer-coarse:min-h-11\",\n icon: \"size-9 pointer-coarse:min-h-11 pointer-coarse:min-w-11\",\n \"icon-sm\": \"size-7 pointer-coarse:min-h-9 pointer-coarse:min-w-9\",\n },\n motion: { transition: MOTION.interactive },\n }),\n\n [InteractiveVariant.ACCENT]: recipe({\n // TT-1: Gradient stops resolved from theme tokens\n // (`--accent-gradient-{from,via,to}`) so tenants can rebrand the ACCENT\n // recipe without forking a theme. Defaults preserve the historical\n // violet/blue/pink visual.\n base: 'relative bg-primary text-primary-foreground font-semibold rounded-lg shadow-xs before:absolute before:inset-0 before:rounded-[inherit] before:p-[1px] before:bg-[length:200%_200%] before:bg-gradient-to-r before:from-accent-gradient-from before:via-accent-gradient-via before:to-accent-gradient-to before:animate-[gradient-rotate_3s_ease_infinite] motion-reduce:before:animate-none before:-z-10 before:blur-[2px] shadow-[0_0_15px_color-mix(in_oklch,var(--primary)_20%,transparent)] text-sm cursor-pointer',\n states: {\n hover: 'hover:shadow-[0_0_25px_color-mix(in_oklch,var(--primary)_35%,transparent)]',\n active: 'active:scale-[0.98]',\n focus: FOCUS_RING_OFFSET,\n disabled: interactiveDisabled,\n invalid: interactiveInvalid,\n },\n sizes: interactiveSizes,\n motion: {\n transition: 'transition-[shadow,transform] duration-[var(--motion-duration-fast)] ease-[var(--motion-easing-default)] motion-reduce:transition-none',\n },\n }),\n};\n\n// ============================================================\n// SURFACE — Cards, dialogs, popovers, dropdowns\n// SURFACE PERSONALITY — clean SaaS material hierarchy: cards are bordered\n// elevated panels, tab panels are attached but quiet, shell is chromaless,\n// transient notifications reuse overlay chrome at a smaller scale.\n// ============================================================\n\nconst surface: ComponentStyleTheme['surface'] = {\n [SurfaceVariant.BASE]: recipe({\n // Card / panel — anchor of the surface scale at `rounded-xl`.\n base: \"bg-surface-raised text-surface-raised-foreground rounded-xl border shadow-sm\",\n }),\n\n [SurfaceVariant.CARD]: recipe({\n // Content card — the elevated `surface-raised` fill + border + soft shadow,\n // ALWAYS painted so an explicitly-authored CARD section reads as a card in\n // every context (including inside a dialog/page). Mirrors BASE, the anchor\n // card surface; the section preset adds container padding.\n base: \"bg-surface-raised text-surface-raised-foreground rounded-xl border shadow-sm\",\n }),\n\n [SurfaceVariant.RAISED]: recipe({\n // Popover / dropdown — floats above the page, gets a slightly tighter\n // radius than BASE to feel \"cut from\" the larger card surface (one tier\n // smaller, never two; previously `rounded-md` was visibly inconsistent\n // when popovers stacked next to cards).\n // `fill-surface-overlay` mirrors the background so SVG children that paint\n // via `fill` — notably the Tooltip's Radix arrow — inherit the body colour\n // (CSS `fill` inherits across Radix's arrow wrapper span; `background` does\n // not). Keep `fill-*` in lockstep with `bg-*` here.\n base: \"bg-surface-overlay fill-surface-overlay text-surface-overlay-foreground rounded-lg border shadow-md\",\n motion: {\n enter: MOTION.enterDirectional,\n exit: MOTION.exitFadeZoom,\n },\n }),\n\n [SurfaceVariant.OVERLAY]: recipe({\n // Dialog / sheet — the heaviest, most modal surface; matches BASE radius\n // so a dialog reads as a \"card the user can act inside\" rather than a\n // smaller-cornered floating panel. Required to restore monotonicity\n // (BASE ≤ OVERLAY) — `rounded-lg` here was visually demoting dialogs.\n // The edge is `border-strong` (#1322): in the dark theme `shadow-lg` is invisible against a dark\n // page, so the border is what separates a modal from what it covers. Popovers and toasts keep\n // `--border` — they are anchored to a trigger, and a heavy edge on every menu reads as noise.\n base: \"bg-surface-overlay text-surface-overlay-foreground rounded-xl border border-border-strong shadow-lg\",\n motion: {\n enter: MOTION.enterFadeZoom,\n exit: MOTION.exitFadeZoom,\n },\n }),\n\n [SurfaceVariant.INSET]: recipe({\n base: \"bg-surface-inset text-surface-inset-foreground\",\n }),\n\n [SurfaceVariant.SUNKEN]: recipe({\n base: \"bg-surface-sunken text-surface-sunken-foreground\",\n }),\n\n [SurfaceVariant.TAB_PANEL]: recipe({\n // Tab panel joins to the tab strip: same visual language as BASE, but no\n // border/shadow so the surface policy can own the join.\n base: \"bg-surface-raised text-surface-raised-foreground rounded-b-xl\",\n }),\n\n [SurfaceVariant.SHELL]: recipe({\n // App/page shell: chromaless raised background. Landmark semantics remain\n // opt-in via policy config.\n base: \"bg-surface-raised text-surface-raised-foreground\",\n }),\n\n [SurfaceVariant.TRANSIENT]: recipe({\n // Toast/snackbar: compact floating card, visually between RAISED and OVERLAY.\n base: \"bg-surface-overlay text-surface-overlay-foreground rounded-lg border shadow-md\",\n motion: {\n enter: MOTION.enterDirectional,\n exit: MOTION.exitFadeZoom,\n },\n }),\n};\n\n// ============================================================\n// FORM_CONTROL — Inputs, textareas, select triggers\n// ============================================================\n\nconst formControl: Record<FormControlVariant, UIBehaviorRecipe> = {\n [FormControlVariant.DEFAULT]: recipe({\n /*\n * The edge is `border-strong` (#1322). An empty text input has no content to identify it — its\n * border IS the control — so that border owes 3:1 against the page, and the hairline `--border`\n * gives about 1.5:1 in both themes. The same holds for UNDERLINED's rule and for an unchecked\n * CHECKBOX below. FILLED carries the same edge as its bottom indicator line; see its own recipe.\n * spec-cite: Understanding WCAG 2.1 SC 1.4.11 — \"Where a text-input has a visual indicator to show\n * it is an input, such as a bottom border (#767676), that indicator must meet 3:1 contrast ratio.\"\n * https://www.w3.org/WAI/WCAG21/Understanding/non-text-contrast.html\n */\n base: \"border-border-strong dark:bg-surface-inset/30 rounded-lg border bg-transparent shadow-xs text-base md:text-sm placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground\",\n states: {\n focus: FOCUS_RING_OFFSET_WITH_BORDER,\n disabled: \"disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-[var(--opacity-disabled)]\",\n invalid: \"aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n },\n sizes: {\n md: \"h-9 px-3 py-1 pointer-coarse:min-h-11\",\n sm: \"h-8 px-2 py-1 text-sm pointer-coarse:min-h-11\",\n lg: \"h-10 px-4 py-2 pointer-coarse:min-h-11\",\n },\n motion: { transition: MOTION.formControl },\n }),\n\n [FormControlVariant.FILLED]: recipe({\n /*\n * A FILL is not an input's indicator: `bg-muted` sits at about 1.3:1 against the page on the\n * default palette, so a filled field with `border-0` was an input nothing marked as one — and\n * its `invalid` state sets a BORDER colour, which a borderless field could not show at all.\n * The filled-field convention answers both: the fill, plus an indicator line along the bottom at\n * the strong edge, with the top corners rounded and the bottom square so the line runs straight.\n * spec-cite: Understanding WCAG 2.1 SC 1.4.11 — \"Where a text-input has a visual indicator to show\n * it is an input, such as a bottom border (#767676), that indicator must meet 3:1 contrast ratio.\"\n * https://www.w3.org/WAI/WCAG21/Understanding/non-text-contrast.html\n */\n base: \"bg-muted rounded-t-lg rounded-b-none border-0 border-b border-border-strong text-base md:text-sm placeholder:text-muted-foreground\",\n states: {\n focus: FOCUS_RING_OFFSET,\n disabled: \"disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-[var(--opacity-disabled)]\",\n invalid: \"aria-invalid:ring-destructive/20 aria-invalid:border-destructive\",\n },\n sizes: {\n md: \"h-9 px-3 py-1 pointer-coarse:min-h-11\",\n sm: \"h-8 px-2 py-1 text-sm pointer-coarse:min-h-11\",\n lg: \"h-10 px-4 py-2 pointer-coarse:min-h-11\",\n },\n motion: { transition: MOTION.formControl },\n }),\n\n [FormControlVariant.UNDERLINED]: recipe({\n base: \"bg-transparent border-0 border-b border-border-strong rounded-none text-base md:text-sm placeholder:text-muted-foreground\",\n states: {\n focus: \"focus-visible:border-ring focus-visible:border-b-2\",\n disabled: \"disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-[var(--opacity-disabled)]\",\n invalid: \"aria-invalid:border-destructive\",\n },\n sizes: {\n md: \"h-9 px-0 py-1 pointer-coarse:min-h-11\",\n sm: \"h-8 px-0 py-1 text-sm pointer-coarse:min-h-11\",\n lg: \"h-10 px-0 py-2 pointer-coarse:min-h-11\",\n },\n motion: { transition: \"transition-[border-color] duration-[var(--motion-duration-fast)] ease-[var(--motion-easing-default)] motion-reduce:transition-none\" },\n }),\n\n [FormControlVariant.CHECKBOX]: recipe({\n base: \"border-border-strong dark:bg-input/30 border shadow-xs\",\n states: {\n focus: FOCUS_RING_OFFSET_WITH_BORDER,\n selected: \"data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground data-[state=checked]:border-primary dark:data-[state=checked]:bg-primary\",\n disabled: \"disabled:cursor-not-allowed disabled:opacity-[var(--opacity-disabled)]\",\n invalid: \"aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n },\n motion: { transition: \"transition-[color,box-shadow] duration-[var(--motion-duration-fast)] ease-[var(--motion-easing-default)] motion-reduce:transition-none\" },\n }),\n\n [FormControlVariant.SWITCH]: recipe({\n base: \"data-[state=unchecked]:bg-input dark:data-[state=unchecked]:bg-input/80 border border-transparent shadow-xs\",\n states: {\n focus: FOCUS_RING_OFFSET_WITH_BORDER,\n selected: \"data-[state=checked]:bg-primary\",\n disabled: \"disabled:cursor-not-allowed disabled:opacity-[var(--opacity-disabled)]\",\n invalid: \"aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n },\n motion: { transition: \"transition-[background-color,border-color,box-shadow] duration-[var(--motion-duration-fast)] ease-[var(--motion-easing-default)] motion-reduce:transition-none\" },\n }),\n};\n\n// ============================================================\n// INDICATOR — Badges, alerts, toast severity\n// ============================================================\n\nconst indicatorShared = {\n states: {\n hover: \"[a&]:hover:opacity-[var(--opacity-hover)]\",\n focus: `focus-visible:border-ring ${FOCUS_RING_COMPACT}`,\n invalid: interactiveInvalid,\n },\n // `attention` = the theme-owned notification pulse (applied by NotificationIndicator\n // when a badge definition declares a pulse trigger). Reduced-motion safe.\n motion: { transition: MOTION.interactive, attention: \"animate-pulse motion-reduce:animate-none\" },\n};\n\n// TONAL badges (T1 + T1b) — tinted background + AA-contrast text + hairline\n// border, in place of the previous solid full-saturation fills. Reads calmer\n// and modern (Linear/Stripe/shadcn) and lets many status chips coexist on one\n// row without the \"wall of solid colour\" effect.\n//\n// The tint (`bg-{status}-subtle`) and text (`text-{status}-subtle-foreground`)\n// come from dedicated SUBTLE STATUS TOKENS (T1b), not per-recipe `/10` mixes.\n// Those tokens are palette-adaptive `color-mix()` formulas emitted by the design\n// -token CSS generator (`design-tokens-css.shared.ts` → `buildSubtleStatusColors`),\n// tuned so 12px badge text clears WCAG-AA (≥4.5) against its tint in BOTH light\n// and dark — including the amber WARNING case that fails contrast with a naive\n// same-hue text. Because the tokens reference the base `--{status}` vars, a\n// palette retune (or a light/dark switch) retunes the chip automatically, and a\n// tenant can override any pair via `DesignSystemToken.*_SUBTLE(_FOREGROUND)`.\n// The border stays on the palette base (`border-{status}/25`, `/30` for warning\n// where the base is lighter) so it tracks the same hue.\nconst indicator: Record<IndicatorVariant, UIBehaviorRecipe> = {\n [IndicatorVariant.NEUTRAL]: recipe({\n // Tonal like the other four: `bg-neutral-subtle` mirrors the muted tint, but\n // `text-neutral-subtle-foreground` is a foreground-biased mix tuned to clear\n // WCAG-AA on that tint. Previously `text-muted-foreground` (tuned for the page\n // background, not the raised muted tint) rendered a washed-out, sub-AA grey\n // chip for every `default`/`secondary`/`outline` enum value.\n base: \"bg-neutral-subtle text-neutral-subtle-foreground border-border rounded-md border px-2 py-0.5 text-xs font-medium\",\n ...indicatorShared,\n }),\n [IndicatorVariant.INFO]: recipe({\n base: \"bg-info-subtle text-info-subtle-foreground border-info/25 rounded-md border px-2 py-0.5 text-xs font-medium\",\n ...indicatorShared,\n }),\n [IndicatorVariant.SUCCESS]: recipe({\n base: \"bg-success-subtle text-success-subtle-foreground border-success/25 rounded-md border px-2 py-0.5 text-xs font-medium\",\n ...indicatorShared,\n }),\n [IndicatorVariant.WARNING]: recipe({\n base: \"bg-warning-subtle text-warning-subtle-foreground border-warning/30 rounded-md border px-2 py-0.5 text-xs font-medium\",\n ...indicatorShared,\n }),\n [IndicatorVariant.ERROR]: recipe({\n base: \"bg-destructive-subtle text-destructive-subtle-foreground border-destructive/25 rounded-md border px-2 py-0.5 text-xs font-medium\",\n ...indicatorShared,\n }),\n};\n\n// ============================================================\n// SELECTABLE — Tabs, sidebar active items, toggles\n// ============================================================\n\nconst selectable: Record<SelectableVariant, UIBehaviorRecipe> = {\n [SelectableVariant.FILLED]: recipe({\n base: \"rounded-md text-sm outline-hidden ring-surface-sunken-border\",\n states: {\n hover: \"hover:bg-surface-sunken-accent hover:text-surface-sunken-foreground\",\n focus: \"focus-visible:ring-2\",\n active: \"active:bg-surface-sunken-accent active:text-surface-sunken-foreground\",\n // `font-semibold` (not medium): the selected item is the \"you are here\"\n // anchor — WEIGHT carries the emphasis instead of a primary tint, and\n // medium is too close to the regular weight to read at sidebar sizes.\n selected: \"data-[active=true]:bg-surface-sunken-accent data-[active=true]:font-semibold data-[active=true]:text-surface-sunken-foreground data-[state=active]:bg-surface-sunken-accent data-[state=active]:text-surface-sunken-foreground\",\n disabled: \"disabled:pointer-events-none disabled:opacity-[var(--opacity-disabled)] aria-disabled:pointer-events-none aria-disabled:opacity-[var(--opacity-disabled)]\",\n },\n sizes: {\n sm: \"h-7 text-xs\",\n md: \"h-8 text-sm\",\n lg: \"h-12 text-sm\",\n },\n motion: { transition: MOTION.selectable },\n }),\n\n [SelectableVariant.UNDERLINE]: recipe({\n base: \"rounded-none border-b-2 border-transparent text-sm outline-hidden\",\n states: {\n hover: \"hover:text-foreground\",\n focus: FOCUS_RING_COMPACT,\n selected: \"data-[state=active]:border-primary data-[state=active]:text-foreground\",\n disabled: \"disabled:pointer-events-none disabled:opacity-[var(--opacity-disabled)]\",\n },\n sizes: {\n sm: \"h-7 text-xs pb-1\",\n md: \"h-8 text-sm pb-2\",\n lg: \"h-10 text-sm pb-3\",\n },\n motion: { transition: MOTION.selectable },\n }),\n\n [SelectableVariant.PILL]: recipe({\n base: \"rounded-full text-sm outline-hidden\",\n states: {\n hover: \"hover:bg-accent hover:text-accent-foreground\",\n focus: FOCUS_RING_COMPACT,\n selected: \"data-[state=active]:bg-primary data-[state=active]:text-primary-foreground\",\n disabled: \"disabled:pointer-events-none disabled:opacity-[var(--opacity-disabled)]\",\n },\n sizes: {\n sm: \"h-7 px-3 text-xs\",\n md: \"h-8 px-4 text-sm\",\n lg: \"h-10 px-5 text-sm\",\n },\n motion: { transition: MOTION.selectable },\n }),\n\n [SelectableVariant.INDICATOR]: recipe({\n base: \"rounded-md text-sm outline-hidden\",\n states: {\n hover: \"hover:bg-surface-sunken-accent hover:text-surface-sunken-foreground\",\n focus: FOCUS_RING_COMPACT,\n // Same weight semantics as FILLED: selected = semibold (see note there).\n selected: \"data-[active=true]:border-s-2 data-[active=true]:border-surface-sunken-primary data-[active=true]:font-semibold data-[active=true]:text-surface-sunken-foreground\",\n disabled: \"disabled:pointer-events-none disabled:opacity-[var(--opacity-disabled)]\",\n },\n sizes: {\n sm: \"h-7 text-xs\",\n md: \"h-8 text-sm\",\n lg: \"h-12 text-sm\",\n },\n motion: { transition: MOTION.selectable },\n }),\n};\n\n// ============================================================\n// OVERLAY_BACKDROP — Dialog/Sheet background overlay\n// ============================================================\n\nconst overlayBackdrop: UIBehaviorRecipe = recipe({\n // Tailwind v4's `bg-color/[var()]` opacity modifier uses color-mix() which\n // doesn't resolve CSS custom property decimals correctly.\n // Use arbitrary bg value with rgb() alpha channel instead.\n base: \"bg-[rgb(0_0_0_/_var(--opacity-overlay))] backdrop-blur-sm\",\n motion: {\n enter: MOTION.backdropEnter,\n exit: MOTION.backdropExit,\n },\n});\n\n// ============================================================\n// DIVIDER — Separator\n// ============================================================\n\nconst divider: Record<DividerVariant, UIBehaviorRecipe> = {\n [DividerVariant.DEFAULT]: recipe({\n base: \"bg-border shrink-0\",\n }),\n [DividerVariant.NESTING_GUIDE]: recipe({\n // Nested-disclosure guide: a hairline left edge in the standard border color. LOOK only —\n // the indent beside it is structure and belongs to the component that nests (the accordion\n // preset adds `pl-field`). A theme wanting a heavier, tinted or dashed depth cue changes it here.\n base: \"border-s border-border\",\n }),\n};\n\n// ============================================================\n// SKELETON — Loading placeholders\n// ============================================================\n\nconst skeleton: UIBehaviorRecipe = recipe({\n base: `${SKELETON_NEUTRAL_TINT} animate-pulse rounded-md motion-reduce:animate-none`,\n});\n\nconst loadingSpinner: UIBehaviorRecipe = recipe({\n base: \"text-muted-foreground animate-spin motion-reduce:animate-none\",\n});\n\nconst loadingOverlay: UIBehaviorRecipe = recipe({\n base: \"bg-background/80\",\n motion: {\n enter: \"animate-in fade-in-0 duration-[var(--motion-duration-fast)] ease-[var(--motion-easing-enter)] motion-reduce:animate-none\",\n exit: \"animate-out fade-out-0 duration-[var(--motion-duration-fast)] ease-[var(--motion-easing-exit)] motion-reduce:animate-none\",\n },\n});\n\n// ============================================================\n// TYPOGRAPHY — Text hierarchy\n// ============================================================\n\nconst typography: Record<TypographyVariant, UIBehaviorRecipe> = {\n [TypographyVariant.HEADING]: recipe({\n base: \"font-semibold leading-none tracking-tight\",\n // Heading scale rebalance — gaps were 12/4/2px (h1→h2→h3→h4); h1 at\n // text-4xl (36px) jumped 1.5× to h2 (text-2xl, 24px), which felt\n // disproportionate for in-app SaaS UI (text-4xl is a hero size).\n // Compressing h1 to text-3xl yields a smooth 6/4/2px ladder\n // (1.25× → 1.2× → 1.11×, classic Major Third base). Pages that want a\n // hero h1 can opt in with `className=\"text-4xl sm:text-5xl\"` since the\n // size class is the LAST `text-*` to win in `cn()`.\n sizes: {\n h1: \"text-3xl\",\n h2: \"text-2xl\",\n h3: \"text-xl\",\n h4: \"text-lg\",\n h5: \"text-base\",\n md: \"text-lg\",\n },\n }),\n [TypographyVariant.BODY]: recipe({\n base: \"text-foreground text-sm\",\n sizes: { sm: \"text-xs\", md: \"text-sm\", lg: \"text-base\" },\n }),\n [TypographyVariant.LABEL]: recipe({\n base: \"font-medium text-sm leading-none\",\n sizes: { sm: \"text-xs\", md: \"text-sm\", lg: \"text-base\" },\n }),\n [TypographyVariant.DESCRIPTION]: recipe({\n base: \"text-muted-foreground text-sm\",\n sizes: { sm: \"text-xs\", md: \"text-sm\" },\n }),\n [TypographyVariant.EYEBROW]: recipe({\n base: \"text-foreground-subtle text-2xs font-medium uppercase tracking-wide\",\n sizes: { sm: \"text-2xs\", md: \"text-xs\" },\n }),\n [TypographyVariant.CODE]: recipe({\n base: \"font-mono text-sm bg-muted rounded px-1 py-0.5\",\n sizes: { sm: \"text-xs\", md: \"text-sm\", lg: \"text-base\" },\n }),\n};\n\n// ============================================================\n// DEFAULT THEME — assembled\n//\n// Spacing: the default theme intentionally omits `spacing` overrides.\n// It uses the application-level defaults from DesignSystemConfiguration:\n// element: 0.5rem | item: 0.25rem | group: 0.75rem | field: 1rem\n// section: 1.5rem | region: 2rem | card: 1rem | container: 1.5rem\n// ============================================================\n\nexport const defaultTheme: ComponentStyleTheme = {\n id: 'default',\n name: 'Default',\n description: 'Clean modern SaaS, derived from shadcn/ui (NOT Material Design 3). Soft shadow ladder (xs/sm/md/lg); radius ladder control lg(8) · popover lg · card/dialog xl(12); accessible focus rings; fast/default motion tokens. Tonal status badges (tinted bg + AA-contrast text + hairline, light & dark) instead of solid fills. Tactile buttons (hairline edge + shadow-sm + active press) on the elevated variants.',\n\n // spacing: omitted — uses application-level defaults (see DesignSystemToken.SPACING_*)\n\n interactive,\n surface,\n formControl,\n indicator,\n selectable,\n overlayBackdrop,\n divider,\n skeleton,\n loadingSpinner,\n loadingOverlay,\n typography,\n radius: undefined,\n backgroundLayer: undefined,\n chartStyle: DEFAULT_CHART_STYLE_PRESET,\n};\n"]}
1
+ {"version":3,"file":"default.theme.js","sourceRoot":"","sources":["../../../../../../src/core/ui/themes/default.theme.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ComponentStyleTheme } from '@wildo-ai/presets-components-models';\nimport {\n DividerVariant,\n InteractiveVariant,\n SurfaceVariant,\n FormControlVariant,\n IndicatorVariant,\n SelectableVariant,\n TypographyVariant,\n SKELETON_NEUTRAL_TINT,\n} from '@wildo-ai/presets-components-models';\nimport type { UIBehaviorRecipe } from '@wildo-ai/presets-components-models';\nimport { DEFAULT_CHART_STYLE_PRESET } from '../chart-style-defaults';\n\n// ============================================================\n// Helper\n// ============================================================\n\nfunction recipe(r: Partial<UIBehaviorRecipe> & { base: string }): UIBehaviorRecipe {\n return {\n base: r.base,\n states: r.states ?? {},\n sizes: r.sizes,\n motion: r.motion ?? {},\n gesture: r.gesture,\n policy: r.policy,\n };\n}\n\n// ============================================================\n// Motion constants — reference Level 1 tokens via CSS variables\n//\n// Each behavior targets SPECIFIC properties (no transition-all).\n// Durations and easings come from Level 1 --motion-* tokens.\n// All include motion-reduce for accessibility.\n// ============================================================\n//\n// MOTION PERSONALITY — Default (shadcn / Material-inspired SaaS)\n// Hover/focus : FAST (150ms) + DEFAULT → Material Standard curve.\n// Bidirectional state changes,\n// subtle but present.\n// Overlay enter: NORMAL (250ms) + ENTER → fade + zoom-95 + 2px slide.\n// Pure decelerate.\n// Overlay exit : FAST (150ms) + EXIT → quicker than enter.\n// Backdrop : NORMAL/FAST + ENTER/EXIT → matches overlays.\n// Gestures : NONE — neutral SaaS baseline. CSS-only motion is the\n// contract; theme can be swapped without removing\n// motion.dev wrappers from app code (which any theme\n// may activate via the recipe `gesture` slot).\n//\n// This theme is the reference baseline for the framework. All other\n// themes deviate FROM it intentionally — Glass adds gestures, Editorial\n// stretches durations, Terminal/Trading collapse them, Neo-Brutalist\n// strips easing, Cozy adds gentle springs.\n// ============================================================\n\nconst MOTION = {\n /** Interactive elements: bg, color, border, shadow, transform changes */\n interactive: \"transition-[background-color,color,border-color,box-shadow,transform] duration-[var(--motion-duration-fast)] ease-[var(--motion-easing-default)] motion-reduce:transition-none\",\n\n /** Form controls: border, shadow, color changes on focus/validation */\n formControl: \"transition-[color,border-color,box-shadow] duration-[var(--motion-duration-fast)] ease-[var(--motion-easing-default)] motion-reduce:transition-none\",\n\n /** Selectable items: bg, color, border on state change */\n selectable: \"transition-[background-color,color,border-color] duration-[var(--motion-duration-fast)] ease-[var(--motion-easing-default)] motion-reduce:transition-none\",\n\n /** Sidebar: width/height collapse */\n sidebarCollapse: \"transition-[width,height,padding] duration-[var(--motion-duration-normal)] ease-[var(--motion-easing-default)] motion-reduce:transition-none\",\n\n /** Enter animation for overlays/surfaces (fade + zoom) */\n enterFadeZoom: \"data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 data-[state=open]:duration-[var(--motion-duration-normal)] data-[state=open]:ease-[var(--motion-easing-enter)] motion-reduce:data-[state=open]:animate-none\",\n\n /** Exit animation for overlays/surfaces */\n exitFadeZoom: \"data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=closed]:duration-[var(--motion-duration-fast)] data-[state=closed]:ease-[var(--motion-easing-exit)] motion-reduce:data-[state=closed]:animate-none\",\n\n /** Enter for directional popovers (fade + zoom + slide per side) */\n enterDirectional: \"data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 data-[state=open]:duration-[var(--motion-duration-normal)] data-[state=open]:ease-[var(--motion-easing-enter)] data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 motion-reduce:data-[state=open]:animate-none\",\n\n /** Enter/exit for backdrop overlay (fade only).\n *\n * Uses explicit ENTER/EXIT easing tokens. Without\n * `ease-[...]`, browsers fall back to the CSS default `ease` curve,\n * silently inheriting a generic curve instead of the theme's ENTER\n * (decelerate) / EXIT (accelerate) personality. Backdrops fade only\n * so the perceptual difference is small, but consistency matters\n * for the \"every motion uses an explicit theme token\" rule. */\n backdropEnter: \"data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:duration-[var(--motion-duration-normal)] data-[state=open]:ease-[var(--motion-easing-enter)] motion-reduce:data-[state=open]:animate-none\",\n backdropExit: \"data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:duration-[var(--motion-duration-fast)] data-[state=closed]:ease-[var(--motion-easing-exit)] motion-reduce:data-[state=closed]:animate-none\",\n};\n\n// ============================================================\n// INTERACTIVE — Buttons, menu items, clickable surfaces\n// ============================================================\n\n// T5 radius ladder: interactive controls sit one clean step under cards —\n// control `rounded-lg` (8) · popover `rounded-lg` (RAISED) · card `rounded-xl` (12).\n// `md`/`icon` inherit the base recipe's `rounded-lg`; the explicit size overrides\n// (xs/sm/lg) mirror it so every size is of-a-piece.\nconst interactiveSizes: Record<string, string> = {\n xs: \"h-7 px-2.5 text-xs gap-1 rounded-lg has-[>svg]:px-2 pointer-coarse:min-h-9\",\n sm: \"h-8 px-3 gap-1.5 rounded-lg has-[>svg]:px-2.5 pointer-coarse:min-h-11\",\n md: \"h-9 px-4 py-2 has-[>svg]:px-3 pointer-coarse:min-h-11\",\n lg: \"h-10 px-6 rounded-lg has-[>svg]:px-4 pointer-coarse:min-h-11\",\n icon: \"size-9 pointer-coarse:min-h-11 pointer-coarse:min-w-11\",\n \"icon-sm\": \"size-7 pointer-coarse:min-h-9 pointer-coarse:min-w-9\",\n};\n\nconst interactiveDisabled: string = \"disabled:pointer-events-none disabled:opacity-[var(--opacity-disabled)] aria-disabled:cursor-not-allowed aria-disabled:opacity-[var(--opacity-disabled)]\";\nconst interactiveInvalid: string = \"aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\";\n\n// ============================================================\n// Focus-ring constants — single source of truth\n// for the keyboard-focus indicators used by INTERACTIVE, FORM_CONTROL,\n// SELECTABLE, and INDICATOR recipes. Shape mirrors the global\n// `.focus-ring-offset` / `.focus-ring-inset` Tailwind utilities exposed\n// in `index.css`; the recipes use raw classes (rather than the @apply\n// utility) because some variants pair the ring with a coloured border.\n// ============================================================\n/** Standard 2px offset ring + matching border-ring (most controls). */\nconst FOCUS_RING_OFFSET_WITH_BORDER: string =\n \"focus-visible:border-ring focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\";\n/** Standard 2px offset ring with NO border-ring change (filled / accent). */\nconst FOCUS_RING_OFFSET: string =\n \"focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\";\n/** Compact 2px ring used by indicator badges and selectable items. */\nconst FOCUS_RING_COMPACT: string =\n \"focus-visible:ring-2 focus-visible:ring-ring\";\n\nconst interactive: Record<InteractiveVariant, UIBehaviorRecipe> = {\n [InteractiveVariant.PRIMARY]: recipe({\n // T2 tactile: a hairline edge (`border-primary/50`) + `shadow-sm` give the\n // button real elevation, and the press (`active:translate-y-px active:shadow-none`)\n // reads as a physical push. `MOTION.interactive` already transitions transform,\n // so the press animates for free.\n base: \"bg-primary text-primary-foreground rounded-lg border border-primary/50 shadow-sm font-medium text-sm cursor-pointer\",\n states: {\n hover: \"hover:bg-primary/90\",\n active: \"active:bg-primary/80 active:shadow-none active:translate-y-px\",\n focus: FOCUS_RING_OFFSET_WITH_BORDER,\n disabled: interactiveDisabled,\n invalid: interactiveInvalid,\n },\n sizes: interactiveSizes,\n motion: { transition: MOTION.interactive },\n }),\n\n /*\n * Danger is carried by the EDGE and the GLYPH, never by a fill.\n *\n * This was `bg-destructive text-destructive-foreground` — a solid red slab — until 2026-09-20, and\n * the fill is what made it wrong for the only places it is used. Every consumer of this variant in\n * the product is an OFFER rather than a commitment: the risky entries of a resource action bar\n * (`riskLevelToVariant` returns DESTRUCTIVE for HIGH/CRITICAL), a file card's remove control, an\n * error display's recovery action, a decision option. A filled button is the loudest thing a page\n * can contain, so an action bar with one or two risky verbs in it read as a page ABOUT deleting,\n * and the surrounding actions — its real content — read as secondary to it.\n *\n * The distinction this keeps is the one `AppPage_SecuritySettings` already states for its factor\n * rows: a fill asserts \"this is the one thing to do next\", and asserting that of every dangerous\n * verb on a page asserts it of none of them while spending all the emphasis. What a dangerous verb\n * needs is to be TELLABLE APART from its neighbours, which a coloured edge and a coloured glyph do\n * pre-attentively and at two channels rather than one — and it stays legible beside the GHOST\n * siblings that share an action bar with it, which a slab does not.\n *\n * The LABEL stays `text-foreground`. Red on the border and the icon is the whole signal; tinting\n * the words as well pushes it back toward the emphasis just removed, and a red word next to a red\n * glyph adds no information.\n *\n * SCOPE — this is the DEFAULT theme's dressing of the semantic role, not a redefinition of the\n * role. `theme.interactive[DESTRUCTIVE]` is \"what this theme does with a dangerous action\", and\n * the alternative themes keep their own answers deliberately: neo-brutalist's slab is its whole\n * idiom, and trading remaps the variant to the SELL button, where a fill is the point. Changing\n * those would impose one theme's taste on design languages chosen for being different.\n *\n * Menus are unaffected: `DropdownMenuItem` / `ContextMenuItem` read `states.highlighted` only and\n * never `base`, so a destructive menu row keeps its borderless tinted-row treatment.\n */\n [InteractiveVariant.DESTRUCTIVE]: recipe({\n // `:not([class*='text-'])` mirrors the menus' convention — an icon that declares its own colour\n // keeps it, so a call site can still override without fighting the recipe.\n base: \"border border-destructive/60 bg-transparent text-foreground rounded-lg font-medium text-sm cursor-pointer [&_svg:not([class*='text-'])]:text-destructive\",\n states: {\n hover: \"hover:border-destructive hover:bg-destructive/10 dark:hover:bg-destructive/20\",\n active: \"active:bg-destructive/15 dark:active:bg-destructive/25 active:translate-y-px\",\n // FOCUS_RING_OFFSET, not ..._WITH_BORDER: that constant repaints the border to `ring`, which\n // for every other bordered variant is harmless because their border is decorative. Here the\n // border IS the danger cue, so swapping it out would strip the warning from a keyboard user at\n // the exact moment they are about to press the thing.\n focus: FOCUS_RING_OFFSET,\n highlighted: \"focus:bg-destructive/10 dark:focus:bg-destructive/20 focus:text-destructive\",\n disabled: interactiveDisabled,\n invalid: interactiveInvalid,\n },\n sizes: interactiveSizes,\n motion: { transition: MOTION.interactive },\n }),\n\n [InteractiveVariant.OUTLINE]: recipe({\n /*\n * The edge is `border-strong`, in both themes (#1322) — a DESIGN decision, taken from the accepted\n * creation-board proposal: a control's edge is drawn one strength above the hairline that divides\n * content, so a row of buttons reads as controls rather than as boxed text. It is not an\n * accessibility obligation: a button's label already identifies it, and the guidance for\n * non-text contrast says so. The obligation is on the FORM CONTROL recipes below, where the edge\n * is the only cue. `dark:border-input` went with it; it resolved to the hairline's lightness.\n * spec-cite: Understanding WCAG 2.1 SC 1.4.11 — https://www.w3.org/WAI/WCAG21/Understanding/non-text-contrast.html\n */\n base: \"border border-border-strong bg-background shadow-xs rounded-lg font-medium text-sm cursor-pointer dark:bg-input/30\",\n states: {\n hover: \"hover:bg-accent hover:text-accent-foreground dark:hover:bg-input/50 dark:hover:text-foreground\",\n active: \"active:bg-accent/80 active:shadow-none active:translate-y-px\",\n focus: FOCUS_RING_OFFSET_WITH_BORDER,\n /*\n * SELECTED IS NOT HOVER. It used to be the same two classes as `hover`, so a segmented\n * control could not say which segment was chosen while the pointer was anywhere on it —\n * the chosen one and the one under the cursor were the same pixels.\n *\n * The two additions are both decisions this design system has already taken elsewhere.\n * WEIGHT carries the choice, per `SelectableVariant.FILLED`: \"the selected item is the\n * 'you are here' anchor — WEIGHT carries the emphasis instead of a primary tint\". And the\n * inset RING is `Card`'s reasoning for a selected card: \"the ring is what still reads when\n * the card's own fill is close to\" its surroundings, which is precisely a segment whose\n * fill is the hover fill.\n *\n * Both the fill and the ring are NEUTRAL — an ink wash of `foreground`, never `accent` and\n * never `ring` (2026-09-25). `ring` is the FOCUS/brand colour, so a chosen toggle wore a\n * primary outline that read as \"focused\" or \"error-adjacent\" rather than \"on\", on every pill\n * and segment at once. And `accent` is the HOVER tint: in a theme whose accent sits one\n * lightness step off the page (Wonder Todos: L 0.929 on 0.984) the chosen state barely\n * separated from the background it sat on. A translucent `foreground` wash is darker than\n * the hover tint in every theme by construction, tracks light and dark without a second\n * token, and keeps `SelectableVariant.FILLED`'s promise that weight — not a brand colour —\n * carries \"you are here\".\n */\n selected: \"data-[state=on]:bg-foreground/10 data-[state=on]:text-foreground data-[state=on]:font-semibold data-[state=on]:ring-1 data-[state=on]:ring-inset data-[state=on]:ring-foreground/25 dark:data-[state=on]:bg-foreground/15\",\n disabled: interactiveDisabled,\n invalid: interactiveInvalid,\n },\n sizes: interactiveSizes,\n motion: { transition: MOTION.interactive },\n }),\n\n [InteractiveVariant.SECONDARY]: recipe({\n base: \"bg-secondary text-secondary-foreground rounded-lg font-medium text-sm cursor-pointer\",\n states: {\n hover: \"hover:bg-secondary/80\",\n active: \"active:bg-secondary/70 active:translate-y-px\",\n focus: FOCUS_RING_OFFSET_WITH_BORDER,\n disabled: interactiveDisabled,\n invalid: interactiveInvalid,\n },\n sizes: interactiveSizes,\n motion: { transition: MOTION.interactive },\n }),\n\n [InteractiveVariant.GHOST]: recipe({\n base: \"rounded-lg font-medium text-sm cursor-pointer\",\n states: {\n hover: \"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50\",\n active: \"active:bg-accent/80\",\n focus: FOCUS_RING_OFFSET_WITH_BORDER,\n /*\n * SELECTED IS NOT HOVER. It used to be the same two classes as `hover`, so a segmented\n * control could not say which segment was chosen while the pointer was anywhere on it —\n * the chosen one and the one under the cursor were the same pixels.\n *\n * The two additions are both decisions this design system has already taken elsewhere.\n * WEIGHT carries the choice, per `SelectableVariant.FILLED`: \"the selected item is the\n * 'you are here' anchor — WEIGHT carries the emphasis instead of a primary tint\". And the\n * inset RING is `Card`'s reasoning for a selected card: \"the ring is what still reads when\n * the card's own fill is close to\" its surroundings, which is precisely a segment whose\n * fill is the hover fill.\n *\n * Both the fill and the ring are NEUTRAL — an ink wash of `foreground`, never `accent` and\n * never `ring` (2026-09-25). `ring` is the FOCUS/brand colour, so a chosen toggle wore a\n * primary outline that read as \"focused\" or \"error-adjacent\" rather than \"on\", on every pill\n * and segment at once. And `accent` is the HOVER tint: in a theme whose accent sits one\n * lightness step off the page (Wonder Todos: L 0.929 on 0.984) the chosen state barely\n * separated from the background it sat on. A translucent `foreground` wash is darker than\n * the hover tint in every theme by construction, tracks light and dark without a second\n * token, and keeps `SelectableVariant.FILLED`'s promise that weight — not a brand colour —\n * carries \"you are here\".\n */\n selected: \"data-[state=on]:bg-foreground/10 data-[state=on]:text-foreground data-[state=on]:font-semibold data-[state=on]:ring-1 data-[state=on]:ring-inset data-[state=on]:ring-foreground/25 dark:data-[state=on]:bg-foreground/15\",\n highlighted: \"focus:bg-accent focus:text-accent-foreground\",\n open: \"data-[state=open]:bg-accent data-[state=open]:text-accent-foreground\",\n disabled: interactiveDisabled,\n invalid: interactiveInvalid,\n },\n sizes: interactiveSizes,\n motion: { transition: MOTION.interactive },\n }),\n\n [InteractiveVariant.LINK]: recipe({\n base: \"text-primary underline-offset-4 font-medium text-sm cursor-pointer\",\n states: {\n hover: \"hover:underline\",\n active: \"active:text-primary/80\",\n focus: FOCUS_RING_OFFSET_WITH_BORDER,\n disabled: interactiveDisabled,\n invalid: interactiveInvalid,\n },\n sizes: {\n xs: \"h-7 px-2.5 text-xs gap-1 pointer-coarse:min-h-9\",\n sm: \"h-8 px-3 gap-1.5 pointer-coarse:min-h-11\",\n md: \"h-9 px-4 py-2 pointer-coarse:min-h-11\",\n lg: \"h-10 px-6 pointer-coarse:min-h-11\",\n icon: \"size-9 pointer-coarse:min-h-11 pointer-coarse:min-w-11\",\n \"icon-sm\": \"size-7 pointer-coarse:min-h-9 pointer-coarse:min-w-9\",\n },\n motion: { transition: MOTION.interactive },\n }),\n\n [InteractiveVariant.ACCENT]: recipe({\n // TT-1: Gradient stops resolved from theme tokens\n // (`--accent-gradient-{from,via,to}`) so tenants can rebrand the ACCENT\n // recipe without forking a theme. Defaults preserve the historical\n // violet/blue/pink visual.\n base: 'relative bg-primary text-primary-foreground font-semibold rounded-lg shadow-xs before:absolute before:inset-0 before:rounded-[inherit] before:p-[1px] before:bg-[length:200%_200%] before:bg-gradient-to-r before:from-accent-gradient-from before:via-accent-gradient-via before:to-accent-gradient-to before:animate-[gradient-rotate_3s_ease_infinite] motion-reduce:before:animate-none before:-z-10 before:blur-[2px] shadow-[0_0_15px_color-mix(in_oklch,var(--primary)_20%,transparent)] text-sm cursor-pointer',\n states: {\n hover: 'hover:shadow-[0_0_25px_color-mix(in_oklch,var(--primary)_35%,transparent)]',\n active: 'active:scale-[0.98]',\n focus: FOCUS_RING_OFFSET,\n disabled: interactiveDisabled,\n invalid: interactiveInvalid,\n },\n sizes: interactiveSizes,\n motion: {\n transition: 'transition-[shadow,transform] duration-[var(--motion-duration-fast)] ease-[var(--motion-easing-default)] motion-reduce:transition-none',\n },\n }),\n};\n\n// ============================================================\n// SURFACE — Cards, dialogs, popovers, dropdowns\n// SURFACE PERSONALITY — clean SaaS material hierarchy: cards are bordered\n// elevated panels, tab panels are attached but quiet, shell is chromaless,\n// transient notifications reuse overlay chrome at a smaller scale.\n// ============================================================\n\nconst surface: ComponentStyleTheme['surface'] = {\n [SurfaceVariant.BASE]: recipe({\n // Card / panel — anchor of the surface scale at `rounded-xl`.\n base: \"bg-surface-raised text-surface-raised-foreground rounded-xl border shadow-sm\",\n }),\n\n [SurfaceVariant.CARD]: recipe({\n // Content card — the elevated `surface-raised` fill + border + soft shadow,\n // ALWAYS painted so an explicitly-authored CARD section reads as a card in\n // every context (including inside a dialog/page). Mirrors BASE, the anchor\n // card surface; the section preset adds container padding.\n base: \"bg-surface-raised text-surface-raised-foreground rounded-xl border shadow-sm\",\n }),\n\n [SurfaceVariant.RAISED]: recipe({\n // Popover / dropdown — floats above the page, gets a slightly tighter\n // radius than BASE to feel \"cut from\" the larger card surface (one tier\n // smaller, never two; previously `rounded-md` was visibly inconsistent\n // when popovers stacked next to cards).\n // `fill-surface-overlay` mirrors the background so SVG children that paint\n // via `fill` — notably the Tooltip's Radix arrow — inherit the body colour\n // (CSS `fill` inherits across Radix's arrow wrapper span; `background` does\n // not). Keep `fill-*` in lockstep with `bg-*` here.\n base: \"bg-surface-overlay fill-surface-overlay text-surface-overlay-foreground rounded-lg border shadow-md\",\n motion: {\n enter: MOTION.enterDirectional,\n exit: MOTION.exitFadeZoom,\n },\n }),\n\n [SurfaceVariant.OVERLAY]: recipe({\n // Dialog / sheet — the heaviest, most modal surface; matches BASE radius\n // so a dialog reads as a \"card the user can act inside\" rather than a\n // smaller-cornered floating panel. Required to restore monotonicity\n // (BASE ≤ OVERLAY) — `rounded-lg` here was visually demoting dialogs.\n // The edge is `border-strong` (#1322): in the dark theme `shadow-lg` is invisible against a dark\n // page, so the border is what separates a modal from what it covers. Popovers and toasts keep\n // `--border` — they are anchored to a trigger, and a heavy edge on every menu reads as noise.\n base: \"bg-surface-overlay text-surface-overlay-foreground rounded-xl border border-border-strong shadow-lg\",\n motion: {\n enter: MOTION.enterFadeZoom,\n exit: MOTION.exitFadeZoom,\n },\n }),\n\n [SurfaceVariant.INSET]: recipe({\n base: \"bg-surface-inset text-surface-inset-foreground\",\n }),\n\n [SurfaceVariant.SUNKEN]: recipe({\n base: \"bg-surface-sunken text-surface-sunken-foreground\",\n }),\n\n [SurfaceVariant.TAB_PANEL]: recipe({\n // Tab panel joins to the tab strip: same visual language as BASE, but no\n // border/shadow so the surface policy can own the join.\n base: \"bg-surface-raised text-surface-raised-foreground rounded-b-xl\",\n }),\n\n [SurfaceVariant.SHELL]: recipe({\n // App/page shell: chromaless raised background. Landmark semantics remain\n // opt-in via policy config.\n base: \"bg-surface-raised text-surface-raised-foreground\",\n }),\n\n [SurfaceVariant.TRANSIENT]: recipe({\n // Toast/snackbar: compact floating card, visually between RAISED and OVERLAY.\n base: \"bg-surface-overlay text-surface-overlay-foreground rounded-lg border shadow-md\",\n motion: {\n enter: MOTION.enterDirectional,\n exit: MOTION.exitFadeZoom,\n },\n }),\n};\n\n// ============================================================\n// FORM_CONTROL — Inputs, textareas, select triggers\n// ============================================================\n\nconst formControl: Record<FormControlVariant, UIBehaviorRecipe> = {\n [FormControlVariant.DEFAULT]: recipe({\n /*\n * The edge is `border-strong` (#1322). An empty text input has no content to identify it — its\n * border IS the control — so that border owes 3:1 against the page, and the hairline `--border`\n * gives about 1.5:1 in both themes. The same holds for UNDERLINED's rule and for an unchecked\n * CHECKBOX below. FILLED carries the same edge as its bottom indicator line; see its own recipe.\n * spec-cite: Understanding WCAG 2.1 SC 1.4.11 — \"Where a text-input has a visual indicator to show\n * it is an input, such as a bottom border (#767676), that indicator must meet 3:1 contrast ratio.\"\n * https://www.w3.org/WAI/WCAG21/Understanding/non-text-contrast.html\n */\n base: \"border-border-strong dark:bg-surface-inset/30 rounded-lg border bg-transparent shadow-xs text-base md:text-sm placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground\",\n states: {\n focus: FOCUS_RING_OFFSET_WITH_BORDER,\n disabled: \"disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-[var(--opacity-disabled)]\",\n invalid: \"aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n },\n sizes: {\n md: \"h-9 px-3 py-1 pointer-coarse:min-h-11\",\n sm: \"h-8 px-2 py-1 text-sm pointer-coarse:min-h-11\",\n lg: \"h-10 px-4 py-2 pointer-coarse:min-h-11\",\n },\n motion: { transition: MOTION.formControl },\n }),\n\n [FormControlVariant.FILLED]: recipe({\n /*\n * A FILL is not an input's indicator: `bg-muted` sits at about 1.3:1 against the page on the\n * default palette, so a filled field with `border-0` was an input nothing marked as one — and\n * its `invalid` state sets a BORDER colour, which a borderless field could not show at all.\n * The filled-field convention answers both: the fill, plus an indicator line along the bottom at\n * the strong edge, with the top corners rounded and the bottom square so the line runs straight.\n * spec-cite: Understanding WCAG 2.1 SC 1.4.11 — \"Where a text-input has a visual indicator to show\n * it is an input, such as a bottom border (#767676), that indicator must meet 3:1 contrast ratio.\"\n * https://www.w3.org/WAI/WCAG21/Understanding/non-text-contrast.html\n */\n base: \"bg-muted rounded-t-lg rounded-b-none border-0 border-b border-border-strong text-base md:text-sm placeholder:text-muted-foreground\",\n states: {\n focus: FOCUS_RING_OFFSET,\n disabled: \"disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-[var(--opacity-disabled)]\",\n invalid: \"aria-invalid:ring-destructive/20 aria-invalid:border-destructive\",\n },\n sizes: {\n md: \"h-9 px-3 py-1 pointer-coarse:min-h-11\",\n sm: \"h-8 px-2 py-1 text-sm pointer-coarse:min-h-11\",\n lg: \"h-10 px-4 py-2 pointer-coarse:min-h-11\",\n },\n motion: { transition: MOTION.formControl },\n }),\n\n [FormControlVariant.UNDERLINED]: recipe({\n base: \"bg-transparent border-0 border-b border-border-strong rounded-none text-base md:text-sm placeholder:text-muted-foreground\",\n states: {\n focus: \"focus-visible:border-ring focus-visible:border-b-2\",\n disabled: \"disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-[var(--opacity-disabled)]\",\n invalid: \"aria-invalid:border-destructive\",\n },\n sizes: {\n md: \"h-9 px-0 py-1 pointer-coarse:min-h-11\",\n sm: \"h-8 px-0 py-1 text-sm pointer-coarse:min-h-11\",\n lg: \"h-10 px-0 py-2 pointer-coarse:min-h-11\",\n },\n motion: { transition: \"transition-[border-color] duration-[var(--motion-duration-fast)] ease-[var(--motion-easing-default)] motion-reduce:transition-none\" },\n }),\n\n [FormControlVariant.CHECKBOX]: recipe({\n base: \"border-border-strong dark:bg-input/30 border shadow-xs\",\n states: {\n focus: FOCUS_RING_OFFSET_WITH_BORDER,\n selected: \"data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground data-[state=checked]:border-primary dark:data-[state=checked]:bg-primary\",\n disabled: \"disabled:cursor-not-allowed disabled:opacity-[var(--opacity-disabled)]\",\n invalid: \"aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n },\n motion: { transition: \"transition-[color,box-shadow] duration-[var(--motion-duration-fast)] ease-[var(--motion-easing-default)] motion-reduce:transition-none\" },\n }),\n\n [FormControlVariant.SWITCH]: recipe({\n base: \"data-[state=unchecked]:bg-input dark:data-[state=unchecked]:bg-input/80 border border-transparent shadow-xs\",\n states: {\n focus: FOCUS_RING_OFFSET_WITH_BORDER,\n selected: \"data-[state=checked]:bg-primary\",\n disabled: \"disabled:cursor-not-allowed disabled:opacity-[var(--opacity-disabled)]\",\n invalid: \"aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n },\n motion: { transition: \"transition-[background-color,border-color,box-shadow] duration-[var(--motion-duration-fast)] ease-[var(--motion-easing-default)] motion-reduce:transition-none\" },\n }),\n};\n\n// ============================================================\n// INDICATOR — Badges, alerts, toast severity\n// ============================================================\n\nconst indicatorShared = {\n states: {\n hover: \"[a&]:hover:opacity-[var(--opacity-hover)]\",\n focus: `focus-visible:border-ring ${FOCUS_RING_COMPACT}`,\n invalid: interactiveInvalid,\n },\n // `attention` = the theme-owned notification pulse (applied by NotificationIndicator\n // when a badge definition declares a pulse trigger). Reduced-motion safe.\n motion: { transition: MOTION.interactive, attention: \"animate-pulse motion-reduce:animate-none\" },\n};\n\n// TONAL badges (T1 + T1b) — tinted background + AA-contrast text + hairline\n// border, in place of the previous solid full-saturation fills. Reads calmer\n// and modern (Linear/Stripe/shadcn) and lets many status chips coexist on one\n// row without the \"wall of solid colour\" effect.\n//\n// The tint (`bg-{status}-subtle`) and text (`text-{status}-subtle-foreground`)\n// come from dedicated SUBTLE STATUS TOKENS (T1b), not per-recipe `/10` mixes.\n// Those tokens are palette-adaptive `color-mix()` formulas emitted by the design\n// -token CSS generator (`design-tokens-css.shared.ts` → `buildSubtleStatusColors`),\n// tuned so 12px badge text clears WCAG-AA (≥4.5) against its tint in BOTH light\n// and dark — including the amber WARNING case that fails contrast with a naive\n// same-hue text. Because the tokens reference the base `--{status}` vars, a\n// palette retune (or a light/dark switch) retunes the chip automatically, and a\n// tenant can override any pair via `DesignSystemToken.*_SUBTLE(_FOREGROUND)`.\n// The border stays on the palette base (`border-{status}/25`, `/30` for warning\n// where the base is lighter) so it tracks the same hue.\nconst indicator: Record<IndicatorVariant, UIBehaviorRecipe> = {\n [IndicatorVariant.NEUTRAL]: recipe({\n // Tonal like the other four: `bg-neutral-subtle` mirrors the muted tint, but\n // `text-neutral-subtle-foreground` is a foreground-biased mix tuned to clear\n // WCAG-AA on that tint. Previously `text-muted-foreground` (tuned for the page\n // background, not the raised muted tint) rendered a washed-out, sub-AA grey\n // chip for every `default`/`secondary`/`outline` enum value.\n base: \"bg-neutral-subtle text-neutral-subtle-foreground border-border rounded-md border px-2 py-0.5 text-xs font-medium\",\n ...indicatorShared,\n }),\n [IndicatorVariant.INFO]: recipe({\n base: \"bg-info-subtle text-info-subtle-foreground border-info/25 rounded-md border px-2 py-0.5 text-xs font-medium\",\n ...indicatorShared,\n }),\n [IndicatorVariant.SUCCESS]: recipe({\n base: \"bg-success-subtle text-success-subtle-foreground border-success/25 rounded-md border px-2 py-0.5 text-xs font-medium\",\n ...indicatorShared,\n }),\n [IndicatorVariant.WARNING]: recipe({\n base: \"bg-warning-subtle text-warning-subtle-foreground border-warning/30 rounded-md border px-2 py-0.5 text-xs font-medium\",\n ...indicatorShared,\n }),\n [IndicatorVariant.ERROR]: recipe({\n base: \"bg-destructive-subtle text-destructive-subtle-foreground border-destructive/25 rounded-md border px-2 py-0.5 text-xs font-medium\",\n ...indicatorShared,\n }),\n};\n\n// ============================================================\n// SELECTABLE — Tabs, sidebar active items, toggles\n// ============================================================\n\nconst selectable: Record<SelectableVariant, UIBehaviorRecipe> = {\n [SelectableVariant.FILLED]: recipe({\n base: \"rounded-md text-sm outline-hidden ring-surface-sunken-border\",\n states: {\n hover: \"hover:bg-surface-sunken-accent hover:text-surface-sunken-foreground\",\n focus: \"focus-visible:ring-2\",\n active: \"active:bg-surface-sunken-accent active:text-surface-sunken-foreground\",\n // `font-semibold` (not medium): the selected item is the \"you are here\"\n // anchor — WEIGHT carries the emphasis instead of a primary tint, and\n // medium is too close to the regular weight to read at sidebar sizes.\n selected: \"data-[active=true]:bg-surface-sunken-accent data-[active=true]:font-semibold data-[active=true]:text-surface-sunken-foreground data-[state=active]:bg-surface-sunken-accent data-[state=active]:text-surface-sunken-foreground\",\n disabled: \"disabled:pointer-events-none disabled:opacity-[var(--opacity-disabled)] aria-disabled:pointer-events-none aria-disabled:opacity-[var(--opacity-disabled)]\",\n },\n sizes: {\n sm: \"h-7 text-xs\",\n md: \"h-8 text-sm\",\n lg: \"h-12 text-sm\",\n },\n motion: { transition: MOTION.selectable },\n }),\n\n [SelectableVariant.UNDERLINE]: recipe({\n base: \"rounded-none border-b-2 border-transparent text-sm outline-hidden\",\n states: {\n hover: \"hover:text-foreground\",\n focus: FOCUS_RING_COMPACT,\n selected: \"data-[state=active]:border-primary data-[state=active]:text-foreground\",\n disabled: \"disabled:pointer-events-none disabled:opacity-[var(--opacity-disabled)]\",\n },\n sizes: {\n sm: \"h-7 text-xs pb-1\",\n md: \"h-8 text-sm pb-2\",\n lg: \"h-10 text-sm pb-3\",\n },\n motion: { transition: MOTION.selectable },\n }),\n\n [SelectableVariant.PILL]: recipe({\n base: \"rounded-full text-sm outline-hidden\",\n states: {\n hover: \"hover:bg-accent hover:text-accent-foreground\",\n focus: FOCUS_RING_COMPACT,\n selected: \"data-[state=active]:bg-primary data-[state=active]:text-primary-foreground\",\n disabled: \"disabled:pointer-events-none disabled:opacity-[var(--opacity-disabled)]\",\n },\n sizes: {\n sm: \"h-7 px-3 text-xs\",\n md: \"h-8 px-4 text-sm\",\n lg: \"h-10 px-5 text-sm\",\n },\n motion: { transition: MOTION.selectable },\n }),\n\n [SelectableVariant.INDICATOR]: recipe({\n base: \"rounded-md text-sm outline-hidden\",\n states: {\n hover: \"hover:bg-surface-sunken-accent hover:text-surface-sunken-foreground\",\n focus: FOCUS_RING_COMPACT,\n // Same weight semantics as FILLED: selected = semibold (see note there).\n selected: \"data-[active=true]:border-s-2 data-[active=true]:border-surface-sunken-primary data-[active=true]:font-semibold data-[active=true]:text-surface-sunken-foreground\",\n disabled: \"disabled:pointer-events-none disabled:opacity-[var(--opacity-disabled)]\",\n },\n sizes: {\n sm: \"h-7 text-xs\",\n md: \"h-8 text-sm\",\n lg: \"h-12 text-sm\",\n },\n motion: { transition: MOTION.selectable },\n }),\n};\n\n// ============================================================\n// OVERLAY_BACKDROP — Dialog/Sheet background overlay\n// ============================================================\n\nconst overlayBackdrop: UIBehaviorRecipe = recipe({\n // Tailwind v4's `bg-color/[var()]` opacity modifier uses color-mix() which\n // doesn't resolve CSS custom property decimals correctly.\n // Use arbitrary bg value with rgb() alpha channel instead.\n base: \"bg-[rgb(0_0_0_/_var(--opacity-overlay))] backdrop-blur-sm\",\n motion: {\n enter: MOTION.backdropEnter,\n exit: MOTION.backdropExit,\n },\n});\n\n// ============================================================\n// DIVIDER — Separator\n// ============================================================\n\nconst divider: Record<DividerVariant, UIBehaviorRecipe> = {\n [DividerVariant.DEFAULT]: recipe({\n base: \"bg-border shrink-0\",\n }),\n [DividerVariant.NESTING_GUIDE]: recipe({\n // Nested-disclosure guide: a hairline left edge in the standard border color. LOOK only —\n // the indent beside it is structure and belongs to the component that nests (the accordion\n // preset adds `pl-field`). A theme wanting a heavier, tinted or dashed depth cue changes it here.\n base: \"border-s border-border\",\n }),\n};\n\n// ============================================================\n// SKELETON — Loading placeholders\n// ============================================================\n\nconst skeleton: UIBehaviorRecipe = recipe({\n base: `${SKELETON_NEUTRAL_TINT} animate-pulse rounded-md motion-reduce:animate-none`,\n});\n\nconst loadingSpinner: UIBehaviorRecipe = recipe({\n base: \"text-muted-foreground animate-spin motion-reduce:animate-none\",\n});\n\nconst loadingOverlay: UIBehaviorRecipe = recipe({\n base: \"bg-background/80\",\n motion: {\n enter: \"animate-in fade-in-0 duration-[var(--motion-duration-fast)] ease-[var(--motion-easing-enter)] motion-reduce:animate-none\",\n exit: \"animate-out fade-out-0 duration-[var(--motion-duration-fast)] ease-[var(--motion-easing-exit)] motion-reduce:animate-none\",\n },\n});\n\n// ============================================================\n// TYPOGRAPHY — Text hierarchy\n// ============================================================\n\nconst typography: Record<TypographyVariant, UIBehaviorRecipe> = {\n [TypographyVariant.HEADING]: recipe({\n base: \"font-semibold leading-none tracking-tight\",\n // Heading scale rebalance — gaps were 12/4/2px (h1→h2→h3→h4); h1 at\n // text-4xl (36px) jumped 1.5× to h2 (text-2xl, 24px), which felt\n // disproportionate for in-app SaaS UI (text-4xl is a hero size).\n // Compressing h1 to text-3xl yields a smooth 6/4/2px ladder\n // (1.25× → 1.2× → 1.11×, classic Major Third base). Pages that want a\n // hero h1 can opt in with `className=\"text-4xl sm:text-5xl\"` since the\n // size class is the LAST `text-*` to win in `cn()`.\n sizes: {\n h1: \"text-3xl\",\n h2: \"text-2xl\",\n h3: \"text-xl\",\n h4: \"text-lg\",\n h5: \"text-base\",\n md: \"text-lg\",\n },\n }),\n [TypographyVariant.BODY]: recipe({\n base: \"text-foreground text-sm\",\n sizes: { sm: \"text-xs\", md: \"text-sm\", lg: \"text-base\" },\n }),\n [TypographyVariant.LABEL]: recipe({\n base: \"font-medium text-sm leading-none\",\n sizes: { sm: \"text-xs\", md: \"text-sm\", lg: \"text-base\" },\n }),\n [TypographyVariant.DESCRIPTION]: recipe({\n base: \"text-muted-foreground text-sm\",\n sizes: { sm: \"text-xs\", md: \"text-sm\" },\n }),\n [TypographyVariant.EYEBROW]: recipe({\n base: \"text-foreground-subtle text-2xs font-medium uppercase tracking-wide\",\n sizes: { sm: \"text-2xs\", md: \"text-xs\" },\n }),\n [TypographyVariant.CODE]: recipe({\n base: \"font-mono text-sm bg-muted rounded px-1 py-0.5\",\n sizes: { sm: \"text-xs\", md: \"text-sm\", lg: \"text-base\" },\n }),\n};\n\n// ============================================================\n// DEFAULT THEME — assembled\n//\n// Spacing: the default theme intentionally omits `spacing` overrides.\n// It uses the application-level defaults from DesignSystemConfiguration:\n// element: 0.5rem | item: 0.25rem | group: 0.75rem | field: 1rem\n// section: 1.5rem | region: 2rem | card: 1rem | container: 1.5rem\n// ============================================================\n\nexport const defaultTheme: ComponentStyleTheme = {\n id: 'default',\n name: 'Default',\n description: 'Clean modern SaaS, derived from shadcn/ui (NOT Material Design 3). Soft shadow ladder (xs/sm/md/lg); radius ladder control lg(8) · popover lg · card/dialog xl(12); accessible focus rings; fast/default motion tokens. Tonal status badges (tinted bg + AA-contrast text + hairline, light & dark) instead of solid fills. Tactile buttons (hairline edge + shadow-sm + active press) on the elevated variants.',\n\n // spacing: omitted — uses application-level defaults (see DesignSystemToken.SPACING_*)\n\n interactive,\n surface,\n formControl,\n indicator,\n selectable,\n overlayBackdrop,\n divider,\n skeleton,\n loadingSpinner,\n loadingOverlay,\n typography,\n radius: undefined,\n backgroundLayer: undefined,\n chartStyle: DEFAULT_CHART_STYLE_PRESET,\n};\n"]}
@@ -1,7 +1,7 @@
1
1
  import { z } from 'zod';
2
2
  import { ViewportBreakpoint } from '@wildo-ai/zod-decorators';
3
3
  import { SidebarResponsivePolicy } from '../../core/config/launcher-items.frontend.schemas';
4
- import { HorizontalPlacement, VerticalPlacement } from '@wildo-ai/presets-components-models';
4
+ import { HorizontalPlacement } from '@wildo-ai/presets-components-models';
5
5
  export declare const UIConfigurationSchema: z.ZodObject<{
6
6
  currentBreakpoint: z.ZodEnum<typeof ViewportBreakpoint>;
7
7
  navigationLayout: z.ZodObject<{
@@ -18,7 +18,6 @@ export declare const UIConfigurationSchema: z.ZodObject<{
18
18
  ephemeral?: boolean;
19
19
  }>>, unknown>>;
20
20
  appearance: z.ZodOptional<z.ZodObject<{
21
- split: z.ZodOptional<z.ZodUnion<readonly [z.ZodEnum<typeof import("@wildo-ai/saas-models").SplitAppearance>, z.ZodRecord<z.ZodEnum<typeof ViewportBreakpoint> & z.core.$partial, z.ZodEnum<typeof import("@wildo-ai/saas-models").SplitAppearance>>]>>;
22
21
  overlay: z.ZodOptional<z.ZodUnion<readonly [z.ZodEnum<typeof import("@wildo-ai/saas-models").OverlayAppearance>, z.ZodRecord<z.ZodEnum<typeof ViewportBreakpoint> & z.core.$partial, z.ZodEnum<typeof import("@wildo-ai/saas-models").OverlayAppearance>>]>>;
23
22
  }, z.core.$strip>>;
24
23
  minWidth: z.ZodOptional<z.ZodNumber>;
@@ -38,7 +37,6 @@ export declare const UIConfigurationSchema: z.ZodObject<{
38
37
  ephemeral?: boolean;
39
38
  }>>, unknown>>;
40
39
  appearance: z.ZodOptional<z.ZodObject<{
41
- split: z.ZodOptional<z.ZodUnion<readonly [z.ZodEnum<typeof import("@wildo-ai/saas-models").SplitAppearance>, z.ZodRecord<z.ZodEnum<typeof ViewportBreakpoint> & z.core.$partial, z.ZodEnum<typeof import("@wildo-ai/saas-models").SplitAppearance>>]>>;
42
40
  overlay: z.ZodOptional<z.ZodUnion<readonly [z.ZodEnum<typeof import("@wildo-ai/saas-models").OverlayAppearance>, z.ZodRecord<z.ZodEnum<typeof ViewportBreakpoint> & z.core.$partial, z.ZodEnum<typeof import("@wildo-ai/saas-models").OverlayAppearance>>]>>;
43
41
  }, z.core.$strip>>;
44
42
  minWidth: z.ZodOptional<z.ZodNumber>;
@@ -58,7 +56,6 @@ export declare const UIConfigurationSchema: z.ZodObject<{
58
56
  ephemeral?: boolean;
59
57
  }>>, unknown>>;
60
58
  appearance: z.ZodOptional<z.ZodObject<{
61
- split: z.ZodOptional<z.ZodUnion<readonly [z.ZodEnum<typeof import("@wildo-ai/saas-models").SplitAppearance>, z.ZodRecord<z.ZodEnum<typeof ViewportBreakpoint> & z.core.$partial, z.ZodEnum<typeof import("@wildo-ai/saas-models").SplitAppearance>>]>>;
62
59
  overlay: z.ZodOptional<z.ZodUnion<readonly [z.ZodEnum<typeof import("@wildo-ai/saas-models").OverlayAppearance>, z.ZodRecord<z.ZodEnum<typeof ViewportBreakpoint> & z.core.$partial, z.ZodEnum<typeof import("@wildo-ai/saas-models").OverlayAppearance>>]>>;
63
60
  }, z.core.$strip>>;
64
61
  minWidth: z.ZodOptional<z.ZodNumber>;
@@ -78,7 +75,6 @@ export declare const UIConfigurationSchema: z.ZodObject<{
78
75
  ephemeral?: boolean;
79
76
  }>>, unknown>>;
80
77
  appearance: z.ZodOptional<z.ZodObject<{
81
- split: z.ZodOptional<z.ZodUnion<readonly [z.ZodEnum<typeof import("@wildo-ai/saas-models").SplitAppearance>, z.ZodRecord<z.ZodEnum<typeof ViewportBreakpoint> & z.core.$partial, z.ZodEnum<typeof import("@wildo-ai/saas-models").SplitAppearance>>]>>;
82
78
  overlay: z.ZodOptional<z.ZodUnion<readonly [z.ZodEnum<typeof import("@wildo-ai/saas-models").OverlayAppearance>, z.ZodRecord<z.ZodEnum<typeof ViewportBreakpoint> & z.core.$partial, z.ZodEnum<typeof import("@wildo-ai/saas-models").OverlayAppearance>>]>>;
83
79
  }, z.core.$strip>>;
84
80
  }, z.core.$strip>>;
@@ -167,6 +163,7 @@ export declare const UIConfigurationSchema: z.ZodObject<{
167
163
  runtimeAvailability: z.ZodOptional<z.ZodObject<{
168
164
  requiredCapabilities: z.ZodOptional<z.ZodArray<z.ZodString>>;
169
165
  }, z.core.$strip>>;
166
+ notificationBadgeRef: z.ZodOptional<z.ZodString>;
170
167
  }, z.core.$strip>>>>;
171
168
  brandHeader: z.ZodOptional<z.ZodBoolean>;
172
169
  brandMarkTheme: z.ZodOptional<z.ZodEnum<typeof import("@wildo-ai/saas-models").BrandAssetTheme>>;
@@ -345,7 +342,10 @@ export declare const UIConfigurationSchema: z.ZodObject<{
345
342
  }, z.core.$strip>>;
346
343
  }, z.core.$strip>>>>;
347
344
  }, z.core.$strip>]>>;
348
- status_bar: z.ZodUnion<readonly [z.ZodBoolean, z.ZodEnum<typeof VerticalPlacement>]>;
345
+ status_bar: z.ZodUnion<readonly [z.ZodBoolean, z.ZodEnum<{
346
+ top: import("@wildo-ai/presets-components-models").VerticalPlacement.TOP;
347
+ bottom: import("@wildo-ai/presets-components-models").VerticalPlacement.BOTTOM;
348
+ }>]>;
349
349
  user_dropdown: z.ZodDefault<z.ZodUnion<readonly [z.ZodDefault<z.ZodBoolean>, z.ZodObject<{
350
350
  avatarDisplay: z.ZodDefault<z.ZodEnum<typeof import("../../core/config/app-configuration-frontend.schemas").UserDropdownAvatarDisplay>>;
351
351
  sections: z.ZodOptional<z.ZodArray<z.ZodEnum<typeof import("../../core/config/app-configuration-frontend.schemas").UserDropdownSection>>>;
@@ -1 +1 @@
1
- {"version":3,"file":"ui.frontend.schemas.d.ts","sourceRoot":"","sources":["../../../../../src/core/ui/ui.frontend.schemas.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAG9D,OAAO,EAAE,uBAAuB,EAAE,MAAM,iEAAiE,CAAC;AAC1G,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AAyC7F,eAAO,MAAM,qBAAqB;;;;;;;;8BAa005B,CAAC;6BAAoC,CAAC;;;8BAAyM,CAAC;6BAAoC,CAAC;;;;;;;;;;;;;;;8BAA2uC,CAAC;6BAAoC,CAAC;;;8BAAyM,CAAC;6BAAoC,CAAC;;;;;;;;;;;;;;;8BAA4uC,CAAC;6BAAoC,CAAC;;;8BAAyM,CAAC;6BAAoC,CAAC;;;;;;;;;;;;;;;0BAA4pC,CAAC;yBAAgC,CAAC;;;0BAA6L,CAAC;yBAAgC,CAAC;;;;;;;;;;0BAAouB,CAAC;yBAAgC,CAAC;;;0BAA6L,CAAC;yBAAgC,CAAC;;;;;;;;;;;;;;;;;0BAAk2B,CAAC;yBAAgC,CAAC;;;0BAA6L,CAAC;yBAAgC,CAAC;;;;;;0BAAmR,CAAC;yBAAgC,CAAC;;;0BAA6L,CAAC;yBAAgC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAJznoC,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC"}
1
+ {"version":3,"file":"ui.frontend.schemas.d.ts","sourceRoot":"","sources":["../../../../../src/core/ui/ui.frontend.schemas.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAG9D,OAAO,EAAE,uBAAuB,EAAE,MAAM,iEAAiE,CAAC;AAC1G,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAyC1E,eAAO,MAAM,qBAAqB;;;;;;;;8BAas/3B,CAAC;6BAAoC,CAAC;;;8BAAyM,CAAC;6BAAoC,CAAC;;;;;;;;;;;;;;8BAAmiC,CAAC;6BAAoC,CAAC;;;8BAAyM,CAAC;6BAAoC,CAAC;;;;;;;;;;;;;;8BAAoiC,CAAC;6BAAoC,CAAC;;;8BAAyM,CAAC;6BAAoC,CAAC;;;;;;;;;;;;;;0BAAo9B,CAAC;yBAAgC,CAAC;;;0BAA6L,CAAC;yBAAgC,CAAC;;;;;;;;;0BAAgiB,CAAC;yBAAgC,CAAC;;;0BAA6L,CAAC;yBAAgC,CAAC;;;;;;;;;;;;;;;;;0BAAk2B,CAAC;yBAAgC,CAAC;;;0BAA6L,CAAC;yBAAgC,CAAC;;;;;;0BAAmR,CAAC;yBAAgC,CAAC;;;0BAA6L,CAAC;yBAAgC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAJzglC,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC"}