@ds-mo/ui 3.0.1 → 3.1.1

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 (438) hide show
  1. package/dist/.build-stamp +1 -1
  2. package/dist/angular/angular-component-lib/utils.d.ts +9 -0
  3. package/dist/angular/angular-component-lib/utils.js +58 -0
  4. package/dist/angular/boolean-value-accessor.d.ts +9 -0
  5. package/dist/angular/boolean-value-accessor.js +37 -0
  6. package/dist/angular/ds-app-shell.d.ts +12 -0
  7. package/dist/angular/ds-app-shell.js +38 -0
  8. package/dist/angular/ds-badge.d.ts +12 -0
  9. package/dist/angular/ds-badge.js +38 -0
  10. package/dist/angular/ds-banner.d.ts +15 -0
  11. package/dist/angular/ds-banner.js +42 -0
  12. package/dist/angular/ds-bar-nav.d.ts +18 -0
  13. package/dist/angular/ds-bar-nav.js +42 -0
  14. package/dist/angular/ds-button-filled.d.ts +15 -0
  15. package/dist/angular/ds-button-filled.js +43 -0
  16. package/dist/angular/ds-button-unfilled.d.ts +17 -0
  17. package/dist/angular/ds-button-unfilled.js +46 -0
  18. package/dist/angular/ds-card-data-viz-donut.d.ts +18 -0
  19. package/dist/angular/ds-card-data-viz-donut.js +42 -0
  20. package/dist/angular/ds-card-setting.d.ts +18 -0
  21. package/dist/angular/ds-card-setting.js +42 -0
  22. package/dist/angular/ds-card.d.ts +12 -0
  23. package/dist/angular/ds-card.js +38 -0
  24. package/dist/angular/ds-chart-bar.d.ts +12 -0
  25. package/dist/angular/ds-chart-bar.js +38 -0
  26. package/dist/angular/ds-chart-donut.d.ts +19 -0
  27. package/dist/angular/ds-chart-donut.js +42 -0
  28. package/dist/angular/ds-chart-legend.d.ts +30 -0
  29. package/dist/angular/ds-chart-legend.js +45 -0
  30. package/dist/angular/ds-chart-line.d.ts +12 -0
  31. package/dist/angular/ds-chart-line.js +38 -0
  32. package/dist/angular/ds-checkbox.d.ts +15 -0
  33. package/dist/angular/ds-checkbox.js +42 -0
  34. package/dist/angular/ds-chip.d.ts +18 -0
  35. package/dist/angular/ds-chip.js +42 -0
  36. package/dist/angular/ds-divider.d.ts +12 -0
  37. package/dist/angular/ds-divider.js +38 -0
  38. package/dist/angular/ds-empty-state.d.ts +12 -0
  39. package/dist/angular/ds-empty-state.js +38 -0
  40. package/dist/angular/ds-field.d.ts +12 -0
  41. package/dist/angular/ds-field.js +38 -0
  42. package/dist/angular/ds-icon.d.ts +12 -0
  43. package/dist/angular/ds-icon.js +38 -0
  44. package/dist/angular/ds-input.d.ts +17 -0
  45. package/dist/angular/ds-input.js +46 -0
  46. package/dist/angular/ds-loader.d.ts +12 -0
  47. package/dist/angular/ds-loader.js +38 -0
  48. package/dist/angular/ds-menu.d.ts +24 -0
  49. package/dist/angular/ds-menu.js +48 -0
  50. package/dist/angular/ds-modal.d.ts +15 -0
  51. package/dist/angular/ds-modal.js +42 -0
  52. package/dist/angular/ds-pagination.d.ts +15 -0
  53. package/dist/angular/ds-pagination.js +42 -0
  54. package/dist/angular/ds-panel-nav.d.ts +42 -0
  55. package/dist/angular/ds-panel-nav.js +58 -0
  56. package/dist/angular/ds-panel-tools.d.ts +33 -0
  57. package/dist/angular/ds-panel-tools.js +49 -0
  58. package/dist/angular/ds-radio-group.d.ts +15 -0
  59. package/dist/angular/ds-radio-group.js +42 -0
  60. package/dist/angular/ds-select.d.ts +18 -0
  61. package/dist/angular/ds-select.js +42 -0
  62. package/dist/angular/ds-shell-gradient-picker.d.ts +16 -0
  63. package/dist/angular/ds-shell-gradient-picker.js +42 -0
  64. package/dist/angular/ds-shell-gradient-swatch.d.ts +16 -0
  65. package/dist/angular/ds-shell-gradient-swatch.js +42 -0
  66. package/dist/angular/ds-skeleton.d.ts +12 -0
  67. package/dist/angular/ds-skeleton.js +38 -0
  68. package/dist/angular/ds-slider.d.ts +15 -0
  69. package/dist/angular/ds-slider.js +42 -0
  70. package/dist/angular/ds-tab-group-nav.d.ts +20 -0
  71. package/dist/angular/ds-tab-group-nav.js +46 -0
  72. package/dist/angular/ds-tab-group.d.ts +15 -0
  73. package/dist/angular/ds-tab-group.js +42 -0
  74. package/dist/angular/ds-table.d.ts +33 -0
  75. package/dist/angular/ds-table.js +48 -0
  76. package/dist/angular/ds-tag.d.ts +12 -0
  77. package/dist/angular/ds-tag.js +38 -0
  78. package/dist/angular/ds-text.d.ts +12 -0
  79. package/dist/angular/ds-text.js +38 -0
  80. package/dist/angular/ds-toggle.d.ts +15 -0
  81. package/dist/angular/ds-toggle.js +42 -0
  82. package/dist/angular/ds-tooltip-data-viz.d.ts +12 -0
  83. package/dist/angular/ds-tooltip-data-viz.js +38 -0
  84. package/dist/angular/ds-tooltip.d.ts +12 -0
  85. package/dist/angular/ds-tooltip.js +38 -0
  86. package/dist/angular/index.d.ts +2 -0
  87. package/dist/angular/index.js +43 -0
  88. package/dist/angular/proxies.d.ts +44 -0
  89. package/dist/angular/proxies.js +45 -0
  90. package/dist/angular/radio-value-accessor.d.ts +8 -0
  91. package/dist/angular/radio-value-accessor.js +34 -0
  92. package/dist/angular/select-value-accessor.d.ts +8 -0
  93. package/dist/angular/select-value-accessor.js +34 -0
  94. package/dist/angular/text-value-accessor.d.ts +8 -0
  95. package/dist/angular/text-value-accessor.js +34 -0
  96. package/dist/angular/value-accessor.d.ts +18 -0
  97. package/dist/angular/value-accessor.js +39 -0
  98. package/dist/components/ds-app-shell.js +1 -1
  99. package/dist/components/ds-bar-nav.js +1 -1
  100. package/dist/components/ds-bar-nav.js.map +1 -1
  101. package/dist/components/ds-button-filled.js +1 -1
  102. package/dist/components/ds-button-unfilled.js +1 -1
  103. package/dist/components/ds-card-data-viz-donut.js +1 -1
  104. package/dist/components/ds-card-data-viz-donut.js.map +1 -1
  105. package/dist/components/ds-card-setting.js +1 -1
  106. package/dist/components/ds-card-setting.js.map +1 -1
  107. package/dist/components/ds-chart-donut.js +1 -1
  108. package/dist/components/ds-chart-donut.js.map +1 -1
  109. package/dist/components/ds-chart-legend.js +1 -1
  110. package/dist/components/ds-chart-legend.js.map +1 -1
  111. package/dist/components/ds-checkbox.js +1 -1
  112. package/dist/components/ds-checkbox.js.map +1 -1
  113. package/dist/components/ds-chip.js +1 -1
  114. package/dist/components/ds-chip.js.map +1 -1
  115. package/dist/components/ds-empty-state.js +1 -1
  116. package/dist/components/ds-empty-state.js.map +1 -1
  117. package/dist/components/ds-input.js +1 -1
  118. package/dist/components/ds-input.js.map +1 -1
  119. package/dist/components/ds-menu.js +1 -1
  120. package/dist/components/ds-pagination.js +1 -1
  121. package/dist/components/ds-pagination.js.map +1 -1
  122. package/dist/components/ds-panel-nav.js +1 -1
  123. package/dist/components/ds-panel-nav.js.map +1 -1
  124. package/dist/components/ds-panel-tools.js +1 -1
  125. package/dist/components/ds-panel-tools.js.map +1 -1
  126. package/dist/components/ds-radio-group.js +1 -1
  127. package/dist/components/ds-radio-group.js.map +1 -1
  128. package/dist/components/ds-select.js +1 -1
  129. package/dist/components/ds-select.js.map +1 -1
  130. package/dist/components/ds-shell-gradient-picker.js +1 -1
  131. package/dist/components/ds-shell-gradient-swatch.js +1 -1
  132. package/dist/components/ds-tab-group-nav.js +1 -1
  133. package/dist/components/ds-tab-group.js +1 -1
  134. package/dist/components/ds-tab-group.js.map +1 -1
  135. package/dist/components/ds-table.js +1 -1
  136. package/dist/components/ds-table.js.map +1 -1
  137. package/dist/components/ds-toggle.js +1 -1
  138. package/dist/components/ds-toggle.js.map +1 -1
  139. package/dist/components/index.js +1 -1
  140. package/dist/components/index.js.map +1 -1
  141. package/dist/components/p-BBpASejH.js +2 -0
  142. package/dist/components/p-BBpASejH.js.map +1 -0
  143. package/dist/components/{p-D0gBLLJx.js → p-BFiaUYu7.js} +2 -2
  144. package/dist/components/p-BFiaUYu7.js.map +1 -0
  145. package/dist/components/p-CTK82RIw.js +2 -0
  146. package/dist/components/p-CTK82RIw.js.map +1 -0
  147. package/dist/components/{p-BSNlp8Di.js → p-Cp86p-11.js} +2 -2
  148. package/dist/components/{p-BSNlp8Di.js.map → p-Cp86p-11.js.map} +1 -1
  149. package/dist/components/{p-vlwhuqVn.js → p-DHjjwgku.js} +2 -2
  150. package/dist/components/{p-vlwhuqVn.js.map → p-DHjjwgku.js.map} +1 -1
  151. package/dist/components/{p-boPMASaQ.js → p-DOEMwKBb.js} +2 -2
  152. package/dist/components/{p-boPMASaQ.js.map → p-DOEMwKBb.js.map} +1 -1
  153. package/dist/components/{p-Co2kLhWu.js → p-DolYlDbY.js} +2 -2
  154. package/dist/components/p-DolYlDbY.js.map +1 -0
  155. package/dist/components/p-NkAPA-Dz.js +2 -0
  156. package/dist/components/p-NkAPA-Dz.js.map +1 -0
  157. package/dist/framework/angular.d.ts +6 -0
  158. package/dist/framework/angular.js +6 -0
  159. package/dist/lib/nav/chrome-transition.d.ts +8 -0
  160. package/dist/lib/nav/index.js.map +2 -2
  161. package/dist/lib/utils/format-compact-number.d.ts +1 -1
  162. package/dist/lib/utils/index.js +8 -1
  163. package/dist/lib/utils/index.js.map +2 -2
  164. package/dist/react/components.d.ts +44 -0
  165. package/{src/react/components.ts → dist/react/components.js} +0 -1
  166. package/dist/react/ds-app-shell.d.ts +9 -0
  167. package/dist/react/ds-app-shell.js +12 -0
  168. package/dist/react/ds-badge.d.ts +9 -0
  169. package/dist/react/ds-badge.js +12 -0
  170. package/dist/react/ds-banner.d.ts +12 -0
  171. package/dist/react/ds-banner.js +12 -0
  172. package/dist/react/ds-bar-nav.d.ts +12 -0
  173. package/dist/react/ds-bar-nav.js +12 -0
  174. package/dist/react/ds-button-filled.d.ts +12 -0
  175. package/dist/react/ds-button-filled.js +12 -0
  176. package/dist/react/ds-button-unfilled.d.ts +13 -0
  177. package/dist/react/ds-button-unfilled.js +15 -0
  178. package/dist/react/ds-card-data-viz-donut.d.ts +12 -0
  179. package/dist/react/ds-card-data-viz-donut.js +12 -0
  180. package/dist/react/ds-card-setting.d.ts +12 -0
  181. package/dist/react/ds-card-setting.js +12 -0
  182. package/dist/react/ds-card.d.ts +9 -0
  183. package/dist/react/ds-card.js +12 -0
  184. package/dist/react/ds-chart-bar.d.ts +9 -0
  185. package/dist/react/ds-chart-bar.js +12 -0
  186. package/dist/react/ds-chart-donut.d.ts +12 -0
  187. package/dist/react/ds-chart-donut.js +12 -0
  188. package/dist/react/ds-chart-legend.d.ts +16 -0
  189. package/dist/react/ds-chart-legend.js +15 -0
  190. package/dist/react/ds-chart-line.d.ts +9 -0
  191. package/dist/react/ds-chart-line.js +12 -0
  192. package/dist/react/ds-checkbox.d.ts +12 -0
  193. package/dist/react/ds-checkbox.js +12 -0
  194. package/dist/react/ds-chip.d.ts +12 -0
  195. package/dist/react/ds-chip.js +12 -0
  196. package/dist/react/ds-divider.d.ts +9 -0
  197. package/dist/react/ds-divider.js +12 -0
  198. package/dist/react/ds-empty-state.d.ts +9 -0
  199. package/dist/react/ds-empty-state.js +12 -0
  200. package/dist/react/ds-field.d.ts +9 -0
  201. package/dist/react/ds-field.js +12 -0
  202. package/dist/react/ds-icon.d.ts +9 -0
  203. package/dist/react/ds-icon.js +12 -0
  204. package/dist/react/ds-input.d.ts +13 -0
  205. package/dist/react/ds-input.js +15 -0
  206. package/dist/react/ds-loader.d.ts +9 -0
  207. package/dist/react/ds-loader.js +12 -0
  208. package/dist/react/ds-menu.d.ts +14 -0
  209. package/dist/react/ds-menu.js +16 -0
  210. package/dist/react/ds-modal.d.ts +12 -0
  211. package/dist/react/ds-modal.js +12 -0
  212. package/dist/react/ds-pagination.d.ts +12 -0
  213. package/dist/react/ds-pagination.js +12 -0
  214. package/dist/react/ds-panel-nav.d.ts +17 -0
  215. package/dist/react/ds-panel-nav.js +19 -0
  216. package/dist/react/ds-panel-tools.d.ts +17 -0
  217. package/dist/react/ds-panel-tools.js +16 -0
  218. package/dist/react/ds-radio-group.d.ts +12 -0
  219. package/dist/react/ds-radio-group.js +12 -0
  220. package/dist/react/ds-select.d.ts +12 -0
  221. package/dist/react/ds-select.js +12 -0
  222. package/dist/react/ds-shell-gradient-picker.d.ts +12 -0
  223. package/dist/react/ds-shell-gradient-picker.js +12 -0
  224. package/dist/react/ds-shell-gradient-swatch.d.ts +12 -0
  225. package/dist/react/ds-shell-gradient-swatch.js +12 -0
  226. package/dist/react/ds-skeleton.d.ts +9 -0
  227. package/dist/react/ds-skeleton.js +12 -0
  228. package/dist/react/ds-slider.d.ts +12 -0
  229. package/dist/react/ds-slider.js +12 -0
  230. package/dist/react/ds-tab-group-nav.d.ts +13 -0
  231. package/dist/react/ds-tab-group-nav.js +15 -0
  232. package/dist/react/ds-tab-group.d.ts +12 -0
  233. package/dist/react/ds-tab-group.js +12 -0
  234. package/dist/react/ds-table.d.ts +21 -0
  235. package/dist/react/ds-table.js +16 -0
  236. package/dist/react/ds-tag.d.ts +9 -0
  237. package/dist/react/ds-tag.js +12 -0
  238. package/dist/react/ds-text.d.ts +9 -0
  239. package/dist/react/ds-text.js +12 -0
  240. package/dist/react/ds-toggle.d.ts +12 -0
  241. package/dist/react/ds-toggle.js +12 -0
  242. package/dist/react/ds-tooltip-data-viz.d.ts +9 -0
  243. package/dist/react/ds-tooltip-data-viz.js +12 -0
  244. package/dist/react/ds-tooltip.d.ts +9 -0
  245. package/dist/react/ds-tooltip.js +12 -0
  246. package/dist/types/components/BarNav/BarNav.d.ts +1 -0
  247. package/dist/types/components/ButtonFilled/ButtonFilled.d.ts +1 -1
  248. package/dist/types/components/ButtonUnfilled/ButtonUnfilled.d.ts +1 -1
  249. package/dist/types/components/CardDataVizDonut/CardDataVizDonut.d.ts +1 -0
  250. package/dist/types/components/CardSetting/CardSetting.d.ts +3 -0
  251. package/dist/types/components/ChartDonut/ChartDonut.d.ts +2 -0
  252. package/dist/types/components/ChartLegend/ChartLegend.d.ts +1 -0
  253. package/dist/types/components/Checkbox/Checkbox.d.ts +12 -0
  254. package/dist/types/components/Chip/Chip.d.ts +2 -0
  255. package/dist/types/components/EmptyState/EmptyState.d.ts +2 -0
  256. package/dist/types/components/Input/Input.d.ts +14 -1
  257. package/dist/types/components/Menu/Menu.d.ts +2 -0
  258. package/dist/types/components/Pagination/Pagination.d.ts +3 -0
  259. package/dist/types/components/PanelNav/PanelNav.d.ts +7 -0
  260. package/dist/types/components/PanelTools/PanelTools.d.ts +2 -0
  261. package/dist/types/components/RadioGroup/RadioGroup.d.ts +13 -1
  262. package/dist/types/components/Select/Select.d.ts +13 -1
  263. package/dist/types/components/ShellGradientPicker/ShellGradientPicker.d.ts +1 -0
  264. package/dist/types/components/ShellGradientSwatch/ShellGradientSwatch.d.ts +1 -1
  265. package/dist/types/components/TabGroup/TabGroup.d.ts +1 -1
  266. package/dist/types/components/TabGroupNav/TabGroupNav.d.ts +1 -1
  267. package/dist/types/components/Table/Table.d.ts +6 -0
  268. package/dist/types/components/Toggle/Toggle.d.ts +12 -0
  269. package/dist/types/components.d.ts +525 -30
  270. package/dist/types/nav/chrome-transition.d.ts +8 -0
  271. package/dist/types/stencil-public-runtime.d.ts +1 -0
  272. package/dist/types/utils/format-compact-number.d.ts +1 -1
  273. package/package.json +58 -41
  274. package/dist/components/p-BiM6QBTF.js +0 -2
  275. package/dist/components/p-BiM6QBTF.js.map +0 -1
  276. package/dist/components/p-Co2kLhWu.js.map +0 -1
  277. package/dist/components/p-CsaW5gDM.js +0 -2
  278. package/dist/components/p-CsaW5gDM.js.map +0 -1
  279. package/dist/components/p-D0gBLLJx.js.map +0 -1
  280. package/dist/components/p-DEpLlQZK.js +0 -2
  281. package/dist/components/p-DEpLlQZK.js.map +0 -1
  282. package/src/angular/angular-component-lib/utils.ts +0 -65
  283. package/src/angular/index.ts +0 -45
  284. package/src/angular/proxies.ts +0 -1156
  285. package/src/react/ds-app-shell.ts +0 -26
  286. package/src/react/ds-badge.ts +0 -26
  287. package/src/react/ds-banner.ts +0 -27
  288. package/src/react/ds-bar-nav.ts +0 -27
  289. package/src/react/ds-button-filled.ts +0 -27
  290. package/src/react/ds-button-unfilled.ts +0 -33
  291. package/src/react/ds-card-data-viz-donut.ts +0 -27
  292. package/src/react/ds-card-setting.ts +0 -27
  293. package/src/react/ds-card.ts +0 -26
  294. package/src/react/ds-chart-bar.ts +0 -26
  295. package/src/react/ds-chart-donut.ts +0 -27
  296. package/src/react/ds-chart-legend.ts +0 -33
  297. package/src/react/ds-chart-line.ts +0 -26
  298. package/src/react/ds-checkbox.ts +0 -27
  299. package/src/react/ds-chip.ts +0 -27
  300. package/src/react/ds-divider.ts +0 -26
  301. package/src/react/ds-empty-state.ts +0 -26
  302. package/src/react/ds-field.ts +0 -26
  303. package/src/react/ds-icon.ts +0 -26
  304. package/src/react/ds-input.ts +0 -33
  305. package/src/react/ds-loader.ts +0 -26
  306. package/src/react/ds-menu.ts +0 -35
  307. package/src/react/ds-modal.ts +0 -27
  308. package/src/react/ds-pagination.ts +0 -27
  309. package/src/react/ds-panel-nav.ts +0 -41
  310. package/src/react/ds-panel-tools.ts +0 -35
  311. package/src/react/ds-radio-group.ts +0 -27
  312. package/src/react/ds-select.ts +0 -27
  313. package/src/react/ds-shell-gradient-picker.ts +0 -27
  314. package/src/react/ds-shell-gradient-swatch.ts +0 -27
  315. package/src/react/ds-skeleton.ts +0 -26
  316. package/src/react/ds-slider.ts +0 -27
  317. package/src/react/ds-tab-group-nav.ts +0 -33
  318. package/src/react/ds-tab-group.ts +0 -27
  319. package/src/react/ds-table.ts +0 -35
  320. package/src/react/ds-tag.ts +0 -26
  321. package/src/react/ds-text.ts +0 -26
  322. package/src/react/ds-toggle.ts +0 -27
  323. package/src/react/ds-tooltip-data-viz.ts +0 -26
  324. package/src/react/ds-tooltip.ts +0 -26
  325. package/src/wc/components/AppShell/AppShell.tsx +0 -377
  326. package/src/wc/components/Badge/Badge.tsx +0 -179
  327. package/src/wc/components/Badge/index.ts +0 -1
  328. package/src/wc/components/Banner/Banner.tsx +0 -156
  329. package/src/wc/components/BarNav/BarNav.tsx +0 -745
  330. package/src/wc/components/BarNav/bar-nav-dom-utils.ts +0 -23
  331. package/src/wc/components/BarNav/bar-nav-tabs-menu-utils.ts +0 -114
  332. package/src/wc/components/BarNav/bar-nav-types.ts +0 -3
  333. package/src/wc/components/BarNav/bar-nav-utils.ts +0 -67
  334. package/src/wc/components/BarNav/index.ts +0 -2
  335. package/src/wc/components/ButtonFilled/ButtonFilled.tsx +0 -171
  336. package/src/wc/components/ButtonFilled/index.ts +0 -7
  337. package/src/wc/components/ButtonUnfilled/ButtonUnfilled.tsx +0 -229
  338. package/src/wc/components/ButtonUnfilled/index.ts +0 -7
  339. package/src/wc/components/Card/Card.tsx +0 -78
  340. package/src/wc/components/Card/index.ts +0 -1
  341. package/src/wc/components/CardDataVizDonut/CardDataVizDonut.tsx +0 -108
  342. package/src/wc/components/CardDataVizDonut/index.ts +0 -1
  343. package/src/wc/components/CardSetting/CardSetting.tsx +0 -81
  344. package/src/wc/components/CardSetting/index.ts +0 -1
  345. package/src/wc/components/ChartBar/ChartBar.tsx +0 -88
  346. package/src/wc/components/ChartBar/index.ts +0 -1
  347. package/src/wc/components/ChartDonut/ChartDonut.tsx +0 -289
  348. package/src/wc/components/ChartDonut/index.ts +0 -1
  349. package/src/wc/components/ChartLegend/ChartLegend.tsx +0 -125
  350. package/src/wc/components/ChartLegend/index.ts +0 -2
  351. package/src/wc/components/ChartLine/ChartLine.tsx +0 -102
  352. package/src/wc/components/ChartLine/index.ts +0 -1
  353. package/src/wc/components/Checkbox/Checkbox.tsx +0 -60
  354. package/src/wc/components/Checkbox/index.ts +0 -1
  355. package/src/wc/components/Chip/Chip.tsx +0 -104
  356. package/src/wc/components/Chip/index.ts +0 -1
  357. package/src/wc/components/Divider/Divider.tsx +0 -107
  358. package/src/wc/components/Divider/index.ts +0 -2
  359. package/src/wc/components/EmptyState/EmptyState.tsx +0 -30
  360. package/src/wc/components/Field/Field.tsx +0 -30
  361. package/src/wc/components/Icon/Icon.tsx +0 -172
  362. package/src/wc/components/Icon/flag-icon-catalog.ts +0 -36
  363. package/src/wc/components/Icon/icon-cache.ts +0 -47
  364. package/src/wc/components/Icon/icon-svg.ts +0 -73
  365. package/src/wc/components/Icon/index.ts +0 -1
  366. package/src/wc/components/Icon/system-icon-catalog.ts +0 -401
  367. package/src/wc/components/Input/Input.tsx +0 -107
  368. package/src/wc/components/Input/index.ts +0 -1
  369. package/src/wc/components/Loader/Loader.tsx +0 -99
  370. package/src/wc/components/Loader/index.ts +0 -1
  371. package/src/wc/components/Menu/Menu.tsx +0 -437
  372. package/src/wc/components/Menu/menu-placement.ts +0 -26
  373. package/src/wc/components/Menu/menu-position.ts +0 -78
  374. package/src/wc/components/Menu/menu-types.ts +0 -39
  375. package/src/wc/components/Modal/Modal.tsx +0 -213
  376. package/src/wc/components/Pagination/Pagination.tsx +0 -97
  377. package/src/wc/components/PanelNav/PanelNav.tsx +0 -714
  378. package/src/wc/components/PanelNav/index.ts +0 -17
  379. package/src/wc/components/PanelNav/panel-nav-types.ts +0 -36
  380. package/src/wc/components/PanelNav/panel-nav-utils.ts +0 -79
  381. package/src/wc/components/PanelTools/PanelTools.tsx +0 -366
  382. package/src/wc/components/PanelTools/index.ts +0 -7
  383. package/src/wc/components/PanelTools/panel-tools-types.ts +0 -44
  384. package/src/wc/components/PanelTools/panel-tools-utils.ts +0 -50
  385. package/src/wc/components/RadioGroup/RadioGroup.tsx +0 -130
  386. package/src/wc/components/RadioGroup/index.ts +0 -1
  387. package/src/wc/components/Select/Select.tsx +0 -274
  388. package/src/wc/components/Select/index.ts +0 -1
  389. package/src/wc/components/ShellGradientPicker/ShellGradientPicker.tsx +0 -55
  390. package/src/wc/components/ShellGradientSwatch/ShellGradientSwatch.tsx +0 -69
  391. package/src/wc/components/ShellGradientSwatch/shell-gradient-swatch-types.ts +0 -17
  392. package/src/wc/components/Skeleton/Skeleton.tsx +0 -64
  393. package/src/wc/components/Skeleton/index.ts +0 -1
  394. package/src/wc/components/Slider/Slider.tsx +0 -76
  395. package/src/wc/components/Slider/index.ts +0 -1
  396. package/src/wc/components/TabGroup/TabGroup.tsx +0 -204
  397. package/src/wc/components/TabGroup/tab-item-utils.ts +0 -25
  398. package/src/wc/components/TabGroupNav/TabGroupNav.tsx +0 -347
  399. package/src/wc/components/Table/Table.tsx +0 -273
  400. package/src/wc/components/Tag/Tag.tsx +0 -63
  401. package/src/wc/components/Tag/index.ts +0 -1
  402. package/src/wc/components/Text/Text.tsx +0 -99
  403. package/src/wc/components/Text/index.ts +0 -12
  404. package/src/wc/components/Text/text-types.ts +0 -23
  405. package/src/wc/components/Text/text-utils.ts +0 -13
  406. package/src/wc/components/Toggle/Toggle.tsx +0 -43
  407. package/src/wc/components/Toggle/index.ts +0 -1
  408. package/src/wc/components/Tooltip/Tooltip.tsx +0 -413
  409. package/src/wc/components/TooltipDataViz/TooltipDataViz.tsx +0 -145
  410. package/src/wc/components/TooltipDataViz/index.ts +0 -1
  411. package/src/wc/components.d.ts +0 -3569
  412. package/src/wc/nav/badge-gradient-ring.ts +0 -109
  413. package/src/wc/nav/chrome-transition.ts +0 -62
  414. package/src/wc/nav/index.ts +0 -80
  415. package/src/wc/nav/nav-chrome.ts +0 -47
  416. package/src/wc/nav/shell-chrome-metrics.ts +0 -49
  417. package/src/wc/nav/shell-gradient-presets.ts +0 -60
  418. package/src/wc/nav/shell-gradient.ts +0 -94
  419. package/src/wc/nav/shell-shortcuts.ts +0 -63
  420. package/src/wc/nav/shell-view-transition.ts +0 -122
  421. package/src/wc/utils/chart-colors.ts +0 -7
  422. package/src/wc/utils/chart-types.ts +0 -25
  423. package/src/wc/utils/control-density.css +0 -43
  424. package/src/wc/utils/control-inactive.css +0 -20
  425. package/src/wc/utils/control-text.ts +0 -11
  426. package/src/wc/utils/control-width.css +0 -28
  427. package/src/wc/utils/control-width.ts +0 -10
  428. package/src/wc/utils/focus-ring.css +0 -33
  429. package/src/wc/utils/format-compact-number.ts +0 -27
  430. package/src/wc/utils/index.ts +0 -27
  431. package/src/wc/utils/interaction-fill.css +0 -162
  432. package/src/wc/utils/resolve-css-length-px.ts +0 -66
  433. package/src/wc/utils/resolve-css-time-ms.ts +0 -46
  434. package/src/wc/utils/scroll-edge-fade.css +0 -80
  435. package/src/wc/utils/scroll-edge-fade.ts +0 -148
  436. package/src/wc/utils/token-defaults.ts +0 -81
  437. package/src/wc/utils/truncate-svg-text.ts +0 -25
  438. package/src/wc/utils/typography.css +0 -146
@@ -1,745 +0,0 @@
1
- import {
2
- Component,
3
- Prop,
4
- Event,
5
- EventEmitter,
6
- Element,
7
- Watch,
8
- State,
9
- h,
10
- Host,
11
- } from '@stencil/core';
12
- import type { NavChromeStyle } from '../../nav/nav-chrome';
13
- import type { MenuItemData } from '../Menu/menu-types';
14
- import { isTabDivider } from '../TabGroup/tab-item-utils';
15
- import type { BarNavTab } from './bar-nav-types';
16
- import {
17
- deriveBarNavValueFromUrl,
18
- parseJsonArrayProp,
19
- shouldResyncBarNavProps,
20
- } from './bar-nav-utils';
21
- import {
22
- getTabListFromTabGroup,
23
- queryWithinComponentHost,
24
- type QueryableHost,
25
- } from './bar-nav-dom-utils';
26
- import {
27
- tabsOverflowContainer,
28
- tabsToOverflowMenuSections,
29
- trimTrailingDividers,
30
- visibleTabCountForWidth,
31
- } from './bar-nav-tabs-menu-utils';
32
- import {
33
- CHROME_TRANSITION_END,
34
- CHROME_TRANSITION_START,
35
- ChromeTransitionDepth,
36
- createRafCoalescer,
37
- readChromeTransitionSource,
38
- readChromeTransitionPhase,
39
- } from '../../nav/chrome-transition';
40
-
41
- @Component({
42
- tag: 'ds-bar-nav',
43
- styleUrl: 'BarNav.css',
44
- scoped: true,
45
- })
46
- export class BarNav {
47
- /** Style slot: `dashboard` or `settings`. Colors match for now. */
48
- @Prop({ attribute: 'nav-style', reflect: true }) navStyle: NavChromeStyle = 'dashboard';
49
-
50
- @Element() el!: HTMLElement;
51
-
52
- /**
53
- * Tab items for the left section.
54
- * Set via JS property: `el.tabs = [...]`. Replace the array reference to update.
55
- */
56
- @Prop() tabs: BarNavTab[] = [];
57
-
58
- /** JSON fallback for `tabs` — useful when framework bindings don't propagate arrays. */
59
- @Prop({ attribute: 'tabs-json' }) tabsJson: string = '';
60
-
61
- /** ID of the currently active tab. Overridden when `currentUrl` + `basePath` are set. */
62
- @Prop({ mutable: true }) value: string = '';
63
-
64
- /**
65
- * Fallback heading shown when no tabs are provided.
66
- * When tabs are present the heading is hidden.
67
- */
68
- @Prop() heading: string | undefined;
69
-
70
- /** Section base path (e.g. `/dashboard/safety`). Used with `currentUrl` to derive `value`. */
71
- @Prop() basePath: string = '';
72
-
73
- /** Current route URL. When set with `basePath`, the active tab is derived automatically. */
74
- @Prop() currentUrl: string = '';
75
-
76
- /** Emitted when the active tab changes. Detail = tab id. */
77
- @Event() dsTabChange!: EventEmitter<string>;
78
-
79
- @State() private resolvedTabs: BarNavTab[] = [];
80
- @State() private urlDerivedValue: string = '';
81
- @State() private hideTabsForDetailRoute = false;
82
- @State() private tabsCollapsed = false;
83
- @State() private menuOpen = false;
84
- /** When false, defer showing expanded tabs or the collapsed trigger until intrinsic width is measured (avoids a one-frame flash of the full tab row on narrow viewports). */
85
- @State() private tabLayoutCommitted = false;
86
- @State() private visibleTabs: BarNavTab[] = [];
87
- @State() private overflowTabs: BarNavTab[] = [];
88
- @State() private menuInitialFocusVisible = false;
89
- @State() private overflowRovingFocused = false;
90
-
91
- private static readonly HOST_PROP_SYNC_BUDGET = 8;
92
- private static readonly INTRINSIC_WIDTH_RETRY_MAX = 3;
93
- private static readonly TAB_LAYOUT_COMMIT_MAX_FRAMES = 16;
94
- private static readonly OVERFLOW_HYSTERESIS_PX = 8;
95
-
96
- private headerEl: HTMLElement | null = null;
97
- private triggerEl: (HTMLElement & { setFocus?: () => Promise<void> }) | null = null;
98
- private menuEl: HTMLDsMenuElement | null = null;
99
- private visibleTabGroupEl: HTMLDsTabGroupNavElement | null = null;
100
- private probeTabGroupEl: QueryableHost | null = null;
101
- private resizeObserver: ResizeObserver | null = null;
102
- private intrinsicWidthRetryCount = 0;
103
- private tabLayoutPendingFrames = 0;
104
- private readonly panelNavTransition = new ChromeTransitionDepth();
105
- private readonly panelToolsTransition = new ChromeTransitionDepth();
106
- private readonly overflowCoalescer = createRafCoalescer(() => {
107
- this.updateTabsCollapsed();
108
- });
109
- private chromeTransitionShell: HTMLElement | null = null;
110
- /** Matches `basePath` once tabs + URL are reconciled for the active section. */
111
- @State() private committedSection = '';
112
- /** Section waiting for URL + tabs to catch up after a cross-area navigation. */
113
- @State() private pendingSection = '';
114
-
115
- private get effectiveValue(): string {
116
- if (this.currentUrl && this.basePath) {
117
- return this.urlDerivedValue;
118
- }
119
- return this.value;
120
- }
121
-
122
- private get hasOverflowTabs(): boolean {
123
- return this.tabLayoutCommitted && this.tabsCollapsed && this.overflowTabs.length > 0;
124
- }
125
-
126
- private digestTabsConfig(tabs: BarNavTab[]): string {
127
- return tabs.map(t => (isTabDivider(t) ? '|' : t.id)).join(',');
128
- }
129
-
130
- private resetTabOverflowLayout() {
131
- this.tabLayoutCommitted = false;
132
- this.tabsCollapsed = false;
133
- this.menuOpen = false;
134
- this.menuInitialFocusVisible = false;
135
- this.intrinsicWidthRetryCount = 0;
136
- this.tabLayoutPendingFrames = 0;
137
- this.visibleTabs = [];
138
- this.overflowTabs = [];
139
- }
140
-
141
- @Watch('tabs')
142
- @Watch('tabsJson')
143
- @Watch('currentUrl')
144
- @Watch('basePath')
145
- onHostPropsChange() {
146
- this.applyHostProps();
147
- }
148
-
149
- @Watch('value')
150
- @Watch('urlDerivedValue')
151
- onSelectionChange() {
152
- this.syncMenuSections();
153
- this.scheduleOverflowCheck();
154
- }
155
-
156
- @Watch('menuOpen')
157
- onMenuOpenChange(open: boolean) {
158
- if (this.menuEl) {
159
- this.menuEl.open = open;
160
- }
161
- }
162
-
163
- @Watch('tabsCollapsed')
164
- onTabsCollapsedChange(collapsed: boolean, prevCollapsed: boolean | undefined) {
165
- if (!collapsed) {
166
- this.menuOpen = false;
167
- this.menuInitialFocusVisible = false;
168
- this.menuEl = null;
169
- }
170
- this.scheduleOverflowCheck();
171
- if (collapsed) {
172
- requestAnimationFrame(() => {
173
- this.scheduleOverflowCheck();
174
- });
175
- }
176
- if (collapsed || prevCollapsed === undefined || prevCollapsed === collapsed) return;
177
- requestAnimationFrame(() => this.scheduleOverflowCheck());
178
- queueMicrotask(() => this.focusVisibleSelectedTab());
179
- }
180
-
181
- componentWillLoad() {
182
- this.applyHostProps();
183
- }
184
-
185
- componentDidLoad() {
186
- this.syncHostPropsIfNeeded();
187
- this.scheduleDeferredHostPropSync();
188
- this.setupOverflowObserver();
189
- this.bindChromeTransitionListeners();
190
- this.scheduleOverflowCheck();
191
- }
192
-
193
- componentDidRender() {
194
- if (this.chromeOverflowPaused()) {
195
- this.syncMenuAnchor();
196
- return;
197
- }
198
- this.scheduleOverflowCheck();
199
- this.syncMenuAnchor();
200
- }
201
-
202
- disconnectedCallback() {
203
- this.resizeObserver?.disconnect();
204
- this.resizeObserver = null;
205
- this.overflowCoalescer.cancel();
206
- this.unbindChromeTransitionListeners();
207
- }
208
-
209
- private bindChromeTransitionListeners() {
210
- const shell = this.el.closest('ds-app-shell');
211
- if (!shell) return;
212
- this.chromeTransitionShell = shell;
213
- shell.addEventListener(CHROME_TRANSITION_START, this.onChromeTransitionStart);
214
- shell.addEventListener(CHROME_TRANSITION_END, this.onChromeTransitionEnd);
215
- }
216
-
217
- private unbindChromeTransitionListeners() {
218
- if (!this.chromeTransitionShell) return;
219
- this.chromeTransitionShell.removeEventListener(
220
- CHROME_TRANSITION_START,
221
- this.onChromeTransitionStart,
222
- );
223
- this.chromeTransitionShell.removeEventListener(
224
- CHROME_TRANSITION_END,
225
- this.onChromeTransitionEnd,
226
- );
227
- this.chromeTransitionShell = null;
228
- }
229
-
230
- private onChromeTransitionStart = (event: Event) => {
231
- const source = readChromeTransitionSource(event);
232
- if (source === 'panel-nav') {
233
- this.panelNavTransition.enter();
234
- return;
235
- }
236
- if (source === 'panel-tools') {
237
- const phase = readChromeTransitionPhase(event) ?? 'opening';
238
- if (phase === 'closing') {
239
- this.panelToolsTransition.enter();
240
- }
241
- }
242
- };
243
-
244
- private chromeOverflowPaused(): boolean {
245
- return this.panelNavTransition.isActive || this.panelToolsTransition.isActive;
246
- }
247
-
248
- private onChromeTransitionEnd = (event: Event) => {
249
- const source = readChromeTransitionSource(event);
250
- if (source === 'panel-nav') {
251
- this.panelNavTransition.exit();
252
- if (!this.panelNavTransition.isActive) {
253
- this.scheduleOverflowCheck();
254
- }
255
- return;
256
- }
257
- if (source === 'panel-tools') {
258
- this.panelToolsTransition.exit();
259
- this.scheduleOverflowCheck();
260
- }
261
- };
262
-
263
- /** Re-resolve props assigned by the host after componentWillLoad (Angular ngAfterViewInit). */
264
- private syncHostPropsIfNeeded() {
265
- if (shouldResyncBarNavProps(this.resolvedTabs, this.tabs, this.tabsJson)) {
266
- this.applyHostProps();
267
- } else if (this.currentUrl && this.basePath) {
268
- this.syncValueFromUrl();
269
- }
270
- }
271
-
272
- /** Poll across animation frames — host props may land without triggering @Watch. */
273
- private scheduleDeferredHostPropSync() {
274
- let remaining = BarNav.HOST_PROP_SYNC_BUDGET;
275
- const tick = () => {
276
- this.syncHostPropsIfNeeded();
277
- if (--remaining > 0) {
278
- requestAnimationFrame(tick);
279
- }
280
- };
281
- queueMicrotask(tick);
282
- }
283
-
284
- private setupOverflowObserver() {
285
- if (typeof ResizeObserver === 'undefined' || !this.headerEl) return;
286
- this.resizeObserver?.disconnect();
287
- this.resizeObserver = new ResizeObserver(() => {
288
- if (this.chromeOverflowPaused()) return;
289
- this.scheduleOverflowCheck();
290
- });
291
- this.resizeObserver.observe(this.headerEl);
292
- }
293
-
294
- private scheduleOverflowCheck() {
295
- if (this.chromeOverflowPaused()) return;
296
- this.overflowCoalescer.schedule();
297
- }
298
-
299
- /** Width available for the tab row or collapsed trigger. */
300
- private getLeftZoneAvailableWidth(): number {
301
- if (!this.headerEl) return 0;
302
-
303
- const headerStyle = getComputedStyle(this.headerEl);
304
- const horizontalPadding =
305
- (parseFloat(headerStyle.paddingLeft) || 0) + (parseFloat(headerStyle.paddingRight) || 0);
306
-
307
- return Math.max(0, this.headerEl.clientWidth - horizontalPadding);
308
- }
309
-
310
- private getTabsIntrinsicWidth(): number {
311
- const tabList = getTabListFromTabGroup(this.probeTabGroupEl);
312
- return tabList?.scrollWidth ?? 0;
313
- }
314
-
315
- private getHeaderGap(): number {
316
- if (!this.headerEl) return 0;
317
- const style = getComputedStyle(this.headerEl);
318
- return parseFloat(style.columnGap || style.gap) || 0;
319
- }
320
-
321
- private getOverflowTriggerReserveWidth(): number {
322
- if (!this.triggerEl) {
323
- return 40;
324
- }
325
- return this.triggerEl.getBoundingClientRect().width + this.getHeaderGap();
326
- }
327
-
328
- private getProbeTabMetrics():
329
- | {
330
- itemWidths: number[];
331
- itemGap: number;
332
- listExtraWidth: number;
333
- }
334
- | null {
335
- const tabList = getTabListFromTabGroup(this.probeTabGroupEl);
336
- if (!tabList) return null;
337
-
338
- const children = Array.from(tabList.children) as HTMLElement[];
339
- const itemWidths = children.map(child => child.getBoundingClientRect().width);
340
- if (itemWidths.length === 0 || itemWidths.some(width => width === 0)) return null;
341
-
342
- const style = getComputedStyle(tabList);
343
- const itemGap = parseFloat(style.columnGap || style.gap) || 0;
344
- const childrenWidth = itemWidths.reduce((sum, width) => sum + width, 0);
345
- const gapWidth = itemGap * Math.max(0, itemWidths.length - 1);
346
- const listExtraWidth = Math.max(0, tabList.scrollWidth - childrenWidth - gapWidth);
347
-
348
- return { itemWidths, itemGap, listExtraWidth };
349
- }
350
-
351
- private setOverflowTabLayout(visibleTabs: BarNavTab[], overflowTabs: BarNavTab[]) {
352
- const nextCollapsed = overflowTabs.length > 0;
353
- const visibleChanged =
354
- this.digestTabsConfig(visibleTabs) !== this.digestTabsConfig(this.visibleTabs);
355
- const overflowChanged =
356
- this.digestTabsConfig(overflowTabs) !== this.digestTabsConfig(this.overflowTabs);
357
-
358
- if (visibleChanged) {
359
- this.visibleTabs = visibleTabs;
360
- }
361
- if (overflowChanged) {
362
- this.overflowTabs = overflowTabs;
363
- }
364
- if (nextCollapsed !== this.tabsCollapsed) {
365
- this.tabsCollapsed = nextCollapsed;
366
- if (!nextCollapsed) {
367
- this.menuOpen = false;
368
- }
369
- }
370
- }
371
-
372
- private scheduleIntrinsicWidthRetry() {
373
- if (this.intrinsicWidthRetryCount >= BarNav.INTRINSIC_WIDTH_RETRY_MAX) return;
374
- this.intrinsicWidthRetryCount++;
375
- requestAnimationFrame(() => this.scheduleOverflowCheck());
376
- }
377
-
378
- private forceTabLayoutCommit(fallbackCollapsed: boolean) {
379
- this.intrinsicWidthRetryCount = 0;
380
- this.tabLayoutPendingFrames = 0;
381
- this.setOverflowTabLayout(
382
- fallbackCollapsed ? [] : this.resolvedTabs,
383
- fallbackCollapsed ? this.resolvedTabs : [],
384
- );
385
- this.tabLayoutCommitted = true;
386
- }
387
-
388
- private updateTabsCollapsed() {
389
- if (!this.headerEl || this.resolvedTabs.length === 0 || this.hideTabsForDetailRoute) {
390
- if (this.tabsCollapsed) {
391
- this.setOverflowTabLayout([], []);
392
- }
393
- this.intrinsicWidthRetryCount = 0;
394
- this.tabLayoutPendingFrames = 0;
395
- this.tabLayoutCommitted = true;
396
- return;
397
- }
398
-
399
- const metrics = this.getProbeTabMetrics();
400
- const intrinsicWidth = this.getTabsIntrinsicWidth();
401
- if (!metrics || intrinsicWidth === 0) {
402
- this.tabLayoutPendingFrames += 1;
403
- if (this.intrinsicWidthRetryCount >= BarNav.INTRINSIC_WIDTH_RETRY_MAX) {
404
- this.forceTabLayoutCommit(false);
405
- } else if (this.tabLayoutPendingFrames >= BarNav.TAB_LAYOUT_COMMIT_MAX_FRAMES) {
406
- this.forceTabLayoutCommit(false);
407
- } else {
408
- this.scheduleIntrinsicWidthRetry();
409
- }
410
- return;
411
- }
412
- this.intrinsicWidthRetryCount = 0;
413
- this.tabLayoutPendingFrames = 0;
414
-
415
- const shouldCollapse = tabsOverflowContainer(
416
- intrinsicWidth,
417
- this.getLeftZoneAvailableWidth(),
418
- this.tabsCollapsed,
419
- BarNav.OVERFLOW_HYSTERESIS_PX,
420
- );
421
-
422
- if (!shouldCollapse) {
423
- this.setOverflowTabLayout(this.resolvedTabs, []);
424
- this.tabLayoutCommitted = true;
425
- return;
426
- }
427
-
428
- const visibleCount = visibleTabCountForWidth(
429
- metrics.itemWidths,
430
- this.getLeftZoneAvailableWidth(),
431
- this.getOverflowTriggerReserveWidth(),
432
- metrics.itemGap,
433
- metrics.listExtraWidth,
434
- );
435
- const visibleTabs = trimTrailingDividers(this.resolvedTabs.slice(0, visibleCount));
436
- const overflowTabs = this.resolvedTabs.slice(visibleTabs.length);
437
- this.setOverflowTabLayout(visibleTabs, overflowTabs);
438
- this.tabLayoutCommitted = true;
439
- }
440
-
441
- private syncMenuAnchor() {
442
- if (!this.menuEl || !this.triggerEl || !this.hasOverflowTabs) return;
443
- this.menuEl.anchor = this.triggerEl;
444
- this.syncMenuSections();
445
- }
446
-
447
- private handleMenuSelect(e: Event) {
448
- const detail = (e as CustomEvent<MenuItemData>).detail;
449
- if (detail?.value !== undefined) {
450
- this.selectTab(String(detail.value));
451
- }
452
- this.menuOpen = false;
453
- this.menuInitialFocusVisible = false;
454
- }
455
-
456
- private handleMenuClose() {
457
- this.menuOpen = false;
458
- this.menuInitialFocusVisible = false;
459
- }
460
-
461
- /** Batch tabs/basePath/currentUrl updates so URL derivation never runs with a mixed section. */
462
- private incomingTabs(): BarNavTab[] {
463
- return this.tabsJson
464
- ? parseJsonArrayProp(this.tabsJson, [])
465
- : (this.tabs ?? []);
466
- }
467
-
468
- private applyHostProps() {
469
- const nextBasePath = this.basePath;
470
- const sectionChanged =
471
- nextBasePath !== '' &&
472
- this.committedSection !== '' &&
473
- nextBasePath !== this.committedSection;
474
-
475
- if (sectionChanged) {
476
- this.urlDerivedValue = '';
477
- this.committedSection = '';
478
- this.pendingSection = nextBasePath;
479
- this.resolvedTabs = [];
480
- this.resetTabOverflowLayout();
481
- return;
482
- }
483
-
484
- if (this.pendingSection) {
485
- if (!nextBasePath || nextBasePath !== this.pendingSection) {
486
- return;
487
- }
488
- if (!this.currentUrl.startsWith(this.pendingSection)) {
489
- return;
490
- }
491
- const tabs = this.incomingTabs();
492
- if (tabs.length === 0) {
493
- return;
494
- }
495
- this.pendingSection = '';
496
- }
497
-
498
- const tabs = this.incomingTabs();
499
- const tabsConfigChanged =
500
- this.digestTabsConfig(tabs) !== this.digestTabsConfig(this.resolvedTabs);
501
-
502
- this.resolvedTabs = tabs;
503
- this.syncValueFromUrl();
504
- this.committedSection = nextBasePath;
505
- if (tabsConfigChanged) {
506
- this.resetTabOverflowLayout();
507
- }
508
- this.scheduleOverflowCheck();
509
- }
510
-
511
- private syncMenuSections() {
512
- if (!this.menuEl) return;
513
- this.menuEl.sections = tabsToOverflowMenuSections(this.overflowTabs, this.effectiveValue);
514
- }
515
-
516
- private syncValueFromUrl() {
517
- const tabs = this.incomingTabs();
518
-
519
- if (!this.currentUrl || !this.basePath) {
520
- this.urlDerivedValue = '';
521
- this.hideTabsForDetailRoute = false;
522
- return;
523
- }
524
-
525
- if (!this.currentUrl.startsWith(this.basePath)) {
526
- this.urlDerivedValue = '';
527
- this.hideTabsForDetailRoute = false;
528
- return;
529
- }
530
-
531
- const { value, hideTabs } = deriveBarNavValueFromUrl(
532
- this.currentUrl,
533
- this.basePath,
534
- tabs,
535
- );
536
- this.urlDerivedValue = value;
537
- this.hideTabsForDetailRoute = hideTabs;
538
- }
539
-
540
- private selectTab(id: string) {
541
- this.value = id;
542
- this.dsTabChange.emit(id);
543
- }
544
-
545
- /** Move focus to the selected tab in the visible tab group (after expand). */
546
- private focusVisibleSelectedTab() {
547
- const tab = queryWithinComponentHost(
548
- this.visibleTabGroupEl,
549
- `[data-tab-id="${this.effectiveValue}"]`,
550
- );
551
- tab?.focus({ preventScroll: true });
552
- }
553
-
554
- private handleTabChange(e: Event) {
555
- this.selectTab((e as CustomEvent<string>).detail);
556
- }
557
-
558
- private toggleTabMenu(options?: { focusVisible?: boolean }) {
559
- if (this.menuOpen) {
560
- this.menuOpen = false;
561
- this.menuInitialFocusVisible = false;
562
- return;
563
- }
564
-
565
- if (this.menuEl && this.triggerEl) {
566
- this.menuEl.anchor = this.triggerEl;
567
- this.menuEl.minWidth = '';
568
- this.syncMenuSections();
569
- }
570
-
571
- this.menuInitialFocusVisible = options?.focusVisible ?? false;
572
- this.menuOpen = true;
573
- }
574
-
575
- private handleTabRovingExit(e: CustomEvent<'start' | 'end'>) {
576
- if (e.detail !== 'end' || !this.hasOverflowTabs) return;
577
- this.overflowRovingFocused = true;
578
- void this.triggerEl?.setFocus?.();
579
- }
580
-
581
- private handleOverflowFocus = () => {
582
- this.overflowRovingFocused = true;
583
- };
584
-
585
- private handleOverflowBlur = () => {
586
- this.overflowRovingFocused = false;
587
- };
588
-
589
- private handleTriggerKeyDown(e: KeyboardEvent) {
590
- if (!this.hasOverflowTabs) return;
591
-
592
- if (!this.menuOpen) {
593
- if (e.key === 'ArrowLeft') {
594
- e.preventDefault();
595
- this.overflowRovingFocused = false;
596
- void this.visibleTabGroupEl?.focusLastTab();
597
- return;
598
- }
599
-
600
- if (e.key === 'Enter' || e.key === ' ') {
601
- e.preventDefault();
602
- this.toggleTabMenu({ focusVisible: true });
603
- }
604
- return;
605
- }
606
-
607
- if (e.key === 'Escape') {
608
- e.preventDefault();
609
- this.menuOpen = false;
610
- this.menuInitialFocusVisible = false;
611
- void this.triggerEl?.setFocus?.();
612
- }
613
- }
614
-
615
- render() {
616
- // Section gating only applies when `basePath` is set (SPA section sync).
617
- // Tabs without a base path must still render — otherwise a single-tab bar
618
- // (or any non-routed tabs) silently falls through to an empty header.
619
- const sectionReady =
620
- this.basePath === '' || this.committedSection === this.basePath;
621
- const hasTabs =
622
- sectionReady && this.resolvedTabs.length > 0 && !this.hideTabsForDetailRoute;
623
- const tabGroupKey = this.basePath || 'no-section';
624
- const renderedTabs = this.hasOverflowTabs ? this.visibleTabs : this.resolvedTabs;
625
-
626
- return (
627
- <Host>
628
- <header
629
- class={{
630
- 'bar-nav': true,
631
- 'bar-nav--dashboard': this.navStyle === 'dashboard',
632
- 'bar-nav--settings': this.navStyle === 'settings',
633
- 'bar-nav--tabs-collapsed':
634
- hasTabs && this.hasOverflowTabs,
635
- }}
636
- ref={el => {
637
- this.headerEl = el as HTMLElement;
638
- if (el && !this.resizeObserver) {
639
- this.setupOverflowObserver();
640
- }
641
- }}
642
- >
643
- {hasTabs && (
644
- <div class="bar-nav__tabs-probe" aria-hidden="true" inert>
645
- <ds-tab-group-nav
646
- key={`probe-${tabGroupKey}`}
647
- ref={el => {
648
- const next = el ?? null;
649
- if (next === this.probeTabGroupEl) return;
650
- this.probeTabGroupEl = next;
651
- if (next) {
652
- this.intrinsicWidthRetryCount = 0;
653
- this.tabLayoutPendingFrames = 0;
654
- this.scheduleOverflowCheck();
655
- }
656
- }}
657
- tabs={this.resolvedTabs}
658
- value={this.effectiveValue}
659
- />
660
- </div>
661
- )}
662
-
663
- {hasTabs && this.tabLayoutCommitted && renderedTabs.length > 0 && (
664
- <div class="bar-nav__left">
665
- <ds-tab-group-nav
666
- key={`visible-${tabGroupKey}`}
667
- class="bar-nav__tabs-visible"
668
- ref={el => {
669
- this.visibleTabGroupEl = el ?? null;
670
- }}
671
- tabs={renderedTabs}
672
- value={this.effectiveValue}
673
- selectionFollowsFocus={false}
674
- rovingEnabled={!this.overflowRovingFocused}
675
- onDsChange={(e: Event) => this.handleTabChange(e)}
676
- onDsRovingExit={(e: CustomEvent<'start' | 'end'>) => this.handleTabRovingExit(e)}
677
- onFocusin={() => {
678
- this.overflowRovingFocused = false;
679
- }}
680
- />
681
- </div>
682
- )}
683
-
684
- {hasTabs && !this.tabLayoutCommitted && (
685
- <div class="bar-nav__tabs-pending" aria-hidden="true" />
686
- )}
687
-
688
- {!hasTabs && this.heading && (
689
- <ds-text
690
- class="bar-nav__heading"
691
- as="span"
692
- variant="text-body-medium"
693
- emphasis
694
- color="primary"
695
- wrap="nowrap"
696
- >
697
- {this.heading}
698
- </ds-text>
699
- )}
700
-
701
- {hasTabs && this.hasOverflowTabs && (
702
- <ds-button-unfilled variant="icon"
703
- class={{
704
- 'bar-nav__overflow-trigger': true,
705
- }}
706
- icon="Ellipses"
707
- isActive={this.menuOpen}
708
- activeFill={false}
709
- hasBorder={false}
710
- focusTabIndex={this.overflowRovingFocused ? 0 : -1}
711
- ref={(el?: HTMLDsButtonUnfilledElement) => {
712
- this.triggerEl = (el as (HTMLElement & { setFocus?: () => Promise<void> })) ?? null;
713
- }}
714
- haspopup="menu"
715
- expanded={this.menuOpen}
716
- aria-label="More tabs"
717
- onDsClick={() => this.toggleTabMenu({ focusVisible: false })}
718
- onFocusin={this.handleOverflowFocus}
719
- onFocusout={this.handleOverflowBlur}
720
- onKeyDown={(e: KeyboardEvent) => this.handleTriggerKeyDown(e)}
721
- />
722
- )}
723
-
724
- </header>
725
-
726
- {hasTabs && this.hasOverflowTabs && (
727
- <ds-menu
728
- ref={el => {
729
- this.menuEl = (el as HTMLDsMenuElement) ?? null;
730
- }}
731
- open={this.menuOpen}
732
- sections={tabsToOverflowMenuSections(this.overflowTabs, this.effectiveValue)}
733
- side="bottom"
734
- align="end"
735
- sideOffset="calc(var(--dimension-space-100) + var(--dimension-space-050))"
736
- alignOffset="var(--dimension-space-050)"
737
- initialFocusVisible={this.menuInitialFocusVisible}
738
- onDsSelect={(e: Event) => this.handleMenuSelect(e)}
739
- onDsClose={() => this.handleMenuClose()}
740
- />
741
- )}
742
- </Host>
743
- );
744
- }
745
- }