@xplortech/apollo-core 2.10.0 → 2.11.0

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 (258) hide show
  1. package/.typings/apollo-components.html-data.json +35 -2
  2. package/build/style.css +259 -34
  3. package/dist/apollo-core/apollo-core.css +12 -12
  4. package/dist/apollo-core/apollo-core.esm.js +1 -1
  5. package/dist/apollo-core/{p-728341d2.entry.js → p-048fdde0.entry.js} +1 -1
  6. package/dist/apollo-core/p-0abc496e.entry.js +1 -0
  7. package/dist/apollo-core/{p-23870463.entry.js → p-1442c052.entry.js} +1 -1
  8. package/dist/apollo-core/p-1e498763.entry.js +1 -0
  9. package/dist/apollo-core/p-26c3a508.entry.js +1 -0
  10. package/dist/apollo-core/p-4ce52107.entry.js +1 -0
  11. package/dist/apollo-core/p-6710fb29.entry.js +1 -0
  12. package/dist/apollo-core/p-7e622809.entry.js +1 -0
  13. package/dist/apollo-core/{p-c17b6351.entry.js → p-87068144.entry.js} +1 -1
  14. package/dist/apollo-core/p-BUgtURvw.js +1 -0
  15. package/dist/apollo-core/p-a3b4820a.entry.js +1 -0
  16. package/dist/apollo-core/p-b2d6dd0e.entry.js +1 -0
  17. package/dist/apollo-core/{p-e9e7577f.entry.js → p-bd2249ef.entry.js} +1 -1
  18. package/dist/apollo-core/p-c96b7957.entry.js +1 -0
  19. package/dist/apollo-core/p-d6be63cd.entry.js +1 -0
  20. package/dist/apollo-core/{p-9adf3694.entry.js → p-ddf76cee.entry.js} +1 -1
  21. package/dist/apollo-core/p-f0554edd.entry.js +1 -0
  22. package/dist/cjs/apollo-core.cjs.js +1 -1
  23. package/dist/cjs/index-BaXVr8ux.js +4 -0
  24. package/dist/cjs/lifecycle-Bf3QwiVa.js +70 -0
  25. package/dist/cjs/loader.cjs.js +1 -1
  26. package/dist/cjs/xpl-accordion.cjs.entry.js +2 -2
  27. package/dist/cjs/xpl-application-shell.cjs.entry.js +1 -1
  28. package/dist/cjs/xpl-avatar_54.cjs.entry.js +292 -243
  29. package/dist/cjs/xpl-button-row.cjs.entry.js +1 -1
  30. package/dist/cjs/xpl-calendar.cjs.entry.js +1 -1
  31. package/dist/cjs/xpl-dynamic-table-cell.cjs.entry.js +2 -2
  32. package/dist/cjs/xpl-dynamic-table-row.cjs.entry.js +2 -2
  33. package/dist/cjs/xpl-dynamic-table.cjs.entry.js +1 -1
  34. package/dist/cjs/xpl-grid-item.cjs.entry.js +1 -1
  35. package/dist/cjs/xpl-grid.cjs.entry.js +1 -1
  36. package/dist/cjs/xpl-large-card.cjs.entry.js +1 -1
  37. package/dist/cjs/xpl-main-nav.cjs.entry.js +1 -1
  38. package/dist/cjs/xpl-table-header.cjs.entry.js +1 -1
  39. package/dist/cjs/xpl-toggle.cjs.entry.js +3 -3
  40. package/dist/cjs/xpl-toolbar.cjs.entry.js +2 -2
  41. package/dist/cjs/xpl-top-nav-menu.cjs.entry.js +97 -0
  42. package/dist/collection/collection-manifest.json +1 -0
  43. package/dist/collection/components/xpl-accordion/xpl-accordion.js +2 -2
  44. package/dist/collection/components/xpl-application-shell/xpl-application-shell.js +1 -1
  45. package/dist/collection/components/xpl-backdrop/xpl-backdrop.js +1 -1
  46. package/dist/collection/components/xpl-badge/xpl-badge.js +1 -1
  47. package/dist/collection/components/xpl-banner/xpl-banner.js +2 -2
  48. package/dist/collection/components/xpl-breadcrumbs/xpl-breadcrumb-item/xpl-breadcrumb-item.js +1 -1
  49. package/dist/collection/components/xpl-breadcrumbs/xpl-breadcrumbs/xpl-breadcrumbs.js +1 -1
  50. package/dist/collection/components/xpl-button/xpl-button.js +1 -1
  51. package/dist/collection/components/xpl-button-row/xpl-button-row.js +1 -1
  52. package/dist/collection/components/xpl-calendar/xpl-calendar.js +1 -1
  53. package/dist/collection/components/xpl-checkbox/xpl-checkbox.js +3 -3
  54. package/dist/collection/components/xpl-choicelist/xpl-choicelist.js +1 -1
  55. package/dist/collection/components/xpl-content-area/xpl-content-area.js +1 -1
  56. package/dist/collection/components/xpl-dashboard/xpl-dashboard.js +1 -1
  57. package/dist/collection/components/xpl-data-card/xpl-data-card.js +2 -2
  58. package/dist/collection/components/xpl-divider/xpl-divider.js +1 -1
  59. package/dist/collection/components/xpl-dropdown/xpl-dropdown-group/xpl-dropdown-group.js +1 -1
  60. package/dist/collection/components/xpl-dropdown/xpl-dropdown-heading/xpl-dropdown-heading.js +1 -1
  61. package/dist/collection/components/xpl-dropdown/xpl-dropdown-option/xpl-dropdown-option.js +2 -2
  62. package/dist/collection/components/xpl-dropdown/xpl-dropdown.js +4 -4
  63. package/dist/collection/components/xpl-dynamic-table/xpl-dynamic-table.js +1 -1
  64. package/dist/collection/components/xpl-dynamic-table-cell/xpl-dynamic-table-cell.js +2 -2
  65. package/dist/collection/components/xpl-dynamic-table-row/xpl-dynamic-table-row.js +2 -2
  66. package/dist/collection/components/xpl-grid/xpl-grid.js +1 -1
  67. package/dist/collection/components/xpl-grid-item/xpl-grid-item.js +1 -1
  68. package/dist/collection/components/xpl-header-accordion/xpl-header-accordion.js +1 -1
  69. package/dist/collection/components/xpl-icon/xpl-icon.js +2 -2
  70. package/dist/collection/components/xpl-input/xpl-input-color/xpl-input-color.js +8 -8
  71. package/dist/collection/components/xpl-input/xpl-input-date/xpl-input-date.js +3 -3
  72. package/dist/collection/components/xpl-input/xpl-input-file/xpl-input-file.js +4 -4
  73. package/dist/collection/components/xpl-input/xpl-input-phone/xpl-input-phone.js +5 -5
  74. package/dist/collection/components/xpl-input/xpl-input-search/xpl-input-search.js +1 -1
  75. package/dist/collection/components/xpl-input/xpl-input-time/xpl-input-time.js +2 -2
  76. package/dist/collection/components/xpl-input/xpl-input.js +2 -2
  77. package/dist/collection/components/xpl-large-card/xpl-large-card.js +1 -1
  78. package/dist/collection/components/xpl-list/xpl-list.js +2 -2
  79. package/dist/collection/components/xpl-main-nav/xpl-main-nav.js +1 -1
  80. package/dist/collection/components/xpl-modal/xpl-modal.js +1 -1
  81. package/dist/collection/components/xpl-nav-item/xpl-nav-item.js +2 -2
  82. package/dist/collection/components/xpl-pagination/xpl-pagination.js +4 -4
  83. package/dist/collection/components/xpl-panel/xpl-panel.js +2 -2
  84. package/dist/collection/components/xpl-popover/xpl-popover.js +4 -4
  85. package/dist/collection/components/xpl-progress-bar/xpl-progress-bar.js +2 -2
  86. package/dist/collection/components/xpl-progress-indicator/xpl-progress-indicator.js +1 -1
  87. package/dist/collection/components/xpl-radio/xpl-radio.js +3 -3
  88. package/dist/collection/components/xpl-secondary-nav/xpl-secondary-nav.js +1 -1
  89. package/dist/collection/components/xpl-select/xpl-select.js +6 -6
  90. package/dist/collection/components/xpl-side-nav/xpl-side-nav-item/xpl-side-nav-item.js +2 -2
  91. package/dist/collection/components/xpl-side-nav/xpl-side-nav.js +2 -2
  92. package/dist/collection/components/xpl-skeleton/xpl-skeleton.js +1 -1
  93. package/dist/collection/components/xpl-slideout/xpl-slideout.js +1 -1
  94. package/dist/collection/components/xpl-tab-panel/xpl-tab-panel.js +2 -2
  95. package/dist/collection/components/xpl-table/xpl-table.js +5 -5
  96. package/dist/collection/components/xpl-table-header/xpl-table-header.js +1 -1
  97. package/dist/collection/components/xpl-tabs/xpl-tabs.js +5 -5
  98. package/dist/collection/components/xpl-tag/xpl-tag.js +2 -2
  99. package/dist/collection/components/xpl-toast/xpl-toast.js +2 -2
  100. package/dist/collection/components/xpl-toggle/xpl-toggle.js +3 -3
  101. package/dist/collection/components/xpl-toolbar/xpl-toolbar.js +2 -2
  102. package/dist/collection/components/xpl-tooltip/xpl-tooltip.js +1 -1
  103. package/dist/collection/components/xpl-top-nav/top-nav-constants.js +1 -0
  104. package/dist/collection/components/xpl-top-nav/top-nav.stories.js +131 -11
  105. package/dist/collection/components/xpl-top-nav/xpl-nav-header-menu/xpl-nav-header-menu.js +2 -2
  106. package/dist/collection/components/xpl-top-nav/xpl-top-nav-item/top-nav-item-constants.js +2 -0
  107. package/dist/collection/components/xpl-top-nav/xpl-top-nav-item/xpl-top-nav-item.js +305 -85
  108. package/dist/collection/components/xpl-top-nav/xpl-top-nav-menu/xpl-top-nav-menu.js +119 -0
  109. package/dist/collection/components/xpl-top-nav/xpl-top-nav.js +11 -5
  110. package/dist/collection/components/xpl-utility-bar/xpl-utility-bar.js +1 -1
  111. package/dist/collection/utils/lifecycle.js +18 -0
  112. package/dist/components/index.d.ts +2 -0
  113. package/dist/components/index.js +1 -1
  114. package/dist/components/p-2xGSxBGa.js +1 -0
  115. package/dist/components/p-B8RYNiz-.js +1 -0
  116. package/dist/components/p-BDWXBWGE.js +1 -0
  117. package/dist/components/{p-Bn-27-xj.js → p-BJqNuBZr.js} +1 -1
  118. package/dist/components/p-BUgtURvw.js +1 -0
  119. package/dist/components/{p-DllC7F-H.js → p-B_sq_SAX.js} +1 -1
  120. package/dist/components/{p-hPUzON4O.js → p-Bsy-VVS5.js} +1 -1
  121. package/dist/components/p-BxHFEnPN.js +1 -0
  122. package/dist/components/{p-B1PBAEzg.js → p-ByJRw26d.js} +1 -1
  123. package/dist/components/{p-DPTHmitJ.js → p-C5_Yo0ZP.js} +1 -1
  124. package/dist/components/p-C8rmEAx6.js +1 -0
  125. package/dist/components/p-CF_YTx16.js +1 -0
  126. package/dist/components/{p-BG0-6Xek.js → p-CUYkG-PB.js} +1 -1
  127. package/dist/components/{p-kPHfCq1d.js → p-CaW0fL0P.js} +1 -1
  128. package/dist/components/{p-B_Wi--Ov.js → p-CuisR8WP.js} +1 -1
  129. package/dist/components/{p-D97c0GjM.js → p-D2SFagIb.js} +1 -1
  130. package/dist/components/{p-3qMYyqTe.js → p-DKUNbsb0.js} +1 -1
  131. package/dist/components/p-DcXL24UI.js +1 -0
  132. package/dist/components/{p-CVqbA9op.js → p-Dp3H99Yc.js} +1 -1
  133. package/dist/components/p-M900WO1C.js +1 -0
  134. package/dist/components/{p-DEl4Rvzs.js → p-ZTFt9sBy.js} +1 -1
  135. package/dist/components/{p-CFW_w5Wj.js → p-gfb3l9Pr.js} +1 -1
  136. package/dist/components/{p-C9BO2vL-.js → p-h1Gbk5lO.js} +1 -1
  137. package/dist/components/xpl-accordion.js +1 -1
  138. package/dist/components/xpl-application-shell.js +1 -1
  139. package/dist/components/xpl-avatar.js +1 -1
  140. package/dist/components/xpl-backdrop.js +1 -1
  141. package/dist/components/xpl-badge.js +1 -1
  142. package/dist/components/xpl-banner.js +1 -1
  143. package/dist/components/xpl-breadcrumb-item.js +1 -1
  144. package/dist/components/xpl-breadcrumbs.js +1 -1
  145. package/dist/components/xpl-button-row.js +1 -1
  146. package/dist/components/xpl-button.js +1 -1
  147. package/dist/components/xpl-calendar.js +1 -1
  148. package/dist/components/xpl-checkbox.js +1 -1
  149. package/dist/components/xpl-choicelist.js +1 -1
  150. package/dist/components/xpl-content-area.js +1 -1
  151. package/dist/components/xpl-dashboard.js +1 -1
  152. package/dist/components/xpl-data-card.js +1 -1
  153. package/dist/components/xpl-divider.js +1 -1
  154. package/dist/components/xpl-dropdown-group.js +1 -1
  155. package/dist/components/xpl-dropdown-heading.js +1 -1
  156. package/dist/components/xpl-dropdown-option.js +1 -1
  157. package/dist/components/xpl-dropdown.js +1 -1
  158. package/dist/components/xpl-dynamic-table-cell.js +1 -1
  159. package/dist/components/xpl-dynamic-table-row.js +1 -1
  160. package/dist/components/xpl-dynamic-table.js +1 -1
  161. package/dist/components/xpl-grid-item.js +1 -1
  162. package/dist/components/xpl-grid.js +1 -1
  163. package/dist/components/xpl-header-accordion.js +1 -1
  164. package/dist/components/xpl-icon.js +1 -1
  165. package/dist/components/xpl-input-color.js +1 -1
  166. package/dist/components/xpl-input-date.js +1 -1
  167. package/dist/components/xpl-input-file.js +1 -1
  168. package/dist/components/xpl-input-phone.js +1 -1
  169. package/dist/components/xpl-input-search.js +1 -1
  170. package/dist/components/xpl-input-time.js +1 -1
  171. package/dist/components/xpl-input.js +1 -1
  172. package/dist/components/xpl-large-card.js +1 -1
  173. package/dist/components/xpl-list-item.js +1 -1
  174. package/dist/components/xpl-list.js +1 -1
  175. package/dist/components/xpl-main-nav.js +1 -1
  176. package/dist/components/xpl-modal.js +1 -1
  177. package/dist/components/xpl-nav-header-menu.js +1 -1
  178. package/dist/components/xpl-nav-item.js +1 -1
  179. package/dist/components/xpl-pagination.js +1 -1
  180. package/dist/components/xpl-panel.js +1 -1
  181. package/dist/components/xpl-popover.js +1 -1
  182. package/dist/components/xpl-progress-bar.js +1 -1
  183. package/dist/components/xpl-progress-indicator.js +1 -1
  184. package/dist/components/xpl-radio.js +1 -1
  185. package/dist/components/xpl-secondary-nav.js +1 -1
  186. package/dist/components/xpl-select.js +1 -1
  187. package/dist/components/xpl-side-nav-item.js +1 -1
  188. package/dist/components/xpl-side-nav.js +1 -1
  189. package/dist/components/xpl-skeleton.js +1 -1
  190. package/dist/components/xpl-slideout.js +1 -1
  191. package/dist/components/xpl-spotlight.js +1 -1
  192. package/dist/components/xpl-tab-panel.js +1 -1
  193. package/dist/components/xpl-tab.js +1 -1
  194. package/dist/components/xpl-table-header-cell.js +1 -1
  195. package/dist/components/xpl-table-header.js +1 -1
  196. package/dist/components/xpl-table.js +1 -1
  197. package/dist/components/xpl-tabs.js +1 -1
  198. package/dist/components/xpl-tag.js +1 -1
  199. package/dist/components/xpl-toast.js +1 -1
  200. package/dist/components/xpl-toggle.js +1 -1
  201. package/dist/components/xpl-toolbar.js +1 -1
  202. package/dist/components/xpl-tooltip.js +1 -1
  203. package/dist/components/xpl-top-nav-item.js +1 -1
  204. package/dist/components/xpl-top-nav-menu.d.ts +11 -0
  205. package/dist/components/xpl-top-nav-menu.js +1 -0
  206. package/dist/components/xpl-top-nav.js +1 -1
  207. package/dist/components/xpl-utility-bar.js +1 -1
  208. package/dist/docs/xpl-icon/readme.md +2 -0
  209. package/dist/docs/xpl-top-nav/readme.md +3 -0
  210. package/dist/docs/xpl-top-nav/xpl-top-nav-item/readme.md +79 -20
  211. package/dist/docs/xpl-top-nav/xpl-top-nav-menu/readme.md +96 -0
  212. package/dist/esm/apollo-core.js +1 -1
  213. package/dist/esm/index-CXkZUm1c.js +4 -0
  214. package/dist/esm/lifecycle-BUgtURvw.js +68 -0
  215. package/dist/esm/loader.js +1 -1
  216. package/dist/esm/xpl-accordion.entry.js +2 -2
  217. package/dist/esm/xpl-application-shell.entry.js +1 -1
  218. package/dist/esm/xpl-avatar_54.entry.js +291 -242
  219. package/dist/esm/xpl-button-row.entry.js +1 -1
  220. package/dist/esm/xpl-calendar.entry.js +1 -1
  221. package/dist/esm/xpl-dynamic-table-cell.entry.js +2 -2
  222. package/dist/esm/xpl-dynamic-table-row.entry.js +2 -2
  223. package/dist/esm/xpl-dynamic-table.entry.js +1 -1
  224. package/dist/esm/xpl-grid-item.entry.js +1 -1
  225. package/dist/esm/xpl-grid.entry.js +1 -1
  226. package/dist/esm/xpl-large-card.entry.js +1 -1
  227. package/dist/esm/xpl-main-nav.entry.js +1 -1
  228. package/dist/esm/xpl-table-header.entry.js +1 -1
  229. package/dist/esm/xpl-toggle.entry.js +3 -3
  230. package/dist/esm/xpl-toolbar.entry.js +2 -2
  231. package/dist/esm/xpl-top-nav-menu.entry.js +95 -0
  232. package/dist/types/components/xpl-top-nav/top-nav-constants.d.ts +1 -0
  233. package/dist/types/components/xpl-top-nav/top-nav.stories.d.ts +70 -1
  234. package/dist/types/components/xpl-top-nav/xpl-top-nav-item/top-nav-item-constants.d.ts +2 -0
  235. package/dist/types/components/xpl-top-nav/xpl-top-nav-item/xpl-top-nav-item.d.ts +23 -4
  236. package/dist/types/components/xpl-top-nav/xpl-top-nav-menu/xpl-top-nav-menu.d.ts +18 -0
  237. package/dist/types/components/xpl-top-nav/xpl-top-nav.d.ts +1 -0
  238. package/dist/types/components.d.ts +179 -19
  239. package/dist/types/utils/lifecycle.d.ts +3 -0
  240. package/package.json +21 -11
  241. package/dist/apollo-core/p-0e45f332.entry.js +0 -1
  242. package/dist/apollo-core/p-0f251f98.entry.js +0 -1
  243. package/dist/apollo-core/p-1691c4f3.entry.js +0 -1
  244. package/dist/apollo-core/p-172ac720.entry.js +0 -1
  245. package/dist/apollo-core/p-44a16751.entry.js +0 -1
  246. package/dist/apollo-core/p-4efecab2.entry.js +0 -1
  247. package/dist/apollo-core/p-5094dd97.entry.js +0 -1
  248. package/dist/apollo-core/p-70e7facc.entry.js +0 -1
  249. package/dist/apollo-core/p-910be81f.entry.js +0 -1
  250. package/dist/apollo-core/p-e08b434c.entry.js +0 -1
  251. package/dist/components/p-BWyAzrwu.js +0 -1
  252. package/dist/components/p-Bd6JweBt.js +0 -1
  253. package/dist/components/p-Bs6vq0C6.js +0 -1
  254. package/dist/components/p-CGNq3DyC.js +0 -1
  255. package/dist/components/p-CtIUusUL.js +0 -1
  256. package/dist/components/p-DBWV65V-.js +0 -1
  257. package/dist/components/p-Ds28UyUR.js +0 -1
  258. package/dist/components/p-U5dPMCXE.js +0 -1
@@ -2846,20 +2846,24 @@
2846
2846
  "name": "xpl-top-nav-item",
2847
2847
  "description": {
2848
2848
  "kind": "markdown",
2849
- "value": "Single nav row for **`xpl-top-nav`** / **`xpl-nav-header-menu`**. The host uses **`role=\"listitem\"`** when the row\nparticipates in a list: a **`role=\"list\"`** parent, **`slot=\"left-aside\"`** on **`xpl-top-nav`** (list host is\n**`.xpl-top-nav__left-primary`** while slotted nodes stay light-DOM children of **`xpl-top-nav`**), or default-slot rows\nunder **`xpl-nav-header-menu`**. That flag is\nkept in **`@State`** and refreshed after render plus via **`MutationObserver`** on the host (**`class`**, **`slot`**) and\non **`parentElement`** (**`role`**) or on **`.xpl-top-nav__left-primary`** (**`role`**) for **`slot=\"left-aside\"`** under **`xpl-top-nav`**) so DOM context changes\nwithout a full reconnect still re-sync. The internal\n**`xpl-top-nav__brand`** row omits **`listitem`** (it sits in **`.xpl-top-nav__brand-bar`**, not **`.xpl-top-nav__left-primary`**),\nas do **`slot=\"right-aside-mobile\"`** rows (not a list). **`slot=\"dropdown\"`** uses a local **`.xpl-top-nav-item__dropdown`**\npanel (not **`xpl-dropdown`**); see **`TECH_DEBT.md`**.\n\n**Default slot (no `label`):** do not put **`xpl-top-nav-item__inner`** or other **`xpl-top-nav-item__*`** classes on\ncustom trigger content — the component renders the inner wrapper and BEM elements.\n\n**Theming:** The host always includes Foundation’s **`dark`** class so **`--xpl-*`** purpose tokens resolve to dark-mode\nvalues even when the page root is light (consistent with **`xpl-top-nav`**)."
2849
+ "value": "Single nav row for **`xpl-top-nav`** / **`xpl-nav-header-menu`** / **`xpl-top-nav-menu`**. The host uses\n**`role=\"listitem\"`** when the row participates in a list: a **`role=\"list\"`** parent, **`slot=\"left-aside\"`** on\n**`xpl-top-nav`** (list host is **`.xpl-top-nav__left-primary`** while slotted nodes stay light-DOM children of\n**`xpl-top-nav`**), or default-slot rows under **`xpl-nav-header-menu`** / **`xpl-top-nav-menu`**. That flag is\nkept in **`@State`** and refreshed after render plus via **`MutationObserver`** on the host (**`class`**, **`slot`**) and\non **`parentElement`** (**`role`**) or on **`.xpl-top-nav__left-primary`** (**`role`**) for **`slot=\"left-aside\"`** under **`xpl-top-nav`**) so DOM context changes\nwithout a full reconnect still re-sync. The internal\n**`xpl-top-nav__brand`** row omits **`listitem`** (it sits in **`.xpl-top-nav__brand-bar`**, not **`.xpl-top-nav__left-primary`**),\nas do **`slot=\"right-aside-mobile\"`** rows (not a list). **`slot=\"dropdown\"`** uses a local **`.xpl-top-nav-item__dropdown`**\npanel (not **`xpl-dropdown`**); see **`TECH_DEBT.md`**.\n\n**This component does triple duty:** a plain bar item, a dropdown trigger (**`slot=\"dropdown\"`** present), and a\ndropdown/menu **row** (nested inside **`xpl-nav-header-menu`** or **`xpl-top-nav-menu`**). The **`description`** prop\nonly applies in the row context — bar items and triggers do not show it in Figma.\n\n**Default slot (no `label`):** do not put **`xpl-top-nav-item__inner`** or other **`xpl-top-nav-item__*`** classes on\ncustom trigger content — the component renders the inner wrapper and BEM elements.\n\n**Theming:** The host always includes Foundation’s **`dark`** class so **`--xpl-*`** purpose tokens resolve to dark-mode\nvalues even when the page root is light (consistent with **`xpl-top-nav`**)."
2850
2850
  },
2851
2851
  "attributes": [
2852
2852
  {
2853
2853
  "name": "active",
2854
2854
  "description": "When true, adds **`xpl-top-nav-item--active`** for persistent accent styling (e.g. link color on the bar, or\nchrome inside **`xpl-nav-header-menu`**). Separate from **`selected`**, which sets **`aria-current=\"page\"`** and\n**`--selected`**. Use both when the design needs “current page” semantics plus the active visual treatment."
2855
2855
  },
2856
+ {
2857
+ "name": "description",
2858
+ "description": "Optional description line shown below **`label`** (row context only, e.g. inside **`xpl-nav-header-menu`** /\n**`xpl-top-nav-menu`**). Ignored when **`label`** is not set."
2859
+ },
2856
2860
  {
2857
2861
  "name": "href",
2858
2862
  "description": "If set without **`slot=\"dropdown\"`**, the inner control renders as a native **`<a href>`** (link mode)."
2859
2863
  },
2860
2864
  {
2861
2865
  "name": "icon",
2862
- "description": "Icon name from **`@xplortech/apollo-icons`** (shown before the label when **`label`** is set)."
2866
+ "description": "Icon name from **`@xplortech/apollo-icons`** (shown before the label when **`label`** is set). Ignored when\n**`slot=\"leading-icon\"`** content is present."
2863
2867
  },
2864
2868
  {
2865
2869
  "name": "item-aria-label",
@@ -2869,12 +2873,41 @@
2869
2873
  "name": "label",
2870
2874
  "description": "Text label. If omitted, use the default slot for custom trigger content. Long labels use **`text-ellipsis`**\non **`.xpl-top-nav-item__label`** (see `top-nav.css`); **`title`** is set to the full string for hover tooltips\nwhen the visual line clips."
2871
2875
  },
2876
+ {
2877
+ "name": "open",
2878
+ "description": "Whether the **`slot=\"dropdown\"`** panel is open. Reflected to the **`open`** attribute so consumers can drive it\n(controlled) or read it back (uncontrolled, toggled internally on click / hover / keyboard activation). Prefer\n**`openMenu()`** / **`closeMenu()`** / **`toggleMenu()`** over setting this directly from event handlers."
2879
+ },
2880
+ {
2881
+ "name": "open-mode",
2882
+ "description": "How the **`slot=\"dropdown\"`** panel opens. **`hover`** is gated on **`TOP_NAV_ITEM_HOVER_OPEN_MQ`**\n(hover-capable, fine pointer, **`md`** and up) — below that, or on touch / coarse-pointer devices, **`hover`**\nfalls back to click/tap. Keyboard activation (Enter / Space) always toggles regardless of **`openMode`**.",
2883
+ "values": [
2884
+ {
2885
+ "name": "click"
2886
+ },
2887
+ {
2888
+ "name": "hover"
2889
+ }
2890
+ ]
2891
+ },
2872
2892
  {
2873
2893
  "name": "selected",
2874
2894
  "description": "When true, sets **`aria-current=\"page\"`** and selected styling."
2875
2895
  }
2876
2896
  ]
2877
2897
  },
2898
+ {
2899
+ "name": "xpl-top-nav-menu",
2900
+ "description": {
2901
+ "kind": "markdown",
2902
+ "value": "Thin grouping container for **`xpl-top-nav-item`** rows — the panel content for a desktop flyout\n(**`slot=\"dropdown\"`** on the parent **`xpl-top-nav-item`**) and, on small screens, the **mobile\ncascade**: the same markup drills in to a **Level 2** view in place, with an auto-rendered **back\nrow** (leading **`chevron-left`** + this component's **`label`**) as the first row. Tapping the back\nrow closes the parent trigger's dropdown (**`closeMenu()`**), returning to **Level 1** and restoring\nfocus to the parent trigger. No item logic otherwise lives here — row behavior (icons, description,\nlinks, nested dropdowns) is entirely **`xpl-top-nav-item`**.\n\n**One authoring markup, two renderings:** consumers write this once; **`isMobileCascade`** (synced\nfrom **`TOP_NAV_MOBILE_MQ`**) decides whether the back row renders. Desktop never sees it — the\nflyout is a single level of links (see `xpl-top-nav-item`'s cascade-depth notes).\n\n**Panel chrome** is shared with **`xpl-nav-header-menu`** (the account menu): width\n(**`--xpl-top-nav-panel-width`**), surface, shadow, radius, and vertical padding all come from the\nsame selector in `top-nav.css` so the desktop flyout, mobile cascade, and account menu read as one\nvisual family.\n\n**Theming:** The host always includes Foundation’s **`dark`** class so **`--xpl-*`** purpose tokens\nresolve to dark-mode values even when the page root is light (consistent with the rest of the\n**`xpl-top-nav`** family)."
2903
+ },
2904
+ "attributes": [
2905
+ {
2906
+ "name": "label",
2907
+ "description": "Accessible name for the list (**`aria-label`** on the host) and the label shown in the mobile\ncascade back row when drilling back out of this group."
2908
+ }
2909
+ ]
2910
+ },
2878
2911
  {
2879
2912
  "name": "xpl-utility-bar",
2880
2913
  "description": {
package/build/style.css CHANGED
@@ -1419,7 +1419,7 @@ textarea[class^="xpl-"] {
1419
1419
  --tw-ring-inset: var(--tw-empty, /*!*/ /*!*/);
1420
1420
  --tw-ring-offset-width: 0;
1421
1421
  --tw-ring-offset-color: #fff;
1422
- --tw-ring-color: rgba(59 130 246 / 50%);
1422
+ --tw-ring-color: rgb(59 130 246 / 50%);
1423
1423
  --tw-ring-offset-shadow: 0 0 #0000;
1424
1424
  --tw-ring-shadow: 0 0 #0000;
1425
1425
  }
@@ -6617,7 +6617,6 @@ xpl-list .xpl-list__reorder-live {
6617
6617
 
6618
6618
  .xpl-list-item-subtext {
6619
6619
  color: var(--xpl-text-subdued);
6620
- word-wrap: break-word;
6621
6620
  overflow-wrap: break-word;
6622
6621
  }
6623
6622
 
@@ -7132,8 +7131,8 @@ xpl-list-item .xpl-list-item__actions [slot="actions"] xpl-icon[role="button"] {
7132
7131
 
7133
7132
  .xpl-modal__dialog {
7134
7133
  box-shadow:
7135
- 0 10px 15px -3px rgba(0 0 0 / 0.1),
7136
- 0 4px 6px -2px rgba(0 0 0 / 0.05);
7134
+ 0 10px 15px -3px rgb(0 0 0 / 0.1),
7135
+ 0 4px 6px -2px rgb(0 0 0 / 0.05);
7137
7136
  border-radius: 1rem;
7138
7137
  padding: 1rem;
7139
7138
  --tw-text-opacity: 1;
@@ -8297,7 +8296,7 @@ xpl-list-item .xpl-list-item__actions [slot="actions"] xpl-icon[role="button"] {
8297
8296
 
8298
8297
  .xpl-secondary-nav nav::after {
8299
8298
  content: "";
8300
- background: linear-gradient(270deg, #fff 13.64%, rgba(255 255 255 / 0%) 89.53%);
8299
+ background: linear-gradient(270deg, #fff 13.64%, rgb(255 255 255 / 0%) 89.53%);
8301
8300
  position: absolute;
8302
8301
  top: 0px;
8303
8302
  bottom: 0px;
@@ -8307,7 +8306,7 @@ xpl-list-item .xpl-list-item__actions [slot="actions"] xpl-icon[role="button"] {
8307
8306
  }
8308
8307
 
8309
8308
  .dark .xpl-secondary-nav nav::after {
8310
- background: linear-gradient(270deg, rgba(32 30 41 / 100%) 20%, rgb(32 30 41 / 15%) 89%);
8309
+ background: linear-gradient(270deg, rgb(32 30 41 / 100%) 20%, rgb(32 30 41 / 15%) 89%);
8311
8310
  }
8312
8311
  }
8313
8312
 
@@ -8582,8 +8581,8 @@ span.xpl-placeholder--hidden,
8582
8581
 
8583
8582
  background-color: var(--xpl-color-foreground-lm);
8584
8583
  box-shadow:
8585
- -10px 0 15px -3px rgba(0 0 0 / 0.1),
8586
- 4px 0 6px -2px rgba(0 0 0 / 0.05);
8584
+ -10px 0 15px -3px rgb(0 0 0 / 0.1),
8585
+ 4px 0 6px -2px rgb(0 0 0 / 0.05);
8587
8586
  transform: translateX(0);
8588
8587
  transition: transform 0.5s ease-in-out
8589
8588
  }
@@ -8635,10 +8634,10 @@ span.xpl-placeholder--hidden,
8635
8634
 
8636
8635
  .xpl-slideout .slideout .content.has-shadow {
8637
8636
  box-shadow:
8638
- inset 0 4px 6px -1px rgba(0 0 0 / 0.1),
8639
- inset 0 2px 4px -1px rgba(0 0 0 / 0.06),
8640
- inset 0 -4px 6px -1px rgba(0 0 0 / 0.1),
8641
- inset 0 -2px 4px -1px rgba(0 0 0 / 0.06);
8637
+ inset 0 4px 6px -1px rgb(0 0 0 / 0.1),
8638
+ inset 0 2px 4px -1px rgb(0 0 0 / 0.06),
8639
+ inset 0 -4px 6px -1px rgb(0 0 0 / 0.1),
8640
+ inset 0 -2px 4px -1px rgb(0 0 0 / 0.06);
8642
8641
  }
8643
8642
 
8644
8643
  .xpl-slideout .slideout [slot="content"] {
@@ -9553,8 +9552,8 @@ span.xpl-placeholder--hidden,
9553
9552
  background-color: var(--xpl-color-secondary-bg-lm);
9554
9553
 
9555
9554
  box-shadow:
9556
- 0 10px 15px -3px rgba(0 0 0/ 0.1),
9557
- 0 4px 6px -2px rgba(0 0 0/ 0.05);
9555
+ 0 10px 15px -3px rgb(0 0 0/ 0.1),
9556
+ 0 4px 6px -2px rgb(0 0 0/ 0.05);
9558
9557
  animation: fadeIn 0.5s forwards
9559
9558
  }
9560
9559
 
@@ -9987,9 +9986,10 @@ span.xpl-placeholder--hidden,
9987
9986
  /* Constrain width on small screens so a long tooltip cannot overflow the viewport. Figma does not define a desktop max width, so the tooltip sizes to its content there. */
9988
9987
 
9989
9988
  @media screen and (max-width: 768px) {
9990
- .xpl-tooltip {
9991
- max-width: var(--xpl-size-700);
9992
- }
9989
+
9990
+ .xpl-tooltip {
9991
+ max-width: var(--xpl-size-700)
9992
+ }
9993
9993
  }
9994
9994
 
9995
9995
  /* Position variants */
@@ -10233,7 +10233,9 @@ xpl-top-nav-item.xpl-toolbar[hidden] {
10233
10233
  font-size: var(--xpl-font-size-title-4);
10234
10234
  color: var(--xpl-text-subdued);
10235
10235
  font-weight: var(--xpl-font-weight-medium);
10236
- gap: var(--xpl-space-4);
10236
+
10237
+ /* Figma: 8px gap between label and leading/trailing icon slots (matches every other context override below). */
10238
+ gap: var(--xpl-space-8);
10237
10239
  box-sizing: border-box;
10238
10240
  display: flex;
10239
10241
  height: 100%;
@@ -10245,21 +10247,23 @@ xpl-top-nav-item.xpl-toolbar[hidden] {
10245
10247
  white-space: nowrap;
10246
10248
  }
10247
10249
 
10248
- /* xpl-nav-header-menu — host + inner base before shared bar `:focus-visible` */
10250
+ /* xpl-nav-header-menu / xpl-top-nav-menu — host + inner base before shared bar `:focus-visible` */
10249
10251
 
10250
- xpl-nav-header-menu xpl-top-nav-item.xpl-top-nav-item {
10252
+ xpl-nav-header-menu xpl-top-nav-item.xpl-top-nav-item,
10253
+ xpl-top-nav-menu xpl-top-nav-item.xpl-top-nav-item {
10251
10254
  width: 100%;
10252
10255
  border-bottom-width: 0px
10253
10256
  }
10254
10257
 
10255
- xpl-nav-header-menu xpl-top-nav-item > .xpl-top-nav-item__inner {
10258
+ xpl-nav-header-menu xpl-top-nav-item > .xpl-top-nav-item__inner,
10259
+ xpl-top-nav-menu xpl-top-nav-item > .xpl-top-nav-item__inner {
10256
10260
  padding: var(--xpl-space-10) var(--xpl-space-12);
10257
10261
  gap: var(--xpl-space-8);
10258
10262
  color: var(--xpl-text-default);
10259
10263
  justify-content: flex-start;
10260
10264
  }
10261
10265
 
10262
- /* Focus is on the inner `<a>` / `<div role="button">` (tabIndex), not the host — use `:focus-visible` here (see side-nav.css). */
10266
+ /* Focus is on the inner `<a>` / `<button>` (tabIndex), not the host — use `:focus-visible` here (see side-nav.css). */
10263
10267
 
10264
10268
  xpl-top-nav-item > .xpl-top-nav-item__inner:focus-visible {
10265
10269
  outline-color: var(--xpl-border-focus);
@@ -10277,14 +10281,63 @@ xpl-top-nav-item > .xpl-top-nav-item__inner:focus-visible {
10277
10281
  white-space: nowrap;
10278
10282
  }
10279
10283
 
10284
+ /*
10285
+ * Row context only (menu rows with a `description`): wraps label + description in a column so both share the
10286
+ * flex-1 / min-w-0 track that `.xpl-top-nav-item__label` alone occupies in the no-description case above.
10287
+ * No `display` beyond `flex flex-col` here — this wrapper (unlike `__leading` / `__trailing`) is not a bare
10288
+ * icon slot column, it owns its own two-row layout (Figma "Label+Desc.").
10289
+ */
10290
+
10291
+ .xpl-top-nav-item__label-group {
10292
+ gap: var(--xpl-space-0);
10293
+ display: flex;
10294
+ min-width: 0px;
10295
+ flex: 1 1 0%;
10296
+ flex-direction: column;
10297
+ }
10298
+
10299
+ .xpl-top-nav-item__label-group .xpl-top-nav-item__label {
10300
+ flex: none
10301
+ }
10302
+
10303
+ .xpl-top-nav-item__description {
10304
+ font-size: var(--xpl-font-size-callout);
10305
+ color: var(--xpl-text-subdued);
10306
+ margin: 0px;
10307
+ min-width: 0px;
10308
+ overflow: hidden;
10309
+ text-overflow: ellipsis;
10310
+ white-space: nowrap;
10311
+ }
10312
+
10313
+ /*
10314
+ * Leading / trailing icon slot columns. Deliberately no `display` here (side-nav lesson, see
10315
+ * `xpl-side-nav-item.tsx`): as flex items of `.xpl-top-nav-item__inner` (`display: flex`) they are
10316
+ * blockified automatically, and the slotted `xpl-icon` handles its own internal centering. Adding
10317
+ * `display: flex` / `display: grid` here mis-aligns the slotted icon's SVG.
10318
+ */
10319
+
10320
+ .xpl-top-nav-item__leading,
10321
+ .xpl-top-nav-item__trailing {
10322
+ flex-shrink: 0
10323
+ }
10324
+
10280
10325
  xpl-top-nav-item a,
10281
10326
  xpl-top-nav-item button {
10282
10327
  cursor: inherit;
10283
10328
  font: inherit;
10329
+
10330
+ /* Reset the native `<button>` UA chrome (grey background, system appearance, centered text) so the button-mode
10331
+ * inner control renders identically to the anchor-mode one; `text-align` follows the label's own flex layout. */
10332
+ text-align: inherit;
10284
10333
  margin: 0px;
10285
10334
  display: flex;
10335
+ -webkit-appearance: none;
10336
+ -moz-appearance: none;
10337
+ appearance: none;
10286
10338
  align-items: center;
10287
10339
  border-width: 0px;
10340
+ background-color: transparent;
10288
10341
  padding: 0px;
10289
10342
  }
10290
10343
 
@@ -10320,6 +10373,17 @@ xpl-top-nav-item.xpl-top-nav-item--selected > .xpl-top-nav-item__inner {
10320
10373
  font-weight: var(--xpl-font-weight-medium);
10321
10374
  }
10322
10375
 
10376
+ /*
10377
+ * Active-descendant hook: a dropdown trigger whose panel contains an `--active` / `--selected` row (however deep)
10378
+ * gets the same accent as `--active` itself, so a parent product/group stays highlighted while its current child
10379
+ * is open elsewhere (e.g. desktop flyout, PR 2/3). Synced via `hasActiveDescendant` in `xpl-top-nav-item.tsx`.
10380
+ */
10381
+
10382
+ xpl-top-nav-item.xpl-top-nav-item--has-active-descendant > .xpl-top-nav-item__inner {
10383
+ color: var(--xpl-text-link-default);
10384
+ font-weight: var(--xpl-font-weight-medium);
10385
+ }
10386
+
10323
10387
  /* Right side username (e.g. profile trigger): same as nav header username */
10324
10388
 
10325
10389
  .xpl-nav-right xpl-top-nav-item > .xpl-top-nav-item__inner {
@@ -10328,9 +10392,10 @@ xpl-top-nav-item.xpl-top-nav-item--selected > .xpl-top-nav-item__inner {
10328
10392
  gap: var(--xpl-space-8);
10329
10393
  }
10330
10394
 
10331
- /* Account menu list rows (`xpl-nav-header-menu` default slot): row gap between icon and label */
10395
+ /* Menu list rows (`xpl-nav-header-menu` default slot, `xpl-top-nav-menu` default slot): row gap between icon and label */
10332
10396
 
10333
- .xpl-nav-header-menu__slot xpl-top-nav-item > .xpl-top-nav-item__inner {
10397
+ .xpl-nav-header-menu__slot xpl-top-nav-item > .xpl-top-nav-item__inner,
10398
+ .xpl-top-nav-menu xpl-top-nav-item > .xpl-top-nav-item__inner {
10334
10399
  gap: var(--xpl-space-8);
10335
10400
  font-size: var(--xpl-font-size-title-5);
10336
10401
  font-weight: var(--xpl-font-weight-normal);
@@ -10393,15 +10458,19 @@ xpl-top-nav-item.xpl-top-nav-item--selected:active > .xpl-top-nav-item__inner {
10393
10458
  margin-inline-start: var(--xpl-space-8);
10394
10459
  }
10395
10460
 
10396
- /* xpl-nav-header-menu menu-row overrides after shared/brand bar item states. */
10461
+ /* xpl-nav-header-menu / xpl-top-nav-menu row overrides after shared/brand bar item states. */
10397
10462
 
10398
10463
  .xpl-nav-header-menu .xpl-top-nav-item:hover > .xpl-top-nav-item__inner,
10399
- .xpl-nav-header-menu .xpl-top-nav-item > .xpl-top-nav-item__inner:focus-visible {
10464
+ .xpl-nav-header-menu .xpl-top-nav-item > .xpl-top-nav-item__inner:focus-visible,
10465
+ .xpl-top-nav-menu .xpl-top-nav-item:hover > .xpl-top-nav-item__inner,
10466
+ .xpl-top-nav-menu .xpl-top-nav-item > .xpl-top-nav-item__inner:focus-visible {
10400
10467
  background-color: var(--xpl-background-action-tertiary-hover);
10401
10468
  }
10402
10469
 
10403
10470
  .xpl-nav-header-menu .xpl-top-nav-item.xpl-top-nav-item--active,
10404
- .xpl-nav-header-menu .xpl-top-nav-item.xpl-top-nav-item--selected {
10471
+ .xpl-nav-header-menu .xpl-top-nav-item.xpl-top-nav-item--selected,
10472
+ .xpl-top-nav-menu .xpl-top-nav-item.xpl-top-nav-item--active,
10473
+ .xpl-top-nav-menu .xpl-top-nav-item.xpl-top-nav-item--selected {
10405
10474
  border-right-width: 1px;
10406
10475
  border-style: solid;
10407
10476
 
@@ -10413,7 +10482,8 @@ xpl-top-nav-item.xpl-top-nav-item--selected:active > .xpl-top-nav-item__inner {
10413
10482
  background-color: var(--xpl-background-surface-transparent-0)
10414
10483
  }
10415
10484
 
10416
- .xpl-nav-header-menu .xpl-top-nav-item.xpl-top-nav-item--active {
10485
+ .xpl-nav-header-menu .xpl-top-nav-item.xpl-top-nav-item--active,
10486
+ .xpl-top-nav-menu .xpl-top-nav-item.xpl-top-nav-item--active {
10417
10487
  color: var(--xpl-text-link-default);
10418
10488
  }
10419
10489
 
@@ -10422,7 +10492,9 @@ xpl-top-nav-item.xpl-top-nav-item--selected:active > .xpl-top-nav-item__inner {
10422
10492
  */
10423
10493
 
10424
10494
  .xpl-nav-header-menu .xpl-top-nav-item.xpl-top-nav-item--active > .xpl-top-nav-item__inner,
10425
- .xpl-nav-header-menu .xpl-top-nav-item.xpl-top-nav-item--selected > .xpl-top-nav-item__inner {
10495
+ .xpl-nav-header-menu .xpl-top-nav-item.xpl-top-nav-item--selected > .xpl-top-nav-item__inner,
10496
+ .xpl-top-nav-menu .xpl-top-nav-item.xpl-top-nav-item--active > .xpl-top-nav-item__inner,
10497
+ .xpl-top-nav-menu .xpl-top-nav-item.xpl-top-nav-item--selected > .xpl-top-nav-item__inner {
10426
10498
  background-color: var(--xpl-background-surface-information);
10427
10499
  color: inherit;
10428
10500
  gap: var(--xpl-space-8);
@@ -10439,6 +10511,14 @@ xpl-top-nav-item.xpl-top-nav-item--selected:active > .xpl-top-nav-item__inner {
10439
10511
  .xpl-top-nav-item.xpl-top-nav-item--active
10440
10512
  > .xpl-top-nav-item__inner:focus-visible,
10441
10513
  .xpl-nav-header-menu
10514
+ .xpl-top-nav-item.xpl-top-nav-item--selected
10515
+ > .xpl-top-nav-item__inner:focus-visible,
10516
+ .xpl-top-nav-menu .xpl-top-nav-item.xpl-top-nav-item--active:hover > .xpl-top-nav-item__inner,
10517
+ .xpl-top-nav-menu .xpl-top-nav-item.xpl-top-nav-item--selected:hover > .xpl-top-nav-item__inner,
10518
+ .xpl-top-nav-menu
10519
+ .xpl-top-nav-item.xpl-top-nav-item--active
10520
+ > .xpl-top-nav-item__inner:focus-visible,
10521
+ .xpl-top-nav-menu
10442
10522
  .xpl-top-nav-item.xpl-top-nav-item--selected
10443
10523
  > .xpl-top-nav-item__inner:focus-visible {
10444
10524
  background-color: var(--xpl-background-surface-information);
@@ -10465,18 +10545,27 @@ xpl-top-nav-item.xpl-top-nav-item--selected:active > .xpl-top-nav-item__inner {
10465
10545
  color: var(--xpl-text-strong);
10466
10546
  }
10467
10547
 
10468
- /* Non-current `xpl-nav-header-menu` rows: default text on hover/focus/active. */
10548
+ /* Non-current `xpl-nav-header-menu` / `xpl-top-nav-menu` rows: default text on hover/focus/active. */
10469
10549
 
10470
10550
  .xpl-nav-header-menu
10471
10551
  .xpl-top-nav-item:not(.xpl-top-nav-item--active, .xpl-top-nav-item--selected):hover
10472
10552
  > .xpl-top-nav-item__inner,
10473
10553
  .xpl-nav-header-menu
10554
+ .xpl-top-nav-item:not(.xpl-top-nav-item--active, .xpl-top-nav-item--selected)
10555
+ > .xpl-top-nav-item__inner:focus-visible,
10556
+ .xpl-top-nav-menu
10557
+ .xpl-top-nav-item:not(.xpl-top-nav-item--active, .xpl-top-nav-item--selected):hover
10558
+ > .xpl-top-nav-item__inner,
10559
+ .xpl-top-nav-menu
10474
10560
  .xpl-top-nav-item:not(.xpl-top-nav-item--active, .xpl-top-nav-item--selected)
10475
10561
  > .xpl-top-nav-item__inner:focus-visible {
10476
10562
  color: var(--xpl-text-default);
10477
10563
  }
10478
10564
 
10479
10565
  .xpl-nav-header-menu
10566
+ .xpl-top-nav-item:not(.xpl-top-nav-item--active, .xpl-top-nav-item--selected):active
10567
+ > .xpl-top-nav-item__inner,
10568
+ .xpl-top-nav-menu
10480
10569
  .xpl-top-nav-item:not(.xpl-top-nav-item--active, .xpl-top-nav-item--selected):active
10481
10570
  > .xpl-top-nav-item__inner {
10482
10571
  color: var(--xpl-text-default);
@@ -10523,7 +10612,9 @@ xpl-top-nav-item.xpl-top-nav-item--selected:active > .xpl-top-nav-item__inner {
10523
10612
  .xpl-top-nav-item .xpl-top-nav-item__dropdown {
10524
10613
  background: var(--xpl-background-surface-default);
10525
10614
  max-width: var(--xpl-top-nav-dropdown-max-width);
10526
- border-radius: var(--xpl-border-radius-default);
10615
+
10616
+ /* Figma: `XPL-Dropdown Menu` panel is bound to `border/radius/small` (4px), not the 8px default. */
10617
+ border-radius: var(--xpl-border-radius-small);
10527
10618
  padding: var(--xpl-space-8) var(--xpl-space-0);
10528
10619
  z-index: var(--xpl-z-index-600);
10529
10620
  position: absolute;
@@ -10547,6 +10638,24 @@ xpl-top-nav-item.xpl-top-nav-item--selected:active > .xpl-top-nav-item__inner {
10547
10638
  display: block
10548
10639
  }
10549
10640
 
10641
+ /*
10642
+ * `xpl-top-nav-menu` supplies its own panel chrome (background / shadow / radius — see the shared
10643
+ * selector below) sized to `--xpl-top-nav-panel-width`, not the generic `max-width` this wrapper uses
10644
+ * for arbitrary `slot="dropdown"` markup (e.g. a plain `<ul>`). Defer to it so the flyout doesn't
10645
+ * double up background/shadow/radius — same pattern as `xpl-popover__content:has(xpl-nav-header-menu)`
10646
+ * below deferring padding to the account menu.
10647
+ */
10648
+
10649
+ .xpl-top-nav-item .xpl-top-nav-item__dropdown:has(xpl-top-nav-menu) {
10650
+ background: none;
10651
+ max-width: none;
10652
+ border-radius: var(--xpl-border-radius-none);
10653
+ padding: var(--xpl-space-0);
10654
+ --tw-shadow: 0 0 #0000;
10655
+ --tw-shadow-colored: 0 0 #0000;
10656
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
10657
+ }
10658
+
10550
10659
  /* Slotted links/controls in the local dropdown panel (not `.xpl-top-nav-item__inner`). */
10551
10660
 
10552
10661
  xpl-top-nav-item .xpl-top-nav-item__dropdown :focus-visible {
@@ -10561,6 +10670,15 @@ xpl-popover .xpl-popover__content:has(xpl-nav-header-menu) {
10561
10670
  padding: 0px
10562
10671
  }
10563
10672
 
10673
+ /*
10674
+ * Shared panel chrome (desktop flyout, mobile cascade, account menu): same width and vertical
10675
+ * padding for `xpl-top-nav-menu` and `xpl-nav-header-menu`. Background / shadow / radius are
10676
+ * declared on `xpl-top-nav-menu` only, below — `xpl-nav-header-menu` already gets identical values
10677
+ * from its `xpl-popover__content` ancestor (see `popover.css`), so duplicating them here would
10678
+ * stack two shadows at the same edge.
10679
+ */
10680
+
10681
+ .xpl-top-nav-menu,
10564
10682
  .xpl-nav-header-menu {
10565
10683
  color: var(--xpl-text-default);
10566
10684
  width: var(--xpl-top-nav-panel-width);
@@ -10570,6 +10688,18 @@ xpl-popover .xpl-popover__content:has(xpl-nav-header-menu) {
10570
10688
  overflow: hidden;
10571
10689
  }
10572
10690
 
10691
+ .xpl-top-nav-menu {
10692
+ background: var(--xpl-background-surface-default);
10693
+
10694
+ /* Figma: `XPL-Dropdown Menu` panel is bound to `border/radius/small` (4px), matching the
10695
+ * `.xpl-top-nav-item__dropdown` panel this menu renders inside — not the 8px default. */
10696
+ border-radius: var(--xpl-border-radius-small);
10697
+ gap: var(--xpl-space-4);
10698
+ --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
10699
+ --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);
10700
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
10701
+ }
10702
+
10573
10703
  .xpl-nav-header-menu__profile {
10574
10704
  padding: var(--xpl-space-16) var(--xpl-space-0);
10575
10705
  border-bottom: var(--xpl-border-small) solid var(--xpl-border-default);
@@ -10958,9 +11088,11 @@ xpl-popover.xpl-top-nav__user-popover > .xpl-popover > span[role="button"]:focus
10958
11088
  color: var(--xpl-icon-subtle);
10959
11089
  fill: currentcolor;
10960
11090
 
10961
- /* Figma menu glyph 20px (`42002:35185`); `xpl-top-nav.tsx` passes `size={20}` for SVG output. */
10962
- height: var(--xpl-size-125);
10963
- width: var(--xpl-size-125);
11091
+ /* Matches the side-nav drawer toggle glyph size; `xpl-top-nav.tsx` passes `size={32}` for SVG
11092
+ * output. Container (`.xpl-top-nav__nav-control`) stays >= `--xpl-size-250` (40px, see MOBILE
11093
+ * block) so the touch target does not shrink below WCAG target-size guidance as the glyph grows. */
11094
+ height: var(--xpl-size-200);
11095
+ width: var(--xpl-size-200);
10964
11096
  flex-shrink: 0;
10965
11097
  }
10966
11098
 
@@ -11229,6 +11361,99 @@ xpl-popover.xpl-top-nav__user-popover > .xpl-popover > span[role="button"]:focus
11229
11361
  align-items: stretch;
11230
11362
  }
11231
11363
 
11364
+ /*
11365
+ * Mobile cascade — Level 1 -> Level 2, in place (no second panel): tapping a `left-aside` parent's
11366
+ * dropdown trigger (`xpl-top-nav-item` with `slot="dropdown"` holding an `xpl-top-nav-menu`) hides
11367
+ * every OTHER parent group row, hides the open parent's own trigger row, and lets its
11368
+ * `.xpl-top-nav-item__dropdown` (already `display: block` from `--dropdown-open`) render inline
11369
+ * instead of as an absolute overlay — filling the drawer panel with the group's rows. The auto back
11370
+ * row (leading `chevron-left` + the group's `label`) is rendered by `xpl-top-nav-menu` itself
11371
+ * (`renderBackRow()`, gated on the same `TOP_NAV_MOBILE_MQ`); popping it calls `closeMenu()` on this
11372
+ * same trigger, which removes `--dropdown-open` and reverses every rule below back to Level 1.
11373
+ */
11374
+ .xpl-top-nav.xpl-top-nav--nav-control.xpl-top-nav--open
11375
+ .xpl-top-nav__left-primary:has(
11376
+ > xpl-top-nav-item[slot="left-aside"].xpl-top-nav-item--dropdown-open
11377
+ )
11378
+ > xpl-top-nav-item[slot="left-aside"]:not(.xpl-top-nav-item--dropdown-open) {
11379
+ display: none
11380
+ }
11381
+
11382
+ .flatpickr-day.xpl-top-nav.xpl-top-nav--nav-control.xpl-top-nav--open
11383
+ .xpl-top-nav__left-primary:has(
11384
+ > xpl-top-nav-item[slot="left-aside"].xpl-top-nav-item--dropdown-open
11385
+ )
11386
+ > xpl-top-nav-item[slot="left-aside"]:not(.xpl-top-nav-item--dropdown-open){visibility:hidden}
11387
+
11388
+ .xpl-toolbar.xpl-top-nav.xpl-top-nav--nav-control.xpl-top-nav--open
11389
+ .xpl-top-nav__left-primary:has(
11390
+ > xpl-top-nav-item[slot="left-aside"].xpl-top-nav-item--dropdown-open
11391
+ )
11392
+ > xpl-top-nav-item[slot="left-aside"]:not(.xpl-top-nav-item--dropdown-open) {
11393
+ display: none;
11394
+ }
11395
+
11396
+ .xpl-top-nav.xpl-top-nav--nav-control.xpl-top-nav--open
11397
+ .xpl-top-nav__left-primary
11398
+ > xpl-top-nav-item[slot="left-aside"].xpl-top-nav-item--dropdown-open
11399
+ > .xpl-top-nav-item__inner {
11400
+ display: none
11401
+ }
11402
+
11403
+ .flatpickr-day.xpl-top-nav.xpl-top-nav--nav-control.xpl-top-nav--open
11404
+ .xpl-top-nav__left-primary
11405
+ > xpl-top-nav-item[slot="left-aside"].xpl-top-nav-item--dropdown-open
11406
+ > .xpl-top-nav-item__inner{visibility:hidden}
11407
+
11408
+ .xpl-toolbar.xpl-top-nav.xpl-top-nav--nav-control.xpl-top-nav--open
11409
+ .xpl-top-nav__left-primary
11410
+ > xpl-top-nav-item[slot="left-aside"].xpl-top-nav-item--dropdown-open
11411
+ > .xpl-top-nav-item__inner {
11412
+ display: none;
11413
+ }
11414
+
11415
+ .xpl-top-nav.xpl-top-nav--nav-control.xpl-top-nav--open
11416
+ .xpl-top-nav__left-primary
11417
+ > xpl-top-nav-item[slot="left-aside"].xpl-top-nav-item--dropdown-open
11418
+ > .xpl-top-nav-item__dropdown {
11419
+ position: static;
11420
+ max-width: none;
11421
+ display: block;
11422
+ width: 100%;
11423
+ }
11424
+
11425
+ /*
11426
+ * `xpl-top-nav-menu` supplies its own self-contained panel chrome for the desktop flyout (see
11427
+ * `top-nav.css` shared-selector block), but inside the mobile drawer it is filling a panel that
11428
+ * already has its OWN background / border / shadow (`.xpl-top-nav__left-primary` above) — suppress
11429
+ * the menu's chrome here so Level 2 reads as one continuous panel, not a nested card.
11430
+ */
11431
+ .xpl-top-nav__left-primary xpl-top-nav-menu {
11432
+ background: none;
11433
+ width: 100%;
11434
+ border-radius: var(--xpl-border-radius-none);
11435
+ padding: var(--xpl-space-0);
11436
+ --tw-shadow: 0 0 #0000;
11437
+ --tw-shadow-colored: 0 0 #0000;
11438
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
11439
+ }
11440
+
11441
+ /*
11442
+ * Row sizing (mobile — Figma "Sm Screen" menu-item spec): 48px row via title-3 (20px) label height,
11443
+ * 24px icons. Applies to the mobile cascade's Level 2 rows (including the auto back row) and,
11444
+ * consistently, the account menu's rows on the same narrow viewports.
11445
+ */
11446
+ .xpl-top-nav-menu xpl-top-nav-item > .xpl-top-nav-item__inner,
11447
+ .xpl-nav-header-menu xpl-top-nav-item > .xpl-top-nav-item__inner {
11448
+ font-size: var(--xpl-font-size-title-3);
11449
+ }
11450
+
11451
+ .xpl-top-nav-menu xpl-top-nav-item xpl-icon,
11452
+ .xpl-nav-header-menu xpl-top-nav-item xpl-icon {
11453
+ width: var(--xpl-size-150);
11454
+ height: var(--xpl-size-150);
11455
+ }
11456
+
11232
11457
  /*
11233
11458
  * Figma (mobile): account menu rows — same hover surface as drawer; beats global `tertiary-hover` for narrow viewports.
11234
11459
  */