@xplortech/apollo-core 2.8.1 → 2.10.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 (310) hide show
  1. package/.typings/apollo-components.html-data.json +20 -12
  2. package/build/style.css +2086 -1875
  3. package/dist/apollo-core/apollo-core.css +20 -18
  4. package/dist/apollo-core/apollo-core.esm.js +1 -1
  5. package/dist/apollo-core/p-0e45f332.entry.js +1 -0
  6. package/dist/apollo-core/p-0f251f98.entry.js +1 -0
  7. package/dist/apollo-core/p-1691c4f3.entry.js +1 -0
  8. package/dist/apollo-core/p-172ac720.entry.js +1 -0
  9. package/dist/apollo-core/p-23870463.entry.js +1 -0
  10. package/dist/apollo-core/{p-36ba29da.entry.js → p-3b8639b7.entry.js} +1 -1
  11. package/dist/apollo-core/p-44a16751.entry.js +1 -0
  12. package/dist/apollo-core/p-4efecab2.entry.js +1 -0
  13. package/dist/apollo-core/p-5094dd97.entry.js +1 -0
  14. package/dist/apollo-core/p-70e7facc.entry.js +1 -0
  15. package/dist/apollo-core/{p-6a15f1e0.entry.js → p-728341d2.entry.js} +1 -1
  16. package/dist/apollo-core/p-910be81f.entry.js +1 -0
  17. package/dist/apollo-core/{p-b61d7952.entry.js → p-9adf3694.entry.js} +1 -1
  18. package/dist/apollo-core/p-CK3_k8jD.js +1 -0
  19. package/dist/apollo-core/p-CXkZUm1c.js +2 -0
  20. package/dist/apollo-core/p-c17b6351.entry.js +1 -0
  21. package/dist/apollo-core/p-e08b434c.entry.js +1 -0
  22. package/dist/apollo-core/{p-ca127ee8.entry.js → p-e9e7577f.entry.js} +1 -1
  23. package/dist/cjs/apollo-core.cjs.js +3 -3
  24. package/dist/cjs/{index-BQ97-AWw.js → index-BaXVr8ux.js} +36 -9
  25. package/dist/cjs/loader.cjs.js +2 -2
  26. package/dist/cjs/package.json +3 -0
  27. package/dist/cjs/v4-_2BfiRUa.js +52 -0
  28. package/dist/cjs/xpl-accordion.cjs.entry.js +3 -3
  29. package/dist/cjs/xpl-application-shell.cjs.entry.js +2 -2
  30. package/dist/cjs/xpl-avatar_54.cjs.entry.js +709 -177
  31. package/dist/cjs/xpl-button-row.cjs.entry.js +2 -2
  32. package/dist/cjs/xpl-calendar.cjs.entry.js +3 -3
  33. package/dist/cjs/xpl-dynamic-table-cell.cjs.entry.js +3 -3
  34. package/dist/cjs/xpl-dynamic-table-row.cjs.entry.js +3 -3
  35. package/dist/cjs/xpl-dynamic-table.cjs.entry.js +2 -2
  36. package/dist/cjs/xpl-grid-item.cjs.entry.js +2 -2
  37. package/dist/cjs/xpl-grid.cjs.entry.js +2 -2
  38. package/dist/cjs/xpl-large-card.cjs.entry.js +2 -2
  39. package/dist/cjs/xpl-main-nav.cjs.entry.js +2 -2
  40. package/dist/cjs/xpl-table-header-cell.cjs.entry.js +1 -1
  41. package/dist/cjs/xpl-table-header.cjs.entry.js +2 -2
  42. package/dist/cjs/xpl-toggle.cjs.entry.js +5 -5
  43. package/dist/cjs/xpl-toolbar.cjs.entry.js +3 -3
  44. package/dist/collection/collection-manifest.json +5 -5
  45. package/dist/collection/components/xpl-accordion/xpl-accordion.js +2 -2
  46. package/dist/collection/components/xpl-application-shell/xpl-application-shell.js +1 -1
  47. package/dist/collection/components/xpl-avatar/xpl-avatar.js +4 -4
  48. package/dist/collection/components/xpl-backdrop/xpl-backdrop.js +1 -1
  49. package/dist/collection/components/xpl-badge/xpl-badge.js +2 -2
  50. package/dist/collection/components/xpl-banner/banner.stories.js +5 -0
  51. package/dist/collection/components/xpl-banner/xpl-banner.js +2 -2
  52. package/dist/collection/components/xpl-breadcrumbs/xpl-breadcrumb-item/xpl-breadcrumb-item.js +1 -1
  53. package/dist/collection/components/xpl-breadcrumbs/xpl-breadcrumbs/xpl-breadcrumbs.js +1 -1
  54. package/dist/collection/components/xpl-button/button.stories.js +5 -0
  55. package/dist/collection/components/xpl-button/xpl-button.js +16 -1
  56. package/dist/collection/components/xpl-button-row/button-row.stories.js +1 -11
  57. package/dist/collection/components/xpl-button-row/xpl-button-row.js +1 -1
  58. package/dist/collection/components/xpl-calendar/xpl-calendar.js +1 -1
  59. package/dist/collection/components/xpl-checkbox/xpl-checkbox.js +4 -4
  60. package/dist/collection/components/xpl-choicelist/xpl-choicelist.js +1 -1
  61. package/dist/collection/components/xpl-content-area/xpl-content-area.js +1 -1
  62. package/dist/collection/components/xpl-dashboard/xpl-dashboard.js +1 -1
  63. package/dist/collection/components/xpl-data-card/xpl-data-card.js +2 -2
  64. package/dist/collection/components/xpl-divider/xpl-divider.js +1 -1
  65. package/dist/collection/components/xpl-dropdown/xpl-dropdown-group/xpl-dropdown-group.js +1 -1
  66. package/dist/collection/components/xpl-dropdown/xpl-dropdown-heading/xpl-dropdown-heading.js +1 -1
  67. package/dist/collection/components/xpl-dropdown/xpl-dropdown-option/xpl-dropdown-option.js +2 -2
  68. package/dist/collection/components/xpl-dropdown/xpl-dropdown.js +208 -31
  69. package/dist/collection/components/xpl-dynamic-table/xpl-dynamic-table.js +1 -1
  70. package/dist/collection/components/xpl-dynamic-table-cell/xpl-dynamic-table-cell.js +2 -2
  71. package/dist/collection/components/xpl-dynamic-table-row/xpl-dynamic-table-row.js +2 -2
  72. package/dist/collection/components/xpl-grid/xpl-grid.js +1 -1
  73. package/dist/collection/components/xpl-grid-item/xpl-grid-item.js +1 -1
  74. package/dist/collection/components/xpl-header-accordion/xpl-header-accordion.js +1 -1
  75. package/dist/collection/components/xpl-icon/xpl-icon.js +2 -2
  76. package/dist/collection/components/xpl-input/input.stories.js +1 -1
  77. package/dist/collection/components/xpl-input/xpl-input-color/xpl-input-color.js +11 -9
  78. package/dist/collection/components/xpl-input/xpl-input-date/xpl-input-date.js +3 -3
  79. package/dist/collection/components/xpl-input/xpl-input-file/xpl-input-file.js +4 -4
  80. package/dist/collection/components/xpl-input/xpl-input-phone/xpl-input-phone.js +25 -6
  81. package/dist/collection/components/xpl-input/xpl-input-search/xpl-input-search.js +1 -1
  82. package/dist/collection/components/xpl-input/xpl-input-time/xpl-input-time.js +2 -2
  83. package/dist/collection/components/xpl-input/xpl-input.js +3 -3
  84. package/dist/collection/components/xpl-large-card/xpl-large-card.js +1 -1
  85. package/dist/collection/components/xpl-list/xpl-list.js +2 -2
  86. package/dist/collection/components/xpl-main-nav/xpl-main-nav.js +1 -1
  87. package/dist/collection/components/xpl-modal/xpl-modal.js +4 -1
  88. package/dist/collection/components/xpl-nav-item/xpl-nav-item.js +2 -2
  89. package/dist/collection/components/xpl-pagination/xpl-pagination.js +26 -8
  90. package/dist/collection/components/xpl-panel/xpl-panel.js +2 -2
  91. package/dist/collection/components/xpl-popover/popover.stories.js +3 -7
  92. package/dist/collection/components/xpl-popover/xpl-popover.js +5 -5
  93. package/dist/collection/components/xpl-progress-bar/xpl-progress-bar.js +2 -2
  94. package/dist/collection/components/xpl-progress-indicator/xpl-progress-indicator.js +1 -1
  95. package/dist/collection/components/xpl-radio/radio.stories.js +19 -17
  96. package/dist/collection/components/xpl-radio/xpl-radio.js +3 -3
  97. package/dist/collection/components/xpl-secondary-nav/xpl-secondary-nav.js +1 -1
  98. package/dist/collection/components/xpl-select/xpl-select.js +16 -11
  99. package/dist/collection/components/xpl-side-nav/side-nav-constants.js +2 -0
  100. package/dist/collection/components/xpl-side-nav/side-nav.stories.js +301 -186
  101. package/dist/collection/components/xpl-side-nav/xpl-side-nav-item/xpl-side-nav-item.js +80 -14
  102. package/dist/collection/components/xpl-side-nav/xpl-side-nav.js +284 -3
  103. package/dist/collection/components/xpl-skeleton/xpl-skeleton.js +1 -1
  104. package/dist/collection/components/xpl-slideout/xpl-slideout.js +1 -1
  105. package/dist/collection/components/xpl-spotlight/xpl-spotlight.js +16 -6
  106. package/dist/collection/components/xpl-tab-panel/xpl-tab-panel.js +2 -2
  107. package/dist/collection/components/xpl-table/xpl-table.js +13 -22
  108. package/dist/collection/components/xpl-table-header/xpl-table-header.js +1 -1
  109. package/dist/collection/components/xpl-tabs/xpl-tabs.js +5 -5
  110. package/dist/collection/components/xpl-tag/xpl-tag.js +4 -4
  111. package/dist/collection/components/xpl-toast/xpl-toast.js +2 -2
  112. package/dist/collection/components/xpl-toggle/xpl-toggle.js +3 -3
  113. package/dist/collection/components/xpl-toolbar/xpl-toolbar.js +2 -2
  114. package/dist/collection/components/xpl-tooltip/tooltip-arrow.js +1 -1
  115. package/dist/collection/components/xpl-tooltip/tooltip.stories.js +6 -37
  116. package/dist/collection/components/xpl-tooltip/xpl-tooltip.js +1 -1
  117. package/dist/collection/components/xpl-top-nav/xpl-nav-header-menu/xpl-nav-header-menu.js +2 -2
  118. package/dist/collection/components/xpl-top-nav/xpl-top-nav-item/xpl-top-nav-item.js +2 -2
  119. package/dist/collection/components/xpl-top-nav/xpl-top-nav.js +5 -5
  120. package/dist/collection/components/xpl-utility-bar/xpl-utility-bar.js +1 -1
  121. package/dist/components/index.d.ts +141 -12
  122. package/dist/components/index.js +1 -1
  123. package/dist/components/p-3qMYyqTe.js +1 -0
  124. package/dist/components/p-B1PBAEzg.js +1 -0
  125. package/dist/components/p-BG0-6Xek.js +1 -0
  126. package/dist/components/p-BT_Lq3Vd.js +1 -0
  127. package/dist/components/p-BWyAzrwu.js +1 -0
  128. package/dist/components/p-B_Wi--Ov.js +1 -0
  129. package/dist/components/p-Bd6JweBt.js +1 -0
  130. package/dist/components/p-Bn-27-xj.js +1 -0
  131. package/dist/components/{xpl-top-nav-item2.js → p-Bs6vq0C6.js} +1 -1
  132. package/dist/components/{xpl-input-file2.js → p-C9BO2vL-.js} +1 -1
  133. package/dist/components/p-CFW_w5Wj.js +1 -0
  134. package/dist/components/{floating-ui.dom.js → p-CFpsSZyr.js} +1 -1
  135. package/dist/components/p-CGNq3DyC.js +1 -0
  136. package/dist/components/p-CK3_k8jD.js +1 -0
  137. package/dist/components/p-CVqbA9op.js +1 -0
  138. package/dist/components/p-CtIUusUL.js +1 -0
  139. package/dist/components/p-CzwViN3U.js +1 -0
  140. package/dist/components/p-D97c0GjM.js +1 -0
  141. package/dist/components/p-DBWV65V-.js +1 -0
  142. package/dist/components/{xpl-tag2.js → p-DEl4Rvzs.js} +1 -1
  143. package/dist/components/p-DPTHmitJ.js +1 -0
  144. package/dist/components/{xpl-input-search2.js → p-DllC7F-H.js} +1 -1
  145. package/dist/components/p-Ds28UyUR.js +1 -0
  146. package/dist/components/p-U5dPMCXE.js +1 -0
  147. package/dist/components/p-hPUzON4O.js +1 -0
  148. package/dist/components/p-kPHfCq1d.js +1 -0
  149. package/dist/components/xpl-accordion.js +1 -1
  150. package/dist/components/xpl-application-shell.js +1 -1
  151. package/dist/components/xpl-avatar.js +1 -1
  152. package/dist/components/xpl-backdrop.js +1 -1
  153. package/dist/components/xpl-badge.js +1 -1
  154. package/dist/components/xpl-banner.js +1 -1
  155. package/dist/components/xpl-breadcrumb-item.js +1 -1
  156. package/dist/components/xpl-breadcrumbs.js +1 -1
  157. package/dist/components/xpl-button-row.js +1 -1
  158. package/dist/components/xpl-button.js +1 -1
  159. package/dist/components/xpl-calendar.js +1 -1
  160. package/dist/components/xpl-checkbox.js +1 -1
  161. package/dist/components/xpl-choicelist.js +1 -1
  162. package/dist/components/xpl-content-area.js +1 -1
  163. package/dist/components/xpl-dashboard.js +1 -1
  164. package/dist/components/xpl-data-card.js +1 -1
  165. package/dist/components/xpl-divider.js +1 -1
  166. package/dist/components/xpl-dropdown-group.js +1 -1
  167. package/dist/components/xpl-dropdown-heading.js +1 -1
  168. package/dist/components/xpl-dropdown-option.js +1 -1
  169. package/dist/components/xpl-dropdown.js +1 -1
  170. package/dist/components/xpl-dynamic-table-cell.js +1 -1
  171. package/dist/components/xpl-dynamic-table-row.js +1 -1
  172. package/dist/components/xpl-dynamic-table.js +1 -1
  173. package/dist/components/xpl-grid-item.js +1 -1
  174. package/dist/components/xpl-grid.js +1 -1
  175. package/dist/components/xpl-header-accordion.js +1 -1
  176. package/dist/components/xpl-icon.js +1 -1
  177. package/dist/components/xpl-input-color.js +1 -1
  178. package/dist/components/xpl-input-date.js +1 -1
  179. package/dist/components/xpl-input-file.js +1 -1
  180. package/dist/components/xpl-input-phone.js +1 -1
  181. package/dist/components/xpl-input-search.js +1 -1
  182. package/dist/components/xpl-input-time.js +1 -1
  183. package/dist/components/xpl-input.js +1 -1
  184. package/dist/components/xpl-large-card.js +1 -1
  185. package/dist/components/xpl-list-item.js +1 -1
  186. package/dist/components/xpl-list.js +1 -1
  187. package/dist/components/xpl-main-nav.js +1 -1
  188. package/dist/components/xpl-modal.js +1 -1
  189. package/dist/components/xpl-nav-header-menu.js +1 -1
  190. package/dist/components/xpl-nav-item.js +1 -1
  191. package/dist/components/xpl-pagination.js +1 -1
  192. package/dist/components/xpl-panel.js +1 -1
  193. package/dist/components/xpl-popover.js +1 -1
  194. package/dist/components/xpl-progress-bar.js +1 -1
  195. package/dist/components/xpl-progress-indicator.js +1 -1
  196. package/dist/components/xpl-radio.js +1 -1
  197. package/dist/components/xpl-secondary-nav.js +1 -1
  198. package/dist/components/xpl-select.js +1 -1
  199. package/dist/components/xpl-side-nav-item.js +1 -1
  200. package/dist/components/xpl-side-nav.js +1 -1
  201. package/dist/components/xpl-skeleton.js +1 -1
  202. package/dist/components/xpl-slideout.js +1 -1
  203. package/dist/components/xpl-spotlight.js +1 -1
  204. package/dist/components/xpl-tab-panel.js +1 -1
  205. package/dist/components/xpl-tab.js +1 -1
  206. package/dist/components/xpl-table-header-cell.js +1 -1
  207. package/dist/components/xpl-table-header.js +1 -1
  208. package/dist/components/xpl-table.js +1 -1
  209. package/dist/components/xpl-tabs.js +1 -1
  210. package/dist/components/xpl-tag.js +1 -1
  211. package/dist/components/xpl-toast.js +1 -1
  212. package/dist/components/xpl-toggle.js +1 -1
  213. package/dist/components/xpl-toolbar.js +1 -1
  214. package/dist/components/xpl-tooltip.js +1 -1
  215. package/dist/components/xpl-top-nav-item.js +1 -1
  216. package/dist/components/xpl-top-nav.js +1 -1
  217. package/dist/components/xpl-utility-bar.js +1 -1
  218. package/dist/docs/xpl-backdrop/readme.md +2 -0
  219. package/dist/docs/xpl-badge/readme.md +34 -0
  220. package/dist/docs/xpl-button/readme.md +2 -0
  221. package/dist/docs/xpl-button-row/readme.md +13 -0
  222. package/dist/docs/xpl-checkbox/readme.md +23 -1
  223. package/dist/docs/xpl-divider/readme.md +22 -4
  224. package/dist/docs/xpl-input/readme.md +51 -0
  225. package/dist/docs/xpl-input/xpl-input-date/readme.md +7 -0
  226. package/dist/docs/xpl-input/xpl-input-phone/readme.md +21 -0
  227. package/dist/docs/xpl-popover/readme.md +24 -0
  228. package/dist/docs/xpl-radio/readme.md +21 -4
  229. package/dist/docs/xpl-side-nav/readme.md +153 -5
  230. package/dist/docs/xpl-side-nav/xpl-side-nav-item/readme.md +165 -32
  231. package/dist/docs/xpl-table/readme.md +2 -0
  232. package/dist/docs/xpl-tooltip/readme.md +29 -1
  233. package/dist/esm/apollo-core.js +4 -4
  234. package/dist/esm/{index-C7bgJs6C.js → index-CXkZUm1c.js} +36 -9
  235. package/dist/esm/loader.js +3 -3
  236. package/dist/esm/v4-CK3_k8jD.js +50 -0
  237. package/dist/esm/xpl-accordion.entry.js +3 -3
  238. package/dist/esm/xpl-application-shell.entry.js +2 -2
  239. package/dist/esm/xpl-avatar_54.entry.js +709 -177
  240. package/dist/esm/xpl-button-row.entry.js +2 -2
  241. package/dist/esm/xpl-calendar.entry.js +3 -3
  242. package/dist/esm/xpl-dynamic-table-cell.entry.js +3 -3
  243. package/dist/esm/xpl-dynamic-table-row.entry.js +3 -3
  244. package/dist/esm/xpl-dynamic-table.entry.js +2 -2
  245. package/dist/esm/xpl-grid-item.entry.js +2 -2
  246. package/dist/esm/xpl-grid.entry.js +2 -2
  247. package/dist/esm/xpl-large-card.entry.js +2 -2
  248. package/dist/esm/xpl-main-nav.entry.js +2 -2
  249. package/dist/esm/xpl-table-header-cell.entry.js +1 -1
  250. package/dist/esm/xpl-table-header.entry.js +2 -2
  251. package/dist/esm/xpl-toggle.entry.js +5 -5
  252. package/dist/esm/xpl-toolbar.entry.js +3 -3
  253. package/dist/types/components/xpl-banner/banner.stories.d.ts +2 -0
  254. package/dist/types/components/xpl-button/button.stories.d.ts +2 -0
  255. package/dist/types/components/xpl-button/xpl-button.d.ts +1 -0
  256. package/dist/types/components/xpl-dropdown/xpl-dropdown.d.ts +16 -0
  257. package/dist/types/components/xpl-input/xpl-input-phone/xpl-input-phone.d.ts +1 -0
  258. package/dist/types/components/xpl-pagination/xpl-pagination.d.ts +4 -0
  259. package/dist/types/components/xpl-radio/radio.stories.d.ts +11 -10
  260. package/dist/types/components/xpl-side-nav/side-nav-constants.d.ts +2 -0
  261. package/dist/types/components/xpl-side-nav/side-nav.stories.d.ts +53 -32
  262. package/dist/types/components/xpl-side-nav/xpl-side-nav-item/xpl-side-nav-item.d.ts +10 -0
  263. package/dist/types/components/xpl-side-nav/xpl-side-nav.d.ts +31 -0
  264. package/dist/types/components/xpl-spotlight/xpl-spotlight.d.ts +1 -0
  265. package/dist/types/components.d.ts +223 -20
  266. package/dist/types/stencil-public-runtime.d.ts +1 -0
  267. package/package.json +39 -38
  268. package/dist/apollo-core/p-0bf50890.entry.js +0 -1
  269. package/dist/apollo-core/p-1947e7a8.entry.js +0 -1
  270. package/dist/apollo-core/p-27928cb0.entry.js +0 -1
  271. package/dist/apollo-core/p-34438721.entry.js +0 -1
  272. package/dist/apollo-core/p-35c2f72d.entry.js +0 -1
  273. package/dist/apollo-core/p-368c81f1.entry.js +0 -1
  274. package/dist/apollo-core/p-406b27a8.entry.js +0 -1
  275. package/dist/apollo-core/p-5d63b4ce.entry.js +0 -1
  276. package/dist/apollo-core/p-689f1dae.entry.js +0 -1
  277. package/dist/apollo-core/p-8d692d05.entry.js +0 -1
  278. package/dist/apollo-core/p-C7bgJs6C.js +0 -2
  279. package/dist/apollo-core/p-Cqlsd6nf.js +0 -1
  280. package/dist/apollo-core/p-cd56a3d5.entry.js +0 -1
  281. package/dist/apollo-core/p-dc205893.entry.js +0 -1
  282. package/dist/cjs/v4-D4KzFnn8.js +0 -67
  283. package/dist/components/index3.js +0 -1
  284. package/dist/components/v4.js +0 -1
  285. package/dist/components/xpl-avatar2.js +0 -1
  286. package/dist/components/xpl-backdrop2.js +0 -1
  287. package/dist/components/xpl-badge2.js +0 -1
  288. package/dist/components/xpl-button2.js +0 -1
  289. package/dist/components/xpl-checkbox2.js +0 -1
  290. package/dist/components/xpl-divider2.js +0 -1
  291. package/dist/components/xpl-dropdown-group2.js +0 -1
  292. package/dist/components/xpl-dropdown-heading2.js +0 -1
  293. package/dist/components/xpl-dropdown-option2.js +0 -1
  294. package/dist/components/xpl-dropdown2.js +0 -1
  295. package/dist/components/xpl-icon2.js +0 -1
  296. package/dist/components/xpl-input-date2.js +0 -1
  297. package/dist/components/xpl-input2.js +0 -1
  298. package/dist/components/xpl-list-item2.js +0 -1
  299. package/dist/components/xpl-popover2.js +0 -1
  300. package/dist/components/xpl-radio2.js +0 -1
  301. package/dist/components/xpl-select2.js +0 -1
  302. package/dist/components/xpl-tooltip2.js +0 -1
  303. package/dist/esm/v4-Cqlsd6nf.js +0 -65
  304. /package/dist/components/{_commonjsHelpers.js → p-BFTU3MAI.js} +0 -0
  305. /package/dist/components/{index2.js → p-CH4yJ6Qx.js} +0 -0
  306. /package/dist/components/{tab-a11y-ids.js → p-Yj_QFaRn.js} +0 -0
  307. /package/dist/{index.cjs.js → index.cjs} +0 -0
  308. /package/dist/types/{Users/roc/Sites → home/runner/work/apollo}/apollo/packages/apollo-core/.stencil/css/typography.stories.d.ts +0 -0
  309. /package/loader/{cdn.js → cdn.cjs} +0 -0
  310. /package/loader/{index.cjs.js → index.cjs} +0 -0
@@ -7,25 +7,26 @@ const escapeHtmlAttribute = (value) => value
7
7
  const defaultItems = [
8
8
  { label: 'Dashboard', icon: 'house-4', selected: true },
9
9
  { label: 'Product', icon: 'bag-shopping-2' },
10
- { label: 'Reports', icon: 'chart-line', link: true, href: '#reports' },
10
+ { label: 'Reports', icon: 'chart-line' },
11
11
  { label: 'Disabled Item', icon: 'lock', disabled: true },
12
12
  { label: 'Hidden Item', icon: 'eye', hidden: true },
13
13
  {
14
14
  label: 'Settings',
15
+ icon: 'gear',
15
16
  hasChildren: true,
16
17
  expanded: true,
17
18
  children: [{ label: 'Location' }, { label: 'Schedule', selected: true }],
18
19
  },
19
20
  {
20
21
  label: 'Integrations',
22
+ icon: 'plug',
21
23
  hasChildren: true,
22
24
  children: [{ label: 'Webhooks' }, { label: 'API Keys' }],
23
25
  },
24
26
  {
25
- label: 'Archived',
26
- hasChildren: true,
27
- disabled: true,
28
- children: [{ label: 'Old Reports' }],
27
+ label: 'Xplor Growth',
28
+ icon: 'chart-line-up',
29
+ trailingIcon: 'external-link',
29
30
  },
30
31
  ];
31
32
  const defaultFooterItems = [
@@ -41,7 +42,7 @@ const renderNavItem = (item) => {
41
42
  var _a, _b;
42
43
  const attrs = [
43
44
  item.label ? `label="${escapeHtmlAttribute(item.label)}"` : '',
44
- item.icon && !item.hasChildren ? `icon="${escapeHtmlAttribute(item.icon)}"` : '',
45
+ item.icon ? `icon="${escapeHtmlAttribute(item.icon)}"` : '',
45
46
  item.selected ? 'selected' : '',
46
47
  item.disabled ? 'disabled' : '',
47
48
  item.hidden ? 'hidden' : '',
@@ -52,17 +53,20 @@ const renderNavItem = (item) => {
52
53
  .filter(Boolean)
53
54
  .join(' ');
54
55
  if (item.link && item.href) {
56
+ const leadingIcon = item.icon
57
+ ? `<xpl-icon icon="${escapeHtmlAttribute(item.icon)}" size="16"></xpl-icon>`
58
+ : '';
55
59
  return `
56
60
  <xpl-side-nav-item ${attrs}>
57
- <a href="${escapeHtmlAttribute(item.href)}">
58
- ${item.icon ? `<xpl-icon icon="${escapeHtmlAttribute(item.icon)}" size="16"></xpl-icon>` : ''}
59
- ${escapeHtmlAttribute(item.label)}
60
- </a>
61
+ <a href="${escapeHtmlAttribute(item.href)}" class="xpl-side-nav-item__link"${item.selected ? ' aria-current="page"' : ''}><span class="xpl-side-nav-item__leading">${leadingIcon}</span><span class="xpl-side-nav-item__label">${escapeHtmlAttribute(item.label)}</span></a>
61
62
  </xpl-side-nav-item>`;
62
63
  }
63
64
  const childrenHtml = (_b = (_a = item.children) === null || _a === void 0 ? void 0 : _a.map(renderNavItem).join('')) !== null && _b !== void 0 ? _b : '';
65
+ const trailingSlot = item.trailingIcon && !item.hasChildren
66
+ ? `\n <xpl-icon slot="trailing" icon="${escapeHtmlAttribute(item.trailingIcon)}" size="16" aria-hidden="true"></xpl-icon>`
67
+ : '';
64
68
  return `
65
- <xpl-side-nav-item ${attrs}>${childrenHtml}
69
+ <xpl-side-nav-item ${attrs}>${trailingSlot}${childrenHtml}
66
70
  </xpl-side-nav-item>`;
67
71
  };
68
72
  const renderHtmlNavItem = (item, depth = 0) => {
@@ -78,17 +82,23 @@ const renderHtmlNavItem = (item, depth = 0) => {
78
82
  if (item.link) {
79
83
  return `${indent}<div class="xpl-side-nav-item">
80
84
  ${indent} <a href="${item.href || '#'}" class="${linkClass}"${item.selected ? ' aria-current="page"' : ''}${item.disabled ? ' aria-disabled="true" tabindex="-1"' : ''}>
81
- ${indent} <span class="xpl-side-nav-item__icon">${item.icon || ''}</span>
85
+ ${indent} <span class="xpl-side-nav-item__leading">${item.icon ? `<xpl-icon icon="${item.icon}" size="16"></xpl-icon>` : ''}</span>
82
86
  ${indent} <span class="xpl-side-nav-item__label">${item.label}</span>
83
87
  ${indent} </a>
84
88
  ${indent}</div>`;
85
89
  }
86
90
  const hasChildren = item.hasChildren || (item.children && item.children.length > 0);
87
91
  const childrenHtml = (_b = (_a = item.children) === null || _a === void 0 ? void 0 : _a.map((child) => renderHtmlNavItem(child, depth + 2)).join('\n')) !== null && _b !== void 0 ? _b : '';
92
+ const trailingHtml = hasChildren
93
+ ? `<span class="xpl-side-nav-item__trailing xpl-side-nav-item__trailing--chevron${item.expanded ? ' expanded' : ''}"><xpl-icon icon="${item.expanded ? 'chevron-up' : 'chevron-down'}" size="16" aria-hidden="true"></xpl-icon></span>`
94
+ : item.trailingIcon
95
+ ? `<span class="xpl-side-nav-item__trailing"><xpl-icon icon="${item.trailingIcon}" size="16" aria-hidden="true"></xpl-icon></span>`
96
+ : '';
88
97
  return `${indent}<div class="xpl-side-nav-item">
89
98
  ${indent} <button type="button" class="${linkClass}"${item.selected ? ' aria-current="page"' : ''}${hasChildren ? ` aria-expanded="${item.expanded ? 'true' : 'false'}"` : ''}${item.disabled ? ' disabled' : ''}>
90
- ${indent} ${hasChildren ? '<span class="xpl-side-nav-item__arrow"><!-- chevron --></span>' : `<span class="xpl-side-nav-item__icon">${item.icon || ''}</span>`}
99
+ ${indent} <span class="xpl-side-nav-item__leading">${item.icon ? `<xpl-icon icon="${item.icon}" size="16"></xpl-icon>` : ''}</span>
91
100
  ${indent} <span class="xpl-side-nav-item__label">${item.label}</span>
101
+ ${indent} ${trailingHtml}
92
102
  ${indent} </button>${hasChildren && !item.link
93
103
  ? `
94
104
  ${indent} <div class="xpl-side-nav-item__children ${item.expanded ? 'expanded' : ''}">
@@ -128,30 +138,65 @@ const SideNavigationWebComponent = (config) => {
128
138
  const footerHtml = footerItems.map(renderNavItem).join('');
129
139
  return `<xpl-side-nav label="${escapeHtmlAttribute(navLabel)}"><div slot="section">${itemsHtml}</div><div slot="nav-footer">${footerHtml}</div></xpl-side-nav>`;
130
140
  };
131
- export const SideNavigation = ({ navConfig }) => {
132
- const { navLabel, items, footerItems } = navConfig;
133
- const itemsHtml = items.map(renderNavItem).join('');
134
- const footerHtml = footerItems.map(renderNavItem).join('');
135
- return `
141
+ let sideNavClickController;
142
+ export const SideNavigation = {
143
+ args: {
144
+ navConfig: Object.assign({}, defaultNavConfig),
145
+ },
146
+ argTypes: {
147
+ navConfig: {
148
+ control: 'object',
149
+ description: 'Full sidebar config (router-style): `navLabel`, `items[]`, `footerItems[]`. Arrays map to `xpl-side-nav-item` markup.',
150
+ },
151
+ },
152
+ render: ({ navConfig }) => {
153
+ const { navLabel, items, footerItems } = navConfig;
154
+ const itemsHtml = items.map(renderNavItem).join('');
155
+ const footerHtml = footerItems.map(renderNavItem).join('');
156
+ return `
136
157
  <style>
137
158
  .side-nav-demo-wrapper {
138
- height: 600px;
139
159
  display: flex;
160
+ height: 600px;
140
161
  background-color: var(--xpl-background-surface-subtle);
141
162
  border: var(--xpl-border-small) solid var(--xpl-border-default);
142
163
  }
164
+ /* Above md: nav is a fixed-width column; main fills the rest of the row. */
165
+ @media (min-width: 768px) {
166
+ .side-nav-demo-wrapper {
167
+ flex-direction: row;
168
+ }
169
+ .side-nav-demo-main {
170
+ flex: 1;
171
+ }
172
+ }
173
+ /* Below md: nav collapses to a top bar; main flows beneath it. */
174
+ @media (max-width: 767px) {
175
+ .side-nav-demo-wrapper {
176
+ flex-direction: column;
177
+ }
178
+ }
143
179
  .side-nav-demo-main {
144
- flex: 1;
145
180
  padding: var(--xpl-space-32);
181
+ font-family: var(--xpl-font-family-default);
146
182
  color: var(--xpl-text-default);
147
183
  }
148
184
  .side-nav-demo-main h1 { margin: 0; }
185
+ .side-nav-demo-note {
186
+ font-family: var(--xpl-font-family-default);
187
+ font-size: var(--xpl-font-size-callout);
188
+ color: var(--xpl-text-subdued);
189
+ margin: var(--xpl-space-8) 0 0;
190
+ line-height: 1.5;
191
+ }
149
192
  .side-nav-demo-legend {
150
193
  margin-top: var(--xpl-space-24);
151
194
  padding: var(--xpl-space-16);
152
195
  border-radius: var(--xpl-border-radius-default);
153
196
  background: var(--xpl-background-surface-transparent-5);
197
+ font-family: var(--xpl-font-family-default);
154
198
  font-size: var(--xpl-font-size-callout);
199
+ color: var(--xpl-text-subdued);
155
200
  line-height: 1.8;
156
201
  }
157
202
  .side-nav-demo-legend code {
@@ -171,48 +216,63 @@ export const SideNavigation = ({ navConfig }) => {
171
216
 
172
217
  <div class="side-nav-demo-main">
173
218
  <h1>Side Navigation Demo</h1>
174
- <p>Data-driven navigation: edit the <code>navConfig</code> object in Controls (same shape you would build from router metadata — <code>navLabel</code>, <code>items[]</code>, <code>footerItems[]</code>) and map it to markup with <code>renderNavItem</code>-style helpers in your app.</p>
219
+ <p class="side-nav-demo-note">Click any item in the nav to select it. Parent items expand and collapse on click.</p>
175
220
  <div class="side-nav-demo-legend">
176
- <strong><code>NavDemoConfig</code></strong><br/>
177
- <code>{ navLabel, items: NavItem[], footerItems: NavItem[] }</code>
221
+ <strong>v2 anatomy per row:</strong><br/>
222
+ <code>slot="leading"</code> leading icon (or <code>icon</code> prop)<br/>
223
+ label (flex-1)<br/>
224
+ <code>slot="trailing"</code> — trailing icon; auto chevron for parents (<code>chevron-down</code> collapsed, <code>chevron-up</code> expanded)
178
225
  </div>
179
226
  <div class="side-nav-demo-legend">
180
227
  <strong><code>NavItem</code></strong><br/>
181
- <code>{ label, icon?, selected?, disabled?, hidden?, hasChildren?, expanded?, link?, href?, children? }</code>
228
+ <code>{ label, icon?, trailingIcon?, selected?, disabled?, hidden?, hasChildren?, expanded?, link?, href?, children? }</code>
182
229
  </div>
183
230
  <div class="side-nav-demo-legend">
184
- <strong>Slots:</strong><br/>
185
- <code>slot="section"</code> main navigation items<br/>
186
- <code>slot="nav-footer"</code>footer items
231
+ <strong>Responsive (below <code>md</code> / 768 px):</strong><br/>
232
+ The sidebar collapses to a ~56 px top bar with a built-in toggle button.<br/>
233
+ Activating the toggle opens an 80 vw drawer (min 300 px) that slides in from the left the remaining 20 vw shows a backdrop scrim.<br/>
234
+ <strong>Closing:</strong> toggle button, <code>Escape</code> key, or backdrop click — all return focus to the toggle.<br/>
235
+ <strong>Focus trap:</strong> <code>Tab</code> cycles within the open drawer.<br/>
236
+ <strong>API:</strong> <code>open</code> prop/attr (reflected) · <code>openChange</code> event · <code>toggle()</code> / <code>setOpen()</code> methods
187
237
  </div>
188
238
  </div>
189
239
  </div>`;
190
- };
191
- SideNavigation.args = {
192
- navConfig: Object.assign({}, defaultNavConfig),
193
- };
194
- SideNavigation.argTypes = {
195
- navConfig: {
196
- control: 'object',
197
- description: 'Full sidebar config (router-style): `navLabel`, `items[]`, `footerItems[]`. Arrays map to `xpl-side-nav-item` markup.',
198
240
  },
199
- };
200
- SideNavigation.parameters = {
201
- layout: 'fullscreen',
202
- design: {
203
- type: 'figma',
204
- url: 'https://www.figma.com/design/MjjYek73MFnHmVNdm45Sd1/Apollo-Web?node-id=33873-23128&m=dev',
241
+ play: async ({ canvasElement }) => {
242
+ sideNavClickController === null || sideNavClickController === void 0 ? void 0 : sideNavClickController.abort();
243
+ sideNavClickController = new AbortController();
244
+ const nav = canvasElement.querySelector('xpl-side-nav');
245
+ if (!nav)
246
+ return;
247
+ nav.addEventListener('click', (e) => {
248
+ const item = e.target.closest('xpl-side-nav-item');
249
+ if (!item)
250
+ return;
251
+ if (item.hasAttribute('disabled'))
252
+ return;
253
+ if (item.hasAttribute('has-children'))
254
+ return;
255
+ nav.querySelectorAll('xpl-side-nav-item').forEach((el) => el.removeAttribute('selected'));
256
+ item.setAttribute('selected', '');
257
+ }, { signal: sideNavClickController.signal });
205
258
  },
206
- docs: {
207
- description: {
208
- story: 'Full navigation demo: typed `navConfig` object control maps array data to `xpl-side-nav` / `xpl-side-nav-item` markup — same pattern as mapping router config to nav in production.',
259
+ parameters: {
260
+ layout: 'fullscreen',
261
+ design: {
262
+ type: 'figma',
263
+ url: 'https://www.figma.com/design/MjjYek73MFnHmVNdm45Sd1/Apollo-Web?node-id=33873-23128&m=dev',
264
+ },
265
+ docs: {
266
+ description: {
267
+ story: 'Fully interactive navigation demo. Click leaf items to select them; click parent items to expand/collapse. Edit the `navConfig` control to add, remove, or reconfigure items — same data-driven pattern as mapping router config to nav in production.',
268
+ },
269
+ },
270
+ 'web-component': {
271
+ render: SideNavigationWebComponent(defaultNavConfig),
272
+ },
273
+ html: {
274
+ render: renderHtmlSideNav(defaultNavConfig),
209
275
  },
210
- },
211
- 'web-component': {
212
- render: SideNavigationWebComponent(SideNavigation.args.navConfig),
213
- },
214
- html: {
215
- render: renderHtmlSideNav(SideNavigation.args.navConfig),
216
276
  },
217
277
  };
218
278
  export const ItemPlayground = {
@@ -223,7 +283,11 @@ export const ItemPlayground = {
223
283
  },
224
284
  icon: {
225
285
  control: 'text',
226
- description: 'Icon name (leaf/footer rows only; ignored when hasChildren expandable rows use chevron only)',
286
+ description: 'Icon name default content for `slot="leading"`. Applies to all item types including parents (`has-children`) in v2.',
287
+ },
288
+ trailingIcon: {
289
+ control: 'text',
290
+ description: 'Icon name for `slot="trailing"`. On parent items (`has-children`), providing this replaces the auto chevron (`chevron-down` collapsed / `chevron-up` expanded).',
227
291
  },
228
292
  selected: {
229
293
  control: 'boolean',
@@ -261,6 +325,7 @@ export const ItemPlayground = {
261
325
  args: {
262
326
  label: 'Playground Item',
263
327
  icon: 'house-4',
328
+ trailingIcon: '',
264
329
  selected: false,
265
330
  disabled: false,
266
331
  hidden: false,
@@ -270,42 +335,48 @@ export const ItemPlayground = {
270
335
  childLabel1: 'Child Item A',
271
336
  childLabel2: 'Child Item B',
272
337
  },
273
- render: ({ label, icon, selected, disabled, hidden, expanded, hasChildren, link, childLabel1, childLabel2, }) => {
338
+ render: ({ label, icon, trailingIcon, selected, disabled, hidden, expanded, hasChildren, link, childLabel1, childLabel2, }) => {
274
339
  const attrs = [
275
340
  label ? `label="${label}"` : '',
276
- icon && !hasChildren ? `icon="${icon}"` : '',
341
+ icon ? `icon="${icon}"` : '',
277
342
  selected ? 'selected' : '',
278
343
  disabled ? 'disabled' : '',
279
344
  hidden ? 'hidden' : '',
280
345
  expanded ? 'expanded' : '',
281
- hasChildren ? 'has-children' : '',
346
+ !link && hasChildren ? 'has-children' : '',
282
347
  link ? 'link' : '',
283
348
  ]
284
349
  .filter(Boolean)
285
350
  .join(' ');
286
351
  let content = '';
352
+ const trailingSlot = trailingIcon && !link
353
+ ? `\n <xpl-icon slot="trailing" icon="${trailingIcon}" size="16" aria-hidden="true"></xpl-icon>`
354
+ : '';
287
355
  if (link) {
356
+ const leadingIcon = icon ? `<xpl-icon icon="${icon}" size="16"></xpl-icon>` : '';
288
357
  content = `
289
- <a href="#${(label === null || label === void 0 ? void 0 : label.toLowerCase().replace(/\s+/g, '-')) || 'item'}">
290
- ${icon ? `<xpl-icon icon="${icon}" size="16"></xpl-icon>` : ''}
291
- ${label}
292
- </a>`;
358
+ <a href="#${(label === null || label === void 0 ? void 0 : label.toLowerCase().replace(/\s+/g, '-')) || 'item'}" class="xpl-side-nav-item__link"><span class="xpl-side-nav-item__leading">${leadingIcon}</span><span class="xpl-side-nav-item__label">${label}</span></a>`;
293
359
  }
294
360
  else if (hasChildren) {
295
- content = `
296
- <xpl-side-nav-item label="${childLabel1}" ></xpl-side-nav-item>
297
- <xpl-side-nav-item label="${childLabel2}" ></xpl-side-nav-item>`;
361
+ content = `${trailingSlot}
362
+ <xpl-side-nav-item label="${childLabel1}" icon="circle-dot"></xpl-side-nav-item>
363
+ <xpl-side-nav-item label="${childLabel2}" icon="circle-dot"></xpl-side-nav-item>`;
364
+ }
365
+ else {
366
+ content = trailingSlot;
298
367
  }
299
368
  return `
300
369
  <style>
301
370
  .item-playground-wrapper {
302
- width: 280px;
303
371
  padding: var(--xpl-space-16);
304
372
  border: var(--xpl-border-small) solid var(--xpl-border-default);
305
373
  background-color: var(--xpl-background-surface-subtlest);
306
374
  border-radius: var(--xpl-border-radius-default);
375
+ height: auto;
376
+ min-height: 0;
307
377
  }
308
378
  .item-playground-note {
379
+ font-family: var(--xpl-font-family-default);
309
380
  font-size: var(--xpl-font-size-caption);
310
381
  color: var(--xpl-text-subdued);
311
382
  margin-top: var(--xpl-space-12);
@@ -317,7 +388,7 @@ export const ItemPlayground = {
317
388
  </xpl-side-nav-item>
318
389
  </div>
319
390
  <p class="item-playground-note">
320
- Interactive playground for <code>xpl-side-nav-item</code>. Toggle props in the Controls panel to see state changes in real-time.
391
+ Interactive playground for <code>xpl-side-nav-item</code>. Toggle props in the Controls panel.
321
392
  </p>`;
322
393
  },
323
394
  parameters: {
@@ -329,96 +400,76 @@ export const ItemPlayground = {
329
400
  },
330
401
  },
331
402
  };
332
- const ItemPlaygroundWebComponent = (args) => {
333
- var _a;
334
- const attrs = [
335
- args.label ? `label="${args.label}"` : '',
336
- args.icon && !args.hasChildren ? `icon="${args.icon}"` : '',
337
- args.selected ? 'selected' : '',
338
- args.disabled ? 'disabled' : '',
339
- args.hidden ? 'hidden' : '',
340
- args.expanded ? 'expanded' : '',
341
- args.hasChildren ? 'has-children' : '',
342
- args.link ? 'link' : '',
343
- ]
344
- .filter(Boolean)
345
- .join(' ');
346
- let content = '';
347
- if (args.link) {
348
- content = `
349
- <a href="#${((_a = args.label) === null || _a === void 0 ? void 0 : _a.toLowerCase().replace(/\s+/g, '-')) || 'item'}">
350
- ${args.icon ? `<xpl-icon icon="${args.icon}" size="16"></xpl-icon>` : ''}
351
- ${args.label}
352
- </a>`;
353
- }
354
- else if (args.hasChildren) {
355
- content = `
356
- <xpl-side-nav-item label="${args.childLabel1}"></xpl-side-nav-item>
357
- <xpl-side-nav-item label="${args.childLabel2}"></xpl-side-nav-item>`;
358
- }
359
- return `
403
+ export const ExternalLinkItem = () => `
360
404
  <style>
361
- .item-playground-wrapper {
362
- width: 280px;
405
+ .external-link-demo {
363
406
  padding: var(--xpl-space-16);
364
407
  border: var(--xpl-border-small) solid var(--xpl-border-default);
365
408
  background-color: var(--xpl-background-surface-subtlest);
366
409
  border-radius: var(--xpl-border-radius-default);
410
+ height: auto;
411
+ min-height: 0;
412
+ }
413
+ .external-link-caption {
414
+ font-family: var(--xpl-font-family-default);
415
+ font-size: var(--xpl-font-size-caption);
416
+ color: var(--xpl-text-subdued);
417
+ margin-bottom: var(--xpl-space-8);
367
418
  }
368
419
  </style>
369
- <div class="xpl-side-nav item-playground-wrapper">
370
- <xpl-side-nav-item ${attrs}>${content}
420
+ <p class="external-link-caption">Leaf item with leading icon + trailing external-link icon</p>
421
+ <div class="xpl-side-nav external-link-demo">
422
+ <xpl-side-nav-item label="Xplor Growth" icon="chart-line-up">
423
+ <xpl-icon slot="trailing" icon="external-link" size="16" aria-hidden="true"></xpl-icon>
371
424
  </xpl-side-nav-item>
425
+ <xpl-side-nav-item label="Dashboard" icon="house-4" selected></xpl-side-nav-item>
426
+ <xpl-side-nav-item label="Reports" icon="chart-line"></xpl-side-nav-item>
372
427
  </div>`;
428
+ ExternalLinkItem.parameters = {
429
+ layout: 'centered',
430
+ docs: {
431
+ description: {
432
+ story: 'Leaf item with a leading icon (`icon` prop) and a trailing `slot="trailing"` icon (`external-link`). The trailing slot replaces the auto chevron on parents, or adds a trailing icon to leaf items. Note: trailing icons that convey meaning (e.g. external link) should be accompanied by accessible labeling in the surrounding context.',
433
+ },
434
+ },
373
435
  };
374
- const renderHtmlItemPlayground = (args) => {
375
- const { label = 'Item', selected = false, disabled = false, hasChildren = false, expanded = false, link = false, childLabel1 = 'Child A', childLabel2 = 'Child B', } = args;
376
- const linkClass = [
377
- 'xpl-side-nav-item__link',
378
- selected ? 'selected' : '',
379
- expanded ? 'expanded' : '',
380
- ]
381
- .filter(Boolean)
382
- .join(' ');
383
- if (link) {
384
- return `<div class="xpl-side-nav-item">
385
- <a href="#item" class="${linkClass}"${selected ? ' aria-current="page"' : ''}${disabled ? ' aria-disabled="true" tabindex="-1"' : ''}>
386
- <span class="xpl-side-nav-item__icon"><!-- icon --></span>
387
- <span class="xpl-side-nav-item__label">${label}</span>
388
- </a>
389
- </div>`;
436
+ export const ParentWithLeadingIcon = () => `
437
+ <style>
438
+ .parent-leading-demo {
439
+ padding: var(--xpl-space-16);
440
+ border: var(--xpl-border-small) solid var(--xpl-border-default);
441
+ background-color: var(--xpl-background-surface-subtlest);
442
+ border-radius: var(--xpl-border-radius-default);
443
+ height: auto;
444
+ min-height: 0;
390
445
  }
391
- const childrenContent = hasChildren
392
- ? `
393
- <div class="xpl-side-nav-item__children ${expanded ? 'expanded' : ''}">
394
- <div class="xpl-side-nav-item__children-inner">
395
- <div class="xpl-side-nav-item">
396
- <button type="button" class="xpl-side-nav-item__link">
397
- <span class="xpl-side-nav-item__icon"><!-- icon --></span>
398
- <span class="xpl-side-nav-item__label">${childLabel1}</span>
399
- </button>
400
- </div>
401
- <div class="xpl-side-nav-item">
402
- <button type="button" class="xpl-side-nav-item__link">
403
- <span class="xpl-side-nav-item__icon"><!-- icon --></span>
404
- <span class="xpl-side-nav-item__label">${childLabel2}</span>
405
- </button>
406
- </div>
407
- </div>
408
- </div>`
409
- : '';
410
- return `<div class="xpl-side-nav-item">
411
- <button type="button" class="${linkClass}"${selected ? ' aria-current="page"' : ''}${hasChildren ? ` aria-expanded="${expanded ? 'true' : 'false'}"` : ''}${disabled ? ' disabled' : ''}>
412
- ${hasChildren ? '<span class="xpl-side-nav-item__arrow"><!-- chevron --></span>' : '<span class="xpl-side-nav-item__icon"><!-- icon --></span>'}
413
- <span class="xpl-side-nav-item__label">${label}</span>
414
- </button>${childrenContent}
446
+ .parent-leading-caption {
447
+ font-family: var(--xpl-font-family-default);
448
+ font-size: var(--xpl-font-size-caption);
449
+ color: var(--xpl-text-subdued);
450
+ margin-bottom: var(--xpl-space-8);
451
+ }
452
+ </style>
453
+ <p class="parent-leading-caption">Parents now show leading icon AND chevron (v2 behavior)</p>
454
+ <div class="xpl-side-nav parent-leading-demo">
455
+ <xpl-side-nav-item label="Settings" icon="gear" has-children expanded>
456
+ <xpl-side-nav-item label="Location"></xpl-side-nav-item>
457
+ <xpl-side-nav-item label="Schedule" selected></xpl-side-nav-item>
458
+ </xpl-side-nav-item>
459
+ <xpl-side-nav-item label="Integrations" icon="plug" has-children>
460
+ <xpl-side-nav-item label="Webhooks"></xpl-side-nav-item>
461
+ <xpl-side-nav-item label="API Keys"></xpl-side-nav-item>
462
+ </xpl-side-nav-item>
463
+ <xpl-side-nav-item label="Dashboard" icon="house-4" selected></xpl-side-nav-item>
415
464
  </div>`;
465
+ ParentWithLeadingIcon.parameters = {
466
+ layout: 'centered',
467
+ docs: {
468
+ description: {
469
+ story: '**v2 behavior change:** parent rows (`has-children`) now render the leading icon alongside the auto chevron in the trailing position (`chevron-down` when collapsed, `chevron-up` when expanded). In v1, parents showed chevron + label only (no leading icon). Pass `icon` prop or `slot="leading"` content to set the leading icon.',
470
+ },
471
+ },
416
472
  };
417
- ItemPlayground.parameters = Object.assign(Object.assign({}, ItemPlayground.parameters), { 'web-component': {
418
- render: ItemPlaygroundWebComponent(ItemPlayground.args),
419
- }, html: {
420
- render: renderHtmlItemPlayground(ItemPlayground.args),
421
- } });
422
473
  export const FooterSlot = {
423
474
  argTypes: {
424
475
  footerItems: {
@@ -430,85 +481,64 @@ export const FooterSlot = {
430
481
  footerItems: [
431
482
  { label: 'Settings', icon: 'gear' },
432
483
  { label: 'Help', icon: 'headset' },
433
- { label: 'Logout', icon: 'open-rect-arrow-out', disabled: false },
484
+ { label: 'Logout', icon: 'open-rect-arrow-out' },
434
485
  ],
435
486
  },
436
487
  render: ({ footerItems }) => {
437
488
  const footerHtml = footerItems.map(renderNavItem).join('');
438
489
  return `
439
490
  <style>
440
- .footer-demo-wrapper {
441
- width: 280px;
442
- padding: var(--xpl-space-16);
491
+ /*
492
+ * Focused preview of the nav-footer slot only. Renders the static
493
+ * .xpl-side-nav__footer markup at sidebar width so the footer styling
494
+ * (top divider, padding) is shown in isolation -- no host xpl-side-nav
495
+ * wrapper, so no mobile top-bar collapse intrudes on the docs view.
496
+ */
497
+ /*
498
+ * Override the .xpl-side-nav host defaults (height: 100%, overflow: hidden)
499
+ * so the demo card shrink-wraps its content vertically and never crops.
500
+ */
501
+ .footer-demo-container {
502
+ display: inline-flex;
503
+ flex-direction: column;
504
+ height: auto;
505
+ background: var(--xpl-background-surface-subtlest);
443
506
  border: var(--xpl-border-small) solid var(--xpl-border-default);
444
- background-color: var(--xpl-background-surface-subtlest);
445
507
  border-radius: var(--xpl-border-radius-default);
508
+ overflow: visible;
446
509
  }
447
510
  .footer-demo-caption {
511
+ font-family: var(--xpl-font-family-default);
448
512
  font-size: var(--xpl-font-size-caption);
449
513
  color: var(--xpl-text-subdued);
450
514
  margin-bottom: var(--xpl-space-8);
451
515
  }
452
516
  </style>
453
- <div class="footer-demo-caption">Nav Footer Slot</div>
454
- <xpl-side-nav class="footer-demo-wrapper">
455
- <div slot="section">
456
- <xpl-side-nav-item label="Dashboard" icon="house-4" selected></xpl-side-nav-item>
517
+ <p class="footer-demo-caption">Nav Footer Slot</p>
518
+ <div class="xpl-side-nav footer-demo-container">
519
+ <div class="xpl-side-nav__footer">${footerHtml}
457
520
  </div>
458
- <div slot="nav-footer">${footerHtml}
459
- </div>
460
- </xpl-side-nav>`;
521
+ </div>`;
461
522
  },
462
523
  parameters: {
463
524
  layout: 'centered',
464
525
  design: {
465
526
  type: 'figma',
466
- url: 'https://www.figma.com/design/MjjYek73MFnHmVNdm45Sd1/Apollo-Web',
527
+ url: 'https://www.figma.com/design/MjjYek73MFnHmVNdm45Sd1/Apollo-Web?node-id=24425-16384',
467
528
  },
468
529
  },
469
530
  };
470
531
  const FooterSlotWebComponent = (args) => {
471
532
  const footerHtml = args.footerItems.map(renderNavItem).join('');
472
- return `
473
- <style>
474
- .footer-demo-wrapper {
475
- width: 280px;
476
- padding: var(--xpl-space-16);
477
- border: var(--xpl-border-small) solid var(--xpl-border-default);
478
- background-color: var(--xpl-background-surface-subtlest);
479
- border-radius: var(--xpl-border-radius-default);
480
- }
481
- .footer-demo-caption {
482
- font-size: var(--xpl-font-size-caption);
483
- color: var(--xpl-text-subdued);
484
- margin-bottom: var(--xpl-space-8);
485
- }
486
- </style>
487
- <div class="footer-demo-caption">Nav Footer Slot</div>
488
- <xpl-side-nav class="footer-demo-wrapper">
489
- <div slot="section">
490
- <xpl-side-nav-item label="Dashboard" icon="house-4" selected></xpl-side-nav-item>
491
- </div>
533
+ return `<xpl-side-nav>
492
534
  <div slot="nav-footer">${footerHtml}</div>
493
535
  </xpl-side-nav>`;
494
536
  };
495
537
  const FooterSlotHtml = (args) => {
496
538
  const footerHtml = args.footerItems.map((item) => renderHtmlNavItem(item, 4)).join('\n');
497
539
  return `<div class="xpl-side-nav">
498
- <div class="xpl-side-nav__wrapper">
499
- <nav class="xpl-side-nav__content">
500
- <div class="xpl-side-nav__section">
501
- <div class="xpl-side-nav-item">
502
- <button type="button" class="xpl-side-nav-item__link selected" aria-current="page">
503
- <span class="xpl-side-nav-item__icon"><!-- icon --></span>
504
- <span class="xpl-side-nav-item__label">Dashboard</span>
505
- </button>
506
- </div>
507
- </div>
508
- <div class="xpl-side-nav__footer">
540
+ <div class="xpl-side-nav__footer">
509
541
  ${footerHtml}
510
- </div>
511
- </nav>
512
542
  </div>
513
543
  </div>`;
514
544
  };
@@ -517,3 +547,88 @@ FooterSlot.parameters = Object.assign(Object.assign({}, FooterSlot.parameters),
517
547
  }, html: {
518
548
  render: FooterSlotHtml(FooterSlot.args),
519
549
  } });
550
+ const mobileItems = [
551
+ { label: 'Dashboard', icon: 'house-4', selected: true },
552
+ { label: 'Product', icon: 'bag-shopping-2' },
553
+ {
554
+ label: 'Settings',
555
+ icon: 'gear-3',
556
+ hasChildren: true,
557
+ children: [{ label: 'Location' }, { label: 'Schedule' }],
558
+ },
559
+ { label: 'Xplor Growth', icon: 'chart-line-up', trailingIcon: 'external-link' },
560
+ ];
561
+ const mobileFooterItems = [
562
+ { label: 'Support', icon: 'headset' },
563
+ { label: 'Logout', icon: 'open-rect-arrow-out' },
564
+ ];
565
+ const renderMobileSideNav = (open) => {
566
+ const itemsHtml = mobileItems.map(renderNavItem).join('');
567
+ const footerHtml = mobileFooterItems.map(renderNavItem).join('');
568
+ return `
569
+ <style>
570
+ .side-nav-mobile-root {
571
+ position: relative;
572
+ width: 100%;
573
+ height: 100vh;
574
+ overflow: hidden;
575
+ background: var(--xpl-background-surface-subtle);
576
+ }
577
+ /* Force the mobile bar layout regardless of Storybook viewport width. */
578
+ .side-nav-mobile-root .xpl-side-nav {
579
+ width: 100%;
580
+ height: var(--xpl-size-350);
581
+ min-height: var(--xpl-size-350);
582
+ padding: var(--xpl-space-8) var(--xpl-space-16);
583
+ border-right: var(--xpl-border-none);
584
+ border-bottom: var(--xpl-border-small) solid var(--xpl-border-default);
585
+ }
586
+ .side-nav-mobile-root .xpl-side-nav__toggle {
587
+ display: flex;
588
+ width: var(--xpl-size-250);
589
+ height: var(--xpl-size-250);
590
+ }
591
+ /* Page content placeholder fills the remaining height behind the closed bar. */
592
+ .side-nav-mobile-page {
593
+ padding: var(--xpl-space-24) var(--xpl-space-16);
594
+ font-family: var(--xpl-font-family-default);
595
+ font-size: var(--xpl-font-size-body);
596
+ color: var(--xpl-text-subdued);
597
+ }
598
+ </style>
599
+ <div class="side-nav-mobile-root">
600
+ <xpl-side-nav label="Main navigation"${open ? ' open' : ''}>
601
+ <div slot="section">${itemsHtml}</div>
602
+ <div slot="nav-footer">${footerHtml}</div>
603
+ </xpl-side-nav>
604
+ <div class="side-nav-mobile-page">
605
+ ${open ? 'Drawer open — the 80 vw drawer slides over this content; the 20 vw backdrop scrim is visible on the right. Press Escape or tap the backdrop to close.' : 'Tap the toggle in the bar above to open the drawer.'}
606
+ </div>
607
+ </div>`;
608
+ };
609
+ export const MobileClosed = () => renderMobileSideNav(false);
610
+ MobileClosed.parameters = {
611
+ layout: 'fullscreen',
612
+ design: {
613
+ type: 'figma',
614
+ url: 'https://www.figma.com/design/MjjYek73MFnHmVNdm45Sd1/Apollo-Web?node-id=48928-8582',
615
+ },
616
+ docs: {
617
+ description: {
618
+ story: 'Mobile closed state (full viewport). Below the `md` breakpoint the sidebar collapses to a ~56 px top bar with a `sidebar-left-show` toggle. Resize the Storybook canvas below 768 px, or use the "Mobile" viewport preset, to see the responsive layout.',
619
+ },
620
+ },
621
+ };
622
+ export const MobileOpen = () => renderMobileSideNav(true);
623
+ MobileOpen.parameters = {
624
+ layout: 'fullscreen',
625
+ design: {
626
+ type: 'figma',
627
+ url: 'https://www.figma.com/design/MjjYek73MFnHmVNdm45Sd1/Apollo-Web?node-id=48928-8581',
628
+ },
629
+ docs: {
630
+ description: {
631
+ story: 'Mobile open state (`open` attribute, full viewport). The 80 vw drawer slides in from the left; the remaining 20 vw shows the `xpl-backdrop` scrim. Escape or a backdrop click closes the drawer and returns focus to the toggle.',
632
+ },
633
+ },
634
+ };