@synergy-design-system/mcp 0.1.0 → 1.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 (450) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README.md +539 -3
  3. package/dist/bin/create-checksum.d.ts +2 -0
  4. package/dist/bin/create-checksum.js +23 -0
  5. package/dist/bin/start.d.ts +2 -0
  6. package/dist/bin/start.js +8 -0
  7. package/dist/build/assets.d.ts +4 -0
  8. package/dist/build/assets.js +57 -0
  9. package/dist/build/build.d.ts +1 -0
  10. package/dist/build/build.js +33 -0
  11. package/dist/build/components.d.ts +4 -0
  12. package/dist/build/components.js +132 -0
  13. package/dist/build/frameworks.d.ts +4 -0
  14. package/dist/build/frameworks.js +61 -0
  15. package/dist/build/static.d.ts +4 -0
  16. package/dist/build/static.js +57 -0
  17. package/dist/build/styles.d.ts +4 -0
  18. package/dist/build/styles.js +58 -0
  19. package/dist/build/tokens.d.ts +4 -0
  20. package/dist/build/tokens.js +59 -0
  21. package/dist/server.d.ts +6 -0
  22. package/dist/server.js +20 -0
  23. package/dist/tools/asset-info.d.ts +8 -0
  24. package/dist/tools/asset-info.js +140 -0
  25. package/dist/tools/asset-list.d.ts +6 -0
  26. package/dist/tools/asset-list.js +40 -0
  27. package/dist/tools/component-info.d.ts +6 -0
  28. package/dist/tools/component-info.js +35 -0
  29. package/dist/tools/component-list.d.ts +7 -0
  30. package/dist/tools/component-list.js +42 -0
  31. package/dist/tools/davinci-migration.d.ts +3 -0
  32. package/dist/tools/davinci-migration.js +66 -0
  33. package/dist/tools/framework-info.d.ts +7 -0
  34. package/dist/tools/framework-info.js +59 -0
  35. package/dist/tools/index.d.ts +13 -0
  36. package/dist/tools/index.js +13 -0
  37. package/dist/tools/migration-info.d.ts +6 -0
  38. package/dist/tools/migration-info.js +27 -0
  39. package/dist/tools/styles-info.d.ts +7 -0
  40. package/dist/tools/styles-info.js +28 -0
  41. package/dist/tools/styles-list.d.ts +7 -0
  42. package/dist/tools/styles-list.js +42 -0
  43. package/dist/tools/template-info.d.ts +6 -0
  44. package/dist/tools/template-info.js +34 -0
  45. package/dist/tools/template-list.d.ts +7 -0
  46. package/dist/tools/template-list.js +42 -0
  47. package/dist/tools/tokens.d.ts +7 -0
  48. package/dist/tools/tokens.js +24 -0
  49. package/dist/tools/version.d.ts +7 -0
  50. package/dist/tools/version.js +51 -0
  51. package/dist/utilities/assets.d.ts +2 -0
  52. package/dist/utilities/assets.js +3 -0
  53. package/dist/utilities/checksum.d.ts +36 -0
  54. package/dist/utilities/checksum.js +93 -0
  55. package/dist/utilities/components.d.ts +25 -0
  56. package/dist/utilities/components.js +86 -0
  57. package/dist/utilities/config.d.ts +76 -0
  58. package/dist/utilities/config.js +77 -0
  59. package/dist/utilities/file.d.ts +12 -0
  60. package/dist/utilities/file.js +31 -0
  61. package/dist/utilities/index.d.ts +12 -0
  62. package/dist/utilities/index.js +12 -0
  63. package/dist/utilities/metadata.d.ts +28 -0
  64. package/dist/utilities/metadata.js +57 -0
  65. package/dist/utilities/migration.d.ts +1 -0
  66. package/dist/utilities/migration.js +10 -0
  67. package/dist/utilities/stdio.d.ts +14 -0
  68. package/dist/utilities/stdio.js +60 -0
  69. package/dist/utilities/storybook/build-docs.d.ts +2 -0
  70. package/dist/utilities/storybook/build-docs.js +42 -0
  71. package/dist/utilities/storybook/configs.d.ts +13 -0
  72. package/dist/utilities/storybook/configs.js +85 -0
  73. package/dist/utilities/storybook/docs-scraper.d.ts +26 -0
  74. package/dist/utilities/storybook/docs-scraper.js +97 -0
  75. package/dist/utilities/storybook/index.d.ts +5 -0
  76. package/dist/utilities/storybook/index.js +4 -0
  77. package/dist/utilities/storybook/scraper.d.ts +14 -0
  78. package/dist/utilities/storybook/scraper.js +196 -0
  79. package/dist/utilities/storybook/storybook-manager.d.ts +29 -0
  80. package/dist/utilities/storybook/storybook-manager.js +139 -0
  81. package/dist/utilities/storybook/types.d.ts +22 -0
  82. package/dist/utilities/storybook/types.js +1 -0
  83. package/dist/utilities/styles.d.ts +6 -0
  84. package/dist/utilities/styles.js +24 -0
  85. package/dist/utilities/templates.d.ts +12 -0
  86. package/dist/utilities/templates.js +28 -0
  87. package/dist/utilities/tokens.d.ts +1 -0
  88. package/dist/utilities/tokens.js +21 -0
  89. package/dist/utilities/version.d.ts +10 -0
  90. package/dist/utilities/version.js +21 -0
  91. package/metadata/checksum.txt +1 -0
  92. package/metadata/davinci-migration/migration-guide.md +1859 -0
  93. package/metadata/packages/angular/LIMITATIONS.md +32 -0
  94. package/metadata/packages/angular/README.md +393 -0
  95. package/metadata/packages/assets/CHANGELOG.md +196 -0
  96. package/metadata/packages/assets/README.md +79 -0
  97. package/metadata/packages/components/components/syn-accordion/component.angular.ts +80 -0
  98. package/metadata/packages/components/components/syn-accordion/component.react.ts +30 -0
  99. package/metadata/packages/components/components/syn-accordion/component.styles.ts +15 -0
  100. package/metadata/packages/components/components/syn-accordion/component.ts +111 -0
  101. package/metadata/packages/components/components/syn-accordion/component.vue +64 -0
  102. package/metadata/packages/components/components/syn-alert/component.angular.ts +158 -0
  103. package/metadata/packages/components/components/syn-alert/component.custom.styles.ts +90 -0
  104. package/metadata/packages/components/components/syn-alert/component.react.ts +60 -0
  105. package/metadata/packages/components/components/syn-alert/component.styles.ts +110 -0
  106. package/metadata/packages/components/components/syn-alert/component.ts +324 -0
  107. package/metadata/packages/components/components/syn-alert/component.vue +130 -0
  108. package/metadata/packages/components/components/syn-badge/component.angular.ts +53 -0
  109. package/metadata/packages/components/components/syn-badge/component.custom.styles.ts +61 -0
  110. package/metadata/packages/components/components/syn-badge/component.react.ts +29 -0
  111. package/metadata/packages/components/components/syn-badge/component.styles.ts +59 -0
  112. package/metadata/packages/components/components/syn-badge/component.ts +65 -0
  113. package/metadata/packages/components/components/syn-badge/component.vue +53 -0
  114. package/metadata/packages/components/components/syn-breadcrumb/component.angular.ts +58 -0
  115. package/metadata/packages/components/components/syn-breadcrumb/component.custom.styles.ts +5 -0
  116. package/metadata/packages/components/components/syn-breadcrumb/component.react.ts +32 -0
  117. package/metadata/packages/components/components/syn-breadcrumb/component.styles.ts +18 -0
  118. package/metadata/packages/components/components/syn-breadcrumb/component.ts +110 -0
  119. package/metadata/packages/components/components/syn-breadcrumb/component.vue +58 -0
  120. package/metadata/packages/components/components/syn-breadcrumb-item/component.angular.ts +88 -0
  121. package/metadata/packages/components/components/syn-breadcrumb-item/component.custom.styles.ts +74 -0
  122. package/metadata/packages/components/components/syn-breadcrumb-item/component.react.ts +37 -0
  123. package/metadata/packages/components/components/syn-breadcrumb-item/component.styles.ts +95 -0
  124. package/metadata/packages/components/components/syn-breadcrumb-item/component.ts +139 -0
  125. package/metadata/packages/components/components/syn-breadcrumb-item/component.vue +76 -0
  126. package/metadata/packages/components/components/syn-button/component.angular.ts +318 -0
  127. package/metadata/packages/components/components/syn-button/component.custom.styles.ts +206 -0
  128. package/metadata/packages/components/components/syn-button/component.react.ts +56 -0
  129. package/metadata/packages/components/components/syn-button/component.styles.ts +368 -0
  130. package/metadata/packages/components/components/syn-button/component.ts +322 -0
  131. package/metadata/packages/components/components/syn-button/component.vue +204 -0
  132. package/metadata/packages/components/components/syn-button-group/component.angular.ts +55 -0
  133. package/metadata/packages/components/components/syn-button-group/component.react.ts +29 -0
  134. package/metadata/packages/components/components/syn-button-group/component.styles.ts +21 -0
  135. package/metadata/packages/components/components/syn-button-group/component.ts +103 -0
  136. package/metadata/packages/components/components/syn-button-group/component.vue +55 -0
  137. package/metadata/packages/components/components/syn-card/component.angular.ts +69 -0
  138. package/metadata/packages/components/components/syn-card/component.custom.styles.ts +55 -0
  139. package/metadata/packages/components/components/syn-card/component.react.ts +41 -0
  140. package/metadata/packages/components/components/syn-card/component.styles.ts +77 -0
  141. package/metadata/packages/components/components/syn-card/component.ts +68 -0
  142. package/metadata/packages/components/components/syn-card/component.vue +67 -0
  143. package/metadata/packages/components/components/syn-checkbox/component.angular.ts +260 -0
  144. package/metadata/packages/components/components/syn-checkbox/component.custom.styles.ts +53 -0
  145. package/metadata/packages/components/components/syn-checkbox/component.react.ts +64 -0
  146. package/metadata/packages/components/components/syn-checkbox/component.styles.ts +130 -0
  147. package/metadata/packages/components/components/syn-checkbox/component.ts +291 -0
  148. package/metadata/packages/components/components/syn-checkbox/component.vue +186 -0
  149. package/metadata/packages/components/components/syn-combobox/component.angular.ts +436 -0
  150. package/metadata/packages/components/components/syn-combobox/component.custom.styles.ts +35 -0
  151. package/metadata/packages/components/components/syn-combobox/component.react.ts +109 -0
  152. package/metadata/packages/components/components/syn-combobox/component.styles.ts +406 -0
  153. package/metadata/packages/components/components/syn-combobox/component.ts +1139 -0
  154. package/metadata/packages/components/components/syn-combobox/component.vue +304 -0
  155. package/metadata/packages/components/components/syn-details/component.angular.ts +184 -0
  156. package/metadata/packages/components/components/syn-details/component.custom.styles.ts +140 -0
  157. package/metadata/packages/components/components/syn-details/component.react.ts +63 -0
  158. package/metadata/packages/components/components/syn-details/component.styles.ts +90 -0
  159. package/metadata/packages/components/components/syn-details/component.ts +266 -0
  160. package/metadata/packages/components/components/syn-details/component.vue +134 -0
  161. package/metadata/packages/components/components/syn-dialog/component.angular.ts +201 -0
  162. package/metadata/packages/components/components/syn-dialog/component.custom.styles.ts +54 -0
  163. package/metadata/packages/components/components/syn-dialog/component.react.ts +91 -0
  164. package/metadata/packages/components/components/syn-dialog/component.styles.ts +129 -0
  165. package/metadata/packages/components/components/syn-dialog/component.ts +366 -0
  166. package/metadata/packages/components/components/syn-dialog/component.vue +169 -0
  167. package/metadata/packages/components/components/syn-divider/component.angular.ts +55 -0
  168. package/metadata/packages/components/components/syn-divider/component.custom.styles.ts +8 -0
  169. package/metadata/packages/components/components/syn-divider/component.react.ts +29 -0
  170. package/metadata/packages/components/components/syn-divider/component.styles.ts +31 -0
  171. package/metadata/packages/components/components/syn-divider/component.ts +42 -0
  172. package/metadata/packages/components/components/syn-divider/component.vue +51 -0
  173. package/metadata/packages/components/components/syn-drawer/component.angular.ts +234 -0
  174. package/metadata/packages/components/components/syn-drawer/component.custom.styles.ts +78 -0
  175. package/metadata/packages/components/components/syn-drawer/component.react.ts +98 -0
  176. package/metadata/packages/components/components/syn-drawer/component.styles.ts +165 -0
  177. package/metadata/packages/components/components/syn-drawer/component.ts +496 -0
  178. package/metadata/packages/components/components/syn-drawer/component.vue +188 -0
  179. package/metadata/packages/components/components/syn-dropdown/component.angular.ts +223 -0
  180. package/metadata/packages/components/components/syn-dropdown/component.custom.styles.ts +5 -0
  181. package/metadata/packages/components/components/syn-dropdown/component.react.ts +59 -0
  182. package/metadata/packages/components/components/syn-dropdown/component.styles.ts +60 -0
  183. package/metadata/packages/components/components/syn-dropdown/component.ts +484 -0
  184. package/metadata/packages/components/components/syn-dropdown/component.vue +159 -0
  185. package/metadata/packages/components/components/syn-file/component.angular.ts +359 -0
  186. package/metadata/packages/components/components/syn-file/component.react.ts +85 -0
  187. package/metadata/packages/components/components/syn-file/component.styles.ts +179 -0
  188. package/metadata/packages/components/components/syn-file/component.ts +631 -0
  189. package/metadata/packages/components/components/syn-file/component.vue +251 -0
  190. package/metadata/packages/components/components/syn-header/component.angular.ts +132 -0
  191. package/metadata/packages/components/components/syn-header/component.react.ts +65 -0
  192. package/metadata/packages/components/components/syn-header/component.styles.ts +128 -0
  193. package/metadata/packages/components/components/syn-header/component.ts +260 -0
  194. package/metadata/packages/components/components/syn-header/component.vue +117 -0
  195. package/metadata/packages/components/components/syn-icon/component.angular.ts +115 -0
  196. package/metadata/packages/components/components/syn-icon/component.custom.styles.ts +5 -0
  197. package/metadata/packages/components/components/syn-icon/component.react.ts +41 -0
  198. package/metadata/packages/components/components/syn-icon/component.styles.ts +25 -0
  199. package/metadata/packages/components/components/syn-icon/component.ts +234 -0
  200. package/metadata/packages/components/components/syn-icon/component.vue +100 -0
  201. package/metadata/packages/components/components/syn-icon-button/component.angular.ts +185 -0
  202. package/metadata/packages/components/components/syn-icon-button/component.custom.styles.ts +68 -0
  203. package/metadata/packages/components/components/syn-icon-button/component.react.ts +42 -0
  204. package/metadata/packages/components/components/syn-icon-button/component.styles.ts +59 -0
  205. package/metadata/packages/components/components/syn-icon-button/component.ts +154 -0
  206. package/metadata/packages/components/components/syn-icon-button/component.vue +132 -0
  207. package/metadata/packages/components/components/syn-input/component.angular.ts +606 -0
  208. package/metadata/packages/components/components/syn-input/component.custom.styles.ts +278 -0
  209. package/metadata/packages/components/components/syn-input/component.react.ts +91 -0
  210. package/metadata/packages/components/components/syn-input/component.styles.ts +287 -0
  211. package/metadata/packages/components/components/syn-input/component.ts +942 -0
  212. package/metadata/packages/components/components/syn-input/component.vue +370 -0
  213. package/metadata/packages/components/components/syn-menu/component.angular.ts +52 -0
  214. package/metadata/packages/components/components/syn-menu/component.custom.styles.ts +29 -0
  215. package/metadata/packages/components/components/syn-menu/component.react.ts +36 -0
  216. package/metadata/packages/components/components/syn-menu/component.styles.ts +27 -0
  217. package/metadata/packages/components/components/syn-menu/component.ts +199 -0
  218. package/metadata/packages/components/components/syn-menu/component.vue +48 -0
  219. package/metadata/packages/components/components/syn-menu-item/component.angular.ts +121 -0
  220. package/metadata/packages/components/components/syn-menu-item/component.custom.styles.ts +128 -0
  221. package/metadata/packages/components/components/syn-menu-item/component.react.ts +45 -0
  222. package/metadata/packages/components/components/syn-menu-item/component.styles.ts +164 -0
  223. package/metadata/packages/components/components/syn-menu-item/component.ts +209 -0
  224. package/metadata/packages/components/components/syn-menu-item/component.vue +91 -0
  225. package/metadata/packages/components/components/syn-menu-label/component.angular.ts +48 -0
  226. package/metadata/packages/components/components/syn-menu-label/component.custom.styles.ts +24 -0
  227. package/metadata/packages/components/components/syn-menu-label/component.react.ts +35 -0
  228. package/metadata/packages/components/components/syn-menu-label/component.styles.ts +28 -0
  229. package/metadata/packages/components/components/syn-menu-label/component.ts +54 -0
  230. package/metadata/packages/components/components/syn-menu-label/component.vue +41 -0
  231. package/metadata/packages/components/components/syn-nav-item/component.angular.ts +242 -0
  232. package/metadata/packages/components/components/syn-nav-item/component.react.ts +82 -0
  233. package/metadata/packages/components/components/syn-nav-item/component.styles.ts +337 -0
  234. package/metadata/packages/components/components/syn-nav-item/component.ts +492 -0
  235. package/metadata/packages/components/components/syn-nav-item/component.vue +182 -0
  236. package/metadata/packages/components/components/syn-optgroup/component.angular.ts +79 -0
  237. package/metadata/packages/components/components/syn-optgroup/component.react.ts +41 -0
  238. package/metadata/packages/components/components/syn-optgroup/component.styles.ts +59 -0
  239. package/metadata/packages/components/components/syn-optgroup/component.ts +176 -0
  240. package/metadata/packages/components/components/syn-optgroup/component.vue +71 -0
  241. package/metadata/packages/components/components/syn-option/component.angular.ts +79 -0
  242. package/metadata/packages/components/components/syn-option/component.custom.styles.ts +81 -0
  243. package/metadata/packages/components/components/syn-option/component.react.ts +37 -0
  244. package/metadata/packages/components/components/syn-option/component.styles.ts +96 -0
  245. package/metadata/packages/components/components/syn-option/component.ts +174 -0
  246. package/metadata/packages/components/components/syn-option/component.vue +71 -0
  247. package/metadata/packages/components/components/syn-popup/component.angular.ts +385 -0
  248. package/metadata/packages/components/components/syn-popup/component.react.ts +55 -0
  249. package/metadata/packages/components/components/syn-popup/component.styles.ts +70 -0
  250. package/metadata/packages/components/components/syn-popup/component.ts +583 -0
  251. package/metadata/packages/components/components/syn-popup/component.vue +240 -0
  252. package/metadata/packages/components/components/syn-prio-nav/component.angular.ts +67 -0
  253. package/metadata/packages/components/components/syn-prio-nav/component.react.ts +54 -0
  254. package/metadata/packages/components/components/syn-prio-nav/component.styles.ts +48 -0
  255. package/metadata/packages/components/components/syn-prio-nav/component.ts +287 -0
  256. package/metadata/packages/components/components/syn-prio-nav/component.vue +60 -0
  257. package/metadata/packages/components/components/syn-progress-bar/component.angular.ts +85 -0
  258. package/metadata/packages/components/components/syn-progress-bar/component.custom.styles.ts +22 -0
  259. package/metadata/packages/components/components/syn-progress-bar/component.react.ts +37 -0
  260. package/metadata/packages/components/components/syn-progress-bar/component.styles.ts +94 -0
  261. package/metadata/packages/components/components/syn-progress-bar/component.ts +74 -0
  262. package/metadata/packages/components/components/syn-progress-bar/component.vue +71 -0
  263. package/metadata/packages/components/components/syn-progress-ring/component.angular.ts +72 -0
  264. package/metadata/packages/components/components/syn-progress-ring/component.custom.styles.ts +17 -0
  265. package/metadata/packages/components/components/syn-progress-ring/component.react.ts +37 -0
  266. package/metadata/packages/components/components/syn-progress-ring/component.styles.ts +77 -0
  267. package/metadata/packages/components/components/syn-progress-ring/component.ts +90 -0
  268. package/metadata/packages/components/components/syn-progress-ring/component.vue +66 -0
  269. package/metadata/packages/components/components/syn-radio/component.angular.ts +109 -0
  270. package/metadata/packages/components/components/syn-radio/component.custom.styles.ts +73 -0
  271. package/metadata/packages/components/components/syn-radio/component.react.ts +48 -0
  272. package/metadata/packages/components/components/syn-radio/component.styles.ts +124 -0
  273. package/metadata/packages/components/components/syn-radio/component.ts +129 -0
  274. package/metadata/packages/components/components/syn-radio/component.vue +99 -0
  275. package/metadata/packages/components/components/syn-radio-button/component.angular.ts +123 -0
  276. package/metadata/packages/components/components/syn-radio-button/component.react.ts +49 -0
  277. package/metadata/packages/components/components/syn-radio-button/component.styles.ts +37 -0
  278. package/metadata/packages/components/components/syn-radio-button/component.ts +149 -0
  279. package/metadata/packages/components/components/syn-radio-button/component.vue +105 -0
  280. package/metadata/packages/components/components/syn-radio-group/component.angular.ts +204 -0
  281. package/metadata/packages/components/components/syn-radio-group/component.custom.styles.ts +22 -0
  282. package/metadata/packages/components/components/syn-radio-group/component.react.ts +56 -0
  283. package/metadata/packages/components/components/syn-radio-group/component.styles.ts +44 -0
  284. package/metadata/packages/components/components/syn-radio-group/component.ts +418 -0
  285. package/metadata/packages/components/components/syn-radio-group/component.vue +158 -0
  286. package/metadata/packages/components/components/syn-range/component.angular.ts +334 -0
  287. package/metadata/packages/components/components/syn-range/component.react.ts +92 -0
  288. package/metadata/packages/components/components/syn-range/component.styles.ts +284 -0
  289. package/metadata/packages/components/components/syn-range/component.ts +878 -0
  290. package/metadata/packages/components/components/syn-range/component.vue +240 -0
  291. package/metadata/packages/components/components/syn-range-tick/component.angular.ts +59 -0
  292. package/metadata/packages/components/components/syn-range-tick/component.react.ts +33 -0
  293. package/metadata/packages/components/components/syn-range-tick/component.styles.ts +34 -0
  294. package/metadata/packages/components/components/syn-range-tick/component.ts +50 -0
  295. package/metadata/packages/components/components/syn-range-tick/component.vue +57 -0
  296. package/metadata/packages/components/components/syn-resize-observer/component.styles.ts +16 -0
  297. package/metadata/packages/components/components/syn-resize-observer/component.ts +98 -0
  298. package/metadata/packages/components/components/syn-select/component.angular.ts +441 -0
  299. package/metadata/packages/components/components/syn-select/component.custom.styles.ts +176 -0
  300. package/metadata/packages/components/components/syn-select/component.react.ts +101 -0
  301. package/metadata/packages/components/components/syn-select/component.styles.ts +316 -0
  302. package/metadata/packages/components/components/syn-select/component.ts +1054 -0
  303. package/metadata/packages/components/components/syn-select/component.vue +303 -0
  304. package/metadata/packages/components/components/syn-side-nav/component.angular.ts +231 -0
  305. package/metadata/packages/components/components/syn-side-nav/component.react.ts +95 -0
  306. package/metadata/packages/components/components/syn-side-nav/component.styles.ts +160 -0
  307. package/metadata/packages/components/components/syn-side-nav/component.ts +492 -0
  308. package/metadata/packages/components/components/syn-side-nav/component.vue +201 -0
  309. package/metadata/packages/components/components/syn-spinner/component.angular.ts +44 -0
  310. package/metadata/packages/components/components/syn-spinner/component.custom.styles.ts +31 -0
  311. package/metadata/packages/components/components/syn-spinner/component.react.ts +31 -0
  312. package/metadata/packages/components/components/syn-spinner/component.styles.ts +55 -0
  313. package/metadata/packages/components/components/syn-spinner/component.ts +42 -0
  314. package/metadata/packages/components/components/syn-spinner/component.vue +35 -0
  315. package/metadata/packages/components/components/syn-switch/component.angular.ts +244 -0
  316. package/metadata/packages/components/components/syn-switch/component.custom.styles.ts +112 -0
  317. package/metadata/packages/components/components/syn-switch/component.react.ts +63 -0
  318. package/metadata/packages/components/components/syn-switch/component.styles.ts +177 -0
  319. package/metadata/packages/components/components/syn-switch/component.ts +274 -0
  320. package/metadata/packages/components/components/syn-switch/component.vue +178 -0
  321. package/metadata/packages/components/components/syn-tab/component.angular.ts +109 -0
  322. package/metadata/packages/components/components/syn-tab/component.custom.styles.ts +92 -0
  323. package/metadata/packages/components/components/syn-tab/component.react.ts +42 -0
  324. package/metadata/packages/components/components/syn-tab/component.styles.ts +77 -0
  325. package/metadata/packages/components/components/syn-tab/component.ts +132 -0
  326. package/metadata/packages/components/components/syn-tab/component.vue +91 -0
  327. package/metadata/packages/components/components/syn-tab-group/component.angular.ts +166 -0
  328. package/metadata/packages/components/components/syn-tab-group/component.custom.styles.ts +248 -0
  329. package/metadata/packages/components/components/syn-tab-group/component.react.ts +58 -0
  330. package/metadata/packages/components/components/syn-tab-group/component.styles.ts +200 -0
  331. package/metadata/packages/components/components/syn-tab-group/component.ts +557 -0
  332. package/metadata/packages/components/components/syn-tab-group/component.vue +126 -0
  333. package/metadata/packages/components/components/syn-tab-panel/component.angular.ts +68 -0
  334. package/metadata/packages/components/components/syn-tab-panel/component.custom.styles.ts +8 -0
  335. package/metadata/packages/components/components/syn-tab-panel/component.react.ts +31 -0
  336. package/metadata/packages/components/components/syn-tab-panel/component.styles.ts +27 -0
  337. package/metadata/packages/components/components/syn-tab-panel/component.ts +67 -0
  338. package/metadata/packages/components/components/syn-tab-panel/component.vue +60 -0
  339. package/metadata/packages/components/components/syn-tag/component.angular.ts +83 -0
  340. package/metadata/packages/components/components/syn-tag/component.custom.styles.ts +120 -0
  341. package/metadata/packages/components/components/syn-tag/component.react.ts +43 -0
  342. package/metadata/packages/components/components/syn-tag/component.styles.ts +65 -0
  343. package/metadata/packages/components/components/syn-tag/component.ts +90 -0
  344. package/metadata/packages/components/components/syn-tag/component.vue +81 -0
  345. package/metadata/packages/components/components/syn-textarea/component.angular.ts +394 -0
  346. package/metadata/packages/components/components/syn-textarea/component.custom.styles.ts +18 -0
  347. package/metadata/packages/components/components/syn-textarea/component.react.ts +60 -0
  348. package/metadata/packages/components/components/syn-textarea/component.styles.ts +187 -0
  349. package/metadata/packages/components/components/syn-textarea/component.ts +401 -0
  350. package/metadata/packages/components/components/syn-textarea/component.vue +244 -0
  351. package/metadata/packages/components/components/syn-tooltip/component.angular.ts +212 -0
  352. package/metadata/packages/components/components/syn-tooltip/component.custom.styles.ts +13 -0
  353. package/metadata/packages/components/components/syn-tooltip/component.react.ts +63 -0
  354. package/metadata/packages/components/components/syn-tooltip/component.styles.ts +64 -0
  355. package/metadata/packages/components/components/syn-tooltip/component.ts +319 -0
  356. package/metadata/packages/components/components/syn-tooltip/component.vue +158 -0
  357. package/metadata/packages/components/components/syn-validate/component.angular.ts +128 -0
  358. package/metadata/packages/components/components/syn-validate/component.react.ts +36 -0
  359. package/metadata/packages/components/components/syn-validate/component.styles.ts +9 -0
  360. package/metadata/packages/components/components/syn-validate/component.ts +437 -0
  361. package/metadata/packages/components/components/syn-validate/component.vue +98 -0
  362. package/metadata/packages/components/migration/BREAKING_CHANGES.md +489 -0
  363. package/metadata/packages/components/migration/migration-synergy-v3.md +50 -0
  364. package/metadata/packages/components/static/CHANGELOG.md +1107 -0
  365. package/metadata/packages/components/static/LIMITATIONS.md +269 -0
  366. package/metadata/packages/components/static/README.md +248 -0
  367. package/metadata/packages/react/LIMITATIONS.md +31 -0
  368. package/metadata/packages/react/README.md +262 -0
  369. package/metadata/packages/styles/CHANGELOG.md +76 -0
  370. package/metadata/packages/styles/README.md +132 -0
  371. package/metadata/packages/styles/index.css +309 -0
  372. package/metadata/packages/styles/link-list.css +47 -0
  373. package/metadata/packages/styles/link.css +79 -0
  374. package/metadata/packages/styles/tables.css +143 -0
  375. package/metadata/packages/styles/typography.css +52 -0
  376. package/metadata/packages/tokens/CHANGELOG.md +431 -0
  377. package/metadata/packages/tokens/README.md +408 -0
  378. package/metadata/packages/tokens/dark.css +268 -0
  379. package/metadata/packages/tokens/index.js +1294 -0
  380. package/metadata/packages/tokens/light.css +268 -0
  381. package/metadata/packages/vue/LIMITATIONS.md +53 -0
  382. package/metadata/packages/vue/README.md +252 -0
  383. package/metadata/static/angular/index.md +6 -0
  384. package/metadata/static/assets/index.md +10 -0
  385. package/metadata/static/component-info/index.md +24 -0
  386. package/metadata/static/component-list/index.md +34 -0
  387. package/metadata/static/components/index.md +10 -0
  388. package/metadata/static/components/syn-accordion/docs.md +428 -0
  389. package/metadata/static/components/syn-alert/docs.md +231 -0
  390. package/metadata/static/components/syn-badge/docs.md +128 -0
  391. package/metadata/static/components/syn-breadcrumb/docs.md +265 -0
  392. package/metadata/static/components/syn-breadcrumb-item/docs.md +49 -0
  393. package/metadata/static/components/syn-button/docs.md +402 -0
  394. package/metadata/static/components/syn-card/docs.md +273 -0
  395. package/metadata/static/components/syn-checkbox/docs.md +77 -0
  396. package/metadata/static/components/syn-combobox/docs.md +2402 -0
  397. package/metadata/static/components/syn-details/docs.md +220 -0
  398. package/metadata/static/components/syn-dialog/docs.md +222 -0
  399. package/metadata/static/components/syn-divider/docs.md +77 -0
  400. package/metadata/static/components/syn-drawer/docs.md +271 -0
  401. package/metadata/static/components/syn-dropdown/docs.md +316 -0
  402. package/metadata/static/components/syn-file/docs.md +215 -0
  403. package/metadata/static/components/syn-header/docs.md +134 -0
  404. package/metadata/static/components/syn-icon/docs.md +177 -0
  405. package/metadata/static/components/syn-icon-button/docs.md +142 -0
  406. package/metadata/static/components/syn-input/docs.md +460 -0
  407. package/metadata/static/components/syn-menu/docs.md +162 -0
  408. package/metadata/static/components/syn-menu-item/docs.md +196 -0
  409. package/metadata/static/components/syn-menu-label/docs.md +29 -0
  410. package/metadata/static/components/syn-nav-item/docs.md +161 -0
  411. package/metadata/static/components/syn-optgroup/docs.md +167 -0
  412. package/metadata/static/components/syn-option/docs.md +137 -0
  413. package/metadata/static/components/syn-prio-nav/docs.md +54 -0
  414. package/metadata/static/components/syn-progress-bar/docs.md +77 -0
  415. package/metadata/static/components/syn-progress-ring/docs.md +89 -0
  416. package/metadata/static/components/syn-radio/docs.md +123 -0
  417. package/metadata/static/components/syn-radio-group/docs.md +363 -0
  418. package/metadata/static/components/syn-range/docs.md +419 -0
  419. package/metadata/static/components/syn-range-tick/docs.md +110 -0
  420. package/metadata/static/components/syn-select/docs.md +730 -0
  421. package/metadata/static/components/syn-side-nav/docs.md +593 -0
  422. package/metadata/static/components/syn-spinner/docs.md +45 -0
  423. package/metadata/static/components/syn-switch/docs.md +74 -0
  424. package/metadata/static/components/syn-tab/docs.md +47 -0
  425. package/metadata/static/components/syn-tab-group/docs.md +1094 -0
  426. package/metadata/static/components/syn-tab-panel/docs.md +91 -0
  427. package/metadata/static/components/syn-tag/docs.md +50 -0
  428. package/metadata/static/components/syn-textarea/docs.md +215 -0
  429. package/metadata/static/components/syn-tooltip/docs.md +144 -0
  430. package/metadata/static/components/syn-validate/docs.md +225 -0
  431. package/metadata/static/migration/index.md +16 -0
  432. package/metadata/static/react/index.md +8 -0
  433. package/metadata/static/setup/icon-usage.md +276 -0
  434. package/metadata/static/setup/prerequisites.md +171 -0
  435. package/metadata/static/styles/index.md +11 -0
  436. package/metadata/static/styles/syn-body.md +5 -0
  437. package/metadata/static/styles/syn-heading.md +5 -0
  438. package/metadata/static/styles/syn-link-list.md +325 -0
  439. package/metadata/static/styles/syn-link.md +156 -0
  440. package/metadata/static/styles/syn-table-cell.md +125 -0
  441. package/metadata/static/styles/syn-table.md +201 -0
  442. package/metadata/static/styles/syn-weight.md +5 -0
  443. package/metadata/static/templates/appshell.md +2061 -0
  444. package/metadata/static/templates/breadcrumb.md +375 -0
  445. package/metadata/static/templates/footer.md +342 -0
  446. package/metadata/static/templates/forms.md +369 -0
  447. package/metadata/static/templates/index.md +9 -0
  448. package/metadata/static/templates/table.md +1426 -0
  449. package/metadata/static/vue/index.md +6 -0
  450. package/package.json +109 -4
@@ -0,0 +1,557 @@
1
+ /**
2
+ * ---------------------------------------------------------------------
3
+ * 🔒 AUTOGENERATED BY VENDORISM
4
+ * Removing this comment will prevent it from being managed by it.
5
+ * ---------------------------------------------------------------------
6
+ */
7
+
8
+ /* eslint-disable */
9
+ import '../../internal/scrollend-polyfill.js';
10
+ import { classMap } from 'lit/directives/class-map.js';
11
+ import { eventOptions, property, query, queryAssignedElements, state } from 'lit/decorators.js';
12
+ import { html } from 'lit';
13
+ import { LocalizeController } from '../../utilities/localize.js';
14
+ import { scrollIntoView } from '../../internal/scroll.js';
15
+ import { watch } from '../../internal/watch.js';
16
+ import componentStyles from '../../styles/component.styles.js';
17
+ import SynergyElement from '../../internal/synergy-element.js';
18
+ import SynIconButton from '../icon-button/icon-button.component.js';
19
+ import SynResizeObserver from '../resize-observer/resize-observer.component.js';
20
+ import styles from './tab-group.styles.js';
21
+ import customStyles from './tab-group.custom.styles.js';
22
+ import type { CSSResultGroup } from 'lit';
23
+ import type SynTab from '../tab/tab.js';
24
+ import type SynTabPanel from '../tab-panel/tab-panel.js';
25
+
26
+ /**
27
+ * @summary Tab groups organize content into a container that shows one section at a time.
28
+ * @documentation https://synergy-design-system.github.io/?path=/docs/components-syn-tab-group--docs
29
+ * @status stable
30
+ * @since 2.0
31
+ *
32
+ * @dependency syn-icon-button
33
+ *
34
+ * @slot - Used for grouping tab panels in the tab group. Must be `<syn-tab-panel>` elements.
35
+ * @slot nav - Used for grouping tabs in the tab group. Must be `<syn-tab>` elements.
36
+ *
37
+ * @event {{ name: String }} syn-tab-show - Emitted when a tab is shown. The payload of the event returns the "panel" attribute of the shown tab.
38
+ * @event {{ name: String }} syn-tab-hide - Emitted when a tab is hidden. The payload of the event returns the "panel" attribute of the hidden tab.
39
+ *
40
+ * @csspart base - The component's base wrapper.
41
+ * @csspart nav - The tab group's navigation container where tabs are slotted in.
42
+ * @csspart tabs - The container that wraps the tabs.
43
+ * @csspart active-tab-indicator - The line that highlights the currently selected tab.
44
+ * @csspart body - The tab group's body where tab panels are slotted in.
45
+ * @csspart scroll-button - The previous/next scroll buttons that show when tabs are scrollable, an `<syn-icon-button>`.
46
+ * @csspart scroll-button--start - The starting scroll button.
47
+ * @csspart scroll-button--end - The ending scroll button.
48
+ * @csspart scroll-button__base - The scroll button's exported `base` part.
49
+ *
50
+ * @cssproperty --indicator-color - The color of the active tab indicator.
51
+ * @cssproperty --indicator-width - The width of the active tab indicator.
52
+ * @cssproperty --track-color - The color of the indicator's track (the line that separates tabs from panels).
53
+ * @cssproperty --track-width - The width of the indicator's track (the line that separates tabs from panels).
54
+ */
55
+ export default class SynTabGroup extends SynergyElement {
56
+ static styles: CSSResultGroup = [componentStyles, styles, customStyles];
57
+ static dependencies = { 'syn-icon-button': SynIconButton, 'syn-resize-observer': SynResizeObserver };
58
+
59
+ private activeTab?: SynTab;
60
+ private mutationObserver: MutationObserver;
61
+ private resizeObserver: ResizeObserver;
62
+ @queryAssignedElements({ slot: 'nav', selector: 'syn-tab' }) tabs: SynTab[];;
63
+ private focusableTabs: SynTab[] = [];
64
+ @queryAssignedElements({ selector: 'syn-tab-panel' }) panels: SynTabPanel[];;
65
+ private readonly localize = new LocalizeController(this);
66
+
67
+ @query('.tab-group') tabGroup: HTMLElement;
68
+ @query('.tab-group__body') body: HTMLSlotElement;
69
+ @query('.tab-group__nav') nav: HTMLElement;
70
+ @query('.tab-group__indicator') indicator: HTMLElement;
71
+
72
+ @state() private hasScrollControls = false;
73
+
74
+ @state() private shouldHideScrollStartButton = false;
75
+ @state() private shouldHideScrollEndButton = false;
76
+
77
+ /** The placement of the tabs. */
78
+ @property() placement: 'top' | 'start' | 'end' = 'top';
79
+
80
+ /**
81
+ * When set to auto, navigating tabs with the arrow keys will instantly show the corresponding tab panel. When set to
82
+ * manual, the tab will receive focus but will not show until the user presses spacebar or enter.
83
+ */
84
+ @property() activation: 'auto' | 'manual' = 'auto';
85
+
86
+ /** Disables the scroll arrows that appear when tabs overflow. */
87
+ @property({ attribute: 'no-scroll-controls', type: Boolean }) noScrollControls = false;
88
+
89
+ /** Draws the tab group as a contained element. */
90
+ @property({ type: Boolean }) contained = false;
91
+
92
+ /** Draws the tab group with edges instead of roundings. Takes only effect if used with the 'contained' property */
93
+ @property({ type: Boolean }) sharp = false;
94
+
95
+ /** Prevent scroll buttons from being hidden when inactive. */
96
+ @property({ attribute: 'fixed-scroll-controls', type: Boolean }) fixedScrollControls = false;
97
+
98
+ connectedCallback() {
99
+ const whenAllDefined = Promise.all([
100
+ customElements.whenDefined('syn-tab'),
101
+ customElements.whenDefined('syn-tab-panel')
102
+ ]);
103
+
104
+ super.connectedCallback();
105
+
106
+ this.resizeObserver = new ResizeObserver(() => {
107
+ this.repositionIndicator();
108
+ this.updateScrollControls();
109
+ });
110
+
111
+ this.mutationObserver = new MutationObserver(mutations => {
112
+ // Make sure to only observe the direct children of the tab group
113
+ // instead of other sub elements that might be slotted in.
114
+ // @see https://github.com/shoelace-style/shoelace/issues/2320
115
+ const instanceMutations = mutations.filter(({ target }) => {
116
+ if (target === this) return true; // Allow self updates
117
+ if ((target as HTMLElement).closest('syn-tab-group') !== this) return false; // We are not direct children
118
+
119
+ // We should only care about changes to the tab or tab panel
120
+ const tagName = (target as HTMLElement).tagName.toLowerCase();
121
+ return tagName === 'syn-tab' || tagName === 'syn-tab-panel';
122
+ });
123
+
124
+ if (instanceMutations.length === 0) {
125
+ return;
126
+ }
127
+
128
+ // Update aria labels when the DOM changes
129
+ if (instanceMutations.some(m => !['aria-labelledby', 'aria-controls'].includes(m.attributeName!))) {
130
+ setTimeout(() => this.setAriaLabels());
131
+ }
132
+
133
+ // Sync tabs when disabled states change
134
+ if (instanceMutations.some(m => m.attributeName === 'disabled')) {
135
+ this.syncTabsAndPanels();
136
+ // sync tabs when active state on tab changes
137
+ } else if (instanceMutations.some(m => m.attributeName === 'active')) {
138
+ const tabs = instanceMutations
139
+ .filter(m => m.attributeName === 'active' && (m.target as HTMLElement).tagName.toLowerCase() === 'syn-tab')
140
+ .map(m => m.target as SynTab);
141
+ const newActiveTab = tabs.find(tab => tab.active);
142
+
143
+ if (newActiveTab) {
144
+ this.setActiveTab(newActiveTab);
145
+ }
146
+ }
147
+ });
148
+
149
+ // After the first update...
150
+ this.updateComplete.then(() => {
151
+ this.syncTabsAndPanels();
152
+
153
+ this.mutationObserver.observe(this, {
154
+ attributes: true,
155
+ attributeFilter: ['active', 'disabled', 'name', 'panel'],
156
+ childList: true,
157
+ subtree: true
158
+ });
159
+
160
+ this.resizeObserver.observe(this.nav);
161
+
162
+ // Wait for tabs and tab panels to be registered
163
+ whenAllDefined.then(() => {
164
+ // Set initial tab state when the tabs become visible
165
+ const intersectionObserver = new IntersectionObserver((entries, observer) => {
166
+ if (entries[0].intersectionRatio > 0) {
167
+ this.setAriaLabels();
168
+ this.setActiveTab(this.getActiveTab() ?? this.tabs[0], { emitEvents: false });
169
+ observer.unobserve(entries[0].target);
170
+ }
171
+ });
172
+ intersectionObserver.observe(this.tabGroup);
173
+ });
174
+ });
175
+ }
176
+
177
+ disconnectedCallback() {
178
+ super.disconnectedCallback();
179
+ this.mutationObserver?.disconnect();
180
+
181
+ if (this.nav) {
182
+ this.resizeObserver?.unobserve(this.nav);
183
+ }
184
+ }
185
+
186
+ private getActiveTab() {
187
+ return this.tabs.find(el => el.active);
188
+ }
189
+
190
+ private handleClick(event: MouseEvent) {
191
+ const target = event.target as HTMLElement;
192
+ const tab = target.closest('syn-tab');
193
+ const tabGroup = tab?.closest('syn-tab-group');
194
+
195
+ // Ensure the target tab is in this tab group
196
+ if (tabGroup !== this) {
197
+ return;
198
+ }
199
+
200
+ if (tab !== null) {
201
+ this.setActiveTab(tab, { scrollBehavior: 'smooth' });
202
+ }
203
+ }
204
+
205
+ private handleKeyDown(event: KeyboardEvent) {
206
+ const target = event.target as HTMLElement;
207
+ const tab = target.closest('syn-tab');
208
+ const tabGroup = tab?.closest('syn-tab-group');
209
+
210
+ // Ensure the target tab is in this tab group
211
+ if (tabGroup !== this) {
212
+ return;
213
+ }
214
+
215
+ // Activate a tab
216
+ if (['Enter', ' '].includes(event.key)) {
217
+ if (tab !== null) {
218
+ this.setActiveTab(tab, { scrollBehavior: 'smooth' });
219
+ event.preventDefault();
220
+ }
221
+ }
222
+
223
+ // Move focus left or right
224
+ if (['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Home', 'End'].includes(event.key)) {
225
+ const activeEl = this.tabs.find(t => t.matches(':focus'));
226
+ const isRtl = this.localize.dir() === 'rtl';
227
+ let nextTab: null | SynTab = null;
228
+
229
+ if (activeEl?.tagName.toLowerCase() === 'syn-tab') {
230
+ if (event.key === 'Home') {
231
+ nextTab = this.focusableTabs[0];
232
+ } else if (event.key === 'End') {
233
+ nextTab = this.focusableTabs[this.focusableTabs.length - 1];
234
+ } else if (
235
+ (['top'].includes(this.placement) && event.key === (isRtl ? 'ArrowRight' : 'ArrowLeft')) ||
236
+ (['start', 'end'].includes(this.placement) && event.key === 'ArrowUp')
237
+ ) {
238
+ const currentIndex = this.tabs.findIndex(el => el === activeEl);
239
+ nextTab = this.findNextFocusableTab(currentIndex, 'backward');
240
+ } else if (
241
+ (['top'].includes(this.placement) && event.key === (isRtl ? 'ArrowLeft' : 'ArrowRight')) ||
242
+ (['start', 'end'].includes(this.placement) && event.key === 'ArrowDown')
243
+ ) {
244
+ const currentIndex = this.tabs.findIndex(el => el === activeEl);
245
+ nextTab = this.findNextFocusableTab(currentIndex, 'forward');
246
+ }
247
+
248
+ if (!nextTab) {
249
+ return;
250
+ }
251
+
252
+ nextTab.tabIndex = 0;
253
+ nextTab.focus({ preventScroll: true });
254
+
255
+ if (this.activation === 'auto') {
256
+ this.setActiveTab(nextTab, { scrollBehavior: 'smooth' });
257
+ } else {
258
+ this.tabs.forEach(tabEl => {
259
+ tabEl.tabIndex = tabEl === nextTab ? 0 : -1;
260
+ });
261
+ }
262
+
263
+ if (['top'].includes(this.placement)) {
264
+ scrollIntoView(nextTab, this.nav, 'horizontal');
265
+ }
266
+
267
+ event.preventDefault();
268
+ }
269
+ }
270
+ }
271
+
272
+ private handleScrollToStart() {
273
+ this.nav.scroll({
274
+ left:
275
+ this.localize.dir() === 'rtl'
276
+ ? this.nav.scrollLeft + this.nav.clientWidth
277
+ : this.nav.scrollLeft - this.nav.clientWidth,
278
+ behavior: 'smooth'
279
+ });
280
+ }
281
+
282
+ private handleScrollToEnd() {
283
+ this.nav.scroll({
284
+ left:
285
+ this.localize.dir() === 'rtl'
286
+ ? this.nav.scrollLeft - this.nav.clientWidth
287
+ : this.nav.scrollLeft + this.nav.clientWidth,
288
+ behavior: 'smooth'
289
+ });
290
+ }
291
+
292
+ private setActiveTab(tab: SynTab, options?: { emitEvents?: boolean; scrollBehavior?: 'auto' | 'smooth' }) {
293
+ options = {
294
+ emitEvents: true,
295
+ scrollBehavior: 'auto',
296
+ ...options
297
+ };
298
+
299
+ if (tab !== this.activeTab && !tab.disabled) {
300
+ const previousTab = this.activeTab;
301
+ this.activeTab = tab;
302
+
303
+ // Sync active tab and panel
304
+ this.tabs.forEach(el => {
305
+ el.active = el === this.activeTab;
306
+ el.tabIndex = el === this.activeTab ? 0 : -1;
307
+ });
308
+ this.panels.forEach(el => (el.active = el.name === this.activeTab?.panel));
309
+ this.syncIndicator();
310
+
311
+ if (['top'].includes(this.placement)) {
312
+ scrollIntoView(this.activeTab, this.nav, 'horizontal', options.scrollBehavior);
313
+ }
314
+
315
+ // Emit events
316
+ if (options.emitEvents) {
317
+ if (previousTab) {
318
+ this.emit('syn-tab-hide', { detail: { name: previousTab.panel } });
319
+ }
320
+
321
+ this.emit('syn-tab-show', { detail: { name: this.activeTab.panel } });
322
+ }
323
+ }
324
+ }
325
+
326
+ private setAriaLabels() {
327
+ // Link each tab with its corresponding panel
328
+ this.tabs.forEach(tab => {
329
+ const panel = this.panels.find(el => el.name === tab.panel);
330
+ if (panel) {
331
+ tab.setAttribute('aria-controls', panel.getAttribute('id')!);
332
+ panel.setAttribute('aria-labelledby', tab.getAttribute('id')!);
333
+ }
334
+ });
335
+ }
336
+
337
+ private repositionIndicator() {
338
+ const currentTab = this.getActiveTab();
339
+
340
+ if (!currentTab) {
341
+ return;
342
+ }
343
+
344
+ const width = currentTab.clientWidth;
345
+ const height = currentTab.clientHeight;
346
+ const isRtl = this.localize.dir() === 'rtl';
347
+
348
+ // We can't used offsetLeft/offsetTop here due to a shadow parent issue where neither can getBoundingClientRect
349
+ // because it provides invalid values for animating elements: https://bugs.chromium.org/p/chromium/issues/detail?id=920069
350
+ const precedingTabs = this.tabs.slice(0, this.tabs.indexOf(currentTab));
351
+ const offset = precedingTabs.reduce(
352
+ (previous, current) => ({
353
+ left: previous.left + current.clientWidth,
354
+ top: previous.top + current.clientHeight
355
+ }),
356
+ { left: 0, top: 0 }
357
+ );
358
+
359
+ switch (this.placement) {
360
+ case 'top':
361
+ this.indicator.style.width = `calc(${width}px - ${ (this.contained || this.sharp) ? '2 * var(--syn-spacing-large)' : '0px' })`;
362
+ this.indicator.style.height = 'auto';
363
+ this.indicator.style.translate = `calc(${isRtl ? '-' : ''}1 * (${offset.left}px + ${ (this.contained || this.sharp) ? 'var(--syn-spacing-large)' : '0px' }))`;
364
+ break;
365
+
366
+ case 'start':
367
+ case 'end':
368
+ this.indicator.style.width = 'auto';
369
+ this.indicator.style.height = `calc(${height}px - ${ (this.contained || this.sharp) ? '2 * var(--syn-spacing-small)' : '0px' })`;
370
+ this.indicator.style.translate = `0 calc(${offset.top}px + ${ (this.contained || this.sharp) ? 'var(--syn-spacing-small)' : '0px' })`;
371
+ break;
372
+ }
373
+ }
374
+
375
+ // This stores tabs and panels so we can refer to a cache instead of calling querySelectorAll() multiple times.
376
+ private syncTabsAndPanels() {
377
+ this.focusableTabs = this.tabs.filter(el => !el.disabled);
378
+ this.syncIndicator();
379
+
380
+ // After updating, show or hide scroll controls as needed
381
+ this.updateComplete.then(() => this.updateScrollControls());
382
+ }
383
+
384
+ private findNextFocusableTab(currentIndex: number, direction: 'forward' | 'backward') {
385
+ let nextTab = null;
386
+ const iterator = direction === 'forward' ? 1 : -1;
387
+ let nextIndex = currentIndex + iterator;
388
+
389
+ while (currentIndex < this.tabs.length) {
390
+ nextTab = this.tabs[nextIndex] || null;
391
+
392
+ if (nextTab === null) {
393
+ // This is where wrapping happens. If we're moving forward and get to the end, then we jump to the beginning. If we're moving backward and get to the start, then we jump to the end.
394
+ if (direction === 'forward') {
395
+ nextTab = this.focusableTabs[0];
396
+ } else {
397
+ nextTab = this.focusableTabs[this.focusableTabs.length - 1];
398
+ }
399
+ break;
400
+ }
401
+
402
+ if (!nextTab.disabled) {
403
+ break;
404
+ }
405
+
406
+ nextIndex += iterator;
407
+ }
408
+
409
+ return nextTab;
410
+ }
411
+
412
+ /**
413
+ * The reality of the browser means that we can't expect the scroll position to be exactly what we want it to be, so
414
+ * we add one pixel of wiggle room to our calculations.
415
+ */
416
+ private scrollOffset = 1;
417
+
418
+ @eventOptions({ passive: true })
419
+ private updateScrollButtons() {
420
+ if (this.hasScrollControls && !this.fixedScrollControls) {
421
+ this.shouldHideScrollStartButton = this.scrollFromStart() <= this.scrollOffset;
422
+ this.shouldHideScrollEndButton = this.isScrolledToEnd();
423
+ }
424
+ }
425
+
426
+ private isScrolledToEnd() {
427
+ return this.scrollFromStart() + this.nav.clientWidth >= this.nav.scrollWidth - this.scrollOffset;
428
+ }
429
+
430
+ private scrollFromStart() {
431
+ return this.localize.dir() === 'rtl' ? -this.nav.scrollLeft : this.nav.scrollLeft;
432
+ }
433
+
434
+ @watch('noScrollControls', { waitUntilFirstUpdate: true })
435
+ updateScrollControls() {
436
+ if (this.noScrollControls) {
437
+ this.hasScrollControls = false;
438
+ } else {
439
+ // In most cases, we can compare scrollWidth to clientWidth to determine if scroll controls should show. However,
440
+ // Safari appears to calculate this incorrectly when zoomed at 110%, causing the controls to toggle indefinitely.
441
+ // Adding a single pixel to the comparison seems to resolve it.
442
+ //
443
+ // See https://github.com/shoelace-style/shoelace/issues/1839
444
+ this.hasScrollControls =
445
+ ['top'].includes(this.placement) && this.nav.scrollWidth > this.nav.clientWidth + 1;
446
+ }
447
+
448
+ this.updateScrollButtons();
449
+ }
450
+
451
+ @watch('placement', { waitUntilFirstUpdate: true })
452
+ syncIndicator() {
453
+ const tab = this.getActiveTab();
454
+
455
+ if (tab) {
456
+ this.indicator.style.display = 'block';
457
+ this.repositionIndicator();
458
+ } else {
459
+ this.indicator.style.display = 'none';
460
+ }
461
+ }
462
+
463
+ /** Shows the specified tab panel. */
464
+ show(panel: string) {
465
+ const tab = this.tabs.find(el => el.panel === panel);
466
+
467
+ if (tab) {
468
+ this.setActiveTab(tab, { scrollBehavior: 'smooth' });
469
+ }
470
+ }
471
+
472
+ preventFocus(e: MouseEvent) {
473
+ e.preventDefault();
474
+ }
475
+
476
+ render() {
477
+
478
+ return html`
479
+ <div
480
+ part="base"
481
+ class=${classMap({
482
+ 'tab-group': true,
483
+ 'tab-group--top': this.placement === 'top',
484
+ 'tab-group--start': this.placement === 'start',
485
+ 'tab-group--end': this.placement === 'end',
486
+ 'tab-group--rtl': this.localize.dir() === 'rtl',
487
+ 'tab-group--has-scroll-controls': this.hasScrollControls,
488
+ 'tab-group--contained': this.contained,
489
+ 'tab-group--sharp': this.sharp,
490
+ })}
491
+ @click=${this.handleClick}
492
+ @keydown=${this.handleKeyDown}
493
+ >
494
+ <div class="tab-group__nav-container" part="nav">
495
+ ${this.hasScrollControls
496
+ ? html`
497
+ <syn-icon-button
498
+ part="scroll-button scroll-button--start"
499
+ exportparts="base:scroll-button__base"
500
+ class=${classMap({
501
+ 'tab-group__scroll-button': true,
502
+ 'tab-group__scroll-button--start': true,
503
+ 'tab-group__scroll-button--start--hidden': this.shouldHideScrollStartButton
504
+ })}
505
+ name="chevron-right"
506
+ library="system"
507
+ tabindex="-1"
508
+ aria-hidden="true"
509
+ label=${this.localize.term('scrollToStart')}
510
+ @mousedown=${this.preventFocus}
511
+ @click=${this.handleScrollToStart}
512
+ ></syn-icon-button>
513
+ `
514
+ : ''}
515
+
516
+ <div class="tab-group__nav" @scrollend=${this.updateScrollButtons}>
517
+ <div part="tabs" class="tab-group__tabs" role="tablist">
518
+ <div part="active-tab-indicator" class="tab-group__indicator"></div>
519
+ <syn-resize-observer @syn-resize=${this.syncIndicator}>
520
+ <slot name="nav" @slotchange=${this.syncTabsAndPanels}></slot>
521
+ </syn-resize-observer>
522
+ </div>
523
+ </div>
524
+
525
+ ${this.hasScrollControls
526
+ ? html`
527
+ <syn-icon-button
528
+ part="scroll-button scroll-button--end"
529
+ exportparts="base:scroll-button__base"
530
+ class=${classMap({
531
+ 'tab-group__scroll-button': true,
532
+ 'tab-group__scroll-button--end': true,
533
+ 'tab-group__scroll-button--end--hidden': this.shouldHideScrollEndButton
534
+ })}
535
+ name="chevron-right"
536
+ library="system"
537
+ tabindex="-1"
538
+ aria-hidden="true"
539
+ label=${this.localize.term('scrollToEnd')}
540
+ @mousedown=${this.preventFocus}
541
+ @click=${this.handleScrollToEnd}
542
+ ></syn-icon-button>
543
+ `
544
+ : ''}
545
+ </div>
546
+
547
+ <slot part="body" class="tab-group__body" @slotchange=${this.syncTabsAndPanels}></slot>
548
+ </div>
549
+ `;
550
+ }
551
+ }
552
+
553
+ declare global {
554
+ interface HTMLElementTagNameMap {
555
+ 'syn-tab-group': SynTabGroup;
556
+ }
557
+ }
@@ -0,0 +1,126 @@
1
+ <script setup lang="ts">
2
+ // ---------------------------------------------------------------------
3
+ // 🔒 AUTOGENERATED @synergy-design-system/vue wrappers for @synergy-design-system/components
4
+ // Please do not edit this file directly!
5
+ // It will get recreated when running pnpm build.
6
+ // ---------------------------------------------------------------------
7
+
8
+ /**
9
+ * @summary Tab groups organize content into a container that shows one section at a time.
10
+ * @documentation https://synergy-design-system.github.io/?path=/docs/components-syn-tab-group--docs
11
+ * @status stable
12
+ * @since 2.0
13
+ *
14
+ * @dependency syn-icon-button
15
+ *
16
+ * @slot - Used for grouping tab panels in the tab group. Must be `<syn-tab-panel>` elements.
17
+ * @slot nav - Used for grouping tabs in the tab group. Must be `<syn-tab>` elements.
18
+ *
19
+ * @event {{ name: String }} syn-tab-show - Emitted when a tab is shown. The payload of the event returns the "panel" attribute of the shown tab.
20
+ * @event {{ name: String }} syn-tab-hide - Emitted when a tab is hidden. The payload of the event returns the "panel" attribute of the hidden tab.
21
+ *
22
+ * @csspart base - The component's base wrapper.
23
+ * @csspart nav - The tab group's navigation container where tabs are slotted in.
24
+ * @csspart tabs - The container that wraps the tabs.
25
+ * @csspart active-tab-indicator - The line that highlights the currently selected tab.
26
+ * @csspart body - The tab group's body where tab panels are slotted in.
27
+ * @csspart scroll-button - The previous/next scroll buttons that show when tabs are scrollable, an `<syn-icon-button>`.
28
+ * @csspart scroll-button--start - The starting scroll button.
29
+ * @csspart scroll-button--end - The ending scroll button.
30
+ * @csspart scroll-button__base - The scroll button's exported `base` part.
31
+ *
32
+ * @cssproperty --indicator-color - The color of the active tab indicator.
33
+ * @cssproperty --indicator-width - The width of the active tab indicator.
34
+ * @cssproperty --track-color - The color of the indicator's track (the line that separates tabs from panels).
35
+ * @cssproperty --track-width - The width of the indicator's track (the line that separates tabs from panels).
36
+ */
37
+ import { computed, ref } from 'vue';
38
+ import '@synergy-design-system/components/components/tab-group/tab-group.js';
39
+
40
+ import type { SynTabShowEvent } from '@synergy-design-system/components';
41
+ import type { SynTabHideEvent } from '@synergy-design-system/components';
42
+ import type { SynTabGroup } from '@synergy-design-system/components';
43
+
44
+ // DOM Reference to the element
45
+ const nativeElement = ref<SynTabGroup>();
46
+
47
+ defineExpose({
48
+ nativeElement,
49
+ });
50
+
51
+ // Map attributes
52
+ const props = defineProps<{
53
+ /**
54
+ * The placement of the tabs.
55
+ */
56
+ placement?: SynTabGroup['placement'];
57
+
58
+ /**
59
+ * When set to auto, navigating tabs with the arrow keys will instantly show the corresponding tab panel.
60
+ * When set to
61
+ manual, the tab will receive focus but will not show until the user presses spacebar or enter.
62
+ */
63
+ activation?: SynTabGroup['activation'];
64
+
65
+ /**
66
+ * Disables the scroll arrows that appear when tabs overflow.
67
+ */
68
+ noScrollControls?: SynTabGroup['noScrollControls'];
69
+
70
+ /**
71
+ * Draws the tab group as a contained element.
72
+ */
73
+ contained?: SynTabGroup['contained'];
74
+
75
+ /**
76
+ * Draws the tab group with edges instead of roundings.
77
+ * Takes only effect if used with the 'contained' property
78
+ */
79
+ sharp?: SynTabGroup['sharp'];
80
+
81
+ /**
82
+ * Prevent scroll buttons from being hidden when inactive.
83
+ */
84
+ fixedScrollControls?: SynTabGroup['fixedScrollControls'];
85
+ }>();
86
+
87
+ // Make sure prop binding only forwards the props that are actually there.
88
+ // This is needed because :param="param" also adds an empty attribute
89
+ // when using web-components, which breaks optional arguments like size in SynInput
90
+ // @see https://github.com/vuejs/core/issues/5190#issuecomment-1003112498
91
+ const visibleProps = computed(() =>
92
+ Object.fromEntries(
93
+ Object.entries(props).filter(([, value]) => typeof value !== 'undefined'),
94
+ ),
95
+ );
96
+
97
+ // Map events
98
+ defineEmits<{
99
+ /**
100
+ * Emitted when a tab is shown.
101
+ * The payload of the event returns the "panel" attribute of the shown tab.
102
+ */
103
+ 'syn-tab-show': [e: SynTabShowEvent];
104
+
105
+ /**
106
+ * Emitted when a tab is hidden.
107
+ * The payload of the event returns the "panel" attribute of the hidden tab.
108
+ */
109
+ 'syn-tab-hide': [e: SynTabHideEvent];
110
+ }>();
111
+ </script>
112
+
113
+ <script lang="ts">
114
+ export type { SynTabShowEvent } from '@synergy-design-system/components';
115
+ export type { SynTabHideEvent } from '@synergy-design-system/components';
116
+ </script>
117
+
118
+ <template>
119
+ <syn-tab-group
120
+ @syn-tab-show="$emit('syn-tab-show', $event)"
121
+ @syn-tab-hide="$emit('syn-tab-hide', $event)"
122
+ v-bind="visibleProps"
123
+ ref="nativeElement">
124
+ <slot></slot>
125
+ </syn-tab-group>
126
+ </template>