@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,785 @@
1
+ # CdsTree — usage examples
2
+
3
+ > Extracted from Storybook stories (`docs/*.stories.ts`) by `bun run generate:skill`. Do not edit manually.
4
+ > The full component contract is in [api.md](api.md). `v-bind="args"` in templates refers to the props from the **Args** block of the corresponding example.
5
+
6
+ A tree shows a hierarchy: catalog sections, project files, an org structure. Nodes expand, get selected by a click or with checkboxes, load from the server and can be dragged, while virtual scrolling keeps everything smooth even with thousands of nodes.
7
+
8
+ ## Expanding nodes
9
+
10
+ The data of the tree is an array of `{ title, key, children }` nodes in the `tree-data` prop. The expanded state is driven by `v-model:expanded-keys`; if you do not need to control it, set the initial state through `default-expanded-keys` or `default-expand-all`.
11
+
12
+ **Example (SFC):**
13
+
14
+ ```vue
15
+ <script setup lang="ts">
16
+ import type { NTree } from '@central-design-system/components';
17
+ import { CdsTree } from '@central-design-system/components';
18
+ import { ref } from 'vue';
19
+
20
+ const basicTreeData: NTree.IDataNode[] = [
21
+ {
22
+ title: 'Родительский узел 1',
23
+ key: '0-0',
24
+ children: [
25
+ {
26
+ title: 'Родительский узел 1-0',
27
+ key: '0-0-0',
28
+ children: [
29
+ { title: 'Вложенный узел', key: '0-0-0-0' },
30
+ { title: 'Вложенный узел', key: '0-0-0-1' }
31
+ ]
32
+ },
33
+ {
34
+ title: 'Родительский узел 1-1',
35
+ key: '0-0-1',
36
+ children: [{ title: 'Вложенный узел', key: '0-0-1-0' }]
37
+ }
38
+ ]
39
+ }
40
+ ];
41
+
42
+ const expandedKeys = ref<string[]>(['0-0-0']);
43
+ const treeData = basicTreeData;
44
+ </script>
45
+
46
+ <template>
47
+ <div class="m-auto max-w-[320px]">
48
+ <CdsTree v-model:expanded-keys="expandedKeys" :tree-data="treeData" />
49
+ </div>
50
+ </template>
51
+ ```
52
+
53
+ ## Expanding nodes
54
+
55
+ The `expand-action` prop expands a node by a click on the whole row: `click` for a single click, `dblclick` for a double one. Without it a node expands only from the switcher.
56
+
57
+ **Example (SFC):**
58
+
59
+ ```vue
60
+ <script setup lang="ts">
61
+ import type { NTree } from '@central-design-system/components';
62
+ import { CdsTree } from '@central-design-system/components';
63
+
64
+ const treeData = (action: NTree.TExpandAction): NTree.IDataNode[] => [
65
+ {
66
+ title: action === 'click' ? 'Нажми на меня' : 'Дважды нажми на меня',
67
+ key: '0-0',
68
+ children: [
69
+ {
70
+ title: 'Родительский узел 1-0',
71
+ key: '0-0-0',
72
+ children: [
73
+ { title: 'Вложенный узел', key: '0-0-0-0' },
74
+ { title: 'Вложенный узел', key: '0-0-0-1' }
75
+ ]
76
+ },
77
+ {
78
+ title: 'Родительский узел 1-1',
79
+ key: '0-0-1',
80
+ children: [{ title: 'Вложенный узел', key: '0-0-1-0' }]
81
+ }
82
+ ]
83
+ }
84
+ ];
85
+ </script>
86
+
87
+ <template>
88
+ <div class="m-auto flex max-w-[320px] flex-col gap-4">
89
+ <CdsTree :tree-data="treeData('click')" expand-action="click" />
90
+ <CdsTree :tree-data="treeData('dblclick')" expand-action="dblclick" />
91
+ </div>
92
+ </template>
93
+ ```
94
+
95
+ ## Selecting nodes and checkboxes
96
+
97
+ The `selectable` prop turns on selecting a node by a click (`v-model:selected-keys`), `multiple` allows selecting several nodes. The `checkable` prop adds checkboxes with their own `v-model:checked-keys` state: checking a parent checks all its descendants, and a partially checked parent goes into the indeterminate state (turned off with the `check-strictly` prop). Individual nodes are disabled with the `disabled` and `disableCheckbox` flags right in the data.
98
+
99
+ **Example (SFC):**
100
+
101
+ ```vue
102
+ <script setup lang="ts">
103
+ import type { NTree } from '@central-design-system/components';
104
+ import { CdsToggle, CdsTree } from '@central-design-system/components';
105
+ import { ref } from 'vue';
106
+
107
+ const treeData: NTree.IDataNode[] = [
108
+ {
109
+ title: 'Родительский узел 1',
110
+ key: '0-0',
111
+ children: [
112
+ {
113
+ title: 'Родительский узел 1-0',
114
+ key: '0-0-0',
115
+ children: [
116
+ { title: 'Заблокированный узел', key: '0-0-0-0', disabled: true },
117
+ { title: 'Заблокированный чекбокс', key: '0-0-0-1', disableCheckbox: true },
118
+ { title: 'Вложенный узел', key: '0-0-0-2' }
119
+ ]
120
+ },
121
+ {
122
+ title: 'Родительский узел 1-1',
123
+ key: '0-0-1',
124
+ children: [
125
+ { title: 'Вложенный узел', key: '0-0-1-0' },
126
+ { title: 'Вложенный узел', key: '0-0-1-1' },
127
+ { title: 'Вложенный узел', key: '0-0-1-2' }
128
+ ]
129
+ }
130
+ ]
131
+ }
132
+ ];
133
+
134
+ const expandedKeys = ref<string[]>(['0-0-0']);
135
+ const selectedKeys = ref<string[]>(['0-0-0']);
136
+ const checkedKeys = ref<string[]>(['0-0-0']);
137
+ const isMultiple = ref(false);
138
+ </script>
139
+
140
+ <template>
141
+ <div class="m-auto max-w-[420px]">
142
+ <div class="mb-2">
143
+ <CdsToggle v-model="isMultiple" label="Мультивыбор selectedKeys" hide-messages />
144
+ </div>
145
+
146
+ <CdsTree
147
+ v-model:expanded-keys="expandedKeys"
148
+ v-model:selected-keys="selectedKeys"
149
+ v-model:checked-keys="checkedKeys"
150
+ :tree-data="treeData"
151
+ :multiple="isMultiple"
152
+ checkable
153
+ selectable
154
+ />
155
+
156
+ <div class="mt-4 flex justify-between gap-2 text-content-secondary">
157
+ <div>
158
+ <span>expandedKeys:</span>
159
+ <pre>{{ expandedKeys }}</pre>
160
+ </div>
161
+ <div>
162
+ <span>selectedKeys:</span>
163
+ <pre>{{ selectedKeys }}</pre>
164
+ </div>
165
+ <div>
166
+ <span>checkedKeys:</span>
167
+ <pre>{{ checkedKeys }}</pre>
168
+ </div>
169
+ </div>
170
+ </div>
171
+ </template>
172
+ ```
173
+
174
+ ## Connecting lines
175
+
176
+ The `show-line` prop draws lines between the nodes — in deep trees this makes it easier to follow the levels. The `{ showLeafIcon }` object controls the icon of the leaf nodes.
177
+
178
+ **Example (SFC):**
179
+
180
+ ```vue
181
+ <script setup lang="ts">
182
+ import type { NTree } from '@central-design-system/components';
183
+ import { CdsToggle, CdsTree } from '@central-design-system/components';
184
+ import { ref } from 'vue';
185
+
186
+ const treeData: NTree.IDataNode[] = [
187
+ {
188
+ title: 'Родительский узел 1',
189
+ key: '0-0',
190
+ children: [
191
+ {
192
+ title: 'Родительский узел 1-0',
193
+ key: '0-0-0',
194
+ children: [
195
+ { title: 'Вложенный узел 1', key: '0-0-0-0' },
196
+ { title: 'Многострочный вложенный узел 2', key: '0-0-0-1' },
197
+ { title: 'Вложенный узел 3', key: '0-0-0-2' }
198
+ ]
199
+ },
200
+ {
201
+ title: 'Родительский узел 1-1',
202
+ key: '0-0-1',
203
+ children: [{ title: 'Вложенный узел 1', key: '0-0-1-0' }]
204
+ }
205
+ ]
206
+ },
207
+ {
208
+ title: 'Родительский узел 2',
209
+ key: '0-1',
210
+ children: [
211
+ {
212
+ title: 'Родительский узел 2-0',
213
+ key: '0-1-0',
214
+ children: [
215
+ { title: 'Вложенный узел', key: '0-1-0-0' },
216
+ { title: 'Вложенный узел', key: '0-1-0-1' }
217
+ ]
218
+ }
219
+ ]
220
+ }
221
+ ];
222
+
223
+ const showLeafIcon = ref(false);
224
+
225
+ const onSelect = (selectedKeys: NTree.TKey[], info: unknown) => {
226
+ console.log('selected', selectedKeys, info);
227
+ };
228
+ </script>
229
+
230
+ <template>
231
+ <div class="m-auto max-w-[320px]">
232
+ <div class="mb-2">
233
+ <CdsToggle v-model="showLeafIcon" label="Иконка листа" hide-messages />
234
+ </div>
235
+ <CdsTree :tree-data="treeData" :default-expanded-keys="['0-0-0']" :show-line="{ showLeafIcon }" @select="onSelect">
236
+ <template #title="{ title, key }">
237
+ <template v-if="key === '0-0-0-1'">
238
+ <div>{{ title }}</div>
239
+ <div>{{ title }}</div>
240
+ </template>
241
+ <template v-else>{{ title }}</template>
242
+ </template>
243
+ </CdsTree>
244
+ </div>
245
+ </template>
246
+ ```
247
+
248
+ ## Icons and slots
249
+
250
+ Slots customize every part of a node; they receive the node context — `key`, `title`, `expanded`, `selected` and other fields.
251
+
252
+ **Example (SFC):**
253
+
254
+ ```vue
255
+ <script setup lang="ts">
256
+ import type { NTree } from '@central-design-system/components';
257
+ import { CdsIcon, CdsTree } from '@central-design-system/components';
258
+
259
+ const treeData: NTree.IDataNode[] = [
260
+ {
261
+ title: 'Родительский узел 1',
262
+ key: '0-0',
263
+ children: [
264
+ {
265
+ title: 'Родительский узел 1-0',
266
+ key: '0-0-0',
267
+ disabled: true,
268
+ children: [
269
+ { title: 'Вложенный узел', key: '0-0-0-0' },
270
+ { title: 'Вложенный узел', key: '0-0-0-1' }
271
+ ]
272
+ },
273
+ {
274
+ title: 'Родительский узел 1-1',
275
+ key: '0-0-1',
276
+ children: [
277
+ { title: 'Вложенный узел', key: '0-0-1-0' },
278
+ { title: 'Вложенный узел', key: '0-0-1-1' }
279
+ ]
280
+ }
281
+ ]
282
+ }
283
+ ];
284
+ </script>
285
+
286
+ <template>
287
+ <div class="m-auto max-w-[320px]">
288
+ <CdsTree :tree-data="treeData" default-expand-all show-icon checkable>
289
+ <template #switcherIcon="{ switcherCls, expanded }">
290
+ <CdsIcon :name="expanded ? 'minus' : 'plus'" :class="switcherCls" />
291
+ </template>
292
+
293
+ <template #icon="{ key, selected }">
294
+ <CdsIcon v-if="key === '0-0'" name="add" />
295
+ <CdsIcon v-else-if="key === '0-0-0'" name="settings" />
296
+ <CdsIcon v-else-if="selected" name="info-fill" />
297
+ <CdsIcon v-else name="info" />
298
+ </template>
299
+
300
+ <template #title="{ title, key }">
301
+ <div v-if="key === '0-0-1-0'" class="flex items-center gap-1">
302
+ <strong>{{ title }}</strong>
303
+ <CdsIcon name="star" />
304
+ </div>
305
+ <template v-else>{{ title }}</template>
306
+ </template>
307
+ </CdsTree>
308
+ </div>
309
+ </template>
310
+ ```
311
+
312
+ ## Asynchronous loading
313
+
314
+ The `load-data` prop loads the child nodes on the first expand: the function receives the node, returns a promise and adds `children` to the data. Until the promise resolves, the node shows a loading indicator.
315
+
316
+ **Example (SFC):**
317
+
318
+ ```vue
319
+ <script setup lang="ts">
320
+ import type { NTree } from '@central-design-system/components';
321
+ import { CdsTree } from '@central-design-system/components';
322
+ import { ref, unref } from 'vue';
323
+
324
+ const treeData = ref<NTree.IDataNode[]>([
325
+ { title: 'Родительский асинхронный узел', key: '0' },
326
+ { title: 'Родительский асинхронный узел', key: '1' },
327
+ { title: 'Родительский узел', key: '2', isLeaf: true }
328
+ ]);
329
+
330
+ const expandedKeys = ref<string[]>([]);
331
+ const selectedKeys = ref<string[]>([]);
332
+
333
+ const onLoadData = (treeNode: NTree.IEventDataNode) =>
334
+ new Promise<void>((resolve) => {
335
+ if (treeNode.dataRef && treeNode.dataRef.children) {
336
+ resolve();
337
+ return;
338
+ }
339
+
340
+ setTimeout(() => {
341
+ if (!treeNode.dataRef) return;
342
+
343
+ treeNode.dataRef.children = [
344
+ { title: 'Вложенный асинхронный узел', key: `${treeNode.eventKey}-0` },
345
+ { title: 'Вложенный асинхронный узел', key: `${treeNode.eventKey}-1` }
346
+ ];
347
+
348
+ treeData.value = [...unref(treeData)];
349
+
350
+ resolve();
351
+ }, 1000);
352
+ });
353
+ </script>
354
+
355
+ <template>
356
+ <div class="m-auto max-w-[320px]">
357
+ <CdsTree
358
+ v-model:expanded-keys="expandedKeys"
359
+ v-model:selected-keys="selectedKeys"
360
+ :tree-data="treeData"
361
+ :load-data="onLoadData"
362
+ />
363
+ </div>
364
+ </template>
365
+ ```
366
+
367
+ ## Dragging
368
+
369
+ The `draggable` prop allows dragging the nodes; the `{ icon: true }` variant shows a drag handle. The tree does not change the data by itself — the `@drop` handler rebuilds `tree-data`, and `allow-drop` limits the valid drop targets.
370
+
371
+ **Example (SFC):**
372
+
373
+ ```vue
374
+ <script setup lang="ts">
375
+ import type { NTree } from '@central-design-system/components';
376
+ import { CdsTree } from '@central-design-system/components';
377
+ import { ref, unref } from 'vue';
378
+
379
+ const generatedData: NTree.IDataNode[] = [];
380
+
381
+ const x = 5;
382
+ const y = 3;
383
+ const z = 2;
384
+
385
+ const generateData = (level: number, preKey = '0', treeNode: NTree.IDataNode[] = generatedData) => {
386
+ const children: string[] = [];
387
+ for (let i = 0; i < x; i++) {
388
+ const key = `${preKey}-${i}`;
389
+ treeNode.push({ title: key, key });
390
+ if (i < y) {
391
+ children.push(key);
392
+ }
393
+ }
394
+ if (level < 0) {
395
+ return treeNode;
396
+ }
397
+ const nextLevel = level - 1;
398
+ children.forEach((key, index) => {
399
+ treeNode[index].children = [];
400
+ generateData(nextLevel, key, treeNode[index].children);
401
+ });
402
+ };
403
+
404
+ generateData(z);
405
+
406
+ const treeData = ref<NTree.IDataNode[]>(generatedData);
407
+
408
+ const onDrop = (info: any) => {
409
+ const dropKey = info.node.key;
410
+ const dragKey = info.dragNode!.key;
411
+ const dropPos = info.node.pos!.split('-');
412
+ const dropPosition = info.dropPosition - Number(dropPos[dropPos.length - 1]);
413
+
414
+ const loop = (data: NTree.IDataNode[] | undefined, key: string | number, callback: any) => {
415
+ if (!data) return;
416
+ data.forEach((item, index) => {
417
+ if (item.key === key) {
418
+ return callback(item, index, data);
419
+ }
420
+ if (item.children) {
421
+ return loop(item.children, key, callback);
422
+ }
423
+ });
424
+ };
425
+
426
+ const data = [...unref(treeData)];
427
+ let dragObj: NTree.IDataNode;
428
+
429
+ loop(data, dragKey!, (item: NTree.IDataNode, index: number, arr: NTree.IDataNode[]) => {
430
+ arr.splice(index, 1);
431
+ dragObj = item;
432
+ });
433
+
434
+ if (!info.dropToGap) {
435
+ loop(data, dropKey!, (item: NTree.IDataNode) => {
436
+ item.children = item.children || [];
437
+ item.children.unshift(dragObj);
438
+ });
439
+ } else if ((info.node.children || []).length > 0 && info.node.expanded && dropPosition === 1) {
440
+ loop(data, dropKey!, (item: NTree.IDataNode) => {
441
+ item.children = item.children || [];
442
+ item.children.unshift(dragObj);
443
+ });
444
+ } else {
445
+ let ar: NTree.IDataNode[] = [];
446
+ let i = 0;
447
+ loop(data, dropKey!, (_item: NTree.IDataNode, index: number, arr: NTree.IDataNode[]) => {
448
+ ar = arr;
449
+ i = index;
450
+ });
451
+ if (dropPosition === -1) {
452
+ ar.splice(i, 0, dragObj!);
453
+ } else {
454
+ ar.splice(i + 1, 0, dragObj!);
455
+ }
456
+ }
457
+
458
+ treeData.value = data;
459
+ };
460
+ </script>
461
+
462
+ <template>
463
+ <div class="m-auto max-w-[320px]">
464
+ <CdsTree :tree-data="treeData" :draggable="{ icon: true }" block-node @drop="onDrop" />
465
+ </div>
466
+ </template>
467
+ ```
468
+
469
+ ## Virtual scrolling
470
+
471
+ The virtual list is on by default (the `virtual` prop). Set `height` and the tree scrolls inside a fixed height, rendering only the visible nodes: thousands of rows do not slow the page down.
472
+
473
+ **Example (SFC):**
474
+
475
+ ```vue
476
+ <script setup lang="ts">
477
+ import type { NTree } from '@central-design-system/components';
478
+ import { CdsTree } from '@central-design-system/components';
479
+ import { ref, unref, watch } from 'vue';
480
+
481
+ const selectedKeys = ref<string[]>(['0-0-0', '0-0-1']);
482
+ const checkedKeys = ref<string[]>(['0-0-0', '0-0-1']);
483
+
484
+ watch(selectedKeys, () => console.log('selectedKeys', unref(selectedKeys)));
485
+ watch(checkedKeys, () => console.log('checkedKeys', unref(checkedKeys)));
486
+
487
+ const dig = (path = '0', level = 3): NTree.IDataNode[] => {
488
+ const list: NTree.IDataNode[] = [];
489
+ for (let i = 0; i < 10; i += 1) {
490
+ const key = `${path}-${i}`;
491
+ const treeNode: NTree.IDataNode = { title: key, key };
492
+ if (level > 0) {
493
+ treeNode.children = dig(key, level - 1);
494
+ }
495
+ list.push(treeNode);
496
+ }
497
+ return list;
498
+ };
499
+ const treeData = dig();
500
+ </script>
501
+
502
+ <template>
503
+ <div class="m-auto max-w-[320px]">
504
+ <CdsTree
505
+ v-model:selected-keys="selectedKeys"
506
+ v-model:checked-keys="checkedKeys"
507
+ :tree-data="treeData"
508
+ :height="300"
509
+ default-expand-all
510
+ checkable
511
+ />
512
+ </div>
513
+ </template>
514
+ ```
515
+
516
+ ## Directory mode
517
+
518
+ `CdsTreeDirectory` is a tree with presets for files and folders: directory icons, expanding on click and full-width nodes. It accepts the same props as `CdsTree`.
519
+
520
+ **Example (SFC):**
521
+
522
+ ```vue
523
+ <script setup lang="ts">
524
+ import type { NTree } from '@central-design-system/components';
525
+ import { CdsTreeDirectory } from '@central-design-system/components';
526
+ import { ref } from 'vue';
527
+
528
+ const treeData: NTree.IDataNode[] = [
529
+ {
530
+ title: 'Новая папка',
531
+ key: '0-0',
532
+ children: [
533
+ { title: 'index.ts', key: '0-0-0', isLeaf: true },
534
+ { title: 'index.html', key: '0-0-1', isLeaf: true }
535
+ ]
536
+ },
537
+ {
538
+ title: 'Другая папка',
539
+ key: '0-1',
540
+ children: [
541
+ { title: 'skuff.png', key: '0-1-0', isLeaf: true },
542
+ { title: 'newFile.md', key: '0-1-1', isLeaf: true }
543
+ ]
544
+ }
545
+ ];
546
+
547
+ const expandedKeys = ref<string[]>(['0-0']);
548
+ const selectedKeys = ref<string[]>([]);
549
+ </script>
550
+
551
+ <template>
552
+ <div class="m-auto max-w-[320px]">
553
+ <CdsTreeDirectory
554
+ v-model:expanded-keys="expandedKeys"
555
+ v-model:selected-keys="selectedKeys"
556
+ :tree-data="treeData"
557
+ multiple
558
+ />
559
+ </div>
560
+ </template>
561
+ ```
562
+
563
+ ## Picking sections for an export
564
+
565
+ Checkboxes collect a set of sections, and the counter in the button hints at the size of the selection. The `loading` prop of the button shows the export in progress, `disabled` prevents starting it with an empty selection.
566
+
567
+ **Example (SFC):**
568
+
569
+ ```vue
570
+ <script setup lang="ts">
571
+ import type { NTree } from '@central-design-system/components';
572
+ import { CdsButton, CdsTree } from '@central-design-system/components';
573
+ import { computed, ref } from 'vue';
574
+
575
+ const treeData: NTree.IDataNode[] = [
576
+ {
577
+ title: 'Электроника',
578
+ key: 'electronics',
579
+ children: [
580
+ { title: 'Ноутбуки', key: 'laptops' },
581
+ { title: 'Мониторы', key: 'monitors' }
582
+ ]
583
+ },
584
+ {
585
+ title: 'Мебель',
586
+ key: 'furniture',
587
+ children: [
588
+ { title: 'Столы', key: 'tables' },
589
+ { title: 'Кресла', key: 'chairs' }
590
+ ]
591
+ },
592
+ { title: 'Канцтовары', key: 'stationery' }
593
+ ];
594
+
595
+ const checkedKeys = ref<NTree.TKey[]>([]);
596
+ const loading = ref(false);
597
+ const exportedCount = ref(0);
598
+
599
+ const count = computed(() => checkedKeys.value.length);
600
+
601
+ const onExport = () => {
602
+ loading.value = true;
603
+ exportedCount.value = 0;
604
+
605
+ setTimeout(() => {
606
+ exportedCount.value = count.value;
607
+ checkedKeys.value = [];
608
+ loading.value = false;
609
+ }, 1500);
610
+ };
611
+ </script>
612
+
613
+ <template>
614
+ <div class="m-auto flex w-[280px] flex-col gap-2">
615
+ <CdsTree v-model:checked-keys="checkedKeys" :tree-data="treeData" default-expand-all checkable />
616
+
617
+ <CdsButton :text="`Выгрузить разделы (${count})`" :loading="loading" :disabled="!count" @click="onExport" />
618
+
619
+ <span v-if="exportedCount" class="text-center text-content-secondary">
620
+ Выгружено разделов: {{ exportedCount }}
621
+ </span>
622
+ </div>
623
+ </template>
624
+ ```
625
+
626
+ ## Search across the tree
627
+
628
+ An input field filters `tree-data` on the fly: the matches and their parents stay in the tree, and `v-model:expanded-keys` expands the branches with the found nodes. When there are no matches, show an empty state instead of the tree.
629
+
630
+ **Example (SFC):**
631
+
632
+ ```vue
633
+ <script setup lang="ts">
634
+ import type { NTree } from '@central-design-system/components';
635
+ import { CdsTextInput, CdsTree } from '@central-design-system/components';
636
+ import { computed, ref, watch } from 'vue';
637
+
638
+ const structure: NTree.IDataNode[] = [
639
+ {
640
+ title: 'Компания',
641
+ key: 'company',
642
+ children: [
643
+ {
644
+ title: 'Коммерческий департамент',
645
+ key: 'commercial',
646
+ children: [
647
+ { title: 'Отдел продаж', key: 'sales' },
648
+ { title: 'Отдел закупок', key: 'purchases' }
649
+ ]
650
+ },
651
+ {
652
+ title: 'ИТ-департамент',
653
+ key: 'it',
654
+ children: [
655
+ { title: 'Разработка', key: 'development' },
656
+ { title: 'Поддержка', key: 'support' }
657
+ ]
658
+ },
659
+ {
660
+ title: 'Финансовый департамент',
661
+ key: 'finance',
662
+ children: [{ title: 'Бухгалтерия', key: 'accounting' }]
663
+ }
664
+ ]
665
+ }
666
+ ];
667
+
668
+ const query = ref('');
669
+ const expandedKeys = ref<NTree.TKey[]>(['company']);
670
+
671
+ const filterNodes = (nodes: NTree.IDataNode[], text: string): NTree.IDataNode[] =>
672
+ nodes.flatMap((node) => {
673
+ const children = filterNodes(node.children ?? [], text);
674
+ const matched = String(node.title).toLowerCase().includes(text);
675
+
676
+ if (!matched && !children.length) return [];
677
+
678
+ return [{ ...node, children: children.length ? children : node.children }];
679
+ });
680
+
681
+ const treeData = computed(() => {
682
+ const text = query.value.trim().toLowerCase();
683
+
684
+ return text ? filterNodes(structure, text) : structure;
685
+ });
686
+
687
+ const collectParentKeys = (nodes: NTree.IDataNode[]): NTree.TKey[] =>
688
+ nodes.flatMap((node) =>
689
+ node.children?.length && node.key != null ? [node.key, ...collectParentKeys(node.children)] : []
690
+ );
691
+
692
+ watch(treeData, (nodes) => {
693
+ if (query.value.trim()) {
694
+ expandedKeys.value = collectParentKeys(nodes);
695
+ }
696
+ });
697
+ </script>
698
+
699
+ <template>
700
+ <div class="m-auto flex w-[320px] flex-col gap-2">
701
+ <CdsTextInput
702
+ v-model="query"
703
+ placeholder="Найти подразделение"
704
+ prepend-inner-icon="search"
705
+ clearable
706
+ hide-messages
707
+ />
708
+
709
+ <CdsTree v-if="treeData.length" v-model:expanded-keys="expandedKeys" :tree-data="treeData" />
710
+
711
+ <span v-else class="text-center text-content-secondary">Ничего не найдено</span>
712
+ </div>
713
+ </template>
714
+ ```
715
+
716
+ ## Project files
717
+
718
+ `CdsTreeDirectory` with `v-model:selected-keys` works as a file explorer: a click on a folder expands it, a click on a file selects it. The node keys hold the path to the file, so the selected item is ready to be shown or requested right away.
719
+
720
+ **Example (SFC):**
721
+
722
+ ```vue
723
+ <script setup lang="ts">
724
+ import type { NTree } from '@central-design-system/components';
725
+ import { CdsTreeDirectory } from '@central-design-system/components';
726
+ import { computed, ref } from 'vue';
727
+
728
+ const treeData: NTree.IDataNode[] = [
729
+ {
730
+ title: 'src',
731
+ key: 'src',
732
+ children: [
733
+ {
734
+ title: 'components',
735
+ key: 'src/components',
736
+ children: [
737
+ { title: 'AppHeader.vue', key: 'src/components/AppHeader.vue', isLeaf: true },
738
+ { title: 'AppFooter.vue', key: 'src/components/AppFooter.vue', isLeaf: true }
739
+ ]
740
+ },
741
+ { title: 'main.ts', key: 'src/main.ts', isLeaf: true }
742
+ ]
743
+ },
744
+ {
745
+ title: 'public',
746
+ key: 'public',
747
+ children: [{ title: 'favicon.svg', key: 'public/favicon.svg', isLeaf: true }]
748
+ },
749
+ { title: 'package.json', key: 'package.json', isLeaf: true }
750
+ ];
751
+
752
+ const expandedKeys = ref<NTree.TKey[]>(['src']);
753
+ const selectedKeys = ref<NTree.TKey[]>([]);
754
+
755
+ const findNode = (nodes: NTree.IDataNode[], key: NTree.TKey): NTree.IDataNode | undefined => {
756
+ for (const node of nodes) {
757
+ if (node.key === key) return node;
758
+
759
+ const child = findNode(node.children ?? [], key);
760
+ if (child) return child;
761
+ }
762
+
763
+ return undefined;
764
+ };
765
+
766
+ const selectedFile = computed(() => {
767
+ const key = selectedKeys.value[0];
768
+ if (key === undefined) return undefined;
769
+
770
+ const node = findNode(treeData, key);
771
+
772
+ return node?.isLeaf ? String(key) : undefined;
773
+ });
774
+ </script>
775
+
776
+ <template>
777
+ <div class="m-auto flex w-[320px] flex-col gap-2">
778
+ <CdsTreeDirectory v-model:expanded-keys="expandedKeys" v-model:selected-keys="selectedKeys" :tree-data="treeData" />
779
+
780
+ <span class="text-center text-content-secondary">
781
+ {{ selectedFile ? `Открыт файл: ${selectedFile}` : 'Выберите файл' }}
782
+ </span>
783
+ </div>
784
+ </template>
785
+ ```