@central-design-system/skills 4.0.0-alpha.6

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 (321) hide show
  1. package/.claude-plugin/plugin.json +6 -0
  2. package/README.md +218 -0
  3. package/bin/cds-skills.mjs +124 -0
  4. package/package.json +33 -0
  5. package/skills/cds-builder/GENERATION.md +44 -0
  6. package/skills/cds-builder/SKILL.md +308 -0
  7. package/skills/cds-builder/references/component-decision-tree.md +310 -0
  8. package/skills/cds-builder/references/components/cds-app/api.md +19 -0
  9. package/skills/cds-builder/references/components/cds-app/tokens.md +12 -0
  10. package/skills/cds-builder/references/components/cds-autocomplete/api.md +155 -0
  11. package/skills/cds-builder/references/components/cds-autocomplete/examples.md +447 -0
  12. package/skills/cds-builder/references/components/cds-autocomplete/guidelines.md +10 -0
  13. package/skills/cds-builder/references/components/cds-autocomplete/tokens.md +19 -0
  14. package/skills/cds-builder/references/components/cds-avatar/api.md +35 -0
  15. package/skills/cds-builder/references/components/cds-avatar/examples.md +240 -0
  16. package/skills/cds-builder/references/components/cds-avatar/guidelines.md +10 -0
  17. package/skills/cds-builder/references/components/cds-avatar/tokens.md +32 -0
  18. package/skills/cds-builder/references/components/cds-badge/api.md +44 -0
  19. package/skills/cds-builder/references/components/cds-badge/examples.md +332 -0
  20. package/skills/cds-builder/references/components/cds-badge/guidelines.md +10 -0
  21. package/skills/cds-builder/references/components/cds-badge/tokens.md +32 -0
  22. package/skills/cds-builder/references/components/cds-breadcrumbs/api.md +83 -0
  23. package/skills/cds-builder/references/components/cds-breadcrumbs/examples.md +219 -0
  24. package/skills/cds-builder/references/components/cds-breadcrumbs/guidelines.md +10 -0
  25. package/skills/cds-builder/references/components/cds-breadcrumbs/tokens.md +24 -0
  26. package/skills/cds-builder/references/components/cds-button/api.md +66 -0
  27. package/skills/cds-builder/references/components/cds-button/examples.md +324 -0
  28. package/skills/cds-builder/references/components/cds-button/guidelines.md +10 -0
  29. package/skills/cds-builder/references/components/cds-button/tokens.md +190 -0
  30. package/skills/cds-builder/references/components/cds-button-group/api.md +27 -0
  31. package/skills/cds-builder/references/components/cds-button-group/examples.md +33 -0
  32. package/skills/cds-builder/references/components/cds-button-group/tokens.md +17 -0
  33. package/skills/cds-builder/references/components/cds-button-toggle/api.md +51 -0
  34. package/skills/cds-builder/references/components/cds-button-toggle/examples.md +278 -0
  35. package/skills/cds-builder/references/components/cds-button-toggle/guidelines.md +10 -0
  36. package/skills/cds-builder/references/components/cds-button-toggle/tokens.md +13 -0
  37. package/skills/cds-builder/references/components/cds-card/api.md +221 -0
  38. package/skills/cds-builder/references/components/cds-card/examples.md +652 -0
  39. package/skills/cds-builder/references/components/cds-card/guidelines.md +10 -0
  40. package/skills/cds-builder/references/components/cds-card/tokens.md +46 -0
  41. package/skills/cds-builder/references/components/cds-carousel/api.md +107 -0
  42. package/skills/cds-builder/references/components/cds-carousel/examples.md +444 -0
  43. package/skills/cds-builder/references/components/cds-carousel/guidelines.md +10 -0
  44. package/skills/cds-builder/references/components/cds-carousel/tokens.md +17 -0
  45. package/skills/cds-builder/references/components/cds-checkbox/api.md +93 -0
  46. package/skills/cds-builder/references/components/cds-checkbox/examples.md +319 -0
  47. package/skills/cds-builder/references/components/cds-checkbox/guidelines.md +10 -0
  48. package/skills/cds-builder/references/components/cds-checkbox/tokens.md +18 -0
  49. package/skills/cds-builder/references/components/cds-checkbox-button/api.md +56 -0
  50. package/skills/cds-builder/references/components/cds-checkbox-button/examples.md +29 -0
  51. package/skills/cds-builder/references/components/cds-checkbox-button/tokens.md +56 -0
  52. package/skills/cds-builder/references/components/cds-combobox/api.md +158 -0
  53. package/skills/cds-builder/references/components/cds-combobox/examples.md +264 -0
  54. package/skills/cds-builder/references/components/cds-combobox/guidelines.md +10 -0
  55. package/skills/cds-builder/references/components/cds-combobox/tokens.md +19 -0
  56. package/skills/cds-builder/references/components/cds-counter/api.md +24 -0
  57. package/skills/cds-builder/references/components/cds-counter/examples.md +93 -0
  58. package/skills/cds-builder/references/components/cds-counter/tokens.md +11 -0
  59. package/skills/cds-builder/references/components/cds-date-input/api.md +151 -0
  60. package/skills/cds-builder/references/components/cds-date-input/examples.md +479 -0
  61. package/skills/cds-builder/references/components/cds-date-input/guidelines.md +10 -0
  62. package/skills/cds-builder/references/components/cds-date-input/tokens.md +16 -0
  63. package/skills/cds-builder/references/components/cds-date-picker/api.md +63 -0
  64. package/skills/cds-builder/references/components/cds-date-picker/examples.md +394 -0
  65. package/skills/cds-builder/references/components/cds-date-picker/guidelines.md +10 -0
  66. package/skills/cds-builder/references/components/cds-date-picker/tokens.md +66 -0
  67. package/skills/cds-builder/references/components/cds-defaults-provider/api.md +21 -0
  68. package/skills/cds-builder/references/components/cds-description/api.md +22 -0
  69. package/skills/cds-builder/references/components/cds-description/examples.md +69 -0
  70. package/skills/cds-builder/references/components/cds-description/tokens.md +11 -0
  71. package/skills/cds-builder/references/components/cds-divider/api.md +29 -0
  72. package/skills/cds-builder/references/components/cds-divider/examples.md +374 -0
  73. package/skills/cds-builder/references/components/cds-divider/guidelines.md +10 -0
  74. package/skills/cds-builder/references/components/cds-divider/tokens.md +38 -0
  75. package/skills/cds-builder/references/components/cds-drawer/api.md +53 -0
  76. package/skills/cds-builder/references/components/cds-drawer/examples.md +432 -0
  77. package/skills/cds-builder/references/components/cds-drawer/guidelines.md +9 -0
  78. package/skills/cds-builder/references/components/cds-drawer/tokens.md +27 -0
  79. package/skills/cds-builder/references/components/cds-empty-state/api.md +55 -0
  80. package/skills/cds-builder/references/components/cds-empty-state/examples.md +330 -0
  81. package/skills/cds-builder/references/components/cds-empty-state/guidelines.md +9 -0
  82. package/skills/cds-builder/references/components/cds-empty-state/tokens.md +25 -0
  83. package/skills/cds-builder/references/components/cds-expandable-panel/api.md +157 -0
  84. package/skills/cds-builder/references/components/cds-expandable-panel/examples.md +569 -0
  85. package/skills/cds-builder/references/components/cds-expandable-panel/guidelines.md +10 -0
  86. package/skills/cds-builder/references/components/cds-expandable-panel/tokens.md +34 -0
  87. package/skills/cds-builder/references/components/cds-field/api.md +62 -0
  88. package/skills/cds-builder/references/components/cds-field/examples.md +202 -0
  89. package/skills/cds-builder/references/components/cds-field/tokens.md +94 -0
  90. package/skills/cds-builder/references/components/cds-file-input/api.md +109 -0
  91. package/skills/cds-builder/references/components/cds-file-input/examples.md +368 -0
  92. package/skills/cds-builder/references/components/cds-file-input/guidelines.md +10 -0
  93. package/skills/cds-builder/references/components/cds-file-input/tokens.md +15 -0
  94. package/skills/cds-builder/references/components/cds-file-upload/api.md +296 -0
  95. package/skills/cds-builder/references/components/cds-file-upload/examples.md +411 -0
  96. package/skills/cds-builder/references/components/cds-file-upload/guidelines.md +10 -0
  97. package/skills/cds-builder/references/components/cds-file-upload/tokens.md +50 -0
  98. package/skills/cds-builder/references/components/cds-footer/api.md +35 -0
  99. package/skills/cds-builder/references/components/cds-footer/examples.md +219 -0
  100. package/skills/cds-builder/references/components/cds-footer/guidelines.md +9 -0
  101. package/skills/cds-builder/references/components/cds-footer/tokens.md +14 -0
  102. package/skills/cds-builder/references/components/cds-form/api.md +48 -0
  103. package/skills/cds-builder/references/components/cds-form/examples.md +552 -0
  104. package/skills/cds-builder/references/components/cds-form/guidelines.md +10 -0
  105. package/skills/cds-builder/references/components/cds-form/tokens.md +15 -0
  106. package/skills/cds-builder/references/components/cds-functional-button/api.md +34 -0
  107. package/skills/cds-builder/references/components/cds-functional-button/examples.md +254 -0
  108. package/skills/cds-builder/references/components/cds-functional-button/guidelines.md +10 -0
  109. package/skills/cds-builder/references/components/cds-functional-button/tokens.md +35 -0
  110. package/skills/cds-builder/references/components/cds-grid/api.md +66 -0
  111. package/skills/cds-builder/references/components/cds-grid/examples.md +687 -0
  112. package/skills/cds-builder/references/components/cds-grid/guidelines.md +9 -0
  113. package/skills/cds-builder/references/components/cds-header/api.md +35 -0
  114. package/skills/cds-builder/references/components/cds-header/examples.md +345 -0
  115. package/skills/cds-builder/references/components/cds-header/guidelines.md +9 -0
  116. package/skills/cds-builder/references/components/cds-header/tokens.md +13 -0
  117. package/skills/cds-builder/references/components/cds-highlight/api.md +22 -0
  118. package/skills/cds-builder/references/components/cds-highlight/examples.md +313 -0
  119. package/skills/cds-builder/references/components/cds-highlight/guidelines.md +10 -0
  120. package/skills/cds-builder/references/components/cds-highlight/tokens.md +18 -0
  121. package/skills/cds-builder/references/components/cds-icon/api.md +33 -0
  122. package/skills/cds-builder/references/components/cds-icon/examples.md +272 -0
  123. package/skills/cds-builder/references/components/cds-icon/guidelines.md +10 -0
  124. package/skills/cds-builder/references/components/cds-icon/tokens.md +30 -0
  125. package/skills/cds-builder/references/components/cds-image/api.md +67 -0
  126. package/skills/cds-builder/references/components/cds-image/examples.md +437 -0
  127. package/skills/cds-builder/references/components/cds-image/guidelines.md +10 -0
  128. package/skills/cds-builder/references/components/cds-image/tokens.md +14 -0
  129. package/skills/cds-builder/references/components/cds-input/api.md +80 -0
  130. package/skills/cds-builder/references/components/cds-input/examples.md +205 -0
  131. package/skills/cds-builder/references/components/cds-input/tokens.md +108 -0
  132. package/skills/cds-builder/references/components/cds-label/api.md +25 -0
  133. package/skills/cds-builder/references/components/cds-label/examples.md +72 -0
  134. package/skills/cds-builder/references/components/cds-label/tokens.md +12 -0
  135. package/skills/cds-builder/references/components/cds-layout/api.md +50 -0
  136. package/skills/cds-builder/references/components/cds-layout/examples.md +431 -0
  137. package/skills/cds-builder/references/components/cds-layout/guidelines.md +9 -0
  138. package/skills/cds-builder/references/components/cds-layout/tokens.md +12 -0
  139. package/skills/cds-builder/references/components/cds-link/api.md +33 -0
  140. package/skills/cds-builder/references/components/cds-link/examples.md +195 -0
  141. package/skills/cds-builder/references/components/cds-link/guidelines.md +10 -0
  142. package/skills/cds-builder/references/components/cds-link/tokens.md +16 -0
  143. package/skills/cds-builder/references/components/cds-list/api.md +329 -0
  144. package/skills/cds-builder/references/components/cds-list/examples.md +653 -0
  145. package/skills/cds-builder/references/components/cds-list/guidelines.md +10 -0
  146. package/skills/cds-builder/references/components/cds-list/tokens.md +125 -0
  147. package/skills/cds-builder/references/components/cds-loader/api.md +18 -0
  148. package/skills/cds-builder/references/components/cds-loader/examples.md +59 -0
  149. package/skills/cds-builder/references/components/cds-loader/tokens.md +50 -0
  150. package/skills/cds-builder/references/components/cds-main/api.md +14 -0
  151. package/skills/cds-builder/references/components/cds-main/examples.md +60 -0
  152. package/skills/cds-builder/references/components/cds-menu/api.md +84 -0
  153. package/skills/cds-builder/references/components/cds-menu/examples.md +595 -0
  154. package/skills/cds-builder/references/components/cds-menu/guidelines.md +10 -0
  155. package/skills/cds-builder/references/components/cds-menu/tokens.md +19 -0
  156. package/skills/cds-builder/references/components/cds-messages/api.md +29 -0
  157. package/skills/cds-builder/references/components/cds-messages/examples.md +119 -0
  158. package/skills/cds-builder/references/components/cds-messages/tokens.md +15 -0
  159. package/skills/cds-builder/references/components/cds-modal/api.md +86 -0
  160. package/skills/cds-builder/references/components/cds-modal/examples.md +516 -0
  161. package/skills/cds-builder/references/components/cds-modal/guidelines.md +10 -0
  162. package/skills/cds-builder/references/components/cds-modal/tokens.md +22 -0
  163. package/skills/cds-builder/references/components/cds-notification/api.md +46 -0
  164. package/skills/cds-builder/references/components/cds-notification/examples.md +314 -0
  165. package/skills/cds-builder/references/components/cds-notification/guidelines.md +10 -0
  166. package/skills/cds-builder/references/components/cds-notification/tokens.md +23 -0
  167. package/skills/cds-builder/references/components/cds-notification-alert/api.md +93 -0
  168. package/skills/cds-builder/references/components/cds-notification-alert/examples.md +202 -0
  169. package/skills/cds-builder/references/components/cds-notification-alert/tokens.md +15 -0
  170. package/skills/cds-builder/references/components/cds-otp-input/api.md +106 -0
  171. package/skills/cds-builder/references/components/cds-otp-input/examples.md +329 -0
  172. package/skills/cds-builder/references/components/cds-otp-input/guidelines.md +10 -0
  173. package/skills/cds-builder/references/components/cds-otp-input/tokens.md +41 -0
  174. package/skills/cds-builder/references/components/cds-overlay/api.md +85 -0
  175. package/skills/cds-builder/references/components/cds-overlay/examples.md +409 -0
  176. package/skills/cds-builder/references/components/cds-overlay/guidelines.md +9 -0
  177. package/skills/cds-builder/references/components/cds-overlay/tokens.md +12 -0
  178. package/skills/cds-builder/references/components/cds-page/api.md +21 -0
  179. package/skills/cds-builder/references/components/cds-page/examples.md +123 -0
  180. package/skills/cds-builder/references/components/cds-pagination/api.md +67 -0
  181. package/skills/cds-builder/references/components/cds-pagination/examples.md +320 -0
  182. package/skills/cds-builder/references/components/cds-pagination/guidelines.md +10 -0
  183. package/skills/cds-builder/references/components/cds-pagination/tokens.md +20 -0
  184. package/skills/cds-builder/references/components/cds-progress-bar/api.md +53 -0
  185. package/skills/cds-builder/references/components/cds-progress-bar/examples.md +393 -0
  186. package/skills/cds-builder/references/components/cds-progress-bar/guidelines.md +10 -0
  187. package/skills/cds-builder/references/components/cds-progress-bar/tokens.md +33 -0
  188. package/skills/cds-builder/references/components/cds-progress-circle/api.md +30 -0
  189. package/skills/cds-builder/references/components/cds-progress-circle/examples.md +326 -0
  190. package/skills/cds-builder/references/components/cds-progress-circle/guidelines.md +10 -0
  191. package/skills/cds-builder/references/components/cds-progress-circle/tokens.md +31 -0
  192. package/skills/cds-builder/references/components/cds-radio/api.md +47 -0
  193. package/skills/cds-builder/references/components/cds-radio/tokens.md +36 -0
  194. package/skills/cds-builder/references/components/cds-radio-group/api.md +87 -0
  195. package/skills/cds-builder/references/components/cds-radio-group/examples.md +320 -0
  196. package/skills/cds-builder/references/components/cds-radio-group/guidelines.md +10 -0
  197. package/skills/cds-builder/references/components/cds-radio-group/tokens.md +14 -0
  198. package/skills/cds-builder/references/components/cds-responsive/api.md +29 -0
  199. package/skills/cds-builder/references/components/cds-responsive/examples.md +271 -0
  200. package/skills/cds-builder/references/components/cds-responsive/guidelines.md +10 -0
  201. package/skills/cds-builder/references/components/cds-responsive/tokens.md +13 -0
  202. package/skills/cds-builder/references/components/cds-select/api.md +155 -0
  203. package/skills/cds-builder/references/components/cds-select/examples.md +794 -0
  204. package/skills/cds-builder/references/components/cds-select/guidelines.md +10 -0
  205. package/skills/cds-builder/references/components/cds-select/tokens.md +17 -0
  206. package/skills/cds-builder/references/components/cds-selection-control/api.md +60 -0
  207. package/skills/cds-builder/references/components/cds-selection-control/examples.md +468 -0
  208. package/skills/cds-builder/references/components/cds-selection-control-group/api.md +45 -0
  209. package/skills/cds-builder/references/components/cds-selection-control-group/examples.md +349 -0
  210. package/skills/cds-builder/references/components/cds-skeleton-loader/api.md +30 -0
  211. package/skills/cds-builder/references/components/cds-skeleton-loader/examples.md +297 -0
  212. package/skills/cds-builder/references/components/cds-skeleton-loader/guidelines.md +10 -0
  213. package/skills/cds-builder/references/components/cds-skeleton-loader/tokens.md +62 -0
  214. package/skills/cds-builder/references/components/cds-slide-group/api.md +76 -0
  215. package/skills/cds-builder/references/components/cds-slide-group/examples.md +304 -0
  216. package/skills/cds-builder/references/components/cds-slide-group/guidelines.md +9 -0
  217. package/skills/cds-builder/references/components/cds-slide-group/tokens.md +11 -0
  218. package/skills/cds-builder/references/components/cds-slide-view/api.md +88 -0
  219. package/skills/cds-builder/references/components/cds-slide-view/examples.md +311 -0
  220. package/skills/cds-builder/references/components/cds-slide-view/guidelines.md +9 -0
  221. package/skills/cds-builder/references/components/cds-slide-view/tokens.md +14 -0
  222. package/skills/cds-builder/references/components/cds-stages/api.md +31 -0
  223. package/skills/cds-builder/references/components/cds-stages/examples.md +230 -0
  224. package/skills/cds-builder/references/components/cds-stages/guidelines.md +10 -0
  225. package/skills/cds-builder/references/components/cds-stages/tokens.md +27 -0
  226. package/skills/cds-builder/references/components/cds-status/api.md +24 -0
  227. package/skills/cds-builder/references/components/cds-status/examples.md +170 -0
  228. package/skills/cds-builder/references/components/cds-status/guidelines.md +10 -0
  229. package/skills/cds-builder/references/components/cds-status/tokens.md +17 -0
  230. package/skills/cds-builder/references/components/cds-steps/api.md +176 -0
  231. package/skills/cds-builder/references/components/cds-steps/examples.md +320 -0
  232. package/skills/cds-builder/references/components/cds-steps/guidelines.md +10 -0
  233. package/skills/cds-builder/references/components/cds-steps/tokens.md +52 -0
  234. package/skills/cds-builder/references/components/cds-surface/api.md +30 -0
  235. package/skills/cds-builder/references/components/cds-surface/examples.md +106 -0
  236. package/skills/cds-builder/references/components/cds-table/api.md +120 -0
  237. package/skills/cds-builder/references/components/cds-table/examples.md +3049 -0
  238. package/skills/cds-builder/references/components/cds-table/guidelines.md +10 -0
  239. package/skills/cds-builder/references/components/cds-table/tokens.md +92 -0
  240. package/skills/cds-builder/references/components/cds-tabs/api.md +179 -0
  241. package/skills/cds-builder/references/components/cds-tabs/examples.md +610 -0
  242. package/skills/cds-builder/references/components/cds-tabs/guidelines.md +10 -0
  243. package/skills/cds-builder/references/components/cds-tabs/tokens.md +40 -0
  244. package/skills/cds-builder/references/components/cds-tag/api.md +64 -0
  245. package/skills/cds-builder/references/components/cds-tag/examples.md +278 -0
  246. package/skills/cds-builder/references/components/cds-tag/guidelines.md +10 -0
  247. package/skills/cds-builder/references/components/cds-tag/tokens.md +67 -0
  248. package/skills/cds-builder/references/components/cds-tag-group/api.md +58 -0
  249. package/skills/cds-builder/references/components/cds-tag-group/examples.md +346 -0
  250. package/skills/cds-builder/references/components/cds-tag-group/guidelines.md +10 -0
  251. package/skills/cds-builder/references/components/cds-tag-group/tokens.md +18 -0
  252. package/skills/cds-builder/references/components/cds-text-area/api.md +113 -0
  253. package/skills/cds-builder/references/components/cds-text-area/examples.md +327 -0
  254. package/skills/cds-builder/references/components/cds-text-area/guidelines.md +10 -0
  255. package/skills/cds-builder/references/components/cds-text-area/tokens.md +16 -0
  256. package/skills/cds-builder/references/components/cds-text-input/api.md +115 -0
  257. package/skills/cds-builder/references/components/cds-text-input/examples.md +546 -0
  258. package/skills/cds-builder/references/components/cds-text-input/guidelines.md +10 -0
  259. package/skills/cds-builder/references/components/cds-text-input/tokens.md +17 -0
  260. package/skills/cds-builder/references/components/cds-time-picker/api.md +44 -0
  261. package/skills/cds-builder/references/components/cds-time-picker/examples.md +407 -0
  262. package/skills/cds-builder/references/components/cds-time-picker/guidelines.md +10 -0
  263. package/skills/cds-builder/references/components/cds-time-picker/tokens.md +23 -0
  264. package/skills/cds-builder/references/components/cds-toast/api.md +97 -0
  265. package/skills/cds-builder/references/components/cds-toast/examples.md +296 -0
  266. package/skills/cds-builder/references/components/cds-toast/guidelines.md +10 -0
  267. package/skills/cds-builder/references/components/cds-toast/tokens.md +26 -0
  268. package/skills/cds-builder/references/components/cds-toast-queue/api.md +86 -0
  269. package/skills/cds-builder/references/components/cds-toast-queue/examples.md +227 -0
  270. package/skills/cds-builder/references/components/cds-toggle/api.md +97 -0
  271. package/skills/cds-builder/references/components/cds-toggle/examples.md +335 -0
  272. package/skills/cds-builder/references/components/cds-toggle/guidelines.md +10 -0
  273. package/skills/cds-builder/references/components/cds-toggle/tokens.md +91 -0
  274. package/skills/cds-builder/references/components/cds-toolbar/api.md +44 -0
  275. package/skills/cds-builder/references/components/cds-toolbar/examples.md +186 -0
  276. package/skills/cds-builder/references/components/cds-toolbar/guidelines.md +9 -0
  277. package/skills/cds-builder/references/components/cds-toolbar/tokens.md +13 -0
  278. package/skills/cds-builder/references/components/cds-tooltip/api.md +83 -0
  279. package/skills/cds-builder/references/components/cds-tooltip/examples.md +321 -0
  280. package/skills/cds-builder/references/components/cds-tooltip/guidelines.md +10 -0
  281. package/skills/cds-builder/references/components/cds-tooltip/tokens.md +25 -0
  282. package/skills/cds-builder/references/components/cds-tree/api.md +169 -0
  283. package/skills/cds-builder/references/components/cds-tree/examples.md +785 -0
  284. package/skills/cds-builder/references/components/cds-tree/guidelines.md +10 -0
  285. package/skills/cds-builder/references/components/cds-tree/tokens.md +39 -0
  286. package/skills/cds-builder/references/components/cds-uploader/api.md +105 -0
  287. package/skills/cds-builder/references/components/cds-uploader/examples.md +553 -0
  288. package/skills/cds-builder/references/components/cds-uploader/guidelines.md +10 -0
  289. package/skills/cds-builder/references/components/cds-uploader/tokens.md +26 -0
  290. package/skills/cds-builder/references/components/cds-virtual-scroll/api.md +60 -0
  291. package/skills/cds-builder/references/components/cds-virtual-scroll/examples.md +272 -0
  292. package/skills/cds-builder/references/components/cds-virtual-scroll/guidelines.md +9 -0
  293. package/skills/cds-builder/references/components/cds-virtual-scroll/tokens.md +13 -0
  294. package/skills/cds-builder/references/guides/conventions.md +48 -0
  295. package/skills/cds-builder/references/guides/date-utils.md +301 -0
  296. package/skills/cds-builder/references/guides/display-and-platform.md +263 -0
  297. package/skills/cds-builder/references/guides/forms.md +77 -0
  298. package/skills/cds-builder/references/guides/global-configuration.md +354 -0
  299. package/skills/cds-builder/references/guides/icons.md +172 -0
  300. package/skills/cds-builder/references/guides/internationalization.md +470 -0
  301. package/skills/cds-builder/references/guides/migration-cds3-to-cds4.md +49 -0
  302. package/skills/cds-builder/references/guides/sass-variables.md +238 -0
  303. package/skills/cds-builder/references/guides/setup.md +81 -0
  304. package/skills/cds-builder/references/guides/tailwindcss.md +93 -0
  305. package/skills/cds-builder/references/guides/theme.md +343 -0
  306. package/skills/cds-builder/references/guides/treeshaking.md +237 -0
  307. package/skills/cds-builder/references/patterns/dialogs.md +89 -0
  308. package/skills/cds-builder/references/patterns/forms.md +101 -0
  309. package/skills/cds-builder/references/patterns/page-layout.md +78 -0
  310. package/skills/cds-builder/references/patterns/tables.md +87 -0
  311. package/skills/cds-builder/references/tokens/colors.md +507 -0
  312. package/skills/cds-builder/references/tokens/themes.md +981 -0
  313. package/skills/cds-builder/scripts/check-contracts.mjs +264 -0
  314. package/skills/cds-migrate/GENERATION.md +44 -0
  315. package/skills/cds-migrate/SKILL.md +160 -0
  316. package/skills/cds-migrate/references/migration-full.md +2225 -0
  317. package/skills/cds-refactor/GENERATION.md +44 -0
  318. package/skills/cds-refactor/SKILL.md +187 -0
  319. package/skills/cds-refactor/references/html-to-cds.md +80 -0
  320. package/skills/cds-refactor/references/review-checklist.md +73 -0
  321. package/skills/cds-refactor/references/tailwind-to-cds.md +65 -0
@@ -0,0 +1,2225 @@
1
+ # CDS 3 → CDS 4 migration — full guide
2
+
3
+ > Copy of `MIGRATION.md` from the `@central-design-system/components` npm package,
4
+ > taken by `bun run generate:skill`. Do not edit manually. The guide itself is
5
+ > currently in Russian; an English mirror does not exist yet.
6
+
7
+ # Миграция на CDS 4
8
+
9
+ `@central-design-system/components` v4 — мажорное обновление дизайн-системы.
10
+ Этот документ — **живой** migration guide: записи добавляются по мере появления
11
+ breaking-изменений в alpha/beta релизах CDS 4.
12
+
13
+ > Версии: CDS 3 — `3.10.1` (стабильная), CDS 4 — `4.0.0-alpha.4` (в разработке).
14
+
15
+ ## Как читать этот документ
16
+
17
+ - Каждая запись имеет **severity** (см. ниже). Сначала разбирайтесь с `BREAKING`,
18
+ затем с `RENAMED`, затем с `DEPRECATED`.
19
+ - Записи сгруппированы по **категориям** (Архитектура, Иконки, …). Изменения
20
+ по конкретным компонентам — в разделе [Компоненты](#8-компоненты).
21
+ - Каждая запись содержит блоки **Было (CDS 3)** и **Стало (CDS 4)** с примерами
22
+ кода и поле **Действие** — конкретный шаг миграции.
23
+ - При запуске приложения смотрите на консольные `[CDS UPGRADE]` warnings —
24
+ они подсказывают точки миграции в рантайме
25
+ (реализация: `src/utils/dom/warn.ts → deprecate()`).
26
+
27
+ ## Легенда severity
28
+
29
+ | Маркер | Что значит |
30
+ | --- | --- |
31
+ | ⚠️ **BREAKING** | Ломает существующий код — обязательное действие. |
32
+ | 🔁 **RENAMED** | Переименование (частный случай breaking) — механический поиск/замена. |
33
+ | 🟠 **DEPRECATED** | Работает в 4.x, будет удалено в 5.x. Желательно обновить. |
34
+ | ✨ **NEW** | Новая возможность без ломки. Информативно. |
35
+
36
+ ## Оглавление
37
+
38
+ - [Быстрый чек-лист](#быстрый-чек-лист)
39
+ - [1. Архитектура](#1-архитектура)
40
+ - [2. Иконки](#2-иконки)
41
+ - [3. Пропсы](#3-пропсы)
42
+ - [4. Стили и токены](#4-стили-и-токены)
43
+ - [5. Композаблы](#5-композаблы)
44
+ - [6. Hooks](#6-hooks)
45
+ - [7. Сборка и экспорты](#7-сборка-и-экспорты)
46
+ - [8. Компоненты](#8-компоненты)
47
+
48
+ <a id="быстрый-чек-лист"></a>
49
+
50
+ ## Быстрый чек-лист
51
+
52
+ - ✅ Прочитать раздел [«Архитектура»](#1-архитектура) — публичный API инициализации мог измениться.
53
+ - ✅ Если используете `@central-design-system/icons` — см. раздел [«Иконки»](#2-иконки) (есть legacy-режим).
54
+ - ✅ Проверить [индекс изменений по компонентам](#индекс-изменений-по-компонентам).
55
+ - ✅ Прогнать сборку приложения и проверить консоль: `[CDS UPGRADE]` warnings указывают на устаревшие пропсы.
56
+
57
+ ---
58
+
59
+ <a id="1-архитектура"></a>
60
+
61
+ ## 1. Архитектура
62
+
63
+ Сюда попадают изменения публичного API инициализации (`createCds`),
64
+ DI через `provide/inject`, точек входа и общих принципов работы фреймворка.
65
+
66
+ ### Библиотека переписана на новую архитектуру (JSX, `propsFactory`, `composables` / `hooks`)
67
+
68
+ > ✨ **NEW** — внутренняя архитектура CDS 4 переписана с нуля. На публичный API компонентов это, как правило, не влияет, но меняет способ расширения библиотеки и пути «глубоких» импортов.
69
+
70
+ **Было (CDS 3):**
71
+
72
+ ```ts
73
+ // CDS 3 — SFC на <template>, пропсы inline, композаблы в composable/ (ед. ч.)
74
+ import { createCds, components, directives, plugin, utils } from '@central-design-system/components';
75
+ import { useTheme } from '@central-design-system/components'; // из ./composable
76
+ import { CdsTransitionFade } from '@central-design-system/components'; // из ./transitions
77
+ ```
78
+
79
+ **Стало (CDS 4):**
80
+
81
+ ```ts
82
+ // CDS 4 — компоненты на JSX defineRender + propsFactory,
83
+ // композаблы в composables/ (мн. ч.), низкоуровневые примитивы в hooks/
84
+ import { createCds, utils } from '@central-design-system/components';
85
+ import { useTheme } from '@central-design-system/components'; // из ./composables
86
+ import { CdsTransitionFade } from '@central-design-system/components'; // из ./transitions
87
+ import { createContext, useResizeObserver } from '@central-design-system/components'; // ./hooks
88
+
89
+ // Внутри пакета — alias @cds/* (@cds/composables/useTheme, @cds/core, @cds/utils)
90
+ ```
91
+
92
+ **Действие:** для обычного использования компонентов миграция не требуется. Если вы импортировали внутренние сущности напрямую — учтите: каталог `composable/` переименован в `composables/`, добавлен слой `hooks/`. Namespace `utils` и плоские экспорты `transitions` (`CdsTransitionFade`, …) сохранены как в CDS 3; убран только корневой реэкспорт `plugin`. Пропсы компонентов теперь собираются фабриками `propsFactory` (`@cds/core`), рендер — через `defineRender(() => <jsx/>)`.
93
+
94
+ <!-- entry-meta: id=architecture-library-rewrite; severity=new; component= -->
95
+
96
+ ### `createCds`: новые опции `defaults`, `blueprint`, `goTo`, `aliases`
97
+
98
+ > ✨ **NEW** — фабрика `createCds` получила новые подсистемы конфигурации. Все они аддитивны — существующий вызов `createCds()` продолжает работать.
99
+
100
+ **Было (CDS 3):**
101
+
102
+ ```ts
103
+ // CDS 3 — ICdsOptions: components, directives, icons, illustrations,
104
+ // display, theme, cssGrid, ssr, locale, teleport
105
+ import { createCds } from '@central-design-system/components';
106
+
107
+ app.use(createCds({
108
+ theme: { defaultTheme: 'light' },
109
+ locale: 'ru',
110
+ }));
111
+ ```
112
+
113
+ **Стало (CDS 4):**
114
+
115
+ ```ts
116
+ // CDS 4 — добавлены defaults, blueprint, goTo, aliases
117
+ import { createCds } from '@central-design-system/components';
118
+
119
+ app.use(createCds({
120
+ // Глобальные дефолты пропсов компонентов.
121
+ // Локально переопределяются компонентом <CdsDefaultsProvider>.
122
+ defaults: {
123
+ global: { rounded: 'md' },
124
+ CdsButton: { appearance: 'secondary' },
125
+ },
126
+ // Пресет конфигурации: базовый набор опций, поверх которого мержится остальное.
127
+ blueprint: { theme: { defaultTheme: 'light' } },
128
+ // Подсистема программной прокрутки (composable useGoTo).
129
+ goTo: { duration: 300, offset: 0 },
130
+ }));
131
+ ```
132
+
133
+ **Действие:** миграция не требуется. Новое: `defaults` задаёт глобальные значения пропсов (переопределяются компонентом `CdsDefaultsProvider` и composable `useDefaults`); `blueprint` — пресет опций, на который накладывается остальная конфигурация (`mergeDeep(blueprint, rest)`); `goTo` — программная прокрутка через `useGoTo`; `aliases` — регистрация компонентов-алиасов. Символы DI: `DefaultsSymbol`, `GoToSymbol`, `IconSymbol` (см. `src/cds.ts`).
134
+
135
+ <!-- entry-meta: id=architecture-createcds-new-options; severity=new; component= -->
136
+
137
+ ### Глобальная опция `createCds({ teleport })` удалена
138
+
139
+ > ⚠️ **BREAKING** — глобальная конфигурация телепорта всплывающих компонентов (`teleport` → `TeleportSymbol`) убрана из `createCds`. Цель телепорта теперь задаётся per-component через пропсы `attach` / `contained`.
140
+
141
+ **Было (CDS 3):**
142
+
143
+ ```ts
144
+ // CDS 3 — глобально для всех оверлеев (модалки, тултипы, меню, тосты)
145
+ import { createCds } from '@central-design-system/components';
146
+
147
+ app.use(createCds({
148
+ teleport: {
149
+ target: document.getElementById('app')!,
150
+ contained: false,
151
+ root: false,
152
+ containerClassName: 'cds-overlay-container',
153
+ },
154
+ }));
155
+ ```
156
+
157
+ **Стало (CDS 4):**
158
+
159
+ ```html
160
+ <!-- CDS 4 — цель телепорта указывается на конкретном компоненте -->
161
+ <CdsModal v-model="modal" attach="#app">…</CdsModal>
162
+ <CdsTooltip contained text="Подсказка">…</CdsTooltip>
163
+ ```
164
+
165
+ **Действие:** удалить опцию `teleport` из `createCds()`. Там, где нужен нестандартный контейнер телепорта, задать проп `attach` (`boolean | string | Element`) или `contained` на самих оверлейных компонентах (`CdsOverlay` и производные: `CdsModal`, `CdsTooltip`, `CdsMenu`, `CdsDrawer` и т. д.). Поиск: `grep -rn "teleport" src/` в местах вызова `createCds`.
166
+
167
+ <!-- entry-meta: id=architecture-teleport-option-removed; severity=breaking; component= -->
168
+
169
+ ### Опция `locale` стала объектом `LocaleOptions` (+ RTL)
170
+
171
+ > ⚠️ **BREAKING** — в CDS 3 `locale` принимал строку (`'ru'`) или объект `ILocale`. В CDS 4 это объект `LocaleOptions & RtlOptions` с полем `locale`, сообщениями, fallback и настройкой RTL.
172
+
173
+ **Было (CDS 3):**
174
+
175
+ ```ts
176
+ // CDS 3 — locale: TAvailableLocale | ILocale (по умолчанию строка 'ru')
177
+ import { createCds } from '@central-design-system/components';
178
+
179
+ app.use(createCds({
180
+ locale: 'ru',
181
+ }));
182
+ ```
183
+
184
+ **Стало (CDS 4):**
185
+
186
+ ```ts
187
+ // CDS 4 — locale: LocaleOptions & RtlOptions
188
+ import { createCds } from '@central-design-system/components';
189
+
190
+ app.use(createCds({
191
+ locale: {
192
+ locale: 'ru',
193
+ fallback: 'en',
194
+ messages: { /* переопределения строк */ },
195
+ rtl: { ar: true },
196
+ },
197
+ }));
198
+ ```
199
+
200
+ **Действие:** заменить строковое значение `locale: 'ru'` на объект `locale: { locale: 'ru' }`. Полный набор полей: `locale`, `fallback`, `messages`, `decimalSeparator`, `adapter`, `rtl` (см. `LocaleOptions` / `RtlOptions` в `src/composables/useLocale/internal/useLocale.types.ts`). Доступ в рантайме — через composable `useLocale`. Поиск: `grep -rn "createCds" src/` и проверить поле `locale`.
201
+
202
+ <!-- entry-meta: id=architecture-locale-options-object; severity=breaking; component= -->
203
+
204
+ ---
205
+
206
+ <a id="2-иконки"></a>
207
+
208
+ ## 2. Иконки
209
+
210
+ ### Пакет `@central-design-system/icons` помечен deprecated
211
+
212
+ > 🟠 **DEPRECATED** — пакет продолжает работать через legacy-режим, но будет удалён в будущих версиях.
213
+
214
+ **Было (CDS 3):**
215
+
216
+ ```ts
217
+ // CDS 3
218
+ import * as legacyIcons from '@central-design-system/icons';
219
+ import { createCds } from '@central-design-system/components';
220
+
221
+ createCds({
222
+ icons: legacyIcons
223
+ });
224
+ ```
225
+
226
+ **Стало (CDS 4):**
227
+
228
+ ```ts
229
+ // CDS 4
230
+ import { createCds } from '@central-design-system/components';
231
+
232
+ // Дефолт — встроенный iconpack `cds`.
233
+ createCds({
234
+ icons: {
235
+ defaultSet: 'cds'
236
+ }
237
+ });
238
+ ```
239
+
240
+ В рантайме при старом подключении в dev-консоли появится:
241
+
242
+ ```
243
+ [CDS UPGRADE] '@central-design-system/icons' is deprecated and will be removed in future. Please use modern icons instead.
244
+ ```
245
+
246
+ (см. `src/icons.ts`, ветка `Symbol.toStringTag === 'Module'`).
247
+
248
+ **Действие:** перейти на новые icon packs через опцию `createCds({ icons })`.
249
+ Если миграция постепенная — можно временно использовать поле `legacyIcons`
250
+ (см. `InternalIconOptions` в `src/composables/useIcons/internal/useIcons.types.ts`),
251
+ оно специально оставлено на переходный период и будет удалено в будущих версиях.
252
+
253
+ <!-- entry-meta: id=icons-legacy-package-deprecated; severity=deprecation; component= -->
254
+
255
+ ### Новая фабрика `createIcons` и iconpacks
256
+
257
+ > ✨ **NEW**
258
+
259
+ В CDS 4 иконки конфигурируются через явную фабрику `createIcons`,
260
+ понимающую концепцию **iconpack**. Готовые наборы лежат в
261
+ `src/assets/icons/`: `cds` (по умолчанию), `cdsLegacy` (для совместимости),
262
+ `carbon`, `lucide`, `phosphor`, `remix`. Это позволяет смешивать наборы и
263
+ переопределять алиасы под продукт.
264
+
265
+ **Было (CDS 3):**
266
+
267
+ ```ts
268
+ // CDS 3
269
+ import * as icons from '@central-design-system/icons';
270
+ import { createCds } from '@central-design-system/components';
271
+
272
+ createCds({ icons });
273
+ ```
274
+
275
+ **Стало (CDS 4):**
276
+
277
+ ```ts
278
+ // CDS 4
279
+ import { createCds, iconsets } from '@central-design-system/components';
280
+
281
+ createCds({
282
+ icons: {
283
+ defaultSet: 'remix',
284
+ sets: { remix: iconsets.remix.icons, },
285
+ aliases: iconsets.remix.aliases,
286
+ }
287
+ });
288
+ ```
289
+
290
+ **Действие:** ознакомиться с [Icons Installation](/docs/icons-installation--docs)
291
+ и выбрать iconpack под продукт. По умолчанию активен набор `cds` с алиасами
292
+ из `src/assets/icons/cds.ts`.
293
+
294
+ <!-- entry-meta: id=icons-createicons-factory; severity=new; component= -->
295
+
296
+ ---
297
+
298
+ <a id="3-пропсы"></a>
299
+
300
+ ## 3. Пропсы
301
+
302
+ Сюда попадают общие изменения системы пропсов (фабрики
303
+ `defineXProps()` через `propsFactory`, новые композаблы пропсов).
304
+ Точечные переименования у конкретных компонентов — в разделе [Компоненты](#8-компоненты).
305
+
306
+ _Пока изменений нет. Записи будут добавляться по мере появления breaking-изменений._
307
+
308
+ ---
309
+
310
+ <a id="4-стили-и-токены"></a>
311
+
312
+ ## 4. Стили и токены
313
+
314
+ Сюда попадают изменения CSS-токенов (2 уровня), CSS Layers (ITCSS),
315
+ интеграции с Tailwind, публичных импортов `./styles/...`.
316
+
317
+ ### Изменён путь импорта CSS
318
+
319
+ > ⚠️ **BREAKING** — собранный `dist/cds.css` больше не является публичной точкой входа.
320
+
321
+ **Было (CDS 3):**
322
+
323
+ ```ts
324
+ // CDS 3
325
+ import '@central-design-system/components/dist/cds.css';
326
+ ```
327
+
328
+ **Стало (CDS 4):**
329
+
330
+ ```ts
331
+ // CDS 4
332
+ import '@central-design-system/components/styles';
333
+ ```
334
+
335
+ **Действие:** заменить во всех приложениях-потребителях импорт `@central-design-system/components/dist/cds.css` на `@central-design-system/components/styles`. Поиск: `grep -rn "@central-design-system/components/dist/cds.css" .`.
336
+
337
+ <!-- entry-meta: id=styles-css-import-path; severity=breaking; component= -->
338
+
339
+ ### Legacy reset вынесен в опциональный флаг
340
+
341
+ > ⚠️ **BREAKING** — `styles/utilities/legacy/legacy.scss` теперь содержит только утилитарные классы (display / layout / spacing / flexbox / typography); глобальный reset из CDS 3 больше не подключается по умолчанию.
342
+
343
+ **Было (CDS 3):**
344
+
345
+ ```scss
346
+ // CDS 3 — legacy.scss тянул за собой полный глобальный reset
347
+ // (box-sizing, обнуление margin, list-style, media-query'и и т.д.)
348
+ // автоматически при подключении стилей CDS.
349
+ @use '@central-design-system/components/styles';
350
+ ```
351
+
352
+ **Стало (CDS 4):**
353
+
354
+ ```scss
355
+ // CDS 4 — legacy.scss содержит только утилиты; старый reset вынесен
356
+ // в generic/_legacy-reset.scss и выключен по умолчанию.
357
+ // Чтобы вернуть поведение CDS 3, передайте $legacy-reset через with():
358
+ @use '@central-design-system/components/styles' with (
359
+ $legacy-reset: true
360
+ );
361
+ ```
362
+
363
+ **Действие:** если приложение полагалось на глобальный reset из CDS 3 (обнулённые `margin`, `list-style: none`, `box-sizing: border-box` на `*` и т.д.) — включите его явно через `$legacy-reset: true` в `settings` (см. `src/styles/settings/_variables.scss`). Иначе — проверьте вёрстку и доверьтесь нативным дефолтам браузера.
364
+
365
+ <!-- entry-meta: id=styles-legacy-reset-opt-in; severity=breaking; component= -->
366
+
367
+ ### CSS-архитектура переписана на ITCSS + CSS Layers
368
+
369
+ > ⚠️ **BREAKING** — порядок каскада теперь определяется нативными `@layer`. Глобальные переопределения стилей CDS, написанные без `!important`, могут сработать иначе.
370
+
371
+ **Было (CDS 3):**
372
+
373
+ ```scss
374
+ // CDS 3 — плоская структура без cascade layers.
375
+ // Все стили компонентов и утилит грузились в обычный каскад,
376
+ // побеждал последний по специфичности / порядку импорта.
377
+ @import '@central-design-system/components/dist/cds.css';
378
+
379
+ // Переопределение приходилось делать через повышение специфичности
380
+ // или !important:
381
+ .cds-button { color: red !important; }
382
+ ```
383
+
384
+ **Стало (CDS 4):**
385
+
386
+ ```scss
387
+ // CDS 4 — ITCSS + нативные CSS Layers.
388
+ // Каскад: cds-core → cds-components → cds-overrides → cds-utilities,
389
+ // см. src/styles/generic/_layers.scss.
390
+ @use '@central-design-system/components/styles';
391
+
392
+ @layer cds-overrides {
393
+ .cds-button { color: red; }
394
+ }
395
+ ```
396
+
397
+ **Действие:** ознакомиться с [ITCSS](https://developer.helpscout.com/seed/glossary/itcss/) и порядком слоёв в `src/styles/generic/_layers.scss` (`cds-core` → `cds-components` → `cds-overrides` → `cds-utilities` c вложенными `theme-base`, `helpers`, `grid`, `tailwind`, `theme-background`, `theme-foreground`). Проверьте свои глобальные переопределения CDS — если они были написаны без `!important` и полагались на порядок импорта, теперь они **гарантированно** перебивают `@layer cds-components`. Для контролируемого переопределения используйте слой `cds-overrides` (через `@include tools.layer('overrides') { … }`) — он специально расположен между компонентами и утилитами.
398
+
399
+ <!-- entry-meta: id=styles-itcss-css-layers-architecture; severity=breaking; component= -->
400
+
401
+ ### Утилитарные классы CDS 3 отключены по умолчанию
402
+
403
+ > ⚠️ **BREAKING** — классы `cds-flex`, `cds-flex-col`, `cds-px-4`, `cds-my-*`, цветов, типографики и т. п. больше не подключаются автоматически.
404
+
405
+ **Было (CDS 3):**
406
+
407
+ ```ts
408
+ // CDS 3
409
+ import '@central-design-system/components/dist/cds.css';
410
+ import { createCds } from '@central-design-system/components';
411
+
412
+ app.use(createCds());
413
+ ```
414
+
415
+ ```vue
416
+ <!-- CDS 3 -->
417
+ <div class="cds-flex cds-flex-col cds-px-4">…</div>
418
+ ```
419
+
420
+ **Стало (CDS 4):**
421
+
422
+ ```ts
423
+ // CDS 4 — временно включить легаси-утилиты на период миграции
424
+ import '@central-design-system/components/styles';
425
+ import '@central-design-system/components/styles/legacy';
426
+ import { createCds } from '@central-design-system/components';
427
+
428
+ app.use(createCds({
429
+ theme: { legacyClasses: true },
430
+ }));
431
+ ```
432
+
433
+ **Действие:** мигрировать на Tailwind CSS v4 (см. запись «Интеграция с Tailwind CSS v4» ниже). На переходный период включите легаси-утилиты комбинацией `theme: { legacyClasses: true }` в `createCds()` + импорт `@central-design-system/components/styles/legacy`. Источник: `src/styles/utilities/legacy/legacy.scss` (display, layout, spacing, flexbox, typography).
434
+
435
+ <!-- entry-meta: id=styles-legacy-utilities-disabled; severity=breaking; component= -->
436
+
437
+ ### Интеграция с Tailwind CSS v4
438
+
439
+ > ✨ **NEW** — CDS из коробки поставляет конфигурацию Tailwind v4 с design-токенами как утилитарными классами.
440
+
441
+ **Было (CDS 3):**
442
+
443
+ ```vue
444
+ <!-- CDS 3 — собственные утилитарные классы CDS -->
445
+ <div class="cds-flex cds-flex-col cds-px-4 cds-text-surface-primary">…</div>
446
+ ```
447
+
448
+ **Стало (CDS 4):**
449
+
450
+ ```css
451
+ /* CDS 4 — main.css */
452
+ @import "@central-design-system/components/styles/tailwind";
453
+ @import "tailwindcss/theme" layer(cds-utilities.tailwind);
454
+ @import "tailwindcss/utilities" layer(cds-utilities.tailwind);
455
+ ```
456
+
457
+ ```vue
458
+ <!-- CDS 4 — Tailwind v4 + CDS-токены как утилиты -->
459
+ <div class="flex flex-col p-4 text-surface-primary">…</div>
460
+ ```
461
+
462
+ **Действие:** установить Tailwind CSS v4 по [официальной документации](https://tailwindcss.com/) и подключить конфигурацию `@central-design-system/components/styles/tailwind` — она расширяет тему Tailwind токенами CDS (`bg-surface-*`, `text-content-*`, `rounded-200`, …) и автоматически реагирует на смену темы. Отступы пишутся стандартной числовой шкалой Tailwind (`p-4`, `gap-2`) — шкала отступов CDS с ней совпадает.
463
+
464
+ <!-- entry-meta: id=styles-tailwind-v4-integration; severity=new; component= -->
465
+
466
+ ### Семантика миксина `cds-breakpoint-down` выровнена с JS `useDisplay`
467
+
468
+ > ⚠️ **BREAKING** — в CDS 3 SCSS-миксин `cds-breakpoint-down($name)` следовал конвенции «строго ниже начала брейкпоинта», а JS-composable `useDisplay` — конвенции «брейкпоинт и всё, что ниже». Из-за этого `cds-breakpoint-down('sm')` и `display.smDown` покрывали **разные** диапазоны (сдвиг на один брейкпоинт). В CDS 4 CSS выровнен под JS: `down('<name>')` теперь означает «`<name>` и ниже».
469
+
470
+ **Было (CDS 3):**
471
+
472
+ ```scss
473
+ // CDS 3 — max-width = ширина САМОГО брейкпоинта − 0.02 («строго ниже sm»)
474
+ // down('sm') → @media (max-width: 671.98px) // только диапазон xs
475
+ // down('md') → @media (max-width: 1055.98px) // xs + sm
476
+ // down('lg') → @media (max-width: 1311.98px) // xs + sm + md
477
+ // НЕ совпадает с JS: display.smDown === (width < 1056)
478
+ .card { @include cds-breakpoint-down(sm) { display: none; } }
479
+ ```
480
+
481
+ **Стало (CDS 4):**
482
+
483
+ ```scss
484
+ // CDS 4 — max-width = ширина СЛЕДУЮЩЕГО брейкпоинта − 0.02 («sm и ниже»)
485
+ // down('sm') → @media (max-width: 1055.98px) // xs + sm
486
+ // down('md') → @media (max-width: 1311.98px) // xs + sm + md
487
+ // down('lg') → @media (max-width: 1583.98px) // xs + sm + md + lg
488
+ // down('xl') → без media query (все ширины)
489
+ // Совпадает с JS: display.smDown === (width < 1056)
490
+ .card { @include cds-breakpoint-down(sm) { display: none; } }
491
+ ```
492
+
493
+ **Действие:** пройтись по использованиям `cds-breakpoint-down(...)` (и `cds-breakpoint-between(...)` с именованной нижней/верхней границей — она делегирует в тот же миксин). Если код полагался на старую логику «строго ниже названного брейкпоинта», сдвиньте аргумент на один вниз: старый `down('md')` ⇒ новый `down('sm')`, старый `down('lg')` ⇒ `down('md')` и т. д. Миксины `cds-breakpoint-up` / значения порогов (`320 / 672 / 1056 / 1312 / 1584`) не менялись. Поиск: `grep -rnE "cds-breakpoint-down\(" src/`.
494
+
495
+ <!-- entry-meta: id=styles-breakpoint-down-semantics; severity=breaking; component= -->
496
+
497
+ ### Сетка и брейкпоинты заданы в px вместо rem
498
+
499
+ > ⚠️ **BREAKING** — в CDS 3 вся геометрия сетки (`$grid-gutter`, `margin` и `width` брейкпоинтов) прогонялась через `convert.toRem` и зависела от размера корневого шрифта. В CDS 4 значения намеренно заданы в px: каркас страницы не зависит от `html { font-size }` хоста, а CSS-медиазапросы гарантированно совпадают с px-порогами JS-композабла `useDisplay` (rem в медиазапросах считается от настройки шрифта браузера и расходится с `window.innerWidth`).
500
+
501
+ **Было (CDS 3):**
502
+
503
+ ```scss
504
+ // CDS 3 — rem от корневого шрифта: хост с html { font-size: 14px }
505
+ // получал gutter 28px вместо 32px, а rem-медиазапросы срабатывали
506
+ // не там, где JS-логика в px
507
+ $grid-gutter: convert.toRem(32px); // 2rem
508
+ $grid-breakpoints: (
509
+ sm: (columns: 8, margin: convert.toRem(16px), width: convert.toRem(672px)),
510
+ // …
511
+ );
512
+ ```
513
+
514
+ **Стало (CDS 4):**
515
+
516
+ ```scss
517
+ // CDS 4 — px: геометрия сетки стабильна в любом хосте и совпадает
518
+ // с порогами useDisplay (320 / 672 / 1056 / 1312 / 1584)
519
+ $grid-gutter: 32px;
520
+ $grid-breakpoints: (
521
+ sm: (columns: 8, margin: 16px, width: 672px),
522
+ // …
523
+ );
524
+ ```
525
+
526
+ **Действие:** в большинстве приложений ничего делать не нужно — браузерный зум масштабирует px-макет целиком. Если хост менял `html { font-size }` в расчёте на масштабирование сетки, этот механизм больше не работает: сетка и брейкпоинты фиксированы, масштабируемый слой — rem-токены `--cds-spacing-*` (отступы контента и типографика).
527
+
528
+ <!-- entry-meta: id=styles-grid-px-instead-of-rem; severity=breaking; component= -->
529
+
530
+ ---
531
+
532
+ <a id="5-композаблы"></a>
533
+
534
+ ## 5. Композаблы
535
+
536
+ Сюда попадают изменения API композаблов (`useTheme`, `useIcons`, `useDisplay`,
537
+ `useLocale`, `useDefaults`, `useForm` и др.) и injection-системы
538
+ (`DefaultsSymbol`, `ThemeSymbol`, `IconSymbol`, …).
539
+
540
+ _Пока изменений нет. Записи будут добавляться по мере появления breaking-изменений._
541
+
542
+ ---
543
+
544
+ ## 6. Hooks
545
+
546
+ Сюда попадают изменения API хуков из `src/hooks/`
547
+ (`createContext`, `createObserver`, `createPlugin`, `createTrinity`,
548
+ `useHydration`, `useIntersectionObserver`, `useResizeObserver`).
549
+
550
+ _Пока изменений нет. Записи будут добавляться по мере появления breaking-изменений._
551
+
552
+ ---
553
+
554
+ <a id="7-сборка-и-экспорты"></a>
555
+
556
+ ## 7. Сборка и экспорты
557
+
558
+ Сюда попадают изменения целей сборки (CJS / ESM / MJS / IIFE / WC / Styles),
559
+ полей `exports` / `main` / `module` / `types` в `package.json`, путей
560
+ импортов `@central-design-system/components/...`.
561
+
562
+ _Пока изменений нет. Записи будут добавляться по мере появления breaking-изменений._
563
+
564
+ ---
565
+
566
+ <a id="8-компоненты"></a>
567
+
568
+ ## 8. Компоненты
569
+
570
+ Точечные изменения по конкретным компонентам: переименования пропсов,
571
+ удалённые слоты, изменения событий и т. п.
572
+
573
+ <a id="индекс-изменений-по-компонентам"></a>
574
+
575
+ ### Индекс изменений по компонентам
576
+
577
+ | Компонент | Изменения | Подробнее |
578
+ |------------------|--------------------------------------------------------------------------------------------|-----------------------------------|
579
+ | `CdsBadge` | 🔁 `count`→`content`, `limited`→`max`; ⚠️ удалён `invertColor`, изменён дефолт `inline` | [CdsBadge](#cdsbadge) |
580
+ | `CdsBreadcrumbsItem` | 🔁 `text`→`title`; ⚠️ удалён deprecated `currentPage` | [CdsBreadcrumbsItem](#cdsbreadcrumbsitem) |
581
+ | `CdsButton` | ⚠️ удалён автоматический отступ между соседними кнопками | [CdsButton](#cdsbutton) |
582
+ | `CdsCard` | ⚠️ удалены `interactive` / `selected` | [CdsCard](#cdscard) |
583
+ | `CdsCheckbox` | ⚠️ удалён `CdsCheckboxGroup`; ⚠️ изменён exposed-API | [CdsCheckbox](#cdscheckbox) |
584
+ | `CdsContentSwitcher` | ⚠️ Компонент удалён → `CdsTabs` / `CdsTab` | [CdsContentSwitcher](#cdscontentswitcher) |
585
+ | `CdsForm` | ⚠️ изменён exposed-API — убраны обёртки `form` / `formRef` | [CdsForm](#cdsform) |
586
+ | `CdsIcon` | ⚠️ удалён deprecated `invertColor` → цветовые пропсы `color` / `baseColor` / `textColor` | [CdsIcon](#cdsicon) |
587
+ | `CdsList` | ⚠️ удалён `invertColor`; `CdsListItem` — удалён `isClickable` (→ `link`) и изменён exposed-API; `CdsListGroup` — удалён слот `title`, проп `title` стал текстом активатора (статичная подпись → `CdsListSubheader`), изменён exposed-API; payload `click:open`/`click:select` без `event` | [CdsList](#cdslist) |
588
+ | `CdsModal` | ⚠️ удалены `loading` и `dismissBtn`; ⚠️ изменён exposed-API | [CdsModal](#cdsmodal) |
589
+ | `CdsNotification` | 🔁 `status="error"`→`"danger"`; ⚠️ удалён `customIcon`; ✨ `variant="flat"`, тень у `important`, `bgColor`/`textColor` | [CdsNotification](#cdsnotification) |
590
+ | `CdsNotificationAlert` | 🟠 Мост миграции на `CdsToast`; внутри `CdsNotification` (`variant="important"`); будет удалён | [CdsNotificationAlert](#cdsnotificationalert) |
591
+ | `CdsRadioButton` | 🔁 Переименован в `CdsRadioGroup`; ✨ новые пропсы | [CdsRadioButton](#cdsradiobutton) |
592
+ | `CdsDropdown` | 🔁 Переименован в `CdsSelect`; ⚠️ нативный `CdsSelect` (CDS 3) теперь через `native-select` | [CdsSelect](#cdsselect) |
593
+ | `CdsProgress` | 🔁 Переименован в `CdsProgressBar`; ✨ новые пропсы стилизации | [CdsProgress](#cdsprogress) |
594
+ | `CdsSlideGroup` | 🔁 `prependIcon`/`appendIcon`→`prevIcon`/`nextIcon` (новая система иконок) | [CdsSlideGroup](#cdsslidegroup) |
595
+ | `CdsSlideView` | ⚠️ дефолты иконок стрелок `chevron-left`/`chevron-right`→`prev`/`next` (новая система иконок) | [CdsSlideView](#cdsslideview) |
596
+ | `CdsStatus` | 🔁 значение `status="error"`→`"danger"`; ⚠️ булев `icon`→`variant="text"` | [CdsStatus](#cdsstatus) |
597
+ | `CdsSteps` | ⚠️ дефолт `interactive` изменён `true`→`false`; ✨ проп `items`, контентная часть и кнопки навигации | [CdsSteps](#cdssteps) |
598
+ | `CdsTabsV2` | 🔁 Переименован в `CdsTabs`; 🔁 `prependIcon`/`appendIcon`→`prevIcon`/`nextIcon`; ✨ новые пропсы | [CdsTabsV2](#cdstabsv2) |
599
+ | `CdsTag` | 🔁 `remove`→`click:close`; ⚠️ удалён слот `text`; иконки → `IconValue`; ✨ новые пропсы | [CdsTag](#cdstag) |
600
+ | `CdsTextArea` | ⚠️ удалён `limit`; ⚠️ изменён exposed-API; | [CdsTextArea](#cdstextarea) |
601
+ | `CdsTextInput` | ⚠️ удалён `limit`; ⚠️ удалён `persistentMessages`, `messages` теперь видны всегда; ⚠️ изменён exposed-API; иконки → `IconValue` | [CdsTextInput](#cdstextinput) |
602
+ | `CdsTooltip` | ⚠️ hover на контент закрывает подсказку; интерактивный контент — через новый проп `interactive`; изменён exposed-API | [CdsTooltip](#cdstooltip) |
603
+ | `CdsContainer` | ⚠️ Компонент удален; | [CdsContainer](#cdscontainer) |
604
+
605
+ ### CdsNotification
606
+
607
+ #### Новое значение `flat` у `variant`; `important` получил тень
608
+
609
+ > ✨ **NEW** — набор вариантов CDS 3 сохранён (`default` / `compact` / `important`, по умолчанию `default`), добавлено значение `flat` — уведомление без рамки. Вариант `important` (в CDS 3 не имел собственных стилей) теперь воспроизводит вид `CdsNotificationAlert`: нейтральный фон (`surface-elevated`) и тень (`cds-shadow-bottom-300`), статус задаёт только цвета контента и рамки.
610
+
611
+ **Было (CDS 3):**
612
+
613
+ ```html
614
+ <!-- CDS 3 — variant: 'default' | 'compact' | 'important' (default 'default') -->
615
+ <cds-notification title="Заголовок" text="Описание уведомления" />
616
+ ```
617
+
618
+ **Стало (CDS 4):**
619
+
620
+ ```html
621
+ <!-- CDS 4 — variant: 'default' | 'flat' | 'compact' | 'important' (default 'default') -->
622
+ <CdsNotification variant="flat" title="Заголовок" text="Описание уведомления" />
623
+ ```
624
+
625
+ **Действие:** миграция не требуется — существующие значения работают как раньше. Учтите, что `variant="important"` теперь визуально отличается (нейтральный фон + тень, как у тоста `CdsNotificationAlert` в CDS 3).
626
+
627
+ <!-- entry-meta: id=cdsnotification-variant-flat-important; severity=new; component=CdsNotification -->
628
+
629
+ #### Значение `status="error"` переименовано в `status="danger"`
630
+
631
+ > 🔁 **RENAMED** — как и у `CdsStatus`, набор статусов выровнен с токенами `--cds-color-status-*`.
632
+
633
+ **Было (CDS 3):**
634
+
635
+ ```html
636
+ <!-- CDS 3 — status: 'info' | 'success' | 'warning' | 'error' | 'progress' -->
637
+ <cds-notification status="error" title="Ошибка" text="Что-то пошло не так" />
638
+ ```
639
+
640
+ **Стало (CDS 4):**
641
+
642
+ ```html
643
+ <!-- CDS 4 — status: 'info' | 'success' | 'warning' | 'danger' | 'progress' -->
644
+ <CdsNotification status="danger" title="Ошибка" text="Что-то пошло не так" />
645
+ ```
646
+
647
+ **Действие:** заменить `status="error"` на `status="danger"`. Поиск: `grep -rnE "(cds-notification|CdsNotification)[^>]*status=\"error\"" src/`.
648
+
649
+ <!-- entry-meta: id=cdsnotification-status-error-to-danger; severity=renamed; component=CdsNotification -->
650
+
651
+ #### Проп `customIcon` удалён
652
+
653
+ > ⚠️ **BREAKING** — своя иконка задаётся через единый проп `icon` (`false` — скрыть иконку; по умолчанию иконка берётся из `status`).
654
+
655
+ **Было (CDS 3):**
656
+
657
+ ```html
658
+ <!-- CDS 3 — отдельные пропсы icon (false | имя) и customIcon -->
659
+ <cds-notification custom-icon="bookmark" title="Заголовок" text="Описание уведомления" />
660
+ ```
661
+
662
+ **Стало (CDS 4):**
663
+
664
+ ```html
665
+ <!-- CDS 4 — только icon: false | IconValue -->
666
+ <CdsNotification icon="bookmark" title="Заголовок" text="Описание уведомления" />
667
+ ```
668
+
669
+ **Действие:** заменить `custom-icon` / `customIcon` на `icon`. Поиск: `grep -rnE "custom-icon|customIcon" src/`.
670
+
671
+ <!-- entry-meta: id=cdsnotification-customicon-removed; severity=breaking; component=CdsNotification -->
672
+
673
+ #### Новые пропсы `bgColor` / `textColor`
674
+
675
+ > ✨ **NEW** — цвет фона и контента можно переопределить через `useColor`; без них действуют цвета статуса (миграция не требуется).
676
+
677
+ **Было (CDS 3):**
678
+
679
+ ```html
680
+ <!-- CDS 3 — цвета жёстко привязаны к status -->
681
+ <cds-notification status="info" title="Заголовок" text="Описание уведомления" />
682
+ ```
683
+
684
+ **Стало (CDS 4):**
685
+
686
+ ```html
687
+ <!-- CDS 4 — фон и текст можно переопределить (alias-токен или raw CSS-цвет) -->
688
+ <CdsNotification bg-color="brand-primary" text-color="content-on-dark" title="Заголовок" text="Описание уведомления" />
689
+ ```
690
+
691
+ **Действие:** миграция не требуется. Alias-цвета резолвятся в tier `fill` (фон) и `content` (текст); raw CSS-цвета применяются инлайн-стилем.
692
+
693
+ <!-- entry-meta: id=cdsnotification-bgcolor-textcolor; severity=new; component=CdsNotification -->
694
+
695
+ ### CdsBadge
696
+
697
+ #### Пропс `count` переименован в `content`
698
+
699
+ > 🔁 **RENAMED** — пропс приходит из общей фабрики `defineTextProps()` и теперь называется `content`.
700
+
701
+ **Было (CDS 3):**
702
+
703
+ ```html
704
+ <!-- CDS 3 -->
705
+ <CdsBadge :count="5" />
706
+ ```
707
+
708
+ **Стало (CDS 4):**
709
+
710
+ ```html
711
+ <!-- CDS 4 -->
712
+ <CdsBadge :content="5" />
713
+ ```
714
+
715
+ **Действие:** заменить `:count` на `:content`. Поиск использований: `grep -rn "CdsBadge[^/>]*\bcount=" src/`.
716
+
717
+ <!-- entry-meta: id=cdsbadge-count-to-content; severity=renamed; component=CdsBadge -->
718
+
719
+ #### Пропс `limited` заменён на `max` со значением
720
+
721
+ > 🔁 **RENAMED** — вместо булева флага теперь явное число-порог.
722
+
723
+ **Было (CDS 3):**
724
+
725
+ ```html
726
+ <!-- CDS 3 — limited отрезал значение по фиксированному порогу (99) -->
727
+ <CdsBadge :count="120" limited />
728
+ ```
729
+
730
+ **Стало (CDS 4):**
731
+
732
+ ```html
733
+ <!-- CDS 4 — порог задаётся явно через max -->
734
+ <CdsBadge :content="120" :max="99" />
735
+ ```
736
+
737
+ **Действие:** заменить `limited` на `:max="<число>"`. В CDS 3 порог по умолчанию был `99` — оставьте это значение, чтобы поведение не изменилось.
738
+
739
+ <!-- entry-meta: id=cdsbadge-limited-to-max; severity=renamed; component=CdsBadge -->
740
+
741
+ #### Пропс `invertColor` удалён
742
+
743
+ > ⚠️ **BREAKING** — в CDS 3 был помечен `deprecated`, в CDS 4 удалён.
744
+
745
+ **Было (CDS 3):**
746
+
747
+ ```html
748
+ <!-- CDS 3 -->
749
+ <CdsBadge :count="5" invert-color />
750
+ ```
751
+
752
+ **Стало (CDS 4):**
753
+
754
+ ```html
755
+ <!-- CDS 4 — для смены цвета используются color / textColor -->
756
+ <CdsBadge :content="5" color="surface-primary" text-color="content-on-primary" />
757
+ ```
758
+
759
+ **Действие:** удалить использования `invert-color` / `invertColor`. Если нужен инвертированный вид — задайте `color` и `textColor` явно.
760
+
761
+ <!-- entry-meta: id=cdsbadge-invertcolor-removed; severity=breaking; component=CdsBadge -->
762
+
763
+ #### Дефолт пропса `inline` изменён с `true` на `undefined`
764
+
765
+ > ⚠️ **BREAKING** — без явного `inline` бейдж теперь позиционируется абсолютно (`location: 'top end'`), а не как inline-блок.
766
+
767
+ **Было (CDS 3):**
768
+
769
+ ```html
770
+ <!-- CDS 3 — по умолчанию inline=true: бейдж рендерился inline-блоком рядом с контентом -->
771
+ <CdsBadge :content="5">
772
+ <CdsFunctionalButton icon="notification" />
773
+ </CdsBadge>
774
+ ```
775
+
776
+ **Стало (CDS 4):**
777
+
778
+ ```html
779
+ <!-- CDS 4 — по умолчанию inline=false: бейдж абсолютно позиционируется над контентом.
780
+ Чтобы вернуть прежнее поведение — указать inline явно. -->
781
+ <CdsBadge :content="5" inline>
782
+ <CdsFunctionalButton icon="notification" />
783
+ </CdsBadge>
784
+ ```
785
+
786
+ **Действие:** проверить все использования `CdsBadge` без явного `inline`. Если требуется прежнее inline-поведение — добавить пропс `inline`. Если нужен бейдж-«накладка» — оставить как есть (теперь это поведение по умолчанию, см. `defineLocationProps({ location: 'top end' })`).
787
+
788
+ <!-- entry-meta: id=cdsbadge-inline-default-changed; severity=breaking; component=CdsBadge -->
789
+
790
+ ### CdsBreadcrumbsItem
791
+
792
+ #### Пропс `text` переименован в `title`
793
+
794
+ > 🔁 **RENAMED**
795
+
796
+ **Было (CDS 3):**
797
+
798
+ ```html
799
+ <!-- CDS 3 -->
800
+ <cds-breadcrumbs-item text="Каталог" to="/catalog" />
801
+ ```
802
+
803
+ **Стало (CDS 4):**
804
+
805
+ ```html
806
+ <!-- CDS 4 -->
807
+ <cds-breadcrumbs-item title="Каталог" to="/catalog" />
808
+ ```
809
+
810
+ **Действие:** переименуйте пропс `text` → `title` на всех использованиях `CdsBreadcrumbsItem`. Найти: `grep -rn "cds-breadcrumbs-item" | grep "text="`.
811
+
812
+ <!-- entry-meta: id=cdsbreadcrumbsitem-text-to-title; severity=renamed; component=CdsBreadcrumbsItem -->
813
+
814
+ #### Удалён устаревший пропс `currentPage`
815
+
816
+ > ⚠️ **BREAKING**
817
+
818
+ **Было (CDS 3):**
819
+
820
+ ```html
821
+ <!-- CDS 3 -->
822
+ <cds-breadcrumbs-item text="Текущая страница" current-page />
823
+ ```
824
+
825
+ **Стало (CDS 4):**
826
+
827
+ ```html
828
+ <!-- CDS 4 -->
829
+ <cds-breadcrumbs-item title="Текущая страница" disabled />
830
+ ```
831
+
832
+ **Действие:** замените `current-page` на `disabled` (неактивная/текущая страница) либо `active` (подсветка текущего маршрута). В CDS 3 пропс уже выводил `[CDS UPGRADE]` warning через `deprecate('currentPage', 'disabled')`; в CDS 4 он удалён полностью.
833
+
834
+ <!-- entry-meta: id=cdsbreadcrumbsitem-currentpage-removed; severity=breaking; component=CdsBreadcrumbsItem -->
835
+
836
+ ### CdsButton
837
+
838
+ #### Удалён автоматический отступ между соседними кнопками
839
+
840
+ > ⚠️ **BREAKING** — глобальное CSS-правило, добавлявшее `margin-left` между соседними кнопками, было помечено `@deprecated` ещё в CDS 3 и в CDS 4 удалено полностью.
841
+
842
+ **Было (CDS 3):**
843
+
844
+ ```scss
845
+ // CDS 3 — глобальное правило в CdsButton.scss (@deprecated)
846
+ .cds-button + .cds-button:not(.cds-functional-button) {
847
+ margin-left: var(--cds-spacing-200);
848
+ }
849
+ ```
850
+
851
+ **Стало (CDS 4):**
852
+
853
+ ```html
854
+ <!-- CDS 4 — отступ задаёт контейнер -->
855
+ <div style="display: flex; gap: var(--cds-spacing-200)">
856
+ <CdsButton>Отменить</CdsButton>
857
+ <CdsButton>Сохранить</CdsButton>
858
+ </div>
859
+ ```
860
+
861
+ **Действие:** найдите группы соседних кнопок, полагавшиеся на автоматический отступ, и задайте расстояние явно на контейнере (`display: flex` + `gap`). Поиск кандидатов: `rg -lU '</(cds-button|CdsButton)>\s*<(cds-button|CdsButton)' src/`.
862
+
863
+ <!-- entry-meta: id=cdsbutton-adjacent-margin-removed; severity=breaking; component=CdsButton -->
864
+
865
+ ### CdsCard
866
+
867
+ #### Удалены пропсы `interactive` / `selected`
868
+
869
+ > ⚠️ **BREAKING** — модель кликабельности и выбора переработана. Кликабельность теперь включается пропсом `link` (или автоматически при `href` / `to` / членстве в `CdsCardGroup`), а выбранное состояние управляется только через `CdsCardGroup` + `value`.
870
+
871
+ **Было (CDS 3):**
872
+
873
+ ```html
874
+ <!-- CDS 3 — interactive делал карточку кликабельной, selected — выбранной -->
875
+ <cds-card interactive :selected="isSelected" @click="onClick">…</cds-card>
876
+
877
+ <!-- выбор в группе -->
878
+ <cds-card-group v-model="selected" multiple>
879
+ <cds-card :value="1">…</cds-card>
880
+ </cds-card-group>
881
+ ```
882
+
883
+ **Стало (CDS 4):**
884
+
885
+ ```html
886
+ <!-- CDS 4 — кликабельность через link (или href/to/членство в группе) -->
887
+ <CdsCard link @click="onClick">…</CdsCard>
888
+
889
+ <!-- выбор управляется CdsCardGroup + value; standalone-проп selected удалён -->
890
+ <CdsCardGroup v-model="selected" multiple>
891
+ <CdsCard :value="1">…</CdsCard>
892
+ </CdsCardGroup>
893
+ ```
894
+
895
+ **Действие:** заменить `interactive` на `link` (либо положиться на `href` / `to` / членство в `CdsCardGroup` — карточка станет кликабельной автоматически). Убрать standalone-проп `selected`: выбранное состояние теперь задаётся группой `CdsCardGroup` через `v-model` + `value` (визуально — класс из `selectedClass`). Нативный `@click` на `CdsCard` продолжает работать. Поиск: `grep -rnE "cds-card[^>]*(interactive|selected)" src/`.
896
+
897
+ > ℹ️ Событие `group:selected` убрано из публичного API `CdsCard` (в CDS 3 было объявлено в `emits`, в CDS 4 отсутствует в типах / `meta.json`), но всё ещё эмитится общим composable `useGroupItem` — существующие слушатели `@group:selected` продолжают срабатывать. Рекомендуется наблюдать за выбором на уровне группы: через `v-model` (`update:modelValue`) на `CdsCardGroup`.
898
+
899
+ <!-- entry-meta: id=cdscard-interactive-selected-removed; severity=breaking; component=CdsCard -->
900
+
901
+ ### CdsCheckbox
902
+
903
+ #### Компонент-обёртка `CdsCheckboxGroup` удалён
904
+
905
+ > ⚠️ **BREAKING** — отдельного компонента `CdsCheckboxGroup` больше нет. Группа собирается из `CdsLabel`, `CdsDescription` и нескольких `CdsCheckbox` с общим `v-model`-массивом.
906
+
907
+ **Было (CDS 3):**
908
+
909
+ ```html
910
+ <!-- CDS 3 -->
911
+ <script setup lang="ts">
912
+ import { ref } from 'vue';
913
+
914
+ const selected = ref(['first']);
915
+ </script>
916
+
917
+ <template>
918
+ <cds-checkbox-group
919
+ v-model="selected"
920
+ label="Заголовок группы чекбоксов"
921
+ description="Вспомогательное описание"
922
+ >
923
+ <cds-checkbox label="Значение чекбокса 1" value="first" />
924
+ <cds-checkbox label="Значение чекбокса 2" value="second" />
925
+ <cds-checkbox label="Значение чекбокса 3" value="third" />
926
+ </cds-checkbox-group>
927
+ <div>{{ selected }}</div>
928
+ </template>
929
+ ```
930
+
931
+ **Стало (CDS 4):**
932
+
933
+ ```html
934
+ <!-- CDS 4 -->
935
+ <script setup lang="ts">
936
+ import { ref } from 'vue';
937
+
938
+ const selected = ref(['first']);
939
+ </script>
940
+
941
+ <template>
942
+ <div class="w-full">
943
+ <CdsLabel class="mb-1">Заголовок группы чекбоксов</CdsLabel>
944
+ <CdsDescription class="mb-1">Вспомогательное описание</CdsDescription>
945
+ <div class="flex flex-col gap-2">
946
+ <CdsCheckbox v-model="selected" label="Значение чекбокса 1" hide-details value="first" />
947
+ <CdsCheckbox v-model="selected" label="Значение чекбокса 2" hide-details value="second" />
948
+ <CdsCheckbox v-model="selected" label="Значение чекбокса 3" hide-details value="third" />
949
+ </div>
950
+ <p>{{ selected }}</p>
951
+ </div>
952
+ </template>
953
+ ```
954
+
955
+ **Действие:** убрать обёртку `<cds-checkbox-group>` и заменить её связкой `CdsLabel` + `CdsDescription` + flex-контейнер с обычными `CdsCheckbox`. На каждом чекбоксе укажите общий массив в `v-model`, уникальный `value` и `hide-details`, чтобы убрать индивидуальные слоты описаний. Пример — `packages/components/src/components/CdsCheckbox/docs/CdsCheckbox.stories.ts` (story `Group`). Поиск использований: `grep -rn "cds-checkbox-group\|CdsCheckboxGroup" src/`.
956
+
957
+ <!-- entry-meta: id=cdscheckbox-checkboxgroup-removed; severity=breaking; component=CdsCheckbox -->
958
+
959
+ #### Изменён exposed-API
960
+
961
+ > ⚠️ **BREAKING** — вместо `id` / `isGroup` / `validationRef` компонент отдаёт унифицированный validation-API.
962
+
963
+ **Было (CDS 3):**
964
+
965
+ ```ts
966
+ // CDS 3
967
+ const cb = ref();
968
+ cb.value.validationRef; // инстанс CdsInput
969
+ cb.value.isGroup; // находится ли чекбокс в группе
970
+ ```
971
+
972
+ **Стало (CDS 4):**
973
+
974
+ ```ts
975
+ // CDS 4 — методы и флаги валидации
976
+ const cb = ref();
977
+ cb.value.validate(); // запуск валидации
978
+ cb.value.reset(); // сброс значения
979
+ cb.value.resetValidation(); // сброс ошибок
980
+ cb.value.isValid; // Ref<boolean | null>
981
+ ```
982
+
983
+ **Действие:** заменить обращения к `ref.id` / `ref.isGroup` / `ref.validationRef` на методы и флаги валидации (`validate`, `reset`, `resetValidation`, `isValid`, `isDirty`, `isValidating`, `isDisabled`, `isReadonly`, `isPure`).
984
+
985
+ <!-- entry-meta: id=cdscheckbox-exposed-api-changed; severity=breaking; component=CdsCheckbox -->
986
+
987
+ ### CdsContentSwitcher
988
+
989
+ #### Компонент `CdsContentSwitcher` удалён — используйте `CdsTabs`
990
+
991
+ > ⚠️ **BREAKING** — `CdsContentSwitcher` (и `CdsContentSwitcherItem`) был помечен `deprecated` ещё в CDS 3 (обёртка над табами) и удалён в CDS 4. Замена — `CdsTabs` / `CdsTab` (бывший `CdsTabsV2`, см. [CdsTabsV2](#cdstabsv2)).
992
+
993
+ **Было (CDS 3):**
994
+
995
+ ```html
996
+ <!-- CDS 3 — CdsContentSwitcher был помечен deprecated -->
997
+ <script setup lang="ts">
998
+ import { CdsContentSwitcher, CdsContentSwitcherItem } from '@central-design-system/components';
999
+ import { ref } from 'vue';
1000
+
1001
+ const model = ref(0);
1002
+ </script>
1003
+
1004
+ <template>
1005
+ <cds-content-switcher v-model="model">
1006
+ <cds-content-switcher-item>Россия</cds-content-switcher-item>
1007
+ <cds-content-switcher-item>Египет</cds-content-switcher-item>
1008
+ <cds-content-switcher-item>Аргентина</cds-content-switcher-item>
1009
+ </cds-content-switcher>
1010
+ </template>
1011
+ ```
1012
+
1013
+ **Стало (CDS 4):**
1014
+
1015
+ ```html
1016
+ <!-- CDS 4 — вместо CdsContentSwitcher используйте CdsTabs + CdsTab -->
1017
+ <script setup lang="ts">
1018
+ import { CdsTabs, CdsTab } from '@central-design-system/components';
1019
+ import { ref } from 'vue';
1020
+
1021
+ const model = ref('ru');
1022
+ </script>
1023
+
1024
+ <template>
1025
+ <CdsTabs v-model="model" grow>
1026
+ <CdsTab value="ru">Россия</CdsTab>
1027
+ <CdsTab value="eg">Египет</CdsTab>
1028
+ <CdsTab value="ar">Аргентина</CdsTab>
1029
+ </CdsTabs>
1030
+ </template>
1031
+ ```
1032
+
1033
+ **Действие:** заменить `CdsContentSwitcher` → `CdsTabs` и `CdsContentSwitcherItem` → `CdsTab` (включая kebab-case `cds-content-switcher` → `cds-tabs`, `cds-content-switcher-item` → `cds-tab`). Чтобы табы занимали всё доступное пространство, как `CdsContentSwitcher` по умолчанию, добавьте проп `grow`. В CDS 3 компонент выводил в консоль `[CDS UPGRADE]` warning (`deprecate()`); в CDS 4 он удалён. Поиск: `grep -rnE "CdsContentSwitcher|cds-content-switcher" src/`.
1034
+
1035
+ <!-- entry-meta: id=cdscontentswitcher-removed; severity=breaking; component=CdsContentSwitcher -->
1036
+
1037
+ ### CdsForm
1038
+
1039
+ #### Изменён exposed-API — убраны обёртки `form` / `formRef`
1040
+
1041
+ > ⚠️ **BREAKING** — методы валидации и состояние доступны напрямую через ref.
1042
+
1043
+ **Было (CDS 3):**
1044
+
1045
+ ```ts
1046
+ // CDS 3
1047
+ const formRef = ref();
1048
+ // exposed: { ...form, form, formRef }
1049
+ formRef.value.validate();
1050
+ formRef.value.form; // объект формы
1051
+ formRef.value.formRef; // ссылка на <form>
1052
+ ```
1053
+
1054
+ **Стало (CDS 4):**
1055
+
1056
+ ```ts
1057
+ // CDS 4
1058
+ const formRef = ref();
1059
+ // плоский набор — без обёрток form / formRef
1060
+ formRef.value.validate();
1061
+ formRef.value.reset();
1062
+ formRef.value.resetValidation();
1063
+ formRef.value.isValid; // isValidating / isDisabled / isReadonly, errors / items
1064
+ ```
1065
+
1066
+ **Действие:** убрать обращения к `formRef.value.form` и `formRef.value.formRef` — методы (`validate` / `reset` / `resetValidation`) и состояние (`isValid` / `isValidating` / `isDisabled` / `isReadonly`, `errors` / `items`) доступны прямо на ref формы. Поиск: `grep -rnE "\.(form|formRef)\b" src/`.
1067
+
1068
+ <!-- entry-meta: id=cdsform-exposed-api; severity=breaking; component=CdsForm -->
1069
+
1070
+ ### CdsIcon
1071
+
1072
+ #### Удалён устаревший пропс `invertColor`
1073
+
1074
+ > ⚠️ **BREAKING** — инверсия цвета через `invertColor` убрана; цвет иконки задаётся цветовыми пропсами.
1075
+
1076
+ **Было (CDS 3):**
1077
+
1078
+ ```html
1079
+ <!-- CDS 3 -->
1080
+ <CdsIcon name="add" invert-color />
1081
+ ```
1082
+
1083
+ **Стало (CDS 4):**
1084
+
1085
+ ```html
1086
+ <!-- CDS 4 -->
1087
+ <CdsIcon icon="add" color="content-inverse" />
1088
+ ```
1089
+
1090
+ **Действие:** убрать проп `invertColor` у `CdsIcon` и задавать цвет через `color` / `baseColor` / `textColor`. Поиск: `grep -rnE "<[Cc]ds[- ]?[Ii]con[^>]*invert-?[Cc]olor" src/`.
1091
+
1092
+ <!-- entry-meta: id=cdsicon-invertcolor-removed; severity=breaking; component=CdsIcon -->
1093
+
1094
+ ### CdsList
1095
+
1096
+ #### Удалён устаревший пропс `invertColor`
1097
+
1098
+ > ⚠️ **BREAKING** — инверсия цвета через `invertColor` убрана; цвет списка задаётся цветовыми пропсами.
1099
+
1100
+ **Было (CDS 3):**
1101
+
1102
+ ```html
1103
+ <!-- CDS 3 -->
1104
+ <cds-list invert-color :items="items" />
1105
+ ```
1106
+
1107
+ **Стало (CDS 4):**
1108
+
1109
+ ```html
1110
+ <!-- CDS 4 — цвет задаётся цветовыми пропсами -->
1111
+ <CdsList :items="items" color="content-inverse" bg-color="surface-primary" />
1112
+ ```
1113
+
1114
+ **Действие:** убрать `invert-color` / `invertColor` у `CdsList`; для инверсного/произвольного оформления использовать `color` / `baseColor` / `bgColor` / `textColor`. Поиск: `grep -rnE "cds-list[^>]*invert-?[Cc]olor|CdsList[^>]*invertColor" src/`.
1115
+
1116
+ <!-- entry-meta: id=cdslist-invertcolor-removed; severity=breaking; component=CdsList -->
1117
+
1118
+ #### `CdsListItem`: удалён пропс `isClickable`
1119
+
1120
+ > ⚠️ **BREAKING** — принудительная кликабельность через `isClickable` убрана; теперь включается пропсом `link` (либо автоматически при `href` / `to` или наличии `value` внутри списка).
1121
+
1122
+ **Было (CDS 3):**
1123
+
1124
+ ```html
1125
+ <!-- CDS 3 — isClickable принудительно делал элемент кликабельным -->
1126
+ <cds-list-item is-clickable title="Пункт" @click="onClick" />
1127
+ ```
1128
+
1129
+ **Стало (CDS 4):**
1130
+
1131
+ ```html
1132
+ <!-- CDS 4 — кликабельность через link -->
1133
+ <CdsListItem link title="Пункт" @click="onClick" />
1134
+ ```
1135
+
1136
+ **Действие:** заменить `is-clickable` / `isClickable` на `link`. Если у элемента есть `href` / `to` или `value` внутри `CdsList` — он станет кликабельным автоматически. Поиск: `grep -rnE "cds-list-item[^>]*is-clickable|CdsListItem[^>]*isClickable" src/`.
1137
+
1138
+ <!-- entry-meta: id=cdslistitem-isclickable-removed; severity=breaking; component=CdsListItem -->
1139
+
1140
+ #### `CdsListItem`: изменён exposed-API
1141
+
1142
+ > ⚠️ **BREAKING** — вместо `isActive` / `isIndeterminate` компонент отдаёт `isActivated` / `activate`; поле `isIndeterminate` удалено.
1143
+
1144
+ **Было (CDS 3):**
1145
+
1146
+ ```ts
1147
+ // CDS 3 — exposed: isActive, isSelected, isIndeterminate, select
1148
+ const item = ref();
1149
+ item.value.isActive;
1150
+ item.value.isIndeterminate;
1151
+ ```
1152
+
1153
+ **Стало (CDS 4):**
1154
+
1155
+ ```ts
1156
+ // CDS 4 — isActive → isActivated, добавлен activate(); isIndeterminate удалён
1157
+ const item = ref();
1158
+ item.value.isActivated;
1159
+ item.value.activate(true);
1160
+ item.value.isSelected;
1161
+ item.value.select(true);
1162
+ ```
1163
+
1164
+ **Действие:** заменить обращения к `isActive` на `isActivated`, для смены активного состояния использовать `activate(value)`; `isIndeterminate` больше не экспонируется. Дополнительно доступны `isGroupActivator` и контексты `list` / `root`.
1165
+
1166
+ <!-- entry-meta: id=cdslistitem-exposed-api-changed; severity=breaking; component=CdsListItem -->
1167
+
1168
+ #### `CdsListGroup`: удалён слот `title`, изменён смысл пропа `title`
1169
+
1170
+ > ⚠️ **BREAKING** — В CDS 3 `title` (и слот `#title`) рисовал **отдельную статичную некликабельную подпись** над активатором (блок `.cds-list-group__title`). В CDS 4 этот блок и слот удалены, а проп `title` стал **текстом кликабельного активатора**. Статичная подпись группы теперь делается компонентом `CdsListSubheader`.
1171
+
1172
+ **Было (CDS 3):**
1173
+
1174
+ ```html
1175
+ <!-- CDS 3 — title/#title = статичная подпись над кликабельным #activator -->
1176
+ <cds-list-group>
1177
+ <template #title>Заголовок группы</template>
1178
+ <template #activator="{ props }">
1179
+ <cds-list-item v-bind="props" title="Раскрыть" />
1180
+ </template>
1181
+ <cds-list-item title="Пункт" />
1182
+ </cds-list-group>
1183
+ ```
1184
+
1185
+ **Стало (CDS 4):**
1186
+
1187
+ ```html
1188
+ <!-- CDS 4 — статичная подпись через CdsListSubheader; title = текст активатора -->
1189
+ <CdsListSubheader title="Заголовок группы" />
1190
+ <CdsListGroup title="Раскрыть">
1191
+ <CdsListItem title="Пункт" />
1192
+ </CdsListGroup>
1193
+ ```
1194
+
1195
+ **Действие:** статичную подпись группы (бывший блок `.cds-list-group__title` / слот `#title`) вынести в отдельный `<CdsListSubheader title="…" />`. Учтите, что проп `title` у `CdsListGroup` теперь задаёт текст кликабельного активатора, а не статичную подпись; для полностью кастомного активатора используйте слот `#activator`. Поиск: `grep -rn "cds-list-group" src/`.
1196
+
1197
+ <!-- entry-meta: id=cdslistgroup-title-slot-removed; severity=breaking; component=CdsListGroup -->
1198
+
1199
+ #### `CdsListGroup`: изменён exposed-API
1200
+
1201
+ > ⚠️ **BREAKING** — вместо `id` / `isExpandable` группа отдаёт только `isOpen`.
1202
+
1203
+ **Было (CDS 3):**
1204
+
1205
+ ```ts
1206
+ // CDS 3 — exposed: id, isOpen, isExpandable
1207
+ const group = ref();
1208
+ group.value.id;
1209
+ group.value.isExpandable;
1210
+ ```
1211
+
1212
+ **Стало (CDS 4):**
1213
+
1214
+ ```ts
1215
+ // CDS 4 — только isOpen
1216
+ const group = ref();
1217
+ group.value.isOpen;
1218
+ ```
1219
+
1220
+ **Действие:** убрать обращения к `id` / `isExpandable` у `CdsListGroup` — публично экспонируется только `isOpen`.
1221
+
1222
+ <!-- entry-meta: id=cdslistgroup-exposed-api-changed; severity=breaking; component=CdsListGroup -->
1223
+
1224
+ #### Изменён payload событий `click:open` / `click:select`
1225
+
1226
+ > ⚠️ **BREAKING** — из payload убрано поле `event`; передаётся `{ id, value, path }`.
1227
+
1228
+ **Было (CDS 3):**
1229
+
1230
+ ```ts
1231
+ // CDS 3 — payload: { id, value, path, event }
1232
+ function onOpen({ id, value, path, event }) {}
1233
+ ```
1234
+
1235
+ **Стало (CDS 4):**
1236
+
1237
+ ```ts
1238
+ // CDS 4 — payload без event: { id, value, path }
1239
+ function onOpen({ id, value, path }) {}
1240
+ ```
1241
+
1242
+ **Действие:** убрать обращение к полю `event` в обработчиках `@click:open` / `@click:select` у `CdsList`. Поиск: `grep -rnE "click:(open|select)" src/`.
1243
+
1244
+ <!-- entry-meta: id=cdslist-click-events-payload-changed; severity=breaking; component=CdsList -->
1245
+
1246
+ ### CdsModal
1247
+
1248
+ #### Удалены пропсы `loading` и `dismissBtn` (и слот `dismissBtn`)
1249
+
1250
+ > ⚠️ **BREAKING** — `dismissBtn` был помечен deprecated ещё в CDS 3; `loading` удалён вместе с ним. Лоадер и кнопка закрытия добавляются в контент вручную. Остальной API (`fullscreen`, `scrollable`, `size`, `persistent`, активаторы) совместим с CDS 3.
1251
+
1252
+ **Было (CDS 3):**
1253
+
1254
+ ```html
1255
+ <!-- CDS 3 — лоадер и кнопка закрытия рендерились самим компонентом -->
1256
+ <cds-modal v-model="modal" :loading="isLoading" dismiss-btn>
1257
+ <h4>Заголовок</h4>
1258
+ <p>Контент модального окна</p>
1259
+ </cds-modal>
1260
+ ```
1261
+
1262
+ **Стало (CDS 4):**
1263
+
1264
+ ```html
1265
+ <!-- CDS 4 — добавьте CdsLoader и CdsFunctionalButton в контент сами -->
1266
+ <CdsModal v-model="modal">
1267
+ <CdsLoader v-if="isLoading" fixed overlay />
1268
+
1269
+ <div class="flex items-center justify-between">
1270
+ <span class="h4">Заголовок</span>
1271
+ <CdsFunctionalButton icon="remove" @click="modal = false" />
1272
+ </div>
1273
+
1274
+ <p>Контент модального окна</p>
1275
+ </CdsModal>
1276
+ ```
1277
+
1278
+ **Действие:** удалить `loading` / `dismiss-btn` (и слот `#dismissBtn`) из использований `CdsModal`; лоадер (`CdsLoader fixed overlay`) и кнопку закрытия (`CdsFunctionalButton icon="remove"`) разместить в контенте модалки. Поиск: `grep -rnE "cds-modal[^>]*(loading|dismiss-btn)|CdsModal[^>]*(loading|dismissBtn)" src/`.
1279
+
1280
+ <!-- entry-meta: id=cdsmodal-loading-dismissbtn-removed; severity=breaking; component=CdsModal -->
1281
+
1282
+ #### Изменён exposed-API
1283
+
1284
+ > ⚠️ **BREAKING** — вместо ссылки `overlay` компонент отдаёт элементы и методы оверлея напрямую.
1285
+
1286
+ **Было (CDS 3):**
1287
+
1288
+ ```ts
1289
+ // CDS 3
1290
+ const modal = ref();
1291
+ modal.value.overlay; // инстанс CdsOverlay
1292
+ ```
1293
+
1294
+ **Стало (CDS 4):**
1295
+
1296
+ ```ts
1297
+ // CDS 4
1298
+ const modal = ref();
1299
+ modal.value.contentEl; // DOM-элемент контента
1300
+ modal.value.activatorEl; // DOM-элемент активатора
1301
+ modal.value.updateLocation?.(e); // пересчёт позиции
1302
+ ```
1303
+
1304
+ **Действие:** заменить обращения к `ref.overlay` на новые exposed-поля (`contentEl`, `activatorEl`, `rootEl`, `updateLocation`, `animateClick`).
1305
+
1306
+ <!-- entry-meta: id=cdsmodal-exposed-api-changed; severity=breaking; component=CdsModal -->
1307
+
1308
+ ### CdsNotificationAlert
1309
+
1310
+ #### Компонент-обёртка `CdsNotificationAlert` — временный мост, мигрируйте на `CdsToast`
1311
+
1312
+ > 🟠 **DEPRECATED** — в CDS 4 компонент перенесён как мост для плавной миграции: сохранён API-стиль (`timeout`, `location`, `status`, `title`, `text`, `closable`, слоты `activator` / `actions`), но внутри теперь рендерит `CdsNotification` (`variant="important"`) в `CdsOverlay`. Работает в 4.x, будет удалён в 5.x.
1313
+
1314
+ **Было (CDS 3):**
1315
+
1316
+ ```html
1317
+ <!-- CDS 3 — обёртка-тост поверх CdsNotification -->
1318
+ <cds-notification-alert v-model="active" title="Заголовок" text="Описание уведомления" status="info" location="top left" :timeout="5000" closable>
1319
+ <template #actions>
1320
+ <cds-button>Кнопка</cds-button>
1321
+ </template>
1322
+ </cds-notification-alert>
1323
+ ```
1324
+
1325
+ **Стало (CDS 4):**
1326
+
1327
+ ```html
1328
+ <!-- CDS 4 — рекомендуется CdsToast (для очереди/стека — CdsToastQueue) -->
1329
+ <CdsToast v-model="active" title="Заголовок" text="Описание уведомления" status="info" location="top left" :timeout="5000">
1330
+ <template #actions="{ isActive }">
1331
+ <CdsButton @click="isActive.value = false">Кнопка</CdsButton>
1332
+ </template>
1333
+ </CdsToast>
1334
+ ```
1335
+
1336
+ **Действие:** `CdsNotificationAlert` продолжает работать в 4.x (рендерит `CdsNotification variant="important"` внутри `CdsOverlay`), но в dev-консоли выводит `[CDS UPGRADE] 'CdsNotificationAlert' is deprecated, use 'CdsToast' instead.` (см. `deprecate()` в `src/utils/dom/console.ts`) и будет удалён. Перейдите на `CdsToast`; для вертикального стека нескольких уведомлений используйте `CdsToast` + `CdsToastQueue`. Поиск: `grep -rnE "CdsNotificationAlert|cds-notification-alert" src/`.
1337
+
1338
+ <!-- entry-meta: id=cdsnotificationalert-deprecated-use-cdstoast; severity=deprecation; component=CdsNotificationAlert -->
1339
+
1340
+ ### CdsRadioButton
1341
+
1342
+ #### Компонент `CdsRadioButton` переименован в `CdsRadioGroup`
1343
+
1344
+ > 🔁 **RENAMED** — публичный API (пропсы, слоты, события) не изменился, переименовано только имя компонента-обёртки и путь импорта/тега.
1345
+
1346
+ **Было (CDS 3):**
1347
+
1348
+ ```html
1349
+ <!-- CDS 3 -->
1350
+ <script setup lang="ts">
1351
+ import { CdsRadio, CdsRadioButton } from '@central-design-system/components';
1352
+ import { ref } from 'vue';
1353
+
1354
+ const selected = ref('val-1');
1355
+ </script>
1356
+
1357
+ <template>
1358
+ <CdsRadioButton v-model="selected" label="Заголовок" description="Описание">
1359
+ <CdsRadio label="Значение радио-кнопки 1" value="val-1" />
1360
+ <CdsRadio label="Значение радио-кнопки 2" value="val-2" />
1361
+ <CdsRadio label="Значение радио-кнопки 3" value="val-3" />
1362
+ </CdsRadioButton>
1363
+ </template>
1364
+ ```
1365
+
1366
+ **Стало (CDS 4):**
1367
+
1368
+ ```html
1369
+ <!-- CDS 4 -->
1370
+ <script setup lang="ts">
1371
+ import { CdsRadio, CdsRadioGroup } from '@central-design-system/components';
1372
+ import { ref } from 'vue';
1373
+
1374
+ const selected = ref('val-1');
1375
+ </script>
1376
+
1377
+ <template>
1378
+ <CdsRadioGroup v-model="selected" label="Заголовок" description="Описание">
1379
+ <CdsRadio label="Значение радио-кнопки 1" value="val-1" />
1380
+ <CdsRadio label="Значение радио-кнопки 2" value="val-2" />
1381
+ <CdsRadio label="Значение радио-кнопки 3" value="val-3" />
1382
+ </CdsRadioGroup>
1383
+ </template>
1384
+ ```
1385
+
1386
+ **Действие:** заменить импорт и тег `CdsRadioButton` → `CdsRadioGroup` (включая kebab-case вариант `cds-radio-button` → `cds-radio-group`). Поиск использований: `grep -rnE "CdsRadioButton|cds-radio-button" src/`. Дочерние `<CdsRadio>` остаются без изменений.
1387
+
1388
+ <!-- entry-meta: id=cdsradiogroup-renamed-from-cdsradiobutton; severity=renamed; component=CdsRadioGroup -->
1389
+
1390
+ #### Новые пропсы (цвета, иконки, inline, size)
1391
+
1392
+ > ✨ **NEW** — помимо переименования компонент получил аддитивные пропсы из унифицированного input-API (миграция не требуется).
1393
+
1394
+ **Было (CDS 3):**
1395
+
1396
+ ```html
1397
+ <!-- CDS 3 -->
1398
+ <CdsRadioButton v-model="selected" label="Заголовок" description="Описание" />
1399
+ ```
1400
+
1401
+ **Стало (CDS 4):**
1402
+
1403
+ ```html
1404
+ <!-- CDS 4 -->
1405
+ <CdsRadioGroup
1406
+ v-model="selected"
1407
+ label="Заголовок"
1408
+ description="Описание"
1409
+ color="surface-primary"
1410
+ inline
1411
+ size="lg"
1412
+ />
1413
+ ```
1414
+
1415
+ **Действие:** миграция не требуется. Новые возможности: цветовые пропсы `color` / `baseColor` / `activeColor` / `textColor` / `iconColor`, иконочные `prependIcon` / `appendIcon` / `trueIcon` / `falseIcon`, `inline`, `size` и exposed-методы валидации (`validate` / `reset` / `resetValidation`).
1416
+
1417
+ <!-- entry-meta: id=cdsradiogroup-new-props; severity=new; component=CdsRadioGroup -->
1418
+
1419
+ ### CdsSelect
1420
+
1421
+ #### Компонент `CdsDropdown` переименован в `CdsSelect`
1422
+
1423
+ > 🔁 **RENAMED** — богатый выпадающий список с кастомным меню (`CdsMenu`), множественным выбором и фильтрацией из CDS 3 `CdsDropdown` теперь называется `CdsSelect`.
1424
+
1425
+ **Было (CDS 3):**
1426
+
1427
+ ```html
1428
+ <!-- CDS 3 -->
1429
+ <script setup lang="ts">
1430
+ import { CdsDropdown } from '@central-design-system/components';
1431
+ import { ref } from 'vue';
1432
+
1433
+ const selected = ref(null);
1434
+ const items = ref(['Первый', 'Второй', 'Третий']);
1435
+ </script>
1436
+
1437
+ <template>
1438
+ <CdsDropdown v-model="selected" :items="items" label="Выберите значение" />
1439
+ </template>
1440
+ ```
1441
+
1442
+ **Стало (CDS 4):**
1443
+
1444
+ ```html
1445
+ <!-- CDS 4 -->
1446
+ <script setup lang="ts">
1447
+ import { CdsSelect } from '@central-design-system/components';
1448
+ import { ref } from 'vue';
1449
+
1450
+ const selected = ref(null);
1451
+ const items = ref(['Первый', 'Второй', 'Третий']);
1452
+ </script>
1453
+
1454
+ <template>
1455
+ <CdsSelect v-model="selected" :items="items" label="Выберите значение" />
1456
+ </template>
1457
+ ```
1458
+
1459
+ **Действие:** заменить импорт и тег `CdsDropdown` → `CdsSelect` (включая kebab-case `cds-dropdown` → `cds-select`). Поиск использований: `grep -rnE "CdsDropdown|cds-dropdown" src/`.
1460
+
1461
+ <!-- entry-meta: id=cdsselect-renamed-from-cdsdropdown; severity=renamed; component=CdsSelect -->
1462
+
1463
+ #### Нативный `CdsSelect` (CDS 3) заменён пропсом `native-select`
1464
+
1465
+ > ⚠️ **BREAKING** — старый `CdsSelect` из CDS 3 (обёртка над нативным HTML `<select>`, был помечен deprecated) удалён. Его имя теперь занимает бывший `CdsDropdown`. Чтобы получить нативный выпадающий список, используйте новый `CdsSelect` с пропсом `native-select`.
1466
+
1467
+ **Было (CDS 3):**
1468
+
1469
+ ```html
1470
+ <!-- CDS 3 — CdsSelect рендерил нативный <select> -->
1471
+ <script setup lang="ts">
1472
+ import { CdsSelect } from '@central-design-system/components';
1473
+ import { ref } from 'vue';
1474
+
1475
+ const selected = ref(null);
1476
+ const items = ref(['Первый', 'Второй', 'Третий']);
1477
+ </script>
1478
+
1479
+ <template>
1480
+ <CdsSelect v-model="selected" :items="items" label="Выберите значение" />
1481
+ </template>
1482
+ ```
1483
+
1484
+ **Стало (CDS 4):**
1485
+
1486
+ ```html
1487
+ <!-- CDS 4 — нативный список доступен через native-select -->
1488
+ <script setup lang="ts">
1489
+ import { CdsSelect } from '@central-design-system/components';
1490
+ import { ref } from 'vue';
1491
+
1492
+ const selected = ref(null);
1493
+ const items = ref(['Первый', 'Второй', 'Третий']);
1494
+ </script>
1495
+
1496
+ <template>
1497
+ <CdsSelect v-model="selected" :items="items" native-select label="Выберите значение" />
1498
+ </template>
1499
+ ```
1500
+
1501
+ **Действие:** использования старого `CdsSelect` из CDS 3 дополнить пропсом `native-select`, чтобы сохранить нативное поведение `<select>`. Без этого пропса `CdsSelect` в CDS 4 — это богатый список с кастомным меню (бывший `CdsDropdown`). Проверьте каждое использование `CdsSelect` и решите, какое поведение требуется: `grep -rnE "CdsSelect|cds-select" src/`.
1502
+
1503
+ <!-- entry-meta: id=cdsselect-native-select-prop; severity=breaking; component=CdsSelect -->
1504
+
1505
+ ### CdsProgress
1506
+
1507
+ #### Компонент `CdsProgress` переименован в `CdsProgressBar`
1508
+
1509
+ > 🔁 **RENAMED** — публичный API (пропсы, слоты, события) не изменился, переименовано только имя компонента и путь импорта/тега.
1510
+
1511
+ **Было (CDS 3):**
1512
+
1513
+ ```html
1514
+ <!-- CDS 3 -->
1515
+ <script setup lang="ts">
1516
+ import { CdsProgress } from '@central-design-system/components';
1517
+ import { ref } from 'vue';
1518
+
1519
+ const value = ref(35);
1520
+ </script>
1521
+
1522
+ <template>
1523
+ <CdsProgress v-model="value" />
1524
+ </template>
1525
+ ```
1526
+
1527
+ **Стало (CDS 4):**
1528
+
1529
+ ```html
1530
+ <!-- CDS 4 -->
1531
+ <script setup lang="ts">
1532
+ import { CdsProgressBar } from '@central-design-system/components';
1533
+ import { ref } from 'vue';
1534
+
1535
+ const value = ref(35);
1536
+ </script>
1537
+
1538
+ <template>
1539
+ <CdsProgressBar v-model="value" />
1540
+ </template>
1541
+ ```
1542
+
1543
+ **Действие:** заменить импорт и тег `CdsProgress` → `CdsProgressBar` (включая kebab-case вариант `cds-progress` → `cds-progress-bar`). Поиск использований: `grep -rnE "CdsProgress|cds-progress-bar" src/`.
1544
+
1545
+ <!-- entry-meta: id=cdsprogressbar-renamed-from-cdsprogress; severity=renamed; component=CdsProgressBar -->
1546
+
1547
+ #### Новые пропсы стилизации
1548
+
1549
+ > ✨ **NEW** — помимо переименования компонент получил набор аддитивных пропсов (миграция не требуется).
1550
+
1551
+ **Было (CDS 3):**
1552
+
1553
+ ```html
1554
+ <!-- CDS 3 — базовый прогресс-бар -->
1555
+ <cds-progress v-model="value" :buffer-value="60" />
1556
+ ```
1557
+
1558
+ **Стало (CDS 4):**
1559
+
1560
+ ```html
1561
+ <!-- CDS 4 — цвета, буфер, сегменты, полосы -->
1562
+ <CdsProgressBar
1563
+ v-model="value"
1564
+ color="surface-primary"
1565
+ base-color="surface-tertiary"
1566
+ buffer-color="surface-secondary"
1567
+ variant="split"
1568
+ :chunk-count="10"
1569
+ striped
1570
+ rounded-bar
1571
+ />
1572
+ ```
1573
+
1574
+ **Действие:** миграция не требуется. Новые возможности: цветовые пропсы `color` / `baseColor` / `activeColor` / `textColor`, стилизация буфера `bufferColor` / `bufferOpacity`, сегментный режим `variant: 'split'` (`chunkCount` / `chunkGap` / `chunkWidth`), а также `striped` / `roundedBar` / `opacity`.
1575
+
1576
+ <!-- entry-meta: id=cdsprogressbar-styling-props; severity=new; component=CdsProgressBar -->
1577
+
1578
+ ### CdsSlideGroup
1579
+
1580
+ #### Пропсы иконок стрелок прокрутки переименованы
1581
+
1582
+ > 🔁 **RENAMED** — иконки кнопок прокрутки задаются через `prevIcon` / `nextIcon` вместо `prependIcon` / `appendIcon`.
1583
+
1584
+ **Было (CDS 3):**
1585
+
1586
+ ```html
1587
+ <!-- CDS 3 -->
1588
+ <CdsSlideGroup prepend-icon="arrow-left" append-icon="arrow-right">
1589
+ <CdsSlideGroupItem v-for="i in items" :key="i" :value="i">{{ i }}</CdsSlideGroupItem>
1590
+ </CdsSlideGroup>
1591
+ ```
1592
+
1593
+ **Стало (CDS 4):**
1594
+
1595
+ ```html
1596
+ <!-- CDS 4 -->
1597
+ <CdsSlideGroup prev-icon="prev" next-icon="next">
1598
+ <CdsSlideGroupItem v-for="i in items" :key="i" :value="i">{{ i }}</CdsSlideGroupItem>
1599
+ </CdsSlideGroup>
1600
+ ```
1601
+
1602
+ **Действие:** заменить `prepend-icon` / `append-icon` на `prev-icon` / `next-icon` у `CdsSlideGroup`; учесть, что дефолтные иконки изменены `arrow-left` / `arrow-right` → `prev` / `next` (новая система иконок `IconValue`). Поиск: `grep -rnE "CdsSlideGroup[^>]*(prepend-icon|append-icon)" src/`.
1603
+
1604
+ <!-- entry-meta: id=cdsslidegroup-arrow-icon-props-renamed; severity=renamed; component=CdsSlideGroup -->
1605
+
1606
+ ### CdsSlideView
1607
+
1608
+ #### Иконки стрелок `prevIcon` / `nextIcon` переведены на новую систему иконок
1609
+
1610
+ > ⚠️ **BREAKING** — имена пропсов `prevIcon` / `nextIcon` не изменились, но дефолтные иконки заменены `chevron-left` / `chevron-right` → `prev` / `next`, а тип пропа теперь `IconValue` (без валидации по `allowedIcons`). Явно переданные старые имена (`chevron-left` / `chevron-right`) в новом наборе иконок не резолвятся.
1611
+
1612
+ **Было (CDS 3):**
1613
+
1614
+ ```html
1615
+ <!-- CDS 3 — дефолты chevron-left / chevron-right, имя валидируется по allowedIcons -->
1616
+ <CdsSlideView prev-icon="chevron-left" next-icon="chevron-right">
1617
+ <CdsSlideViewItem v-for="i in items" :key="i" :value="i">{{ i }}</CdsSlideViewItem>
1618
+ </CdsSlideView>
1619
+ ```
1620
+
1621
+ **Стало (CDS 4):**
1622
+
1623
+ ```html
1624
+ <!-- CDS 4 — дефолты prev / next, тип IconValue -->
1625
+ <CdsSlideView prev-icon="prev" next-icon="next">
1626
+ <CdsSlideViewItem v-for="i in items" :key="i" :value="i">{{ i }}</CdsSlideViewItem>
1627
+ </CdsSlideView>
1628
+ ```
1629
+
1630
+ **Действие:** если полагались на дефолтные стрелки — проверьте вид (иконки изменены `chevron-left` / `chevron-right` → `prev` / `next`). Явные `prev-icon="chevron-left"` / `next-icon="chevron-right"` замените на имена из активного iconpack (или на `prev` / `next`). Поиск: `grep -rnE "CdsSlideView[^>]*(prev-icon|next-icon)" src/`.
1631
+
1632
+ <!-- entry-meta: id=cdsslideview-arrow-icons-iconvalue; severity=breaking; component=CdsSlideView -->
1633
+
1634
+ ### CdsStatus
1635
+
1636
+ #### Значение `status="error"` переименовано в `status="danger"`
1637
+
1638
+ > 🔁 **RENAMED** — набор статусов выровнен с токенами `--cds-color-status-*`: вместо `error` теперь `danger`.
1639
+
1640
+ **Было (CDS 3):**
1641
+
1642
+ ```html
1643
+ <!-- CDS 3 — status: 'info' | 'success' | 'warning' | 'error' | 'progress' -->
1644
+ <cds-status status="error" text="Ошибка" />
1645
+ ```
1646
+
1647
+ **Стало (CDS 4):**
1648
+
1649
+ ```html
1650
+ <!-- CDS 4 — status: 'info' | 'success' | 'warning' | 'danger' | 'progress' -->
1651
+ <CdsStatus status="danger" text="Ошибка" />
1652
+ ```
1653
+
1654
+ **Действие:** заменить `status="error"` на `status="danger"`. Поиск: `grep -rnE "cds-status[^>]*status=\"error\"|CdsStatus[^>]*status=\"error\"" src/`.
1655
+
1656
+ <!-- entry-meta: id=cdsstatus-status-error-to-danger; severity=renamed; component=CdsStatus -->
1657
+
1658
+ #### Булев проп `icon` заменён на `variant`
1659
+
1660
+ > ⚠️ **BREAKING** — вместо булева флага режима отображения теперь проп `variant: 'fill' | 'text'` (по умолчанию `fill`).
1661
+
1662
+ **Было (CDS 3):**
1663
+
1664
+ ```html
1665
+ <!-- CDS 3 — icon переключал режим: без него заливка-бейдж, с ним — иконка + нейтральный текст -->
1666
+ <cds-status status="success" text="Готово" />
1667
+ <cds-status icon status="success" text="Готово" />
1668
+ ```
1669
+
1670
+ **Стало (CDS 4):**
1671
+
1672
+ ```html
1673
+ <!-- CDS 4 — режим задаётся через variant -->
1674
+ <CdsStatus status="success" text="Готово" />
1675
+ <CdsStatus variant="text" status="success" text="Готово" />
1676
+ ```
1677
+
1678
+ **Действие:** заменить булев `icon` на `variant="text"`. Заливку-бейдж (когда `icon` отсутствовал) менять не нужно — это дефолт `variant="fill"`. Поиск: `grep -rnE "cds-status[^>]*\bicon\b|CdsStatus[^>]*\bicon\b" src/`.
1679
+
1680
+ <!-- entry-meta: id=cdsstatus-icon-to-variant; severity=breaking; component=CdsStatus -->
1681
+
1682
+ ### CdsSteps
1683
+
1684
+ #### Дефолт пропса `interactive` изменён с `true` на `false`
1685
+
1686
+ > ⚠️ **BREAKING** — по умолчанию шаги больше не кликабельны. В CDS 3 переход по клику работал из коробки, а отключался через `:interactive="false"`.
1687
+
1688
+ **Было (CDS 3):**
1689
+
1690
+ ```html
1691
+ <!-- CDS 3 — interactive по умолчанию true: шаги кликабельны из коробки -->
1692
+ <cds-steps v-model="step">
1693
+ <cds-steps-item title="ФИО" text="Имя и фамилия" />
1694
+ <cds-steps-item title="Подтверждение" text="Код из смс" />
1695
+ </cds-steps>
1696
+ ```
1697
+
1698
+ **Стало (CDS 4):**
1699
+
1700
+ ```html
1701
+ <!-- CDS 4 — interactive по умолчанию false: для кликов укажите проп явно -->
1702
+ <CdsSteps v-model="step" interactive>
1703
+ <CdsStepsItem title="ФИО" text="Имя и фамилия" />
1704
+ <CdsStepsItem title="Подтверждение" text="Код из смс" />
1705
+ </CdsSteps>
1706
+ ```
1707
+
1708
+ **Действие:** проверить все использования `CdsSteps`: где нужен переход по клику — добавить проп `interactive`; явные `:interactive="false"` можно удалить (теперь это поведение по умолчанию). Поиск: `grep -rnE "cds-steps|CdsSteps" src/`.
1709
+
1710
+ <!-- entry-meta: id=cdssteps-interactive-default-false; severity=breaking; component=CdsSteps -->
1711
+
1712
+ #### Проп `items`, контентная часть и кнопки навигации
1713
+
1714
+ > ✨ **NEW** — помимо шапки появились контентная часть (`CdsStepsView` / `CdsStepsViewItem`) и кнопки «Назад»/«Далее» (`CdsStepsActions`). Прежний способ с default-слотом и `CdsStepsItem` продолжает работать без изменений.
1715
+
1716
+ **Было (CDS 3):**
1717
+
1718
+ ```html
1719
+ <!-- CDS 3 — компонент рендерил только шапку шагов; контент и навигацию собирали вручную -->
1720
+ <cds-steps v-model="step">
1721
+ <cds-steps-item title="ФИО" text="Имя и фамилия" />
1722
+ <cds-steps-item title="Подтверждение" text="Код из смс" />
1723
+ </cds-steps>
1724
+ <div v-if="step === 0">Контент первого шага</div>
1725
+ <button @click="step++">Далее</button>
1726
+ ```
1727
+
1728
+ **Стало (CDS 4):**
1729
+
1730
+ ```html
1731
+ <!-- CDS 4 — при передаче items рендерятся шапка, контент шагов и кнопки навигации -->
1732
+ <CdsSteps
1733
+ v-model="step"
1734
+ :items="[
1735
+ { title: 'ФИО', text: 'Имя и фамилия' },
1736
+ { title: 'Подтверждение', text: 'Код из смс' }
1737
+ ]"
1738
+ >
1739
+ <template #item.1>Контент первого шага</template>
1740
+ <template #item.2>Контент второго шага</template>
1741
+ </CdsSteps>
1742
+ ```
1743
+
1744
+ **Действие:** миграция не требуется — использование с default-слотом совместимо (без `items` контентная часть и кнопки не рендерятся). Новые возможности: пропсы `items` / `itemTitle` / `itemText` / `itemValue` / `itemProps`, `hideActions`, `prevText` / `nextText`, слоты `header-item(.{value})`, `item(.{value})`, `actions`, `prev`, `next`, методы `prev()` / `next()` через ref, субкомпоненты `CdsStepsView` / `CdsStepsViewItem` / `CdsStepsActions`.
1745
+
1746
+ <!-- entry-meta: id=cdssteps-items-view-actions; severity=new; component=CdsSteps -->
1747
+
1748
+ ### CdsTabsV2
1749
+
1750
+ #### Компонент `CdsTabsV2` переименован в `CdsTabs`
1751
+ #### Компонент `CdsTabV2` переименован в `CdsTab`
1752
+
1753
+ > 🔁 **RENAMED** — публичный API (пропсы, слоты, события) не изменился, переименовано только имя компонента и путь импорта/тега.
1754
+
1755
+ **Было (CDS 3):**
1756
+
1757
+ ```html
1758
+ <!-- CDS 3 -->
1759
+ <script setup lang="ts">
1760
+ import { CdsTabsV2, CdsTabV2 } from '@central-design-system/components';
1761
+ </script>
1762
+
1763
+ <template>
1764
+ <CdsTabsV2>
1765
+ <CdsTabV2>Элемент 1</CdsTabV2>
1766
+ <CdsTabV2>Элемент 2</CdsTabV2>
1767
+ <CdsTabV2>Элемент 3</CdsTabV2>
1768
+ </CdsTabsV2>
1769
+ </template>
1770
+ ```
1771
+
1772
+ **Стало (CDS 4):**
1773
+
1774
+ ```html
1775
+ <!-- CDS 4 -->
1776
+ <script setup lang="ts">
1777
+ import { CdsTabs, CdsTab } from '@central-design-system/components';
1778
+ </script>
1779
+
1780
+ <template>
1781
+ <CdsTabs>
1782
+ <CdsTab>Элемент 1</CdsTab>
1783
+ <CdsTab>Элемент 2</CdsTab>
1784
+ <CdsTab>Элемент 3</CdsTab>
1785
+ </CdsTabs>
1786
+ </template>
1787
+ ```
1788
+
1789
+ **Действие:** заменить импорт и тег `CdsTabV2` → `CdsTab` (включая kebab-case вариант `cds-tabs-v2` → `cds-tabs`). Поиск использований: `grep -rnE "CdsTabsV2|cds-tabs-v2" src/`.
1790
+ **Действие:** заменить импорт и тег `CdsTabV2` → `CdsTab` (включая kebab-case вариант `cds-tab-v2` → `cds-tab`). Поиск использований: `grep -rnE "CdsTabV2|cds-tab-v2" src/`.
1791
+
1792
+ <!-- entry-meta: id=cdstabs-renamed-from-cdstabsv2; severity=renamed; component=CdsTabs -->
1793
+
1794
+ #### Пропсы иконок стрелок прокрутки переименованы
1795
+
1796
+ > 🔁 **RENAMED** — иконки кнопок прокрутки табов задаются через `prevIcon` / `nextIcon` вместо `prependIcon` / `appendIcon`.
1797
+
1798
+ **Было (CDS 3):**
1799
+
1800
+ ```html
1801
+ <!-- CDS 3 -->
1802
+ <CdsTabsV2 prepend-icon="chevron-left" append-icon="chevron-right" :items="items" />
1803
+ ```
1804
+
1805
+ **Стало (CDS 4):**
1806
+
1807
+ ```html
1808
+ <!-- CDS 4 -->
1809
+ <CdsTabs prev-icon="chevron-left" next-icon="chevron-right" :items="items" />
1810
+ ```
1811
+
1812
+ **Действие:** заменить `prepend-icon` / `append-icon` на `prev-icon` / `next-icon` у `CdsTabs`. Поиск: `grep -rnE "CdsTabs(V2)?[^>]*(prepend-icon|append-icon)" src/`.
1813
+
1814
+ <!-- entry-meta: id=cdstabs-arrow-icon-props-renamed; severity=renamed; component=CdsTabs -->
1815
+
1816
+ #### Новые пропсы (цвета, слайдер, режимы, слоты)
1817
+
1818
+ > ✨ **NEW** — помимо переименования компонент существенно расширен (миграция не требуется).
1819
+
1820
+ **Было (CDS 3):**
1821
+
1822
+ ```html
1823
+ <!-- CDS 3 -->
1824
+ <CdsTabsV2 :items="items" grow />
1825
+ ```
1826
+
1827
+ **Стало (CDS 4):**
1828
+
1829
+ ```html
1830
+ <!-- CDS 4 -->
1831
+ <CdsTabs
1832
+ :items="items"
1833
+ color="surface-primary"
1834
+ slider-transition="grow"
1835
+ inset
1836
+ center-active
1837
+ >
1838
+ <template #view>…</template>
1839
+ </CdsTabs>
1840
+ ```
1841
+
1842
+ **Действие:** миграция не требуется. Новые возможности: цветовые пропсы `color` / `baseColor` / `activeColor` / `textColor`, настройка слайдера `hideSlider` / `sliderTransition` / `sliderTransitionDuration`, режимы `inset` / `fixedTabs` / `centerActive` / `mobile`, слоты `tab` / `item` / `view`.
1843
+
1844
+ <!-- entry-meta: id=cdstabs-new-props; severity=new; component=CdsTabs -->
1845
+
1846
+ ### CdsTag
1847
+
1848
+ #### Событие `remove` переименовано в `click:close`
1849
+
1850
+ > 🔁 **RENAMED** — кнопку удаления теперь эмитит унифицированное событие `click:close`; проп `removable` сохранён как псевдоним `closable`.
1851
+
1852
+ **Было (CDS 3):**
1853
+
1854
+ ```html
1855
+ <!-- CDS 3 -->
1856
+ <CdsTag removable @remove="onRemove">Тег</CdsTag>
1857
+ ```
1858
+
1859
+ **Стало (CDS 4):**
1860
+
1861
+ ```html
1862
+ <!-- CDS 4 — removable = closable; событие переименовано -->
1863
+ <CdsTag closable @click:close="onRemove">Тег</CdsTag>
1864
+ ```
1865
+
1866
+ **Действие:** заменить `@remove` на `@click:close`. Поиск: `grep -rnE "(cds-tag|CdsTag)[^>]*@remove" src/`. Дополнительно тегом теперь можно управлять через `v-model` (проп `modelValue`, при `false` тег скрыт).
1867
+
1868
+ <!-- entry-meta: id=cdstag-remove-to-clickclose; severity=renamed; component=CdsTag -->
1869
+
1870
+ #### Удалён слот `text`
1871
+
1872
+ > ⚠️ **BREAKING** — отдельного слота `text` больше нет; текст задаётся пропсами `text` / `content` или слотом по умолчанию.
1873
+
1874
+ **Было (CDS 3):**
1875
+
1876
+ ```html
1877
+ <!-- CDS 3 -->
1878
+ <CdsTag>
1879
+ <template #text>Метка</template>
1880
+ </CdsTag>
1881
+ ```
1882
+
1883
+ **Стало (CDS 4):**
1884
+
1885
+ ```html
1886
+ <!-- CDS 4 — проп text/content или слот по умолчанию -->
1887
+ <CdsTag text="Метка" />
1888
+ <CdsTag>Метка</CdsTag>
1889
+ ```
1890
+
1891
+ **Действие:** заменить `<template #text>` на проп `text` (или `content`), либо на слот по умолчанию. Поиск: `grep -rn "cds-tag" src/ | grep "#text"`.
1892
+
1893
+ <!-- entry-meta: id=cdstag-text-slot-removed; severity=breaking; component=CdsTag -->
1894
+
1895
+ #### Иконки `prependIcon` / `appendIcon` переведены на новую систему иконок
1896
+
1897
+ > ⚠️ **BREAKING** — вместо строкового имени с валидацией по `allowedIcons` пропсы принимают `IconValue` и резолвятся через iconpacks (см. раздел [«Иконки»](#2-иконки)).
1898
+
1899
+ **Было (CDS 3):**
1900
+
1901
+ ```html
1902
+ <!-- CDS 3 — имя иконки валидировалось по allowedIcons -->
1903
+ <CdsTag prepend-icon="bookmark" text="Метка" />
1904
+ ```
1905
+
1906
+ **Стало (CDS 4):**
1907
+
1908
+ ```html
1909
+ <!-- CDS 4 — IconValue: имя из iconpack, компонент или булево -->
1910
+ <CdsTag prepend-icon="bookmark" text="Метка" />
1911
+ ```
1912
+
1913
+ **Действие:** убедиться, что используемые имена иконок есть в подключённом iconpack (см. раздел «Иконки»). Синтаксис использования не меняется, но резолвинг и валидация теперь идут через новую систему иконок.
1914
+
1915
+ <!-- entry-meta: id=cdstag-icons-iconvalue; severity=breaking; component=CdsTag -->
1916
+
1917
+ ### CdsTextArea
1918
+
1919
+ #### Удалён пропс `limit`
1920
+
1921
+ > ⚠️ **BREAKING** — в CDS 3 `limit` задавал одновременно ограничение ввода (`maxlength`) и максимум счётчика. В CDS 4 он удалён: ограничение ввода — нативный атрибут `maxlength`, счётчик — проп `counter` / `counterValue`.
1922
+
1923
+ **Было (CDS 3):**
1924
+
1925
+ ```html
1926
+ <!-- CDS 3 — limit = maxlength + максимум счётчика -->
1927
+ <cds-text-area v-model="text" :limit="200" counter />
1928
+ ```
1929
+
1930
+ **Стало (CDS 4):**
1931
+
1932
+ ```html
1933
+ <!-- CDS 4 — maxlength ограничивает ввод, counter задаёт счётчик и его максимум -->
1934
+ <CdsTextArea v-model="text" maxlength="200" :counter="200" />
1935
+ ```
1936
+
1937
+ **Действие:** убрать `:limit="N"`; ограничение ввода задать нативным `maxlength="N"`, а счётчик — пропсом `counter` (`boolean | number | string`; число/строка задаёт максимум) или `counterValue`. Поиск: `grep -rnE "cds-text-area[^>]*limit|CdsTextArea[^>]*limit" src/`.
1938
+
1939
+ <!-- entry-meta: id=cdstextarea-limit-removed; severity=breaking; component=CdsTextArea -->
1940
+
1941
+ #### Изменён exposed-API
1942
+
1943
+ > ⚠️ **BREAKING** — вместо `id` / `isFocused` / `fieldRef` / `textareaRef` / `validationRef` / `sizerRef` / `focus` / `blur` компонент отдаёт унифицированный validation-API и `controlRef` (как у `CdsInput`).
1944
+
1945
+ **Было (CDS 3):**
1946
+
1947
+ ```ts
1948
+ // CDS 3 — exposed: id, isFocused, fieldRef, textareaRef, validationRef, sizerRef, focus, blur
1949
+ const area = ref();
1950
+ area.value.textareaRef; // <textarea>
1951
+ area.value.validationRef; // инстанс CdsInput
1952
+ area.value.focus();
1953
+ ```
1954
+
1955
+ **Стало (CDS 4):**
1956
+
1957
+ ```ts
1958
+ // CDS 4 — методы и флаги валидации + controlRef
1959
+ const area = ref();
1960
+ area.value.validate(); // запуск валидации
1961
+ area.value.reset(); // сброс значения
1962
+ area.value.resetValidation(); // сброс ошибок
1963
+ area.value.isValid; // isDirty / isDisabled / isReadonly / isPure / isValidating
1964
+ area.value.controlRef; // DOM-элемент контрола (<textarea>)
1965
+ ```
1966
+
1967
+ **Действие:** заменить обращения к `ref.textareaRef` / `ref.validationRef` / `ref.fieldRef` / `ref.sizerRef` / `ref.focus()` / `ref.blur()` на validation-API (`validate` / `reset` / `resetValidation`, флаги `isValid` / `isDirty` / `isValidating` / `isDisabled` / `isReadonly` / `isPure`) и `controlRef` для доступа к DOM-элементу поля.
1968
+
1969
+ <!-- entry-meta: id=cdstextarea-exposed-api-changed; severity=breaking; component=CdsTextArea -->
1970
+
1971
+
1972
+ ### CdsTextInput
1973
+
1974
+ #### Удалён пропс `limit`
1975
+
1976
+ > ⚠️ **BREAKING** — в CDS 3 `limit` задавал одновременно ограничение ввода (`maxlength`) и максимум счётчика. В CDS 4 он удалён: ограничение ввода — нативный атрибут `maxlength`, счётчик — проп `counter` / `counterValue`.
1977
+
1978
+ **Было (CDS 3):**
1979
+
1980
+ ```html
1981
+ <!-- CDS 3 — limit = maxlength + максимум счётчика -->
1982
+ <cds-text-input v-model="text" :limit="60" counter />
1983
+ ```
1984
+
1985
+ **Стало (CDS 4):**
1986
+
1987
+ ```html
1988
+ <!-- CDS 4 — maxlength ограничивает ввод, counter задаёт счётчик и его максимум -->
1989
+ <CdsTextInput v-model="text" maxlength="60" :counter="60" />
1990
+ ```
1991
+
1992
+ **Действие:** убрать `:limit="N"`; ограничение ввода задать нативным `maxlength="N"`, а счётчик — пропсом `counter` (`boolean | number | string`; число/строка задаёт максимум) или `counterValue`. Поиск: `grep -rnE "cds-text-input[^>]*limit|CdsTextInput[^>]*limit" src/`.
1993
+
1994
+ <!-- entry-meta: id=cdstextinput-limit-removed; severity=breaking; component=CdsTextInput -->
1995
+
1996
+ #### Удалён пропс `persistentMessages`, а `messages` видны всегда
1997
+
1998
+ > ⚠️ **BREAKING** — роли разошлись. В CDS 3 `messages` показывались только в фокусе, а `persistentMessages` их закреплял. В CDS 4 `messages` видны **всегда**, поэтому `persistentMessages` удалён за ненадобностью, а «только в фокусе» — это отдельный пропс `hint` (с `persistentHint`, если подсказку нужно закрепить).
1999
+
2000
+ **Было (CDS 3):**
2001
+
2002
+ ```html
2003
+ <!-- CDS 3 -->
2004
+ <cds-text-input v-model="text" :messages="hint" persistent-messages />
2005
+ <cds-text-input v-model="text" :messages="hint" />
2006
+ ```
2007
+
2008
+ **Стало (CDS 4):**
2009
+
2010
+ ```html
2011
+ <!-- CDS 4 — messages видны всегда; показ по фокусу даёт hint -->
2012
+ <CdsTextInput v-model="text" :messages="hint" />
2013
+ <CdsTextInput v-model="text" :hint="hint" />
2014
+ ```
2015
+
2016
+ **Действие:** там, где стоял `persistent-messages`, достаточно удалить пропс — `messages` и так видны всегда, переносить текст в `hint` не нужно. Там, где `messages` использовались **без** него, перенести текст в `hint`: иначе подсказка, которая раньше появлялась по фокусу, после апгрейда будет висеть постоянно — код не сломается, но поле станет выглядеть иначе. Поиск: `grep -rnE "persistent-messages|persistentMessages|:messages|messages=" src/`. Начиная с CDS 3.11.0 оба случая предупреждают в консоли (`[CDS UPGRADE]`), а `hint` / `persistent-hint` там уже работают — переписать можно до апгрейда.
2017
+
2018
+ <!-- entry-meta: id=cdstextinput-persistentmessages-removed; severity=breaking; component=CdsTextInput -->
2019
+
2020
+ #### Изменён exposed-API
2021
+
2022
+ > ⚠️ **BREAKING** — вместо `fieldRef` / `inputRef` / `validationRef` / `focus` / `blur` компонент отдаёт унифицированный validation-API и `controlRef` (как у `CdsInput`).
2023
+
2024
+ **Было (CDS 3):**
2025
+
2026
+ ```ts
2027
+ // CDS 3 — exposed: fieldRef, inputRef, validationRef, focus, blur
2028
+ const input = ref();
2029
+ input.value.inputRef; // <input>
2030
+ input.value.validationRef; // инстанс CdsInput
2031
+ input.value.focus();
2032
+ ```
2033
+
2034
+ **Стало (CDS 4):**
2035
+
2036
+ ```ts
2037
+ // CDS 4 — методы и флаги валидации + controlRef
2038
+ const input = ref();
2039
+ input.value.validate(); // запуск валидации
2040
+ input.value.reset(); // сброс значения
2041
+ input.value.resetValidation(); // сброс ошибок
2042
+ input.value.isValid; // isDirty / isDisabled / isReadonly / isPure / isValidating
2043
+ input.value.controlRef; // DOM-элемент контрола (<input>)
2044
+ ```
2045
+
2046
+ **Действие:** заменить обращения к `ref.inputRef` / `ref.fieldRef` / `ref.validationRef` / `ref.focus()` / `ref.blur()` на validation-API (`validate` / `reset` / `resetValidation`, флаги `isValid` / `isDirty` / `isValidating` / `isDisabled` / `isReadonly` / `isPure`) и `controlRef` для доступа к DOM-элементу поля.
2047
+
2048
+ <!-- entry-meta: id=cdstextinput-exposed-api-changed; severity=breaking; component=CdsTextInput -->
2049
+
2050
+
2051
+ ### CdsTooltip
2052
+
2053
+ #### Наведение на контент подсказки теперь закрывает её — интерактивность через проп `interactive`
2054
+
2055
+ > ⚠️ **BREAKING** — по умолчанию контент подсказки получил `pointer-events: none`: при переносе курсора с активатора на контент подсказка закрывается. В CDS 3 подсказка оставалась открытой, и внутри можно было кликать ссылки и кнопки без дополнительных пропсов.
2056
+
2057
+ **Было (CDS 3):**
2058
+
2059
+ ```html
2060
+ <!-- CDS 3 — контент подсказки был интерактивен по умолчанию -->
2061
+ <cds-tooltip v-model="active" location="end" open-on-click :open-on-hover="false">
2062
+ <template #activator="{ props }">
2063
+ <cds-button appearance="tertiary" icon="comment" v-bind="props" @click="active = true" />
2064
+ </template>
2065
+ <p>Текст подсказки</p>
2066
+ <cds-link href="/docs" text="Узнать больше" />
2067
+ </cds-tooltip>
2068
+ ```
2069
+
2070
+ **Стало (CDS 4):**
2071
+
2072
+ ```html
2073
+ <!-- CDS 4 — для кликабельного контента нужен проп interactive -->
2074
+ <CdsTooltip v-model="active" interactive location="end" open-on-click :open-on-hover="false">
2075
+ <template #activator="{ props }">
2076
+ <CdsButton appearance="tertiary" icon="comment" v-bind="props" @click="active = true" />
2077
+ </template>
2078
+ <p>Текст подсказки</p>
2079
+ <a href="/docs">Узнать больше</a>
2080
+ </CdsTooltip>
2081
+ ```
2082
+
2083
+ **Действие:** найти тултипы с интерактивным контентом (ссылки, кнопки, выделяемый текст) и добавить им проп `interactive`. Простые текстовые подсказки менять не нужно. Поиск кандидатов: `grep -rnE "cds-tooltip|CdsTooltip" src/` — проверить те, у кого в default-слоте есть `<a>`, `CdsButton` и т. п.
2084
+
2085
+ <!-- entry-meta: id=cdstooltip-interactive-prop-required; severity=breaking; component=CdsTooltip -->
2086
+
2087
+ #### Изменён exposed-API
2088
+
2089
+ > ⚠️ **BREAKING** — вместо `id` / `overlay` компонент отдаёт элементы и методы оверлея напрямую.
2090
+
2091
+ **Было (CDS 3):**
2092
+
2093
+ ```ts
2094
+ // CDS 3
2095
+ const tip = ref();
2096
+ tip.value.overlay; // инстанс CdsOverlay
2097
+ tip.value.id; // id подсказки
2098
+ ```
2099
+
2100
+ **Стало (CDS 4):**
2101
+
2102
+ ```ts
2103
+ // CDS 4
2104
+ const tip = ref();
2105
+ tip.value.contentEl; // DOM-элемент контента
2106
+ tip.value.activatorEl; // DOM-элемент активатора
2107
+ tip.value.updateLocation?.(e); // пересчёт позиции
2108
+ ```
2109
+
2110
+ **Действие:** заменить обращения к `ref.overlay` / `ref.id` на новые exposed-поля (`contentEl`, `activatorEl`, `rootEl`, `targetEl`, `updateLocation`, `animateClick`).
2111
+
2112
+ <!-- entry-meta: id=cdstooltip-exposed-api-changed; severity=breaking; component=CdsTooltip -->
2113
+
2114
+ ### CdsContainer
2115
+
2116
+ > ⚠️ **BREAKING** — Компонент `CdsContainer` (и `CdsContainerItem`) был помечен `deprecated` ещё в CDS 3 и удалён в CDS 4. Способ миграции зависит от того, как контейнер использовался: обычный/вложенный → нативный `<div>`; выбираемый/множественный → `CdsCard` + `CdsCardGroup`; кликабельный → `CdsCard` со ссылкой.
2117
+
2118
+ #### Обычный и вложенный контейнер → нативный `<div>`
2119
+
2120
+ **Было (CDS 3):**
2121
+
2122
+ ```html
2123
+ <!-- CDS 3 -->
2124
+ <CdsContainer>
2125
+ <CdsContainerItem>
2126
+ <div class="h6 cds-mb-xs">Заголовок контейнера</div>
2127
+ <p>Используется в качестве элемента, где вся область контейнера — это интерактивное состояние.</p>
2128
+ </CdsContainerItem>
2129
+ </CdsContainer>
2130
+ ```
2131
+
2132
+ **Стало (CDS 4):**
2133
+
2134
+ ```html
2135
+ <!-- CDS 4 — обычный div + утилиты Tailwind и токены CDS -->
2136
+ <div class="rounded-200 bg-surface-primary p-4">
2137
+ <div class="h6 mb-1">Заголовок контейнера</div>
2138
+ <p>Используется в качестве элемента, где вся область контейнера — это интерактивное состояние.</p>
2139
+ </div>
2140
+ ```
2141
+
2142
+ **Действие:** заменить `CdsContainer` / `<div class="cds-container-default …">` обычным `<div>` с утилитарными классами. В CDS 3 этот же совет давался прямо в сторибуке (`CdsContainer/stories/features.stories.ts`, story «Обычный контейнер»/«Вложенные контейнеры»), а в CDS 4 он тем более уместен — доступны Tailwind v4 и design-токены как утилиты (`bg-surface-*`, `rounded-200`, см. раздел «Интеграция с Tailwind CSS v4»). Поиск: `grep -rnE "CdsContainer|cds-container|cds-container-default" src/`.
2143
+
2144
+ #### Выбираемый и множественный контейнер → `CdsCard` + `CdsCardGroup`
2145
+
2146
+ **Было (CDS 3):**
2147
+
2148
+ ```html
2149
+ <!-- CDS 3 — выбираемые контейнеры через CdsContainer + CdsContainerItem -->
2150
+ <script setup lang="ts">
2151
+ import { CdsContainer, CdsContainerItem } from '@central-design-system/components';
2152
+ import { ref } from 'vue';
2153
+
2154
+ const model = ref(1); // множественный: ref([2]) + проп multiple
2155
+ </script>
2156
+
2157
+ <template>
2158
+ <cds-container v-model="model" required>
2159
+ <cds-container-item :value="1">
2160
+ <h6>Заголовок контейнера</h6>
2161
+ <p>Используется в качестве элемента, где вся область контейнера — это интерактивное состояние.</p>
2162
+ </cds-container-item>
2163
+ <cds-container-item :value="2">…</cds-container-item>
2164
+ <cds-container-item :value="3">…</cds-container-item>
2165
+ </cds-container>
2166
+ </template>
2167
+ ```
2168
+
2169
+ **Стало (CDS 4):**
2170
+
2171
+ ```html
2172
+ <!-- CDS 4 — та же логика выбора на CdsCardGroup + CdsCard -->
2173
+ <script setup lang="ts">
2174
+ import { CdsCard, CdsCardGroup } from '@central-design-system/components';
2175
+ import { ref } from 'vue';
2176
+
2177
+ const selected = ref(1); // множественный: ref([2]) + проп multiple на CdsCardGroup
2178
+ const items = [1, 2, 3];
2179
+ </script>
2180
+
2181
+ <template>
2182
+ <CdsCardGroup v-model="selected" required class="gap-4">
2183
+ <CdsCard
2184
+ v-for="item in items"
2185
+ :key="item"
2186
+ title="Заголовок карточки"
2187
+ text="Используется в качестве элемента, где вся область карточки — это интерактивное состояние."
2188
+ :value="item"
2189
+ />
2190
+ </CdsCardGroup>
2191
+ </template>
2192
+ ```
2193
+
2194
+ **Действие:** заменить `CdsContainer` c `v-model` на `CdsCardGroup`, а каждый `CdsContainerItem` — на `CdsCard` с `:value`. Пропсы `required` и `multiple` переносятся на `CdsCardGroup` без изменений (одиночный выбор — `v-model` числом, множественный — массивом + `multiple`). Готовые примеры: `packages/components/src/components/CdsCard/docs/CdsCard.stories.ts` — story `Group` (выбираемая группа) и `Multiselectable` (множественный выбор).
2195
+
2196
+ #### Кликабельный контейнер → `CdsCard` со ссылкой
2197
+
2198
+ **Было (CDS 3):**
2199
+
2200
+ ```html
2201
+ <!-- CDS 3 — кликабельный контейнер-ссылка через обёртку CdsLink -->
2202
+ <cds-container>
2203
+ <cds-link href="#">
2204
+ <cds-container-item>
2205
+ <h6>Заголовок контейнера</h6>
2206
+ <p>Используется в качестве элемента, где вся область контейнера — это интерактивное состояние.</p>
2207
+ </cds-container-item>
2208
+ </cds-link>
2209
+ </cds-container>
2210
+ ```
2211
+
2212
+ **Стало (CDS 4):**
2213
+
2214
+ ```html
2215
+ <!-- CDS 4 — CdsCard сам становится ссылкой через href / to -->
2216
+ <CdsCard
2217
+ title="Заголовок карточки"
2218
+ text="Используется в качестве элемента, где вся область карточки — это интерактивное состояние."
2219
+ href="#"
2220
+ />
2221
+ ```
2222
+
2223
+ **Действие:** заменить связку `CdsContainer` + `CdsLink` + `CdsContainerItem` одним `CdsCard` со свойством `href` (внешняя ссылка) или `to` (vue-router). Пример: `CdsCard.stories.ts`, story `Link`.
2224
+
2225
+ <!-- entry-meta: id=cdscontainer-removed; severity=breaking; component=CdsContainer -->