@wildo-ai/presets-components 1.1.5 → 1.1.7

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 (189) hide show
  1. package/dist/esm/.native.tsbuildinfo +1 -0
  2. package/dist/esm/components/actions/action-bar.d.ts.map +1 -1
  3. package/dist/esm/components/actions/action-bar.js +5 -2
  4. package/dist/esm/components/actions/action-bar.js.map +1 -1
  5. package/dist/esm/components/ai-elements/chat/suggestion.d.ts.map +1 -1
  6. package/dist/esm/components/ai-elements/chat/suggestion.js +8 -1
  7. package/dist/esm/components/ai-elements/chat/suggestion.js.map +1 -1
  8. package/dist/esm/components/ai-elements/decision/approval.d.ts +108 -13
  9. package/dist/esm/components/ai-elements/decision/approval.d.ts.map +1 -1
  10. package/dist/esm/components/ai-elements/decision/approval.js +60 -10
  11. package/dist/esm/components/ai-elements/decision/approval.js.map +1 -1
  12. package/dist/esm/components/ai-elements/graph/graph-runtime.d.ts +3 -1
  13. package/dist/esm/components/ai-elements/graph/graph-runtime.d.ts.map +1 -1
  14. package/dist/esm/components/ai-elements/graph/graph-runtime.js +3 -1
  15. package/dist/esm/components/ai-elements/graph/graph-runtime.js.map +1 -1
  16. package/dist/esm/components/app/app-layout-main-container.d.ts +9 -0
  17. package/dist/esm/components/app/app-layout-main-container.d.ts.map +1 -1
  18. package/dist/esm/components/app/app-layout-main-container.js +17 -23
  19. package/dist/esm/components/app/app-layout-main-container.js.map +1 -1
  20. package/dist/esm/components/app/app-layout-main-container.labels.d.ts.map +1 -1
  21. package/dist/esm/components/app/app-layout-main-container.labels.js +27 -0
  22. package/dist/esm/components/app/app-layout-main-container.labels.js.map +1 -1
  23. package/dist/esm/components/billing/billing-plan-change-preview.d.ts.map +1 -1
  24. package/dist/esm/components/billing/billing-plan-change-preview.js +5 -2
  25. package/dist/esm/components/billing/billing-plan-change-preview.js.map +1 -1
  26. package/dist/esm/components/billing/billing-plan-change-preview.labels.d.ts.map +1 -1
  27. package/dist/esm/components/billing/billing-plan-change-preview.labels.js +3 -0
  28. package/dist/esm/components/billing/billing-plan-change-preview.labels.js.map +1 -1
  29. package/dist/esm/components/billing/billing-pricing-table.d.ts +1 -1
  30. package/dist/esm/components/billing/billing-pricing-table.d.ts.map +1 -1
  31. package/dist/esm/components/billing/billing-pricing-table.js +8 -4
  32. package/dist/esm/components/billing/billing-pricing-table.js.map +1 -1
  33. package/dist/esm/components/billing/billing-pricing-table.labels.d.ts.map +1 -1
  34. package/dist/esm/components/billing/billing-pricing-table.labels.js +7 -1
  35. package/dist/esm/components/billing/billing-pricing-table.labels.js.map +1 -1
  36. package/dist/esm/components/billing/billing-usage-dashboard.d.ts.map +1 -1
  37. package/dist/esm/components/billing/billing-usage-dashboard.js +6 -3
  38. package/dist/esm/components/billing/billing-usage-dashboard.js.map +1 -1
  39. package/dist/esm/components/billing/billing-usage-dashboard.labels.d.ts.map +1 -1
  40. package/dist/esm/components/billing/billing-usage-dashboard.labels.js +2 -1
  41. package/dist/esm/components/billing/billing-usage-dashboard.labels.js.map +1 -1
  42. package/dist/esm/components/data-display/formatters/display-field-enum.d.ts.map +1 -1
  43. package/dist/esm/components/data-display/formatters/display-field-enum.js +18 -4
  44. package/dist/esm/components/data-display/formatters/display-field-enum.js.map +1 -1
  45. package/dist/esm/components/data-display/formatters/display-field-file.d.ts.map +1 -1
  46. package/dist/esm/components/data-display/formatters/display-field-file.js +13 -14
  47. package/dist/esm/components/data-display/formatters/display-field-file.js.map +1 -1
  48. package/dist/esm/components/data-display/formatters/display-field-file.labels.d.ts.map +1 -1
  49. package/dist/esm/components/data-display/formatters/display-field-file.labels.js +1 -0
  50. package/dist/esm/components/data-display/formatters/display-field-file.labels.js.map +1 -1
  51. package/dist/esm/components/data-display/formatters/display-field-number.d.ts.map +1 -1
  52. package/dist/esm/components/data-display/formatters/display-field-number.js +6 -1
  53. package/dist/esm/components/data-display/formatters/display-field-number.js.map +1 -1
  54. package/dist/esm/components/data-display/formatters/display-field-number.labels.d.ts.map +1 -1
  55. package/dist/esm/components/data-display/formatters/display-field-number.labels.js +5 -2
  56. package/dist/esm/components/data-display/formatters/display-field-number.labels.js.map +1 -1
  57. package/dist/esm/components/data-display/formatters/display-field-string.d.ts +1 -1
  58. package/dist/esm/components/data-display/formatters/display-field-string.d.ts.map +1 -1
  59. package/dist/esm/components/data-display/formatters/display-field-string.js +51 -12
  60. package/dist/esm/components/data-display/formatters/display-field-string.js.map +1 -1
  61. package/dist/esm/components/data-display/untrusted-html-content.d.ts +55 -0
  62. package/dist/esm/components/data-display/untrusted-html-content.d.ts.map +1 -0
  63. package/dist/esm/components/data-display/untrusted-html-content.js +67 -0
  64. package/dist/esm/components/data-display/untrusted-html-content.js.map +1 -0
  65. package/dist/esm/components/form/chromes/form-primitive.labels.d.ts.map +1 -1
  66. package/dist/esm/components/form/chromes/form-primitive.labels.js +9 -0
  67. package/dist/esm/components/form/chromes/form-primitive.labels.js.map +1 -1
  68. package/dist/esm/components/form/combobox.d.ts.map +1 -1
  69. package/dist/esm/components/form/combobox.js +10 -10
  70. package/dist/esm/components/form/combobox.js.map +1 -1
  71. package/dist/esm/components/form/controls/address/providers/google-places-address-lookup.adapter.d.ts +42 -0
  72. package/dist/esm/components/form/controls/address/providers/google-places-address-lookup.adapter.d.ts.map +1 -0
  73. package/dist/esm/components/form/controls/address/providers/google-places-address-lookup.adapter.js +120 -0
  74. package/dist/esm/components/form/controls/address/providers/google-places-address-lookup.adapter.js.map +1 -0
  75. package/dist/esm/components/form/controls/address/providers/google-places-address-lookup.d.ts +16 -0
  76. package/dist/esm/components/form/controls/address/providers/google-places-address-lookup.d.ts.map +1 -0
  77. package/dist/esm/components/form/controls/address/providers/google-places-address-lookup.js +8 -0
  78. package/dist/esm/components/form/controls/address/providers/google-places-address-lookup.js.map +1 -0
  79. package/dist/esm/components/navigation/app-level/activity-bar.d.ts.map +1 -1
  80. package/dist/esm/components/navigation/app-level/activity-bar.js +2 -2
  81. package/dist/esm/components/navigation/app-level/activity-bar.js.map +1 -1
  82. package/dist/esm/components/navigation/app-level/menu-user-org.d.ts.map +1 -1
  83. package/dist/esm/components/navigation/app-level/menu-user-org.js +10 -4
  84. package/dist/esm/components/navigation/app-level/menu-user-org.js.map +1 -1
  85. package/dist/esm/components/navigation/app-level/menu-user-org.labels.d.ts.map +1 -1
  86. package/dist/esm/components/navigation/app-level/menu-user-org.labels.js +7 -0
  87. package/dist/esm/components/navigation/app-level/menu-user-org.labels.js.map +1 -1
  88. package/dist/esm/components/navigation/app-level/menubar.d.ts.map +1 -1
  89. package/dist/esm/components/navigation/app-level/menubar.js +6 -6
  90. package/dist/esm/components/navigation/app-level/menubar.js.map +1 -1
  91. package/dist/esm/components/navigation/app-level/navigation-back.d.ts.map +1 -1
  92. package/dist/esm/components/navigation/app-level/navigation-back.js +27 -9
  93. package/dist/esm/components/navigation/app-level/navigation-back.js.map +1 -1
  94. package/dist/esm/components/navigation/app-level/sidebar.js +3 -3
  95. package/dist/esm/components/navigation/app-level/sidebar.js.map +1 -1
  96. package/dist/esm/components/navigation/app-level/status-bar.js +2 -2
  97. package/dist/esm/components/navigation/app-level/status-bar.js.map +1 -1
  98. package/dist/esm/components/navigation/app-level/toolbar.d.ts.map +1 -1
  99. package/dist/esm/components/navigation/app-level/toolbar.js +2 -2
  100. package/dist/esm/components/navigation/app-level/toolbar.js.map +1 -1
  101. package/dist/esm/components/navigation/app-level/utility-panel.js +2 -2
  102. package/dist/esm/components/navigation/app-level/utility-panel.js.map +1 -1
  103. package/dist/esm/components/navigation/breadcrumb.js +1 -1
  104. package/dist/esm/components/navigation/breadcrumb.js.map +1 -1
  105. package/dist/esm/components/sections/stepper.d.ts.map +1 -1
  106. package/dist/esm/components/sections/stepper.js +5 -3
  107. package/dist/esm/components/sections/stepper.js.map +1 -1
  108. package/dist/esm/config/preset-navigation.d.ts.map +1 -1
  109. package/dist/esm/config/preset-navigation.js +23 -2
  110. package/dist/esm/config/preset-navigation.js.map +1 -1
  111. package/dist/esm/config/resources/agent-work.resource-presets.d.ts +4 -0
  112. package/dist/esm/config/resources/agent-work.resource-presets.d.ts.map +1 -0
  113. package/dist/esm/config/resources/agent-work.resource-presets.js +115 -0
  114. package/dist/esm/config/resources/agent-work.resource-presets.js.map +1 -0
  115. package/dist/esm/config/resources/api-key-rotation-window.d.ts +22 -0
  116. package/dist/esm/config/resources/api-key-rotation-window.d.ts.map +1 -0
  117. package/dist/esm/config/resources/api-key-rotation-window.js +45 -0
  118. package/dist/esm/config/resources/api-key-rotation-window.js.map +1 -0
  119. package/dist/esm/config/resources/application.resource-presets.d.ts.map +1 -1
  120. package/dist/esm/config/resources/application.resource-presets.js +147 -61
  121. package/dist/esm/config/resources/application.resource-presets.js.map +1 -1
  122. package/dist/esm/config/resources/billing.resource-presets.d.ts +4 -3
  123. package/dist/esm/config/resources/billing.resource-presets.d.ts.map +1 -1
  124. package/dist/esm/config/resources/billing.resource-presets.js +240 -111
  125. package/dist/esm/config/resources/billing.resource-presets.js.map +1 -1
  126. package/dist/esm/config/resources/conversation-threads.resource-presets.d.ts +4 -0
  127. package/dist/esm/config/resources/conversation-threads.resource-presets.d.ts.map +1 -0
  128. package/dist/esm/config/resources/conversation-threads.resource-presets.js +105 -0
  129. package/dist/esm/config/resources/conversation-threads.resource-presets.js.map +1 -0
  130. package/dist/esm/config/resources/guidance.resource-presets.d.ts.map +1 -1
  131. package/dist/esm/config/resources/guidance.resource-presets.js +18 -11
  132. package/dist/esm/config/resources/guidance.resource-presets.js.map +1 -1
  133. package/dist/esm/config/resources/identity.resource-presets.d.ts +0 -13
  134. package/dist/esm/config/resources/identity.resource-presets.d.ts.map +1 -1
  135. package/dist/esm/config/resources/identity.resource-presets.js +48 -16
  136. package/dist/esm/config/resources/identity.resource-presets.js.map +1 -1
  137. package/dist/esm/config/resources/inbound-deliveries.resource-presets.d.ts +6 -0
  138. package/dist/esm/config/resources/inbound-deliveries.resource-presets.d.ts.map +1 -0
  139. package/dist/esm/config/resources/inbound-deliveries.resource-presets.js +112 -0
  140. package/dist/esm/config/resources/inbound-deliveries.resource-presets.js.map +1 -0
  141. package/dist/esm/config/resources/inbound-email.resource-presets.d.ts +4 -0
  142. package/dist/esm/config/resources/inbound-email.resource-presets.d.ts.map +1 -0
  143. package/dist/esm/config/resources/inbound-email.resource-presets.js +182 -0
  144. package/dist/esm/config/resources/inbound-email.resource-presets.js.map +1 -0
  145. package/dist/esm/config/resources/index.d.ts.map +1 -1
  146. package/dist/esm/config/resources/index.js +9 -2
  147. package/dist/esm/config/resources/index.js.map +1 -1
  148. package/dist/esm/config/resources/legal-holds.resource-presets.d.ts +4 -0
  149. package/dist/esm/config/resources/legal-holds.resource-presets.d.ts.map +1 -0
  150. package/dist/esm/config/resources/legal-holds.resource-presets.js +76 -0
  151. package/dist/esm/config/resources/legal-holds.resource-presets.js.map +1 -0
  152. package/dist/esm/config/resources/organizations.resource-presets.d.ts.map +1 -1
  153. package/dist/esm/config/resources/organizations.resource-presets.js +139 -36
  154. package/dist/esm/config/resources/organizations.resource-presets.js.map +1 -1
  155. package/dist/esm/config/resources/resource.config.utils.d.ts +20 -0
  156. package/dist/esm/config/resources/resource.config.utils.d.ts.map +1 -1
  157. package/dist/esm/config/resources/resource.config.utils.js +20 -0
  158. package/dist/esm/config/resources/resource.config.utils.js.map +1 -1
  159. package/dist/esm/config/resources/retention-enforcement.resource-presets.d.ts +5 -0
  160. package/dist/esm/config/resources/retention-enforcement.resource-presets.d.ts.map +1 -0
  161. package/dist/esm/config/resources/retention-enforcement.resource-presets.js +74 -0
  162. package/dist/esm/config/resources/retention-enforcement.resource-presets.js.map +1 -0
  163. package/dist/esm/config/resources/security.resource-presets.d.ts +3 -1
  164. package/dist/esm/config/resources/security.resource-presets.d.ts.map +1 -1
  165. package/dist/esm/config/resources/security.resource-presets.js +563 -133
  166. package/dist/esm/config/resources/security.resource-presets.js.map +1 -1
  167. package/dist/esm/config/resources/service-providers.resource-presets.d.ts +4 -0
  168. package/dist/esm/config/resources/service-providers.resource-presets.d.ts.map +1 -0
  169. package/dist/esm/config/resources/service-providers.resource-presets.js +321 -0
  170. package/dist/esm/config/resources/service-providers.resource-presets.js.map +1 -0
  171. package/dist/esm/config/resources/webhooks.resource-presets.d.ts +4 -3
  172. package/dist/esm/config/resources/webhooks.resource-presets.d.ts.map +1 -1
  173. package/dist/esm/config/resources/webhooks.resource-presets.js +76 -25
  174. package/dist/esm/config/resources/webhooks.resource-presets.js.map +1 -1
  175. package/dist/esm/index.d.ts +1 -0
  176. package/dist/esm/index.d.ts.map +1 -1
  177. package/dist/esm/index.js +1 -0
  178. package/dist/esm/index.js.map +1 -1
  179. package/dist/esm/registration/register-common-enums.d.ts.map +1 -1
  180. package/dist/esm/registration/register-common-enums.js +15 -0
  181. package/dist/esm/registration/register-common-enums.js.map +1 -1
  182. package/dist/esm/registration/register-provider-components.d.ts.map +1 -1
  183. package/dist/esm/registration/register-provider-components.js +6 -0
  184. package/dist/esm/registration/register-provider-components.js.map +1 -1
  185. package/dist/esm/themes/dense.theme.d.ts.map +1 -1
  186. package/dist/esm/themes/dense.theme.js +22 -2
  187. package/dist/esm/themes/dense.theme.js.map +1 -1
  188. package/dist/tsconfig.build.tsbuildinfo +1 -1
  189. package/package.json +8 -6
@@ -12,6 +12,13 @@ export const ApplicationLevelUserDropdownLabels = [
12
12
  { ref: 'switchOrganization', kind: LabelKind.LABEL, purpose: 'Label for the switch-organization action' },
13
13
  { ref: 'currentOrganization', kind: LabelKind.LABEL, purpose: 'Label marking the currently selected organization' },
14
14
  { ref: 'organizations', kind: LabelKind.HEADING, purpose: 'Section heading listing available organizations' },
15
+ { ref: 'clientOrganizations', kind: LabelKind.HEADING, purpose: 'Section heading listing the CLIENT organizations the person works in on behalf of a service firm, kept apart from their own organizations' },
16
+ {
17
+ ref: 'servedViaFirm',
18
+ kind: LabelKind.LABEL,
19
+ purpose: 'Small line under a client organization naming the service firm through which the person works there',
20
+ params: [{ key: 'firm', meaning: 'the service firm\'s name' }],
21
+ },
15
22
  { ref: 'noOrganizations', kind: LabelKind.EMPTY_STATE, purpose: 'Shown when the user belongs to no organizations' },
16
23
  { ref: 'createOrganization', kind: LabelKind.BUTTON, purpose: 'Menu action that starts creating a new organization' },
17
24
  ];
@@ -1 +1 @@
1
- {"version":3,"file":"menu-user-org.labels.js","sourceRoot":"","sources":["../../../../../../src/components/navigation/app-level/menu-user-org.labels.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,SAAS,EAET,uBAAuB,GACxB,MAAM,qCAAqC,CAAC;AAE7C,2EAA2E;AAC3E,6EAA6E;AAC7E,+EAA+E;AAE/E,MAAM,CAAC,MAAM,kCAAkC,GAA0B;IACvE,EAAE,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,qDAAqD,EAAE;IAC9G,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,wCAAwC,EAAE;IAC9F,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,oCAAoC,EAAE;IAC1F,EAAE,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,+BAA+B,EAAE;IACvF,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,uBAAuB,EAAE;IAC5E,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,qCAAqC,EAAE;IACzF,EAAE,GAAG,EAAE,oBAAoB,EAAE,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,0CAA0C,EAAE;IACzG,EAAE,GAAG,EAAE,qBAAqB,EAAE,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,mDAAmD,EAAE;IACnH,EAAE,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,iDAAiD,EAAE;IAC7G,EAAE,GAAG,EAAE,iBAAiB,EAAE,IAAI,EAAE,SAAS,CAAC,WAAW,EAAE,OAAO,EAAE,iDAAiD,EAAE;IACnH,EAAE,GAAG,EAAE,oBAAoB,EAAE,IAAI,EAAE,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,qDAAqD,EAAE;CACtH,CAAC;AACF,uBAAuB,CAAC,qBAAqB,CAAC,+BAA+B,EAAE,kCAAkC,CAAC,CAAC","sourcesContent":["import {\n FrontendComponentType,\n LabelKind,\n type LabellingUnitaryDef,\n registerComponentLabels,\n} from '@wildo-ai/presets-components-models';\n\n// Companion-only label metadata for this component: keys + params + (where\n// authored) per-key purpose / kind / variable meaning. Statically scanned by\n// the dev companion; NOT imported at runtime, so it never ships in the bundle.\n\nexport const ApplicationLevelUserDropdownLabels: LabellingUnitaryDef[] = [\n { ref: 'userMenuLabel', kind: LabelKind.ARIA, purpose: 'Screen-reader name for the user-menu trigger button' },\n { ref: 'myAccount', kind: LabelKind.LABEL, purpose: 'Menu link to the user account overview' },\n { ref: 'myProfile', kind: LabelKind.LABEL, purpose: 'Menu link to the user profile page' },\n { ref: 'preferences', kind: LabelKind.LABEL, purpose: 'Menu link to user preferences' },\n { ref: 'settings', kind: LabelKind.LABEL, purpose: 'Menu link to settings' },\n { ref: 'logout', kind: LabelKind.BUTTON, purpose: 'Menu action that signs the user out' },\n { ref: 'switchOrganization', kind: LabelKind.LABEL, purpose: 'Label for the switch-organization action' },\n { ref: 'currentOrganization', kind: LabelKind.LABEL, purpose: 'Label marking the currently selected organization' },\n { ref: 'organizations', kind: LabelKind.HEADING, purpose: 'Section heading listing available organizations' },\n { ref: 'noOrganizations', kind: LabelKind.EMPTY_STATE, purpose: 'Shown when the user belongs to no organizations' },\n { ref: 'createOrganization', kind: LabelKind.BUTTON, purpose: 'Menu action that starts creating a new organization' },\n];\nregisterComponentLabels(FrontendComponentType.APPLICATION_LEVEL_USER_DROPDOWN, ApplicationLevelUserDropdownLabels);\n"]}
1
+ {"version":3,"file":"menu-user-org.labels.js","sourceRoot":"","sources":["../../../../../../src/components/navigation/app-level/menu-user-org.labels.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,SAAS,EAET,uBAAuB,GACxB,MAAM,qCAAqC,CAAC;AAE7C,2EAA2E;AAC3E,6EAA6E;AAC7E,+EAA+E;AAE/E,MAAM,CAAC,MAAM,kCAAkC,GAA0B;IACvE,EAAE,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,qDAAqD,EAAE;IAC9G,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,wCAAwC,EAAE;IAC9F,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,oCAAoC,EAAE;IAC1F,EAAE,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,+BAA+B,EAAE;IACvF,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,uBAAuB,EAAE;IAC5E,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,qCAAqC,EAAE;IACzF,EAAE,GAAG,EAAE,oBAAoB,EAAE,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,0CAA0C,EAAE;IACzG,EAAE,GAAG,EAAE,qBAAqB,EAAE,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,mDAAmD,EAAE;IACnH,EAAE,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,iDAAiD,EAAE;IAC7G,EAAE,GAAG,EAAE,qBAAqB,EAAE,IAAI,EAAE,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,2IAA2I,EAAE;IAC7M;QACE,GAAG,EAAE,eAAe;QACpB,IAAI,EAAE,SAAS,CAAC,KAAK;QACrB,OAAO,EAAE,qGAAqG;QAC9G,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,0BAA0B,EAAE,CAAC;KAC/D;IACD,EAAE,GAAG,EAAE,iBAAiB,EAAE,IAAI,EAAE,SAAS,CAAC,WAAW,EAAE,OAAO,EAAE,iDAAiD,EAAE;IACnH,EAAE,GAAG,EAAE,oBAAoB,EAAE,IAAI,EAAE,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,qDAAqD,EAAE;CACtH,CAAC;AACF,uBAAuB,CAAC,qBAAqB,CAAC,+BAA+B,EAAE,kCAAkC,CAAC,CAAC","sourcesContent":["import {\n FrontendComponentType,\n LabelKind,\n type LabellingUnitaryDef,\n registerComponentLabels,\n} from '@wildo-ai/presets-components-models';\n\n// Companion-only label metadata for this component: keys + params + (where\n// authored) per-key purpose / kind / variable meaning. Statically scanned by\n// the dev companion; NOT imported at runtime, so it never ships in the bundle.\n\nexport const ApplicationLevelUserDropdownLabels: LabellingUnitaryDef[] = [\n { ref: 'userMenuLabel', kind: LabelKind.ARIA, purpose: 'Screen-reader name for the user-menu trigger button' },\n { ref: 'myAccount', kind: LabelKind.LABEL, purpose: 'Menu link to the user account overview' },\n { ref: 'myProfile', kind: LabelKind.LABEL, purpose: 'Menu link to the user profile page' },\n { ref: 'preferences', kind: LabelKind.LABEL, purpose: 'Menu link to user preferences' },\n { ref: 'settings', kind: LabelKind.LABEL, purpose: 'Menu link to settings' },\n { ref: 'logout', kind: LabelKind.BUTTON, purpose: 'Menu action that signs the user out' },\n { ref: 'switchOrganization', kind: LabelKind.LABEL, purpose: 'Label for the switch-organization action' },\n { ref: 'currentOrganization', kind: LabelKind.LABEL, purpose: 'Label marking the currently selected organization' },\n { ref: 'organizations', kind: LabelKind.HEADING, purpose: 'Section heading listing available organizations' },\n { ref: 'clientOrganizations', kind: LabelKind.HEADING, purpose: 'Section heading listing the CLIENT organizations the person works in on behalf of a service firm, kept apart from their own organizations' },\n {\n ref: 'servedViaFirm',\n kind: LabelKind.LABEL,\n purpose: 'Small line under a client organization naming the service firm through which the person works there',\n params: [{ key: 'firm', meaning: 'the service firm\\'s name' }],\n },\n { ref: 'noOrganizations', kind: LabelKind.EMPTY_STATE, purpose: 'Shown when the user belongs to no organizations' },\n { ref: 'createOrganization', kind: LabelKind.BUTTON, purpose: 'Menu action that starts creating a new organization' },\n];\nregisterComponentLabels(FrontendComponentType.APPLICATION_LEVEL_USER_DROPDOWN, ApplicationLevelUserDropdownLabels);\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"menubar.d.ts","sourceRoot":"","sources":["../../../../../../src/components/navigation/app-level/menubar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAExC,OAAO,EAEL,6BAA6B,EAkB9B,MAAM,6BAA6B,CAAC;AAMrC,eAAO,MAAM,sCAAsC,EAAE,KAAK,CAAC,EAAE,CAAC,6BAA6B,CAkS1F,CAAC"}
1
+ {"version":3,"file":"menubar.d.ts","sourceRoot":"","sources":["../../../../../../src/components/navigation/app-level/menubar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAExC,OAAO,EAEL,6BAA6B,EAmB9B,MAAM,6BAA6B,CAAC;AAMrC,eAAO,MAAM,sCAAsC,EAAE,KAAK,CAAC,EAAE,CAAC,6BAA6B,CAiT1F,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Suspense } from 'react';
3
- import { ApplicationLevelComponentType, useI18n, ComponentRegistryService, useUI, useMenuBarBehavior, useHostedComponentInteractions, useSidebarMobileDrawerMode, useEventBus, useIconRegistry, FrontendEvents, IconSize, StandardIconReference, envLoader, Button, ButtonVariants_Variant, cn, Surface, useBrandPresentation, } from '@wildo-ai/saas-frontend-lib';
4
- import { CorePresetNames, FrontendComponentType, HorizontalPlacement, SelectableVariant, ShellAppearance, SurfaceVariant, UIBehavior } from '@wildo-ai/presets-components-models';
3
+ import { ApplicationLevelComponentType, useI18n, ComponentRegistryService, useUI, useMenuBarBehavior, useHostedComponentInteractions, useSidebarMobileDrawerMode, useEventBus, useIconRegistry, FrontendEvents, IconSize, StandardIconReference, envLoader, Button, ButtonVariants_Variant, cn, Surface, useBrandPresentation, NavigationItemBadge, } from '@wildo-ai/saas-frontend-lib';
4
+ import { CorePresetNames, FrontendComponentType, HorizontalPlacement, SelectableVariant, ShellAppearance, ShellRegion, SurfaceVariant, UIBehavior } from '@wildo-ai/presets-components-models';
5
5
  import { HostedTriggerAppearance } from '@wildo-ai/saas-frontend-lib';
6
6
  import { Menubar } from '../../../components/navigation/menu-bar.js';
7
7
  export const ApplicationLevelPreset_Menubar_Default = ({ mode, children }) => {
@@ -89,21 +89,21 @@ export const ApplicationLevelPreset_Menubar_Default = ({ mode, children }) => {
89
89
  const renderedGroups = new Set();
90
90
  return (_jsx("div", { className: "flex items-center gap-item-xs min-w-0", children: items.map(item => {
91
91
  if (!item.group) {
92
- return (_jsxs(Button, { type: "button", onClick: item.onExecute, variant: ButtonVariants_Variant.GHOST, "aria-current": item.isActive ? 'page' : undefined, "data-active": item.isActive || undefined, "data-nav-item-id": item.id, className: cn('h-auto gap-element px-card-sm py-item-xs text-sm font-medium', itemStateClasses), children: [item.icon && _jsx("span", { className: "shrink-0", children: item.icon }), _jsx("span", { className: "truncate", children: item.label })] }, item.id));
92
+ return (_jsxs(Button, { type: "button", onClick: item.onExecute, variant: ButtonVariants_Variant.GHOST, "aria-current": item.isActive ? 'page' : undefined, "data-active": item.isActive || undefined, "data-nav-item-id": item.id, className: cn('h-auto gap-element px-card-sm py-item-xs text-sm font-medium', itemStateClasses), children: [item.icon && _jsx("span", { className: "shrink-0", children: item.icon }), _jsx("span", { className: "truncate", children: item.label }), item.notificationBadgeRef && (_jsx("span", { className: "shrink-0", children: _jsx(NavigationItemBadge, { notificationBadgeRef: item.notificationBadgeRef, label: item.label }) }))] }, item.id));
93
93
  }
94
94
  if (renderedGroups.has(item.group)) {
95
95
  return null;
96
96
  }
97
97
  renderedGroups.add(item.group);
98
98
  const groupItems = groupedItems.get(item.group) ?? [];
99
- return (_jsx(Menubar, { className: "h-auto gap-item-xs rounded-none border-0 bg-transparent p-0 shadow-none", children: _jsxs(Menubar.Menu, { children: [_jsx(Menubar.Trigger, { children: item.group }), _jsx(Menubar.Content, { children: groupItems.map(groupItem => (_jsxs(Menubar.Item, { onSelect: groupItem.onExecute, "aria-current": groupItem.isActive ? 'page' : undefined, "data-active": groupItem.isActive || undefined, "data-nav-item-id": groupItem.id, children: [groupItem.icon && _jsx("span", { className: "shrink-0", children: groupItem.icon }), _jsx("span", { className: "truncate", children: groupItem.label })] }, groupItem.id))) })] }) }, item.group));
99
+ return (_jsx(Menubar, { className: "h-auto gap-item-xs rounded-none border-0 bg-transparent p-0 shadow-none", children: _jsxs(Menubar.Menu, { children: [_jsx(Menubar.Trigger, { children: item.group }), _jsx(Menubar.Content, { children: groupItems.map(groupItem => (_jsxs(Menubar.Item, { onSelect: groupItem.onExecute, "aria-current": groupItem.isActive ? 'page' : undefined, "data-active": groupItem.isActive || undefined, "data-nav-item-id": groupItem.id, children: [groupItem.icon && _jsx("span", { className: "shrink-0", children: groupItem.icon }), _jsx("span", { className: "truncate", children: groupItem.label }), groupItem.notificationBadgeRef && (_jsx("span", { className: "ms-auto shrink-0", children: _jsx(NavigationItemBadge, { notificationBadgeRef: groupItem.notificationBadgeRef, label: groupItem.label }) }))] }, groupItem.id))) })] }) }, item.group));
100
100
  }) }));
101
101
  };
102
102
  // ===================================================================
103
103
  // Render
104
104
  // ===================================================================
105
- return (_jsx(Surface, { asChild: true, emitPolicyVars: false, variant: menubarConfig.isOverlay ? SurfaceVariant.OVERLAY : SurfaceVariant.SUNKEN, children: _jsxs("div", { "data-component-area": "menubar", "data-component-type": ApplicationLevelComponentType.MENUBAR, "data-menubar-mode": menubarConfig.mode, "data-frontend-service-name": envLoader.loadEnvironmentConfig().frontendServiceName, "data-viewport": currentBreakpoint, role: "banner", "aria-label": tComponent(FrontendComponentType.APPLICATION_LEVEL_MENUBAR, 'menubarLabel'), className: cn(isContinuousShell
105
+ return (_jsx(Surface, { asChild: true, emitPolicyVars: false, variant: menubarConfig.isOverlay ? SurfaceVariant.OVERLAY : SurfaceVariant.SUNKEN, children: _jsxs("div", { "data-component-area": ShellRegion.MENUBAR, "data-component-type": ApplicationLevelComponentType.MENUBAR, "data-menubar-mode": menubarConfig.mode, "data-frontend-service-name": envLoader.loadEnvironmentConfig().frontendServiceName, "data-viewport": currentBreakpoint, role: "banner", "aria-label": tComponent(FrontendComponentType.APPLICATION_LEVEL_MENUBAR, 'menubarLabel'), className: cn(isContinuousShell
106
106
  ? 'bg-transparent text-foreground'
107
- : 'bg-surface-sunken text-surface-sunken-foreground border-b border-surface-sunken-border', menubarConfig.isOverlay && cn('absolute top-0 inset-inline-start-0 inset-inline-end-0 z-(--z-overlay)', overlayRecipe.base), menubarConfig.showMobileLayout ? 'px-card-sm py-item-xs' : 'px-card py-card-sm'), children: [_jsxs("div", { className: "grid w-full grid-cols-[1fr_auto_1fr] items-center", children: [_jsxs("div", { className: "flex items-center gap-item-xs justify-self-start", children: [isSidebarDrawerMode && (_jsx(Button, { type: "button", variant: ButtonVariants_Variant.GHOST, onClick: () => emit(FrontendEvents.HOTKEY_SIDEBAR_TOGGLE, {}), "aria-label": tComponent(FrontendComponentType.APPLICATION_LEVEL_MENUBAR, 'toggleSidebar'), "data-component-type": "sidebar-drawer-trigger", className: "h-auto shrink-0 px-card-sm py-item-xs", children: renderIcon(StandardIconReference.MENU, { size: IconSize.SM }) })), renderBrandHeader(), renderConfigComponents(HorizontalPlacement.START)] }), _jsxs("div", { className: "flex items-center gap-item-xs min-w-0 px-item-xs", children: [renderConfigComponents(HorizontalPlacement.MIDDLE), renderMenubarItems()] }), _jsx("div", { className: "flex items-center gap-item-xs justify-self-end", children: renderConfigComponents(HorizontalPlacement.END) })] }), children && (_jsx("div", { className: cn('px-card py-card-sm', !isContinuousShell && 'border-t border-surface-sunken-border'), children: children }))] }) }));
107
+ : 'bg-surface-sunken text-surface-sunken-foreground border-b border-surface-sunken-border', menubarConfig.isOverlay && cn('absolute top-0 inset-inline-start-0 inset-inline-end-0 z-(--z-overlay)', overlayRecipe.base), menubarConfig.showMobileLayout ? 'px-card-sm py-item-xs' : 'px-card py-card-sm'), children: [_jsxs("div", { className: "grid w-full grid-cols-[1fr_auto_1fr] items-center", children: [_jsxs("div", { className: "flex items-center gap-item-xs justify-self-start", children: [isSidebarDrawerMode && (_jsx(Button, { type: "button", variant: ButtonVariants_Variant.GHOST, onClick: () => emit(FrontendEvents.HOTKEY_SIDEBAR_TOGGLE, {}), "aria-label": tComponent(FrontendComponentType.APPLICATION_LEVEL_MENUBAR, 'toggleSidebar'), "aria-haspopup": "dialog", "data-component-type": "sidebar-drawer-trigger", className: "h-auto shrink-0 px-card-sm py-item-xs", children: renderIcon(StandardIconReference.MENU, { size: IconSize.SM }) })), renderBrandHeader(), renderConfigComponents(HorizontalPlacement.START)] }), _jsxs("div", { className: "flex items-center gap-item-xs min-w-0 px-item-xs", children: [renderConfigComponents(HorizontalPlacement.MIDDLE), renderMenubarItems()] }), _jsx("div", { className: "flex items-center gap-item-xs justify-self-end", children: renderConfigComponents(HorizontalPlacement.END) })] }), children && (_jsx("div", { className: cn('px-card py-card-sm', !isContinuousShell && 'border-t border-surface-sunken-border'), children: children }))] }) }));
108
108
  };
109
109
  //# sourceMappingURL=menubar.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"menubar.js","sourceRoot":"","sources":["../../../../../../src/components/navigation/app-level/menubar.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { Suspense } from 'react';\n\nimport {\n ApplicationLevelComponentType,\n ApplicationLevelProps_Menubar,\n useI18n,\n ComponentRegistryService,\n useUI,\n useMenuBarBehavior,\n useHostedComponentInteractions,\n useSidebarMobileDrawerMode,\n useEventBus,\n useIconRegistry,\n FrontendEvents,\n IconSize,\n StandardIconReference,\n envLoader,\n Button,\n ButtonVariants_Variant,\n cn,\n Surface,\n useBrandPresentation,\n} from '@wildo-ai/saas-frontend-lib';\nimport { CorePresetNames, FrontendComponentType, HorizontalPlacement, SelectableVariant, ShellAppearance, SurfaceVariant, UIBehavior, VerticalPlacement } from '@wildo-ai/presets-components-models';\nimport { HostedTriggerAppearance } from '@wildo-ai/saas-frontend-lib';\n\nimport { Menubar } from '~wildo-presets/components/navigation/menu-bar';\n\nexport const ApplicationLevelPreset_Menubar_Default: React.FC<ApplicationLevelProps_Menubar> = ({\n mode,\n children\n}) => {\n\n const { tComponent, isReady } = useI18n({ component: FrontendComponentType.APPLICATION_LEVEL_MENUBAR });\n const { UIConfig, getRecipe, shellAppearance } = useUI();\n const overlayRecipe = getRecipe(UIBehavior.SURFACE, SurfaceVariant.OVERLAY);\n /*\n * Destination items take the theme's SELECTABLE/FILLED recipe — the same vocabulary the sidebar\n * uses for \"the current destination\" — so a menubar-only shell reads which page it is on. Opt-in\n * via `data-active`, appended after the GHOST recipe so the selected wash wins over GHOST's.\n */\n const selectableRecipe = getRecipe(UIBehavior.SELECTABLE, SelectableVariant.FILLED);\n const itemStateClasses = cn(\n selectableRecipe.states.hover,\n selectableRecipe.states.selected,\n selectableRecipe.motion.transition,\n );\n\n const { containerComponents, items, menubarConfig, brandHeader, isHomeActive, handleHomeClick } = useMenuBarBehavior({ mode });\n /*\n * The same four data decisions the sidebar's brand header takes (a failed mark degrading to the\n * name, the latch resetting on a theme change, a wordmark replacing the name, nothing rendering\n * for an empty identity) live once in `useBrandPresentation`; what stays here is layout. Called\n * unconditionally, as a hook must be — `brandHeader` is `undefined` unless the config opted in,\n * and the hook answers `isEmpty` for that.\n */\n const brand = useBrandPresentation(brandHeader);\n // Mobile burger: while the sidebar operates as an overlay drawer (BURGER policy\n // at/below its responsive breakpoint) nothing renders inline, so the menubar\n // provides the drawer's opening affordance. State stays owned by the sidebar's\n // behavior instance — the burger only speaks the existing toggle event.\n const isSidebarDrawerMode = useSidebarMobileDrawerMode();\n const { emit } = useEventBus();\n const { renderIcon } = useIconRegistry();\n // CONTINUOUS shell chrome: the menubar is a transparent strip of the shared\n // canvas — no sunken slab, no separating border-b. The overlay mode keeps its\n // own (opaque) recipe chrome: a floating bar must stay readable over content.\n const isContinuousShell = shellAppearance === ShellAppearance.CONTINUOUS && !menubarConfig.isOverlay;\n const { getHostedComponentProps } = useHostedComponentInteractions();\n const currentBreakpoint = UIConfig?.currentBreakpoint;\n\n if (!isReady) return null;\n\n // ===================================================================\n // Component Renderers\n // ===================================================================\n\n const renderResolvedComponent = (\n instanceId: string,\n appLevelType: ApplicationLevelComponentType,\n frontendComponentType: FrontendComponentType,\n placement: HorizontalPlacement | VerticalPlacement | undefined,\n presetName?: string,\n triggerWidth?: string | number,\n triggerAppearance?: HostedTriggerAppearance,\n ) => {\n const Component = ComponentRegistryService.resolve(\n frontendComponentType,\n presetName ?? CorePresetNames.DEFAULT\n );\n if (!Component) return null;\n\n return (\n <Suspense key={instanceId} fallback={<div className=\"h-8 w-8 animate-pulse motion-reduce:animate-none bg-muted rounded\" aria-hidden=\"true\" />}>\n <Component\n {...getHostedComponentProps(appLevelType, instanceId)}\n containerType={ApplicationLevelComponentType.MENUBAR}\n containerPlacement={placement}\n triggerWidth={triggerWidth}\n // A COMPACT declaration renders the hosted trigger as an icon button —\n // what belongs in a menubar cluster beside the bell and the avatar.\n // Passed as the component's existing `compact` prop so a preset that\n // already collapses for its own reasons (the sidebar's collapsed rail)\n // keeps one meaning for \"render small\".\n compact={triggerAppearance === HostedTriggerAppearance.COMPACT}\n />\n </Suspense>\n );\n };\n\n const renderConfigComponents = (targetPlacement: HorizontalPlacement) => {\n return containerComponents\n .filter(comp => comp.placement === targetPlacement)\n .map(comp => renderResolvedComponent(comp.instanceId, comp.component, comp.frontendComponentType, comp.placement, comp.presetName, comp.triggerWidth, comp.triggerAppearance));\n };\n\n const groupedItems = items.reduce((groups, item) => {\n if (!item.group) {\n return groups;\n }\n\n const existing = groups.get(item.group) ?? [];\n existing.push(item);\n groups.set(item.group, existing);\n return groups;\n }, new Map<string, typeof items>());\n\n /**\n * The identity as the HOME affordance at the start of the bar (`brandHeader: true`) — the\n * horizontal counterpart of the sidebar's pinned brand header, for a shell that has no sidebar.\n * Mark beside name; a WORDMARK/LOCKUP already spells the name and replaces it. `aria-current`\n * stays truthful on the home route but NO `data-active`: the identity is not a menu item that\n * lights up (the sidebar records the same decision).\n */\n const renderBrandHeader = () => {\n if (!brandHeader || brand.isEmpty) return null;\n const { name, logoUrl, hasMark, markCarriesName, onMarkError } = brand;\n const showNameText = !(hasMark && markCarriesName);\n return (\n <Button\n type=\"button\"\n variant={ButtonVariants_Variant.GHOST}\n onClick={handleHomeClick}\n aria-current={isHomeActive ? 'page' : undefined}\n aria-label={showNameText ? undefined : name}\n data-slot=\"menubar-brand-header\"\n className=\"h-auto min-w-0 shrink-0 gap-element px-card-sm py-item-xs text-sm font-semibold\"\n >\n {hasMark && logoUrl && (\n <img\n src={logoUrl}\n alt={markCarriesName ? name : ''}\n aria-hidden={markCarriesName ? undefined : 'true'}\n onError={onMarkError}\n className={markCarriesName ? 'h-6 w-auto' : 'size-6 shrink-0 object-contain'}\n />\n )}\n {showNameText && <span className=\"truncate\">{name}</span>}\n </Button>\n );\n };\n\n const renderMenubarItems = () => {\n if (items.length === 0) {\n return null;\n }\n\n const renderedGroups = new Set<string>();\n\n return (\n <div className=\"flex items-center gap-item-xs min-w-0\">\n {items.map(item => {\n if (!item.group) {\n return (\n <Button\n key={item.id}\n type=\"button\"\n onClick={item.onExecute}\n variant={ButtonVariants_Variant.GHOST}\n aria-current={item.isActive ? 'page' : undefined}\n data-active={item.isActive || undefined}\n data-nav-item-id={item.id}\n className={cn('h-auto gap-element px-card-sm py-item-xs text-sm font-medium', itemStateClasses)}\n >\n {item.icon && <span className=\"shrink-0\">{item.icon}</span>}\n <span className=\"truncate\">{item.label}</span>\n </Button>\n );\n }\n\n if (renderedGroups.has(item.group)) {\n return null;\n }\n\n renderedGroups.add(item.group);\n const groupItems = groupedItems.get(item.group) ?? [];\n\n return (\n <Menubar\n key={item.group}\n className=\"h-auto gap-item-xs rounded-none border-0 bg-transparent p-0 shadow-none\"\n >\n <Menubar.Menu>\n {/*\n The group identifier AS AUTHORED. It used to be humanized into English here —\n `billingSettings` rendered as \"Billing Settings\" — which is display text produced\n by code: untranslatable, invisible to whoever owns the product's wording, and wrong\n on every acronym (`GDPR` became \"Gdpr\"). The identifier is what the application\n declared, so showing it unchanged is honest and makes an unlabelled group visibly\n unlabelled. Giving this trigger a label lookup is owed and needs a key per group.\n */}\n <Menubar.Trigger>{item.group}</Menubar.Trigger>\n <Menubar.Content>\n {groupItems.map(groupItem => (\n <Menubar.Item\n key={groupItem.id}\n onSelect={groupItem.onExecute}\n aria-current={groupItem.isActive ? 'page' : undefined}\n data-active={groupItem.isActive || undefined}\n data-nav-item-id={groupItem.id}\n >\n {groupItem.icon && <span className=\"shrink-0\">{groupItem.icon}</span>}\n <span className=\"truncate\">{groupItem.label}</span>\n </Menubar.Item>\n ))}\n </Menubar.Content>\n </Menubar.Menu>\n </Menubar>\n );\n })}\n </div>\n );\n };\n\n // ===================================================================\n // Render\n // ===================================================================\n\n return (\n <Surface\n asChild\n emitPolicyVars={false}\n variant={menubarConfig.isOverlay ? SurfaceVariant.OVERLAY : SurfaceVariant.SUNKEN}\n >\n <div\n data-component-area=\"menubar\"\n data-component-type={ApplicationLevelComponentType.MENUBAR}\n data-menubar-mode={menubarConfig.mode}\n data-frontend-service-name={envLoader.loadEnvironmentConfig().frontendServiceName}\n data-viewport={currentBreakpoint}\n role=\"banner\"\n aria-label={tComponent(FrontendComponentType.APPLICATION_LEVEL_MENUBAR, 'menubarLabel')}\n className={cn(\n isContinuousShell\n ? 'bg-transparent text-foreground'\n : 'bg-surface-sunken text-surface-sunken-foreground border-b border-surface-sunken-border',\n menubarConfig.isOverlay && cn('absolute top-0 inset-inline-start-0 inset-inline-end-0 z-(--z-overlay)', overlayRecipe.base),\n menubarConfig.showMobileLayout ? 'px-card-sm py-item-xs' : 'px-card py-card-sm',\n )}\n >\n {/*\n * Three-zone bar as a GRID, not a flex sandwich. `flex-1 justify-center`\n * centered the MIDDLE zone within the RESIDUAL space between the two\n * side groups, so whenever START and END had different widths (the\n * normal case — END carries bell + avatar while START may be empty at a\n * root route) the \"centered\" content drifted off the bar's true center\n * by (start − end)/2, and the drift changed as breakpoint-gated\n * components appeared. `1fr auto 1fr` anchors the MIDDLE column to the\n * bar's center whenever space allows, and degrades by pushing (never\n * overlapping) when a side group genuinely needs more than half the\n * remaining width.\n */}\n {/*\n * The bar has NO fixed height — only padding — and it is an intrinsic\n * flex item in the shell's `flex flex-col` column whose content area\n * takes `flex-1`. So it GROWS to fit its tallest hosted control (a\n * quick switcher declaring `LABEL_ABOVE` renders a stacked label ~63px\n * tall) and the content area shrinks by exactly that much; `items-center`\n * re-centres every shorter sibling in the taller row rather than\n * top-aligning them. Do not pin a height here to \"stabilise\" the bar:\n * that would clip the taller control instead of hosting it.\n */}\n <div className=\"grid w-full grid-cols-[1fr_auto_1fr] items-center\">\n <div className=\"flex items-center gap-item-xs justify-self-start\">\n {isSidebarDrawerMode && (\n <Button\n type=\"button\"\n variant={ButtonVariants_Variant.GHOST}\n onClick={() => emit(FrontendEvents.HOTKEY_SIDEBAR_TOGGLE, {})}\n aria-label={tComponent(FrontendComponentType.APPLICATION_LEVEL_MENUBAR, 'toggleSidebar')}\n data-component-type=\"sidebar-drawer-trigger\"\n className=\"h-auto shrink-0 px-card-sm py-item-xs\"\n >\n {renderIcon(StandardIconReference.MENU, { size: IconSize.SM })}\n </Button>\n )}\n {renderBrandHeader()}\n {renderConfigComponents(HorizontalPlacement.START)}\n </div>\n\n <div className=\"flex items-center gap-item-xs min-w-0 px-item-xs\">\n {renderConfigComponents(HorizontalPlacement.MIDDLE)}\n {renderMenubarItems()}\n </div>\n\n <div className=\"flex items-center gap-item-xs justify-self-end\">\n {renderConfigComponents(HorizontalPlacement.END)}\n </div>\n </div>\n\n {children && (\n <div className={cn('px-card py-card-sm', !isContinuousShell && 'border-t border-surface-sunken-border')}>\n {children}\n </div>\n )}\n </div>\n </Surface>\n );\n};\n"]}
1
+ {"version":3,"file":"menubar.js","sourceRoot":"","sources":["../../../../../../src/components/navigation/app-level/menubar.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { Suspense } from 'react';\n\nimport {\n ApplicationLevelComponentType,\n ApplicationLevelProps_Menubar,\n useI18n,\n ComponentRegistryService,\n useUI,\n useMenuBarBehavior,\n useHostedComponentInteractions,\n useSidebarMobileDrawerMode,\n useEventBus,\n useIconRegistry,\n FrontendEvents,\n IconSize,\n StandardIconReference,\n envLoader,\n Button,\n ButtonVariants_Variant,\n cn,\n Surface,\n useBrandPresentation,\n NavigationItemBadge,\n} from '@wildo-ai/saas-frontend-lib';\nimport { CorePresetNames, FrontendComponentType, HorizontalPlacement, SelectableVariant, ShellAppearance, ShellRegion, SurfaceVariant, UIBehavior, VerticalPlacement } from '@wildo-ai/presets-components-models';\nimport { HostedTriggerAppearance } from '@wildo-ai/saas-frontend-lib';\n\nimport { Menubar } from '~wildo-presets/components/navigation/menu-bar';\n\nexport const ApplicationLevelPreset_Menubar_Default: React.FC<ApplicationLevelProps_Menubar> = ({\n mode,\n children\n}) => {\n\n const { tComponent, isReady } = useI18n({ component: FrontendComponentType.APPLICATION_LEVEL_MENUBAR });\n const { UIConfig, getRecipe, shellAppearance } = useUI();\n const overlayRecipe = getRecipe(UIBehavior.SURFACE, SurfaceVariant.OVERLAY);\n /*\n * Destination items take the theme's SELECTABLE/FILLED recipe — the same vocabulary the sidebar\n * uses for \"the current destination\" — so a menubar-only shell reads which page it is on. Opt-in\n * via `data-active`, appended after the GHOST recipe so the selected wash wins over GHOST's.\n */\n const selectableRecipe = getRecipe(UIBehavior.SELECTABLE, SelectableVariant.FILLED);\n const itemStateClasses = cn(\n selectableRecipe.states.hover,\n selectableRecipe.states.selected,\n selectableRecipe.motion.transition,\n );\n\n const { containerComponents, items, menubarConfig, brandHeader, isHomeActive, handleHomeClick } = useMenuBarBehavior({ mode });\n /*\n * The same four data decisions the sidebar's brand header takes (a failed mark degrading to the\n * name, the latch resetting on a theme change, a wordmark replacing the name, nothing rendering\n * for an empty identity) live once in `useBrandPresentation`; what stays here is layout. Called\n * unconditionally, as a hook must be — `brandHeader` is `undefined` unless the config opted in,\n * and the hook answers `isEmpty` for that.\n */\n const brand = useBrandPresentation(brandHeader);\n // Mobile burger: while the sidebar operates as an overlay drawer (BURGER policy\n // at/below its responsive breakpoint) nothing renders inline, so the menubar\n // provides the drawer's opening affordance. State stays owned by the sidebar's\n // behavior instance — the burger only speaks the existing toggle event.\n const isSidebarDrawerMode = useSidebarMobileDrawerMode();\n const { emit } = useEventBus();\n const { renderIcon } = useIconRegistry();\n // CONTINUOUS shell chrome: the menubar is a transparent strip of the shared\n // canvas — no sunken slab, no separating border-b. The overlay mode keeps its\n // own (opaque) recipe chrome: a floating bar must stay readable over content.\n const isContinuousShell = shellAppearance === ShellAppearance.CONTINUOUS && !menubarConfig.isOverlay;\n const { getHostedComponentProps } = useHostedComponentInteractions();\n const currentBreakpoint = UIConfig?.currentBreakpoint;\n\n if (!isReady) return null;\n\n // ===================================================================\n // Component Renderers\n // ===================================================================\n\n const renderResolvedComponent = (\n instanceId: string,\n appLevelType: ApplicationLevelComponentType,\n frontendComponentType: FrontendComponentType,\n placement: HorizontalPlacement | VerticalPlacement | undefined,\n presetName?: string,\n triggerWidth?: string | number,\n triggerAppearance?: HostedTriggerAppearance,\n ) => {\n const Component = ComponentRegistryService.resolve(\n frontendComponentType,\n presetName ?? CorePresetNames.DEFAULT\n );\n if (!Component) return null;\n\n return (\n <Suspense key={instanceId} fallback={<div className=\"h-8 w-8 animate-pulse motion-reduce:animate-none bg-muted rounded\" aria-hidden=\"true\" />}>\n <Component\n {...getHostedComponentProps(appLevelType, instanceId)}\n containerType={ApplicationLevelComponentType.MENUBAR}\n containerPlacement={placement}\n triggerWidth={triggerWidth}\n // A COMPACT declaration renders the hosted trigger as an icon button —\n // what belongs in a menubar cluster beside the bell and the avatar.\n // Passed as the component's existing `compact` prop so a preset that\n // already collapses for its own reasons (the sidebar's collapsed rail)\n // keeps one meaning for \"render small\".\n compact={triggerAppearance === HostedTriggerAppearance.COMPACT}\n />\n </Suspense>\n );\n };\n\n const renderConfigComponents = (targetPlacement: HorizontalPlacement) => {\n return containerComponents\n .filter(comp => comp.placement === targetPlacement)\n .map(comp => renderResolvedComponent(comp.instanceId, comp.component, comp.frontendComponentType, comp.placement, comp.presetName, comp.triggerWidth, comp.triggerAppearance));\n };\n\n const groupedItems = items.reduce((groups, item) => {\n if (!item.group) {\n return groups;\n }\n\n const existing = groups.get(item.group) ?? [];\n existing.push(item);\n groups.set(item.group, existing);\n return groups;\n }, new Map<string, typeof items>());\n\n /**\n * The identity as the HOME affordance at the start of the bar (`brandHeader: true`) — the\n * horizontal counterpart of the sidebar's pinned brand header, for a shell that has no sidebar.\n * Mark beside name; a WORDMARK/LOCKUP already spells the name and replaces it. `aria-current`\n * stays truthful on the home route but NO `data-active`: the identity is not a menu item that\n * lights up (the sidebar records the same decision).\n */\n const renderBrandHeader = () => {\n if (!brandHeader || brand.isEmpty) return null;\n const { name, logoUrl, hasMark, markCarriesName, onMarkError } = brand;\n const showNameText = !(hasMark && markCarriesName);\n return (\n <Button\n type=\"button\"\n variant={ButtonVariants_Variant.GHOST}\n onClick={handleHomeClick}\n aria-current={isHomeActive ? 'page' : undefined}\n aria-label={showNameText ? undefined : name}\n data-slot=\"menubar-brand-header\"\n className=\"h-auto min-w-0 shrink-0 gap-element px-card-sm py-item-xs text-sm font-semibold\"\n >\n {hasMark && logoUrl && (\n <img\n src={logoUrl}\n alt={markCarriesName ? name : ''}\n aria-hidden={markCarriesName ? undefined : 'true'}\n onError={onMarkError}\n className={markCarriesName ? 'h-6 w-auto' : 'size-6 shrink-0 object-contain'}\n />\n )}\n {showNameText && <span className=\"truncate\">{name}</span>}\n </Button>\n );\n };\n\n const renderMenubarItems = () => {\n if (items.length === 0) {\n return null;\n }\n\n const renderedGroups = new Set<string>();\n\n return (\n <div className=\"flex items-center gap-item-xs min-w-0\">\n {items.map(item => {\n if (!item.group) {\n return (\n <Button\n key={item.id}\n type=\"button\"\n onClick={item.onExecute}\n variant={ButtonVariants_Variant.GHOST}\n aria-current={item.isActive ? 'page' : undefined}\n data-active={item.isActive || undefined}\n data-nav-item-id={item.id}\n className={cn('h-auto gap-element px-card-sm py-item-xs text-sm font-medium', itemStateClasses)}\n >\n {item.icon && <span className=\"shrink-0\">{item.icon}</span>}\n <span className=\"truncate\">{item.label}</span>\n {/* The destination's count, when it declares one — the sidebar row's badge, on the bar. */}\n {item.notificationBadgeRef && (\n <span className=\"shrink-0\">\n <NavigationItemBadge notificationBadgeRef={item.notificationBadgeRef} label={item.label} />\n </span>\n )}\n </Button>\n );\n }\n\n if (renderedGroups.has(item.group)) {\n return null;\n }\n\n renderedGroups.add(item.group);\n const groupItems = groupedItems.get(item.group) ?? [];\n\n return (\n <Menubar\n key={item.group}\n className=\"h-auto gap-item-xs rounded-none border-0 bg-transparent p-0 shadow-none\"\n >\n <Menubar.Menu>\n {/*\n The group identifier AS AUTHORED. It used to be humanized into English here —\n `billingSettings` rendered as \"Billing Settings\" — which is display text produced\n by code: untranslatable, invisible to whoever owns the product's wording, and wrong\n on every acronym (`GDPR` became \"Gdpr\"). The identifier is what the application\n declared, so showing it unchanged is honest and makes an unlabelled group visibly\n unlabelled. Giving this trigger a label lookup is owed and needs a key per group.\n */}\n <Menubar.Trigger>{item.group}</Menubar.Trigger>\n <Menubar.Content>\n {groupItems.map(groupItem => (\n <Menubar.Item\n key={groupItem.id}\n onSelect={groupItem.onExecute}\n aria-current={groupItem.isActive ? 'page' : undefined}\n data-active={groupItem.isActive || undefined}\n data-nav-item-id={groupItem.id}\n >\n {groupItem.icon && <span className=\"shrink-0\">{groupItem.icon}</span>}\n <span className=\"truncate\">{groupItem.label}</span>\n {groupItem.notificationBadgeRef && (\n <span className=\"ms-auto shrink-0\">\n <NavigationItemBadge notificationBadgeRef={groupItem.notificationBadgeRef} label={groupItem.label} />\n </span>\n )}\n </Menubar.Item>\n ))}\n </Menubar.Content>\n </Menubar.Menu>\n </Menubar>\n );\n })}\n </div>\n );\n };\n\n // ===================================================================\n // Render\n // ===================================================================\n\n return (\n <Surface\n asChild\n emitPolicyVars={false}\n variant={menubarConfig.isOverlay ? SurfaceVariant.OVERLAY : SurfaceVariant.SUNKEN}\n >\n <div\n data-component-area={ShellRegion.MENUBAR}\n data-component-type={ApplicationLevelComponentType.MENUBAR}\n data-menubar-mode={menubarConfig.mode}\n data-frontend-service-name={envLoader.loadEnvironmentConfig().frontendServiceName}\n data-viewport={currentBreakpoint}\n role=\"banner\"\n aria-label={tComponent(FrontendComponentType.APPLICATION_LEVEL_MENUBAR, 'menubarLabel')}\n className={cn(\n isContinuousShell\n ? 'bg-transparent text-foreground'\n : 'bg-surface-sunken text-surface-sunken-foreground border-b border-surface-sunken-border',\n menubarConfig.isOverlay && cn('absolute top-0 inset-inline-start-0 inset-inline-end-0 z-(--z-overlay)', overlayRecipe.base),\n menubarConfig.showMobileLayout ? 'px-card-sm py-item-xs' : 'px-card py-card-sm',\n )}\n >\n {/*\n * Three-zone bar as a GRID, not a flex sandwich. `flex-1 justify-center`\n * centered the MIDDLE zone within the RESIDUAL space between the two\n * side groups, so whenever START and END had different widths (the\n * normal case — END carries bell + avatar while START may be empty at a\n * root route) the \"centered\" content drifted off the bar's true center\n * by (start − end)/2, and the drift changed as breakpoint-gated\n * components appeared. `1fr auto 1fr` anchors the MIDDLE column to the\n * bar's center whenever space allows, and degrades by pushing (never\n * overlapping) when a side group genuinely needs more than half the\n * remaining width.\n */}\n {/*\n * The bar has NO fixed height — only padding — and it is an intrinsic\n * flex item in the shell's `flex flex-col` column whose content area\n * takes `flex-1`. So it GROWS to fit its tallest hosted control (a\n * quick switcher declaring `LABEL_ABOVE` renders a stacked label ~63px\n * tall) and the content area shrinks by exactly that much; `items-center`\n * re-centres every shorter sibling in the taller row rather than\n * top-aligning them. Do not pin a height here to \"stabilise\" the bar:\n * that would clip the taller control instead of hosting it.\n */}\n <div className=\"grid w-full grid-cols-[1fr_auto_1fr] items-center\">\n <div className=\"flex items-center gap-item-xs justify-self-start\">\n {isSidebarDrawerMode && (\n <Button\n type=\"button\"\n variant={ButtonVariants_Variant.GHOST}\n onClick={() => emit(FrontendEvents.HOTKEY_SIDEBAR_TOGGLE, {})}\n aria-label={tComponent(FrontendComponentType.APPLICATION_LEVEL_MENUBAR, 'toggleSidebar')}\n // It opens the sidebar as a MODAL sheet, so it announces a dialog. `aria-expanded` is the\n // disclosure pattern (the desktop collapse button uses it); a modal takes focus and\n // returns it, which is what `aria-haspopup=\"dialog\"` tells assistive technology.\n aria-haspopup=\"dialog\"\n data-component-type=\"sidebar-drawer-trigger\"\n className=\"h-auto shrink-0 px-card-sm py-item-xs\"\n >\n {renderIcon(StandardIconReference.MENU, { size: IconSize.SM })}\n </Button>\n )}\n {renderBrandHeader()}\n {renderConfigComponents(HorizontalPlacement.START)}\n </div>\n\n <div className=\"flex items-center gap-item-xs min-w-0 px-item-xs\">\n {renderConfigComponents(HorizontalPlacement.MIDDLE)}\n {renderMenubarItems()}\n </div>\n\n <div className=\"flex items-center gap-item-xs justify-self-end\">\n {renderConfigComponents(HorizontalPlacement.END)}\n </div>\n </div>\n\n {children && (\n <div className={cn('px-card py-card-sm', !isContinuousShell && 'border-t border-surface-sunken-border')}>\n {children}\n </div>\n )}\n </div>\n </Surface>\n );\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"navigation-back.d.ts","sourceRoot":"","sources":["../../../../../../src/components/navigation/app-level/navigation-back.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAc1B,OAAO,KAAK,EAAE,oCAAoC,EAAE,MAAM,6BAA6B,CAAC;AAExF,eAAO,MAAM,6CAA6C,EAAE,KAAK,CAAC,EAAE,CAAC,oCAAoC,CAiDxG,CAAC"}
1
+ {"version":3,"file":"navigation-back.d.ts","sourceRoot":"","sources":["../../../../../../src/components/navigation/app-level/navigation-back.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAe1B,OAAO,KAAK,EAAE,oCAAoC,EAAE,MAAM,6BAA6B,CAAC;AAExF,eAAO,MAAM,6CAA6C,EAAE,KAAK,CAAC,EAAE,CAAC,oCAAoC,CAmExG,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { ButtonSize, FrontendComponentType } from '@wildo-ai/presets-components-models';
3
3
  import { NavigationZoneName } from '@wildo-ai/saas-models';
4
- import { useI18n, useIconRegistry, useNavigationController, useNavigationState, resolveApplicationLevelNavigationBackZone, StandardIconReference, IconSize, Button, ButtonVariants_Variant, } from '@wildo-ai/saas-frontend-lib';
4
+ import { useI18n, useIconRegistry, useNavigationController, useNavigationState, NavigationZone, resolveApplicationLevelNavigationBackZone, StandardIconReference, IconSize, Button, ButtonVariants_Variant, } from '@wildo-ai/saas-frontend-lib';
5
5
  export const ApplicationLevelPreset_NavigationBack_Default = ({ navigationZone,
6
6
  // V-7: drop the raw `hover:bg-muted` default — the Button GHOST recipe owns
7
7
  // the hover/focus/active treatment (theme-aware, focus-ring honored). Pass-
@@ -10,17 +10,35 @@ export const ApplicationLevelPreset_NavigationBack_Default = ({ navigationZone,
10
10
  className, ariaLabel, }) => {
11
11
  const { tComponent, isReady } = useI18n({ component: FrontendComponentType.APPLICATION_LEVEL_NAVIGATION_BACK });
12
12
  const { renderIcon } = useIconRegistry();
13
- const { focusedZone } = useNavigationState();
13
+ const { focusedZone, getZoneDepth } = useNavigationState();
14
14
  const { goBack, canGoBack } = useNavigationController();
15
- const resolvedZone = resolveApplicationLevelNavigationBackZone(navigationZone, focusedZone);
15
+ const resolvedZone = resolveApplicationLevelNavigationBackZone(navigationZone, focusedZone, getZoneDepth(focusedZone) > 0);
16
16
  /*
17
- * In the PRIMARY zone there is nothing to walk back to below the first entry, so the control
18
- * hides. In an ADJACENT zone — a hosted pane beside a page — a single entry is still something to
19
- * leave: `goBack` on a zone with nothing beneath is the controller's own way of closing it, and
20
- * without this branch a one-entry pane had no close control at all (the workbench's conversation
21
- * found it, 2026-09-22). The label stays "back": the gesture returns the page to what it was.
17
+ * ─── Hide the control when the gesture would do NOTHING ─────────────────────────────────────────
18
+ *
19
+ * In the PRIMARY zone there is nothing to walk back to below the first entry, so the control hides.
20
+ *
21
+ * In an ADJACENT zone — a hosted pane beside a page — a single entry is still something to leave:
22
+ * `goBack` on a structural zone with nothing beneath is the controller's own way of closing it, and
23
+ * without that a one-entry pane had no close control at all (the workbench's conversation found it,
24
+ * 2026-09-22). The label stays "back": the gesture returns the page to what it was.
25
+ *
26
+ * ── The OVERLAY layer is neither of those, and folding it into "not primary" shipped a DEAD
27
+ * CONTROL (2026-09-25). ──
28
+ *
29
+ * A scoped controller — the settings hub is the live one — hosts its own section stack inside an
30
+ * overlay and answers `canGoBack` from its own depth. At a section ROOT that is `false`, and its
31
+ * `goBack` dispatches a pop its reducer returns unchanged. The guard above tested
32
+ * `=== PRIMARY`, so an OVERLAY zone fell through it: the root of every settings section rendered an
33
+ * enabled, focusable back arrow that did nothing on click. The comment claiming "the root (list)
34
+ * has nothing to pop, so it shows none" described behaviour that did not happen.
35
+ *
36
+ * A structural PANE is the only case where "nothing beneath" still means something to do, because
37
+ * closing the pane is that something. An overlay has its own dismiss chrome.
22
38
  */
23
- if (!canGoBack(resolvedZone) && resolvedZone === NavigationZoneName.PRIMARY) {
39
+ const zoneClosesOnBack = resolvedZone !== NavigationZoneName.PRIMARY
40
+ && resolvedZone !== NavigationZone.OVERLAY;
41
+ if (!canGoBack(resolvedZone) && !zoneClosesOnBack) {
24
42
  return null;
25
43
  }
26
44
  if (!isReady)
@@ -1 +1 @@
1
- {"version":3,"file":"navigation-back.js","sourceRoot":"","sources":["../../../../../../src/components/navigation/app-level/navigation-back.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,UAAU,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAExF,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EACL,OAAO,EACP,eAAe,EACf,uBAAuB,EACvB,kBAAkB,EAClB,yCAAyC,EACzC,qBAAqB,EAAE,QAAQ,EAC/B,MAAM,EAAE,sBAAsB,GAC/B,MAAM,6BAA6B,CAAC;AAIrC,MAAM,CAAC,MAAM,6CAA6C,GAAmD,CAAC,EAC5G,cAAc;AACd,4EAA4E;AAC5E,4EAA4E;AAC5E,yEAAyE;AACzE,+CAA+C;AAC/C,SAAS,EACT,SAAS,GACV,EAAE,EAAE;IACH,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,EAAE,SAAS,EAAE,qBAAqB,CAAC,iCAAiC,EAAE,CAAC,CAAC;IAChH,MAAM,EAAE,UAAU,EAAE,GAAG,eAAe,EAAE,CAAC;IACzC,MAAM,EAAE,WAAW,EAAE,GAAG,kBAAkB,EAAE,CAAC;IAC7C,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,uBAAuB,EAAE,CAAC;IACxD,MAAM,YAAY,GAAG,yCAAyC,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;IAE5F;;;;;;OAMG;IACH,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,YAAY,KAAK,kBAAkB,CAAC,OAAO,EAAE,CAAC;QAC5E,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAE1B,MAAM,QAAQ,GAAG,UAAU,CACzB,qBAAqB,CAAC,IAAI,EAC1B,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE,CACtB,CAAC;IAEF,MAAM,KAAK,GAAG,SAAS,IAAI,UAAU,CAAC,qBAAqB,CAAC,iCAAiC,EAAE,MAAM,CAAC,CAAC;IAEvG,OAAO,CACL,KAAC,MAAM,IACL,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,sBAAsB,CAAC,KAAK,EACrC,IAAI,EAAE,UAAU,CAAC,OAAO,EACxB,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,EACnC,SAAS,EAAE,SAAS,gBACR,KAAK,0BAEK,YAAY,YAEjC,QAAQ,GACF,CACV,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import React from 'react';\nimport { ButtonSize, FrontendComponentType } from '@wildo-ai/presets-components-models';\n\nimport { NavigationZoneName } from '@wildo-ai/saas-models';\nimport {\n useI18n,\n useIconRegistry,\n useNavigationController,\n useNavigationState,\n resolveApplicationLevelNavigationBackZone,\n StandardIconReference, IconSize,\n Button, ButtonVariants_Variant,\n} from '@wildo-ai/saas-frontend-lib';\n\nimport type { ApplicationLevelProps_NavigationBack } from '@wildo-ai/saas-frontend-lib';\n\nexport const ApplicationLevelPreset_NavigationBack_Default: React.FC<ApplicationLevelProps_NavigationBack> = ({\n navigationZone,\n // V-7: drop the raw `hover:bg-muted` default — the Button GHOST recipe owns\n // the hover/focus/active treatment (theme-aware, focus-ring honored). Pass-\n // through `className` is still respected for downstream layout overrides\n // but the default is empty so the recipe wins.\n className,\n ariaLabel,\n}) => {\n const { tComponent, isReady } = useI18n({ component: FrontendComponentType.APPLICATION_LEVEL_NAVIGATION_BACK });\n const { renderIcon } = useIconRegistry();\n const { focusedZone } = useNavigationState();\n const { goBack, canGoBack } = useNavigationController();\n const resolvedZone = resolveApplicationLevelNavigationBackZone(navigationZone, focusedZone);\n\n /*\n * In the PRIMARY zone there is nothing to walk back to below the first entry, so the control\n * hides. In an ADJACENT zone — a hosted pane beside a page — a single entry is still something to\n * leave: `goBack` on a zone with nothing beneath is the controller's own way of closing it, and\n * without this branch a one-entry pane had no close control at all (the workbench's conversation\n * found it, 2026-09-22). The label stays \"back\": the gesture returns the page to what it was.\n */\n if (!canGoBack(resolvedZone) && resolvedZone === NavigationZoneName.PRIMARY) {\n return null;\n }\n\n if (!isReady) return null;\n\n const backIcon = renderIcon(\n StandardIconReference.BACK,\n { size: IconSize.SM }\n );\n\n const label = ariaLabel || tComponent(FrontendComponentType.APPLICATION_LEVEL_NAVIGATION_BACK, 'back');\n\n return (\n <Button\n type=\"button\"\n variant={ButtonVariants_Variant.GHOST}\n size={ButtonSize.ICON_SM}\n onClick={() => goBack(resolvedZone)}\n className={className}\n aria-label={label}\n /* An automation hook, i18n-independent, like `data-nav-item-id` on the sidebar: the zone this control walks back. */\n data-navigation-back={resolvedZone}\n >\n {backIcon}\n </Button>\n );\n};\n"]}
1
+ {"version":3,"file":"navigation-back.js","sourceRoot":"","sources":["../../../../../../src/components/navigation/app-level/navigation-back.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,UAAU,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAExF,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EACL,OAAO,EACP,eAAe,EACf,uBAAuB,EACvB,kBAAkB,EAClB,cAAc,EACd,yCAAyC,EACzC,qBAAqB,EAAE,QAAQ,EAC/B,MAAM,EAAE,sBAAsB,GAC/B,MAAM,6BAA6B,CAAC;AAIrC,MAAM,CAAC,MAAM,6CAA6C,GAAmD,CAAC,EAC5G,cAAc;AACd,4EAA4E;AAC5E,4EAA4E;AAC5E,yEAAyE;AACzE,+CAA+C;AAC/C,SAAS,EACT,SAAS,GACV,EAAE,EAAE;IACH,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,EAAE,SAAS,EAAE,qBAAqB,CAAC,iCAAiC,EAAE,CAAC,CAAC;IAChH,MAAM,EAAE,UAAU,EAAE,GAAG,eAAe,EAAE,CAAC;IACzC,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,kBAAkB,EAAE,CAAC;IAC3D,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,uBAAuB,EAAE,CAAC;IACxD,MAAM,YAAY,GAAG,yCAAyC,CAAC,cAAc,EAAE,WAAW,EAAE,YAAY,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;IAE3H;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,MAAM,gBAAgB,GAAG,YAAY,KAAK,kBAAkB,CAAC,OAAO;WAC/D,YAAY,KAAK,cAAc,CAAC,OAAO,CAAC;IAC7C,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAClD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAE1B,MAAM,QAAQ,GAAG,UAAU,CACzB,qBAAqB,CAAC,IAAI,EAC1B,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE,CACtB,CAAC;IAEF,MAAM,KAAK,GAAG,SAAS,IAAI,UAAU,CAAC,qBAAqB,CAAC,iCAAiC,EAAE,MAAM,CAAC,CAAC;IAEvG,OAAO,CACL,KAAC,MAAM,IACL,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,sBAAsB,CAAC,KAAK,EACrC,IAAI,EAAE,UAAU,CAAC,OAAO,EACxB,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,EACnC,SAAS,EAAE,SAAS,gBACR,KAAK,0BAEK,YAAY,YAEjC,QAAQ,GACF,CACV,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import React from 'react';\nimport { ButtonSize, FrontendComponentType } from '@wildo-ai/presets-components-models';\n\nimport { NavigationZoneName } from '@wildo-ai/saas-models';\nimport {\n useI18n,\n useIconRegistry,\n useNavigationController,\n useNavigationState,\n NavigationZone,\n resolveApplicationLevelNavigationBackZone,\n StandardIconReference, IconSize,\n Button, ButtonVariants_Variant,\n} from '@wildo-ai/saas-frontend-lib';\n\nimport type { ApplicationLevelProps_NavigationBack } from '@wildo-ai/saas-frontend-lib';\n\nexport const ApplicationLevelPreset_NavigationBack_Default: React.FC<ApplicationLevelProps_NavigationBack> = ({\n navigationZone,\n // V-7: drop the raw `hover:bg-muted` default — the Button GHOST recipe owns\n // the hover/focus/active treatment (theme-aware, focus-ring honored). Pass-\n // through `className` is still respected for downstream layout overrides\n // but the default is empty so the recipe wins.\n className,\n ariaLabel,\n}) => {\n const { tComponent, isReady } = useI18n({ component: FrontendComponentType.APPLICATION_LEVEL_NAVIGATION_BACK });\n const { renderIcon } = useIconRegistry();\n const { focusedZone, getZoneDepth } = useNavigationState();\n const { goBack, canGoBack } = useNavigationController();\n const resolvedZone = resolveApplicationLevelNavigationBackZone(navigationZone, focusedZone, getZoneDepth(focusedZone) > 0);\n\n /*\n * ─── Hide the control when the gesture would do NOTHING ─────────────────────────────────────────\n *\n * In the PRIMARY zone there is nothing to walk back to below the first entry, so the control hides.\n *\n * In an ADJACENT zone — a hosted pane beside a page — a single entry is still something to leave:\n * `goBack` on a structural zone with nothing beneath is the controller's own way of closing it, and\n * without that a one-entry pane had no close control at all (the workbench's conversation found it,\n * 2026-09-22). The label stays \"back\": the gesture returns the page to what it was.\n *\n * ── The OVERLAY layer is neither of those, and folding it into \"not primary\" shipped a DEAD\n * CONTROL (2026-09-25). ──\n *\n * A scoped controller — the settings hub is the live one — hosts its own section stack inside an\n * overlay and answers `canGoBack` from its own depth. At a section ROOT that is `false`, and its\n * `goBack` dispatches a pop its reducer returns unchanged. The guard above tested\n * `=== PRIMARY`, so an OVERLAY zone fell through it: the root of every settings section rendered an\n * enabled, focusable back arrow that did nothing on click. The comment claiming \"the root (list)\n * has nothing to pop, so it shows none\" described behaviour that did not happen.\n *\n * A structural PANE is the only case where \"nothing beneath\" still means something to do, because\n * closing the pane is that something. An overlay has its own dismiss chrome.\n */\n const zoneClosesOnBack = resolvedZone !== NavigationZoneName.PRIMARY\n && resolvedZone !== NavigationZone.OVERLAY;\n if (!canGoBack(resolvedZone) && !zoneClosesOnBack) {\n return null;\n }\n\n if (!isReady) return null;\n\n const backIcon = renderIcon(\n StandardIconReference.BACK,\n { size: IconSize.SM }\n );\n\n const label = ariaLabel || tComponent(FrontendComponentType.APPLICATION_LEVEL_NAVIGATION_BACK, 'back');\n\n return (\n <Button\n type=\"button\"\n variant={ButtonVariants_Variant.GHOST}\n size={ButtonSize.ICON_SM}\n onClick={() => goBack(resolvedZone)}\n className={className}\n aria-label={label}\n /* An automation hook, i18n-independent, like `data-nav-item-id` on the sidebar: the zone this control walks back. */\n data-navigation-back={resolvedZone}\n >\n {backIcon}\n </Button>\n );\n};\n"]}
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import React from 'react';
3
- import { ButtonSize, CorePresetNames, FrontendComponentType, HorizontalPlacement, PlacementSide, SelectableVariant, ShellAppearance, SidebarCompactLabelMode, SurfaceVariant, UIBehavior, VerticalPlacement, resolvePlacementSideToRadix } from '@wildo-ai/presets-components-models';
3
+ import { ButtonSize, CorePresetNames, FrontendComponentType, HorizontalPlacement, PlacementSide, resolvePlacementSideToRadix, SelectableVariant, ShellAppearance, ShellRegion, SidebarCompactLabelMode, SurfaceVariant, UIBehavior, VerticalPlacement } from '@wildo-ai/presets-components-models';
4
4
  import { SidebarSectionInlineCreate, SidebarSectionContentKind, ApplicationLevelComponentType, Button, ButtonVariants_Variant, InputRoot, ScrollArea, ScrollAreaType, Collapsible, CollapsibleContent, CollapsibleTrigger, useI18n, IconSize, StandardIconReference, NavigationItemBadge, useIconRegistry, useUI, useHostedComponentInteractions, TruncatedText, useSidebarBehavior, useBrandPresentation, SidebarHomeDisplayMode, Sheet, SheetContent, SheetTitle, SidebarResourceBrowser, ComponentRegistryService, envLoader, cn, NON_CANONICAL_SHELL_SURFACE_POLICY_OVERRIDE, Surface, } from '@wildo-ai/saas-frontend-lib';
5
5
  /**
6
6
  * Which single home affordance each mode renders — the mutual exclusion as
@@ -385,9 +385,9 @@ export const ApplicationLevelPreset_Sidebar_Default = ({ placement = HorizontalP
385
385
  const dir = (typeof document !== 'undefined' ? document.documentElement?.dir : undefined) || 'ltr';
386
386
  const drawerSide = resolvePlacementSideToRadix(sb.placement === HorizontalPlacement.START ? PlacementSide.START : PlacementSide.END, dir);
387
387
  return (_jsx(Sheet, { open: sb.isMobileDrawerOpen, onOpenChange: (open) => { if (!open)
388
- sb.closeMobileDrawer(); }, children: _jsxs(SheetContent, { side: drawerSide, "data-component-area": `sidebar-${sb.placement}`, "data-placement": sb.placement, "data-responsive-policy": sb.sidebarConfig.responsivePolicy, "data-mobile-drawer": "true", "data-breakpoint": currentBreakpoint, className: "gap-0", style: { width: `${sb.sidebarConfig.currentWidth}px` }, children: [_jsx(SheetTitle, { className: "sr-only", children: tComponent(FrontendComponentType.APPLICATION_LEVEL_SIDEBAR, 'sidebarLabel') }), _jsxs("aside", { "aria-label": tComponent(FrontendComponentType.APPLICATION_LEVEL_SIDEBAR, 'sidebarLabel'), className: "flex-1 min-h-0 flex flex-col", children: [renderBrandHeader(), renderSidebarContent(), renderHostedComponents(VerticalPlacement.BOTTOM)] })] }) }));
388
+ sb.closeMobileDrawer(); }, children: _jsxs(SheetContent, { side: drawerSide, "data-component-area": ShellRegion.SIDEBAR, "data-placement": sb.placement, "data-responsive-policy": sb.sidebarConfig.responsivePolicy, "data-mobile-drawer": "true", "data-breakpoint": currentBreakpoint, className: "gap-0", style: { width: `${sb.sidebarConfig.currentWidth}px` }, children: [_jsx(SheetTitle, { className: "sr-only", children: tComponent(FrontendComponentType.APPLICATION_LEVEL_SIDEBAR, 'sidebarLabel') }), _jsxs("aside", { "aria-label": tComponent(FrontendComponentType.APPLICATION_LEVEL_SIDEBAR, 'sidebarLabel'), className: "flex-1 min-h-0 flex flex-col", children: [renderBrandHeader(), renderSidebarContent(), renderHostedComponents(VerticalPlacement.BOTTOM)] })] }) }));
389
389
  }
390
- return (_jsx(Surface, { asChild: true, emitPolicyVars: false, variant: SurfaceVariant.SHELL, policyOverride: NON_CANONICAL_SHELL_SURFACE_POLICY_OVERRIDE, children: _jsx("div", { "data-component-area": `sidebar-${sb.placement}`, "data-placement": sb.placement, "data-collapsible": sb.sidebarConfig.isCollapsible, "data-collapsed": sb.isCollapsed, "data-responsive-policy": sb.sidebarConfig.responsivePolicy, "data-breakpoint": currentBreakpoint, className: cn(
390
+ return (_jsx(Surface, { asChild: true, emitPolicyVars: false, variant: SurfaceVariant.SHELL, policyOverride: NON_CANONICAL_SHELL_SURFACE_POLICY_OVERRIDE, children: _jsx("div", { "data-component-area": ShellRegion.SIDEBAR, "data-placement": sb.placement, "data-collapsible": sb.sidebarConfig.isCollapsible, "data-collapsed": sb.isCollapsed, "data-responsive-policy": sb.sidebarConfig.responsivePolicy, "data-breakpoint": currentBreakpoint, className: cn(
391
391
  // Named group so the bottom collapse control can fade in on hover /
392
392
  // focus-within of the whole sidebar region.
393
393
  'group/app-sidebar',