@ds-mo/ui 3.0.1 → 3.1.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 (430) 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-bar-nav.js +1 -1
  99. package/dist/components/ds-bar-nav.js.map +1 -1
  100. package/dist/components/ds-button-filled.js +1 -1
  101. package/dist/components/ds-button-unfilled.js +1 -1
  102. package/dist/components/ds-card-data-viz-donut.js +1 -1
  103. package/dist/components/ds-card-data-viz-donut.js.map +1 -1
  104. package/dist/components/ds-card-setting.js +1 -1
  105. package/dist/components/ds-card-setting.js.map +1 -1
  106. package/dist/components/ds-chart-donut.js +1 -1
  107. package/dist/components/ds-chart-donut.js.map +1 -1
  108. package/dist/components/ds-chart-legend.js +1 -1
  109. package/dist/components/ds-chart-legend.js.map +1 -1
  110. package/dist/components/ds-checkbox.js +1 -1
  111. package/dist/components/ds-checkbox.js.map +1 -1
  112. package/dist/components/ds-chip.js +1 -1
  113. package/dist/components/ds-chip.js.map +1 -1
  114. package/dist/components/ds-empty-state.js +1 -1
  115. package/dist/components/ds-empty-state.js.map +1 -1
  116. package/dist/components/ds-input.js +1 -1
  117. package/dist/components/ds-input.js.map +1 -1
  118. package/dist/components/ds-menu.js +1 -1
  119. package/dist/components/ds-pagination.js +1 -1
  120. package/dist/components/ds-pagination.js.map +1 -1
  121. package/dist/components/ds-panel-nav.js +1 -1
  122. package/dist/components/ds-panel-nav.js.map +1 -1
  123. package/dist/components/ds-panel-tools.js +1 -1
  124. package/dist/components/ds-panel-tools.js.map +1 -1
  125. package/dist/components/ds-radio-group.js +1 -1
  126. package/dist/components/ds-radio-group.js.map +1 -1
  127. package/dist/components/ds-select.js +1 -1
  128. package/dist/components/ds-select.js.map +1 -1
  129. package/dist/components/ds-shell-gradient-picker.js +1 -1
  130. package/dist/components/ds-shell-gradient-swatch.js +1 -1
  131. package/dist/components/ds-tab-group-nav.js +1 -1
  132. package/dist/components/ds-tab-group.js +1 -1
  133. package/dist/components/ds-tab-group.js.map +1 -1
  134. package/dist/components/ds-table.js +1 -1
  135. package/dist/components/ds-table.js.map +1 -1
  136. package/dist/components/ds-toggle.js +1 -1
  137. package/dist/components/ds-toggle.js.map +1 -1
  138. package/dist/components/index.js +1 -1
  139. package/dist/components/index.js.map +1 -1
  140. package/dist/components/p-BBpASejH.js +2 -0
  141. package/dist/components/p-BBpASejH.js.map +1 -0
  142. package/dist/components/{p-D0gBLLJx.js → p-BFiaUYu7.js} +2 -2
  143. package/dist/components/p-BFiaUYu7.js.map +1 -0
  144. package/dist/components/p-CTK82RIw.js +2 -0
  145. package/dist/components/p-CTK82RIw.js.map +1 -0
  146. package/dist/components/{p-BSNlp8Di.js → p-Cp86p-11.js} +2 -2
  147. package/dist/components/{p-BSNlp8Di.js.map → p-Cp86p-11.js.map} +1 -1
  148. package/dist/components/{p-vlwhuqVn.js → p-DHjjwgku.js} +2 -2
  149. package/dist/components/{p-vlwhuqVn.js.map → p-DHjjwgku.js.map} +1 -1
  150. package/dist/components/{p-boPMASaQ.js → p-DOEMwKBb.js} +2 -2
  151. package/dist/components/{p-boPMASaQ.js.map → p-DOEMwKBb.js.map} +1 -1
  152. package/dist/components/{p-Co2kLhWu.js → p-DolYlDbY.js} +2 -2
  153. package/dist/components/p-DolYlDbY.js.map +1 -0
  154. package/dist/framework/angular.d.ts +6 -0
  155. package/dist/framework/angular.js +6 -0
  156. package/dist/lib/utils/format-compact-number.d.ts +1 -1
  157. package/dist/lib/utils/index.js +8 -1
  158. package/dist/lib/utils/index.js.map +2 -2
  159. package/dist/react/components.d.ts +44 -0
  160. package/{src/react/components.ts → dist/react/components.js} +0 -1
  161. package/dist/react/ds-app-shell.d.ts +9 -0
  162. package/dist/react/ds-app-shell.js +12 -0
  163. package/dist/react/ds-badge.d.ts +9 -0
  164. package/dist/react/ds-badge.js +12 -0
  165. package/dist/react/ds-banner.d.ts +12 -0
  166. package/dist/react/ds-banner.js +12 -0
  167. package/dist/react/ds-bar-nav.d.ts +12 -0
  168. package/dist/react/ds-bar-nav.js +12 -0
  169. package/dist/react/ds-button-filled.d.ts +12 -0
  170. package/dist/react/ds-button-filled.js +12 -0
  171. package/dist/react/ds-button-unfilled.d.ts +13 -0
  172. package/dist/react/ds-button-unfilled.js +15 -0
  173. package/dist/react/ds-card-data-viz-donut.d.ts +12 -0
  174. package/dist/react/ds-card-data-viz-donut.js +12 -0
  175. package/dist/react/ds-card-setting.d.ts +12 -0
  176. package/dist/react/ds-card-setting.js +12 -0
  177. package/dist/react/ds-card.d.ts +9 -0
  178. package/dist/react/ds-card.js +12 -0
  179. package/dist/react/ds-chart-bar.d.ts +9 -0
  180. package/dist/react/ds-chart-bar.js +12 -0
  181. package/dist/react/ds-chart-donut.d.ts +12 -0
  182. package/dist/react/ds-chart-donut.js +12 -0
  183. package/dist/react/ds-chart-legend.d.ts +16 -0
  184. package/dist/react/ds-chart-legend.js +15 -0
  185. package/dist/react/ds-chart-line.d.ts +9 -0
  186. package/dist/react/ds-chart-line.js +12 -0
  187. package/dist/react/ds-checkbox.d.ts +12 -0
  188. package/dist/react/ds-checkbox.js +12 -0
  189. package/dist/react/ds-chip.d.ts +12 -0
  190. package/dist/react/ds-chip.js +12 -0
  191. package/dist/react/ds-divider.d.ts +9 -0
  192. package/dist/react/ds-divider.js +12 -0
  193. package/dist/react/ds-empty-state.d.ts +9 -0
  194. package/dist/react/ds-empty-state.js +12 -0
  195. package/dist/react/ds-field.d.ts +9 -0
  196. package/dist/react/ds-field.js +12 -0
  197. package/dist/react/ds-icon.d.ts +9 -0
  198. package/dist/react/ds-icon.js +12 -0
  199. package/dist/react/ds-input.d.ts +13 -0
  200. package/dist/react/ds-input.js +15 -0
  201. package/dist/react/ds-loader.d.ts +9 -0
  202. package/dist/react/ds-loader.js +12 -0
  203. package/dist/react/ds-menu.d.ts +14 -0
  204. package/dist/react/ds-menu.js +16 -0
  205. package/dist/react/ds-modal.d.ts +12 -0
  206. package/dist/react/ds-modal.js +12 -0
  207. package/dist/react/ds-pagination.d.ts +12 -0
  208. package/dist/react/ds-pagination.js +12 -0
  209. package/dist/react/ds-panel-nav.d.ts +17 -0
  210. package/dist/react/ds-panel-nav.js +19 -0
  211. package/dist/react/ds-panel-tools.d.ts +17 -0
  212. package/dist/react/ds-panel-tools.js +16 -0
  213. package/dist/react/ds-radio-group.d.ts +12 -0
  214. package/dist/react/ds-radio-group.js +12 -0
  215. package/dist/react/ds-select.d.ts +12 -0
  216. package/dist/react/ds-select.js +12 -0
  217. package/dist/react/ds-shell-gradient-picker.d.ts +12 -0
  218. package/dist/react/ds-shell-gradient-picker.js +12 -0
  219. package/dist/react/ds-shell-gradient-swatch.d.ts +12 -0
  220. package/dist/react/ds-shell-gradient-swatch.js +12 -0
  221. package/dist/react/ds-skeleton.d.ts +9 -0
  222. package/dist/react/ds-skeleton.js +12 -0
  223. package/dist/react/ds-slider.d.ts +12 -0
  224. package/dist/react/ds-slider.js +12 -0
  225. package/dist/react/ds-tab-group-nav.d.ts +13 -0
  226. package/dist/react/ds-tab-group-nav.js +15 -0
  227. package/dist/react/ds-tab-group.d.ts +12 -0
  228. package/dist/react/ds-tab-group.js +12 -0
  229. package/dist/react/ds-table.d.ts +21 -0
  230. package/dist/react/ds-table.js +16 -0
  231. package/dist/react/ds-tag.d.ts +9 -0
  232. package/dist/react/ds-tag.js +12 -0
  233. package/dist/react/ds-text.d.ts +9 -0
  234. package/dist/react/ds-text.js +12 -0
  235. package/dist/react/ds-toggle.d.ts +12 -0
  236. package/dist/react/ds-toggle.js +12 -0
  237. package/dist/react/ds-tooltip-data-viz.d.ts +9 -0
  238. package/dist/react/ds-tooltip-data-viz.js +12 -0
  239. package/dist/react/ds-tooltip.d.ts +9 -0
  240. package/dist/react/ds-tooltip.js +12 -0
  241. package/dist/types/components/BarNav/BarNav.d.ts +1 -0
  242. package/dist/types/components/ButtonFilled/ButtonFilled.d.ts +1 -1
  243. package/dist/types/components/ButtonUnfilled/ButtonUnfilled.d.ts +1 -1
  244. package/dist/types/components/CardDataVizDonut/CardDataVizDonut.d.ts +1 -0
  245. package/dist/types/components/CardSetting/CardSetting.d.ts +3 -0
  246. package/dist/types/components/ChartDonut/ChartDonut.d.ts +2 -0
  247. package/dist/types/components/ChartLegend/ChartLegend.d.ts +1 -0
  248. package/dist/types/components/Checkbox/Checkbox.d.ts +12 -0
  249. package/dist/types/components/Chip/Chip.d.ts +2 -0
  250. package/dist/types/components/EmptyState/EmptyState.d.ts +2 -0
  251. package/dist/types/components/Input/Input.d.ts +14 -1
  252. package/dist/types/components/Menu/Menu.d.ts +2 -0
  253. package/dist/types/components/Pagination/Pagination.d.ts +3 -0
  254. package/dist/types/components/PanelNav/PanelNav.d.ts +7 -0
  255. package/dist/types/components/PanelTools/PanelTools.d.ts +2 -0
  256. package/dist/types/components/RadioGroup/RadioGroup.d.ts +13 -1
  257. package/dist/types/components/Select/Select.d.ts +13 -1
  258. package/dist/types/components/ShellGradientPicker/ShellGradientPicker.d.ts +1 -0
  259. package/dist/types/components/ShellGradientSwatch/ShellGradientSwatch.d.ts +1 -1
  260. package/dist/types/components/TabGroup/TabGroup.d.ts +1 -1
  261. package/dist/types/components/TabGroupNav/TabGroupNav.d.ts +1 -1
  262. package/dist/types/components/Table/Table.d.ts +6 -0
  263. package/dist/types/components/Toggle/Toggle.d.ts +12 -0
  264. package/dist/types/components.d.ts +525 -30
  265. package/dist/types/stencil-public-runtime.d.ts +1 -0
  266. package/dist/types/utils/format-compact-number.d.ts +1 -1
  267. package/package.json +58 -41
  268. package/dist/components/p-Co2kLhWu.js.map +0 -1
  269. package/dist/components/p-CsaW5gDM.js +0 -2
  270. package/dist/components/p-CsaW5gDM.js.map +0 -1
  271. package/dist/components/p-D0gBLLJx.js.map +0 -1
  272. package/dist/components/p-DEpLlQZK.js +0 -2
  273. package/dist/components/p-DEpLlQZK.js.map +0 -1
  274. package/src/angular/angular-component-lib/utils.ts +0 -65
  275. package/src/angular/index.ts +0 -45
  276. package/src/angular/proxies.ts +0 -1156
  277. package/src/react/ds-app-shell.ts +0 -26
  278. package/src/react/ds-badge.ts +0 -26
  279. package/src/react/ds-banner.ts +0 -27
  280. package/src/react/ds-bar-nav.ts +0 -27
  281. package/src/react/ds-button-filled.ts +0 -27
  282. package/src/react/ds-button-unfilled.ts +0 -33
  283. package/src/react/ds-card-data-viz-donut.ts +0 -27
  284. package/src/react/ds-card-setting.ts +0 -27
  285. package/src/react/ds-card.ts +0 -26
  286. package/src/react/ds-chart-bar.ts +0 -26
  287. package/src/react/ds-chart-donut.ts +0 -27
  288. package/src/react/ds-chart-legend.ts +0 -33
  289. package/src/react/ds-chart-line.ts +0 -26
  290. package/src/react/ds-checkbox.ts +0 -27
  291. package/src/react/ds-chip.ts +0 -27
  292. package/src/react/ds-divider.ts +0 -26
  293. package/src/react/ds-empty-state.ts +0 -26
  294. package/src/react/ds-field.ts +0 -26
  295. package/src/react/ds-icon.ts +0 -26
  296. package/src/react/ds-input.ts +0 -33
  297. package/src/react/ds-loader.ts +0 -26
  298. package/src/react/ds-menu.ts +0 -35
  299. package/src/react/ds-modal.ts +0 -27
  300. package/src/react/ds-pagination.ts +0 -27
  301. package/src/react/ds-panel-nav.ts +0 -41
  302. package/src/react/ds-panel-tools.ts +0 -35
  303. package/src/react/ds-radio-group.ts +0 -27
  304. package/src/react/ds-select.ts +0 -27
  305. package/src/react/ds-shell-gradient-picker.ts +0 -27
  306. package/src/react/ds-shell-gradient-swatch.ts +0 -27
  307. package/src/react/ds-skeleton.ts +0 -26
  308. package/src/react/ds-slider.ts +0 -27
  309. package/src/react/ds-tab-group-nav.ts +0 -33
  310. package/src/react/ds-tab-group.ts +0 -27
  311. package/src/react/ds-table.ts +0 -35
  312. package/src/react/ds-tag.ts +0 -26
  313. package/src/react/ds-text.ts +0 -26
  314. package/src/react/ds-toggle.ts +0 -27
  315. package/src/react/ds-tooltip-data-viz.ts +0 -26
  316. package/src/react/ds-tooltip.ts +0 -26
  317. package/src/wc/components/AppShell/AppShell.tsx +0 -377
  318. package/src/wc/components/Badge/Badge.tsx +0 -179
  319. package/src/wc/components/Badge/index.ts +0 -1
  320. package/src/wc/components/Banner/Banner.tsx +0 -156
  321. package/src/wc/components/BarNav/BarNav.tsx +0 -745
  322. package/src/wc/components/BarNav/bar-nav-dom-utils.ts +0 -23
  323. package/src/wc/components/BarNav/bar-nav-tabs-menu-utils.ts +0 -114
  324. package/src/wc/components/BarNav/bar-nav-types.ts +0 -3
  325. package/src/wc/components/BarNav/bar-nav-utils.ts +0 -67
  326. package/src/wc/components/BarNav/index.ts +0 -2
  327. package/src/wc/components/ButtonFilled/ButtonFilled.tsx +0 -171
  328. package/src/wc/components/ButtonFilled/index.ts +0 -7
  329. package/src/wc/components/ButtonUnfilled/ButtonUnfilled.tsx +0 -229
  330. package/src/wc/components/ButtonUnfilled/index.ts +0 -7
  331. package/src/wc/components/Card/Card.tsx +0 -78
  332. package/src/wc/components/Card/index.ts +0 -1
  333. package/src/wc/components/CardDataVizDonut/CardDataVizDonut.tsx +0 -108
  334. package/src/wc/components/CardDataVizDonut/index.ts +0 -1
  335. package/src/wc/components/CardSetting/CardSetting.tsx +0 -81
  336. package/src/wc/components/CardSetting/index.ts +0 -1
  337. package/src/wc/components/ChartBar/ChartBar.tsx +0 -88
  338. package/src/wc/components/ChartBar/index.ts +0 -1
  339. package/src/wc/components/ChartDonut/ChartDonut.tsx +0 -289
  340. package/src/wc/components/ChartDonut/index.ts +0 -1
  341. package/src/wc/components/ChartLegend/ChartLegend.tsx +0 -125
  342. package/src/wc/components/ChartLegend/index.ts +0 -2
  343. package/src/wc/components/ChartLine/ChartLine.tsx +0 -102
  344. package/src/wc/components/ChartLine/index.ts +0 -1
  345. package/src/wc/components/Checkbox/Checkbox.tsx +0 -60
  346. package/src/wc/components/Checkbox/index.ts +0 -1
  347. package/src/wc/components/Chip/Chip.tsx +0 -104
  348. package/src/wc/components/Chip/index.ts +0 -1
  349. package/src/wc/components/Divider/Divider.tsx +0 -107
  350. package/src/wc/components/Divider/index.ts +0 -2
  351. package/src/wc/components/EmptyState/EmptyState.tsx +0 -30
  352. package/src/wc/components/Field/Field.tsx +0 -30
  353. package/src/wc/components/Icon/Icon.tsx +0 -172
  354. package/src/wc/components/Icon/flag-icon-catalog.ts +0 -36
  355. package/src/wc/components/Icon/icon-cache.ts +0 -47
  356. package/src/wc/components/Icon/icon-svg.ts +0 -73
  357. package/src/wc/components/Icon/index.ts +0 -1
  358. package/src/wc/components/Icon/system-icon-catalog.ts +0 -401
  359. package/src/wc/components/Input/Input.tsx +0 -107
  360. package/src/wc/components/Input/index.ts +0 -1
  361. package/src/wc/components/Loader/Loader.tsx +0 -99
  362. package/src/wc/components/Loader/index.ts +0 -1
  363. package/src/wc/components/Menu/Menu.tsx +0 -437
  364. package/src/wc/components/Menu/menu-placement.ts +0 -26
  365. package/src/wc/components/Menu/menu-position.ts +0 -78
  366. package/src/wc/components/Menu/menu-types.ts +0 -39
  367. package/src/wc/components/Modal/Modal.tsx +0 -213
  368. package/src/wc/components/Pagination/Pagination.tsx +0 -97
  369. package/src/wc/components/PanelNav/PanelNav.tsx +0 -714
  370. package/src/wc/components/PanelNav/index.ts +0 -17
  371. package/src/wc/components/PanelNav/panel-nav-types.ts +0 -36
  372. package/src/wc/components/PanelNav/panel-nav-utils.ts +0 -79
  373. package/src/wc/components/PanelTools/PanelTools.tsx +0 -366
  374. package/src/wc/components/PanelTools/index.ts +0 -7
  375. package/src/wc/components/PanelTools/panel-tools-types.ts +0 -44
  376. package/src/wc/components/PanelTools/panel-tools-utils.ts +0 -50
  377. package/src/wc/components/RadioGroup/RadioGroup.tsx +0 -130
  378. package/src/wc/components/RadioGroup/index.ts +0 -1
  379. package/src/wc/components/Select/Select.tsx +0 -274
  380. package/src/wc/components/Select/index.ts +0 -1
  381. package/src/wc/components/ShellGradientPicker/ShellGradientPicker.tsx +0 -55
  382. package/src/wc/components/ShellGradientSwatch/ShellGradientSwatch.tsx +0 -69
  383. package/src/wc/components/ShellGradientSwatch/shell-gradient-swatch-types.ts +0 -17
  384. package/src/wc/components/Skeleton/Skeleton.tsx +0 -64
  385. package/src/wc/components/Skeleton/index.ts +0 -1
  386. package/src/wc/components/Slider/Slider.tsx +0 -76
  387. package/src/wc/components/Slider/index.ts +0 -1
  388. package/src/wc/components/TabGroup/TabGroup.tsx +0 -204
  389. package/src/wc/components/TabGroup/tab-item-utils.ts +0 -25
  390. package/src/wc/components/TabGroupNav/TabGroupNav.tsx +0 -347
  391. package/src/wc/components/Table/Table.tsx +0 -273
  392. package/src/wc/components/Tag/Tag.tsx +0 -63
  393. package/src/wc/components/Tag/index.ts +0 -1
  394. package/src/wc/components/Text/Text.tsx +0 -99
  395. package/src/wc/components/Text/index.ts +0 -12
  396. package/src/wc/components/Text/text-types.ts +0 -23
  397. package/src/wc/components/Text/text-utils.ts +0 -13
  398. package/src/wc/components/Toggle/Toggle.tsx +0 -43
  399. package/src/wc/components/Toggle/index.ts +0 -1
  400. package/src/wc/components/Tooltip/Tooltip.tsx +0 -413
  401. package/src/wc/components/TooltipDataViz/TooltipDataViz.tsx +0 -145
  402. package/src/wc/components/TooltipDataViz/index.ts +0 -1
  403. package/src/wc/components.d.ts +0 -3569
  404. package/src/wc/nav/badge-gradient-ring.ts +0 -109
  405. package/src/wc/nav/chrome-transition.ts +0 -62
  406. package/src/wc/nav/index.ts +0 -80
  407. package/src/wc/nav/nav-chrome.ts +0 -47
  408. package/src/wc/nav/shell-chrome-metrics.ts +0 -49
  409. package/src/wc/nav/shell-gradient-presets.ts +0 -60
  410. package/src/wc/nav/shell-gradient.ts +0 -94
  411. package/src/wc/nav/shell-shortcuts.ts +0 -63
  412. package/src/wc/nav/shell-view-transition.ts +0 -122
  413. package/src/wc/utils/chart-colors.ts +0 -7
  414. package/src/wc/utils/chart-types.ts +0 -25
  415. package/src/wc/utils/control-density.css +0 -43
  416. package/src/wc/utils/control-inactive.css +0 -20
  417. package/src/wc/utils/control-text.ts +0 -11
  418. package/src/wc/utils/control-width.css +0 -28
  419. package/src/wc/utils/control-width.ts +0 -10
  420. package/src/wc/utils/focus-ring.css +0 -33
  421. package/src/wc/utils/format-compact-number.ts +0 -27
  422. package/src/wc/utils/index.ts +0 -27
  423. package/src/wc/utils/interaction-fill.css +0 -162
  424. package/src/wc/utils/resolve-css-length-px.ts +0 -66
  425. package/src/wc/utils/resolve-css-time-ms.ts +0 -46
  426. package/src/wc/utils/scroll-edge-fade.css +0 -80
  427. package/src/wc/utils/scroll-edge-fade.ts +0 -148
  428. package/src/wc/utils/token-defaults.ts +0 -81
  429. package/src/wc/utils/truncate-svg-text.ts +0 -25
  430. package/src/wc/utils/typography.css +0 -146
@@ -1,714 +0,0 @@
1
- import { Component, Prop, Event, EventEmitter, Watch, State, Element, Method, h, Host } from '@stencil/core';
2
- import type { ChromeTransitionDetail } from '../../nav/chrome-transition';
3
- import type { NavChromeStyle } from '../../nav/nav-chrome';
4
- import {
5
- deriveActiveIdFromUrl,
6
- parsePanelNavGroups,
7
- resolvePanelNavDisableVt,
8
- resolvePanelNavStyle,
9
- shouldResyncPanelNavGroups,
10
- shouldResyncPanelNavStyle,
11
- } from './panel-nav-utils';
12
- import {
13
- PANEL_NAV_USER_MENU_ANCHOR_ID,
14
- PANEL_NAV_USER_MENU_PLACEMENT,
15
- type PanelNavGroup,
16
- type PanelNavItem,
17
- type PanelNavRouterMode,
18
- type PanelNavUserActionDetail,
19
- } from './panel-nav-types';
20
- import { scrollEdgeFadeClassMap } from '../../utils/scroll-edge-fade';
21
-
22
- @Component({
23
- tag: 'ds-panel-nav',
24
- styleUrl: 'PanelNav.css',
25
- styleUrls: ['../../utils/scroll-edge-fade.css'],
26
- scoped: true,
27
- })
28
- export class PanelNav {
29
- /** Style slot: `dashboard` or `settings`. Colors match for now;
30
- * class hooks reserved for texture/glyph layers. Property: `navStyle`. Attribute: `nav-style`. */
31
- @Prop({ attribute: 'nav-style', reflect: true }) navStyle: NavChromeStyle = 'dashboard';
32
-
33
- /** When `true`, style changes apply synchronously — host app owns view transitions. */
34
- @Prop() disableViewTransition: boolean = false;
35
-
36
- /** Nav groups — set via JS property (`el.groups = [...]`) or JSON string attribute. */
37
- @Prop() groups: string | PanelNavGroup[] = '[]';
38
-
39
- /** How items with `href` render:
40
- * - `anchor` (default): native `<a href>` — works with routers that intercept anchors.
41
- * - `event`: always `<button>`; host handles navigation via `dsNavSelect`. */
42
- @Prop() routerMode: PanelNavRouterMode = 'anchor';
43
-
44
- /** ID of the currently active/selected nav item. Overridden by `currentUrl` matching when set. */
45
- @Prop() activeId: string = '';
46
-
47
- /** Whether the nav is in collapsed (icon-only) state.
48
- * Set `storageKey` to persist across reloads. `dsNavToggle` still fires on change. */
49
- @Prop({ mutable: true }) collapsed: boolean = false;
50
-
51
- /** Viewport width (px) below which the nav auto-collapses to icon-only mode. 0 = disabled. */
52
- @Prop() breakpoint: number = 0;
53
-
54
- /** `localStorage` key used to persist the collapsed state across page loads.
55
- * When set, collapsed state is restored on mount and written on each toggle. */
56
- @Prop() storageKey: string = '';
57
-
58
- /** Current route URL (e.g. `window.location.pathname` or the router's active URL).
59
- * When set the component derives the active item by matching item `href` values
60
- * against this string (longest segment-boundary prefix wins), overriding `activeId`. */
61
- @Prop() currentUrl: string = '';
62
-
63
- /** Display name for the footer user section */
64
- @Prop() userName: string = '';
65
-
66
- /** Single character shown in the collapsed avatar */
67
- @Prop() userInitial: string = '';
68
-
69
- /** Emitted when a nav item is clicked. Detail = the item's `id`. */
70
- @Event() dsNavSelect!: EventEmitter<string>;
71
-
72
- /** Emitted when the collapse toggle is clicked. Detail = new collapsed state. */
73
- @Event() dsNavToggle!: EventEmitter<boolean>;
74
-
75
- /** Bubbling lifecycle — `ds-app-shell` pauses chrome metrics during width motion. */
76
- @Event({ bubbles: true, composed: true })
77
- dsChromeTransitionStart!: EventEmitter<ChromeTransitionDetail>;
78
-
79
- @Event({ bubbles: true, composed: true })
80
- dsChromeTransitionEnd!: EventEmitter<ChromeTransitionDetail>;
81
-
82
- /** Emitted when the footer left button (gear / dashboard) is clicked. */
83
- @Event() dsNavFooterAction!: EventEmitter<void>;
84
-
85
- /** Emitted when the footer user button is clicked. Detail includes the anchor for `ds-menu`. */
86
- @Event() dsNavUserAction!: EventEmitter<PanelNavUserActionDetail>;
87
-
88
- @Element() el!: HTMLElement;
89
-
90
- @State() private renderedStyle: NavChromeStyle = 'dashboard';
91
- @State() private parsedGroups: PanelNavGroup[] = [];
92
- @State() private isAnimating = false;
93
- @State() private rovingIndex: number = 0;
94
- @State() private viewportNarrow: boolean = false;
95
- @State() private urlDerivedActiveId: string = '';
96
-
97
- private transitionEndHandler?: (e: TransitionEvent) => void;
98
- private resizeObserver?: ResizeObserver;
99
-
100
- // Drag-to-resize state (not @State — no re-render needed)
101
- private isDragging = false;
102
- private dragStartX = 0;
103
- private didSnap = false;
104
- private lastDeltaX = 0;
105
- private edgeOverlayTimer: number | null = null;
106
- private globalMouseMoveHandler?: (e: MouseEvent) => void;
107
- private globalMouseUpHandler?: () => void;
108
-
109
- @State() private showEdgeOverlay = false;
110
-
111
- private static readonly HOST_PROP_SYNC_BUDGET = 8;
112
-
113
- /** The ID that should be treated as active. `currentUrl` matching takes precedence
114
- * over `activeId` when both are present. */
115
- private get effectiveActiveId(): string {
116
- return this.urlDerivedActiveId || this.activeId;
117
- }
118
-
119
- private get effectiveDisableViewTransition(): boolean {
120
- return resolvePanelNavDisableVt(
121
- this.disableViewTransition,
122
- this.el.getAttribute('disable-view-transition'),
123
- );
124
- }
125
-
126
- @Watch('collapsed')
127
- onCollapsedChange(_next: boolean, prev: boolean | undefined) {
128
- if (prev === undefined) return;
129
- this.startCollapseAnimation();
130
- }
131
-
132
- @Watch('viewportNarrow')
133
- onViewportNarrowChange(_next: boolean, prev: boolean | undefined) {
134
- if (prev === undefined) return;
135
- this.startCollapseAnimation();
136
- }
137
-
138
- @Watch('breakpoint')
139
- onBreakpointChange() {
140
- this.disconnectResizeObserver();
141
- if (this.breakpoint > 0) this.connectResizeObserver();
142
- }
143
-
144
- @Watch('groups')
145
- onGroupsChange(val: string | PanelNavGroup[]) {
146
- this.parsedGroups = parsePanelNavGroups(val);
147
- this.rovingIndex = 0;
148
- this.syncActiveFromUrl();
149
- }
150
-
151
- @Watch('activeId')
152
- @Watch('urlDerivedActiveId')
153
- onActiveIdChange() {
154
- /* Active route updates aria-current only — roving tab stop stays user-controlled. */
155
- }
156
-
157
- @Watch('currentUrl')
158
- onCurrentUrlChange() {
159
- this.syncActiveFromUrl();
160
- }
161
-
162
- @Watch('navStyle')
163
- onNavStyleChange(newVal: NavChromeStyle) {
164
- this.renderedStyle = newVal;
165
- }
166
-
167
- componentWillLoad() {
168
- this.renderedStyle = resolvePanelNavStyle(this.navStyle, this.el.getAttribute('nav-style'));
169
- if (this.storageKey) {
170
- try {
171
- const stored = localStorage.getItem(this.storageKey);
172
- if (stored !== null) this.collapsed = stored === 'true';
173
- } catch { /* localStorage unavailable */ }
174
- }
175
- this.onGroupsChange(this.groups);
176
- this.syncActiveFromUrl();
177
- }
178
-
179
- componentDidLoad() {
180
- this.syncHostPropsIfNeeded();
181
- this.scheduleDeferredHostPropSync();
182
- if (this.breakpoint > 0) this.connectResizeObserver();
183
- }
184
-
185
- disconnectedCallback() {
186
- this.disconnectResizeObserver();
187
- this.clearEdgeOverlayTimer();
188
- if (this.globalMouseMoveHandler) {
189
- window.removeEventListener('mousemove', this.globalMouseMoveHandler);
190
- }
191
- if (this.globalMouseUpHandler) {
192
- window.removeEventListener('mouseup', this.globalMouseUpHandler);
193
- }
194
- }
195
-
196
- private startCollapseAnimation() {
197
- this.isAnimating = true;
198
- this.dsChromeTransitionStart.emit({ source: 'panel-nav' });
199
- const panel = this.el.querySelector('.panel-nav') as HTMLElement | null;
200
- const widthBefore = panel?.getBoundingClientRect().width ?? 0;
201
- if (this.transitionEndHandler) {
202
- panel?.removeEventListener('transitionend', this.transitionEndHandler);
203
- }
204
- this.transitionEndHandler = (e: TransitionEvent) => {
205
- if (e.propertyName === 'width') {
206
- this.finishCollapseAnimation(panel);
207
- }
208
- };
209
- panel?.addEventListener('transitionend', this.transitionEndHandler);
210
- requestAnimationFrame(() => {
211
- requestAnimationFrame(() => {
212
- if (!this.isAnimating) return;
213
- const widthAfter = panel?.getBoundingClientRect().width ?? 0;
214
- if (Math.abs(widthAfter - widthBefore) < 1) {
215
- this.finishCollapseAnimation(panel);
216
- }
217
- });
218
- });
219
- }
220
-
221
- private finishCollapseAnimation(panel: HTMLElement | null) {
222
- if (!this.isAnimating) return;
223
- this.isAnimating = false;
224
- this.dsChromeTransitionEnd.emit({ source: 'panel-nav' });
225
- if (this.transitionEndHandler) {
226
- panel?.removeEventListener('transitionend', this.transitionEndHandler);
227
- }
228
- }
229
-
230
- private connectResizeObserver() {
231
- this.viewportNarrow = window.innerWidth < this.breakpoint;
232
- this.resizeObserver = new ResizeObserver(() => {
233
- this.viewportNarrow = window.innerWidth < this.breakpoint;
234
- });
235
- this.resizeObserver.observe(document.documentElement);
236
- }
237
-
238
- private disconnectResizeObserver() {
239
- this.resizeObserver?.disconnect();
240
- this.resizeObserver = undefined;
241
- }
242
-
243
- /** Derive active ID from the current URL by matching item `href` values.
244
- * Uses longest segment-boundary prefix match. */
245
- private syncActiveFromUrl() {
246
- if (!this.currentUrl) {
247
- this.urlDerivedActiveId = '';
248
- return;
249
- }
250
- this.urlDerivedActiveId = deriveActiveIdFromUrl(this.currentUrl, this.getAllItems());
251
- }
252
-
253
- /** Re-parse props assigned by the host after componentWillLoad (Angular ngAfterViewInit). */
254
- private syncHostPropsIfNeeded() {
255
- if (shouldResyncPanelNavStyle(this.renderedStyle, this.navStyle)) {
256
- this.renderedStyle = this.navStyle;
257
- }
258
-
259
- if (shouldResyncPanelNavGroups(this.parsedGroups, this.groups)) {
260
- this.onGroupsChange(this.groups);
261
- } else if (this.currentUrl) {
262
- this.syncActiveFromUrl();
263
- }
264
- }
265
-
266
- /** Poll across animation frames — host props may land without triggering @Watch. */
267
- private scheduleDeferredHostPropSync() {
268
- let remaining = PanelNav.HOST_PROP_SYNC_BUDGET;
269
- const tick = () => {
270
- this.syncHostPropsIfNeeded();
271
- if (--remaining > 0) {
272
- requestAnimationFrame(tick);
273
- }
274
- };
275
- queueMicrotask(tick);
276
- }
277
-
278
- /** Centralised toggle: updates `collapsed`, emits `dsNavToggle`, optionally persists. */
279
- private applyToggle(next: boolean) {
280
- this.collapsed = next;
281
- if (this.storageKey) {
282
- try { localStorage.setItem(this.storageKey, String(next)); } catch { /* unavailable */ }
283
- }
284
- this.dsNavToggle.emit(next);
285
- }
286
-
287
- private getAllItems(): PanelNavItem[] {
288
- return this.parsedGroups.flatMap(g => g.items);
289
- }
290
-
291
- private getFooterRovingIndex(): number {
292
- return 1 + this.getAllItems().length;
293
- }
294
-
295
- private getUserRovingIndex(): number {
296
- return this.getFooterRovingIndex() + 1;
297
- }
298
-
299
- private getRovingElement(index: number): HTMLElement | null {
300
- const itemCount = this.getAllItems().length;
301
- if (index === 0) {
302
- return this.el.querySelector('.panel-nav__header-btn');
303
- }
304
- if (index >= 1 && index <= itemCount) {
305
- const items = this.el.querySelectorAll<HTMLElement>('.panel-nav__body .panel-nav__item');
306
- return items[index - 1] ?? null;
307
- }
308
- if (index === this.getFooterRovingIndex()) {
309
- return this.el.querySelector('.panel-nav__footer-btn .button-icon');
310
- }
311
- if (index === this.getUserRovingIndex()) {
312
- return this.el.querySelector('.panel-nav__footer-user');
313
- }
314
- return null;
315
- }
316
-
317
- private focusRovingAt(index: number) {
318
- this.rovingIndex = index;
319
- this.getRovingElement(index)?.focus({ preventScroll: true });
320
- }
321
-
322
- private activateRovingIndex(index: number) {
323
- const itemCount = this.getAllItems().length;
324
- const items = this.getAllItems();
325
- if (index === 0) {
326
- this.handleToggle();
327
- return;
328
- }
329
- if (index >= 1 && index <= itemCount) {
330
- this.handleItemClick(items[index - 1].id);
331
- return;
332
- }
333
- if (index === this.getFooterRovingIndex()) {
334
- this.handleFooterAction();
335
- return;
336
- }
337
- if (index === this.getUserRovingIndex()) {
338
- const anchor = this.el.querySelector(`#${PANEL_NAV_USER_MENU_ANCHOR_ID}`) as HTMLElement | null;
339
- if (anchor) this.dsNavUserAction.emit({ anchor, menuPlacement: PANEL_NAV_USER_MENU_PLACEMENT });
340
- }
341
- }
342
-
343
- private handleRovingKeyDown(e: KeyboardEvent, index: number) {
344
- if (e.key === 'Enter' || e.key === ' ') {
345
- e.preventDefault();
346
- this.activateRovingIndex(index);
347
- return;
348
- }
349
-
350
- const footerIdx = this.getFooterRovingIndex();
351
- const userIdx = this.getUserRovingIndex();
352
- let next: number | undefined;
353
-
354
- switch (e.key) {
355
- case 'ArrowDown':
356
- if (index === userIdx) return;
357
- if (index === footerIdx) next = userIdx;
358
- else next = index + 1;
359
- break;
360
- case 'ArrowUp':
361
- if (index === 0) return;
362
- if (index === userIdx) next = footerIdx;
363
- else if (index === footerIdx) next = footerIdx - 1;
364
- else next = index - 1;
365
- break;
366
- case 'ArrowRight':
367
- if (index === footerIdx) next = userIdx;
368
- else return;
369
- break;
370
- case 'ArrowLeft':
371
- if (index === userIdx) next = footerIdx;
372
- else return;
373
- break;
374
- case 'Home':
375
- e.preventDefault();
376
- next = 0;
377
- break;
378
- case 'End':
379
- e.preventDefault();
380
- next = userIdx;
381
- break;
382
- default:
383
- return;
384
- }
385
-
386
- if (next === undefined || next === index) return;
387
- e.preventDefault();
388
- this.focusRovingAt(next);
389
- }
390
-
391
- private handleItemClick(id: string) {
392
- this.dsNavSelect.emit(id);
393
- }
394
-
395
- private handleToggle() {
396
- this.applyToggle(!this.collapsed);
397
- }
398
-
399
- /** Toggle expanded/collapsed panel nav — used by shell keyboard shortcuts. */
400
- @Method()
401
- async toggleCollapsed() {
402
- this.handleToggle();
403
- }
404
-
405
- private handleFooterAction() {
406
- this.dsNavFooterAction.emit();
407
- }
408
-
409
- private handleUserAction(e: MouseEvent) {
410
- const anchor = e.currentTarget as HTMLElement;
411
- this.dsNavUserAction.emit({ anchor, menuPlacement: PANEL_NAV_USER_MENU_PLACEMENT });
412
- }
413
-
414
- private clearEdgeOverlayTimer() {
415
- if (this.edgeOverlayTimer !== null) {
416
- window.clearTimeout(this.edgeOverlayTimer);
417
- this.edgeOverlayTimer = null;
418
- }
419
- }
420
-
421
- private handleResizeHandleMouseEnter() {
422
- this.clearEdgeOverlayTimer();
423
- this.edgeOverlayTimer = window.setTimeout(() => {
424
- this.showEdgeOverlay = true;
425
- this.edgeOverlayTimer = null;
426
- }, 500);
427
- }
428
-
429
- private handleResizeHandleMouseLeave() {
430
- if (this.isDragging) return;
431
- this.clearEdgeOverlayTimer();
432
- this.showEdgeOverlay = false;
433
- }
434
-
435
- private handleResizeHandleMouseDown(e: MouseEvent) {
436
- e.preventDefault();
437
- e.stopPropagation();
438
-
439
- const wasCollapsed = this.collapsed || this.viewportNarrow;
440
- this.isDragging = true;
441
- this.dragStartX = e.clientX;
442
- this.didSnap = false;
443
- this.lastDeltaX = 0;
444
- this.clearEdgeOverlayTimer();
445
- this.showEdgeOverlay = false;
446
-
447
- document.body.style.cursor = 'ew-resize';
448
- document.body.style.userSelect = 'none';
449
-
450
- const onMove = (ev: MouseEvent) => {
451
- const deltaX = ev.clientX - this.dragStartX;
452
- this.lastDeltaX = Math.abs(deltaX);
453
- if (this.didSnap) return;
454
- if (!wasCollapsed && deltaX < -8) {
455
- this.applyToggle(true);
456
- this.didSnap = true;
457
- } else if (wasCollapsed && deltaX > 8) {
458
- this.applyToggle(false);
459
- this.didSnap = true;
460
- }
461
- };
462
-
463
- const onUp = () => {
464
- if (!this.didSnap && this.lastDeltaX < 3) {
465
- this.applyToggle(!wasCollapsed);
466
- }
467
- this.isDragging = false;
468
- this.showEdgeOverlay = false;
469
- document.body.style.cursor = '';
470
- document.body.style.userSelect = '';
471
- window.removeEventListener('mousemove', onMove);
472
- window.removeEventListener('mouseup', onUp);
473
- this.globalMouseMoveHandler = undefined;
474
- this.globalMouseUpHandler = undefined;
475
- };
476
-
477
- this.globalMouseMoveHandler = onMove;
478
- this.globalMouseUpHandler = onUp;
479
- window.addEventListener('mousemove', onMove);
480
- window.addEventListener('mouseup', onUp);
481
- }
482
-
483
- private renderFooterAction(isDashboardChrome: boolean) {
484
- // Short chrome labels — same string for tip + aria (not "Open/Go to …").
485
- const footerLabel = isDashboardChrome ? 'Settings' : 'Dashboard';
486
- return (
487
- <ds-tooltip label={footerLabel} side="right" size="sm">
488
- <ds-button-unfilled variant="icon"
489
- class="panel-nav__footer-btn"
490
- icon={isDashboardChrome ? 'Gear' : 'Dashboard'}
491
- activeFill={false}
492
- hasBorder={false}
493
- focusTabIndex={this.rovingIndex === this.getFooterRovingIndex() ? 0 : -1}
494
- aria-label={footerLabel}
495
- onDsClick={() => this.handleFooterAction()}
496
- onKeyDown={(e: KeyboardEvent) => this.handleRovingKeyDown(e, this.getFooterRovingIndex())}
497
- onFocusin={() => { this.rovingIndex = this.getFooterRovingIndex(); }}
498
- />
499
- </ds-tooltip>
500
- );
501
- }
502
-
503
- private renderFooterUser(collapsed: boolean, userName: string, userInitial: string) {
504
- // Always wrap so collapse morph CSS can transition on a stable button node.
505
- // Tip only when collapsed (empty label → ds-tooltip skips show).
506
- const tipLabel = collapsed ? 'Account' : '';
507
- const userButton = (
508
- <button
509
- type="button"
510
- id={PANEL_NAV_USER_MENU_ANCHOR_ID}
511
- class="panel-nav__item panel-nav__footer-user ds-focus-ring-inset ds-interaction-fill"
512
- tabIndex={this.rovingIndex === this.getUserRovingIndex() ? 0 : -1}
513
- aria-label="Account"
514
- onClick={(e) => this.handleUserAction(e)}
515
- onKeyDown={(e: KeyboardEvent) => this.handleRovingKeyDown(e, this.getUserRovingIndex())}
516
- onFocus={() => { this.rovingIndex = this.getUserRovingIndex(); }}
517
- >
518
- <ds-text
519
- class="panel-nav__item-label panel-nav__footer-user-label panel-nav__item-label-text"
520
- as="span"
521
- variant="text-body-medium"
522
- emphasis
523
- color="inherit"
524
- >
525
- {userName}
526
- </ds-text>
527
- <span class="panel-nav__item-icon panel-nav__footer-user-icon" aria-hidden="true">
528
- <span class="panel-nav__footer-icon-expanded">
529
- <ds-icon name="ChevronUpDown" size="md" color="inherit" />
530
- </span>
531
- <span class="panel-nav__footer-icon-collapsed">
532
- <ds-icon name="Circle" size="md" color="inherit" />
533
- <ds-text
534
- class="panel-nav__user-initial"
535
- as="span"
536
- variant="text-caption"
537
- emphasis
538
- align="center"
539
- color="inherit"
540
- >
541
- {userInitial}
542
- </ds-text>
543
- </span>
544
- </span>
545
- </button>
546
- );
547
-
548
- return (
549
- <ds-tooltip label={tipLabel} side="right" size="sm">
550
- {userButton}
551
- </ds-tooltip>
552
- );
553
- }
554
-
555
- private renderNavItem(item: PanelNavItem, idx: number, collapsed: boolean) {
556
- const isActive = item.id === this.effectiveActiveId;
557
- const rovingPosition = idx + 1;
558
-
559
- const itemContent = [
560
- <span class="panel-nav__item-icon">
561
- <ds-icon name={item.icon} size="md" color="inherit" flag={item.flag} />
562
- </span>,
563
- <ds-text
564
- class="panel-nav__item-label panel-nav__item-label-text"
565
- as="span"
566
- variant="text-body-medium"
567
- emphasis={isActive}
568
- color="inherit"
569
- >
570
- {item.label}
571
- </ds-text>,
572
- item.dot && (
573
- <ds-badge
574
- class="panel-nav__item-dot"
575
- variant="dot"
576
- background="var(--_nav-bg)"
577
- label=""
578
- aria-hidden="true"
579
- />
580
- ),
581
- ];
582
-
583
- const sharedProps = {
584
- class: {
585
- 'panel-nav__item': true,
586
- 'panel-nav__item--active': isActive,
587
- 'ds-focus-ring-inset': true,
588
- 'ds-interaction-fill': true,
589
- },
590
- 'aria-current': isActive ? ('page' as const) : undefined,
591
- tabIndex: rovingPosition === this.rovingIndex ? 0 : -1,
592
- onClick: () => this.handleItemClick(item.id),
593
- onKeyDown: (e: KeyboardEvent) => this.handleRovingKeyDown(e, rovingPosition),
594
- onFocus: () => { this.rovingIndex = rovingPosition; },
595
- };
596
-
597
- const useAnchor = this.routerMode === 'anchor' && item.href;
598
- const control = useAnchor
599
- ? <a {...sharedProps} href={item.href}>{itemContent}</a>
600
- : <button {...sharedProps} type="button">{itemContent}</button>;
601
-
602
- // Always wrap so label fade CSS can transition on a stable item node.
603
- // Tip only when collapsed (empty label → ds-tooltip skips show).
604
- return (
605
- <ds-tooltip label={collapsed ? item.label : ''} side="right" size="sm">
606
- {control}
607
- </ds-tooltip>
608
- );
609
- }
610
-
611
- render() {
612
- const chromeStyle = this.renderedStyle;
613
- const isDashboardChrome = chromeStyle === 'dashboard';
614
- const isDashboard = this.navStyle === 'dashboard';
615
- const collapsed = this.collapsed || this.viewportNarrow;
616
- const { userName, userInitial } = this;
617
-
618
- const navCls: Record<string, boolean> = {
619
- 'panel-nav': true,
620
- 'panel-nav--dashboard': isDashboard,
621
- 'panel-nav--settings': !isDashboard,
622
- 'panel-nav--collapsed': collapsed,
623
- 'panel-nav--animating': this.isAnimating,
624
- };
625
-
626
- return (
627
- <Host style={{ display: 'block', position: 'relative' }}>
628
- <nav
629
- class={navCls}
630
- aria-label={isDashboardChrome ? 'Dashboard navigation' : 'Settings navigation'}
631
- >
632
-
633
- {/* ── Header: Motive logo, reveals collapse toggle on hover ── */}
634
- <div class="panel-nav__header">
635
- <button
636
- type="button"
637
- class="panel-nav__header-btn ds-focus-ring-inset ds-interaction-fill"
638
- tabIndex={this.rovingIndex === 0 ? 0 : -1}
639
- onClick={() => this.handleToggle()}
640
- onKeyDown={(e: KeyboardEvent) => this.handleRovingKeyDown(e, 0)}
641
- onFocus={() => { this.rovingIndex = 0; }}
642
- aria-label={collapsed ? 'Expand navigation' : 'Collapse navigation'}
643
- aria-expanded={collapsed ? 'false' : 'true'}
644
- >
645
- {/* Motive M mark — fades out on hover to reveal collapse toggle */}
646
- <span class="panel-nav__header-logo" aria-hidden="true">
647
- <svg class="panel-nav__m-mark" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg" focusable="false" aria-hidden="true">
648
- <path d="M11.1159 4.31537H7.67021L2.53401 13.0703H0V15.6875H4.02716L8.24319 8.49978V15.6846H11.6342L15.8289 8.47829V15.6846H18.7122V4.3125H15.2559L11.1159 11.3648V4.31537Z" fill="currentColor"/>
649
- </svg>
650
- </span>
651
- {/* Collapse / expand icon — revealed on hover via CSS */}
652
- <span class="panel-nav__header-toggle" aria-hidden="true">
653
- <ds-icon
654
- name={collapsed ? 'LeftExpandB' : 'LeftCollapseB'}
655
- size="md"
656
- color="inherit"
657
- />
658
- </span>
659
- </button>
660
- </div>
661
-
662
- {/* ── Scrollable body ── */}
663
- <div
664
- class={{
665
- 'panel-nav__body': true,
666
- ...scrollEdgeFadeClassMap({ edges: 'bottom' }),
667
- }}
668
- >
669
- {(() => {
670
- let flatIdx = 0;
671
- return this.parsedGroups.map(group => (
672
- <div class="panel-nav__group">
673
- {group.label && (
674
- <ds-text
675
- class="panel-nav__group-label"
676
- as="span"
677
- variant="text-caption"
678
- emphasis
679
- color="inherit"
680
- >
681
- {group.label}
682
- </ds-text>
683
- )}
684
- {group.items.map(item => this.renderNavItem(item, flatIdx++, collapsed))}
685
- </div>
686
- ));
687
- })()}
688
- </div>
689
-
690
- {/* ── Footer ── */}
691
- <div class="panel-nav__footer">
692
- {this.renderFooterAction(isDashboardChrome)}
693
- {this.renderFooterUser(collapsed, userName, userInitial)}
694
- </div>
695
-
696
- </nav>
697
-
698
- {/* Drag-to-resize handle — always rendered, hidden only when auto-collapsed by breakpoint */}
699
- {!this.viewportNarrow && (
700
- <div
701
- class={{
702
- 'panel-nav__resize-handle': true,
703
- 'panel-nav__resize-handle--overlay': this.showEdgeOverlay,
704
- }}
705
- onMouseEnter={() => this.handleResizeHandleMouseEnter()}
706
- onMouseLeave={() => this.handleResizeHandleMouseLeave()}
707
- onMouseDown={(e: MouseEvent) => this.handleResizeHandleMouseDown(e)}
708
- aria-hidden="true"
709
- />
710
- )}
711
- </Host>
712
- );
713
- }
714
- }